diff --git a/README.md b/README.md index 11f694599..aedab22f2 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,17 @@ # Grasscutter -A WIP server emulator for Genshin Impact 2.3-2.6 +A WIP server reimplementation for *some anime game* 2.3-2.6 +**Documentation**: [Grasscutter Wiki](https://github.com/Melledy/Grasscutter/wiki/) **Note**: For support please join the [Discord server](https://discord.gg/T5vZU6UyeG). - # Current features * Logging in -* Spawning monsters via console * Combat +* Spawning monsters via console * Inventory features (recieving items/characters, upgrading items/characters, etc) -* Co-op does work, but movement is kind of buggy and some player ults do not spawn properly -* Friends list * Gacha system - +* Friends list +* Co-op *partially* work # Quick setup guide -* For more information, we now have [Grasscutter Wiki](https://github.com/Melledy/Grasscutter/wiki/) page ! ### Prerequisites * JDK-8u202 ([mirror link](https://mirrors.huaweicloud.com/java/jdk/8u202-b08/) since Oracle required an account to download old builds) * Mongodb (recommended 4.0+) @@ -22,11 +20,11 @@ A WIP server emulator for Genshin Impact 2.3-2.6 ### Starting up Grasscutter server (Assuming you are on Windows) 1. Setup compile environment `gradlew.bat` 2. Compile Grasscutter with `gradlew jar` -3. Create a folder named `resources` in your Grasscutter directory, bring your `BinOutput` and `ExcelBinOutput` folders into it *(Check the wiki for more details where to get those.)* -4. Run Grasscutter with `java -jar grasscutter.jar`. Make sure mongodb is running as well. +3. Create a folder named `resources` in your Grasscutter directory, bring your `BinOutput` and `ExcelBinOutput` folders into it *(Check the wiki for more details how to get those.)* +4. Run Grasscutter with `java -jar grasscutter.jar`. Make sure mongodb service is running as well. ### Connecting with the client -½. Create an account using command below +½. Create an account using *server console command* below 1. Run a proxy daemon: (choose either one) - mitmdump: `mitmdump -s proxy.py --ssl-insecure` - Fiddler Classic: Run Fiddler Classic, turn on `Decrypt https traffic` in setting and change the default port there (Tools -> Options -> Connections) to anything other than `8888`, and load [this script](https://github.lunatic.moe/fiddlerscript). @@ -66,8 +64,9 @@ There is a dummy user named "Server" in every player's friends list that you can `!clearartifacts` - Deletes all unequipped and unlocked level 0 artifacts, **including yellow rarity ones** from your inventory +*More commands will be updated in the [wiki](https://github.com/Melledy/Grasscutter/wiki/).* + # Quick Troubleshooting -* If compiling wasnt successful, please check your JDK installation (must be JDK 8 and validated JDK's bin PATH variable) -* My client doesn't connect, doesn't login, 4206, etc... - Mostly your proxy daemon setup is the issue, if using Fiddler make sure it running on another port except 8888 +* If compiling wasn't successful, please check your JDK installation (must be JDK 8 and validated JDK's bin PATH variable) +* My client doesn't connect, doesn't login, 4206, etc... - Mostly your proxy daemon setup is *the issue*, if using Fiddler make sure it running on another port except 8888 * Startup sequence: Mongodb > Grasscutter > Proxy daemon (mitmdump, fiddler, etc.) > Client -* If `4206` error constantly prompt up, try to use [jdk-8u202-b08](https://mirrors.huaweicloud.com/java/jdk/8u202-b08/) instead of other versions of JDK diff --git a/src/main/java/emu/grasscutter/Config.java b/src/main/java/emu/grasscutter/Config.java index 983524223..8573c83ba 100644 --- a/src/main/java/emu/grasscutter/Config.java +++ b/src/main/java/emu/grasscutter/Config.java @@ -53,5 +53,6 @@ public final class Config { public int MaxEntityLimit = 1000; // Max entity limit per world. // TODO: Enforce later. public int[] WelcomeEmotes = {2007, 1002, 4010}; public String WelcomeMotd = "Welcome to Grasscutter emu"; + public boolean AutomaticallyCreateAccounts = false; } } diff --git a/src/main/java/emu/grasscutter/commands/CommandMap.java b/src/main/java/emu/grasscutter/commands/CommandMap.java index a802551ce..5d7d1110b 100644 --- a/src/main/java/emu/grasscutter/commands/CommandMap.java +++ b/src/main/java/emu/grasscutter/commands/CommandMap.java @@ -91,7 +91,7 @@ public final class CommandMap { public void invoke(GenshinPlayer player, String rawMessage) { rawMessage = rawMessage.trim(); if(rawMessage.length() == 0) { - CommandHandler.sendMessage(player, "No command specified."); + CommandHandler.sendMessage(player, "No command specified."); return; } // Remove prefix if present. @@ -113,7 +113,7 @@ public final class CommandMap { if(player != null) { String permissionNode = this.annotations.get(label).permission(); Account account = player.getAccount(); - if(permissionNode != "" && !account.hasPermission(permissionNode)) { + if(!permissionNode.isEmpty() && !account.hasPermission(permissionNode)) { CommandHandler.sendMessage(player, "You do not have permission to run this command."); return; } } diff --git a/src/main/java/emu/grasscutter/commands/ServerCommands.java b/src/main/java/emu/grasscutter/commands/ServerCommands.java index edeac6ca3..8f679581d 100644 --- a/src/main/java/emu/grasscutter/commands/ServerCommands.java +++ b/src/main/java/emu/grasscutter/commands/ServerCommands.java @@ -188,6 +188,7 @@ public final class ServerCommands { } else { CommandHandler.sendMessage(null, "Account created with UID " + account.getPlayerId() + "."); account.addPermission("*"); // Grant the player superuser permissions. + account.save(); // Save account to database. } return; case "delete": diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index 0ac4c4fc8..f13b9dc2f 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -225,11 +225,23 @@ public final class DispatchServer { // Login Account account = DatabaseHelper.getAccountByName(requestData.account); - // Test + // Check if account exists, else create a new one. if (account == null) { - responseData.retcode = -201; - responseData.message = "Username not found."; + // Account doesnt exist, so we can either auto create it if the config value is set + if (Grasscutter.getConfig().ServerOptions.AutomaticallyCreateAccounts) { + // This account has been created AUTOMATICALLY. There will be no permissions added. + account = DatabaseHelper.createAccountWithId(requestData.account, 0); + + responseData.message = "OK"; + responseData.data.account.uid = account.getId(); + responseData.data.account.token = account.generateSessionKey(); + responseData.data.account.email = account.getEmail(); + } else { + responseData.retcode = -201; + responseData.message = "Username not found."; + } } else { + // Account was found, log the player in responseData.message = "OK"; responseData.data.account.uid = account.getId(); responseData.data.account.token = account.generateSessionKey();