From ceaedca20944c4c33f3c84c958a7a3af89fd0e32 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Tue, 19 Apr 2022 18:17:19 +0800 Subject: [PATCH 001/119] Admin cmds, perms and descriptions for all cmds + Additonal stuff: Fixed + refactored help command. Removed 'Usage: ' from all commands. Created 'player.hasPermission(permission)' function. Created default for Usage annotation. Created hashmap version of 'getHandlers' and renamed the original to getHandlersAsList() --- .../emu/grasscutter/commands/Command.java | 8 +- .../emu/grasscutter/commands/CommandMap.java | 7 +- .../grasscutter/commands/PlayerCommands.java | 48 ++++- .../grasscutter/commands/ServerCommands.java | 186 ++++++++++++++---- .../java/emu/grasscutter/game/Account.java | 4 + 5 files changed, 202 insertions(+), 51 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/Command.java b/src/main/java/emu/grasscutter/commands/Command.java index d1e181e20..d26d7fe29 100644 --- a/src/main/java/emu/grasscutter/commands/Command.java +++ b/src/main/java/emu/grasscutter/commands/Command.java @@ -7,14 +7,16 @@ import java.lang.annotation.RetentionPolicy; public @interface Command { String label() default ""; - String usage() default ""; + String usage() default "No usage specified"; + + String description() default "No description specified"; - String[] aliases() default {""}; + String[] aliases() default {}; Execution execution() default Execution.ALL; String permission() default ""; - + enum Execution { ALL, CONSOLE, diff --git a/src/main/java/emu/grasscutter/commands/CommandMap.java b/src/main/java/emu/grasscutter/commands/CommandMap.java index e9ca260e7..a802551ce 100644 --- a/src/main/java/emu/grasscutter/commands/CommandMap.java +++ b/src/main/java/emu/grasscutter/commands/CommandMap.java @@ -68,10 +68,12 @@ public final class CommandMap { * Returns a list of all registered commands. * @return All command handlers as a list. */ - public List getHandlers() { + public List getHandlersAsList() { return new LinkedList<>(this.commands.values()); } + public HashMap getHandlers() { return new LinkedHashMap<>(this.commands); } + /** * Returns a handler by label/alias. * @param label The command label. @@ -111,8 +113,7 @@ public final class CommandMap { if(player != null) { String permissionNode = this.annotations.get(label).permission(); Account account = player.getAccount(); - List permissions = account.getPermissions(); - if(!permissions.contains("*") && !permissions.contains(permissionNode)) { + if(permissionNode != "" && !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/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index ae80c5d25..2ffcbae06 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -27,7 +27,7 @@ import java.util.List; */ public final class PlayerCommands { @Command(label = "give", aliases = {"g", "item", "giveitem"}, - usage = "Usage: give [player] [amount]") + usage = "give [player] [amount]", description = "Gives an item to you or the specified player", permission = "player.give") public static class GiveCommand implements CommandHandler { @Override @@ -140,8 +140,8 @@ public final class PlayerCommands { } @Command(label = "drop", aliases = {"d", "dropitem"}, - usage = "Usage: drop [amount]", - execution = Command.Execution.PLAYER) + usage = "drop [amount]", + execution = Command.Execution.PLAYER, description = "Drops an item near you", permission = "server.drop") public static class DropCommand implements CommandHandler { @Override @@ -178,7 +178,7 @@ public final class PlayerCommands { } @Command(label = "spawn", execution = Command.Execution.PLAYER, - usage = "Usage: spawn [level] [amount]") + usage = "spawn [level] [amount]", description = "Spawns an entity near you", permission = "server.spawn") public static class SpawnCommand implements CommandHandler { @Override @@ -211,7 +211,7 @@ public final class PlayerCommands { } @Command(label = "killall", - usage = "Usage: killall [sceneId]") + usage = "killall [sceneId]", description = "Kill all entities", permission = "server.killall") public static class KillAllCommand implements CommandHandler { @Override @@ -239,7 +239,8 @@ public final class PlayerCommands { } @Command(label = "resetconst", aliases = {"resetconstellation"}, - usage = "Usage: resetconst [all]", execution = Command.Execution.PLAYER) + usage = "resetconst [all]", execution = Command.Execution.PLAYER, permission = "player.resetconstellation", + description = "Resets the constellation level on your current active character, will need to relog after using the command to see any changes.") public static class ResetConstellationCommand implements CommandHandler { @Override @@ -268,7 +269,7 @@ public final class PlayerCommands { } @Command(label = "godmode", - usage = "Usage: godmode", execution = Command.Execution.PLAYER) + usage = "godmode", execution = Command.Execution.PLAYER, description = "Prevents you from taking damage", permission = "player.godmode") public static class GodModeCommand implements CommandHandler { @Override @@ -279,7 +280,8 @@ public final class PlayerCommands { } @Command(label = "sethealth", aliases = {"sethp"}, - usage = "Usage: sethealth ", execution = Command.Execution.PLAYER) + usage = "sethealth ", execution = Command.Execution.PLAYER, description = "Sets your health to the specified value", + permission = "player.sethealth") public static class SetHealthCommand implements CommandHandler { @Override @@ -304,7 +306,8 @@ public final class PlayerCommands { } @Command(label = "clearartifacts", aliases = {"clearart"}, - usage = "Usage: clearartifacts", execution = Command.Execution.PLAYER) + usage = "clearartifacts", execution = Command.Execution.PLAYER, permission = "player.clearartifacts", + description = "Deletes all unequipped and unlocked level 0 artifacts, including yellow rarity ones from your inventory") public static class ClearArtifactsCommand implements CommandHandler { @Override @@ -317,4 +320,31 @@ public final class PlayerCommands { .forEach(item -> playerInventory.removeItem(item, item.getCount())); } } + + @Command(label = "sendservermessage", aliases = {"sendservmsg"}, + usage = "sendservermessage ", description = "Sends a message to a player as the server", + execution = Command.Execution.PLAYER, permission = "server.sendmessage") + public static class SendServerMessageCommand implements CommandHandler { + @Override + public void execute(GenshinPlayer player, List args) { + if(args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: sendmessage "); return; + } + + try { + int target = Integer.parseInt(args.get(0)); + String message = String.join(" ", args.subList(1, args.size())); + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerById(target); + if(targetPlayer == null) { + CommandHandler.sendMessage(null, "Player not found."); return; + } + + targetPlayer.dropMessage(message); + CommandHandler.sendMessage(null, "Message sent."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid player ID."); + } + } + } } diff --git a/src/main/java/emu/grasscutter/commands/ServerCommands.java b/src/main/java/emu/grasscutter/commands/ServerCommands.java index 1262fae97..052bb149e 100644 --- a/src/main/java/emu/grasscutter/commands/ServerCommands.java +++ b/src/main/java/emu/grasscutter/commands/ServerCommands.java @@ -1,10 +1,15 @@ package emu.grasscutter.commands; +import com.mongodb.internal.connection.CommandHelper; import emu.grasscutter.Grasscutter; import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.game.Account; import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.server.packet.send.PacketSceneKickPlayerRsp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -12,7 +17,7 @@ import java.util.stream.Collectors; * A container for server-related commands. */ public final class ServerCommands { - @Command(label = "reload", usage = "Usage: reload") + @Command(label = "reload", usage = "reload", description = "Reload server config", permission = "server.reload") public static class ReloadCommand implements CommandHandler { @Override @@ -25,12 +30,78 @@ public final class ServerCommands { @Override public void execute(GenshinPlayer player, List args) { + CommandHandler.sendMessage(player, "Reloading config."); this.execute(args); + CommandHandler.sendMessage(player, "Reload complete."); } } - + + @Command(label = "kick", usage = "kick ", description = "Kicks the specified player from the server (WIP)", permission = "server.kick") + public static class KickCommand implements CommandHandler { + @Override + public void execute(List args) { + int target = Integer.parseInt(args.get(0)); + String message = String.join(" ", args.subList(1, args.size())); + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerById(target); + if(targetPlayer == null) { + CommandHandler.sendMessage(null, "Player not found."); return; + } + + targetPlayer.sendPacket(new PacketSceneKickPlayerRsp(targetPlayer.getId())); + //targetPlayer.getSession().close(); + } + } + + @Command(label = "stop", usage = "stop", description = "Stops the server", permission = "server.stop") + public static class StopCommand implements CommandHandler { + @Override + public void execute(List args) { + Grasscutter.getLogger().info("Server shutting down..."); + for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { + p.dropMessage("Server shutting down..."); + } + + System.exit(1); + } + } + + @Command(label = "broadcast", aliases = {"b"}, + usage = "broadcast ", description = "Sends a message to all the players", permission = "server.broadcast") + public static class BroadcastCommand implements CommandHandler { + @Override + public void execute(List args) { + if(args.size() < 1) { + CommandHandler.sendMessage(null, "Usage: broadcast "); return; + } + + String message = String.join(" ", args.subList(0, args.size())); + + for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { + p.dropMessage(message); + } + + CommandHandler.sendMessage(null, "Message sent."); + } + + @Override + public void execute(GenshinPlayer player, List args) { + if(args.size() < 1) { + CommandHandler.sendMessage(player, "Usage: broadcast "); return; + } + + String message = String.join(" ", args.subList(0, args.size())); + + for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { + p.dropMessage(message); + } + + CommandHandler.sendMessage(player, "Message sent."); + } + } + @Command(label = "sendmessage", aliases = {"sendmsg", "msg"}, - usage = "Usage: sendmessage ") + usage = "sendmessage ", description = "Sends a message to a player") public static class SendMessageCommand implements CommandHandler { @Override @@ -79,8 +150,8 @@ public final class ServerCommands { } @Command(label = "account", - usage = "Usage: account [uid]", - execution = Command.Execution.CONSOLE) + usage = "account [uid]", + description = "Modify user accounts", execution = Command.Execution.CONSOLE) public static class AccountCommand implements CommandHandler { @Override @@ -124,8 +195,8 @@ public final class ServerCommands { } @Command(label = "permission", - usage = "Usage: permission ", - execution = Command.Execution.CONSOLE) + usage = "permission ", + description = "Grants or removes a permission for a user", permission = "*") public static class PermissionCommand implements CommandHandler { @Override @@ -164,50 +235,93 @@ public final class ServerCommands { } @Command(label = "help", - usage = "Usage: help [command]") + usage = "help [command]", description = "Sends the help message or shows information about a specified command") public static class HelpCommand implements CommandHandler { @Override public void execute(List args) { - List handlers = CommandMap.getInstance().getHandlers(); - List annotations = handlers.stream() - .map(handler -> handler.getClass().getAnnotation(Command.class)) - .collect(Collectors.toList()); - - if(args.size() < 1) { - StringBuilder builder = new StringBuilder("Available commands:\n"); - annotations.forEach(annotation -> builder.append(annotation.usage()).append("\n")); - CommandHandler.sendMessage(null, builder.toString()); - } else { - String command = args.get(0); - CommandHandler handler = CommandMap.getInstance().getHandler(command); - if(handler == null) { - CommandHandler.sendMessage(null, "Command not found."); return; - } - - Command annotation = handler.getClass().getAnnotation(Command.class); - CommandHandler.sendMessage(null, annotation.usage()); - } + this.execute(null, args); } @Override public void execute(GenshinPlayer player, List args) { - List handlers = CommandMap.getInstance().getHandlers(); - List annotations = handlers.stream() - .map(handler -> handler.getClass().getAnnotation(Command.class)) - .collect(Collectors.toList()); - if(args.size() < 1) { - annotations.forEach(annotation -> player.dropMessage(annotation.usage())); + HashMap handlers = CommandMap.getInstance().getHandlers(); + List annotations = new ArrayList(); + for(String key : handlers.keySet()) { + Command annotation = handlers.get(key).getClass().getAnnotation(Command.class); + + if(!Arrays.asList(annotation.aliases()).contains(key)) { + if(player != null && annotation.permission() != "" && !player.getAccount().hasPermission(annotation.permission())) continue; + annotations.add(annotation); + } + } + + + SendAllHelpMessage(player, annotations); } else { String command = args.get(0); CommandHandler handler = CommandMap.getInstance().getHandler(command); + StringBuilder builder = new StringBuilder(player == null ? "\nHelp - " : "Help - ").append(command).append(": \n"); if(handler == null) { - CommandHandler.sendMessage(player, "Command not found."); return; + builder.append("No command found."); + } else { + Command annotation = handler.getClass().getAnnotation(Command.class); + + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if(annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + if(player != null && annotation.permission() != "" && !player.getAccount().hasPermission(annotation.permission())) { + builder.append("\n Warning: You do not have permission to run this command."); + } } - Command annotation = handler.getClass().getAnnotation(Command.class); - CommandHandler.sendMessage(player, annotation.usage()); + CommandHandler.sendMessage(player, builder.toString()); + } + } + + void SendAllHelpMessage(GenshinPlayer player, List annotations) { + if(player == null) { + StringBuilder builder = new StringBuilder("\nAvailable commands:\n"); + annotations.forEach(annotation -> { + if (annotation.execution() != (player == null ? Command.Execution.PLAYER : Command.Execution.CONSOLE)) { + builder.append(annotation.label()).append("\n"); + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if (annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + + builder.append("\n"); + } + }); + + CommandHandler.sendMessage(null, builder.toString()); + } else { + CommandHandler.sendMessage(player, "Available commands:"); + annotations.forEach(annotation -> { + if (annotation.execution() != (player == null ? Command.Execution.PLAYER : Command.Execution.CONSOLE)) { + StringBuilder builder = new StringBuilder(annotation.label()).append("\n"); + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if (annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + + CommandHandler.sendMessage(player, builder.toString()); + } + }); } } } diff --git a/src/main/java/emu/grasscutter/game/Account.java b/src/main/java/emu/grasscutter/game/Account.java index dffbb0d86..2eeeed3b1 100644 --- a/src/main/java/emu/grasscutter/game/Account.java +++ b/src/main/java/emu/grasscutter/game/Account.java @@ -105,6 +105,10 @@ public class Account { if(this.permissions.contains(permission)) return false; this.permissions.add(permission); return true; } + + public boolean hasPermission(String permission) { + return this.permissions.contains(permission) || this.permissions.contains("*") ? true : false; + } public boolean removePermission(String permission) { return this.permissions.remove(permission); From 73cf9db747ec09e79e0619a1ecfd1c0133f6d3de Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Tue, 19 Apr 2022 18:55:49 +0800 Subject: [PATCH 002/119] Modified the new commands to be compliant with my changes --- .../java/emu/grasscutter/commands/PlayerCommands.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index ebe72e6ae..f7135dac9 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -180,7 +180,8 @@ public final class PlayerCommands { } } - @Command(label = "givechar", aliases = { "givec" }, usage = "Usage: givechar [level]") + @Command(label = "givechar", aliases = { "givec" }, usage = "givechar [level]", + description = "Gives the player a specified character", permission = "player.givechar") public static class GiveCharCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { int target, avatarID, level = 1, ascension = 1; @@ -435,8 +436,9 @@ public final class PlayerCommands { } } - @Command(label = "setworldlevel", aliases = {"setworldlvl"}, - usage = "Usage: setworldlevel ", execution = Command.Execution.PLAYER) + @Command(label = "setworldlevel", aliases = {"setworldlvl"}, usage = "setworldlevel ", + description = "Sets your world level (Relog to see proper effects)", permission = "player.setworldlevel", + execution = Command.Execution.PLAYER) public static class SetWorldLevelCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { From e69b08b7c0a434745f3460e4fbb311cbae95aaaa Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Tue, 19 Apr 2022 19:48:26 +0800 Subject: [PATCH 003/119] Constellation fix --- .../emu/grasscutter/game/managers/InventoryManager.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/managers/InventoryManager.java b/src/main/java/emu/grasscutter/game/managers/InventoryManager.java index 3d56dfad2..d98f917e2 100644 --- a/src/main/java/emu/grasscutter/game/managers/InventoryManager.java +++ b/src/main/java/emu/grasscutter/game/managers/InventoryManager.java @@ -471,7 +471,7 @@ public class InventoryManager { } // Consume weapon - player.getInventory().removeItem(feed); + player.getInventory().removeItem(feed, 1); // Get weapon.setRefinement(targetRefineLevel); @@ -804,7 +804,11 @@ public class InventoryManager { // Get talent int currentTalentLevel = avatar.getCoreProudSkillLevel(); int nextTalentId = ((avatar.getAvatarId() % 10000000) * 10) + currentTalentLevel + 1; - AvatarTalentData talentData = GenshinData.getAvatarTalentDataMap().get(nextTalentId); + + if (avatar.getAvatarId() == 10000006) { + // Lisa is special in that her talentId starts with 4 instead of 6. + nextTalentId = 40 + currentTalentLevel + 1; + } if (talentData == null) { return; From 363990685763b1c74738e1f504f7e94222e9df63 Mon Sep 17 00:00:00 2001 From: xmplay <81370285+xmplay@users.noreply.github.com> Date: Tue, 19 Apr 2022 13:03:43 +0100 Subject: [PATCH 004/119] Update PacketPlayerEnterSceneNotify.java --- .../server/packet/send/PacketPlayerEnterSceneNotify.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java index 69ca9cb5f..e2db99153 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java @@ -59,6 +59,7 @@ public class PacketPlayerEnterSceneNotify extends GenshinPacket { .setEnterReason(reason.getValue()) .addSceneTagIdList(102) .addSceneTagIdList(107) + .addSceneTagIdList(109) .addSceneTagIdList(113) .addSceneTagIdList(117) .setUnk1(1) From d97b2e834a84c5f69d34d1db4c2c9fe719f6b699 Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Tue, 19 Apr 2022 20:05:45 +0800 Subject: [PATCH 005/119] talentData sorry again, forgot to add --- .../java/emu/grasscutter/game/managers/InventoryManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/emu/grasscutter/game/managers/InventoryManager.java b/src/main/java/emu/grasscutter/game/managers/InventoryManager.java index d98f917e2..935652d77 100644 --- a/src/main/java/emu/grasscutter/game/managers/InventoryManager.java +++ b/src/main/java/emu/grasscutter/game/managers/InventoryManager.java @@ -810,6 +810,8 @@ public class InventoryManager { nextTalentId = 40 + currentTalentLevel + 1; } + AvatarTalentData talentData = GenshinData.getAvatarTalentDataMap().get(nextTalentId); + if (talentData == null) { return; } From e0e7f2e7222f29c99d1f715fadd17c7b3c8333c1 Mon Sep 17 00:00:00 2001 From: xmplay <81370285+xmplay@users.noreply.github.com> Date: Tue, 19 Apr 2022 13:23:57 +0100 Subject: [PATCH 006/119] Updated Banners.json with the latest banners (19 Apr) --- data/Banners.json | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/data/Banners.json b/data/Banners.json index 163319f5e..959a8b436 100644 --- a/data/Banners.json +++ b/data/Banners.json @@ -17,39 +17,24 @@ "gachaType": 301, "scheduleId": 903, "bannerType": "EVENT", - "prefabPath": "GachaShowPanel_A076", - "previewPrefabPath": "UI_Tab_GachaShowPanel_A076", - "titlePath": "UI_GACHA_SHOW_PANEL_A076_TITLE", + "prefabPath": "GachaShowPanel_A079", + "previewPrefabPath": "UI_Tab_GachaShowPanel_A079", + "titlePath": "UI_GACHA_SHOW_PANEL_A079_TITLE", "costItem": 223, "beginTime": 0, "endTime": 1924992000, "sortId": 9998, "maxItemType": 1, - "rateUpItems1": [1066], - "rateUpItems2": [1023, 1043, 1064] - }, - { - "gachaType": 400, - "scheduleId": 913, - "bannerType": "EVENT", - "prefabPath": "GachaShowPanel_A077", - "previewPrefabPath": "UI_Tab_GachaShowPanel_A077", - "titlePath": "UI_Tab_GachaShowPanel_A077", - "costItem": 223, - "beginTime": 0, - "endTime": 1924992000, - "sortId": 9998, - "maxItemType": 1, - "rateUpItems1": [1022], - "rateUpItems2": [1023, 1043, 1064] + "rateUpItems1": [1002], + "rateUpItems2": [1053, 1020, 1045] }, { "gachaType": 302, - "scheduleId": 923, + "scheduleId": 913, "bannerType": "WEAPON", - "prefabPath": "GachaShowPanel_A078", - "previewPrefabPath": "UI_Tab_GachaShowPanel_A078", - "titlePath": "UI_GACHA_SHOW_PANEL_A078_TITLE", + "prefabPath": "GachaShowPanel_A080", + "previewPrefabPath": "UI_Tab_GachaShowPanel_A080", + "titlePath": "UI_GACHA_SHOW_PANEL_A080_TITLE", "costItem": 223, "beginTime": 0, "endTime": 1924992000, @@ -58,7 +43,7 @@ "eventChance": 75, "softPity": 80, "hardPity": 80, - "rateUpItems1": [11510, 15503], - "rateUpItems2": [11402, 12403, 13401, 14402, 15405] + "rateUpItems1": [11509, 12504], + "rateUpItems2": [11401, 12402, 13407, 14401, 15401] } -] \ No newline at end of file +] From d2ef8a4b49c6f34c476d70c749a0956e8ec0f660 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Tue, 19 Apr 2022 20:36:15 +0800 Subject: [PATCH 007/119] Fixed an issue with kicking players (Still broken but now it actually disconnects the player) --- .../grasscutter/commands/ServerCommands.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/ServerCommands.java b/src/main/java/emu/grasscutter/commands/ServerCommands.java index 67c33338c..a4014be57 100644 --- a/src/main/java/emu/grasscutter/commands/ServerCommands.java +++ b/src/main/java/emu/grasscutter/commands/ServerCommands.java @@ -40,16 +40,26 @@ public final class ServerCommands { public static class KickCommand implements CommandHandler { @Override public void execute(List args) { + this.execute(null, args); + } + + @Override + public void execute(GenshinPlayer player, List args) { int target = Integer.parseInt(args.get(0)); String message = String.join(" ", args.subList(1, args.size())); - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerById(target); + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); if(targetPlayer == null) { - CommandHandler.sendMessage(null, "Player not found."); return; + CommandHandler.sendMessage(player, "Player not found."); + return; + } + if(player != null) { + CommandHandler.sendMessage(null, String.format("Player [%s:%s] has kicked player [%s:%s]", player.getAccount().getPlayerId(), player.getAccount().getUsername(), target, targetPlayer.getAccount().getUsername())); } - targetPlayer.sendPacket(new PacketSceneKickPlayerRsp(targetPlayer.getId())); - //targetPlayer.getSession().close(); + CommandHandler.sendMessage(player, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); + + targetPlayer.getSession().close(); } } From 58a2cc26f121fdc6ab02835deeab4b15f74b73de Mon Sep 17 00:00:00 2001 From: OtakuNekoP Date: Tue, 19 Apr 2022 14:48:03 +0200 Subject: [PATCH 008/119] skip beta server device id verify --- .../java/emu/grasscutter/server/dispatch/DispatchServer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index da90caa42..0ac4c4fc8 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -389,6 +389,10 @@ public final class DispatchServer { "/sdk/upload", new DispatchHttpJsonHandler("{\"code\":0}") ); + server.createContext( // /perf/config/verify?device_id=xxx&platform=x&name=xxx + "/perf/config/verify", + new DispatchHttpJsonHandler("{\"code\":0}") + ); // Start server server.start(); Grasscutter.getLogger().info("Dispatch server started on port " + getAddress().getPort()); From 96a098a6b13f4066ad96bce86501f9482fd861e8 Mon Sep 17 00:00:00 2001 From: alt3ri <95161279+alt3ri@users.noreply.github.com> Date: Tue, 19 Apr 2022 21:39:17 +0700 Subject: [PATCH 009/119] Added bonus for ingame function A tip to teleport since TP waypoint didn't work. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 11f694599..e39d4e70d 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,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 +### Bonus +When you want to teleport to somewhere, use the ingame marking function on Map, then named it `pos`, click Confirm. You will see your character falling from a very high destination, exact location that you marked. + # 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 From eb232f04353c0c757039ade33b08e3bbd0dc4283 Mon Sep 17 00:00:00 2001 From: ayy lmao Date: Tue, 19 Apr 2022 19:21:14 +0300 Subject: [PATCH 010/119] Fix folder seperators --- src/main/java/emu/grasscutter/data/ResourceLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/data/ResourceLoader.java b/src/main/java/emu/grasscutter/data/ResourceLoader.java index f5b9f4f72..f50067c65 100644 --- a/src/main/java/emu/grasscutter/data/ResourceLoader.java +++ b/src/main/java/emu/grasscutter/data/ResourceLoader.java @@ -197,7 +197,7 @@ public class ResourceLoader { } else { Map map = new TreeMap<>(); java.lang.reflect.Type type = new TypeToken>() {}.getType(); - String[] folderNames = {"BinOutput\\Talent\\EquipTalents\\", "BinOutput\\Talent\\AvatarTalents\\"}; + String[] folderNames = {"BinOutput/Talent/EquipTalents/", "BinOutput/Talent/AvatarTalents/"}; for (String name : folderNames) { File folder = new File(Utils.toFilePath(Grasscutter.getConfig().RESOURCE_FOLDER + name)); From 30701cddb182a9f72dfce691328342882a4ebc02 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 00:40:44 +0800 Subject: [PATCH 011/119] Delete run.bat --- run.bat | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 run.bat diff --git a/run.bat b/run.bat deleted file mode 100644 index 36530cf77..000000000 --- a/run.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off - - - -::This will not work if your java is in a different location, plugin as necessary -::this just saves you from changing your PATH -"C:\Program Files\Java\jdk1.8.0_202\bin\java.exe" -jar ./grasscutter.jar \ No newline at end of file From df9b9eb0f10e2033cf355d6e985931465f72bbd3 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 00:43:01 +0800 Subject: [PATCH 012/119] Make overseauspider.yuanshen.com reachable * Since DispatchServer has handled the server correctly, so it should not be invalidated: https://github.com/Melledy/Grasscutter/blob/main/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java#L402 --- proxy.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/proxy.py b/proxy.py index 1961c90dc..b352af3ac 100644 --- a/proxy.py +++ b/proxy.py @@ -20,7 +20,7 @@ # ## -from mitmproxy import ctx, http +from mitmproxy import http class MlgmXyysd_Genshin_Impact_Proxy: @@ -53,16 +53,13 @@ class MlgmXyysd_Genshin_Impact_Proxy: "hk4e-sdk-os-static.hoyoverse.com", "sdk-os-static.hoyoverse.com", "api-account-os.hoyoverse.com", - "hk4e-sdk-os.hoyoverse.com" + "hk4e-sdk-os.hoyoverse.com", + "overseauspider.yuanshen.com" ] - if flow.request.url.startswith("http://overseauspider.yuanshen.com:8888/log"): - ctx.log.info("Block overseauspider.yuanshen.com") - flow.response = http.HTTPResponse.make(404) - elif flow.request.host in LIST_DOMAINS: - ctx.log.info("Redirect " + flow.request.host) + if flow.request.host in LIST_DOMAINS: flow.request.host = REMOTE_HOST addons = [ MlgmXyysd_Genshin_Impact_Proxy() -] \ No newline at end of file +] From 54c77e47a47864d0ef8ead47b13d17e712bfb121 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Tue, 19 Apr 2022 10:23:08 -0700 Subject: [PATCH 013/119] Remove protos --- proto/AbilityAppliedAbility.proto | 13 -- proto/AbilityAppliedModifier.proto | 23 --- proto/AbilityAttachedModifier.proto | 11 -- proto/AbilityChangeNotify.proto | 10 - proto/AbilityControlBlock.proto | 9 - proto/AbilityEmbryo.proto | 9 - proto/AbilityIdentifier.proto | 12 -- proto/AbilityInvocationsNotify.proto | 9 - proto/AbilityInvokeArgument.proto | 48 ----- proto/AbilityInvokeEntry.proto | 17 -- proto/AbilityInvokeEntryHead.proto | 13 -- proto/AbilityMixinRecoverInfo.proto | 16 -- proto/AbilityScalarType.proto | 13 -- proto/AbilityScalarValueEntry.proto | 17 -- proto/AbilityString.proto | 10 - proto/AbilitySyncStateInfo.proto | 16 -- proto/ActionReasonType.proto | 179 ------------------ proto/ActivityInfo.proto | 47 ----- proto/ActivityNullDetailInfo.proto | 7 - proto/ActivityWatcherInfo.proto | 10 - proto/AiSkillCdInfo.proto | 8 - proto/AiSyncInfo.proto | 8 - proto/AiThreatInfo.proto | 7 - proto/AnimatorParameterValueInfo.proto | 10 - proto/AnimatorParameterValueInfoPair.proto | 10 - proto/AskAddFriendNotify.proto | 10 - proto/AskAddFriendReq.proto | 7 - proto/AskAddFriendRsp.proto | 9 - proto/AttackHitEffectResult.proto | 12 -- proto/AttackResult.proto | 40 ---- proto/AvatarAddNotify.proto | 10 - proto/AvatarChangeCostumeNotify.proto | 9 - proto/AvatarChangeCostumeReq.proto | 8 - proto/AvatarChangeCostumeRsp.proto | 9 - proto/AvatarDataNotify.proto | 16 -- proto/AvatarDieAnimationEndReq.proto | 11 -- proto/AvatarDieAnimationEndRsp.proto | 9 - proto/AvatarEnterSceneInfo.proto | 17 -- proto/AvatarEquipAffixInfo.proto | 8 - proto/AvatarEquipChangeNotify.proto | 15 -- proto/AvatarExpeditionState.proto | 10 - proto/AvatarFetterInfo.proto | 14 -- proto/AvatarFightPropNotify.proto | 8 - proto/AvatarFightPropUpdateNotify.proto | 8 - proto/AvatarFlycloakChangeNotify.proto | 8 - proto/AvatarGainCostumeNotify.proto | 7 - proto/AvatarGainFlycloakNotify.proto | 7 - proto/AvatarInfo.proto | 37 ---- proto/AvatarLifeStateChangeNotify.proto | 14 -- proto/AvatarPromoteReq.proto | 7 - proto/AvatarPromoteRsp.proto | 8 - proto/AvatarPropNotify.proto | 8 - proto/AvatarSkillChangeNotify.proto | 12 -- proto/AvatarSkillInfo.proto | 9 - proto/AvatarSkillUpgradeReq.proto | 9 - proto/AvatarSkillUpgradeRsp.proto | 11 -- proto/AvatarTeam.proto | 8 - proto/AvatarTeamResonanceInfo.proto | 10 - proto/AvatarTeamUpdateNotify.proto | 10 - proto/AvatarUnlockTalentNotify.proto | 10 - proto/AvatarUpgradeReq.proto | 9 - proto/AvatarUpgradeRsp.proto | 12 -- proto/AvatarWearFlycloakReq.proto | 8 - proto/AvatarWearFlycloakRsp.proto | 9 - proto/Birthday.proto | 8 - proto/BlockInfo.proto | 10 - proto/CalcWeaponUpgradeReturnItemsReq.proto | 11 -- proto/CalcWeaponUpgradeReturnItemsRsp.proto | 11 -- proto/ChangeAvatarReq.proto | 12 -- proto/ChangeAvatarRsp.proto | 9 - proto/ChangeGameTimeReq.proto | 8 - proto/ChangeGameTimeRsp.proto | 8 - proto/ChangeHpReason.proto | 31 --- proto/ChangeMpTeamAvatarReq.proto | 8 - proto/ChangeMpTeamAvatarRsp.proto | 9 - proto/ChangeTeamNameReq.proto | 8 - proto/ChangeTeamNameRsp.proto | 9 - proto/ChatInfo.proto | 18 -- proto/ChooseCurAvatarTeamReq.proto | 7 - proto/ChooseCurAvatarTeamRsp.proto | 8 - proto/CityInfo.proto | 9 - proto/ClientAbilityChangeNotify.proto | 10 - proto/ClientAbilityInitBeginNotify.proto | 7 - proto/ClientAbilityInitFinishNotify.proto | 10 - proto/CombatInvocationsNotify.proto | 9 - proto/CombatInvokeEntry.proto | 12 -- proto/CombatTypeArgument.proto | 21 -- proto/CoopCg.proto | 8 - proto/CoopChapter.proto | 21 -- proto/CoopChapterState.proto | 10 - proto/CoopDataNotify.proto | 12 -- proto/CoopPoint.proto | 11 -- proto/CoopPointState.proto | 9 - proto/CoopReward.proto | 10 - proto/CoopRewardState.proto | 9 - proto/CountDownDelete.proto | 7 - proto/DateTimeDelete.proto | 7 - proto/DealAddFriendReq.proto | 10 - proto/DealAddFriendResultType.proto | 8 - proto/DealAddFriendRsp.proto | 11 -- proto/DelTeamEntityNotify.proto | 8 - proto/DelayWeekCountDownDelete.proto | 7 - proto/DeleteFriendNotify.proto | 7 - proto/DeleteFriendReq.proto | 7 - proto/DeleteFriendRsp.proto | 8 - proto/DestroyMaterialReq.proto | 9 - proto/DestroyMaterialRsp.proto | 9 - proto/DoGachaReq.proto | 11 -- proto/DoGachaRsp.proto | 20 -- proto/DropHintNotify.proto | 10 - proto/DungeonEntryInfo.proto | 17 -- proto/DungeonEntryInfoReq.proto | 7 - proto/DungeonEntryInfoRsp.proto | 12 -- proto/EnterSceneDoneRsp.proto | 8 - proto/EnterScenePeerNotify.proto | 10 - proto/EnterSceneReadyRsp.proto | 8 - proto/EnterType.proto | 17 -- proto/EnterWorldAreaReq.proto | 8 - proto/EnterWorldAreaRsp.proto | 8 - proto/EntityAiSyncNotify.proto | 10 - proto/EntityAuthorityInfo.proto | 17 -- proto/EntityClientData.proto | 9 - proto/EntityEnvironmentInfo.proto | 8 - proto/EntityFightPropChangeReasonNotify.proto | 15 -- proto/EntityFightPropUpdateNotify.proto | 8 - proto/EntityMoveInfo.proto | 13 -- proto/EntityPropNotify.proto | 10 - proto/EntityRendererChangedInfo.proto | 9 - proto/Equip.proto | 14 -- proto/EvtAiSyncCombatThreatInfoNotify.proto | 9 - proto/EvtAiSyncSkillCdNotify.proto | 9 - proto/EvtBeingHitInfo.proto | 10 - proto/EvtBeingHitNotify.proto | 11 -- proto/EvtBeingHitsCombineNotify.proto | 11 -- proto/EvtCreateGadgetNotify.proto | 24 --- proto/EvtDestroyGadgetNotify.proto | 10 - proto/EvtHittingOtherInfo.proto | 10 - proto/FeatureBlockInfo.proto | 8 - proto/FetterData.proto | 9 - proto/FightPropPair.proto | 8 - proto/ForwardType.proto | 15 -- proto/FriendBrief.proto | 31 --- proto/FriendEnterHomeOption.proto | 9 - proto/FriendOnlineState.proto | 8 - proto/Furniture.proto | 7 - proto/GachaInfo.proto | 29 --- proto/GachaItem.proto | 14 -- proto/GachaTransferItem.proto | 10 - proto/GachaUpInfo.proto | 8 - proto/GadgetBornType.proto | 13 -- proto/GadgetClientParam.proto | 12 -- proto/GadgetCrucibleInfo.proto | 7 - proto/GadgetInteractReq.proto | 14 -- proto/GadgetInteractRsp.proto | 14 -- proto/GadgetPlayInfo.proto | 17 -- proto/GetActivityInfoRsp.proto | 11 -- proto/GetAllUnlockNameCardRsp.proto | 8 - proto/GetAuthkeyReq.proto | 9 - proto/GetAuthkeyRsp.proto | 12 -- proto/GetGachaInfoRsp.proto | 11 -- proto/GetPlayerAskFriendListRsp.proto | 10 - proto/GetPlayerBlacklistRsp.proto | 10 - proto/GetPlayerFriendListRsp.proto | 11 -- proto/GetPlayerSocialDetailReq.proto | 7 - proto/GetPlayerSocialDetailRsp.proto | 10 - proto/GetPlayerTokenReq.proto | 11 -- proto/GetPlayerTokenRsp.proto | 19 -- proto/GetSceneAreaReq.proto | 8 - proto/GetSceneAreaRsp.proto | 12 -- proto/GetScenePointReq.proto | 8 - proto/GetScenePointRsp.proto | 16 -- proto/GetShopReq.proto | 7 - proto/GetShopRsp.proto | 10 - proto/GetShopmallDataRsp.proto | 8 - proto/GetWorldMpInfoRsp.proto | 9 - proto/H5ActivityIdsNotify.proto | 7 - proto/HeadImage.proto | 7 - proto/HitColliderType.proto | 10 - proto/HitCollision.proto | 15 -- proto/HostPlayerNotify.proto | 8 - proto/InterOpType.proto | 8 - proto/InteractType.proto | 17 -- proto/Item.proto | 17 -- proto/ItemAddHintNotify.proto | 16 -- proto/ItemExceedLimitNotify.proto | 10 - proto/ItemGivingReq.proto | 11 -- proto/ItemGivingRsp.proto | 8 - proto/ItemHint.proto | 9 - proto/ItemParam.proto | 8 - proto/LifeStateChangeNotify.proto | 14 -- proto/MPLevelEntityInfo.proto | 11 -- proto/MapMarkFromType.proto | 9 - proto/MapMarkPoint.proto | 17 -- proto/MapMarkPointType.proto | 12 -- proto/MarkMapReq.proto | 12 -- proto/MassivePropParam.proto | 10 - proto/MassivePropSyncInfo.proto | 10 - proto/Material.proto | 10 - proto/MaterialDeleteInfo.proto | 16 -- proto/MaterialInfo.proto | 8 - proto/MathQuaternion.proto | 10 - proto/ModifierDurability.proto | 8 - proto/MonsterBornType.proto | 9 - proto/MonsterRoute.proto | 12 -- proto/MotionInfo.proto | 18 -- proto/MotionState.proto | 53 ------ proto/MovingPlatformType.proto | 7 - proto/MpSettingType.proto | 9 - proto/OnlinePlayerInfo.proto | 20 -- proto/OpenStateUpdateNotify.proto | 7 - proto/Operation.proto | 10 - proto/PacketHead.proto | 8 - proto/PingReq.proto | 8 - proto/PingRsp.proto | 9 - proto/PlatformInfo.proto | 25 --- proto/PlayerApplyEnterMpNotify.proto | 10 - proto/PlayerApplyEnterMpReason.proto | 19 -- proto/PlayerApplyEnterMpReq.proto | 7 - proto/PlayerApplyEnterMpResultNotify.proto | 12 -- proto/PlayerApplyEnterMpResultReq.proto | 8 - proto/PlayerApplyEnterMpResultRsp.proto | 10 - proto/PlayerApplyEnterMpRsp.proto | 9 - proto/PlayerChatNotify.proto | 10 - proto/PlayerChatReq.proto | 10 - proto/PlayerChatRsp.proto | 8 - proto/PlayerDataNotify.proto | 13 -- proto/PlayerDieType.proto | 15 -- proto/PlayerEnterSceneInfoNotify.proto | 15 -- proto/PlayerEnterSceneNotify.proto | 25 --- proto/PlayerGameTimeNotify.proto | 8 - proto/PlayerGetForceQuitBanInfoRsp.proto | 9 - proto/PlayerLocationInfo.proto | 11 -- proto/PlayerLoginReq.proto | 41 ---- proto/PlayerLoginRsp.proto | 41 ---- proto/PlayerPropNotify.proto | 9 - proto/PlayerRTTInfo.proto | 8 - proto/PlayerSetPauseReq.proto | 7 - proto/PlayerStoreNotify.proto | 12 -- proto/PlayerTimeNotify.proto | 9 - proto/PostEnterSceneRsp.proto | 8 - proto/PrivateChatNotify.proto | 9 - proto/PrivateChatReq.proto | 11 -- proto/PrivateChatRsp.proto | 8 - proto/PropChangeReason.proto | 20 -- proto/PropPair.proto | 10 - proto/PropValue.proto | 12 -- proto/ProtEntityType.proto | 21 -- proto/ProudSkillChangeNotify.proto | 10 - proto/ProudSkillExtraLevelNotify.proto | 10 - proto/PullPrivateChatReq.proto | 9 - proto/PullPrivateChatRsp.proto | 10 - proto/PullRecentChatRsp.proto | 10 - proto/QueryCurrRegionHttpRsp.proto | 14 -- proto/QueryRegionListHttpRsp.proto | 13 -- proto/RegionInfo.proto | 29 --- proto/RegionSimpleInfo.proto | 10 - proto/Reliquary.proto | 11 -- proto/ReliquaryPromoteReq.proto | 8 - proto/ReliquaryPromoteRsp.proto | 12 -- proto/ReliquaryUpgradeReq.proto | 11 -- proto/ReliquaryUpgradeRsp.proto | 13 -- proto/ResVersionConfig.proto | 11 -- proto/ResinCard.proto | 10 - proto/ResinChangeNotify.proto | 9 - proto/ResinCostType.proto | 12 -- proto/Route.proto | 10 - proto/RoutePoint.proto | 19 -- proto/SceneAreaWeatherNotify.proto | 11 -- proto/SceneAvatarInfo.proto | 28 --- proto/SceneEntityAiInfo.proto | 16 -- proto/SceneEntityAppearNotify.proto | 12 -- proto/SceneEntityDisappearNotify.proto | 10 - proto/SceneEntityInfo.proto | 39 ---- proto/SceneEntityMoveNotify.proto | 12 -- proto/SceneForceUnlockNotify.proto | 8 - proto/SceneGadgetInfo.proto | 43 ----- proto/SceneInitFinishRsp.proto | 8 - proto/SceneKickPlayerNotify.proto | 8 - proto/SceneKickPlayerReq.proto | 7 - proto/SceneKickPlayerRsp.proto | 8 - proto/SceneMonsterInfo.proto | 30 --- proto/SceneNpcInfo.proto | 10 - proto/ScenePlayerInfo.proto | 14 -- proto/ScenePlayerInfoNotify.proto | 9 - proto/ScenePlayerLocationNotify.proto | 10 - proto/SceneReliquaryInfo.proto | 10 - proto/SceneTeamAvatar.proto | 29 --- proto/SceneTeamUpdateNotify.proto | 10 - proto/SceneTimeNotify.proto | 9 - proto/SceneUnlockInfo.proto | 9 - proto/SceneUnlockInfoNotify.proto | 9 - proto/SceneWeaponInfo.proto | 16 -- proto/ServantInfo.proto | 8 - proto/ServerBuff.proto | 12 -- proto/ServerTimeNotify.proto | 7 - proto/SetEquipLockStateReq.proto | 8 - proto/SetEquipLockStateRsp.proto | 9 - proto/SetNameCardReq.proto | 7 - proto/SetNameCardRsp.proto | 8 - proto/SetPlayerBornDataReq.proto | 8 - proto/SetPlayerHeadImageReq.proto | 7 - proto/SetPlayerHeadImageRsp.proto | 10 - proto/SetPlayerNameReq.proto | 7 - proto/SetPlayerNameRsp.proto | 8 - proto/SetPlayerPropReq.proto | 9 - proto/SetPlayerPropRsp.proto | 7 - proto/SetPlayerSignatureReq.proto | 7 - proto/SetPlayerSignatureRsp.proto | 8 - proto/SetUpAvatarTeamReq.proto | 9 - proto/SetUpAvatarTeamRsp.proto | 10 - proto/Shop.proto | 17 -- proto/ShopCardProduct.proto | 18 -- proto/ShopGoods.proto | 24 --- proto/ShopGoodsDisableType.proto | 9 - proto/ShopMcoinProduct.proto | 13 -- proto/ShortAbilityHashPair.proto | 8 - proto/SocialDetail.proto | 34 ---- proto/SocialShowAvatarInfo.proto | 8 - proto/StoreItemChangeNotify.proto | 11 -- proto/StoreItemDelNotify.proto | 10 - proto/StoreType.proto | 9 - proto/StoreWeightLimitNotify.proto | 14 -- proto/SyncScenePlayTeamEntityNotify.proto | 8 - proto/SyncTeamEntityNotify.proto | 10 - proto/SystemHint.proto | 7 - proto/TakeoffEquipReq.proto | 8 - proto/TakeoffEquipRsp.proto | 9 - proto/TeamEnterSceneInfo.proto | 11 -- proto/TeamEntityInfo.proto | 11 -- proto/TeamResonanceChangeNotify.proto | 9 - proto/TowerAllDataRsp.proto | 27 --- proto/TowerCurLevelRecord.proto | 13 -- proto/TowerFloorRecord.proto | 12 -- proto/TowerLevelRecord.proto | 8 - proto/TowerMonthlyBrief.proto | 10 - proto/TowerTeam.proto | 8 - proto/TrackingIOInfo.proto | 13 -- proto/TrialAvatarGrantRecord.proto | 8 - proto/TrialAvatarInfo.proto | 12 -- proto/UnionCmd.proto | 8 - proto/UnionCmdNotify.proto | 9 - proto/UnlockAvatarTalentReq.proto | 8 - proto/UnlockAvatarTalentRsp.proto | 9 - proto/UnlockNameCardNotify.proto | 7 - proto/UseItemReq.proto | 11 -- proto/UseItemRsp.proto | 11 -- proto/Vector.proto | 9 - proto/VisionType.proto | 21 -- proto/Weapon.proto | 10 - proto/WeaponAwakenReq.proto | 9 - proto/WeaponAwakenRsp.proto | 12 -- proto/WeaponPromoteReq.proto | 7 - proto/WeaponPromoteRsp.proto | 10 - proto/WeaponUpgradeReq.proto | 11 -- proto/WeaponUpgradeRsp.proto | 13 -- proto/WearEquipReq.proto | 8 - proto/WearEquipRsp.proto | 9 - proto/WeeklyBossResinDiscountInfo.proto | 10 - proto/WorldDataNotify.proto | 9 - proto/WorldPlayerDieNotify.proto | 14 -- proto/WorldPlayerInfoNotify.proto | 10 - proto/WorldPlayerLocationNotify.proto | 9 - proto/WorldPlayerRTTNotify.proto | 9 - proto/WorldPlayerReviveRsp.proto | 7 - 364 files changed, 4491 deletions(-) delete mode 100644 proto/AbilityAppliedAbility.proto delete mode 100644 proto/AbilityAppliedModifier.proto delete mode 100644 proto/AbilityAttachedModifier.proto delete mode 100644 proto/AbilityChangeNotify.proto delete mode 100644 proto/AbilityControlBlock.proto delete mode 100644 proto/AbilityEmbryo.proto delete mode 100644 proto/AbilityIdentifier.proto delete mode 100644 proto/AbilityInvocationsNotify.proto delete mode 100644 proto/AbilityInvokeArgument.proto delete mode 100644 proto/AbilityInvokeEntry.proto delete mode 100644 proto/AbilityInvokeEntryHead.proto delete mode 100644 proto/AbilityMixinRecoverInfo.proto delete mode 100644 proto/AbilityScalarType.proto delete mode 100644 proto/AbilityScalarValueEntry.proto delete mode 100644 proto/AbilityString.proto delete mode 100644 proto/AbilitySyncStateInfo.proto delete mode 100644 proto/ActionReasonType.proto delete mode 100644 proto/ActivityInfo.proto delete mode 100644 proto/ActivityNullDetailInfo.proto delete mode 100644 proto/ActivityWatcherInfo.proto delete mode 100644 proto/AiSkillCdInfo.proto delete mode 100644 proto/AiSyncInfo.proto delete mode 100644 proto/AiThreatInfo.proto delete mode 100644 proto/AnimatorParameterValueInfo.proto delete mode 100644 proto/AnimatorParameterValueInfoPair.proto delete mode 100644 proto/AskAddFriendNotify.proto delete mode 100644 proto/AskAddFriendReq.proto delete mode 100644 proto/AskAddFriendRsp.proto delete mode 100644 proto/AttackHitEffectResult.proto delete mode 100644 proto/AttackResult.proto delete mode 100644 proto/AvatarAddNotify.proto delete mode 100644 proto/AvatarChangeCostumeNotify.proto delete mode 100644 proto/AvatarChangeCostumeReq.proto delete mode 100644 proto/AvatarChangeCostumeRsp.proto delete mode 100644 proto/AvatarDataNotify.proto delete mode 100644 proto/AvatarDieAnimationEndReq.proto delete mode 100644 proto/AvatarDieAnimationEndRsp.proto delete mode 100644 proto/AvatarEnterSceneInfo.proto delete mode 100644 proto/AvatarEquipAffixInfo.proto delete mode 100644 proto/AvatarEquipChangeNotify.proto delete mode 100644 proto/AvatarExpeditionState.proto delete mode 100644 proto/AvatarFetterInfo.proto delete mode 100644 proto/AvatarFightPropNotify.proto delete mode 100644 proto/AvatarFightPropUpdateNotify.proto delete mode 100644 proto/AvatarFlycloakChangeNotify.proto delete mode 100644 proto/AvatarGainCostumeNotify.proto delete mode 100644 proto/AvatarGainFlycloakNotify.proto delete mode 100644 proto/AvatarInfo.proto delete mode 100644 proto/AvatarLifeStateChangeNotify.proto delete mode 100644 proto/AvatarPromoteReq.proto delete mode 100644 proto/AvatarPromoteRsp.proto delete mode 100644 proto/AvatarPropNotify.proto delete mode 100644 proto/AvatarSkillChangeNotify.proto delete mode 100644 proto/AvatarSkillInfo.proto delete mode 100644 proto/AvatarSkillUpgradeReq.proto delete mode 100644 proto/AvatarSkillUpgradeRsp.proto delete mode 100644 proto/AvatarTeam.proto delete mode 100644 proto/AvatarTeamResonanceInfo.proto delete mode 100644 proto/AvatarTeamUpdateNotify.proto delete mode 100644 proto/AvatarUnlockTalentNotify.proto delete mode 100644 proto/AvatarUpgradeReq.proto delete mode 100644 proto/AvatarUpgradeRsp.proto delete mode 100644 proto/AvatarWearFlycloakReq.proto delete mode 100644 proto/AvatarWearFlycloakRsp.proto delete mode 100644 proto/Birthday.proto delete mode 100644 proto/BlockInfo.proto delete mode 100644 proto/CalcWeaponUpgradeReturnItemsReq.proto delete mode 100644 proto/CalcWeaponUpgradeReturnItemsRsp.proto delete mode 100644 proto/ChangeAvatarReq.proto delete mode 100644 proto/ChangeAvatarRsp.proto delete mode 100644 proto/ChangeGameTimeReq.proto delete mode 100644 proto/ChangeGameTimeRsp.proto delete mode 100644 proto/ChangeHpReason.proto delete mode 100644 proto/ChangeMpTeamAvatarReq.proto delete mode 100644 proto/ChangeMpTeamAvatarRsp.proto delete mode 100644 proto/ChangeTeamNameReq.proto delete mode 100644 proto/ChangeTeamNameRsp.proto delete mode 100644 proto/ChatInfo.proto delete mode 100644 proto/ChooseCurAvatarTeamReq.proto delete mode 100644 proto/ChooseCurAvatarTeamRsp.proto delete mode 100644 proto/CityInfo.proto delete mode 100644 proto/ClientAbilityChangeNotify.proto delete mode 100644 proto/ClientAbilityInitBeginNotify.proto delete mode 100644 proto/ClientAbilityInitFinishNotify.proto delete mode 100644 proto/CombatInvocationsNotify.proto delete mode 100644 proto/CombatInvokeEntry.proto delete mode 100644 proto/CombatTypeArgument.proto delete mode 100644 proto/CoopCg.proto delete mode 100644 proto/CoopChapter.proto delete mode 100644 proto/CoopChapterState.proto delete mode 100644 proto/CoopDataNotify.proto delete mode 100644 proto/CoopPoint.proto delete mode 100644 proto/CoopPointState.proto delete mode 100644 proto/CoopReward.proto delete mode 100644 proto/CoopRewardState.proto delete mode 100644 proto/CountDownDelete.proto delete mode 100644 proto/DateTimeDelete.proto delete mode 100644 proto/DealAddFriendReq.proto delete mode 100644 proto/DealAddFriendResultType.proto delete mode 100644 proto/DealAddFriendRsp.proto delete mode 100644 proto/DelTeamEntityNotify.proto delete mode 100644 proto/DelayWeekCountDownDelete.proto delete mode 100644 proto/DeleteFriendNotify.proto delete mode 100644 proto/DeleteFriendReq.proto delete mode 100644 proto/DeleteFriendRsp.proto delete mode 100644 proto/DestroyMaterialReq.proto delete mode 100644 proto/DestroyMaterialRsp.proto delete mode 100644 proto/DoGachaReq.proto delete mode 100644 proto/DoGachaRsp.proto delete mode 100644 proto/DropHintNotify.proto delete mode 100644 proto/DungeonEntryInfo.proto delete mode 100644 proto/DungeonEntryInfoReq.proto delete mode 100644 proto/DungeonEntryInfoRsp.proto delete mode 100644 proto/EnterSceneDoneRsp.proto delete mode 100644 proto/EnterScenePeerNotify.proto delete mode 100644 proto/EnterSceneReadyRsp.proto delete mode 100644 proto/EnterType.proto delete mode 100644 proto/EnterWorldAreaReq.proto delete mode 100644 proto/EnterWorldAreaRsp.proto delete mode 100644 proto/EntityAiSyncNotify.proto delete mode 100644 proto/EntityAuthorityInfo.proto delete mode 100644 proto/EntityClientData.proto delete mode 100644 proto/EntityEnvironmentInfo.proto delete mode 100644 proto/EntityFightPropChangeReasonNotify.proto delete mode 100644 proto/EntityFightPropUpdateNotify.proto delete mode 100644 proto/EntityMoveInfo.proto delete mode 100644 proto/EntityPropNotify.proto delete mode 100644 proto/EntityRendererChangedInfo.proto delete mode 100644 proto/Equip.proto delete mode 100644 proto/EvtAiSyncCombatThreatInfoNotify.proto delete mode 100644 proto/EvtAiSyncSkillCdNotify.proto delete mode 100644 proto/EvtBeingHitInfo.proto delete mode 100644 proto/EvtBeingHitNotify.proto delete mode 100644 proto/EvtBeingHitsCombineNotify.proto delete mode 100644 proto/EvtCreateGadgetNotify.proto delete mode 100644 proto/EvtDestroyGadgetNotify.proto delete mode 100644 proto/EvtHittingOtherInfo.proto delete mode 100644 proto/FeatureBlockInfo.proto delete mode 100644 proto/FetterData.proto delete mode 100644 proto/FightPropPair.proto delete mode 100644 proto/ForwardType.proto delete mode 100644 proto/FriendBrief.proto delete mode 100644 proto/FriendEnterHomeOption.proto delete mode 100644 proto/FriendOnlineState.proto delete mode 100644 proto/Furniture.proto delete mode 100644 proto/GachaInfo.proto delete mode 100644 proto/GachaItem.proto delete mode 100644 proto/GachaTransferItem.proto delete mode 100644 proto/GachaUpInfo.proto delete mode 100644 proto/GadgetBornType.proto delete mode 100644 proto/GadgetClientParam.proto delete mode 100644 proto/GadgetCrucibleInfo.proto delete mode 100644 proto/GadgetInteractReq.proto delete mode 100644 proto/GadgetInteractRsp.proto delete mode 100644 proto/GadgetPlayInfo.proto delete mode 100644 proto/GetActivityInfoRsp.proto delete mode 100644 proto/GetAllUnlockNameCardRsp.proto delete mode 100644 proto/GetAuthkeyReq.proto delete mode 100644 proto/GetAuthkeyRsp.proto delete mode 100644 proto/GetGachaInfoRsp.proto delete mode 100644 proto/GetPlayerAskFriendListRsp.proto delete mode 100644 proto/GetPlayerBlacklistRsp.proto delete mode 100644 proto/GetPlayerFriendListRsp.proto delete mode 100644 proto/GetPlayerSocialDetailReq.proto delete mode 100644 proto/GetPlayerSocialDetailRsp.proto delete mode 100644 proto/GetPlayerTokenReq.proto delete mode 100644 proto/GetPlayerTokenRsp.proto delete mode 100644 proto/GetSceneAreaReq.proto delete mode 100644 proto/GetSceneAreaRsp.proto delete mode 100644 proto/GetScenePointReq.proto delete mode 100644 proto/GetScenePointRsp.proto delete mode 100644 proto/GetShopReq.proto delete mode 100644 proto/GetShopRsp.proto delete mode 100644 proto/GetShopmallDataRsp.proto delete mode 100644 proto/GetWorldMpInfoRsp.proto delete mode 100644 proto/H5ActivityIdsNotify.proto delete mode 100644 proto/HeadImage.proto delete mode 100644 proto/HitColliderType.proto delete mode 100644 proto/HitCollision.proto delete mode 100644 proto/HostPlayerNotify.proto delete mode 100644 proto/InterOpType.proto delete mode 100644 proto/InteractType.proto delete mode 100644 proto/Item.proto delete mode 100644 proto/ItemAddHintNotify.proto delete mode 100644 proto/ItemExceedLimitNotify.proto delete mode 100644 proto/ItemGivingReq.proto delete mode 100644 proto/ItemGivingRsp.proto delete mode 100644 proto/ItemHint.proto delete mode 100644 proto/ItemParam.proto delete mode 100644 proto/LifeStateChangeNotify.proto delete mode 100644 proto/MPLevelEntityInfo.proto delete mode 100644 proto/MapMarkFromType.proto delete mode 100644 proto/MapMarkPoint.proto delete mode 100644 proto/MapMarkPointType.proto delete mode 100644 proto/MarkMapReq.proto delete mode 100644 proto/MassivePropParam.proto delete mode 100644 proto/MassivePropSyncInfo.proto delete mode 100644 proto/Material.proto delete mode 100644 proto/MaterialDeleteInfo.proto delete mode 100644 proto/MaterialInfo.proto delete mode 100644 proto/MathQuaternion.proto delete mode 100644 proto/ModifierDurability.proto delete mode 100644 proto/MonsterBornType.proto delete mode 100644 proto/MonsterRoute.proto delete mode 100644 proto/MotionInfo.proto delete mode 100644 proto/MotionState.proto delete mode 100644 proto/MovingPlatformType.proto delete mode 100644 proto/MpSettingType.proto delete mode 100644 proto/OnlinePlayerInfo.proto delete mode 100644 proto/OpenStateUpdateNotify.proto delete mode 100644 proto/Operation.proto delete mode 100644 proto/PacketHead.proto delete mode 100644 proto/PingReq.proto delete mode 100644 proto/PingRsp.proto delete mode 100644 proto/PlatformInfo.proto delete mode 100644 proto/PlayerApplyEnterMpNotify.proto delete mode 100644 proto/PlayerApplyEnterMpReason.proto delete mode 100644 proto/PlayerApplyEnterMpReq.proto delete mode 100644 proto/PlayerApplyEnterMpResultNotify.proto delete mode 100644 proto/PlayerApplyEnterMpResultReq.proto delete mode 100644 proto/PlayerApplyEnterMpResultRsp.proto delete mode 100644 proto/PlayerApplyEnterMpRsp.proto delete mode 100644 proto/PlayerChatNotify.proto delete mode 100644 proto/PlayerChatReq.proto delete mode 100644 proto/PlayerChatRsp.proto delete mode 100644 proto/PlayerDataNotify.proto delete mode 100644 proto/PlayerDieType.proto delete mode 100644 proto/PlayerEnterSceneInfoNotify.proto delete mode 100644 proto/PlayerEnterSceneNotify.proto delete mode 100644 proto/PlayerGameTimeNotify.proto delete mode 100644 proto/PlayerGetForceQuitBanInfoRsp.proto delete mode 100644 proto/PlayerLocationInfo.proto delete mode 100644 proto/PlayerLoginReq.proto delete mode 100644 proto/PlayerLoginRsp.proto delete mode 100644 proto/PlayerPropNotify.proto delete mode 100644 proto/PlayerRTTInfo.proto delete mode 100644 proto/PlayerSetPauseReq.proto delete mode 100644 proto/PlayerStoreNotify.proto delete mode 100644 proto/PlayerTimeNotify.proto delete mode 100644 proto/PostEnterSceneRsp.proto delete mode 100644 proto/PrivateChatNotify.proto delete mode 100644 proto/PrivateChatReq.proto delete mode 100644 proto/PrivateChatRsp.proto delete mode 100644 proto/PropChangeReason.proto delete mode 100644 proto/PropPair.proto delete mode 100644 proto/PropValue.proto delete mode 100644 proto/ProtEntityType.proto delete mode 100644 proto/ProudSkillChangeNotify.proto delete mode 100644 proto/ProudSkillExtraLevelNotify.proto delete mode 100644 proto/PullPrivateChatReq.proto delete mode 100644 proto/PullPrivateChatRsp.proto delete mode 100644 proto/PullRecentChatRsp.proto delete mode 100644 proto/QueryCurrRegionHttpRsp.proto delete mode 100644 proto/QueryRegionListHttpRsp.proto delete mode 100644 proto/RegionInfo.proto delete mode 100644 proto/RegionSimpleInfo.proto delete mode 100644 proto/Reliquary.proto delete mode 100644 proto/ReliquaryPromoteReq.proto delete mode 100644 proto/ReliquaryPromoteRsp.proto delete mode 100644 proto/ReliquaryUpgradeReq.proto delete mode 100644 proto/ReliquaryUpgradeRsp.proto delete mode 100644 proto/ResVersionConfig.proto delete mode 100644 proto/ResinCard.proto delete mode 100644 proto/ResinChangeNotify.proto delete mode 100644 proto/ResinCostType.proto delete mode 100644 proto/Route.proto delete mode 100644 proto/RoutePoint.proto delete mode 100644 proto/SceneAreaWeatherNotify.proto delete mode 100644 proto/SceneAvatarInfo.proto delete mode 100644 proto/SceneEntityAiInfo.proto delete mode 100644 proto/SceneEntityAppearNotify.proto delete mode 100644 proto/SceneEntityDisappearNotify.proto delete mode 100644 proto/SceneEntityInfo.proto delete mode 100644 proto/SceneEntityMoveNotify.proto delete mode 100644 proto/SceneForceUnlockNotify.proto delete mode 100644 proto/SceneGadgetInfo.proto delete mode 100644 proto/SceneInitFinishRsp.proto delete mode 100644 proto/SceneKickPlayerNotify.proto delete mode 100644 proto/SceneKickPlayerReq.proto delete mode 100644 proto/SceneKickPlayerRsp.proto delete mode 100644 proto/SceneMonsterInfo.proto delete mode 100644 proto/SceneNpcInfo.proto delete mode 100644 proto/ScenePlayerInfo.proto delete mode 100644 proto/ScenePlayerInfoNotify.proto delete mode 100644 proto/ScenePlayerLocationNotify.proto delete mode 100644 proto/SceneReliquaryInfo.proto delete mode 100644 proto/SceneTeamAvatar.proto delete mode 100644 proto/SceneTeamUpdateNotify.proto delete mode 100644 proto/SceneTimeNotify.proto delete mode 100644 proto/SceneUnlockInfo.proto delete mode 100644 proto/SceneUnlockInfoNotify.proto delete mode 100644 proto/SceneWeaponInfo.proto delete mode 100644 proto/ServantInfo.proto delete mode 100644 proto/ServerBuff.proto delete mode 100644 proto/ServerTimeNotify.proto delete mode 100644 proto/SetEquipLockStateReq.proto delete mode 100644 proto/SetEquipLockStateRsp.proto delete mode 100644 proto/SetNameCardReq.proto delete mode 100644 proto/SetNameCardRsp.proto delete mode 100644 proto/SetPlayerBornDataReq.proto delete mode 100644 proto/SetPlayerHeadImageReq.proto delete mode 100644 proto/SetPlayerHeadImageRsp.proto delete mode 100644 proto/SetPlayerNameReq.proto delete mode 100644 proto/SetPlayerNameRsp.proto delete mode 100644 proto/SetPlayerPropReq.proto delete mode 100644 proto/SetPlayerPropRsp.proto delete mode 100644 proto/SetPlayerSignatureReq.proto delete mode 100644 proto/SetPlayerSignatureRsp.proto delete mode 100644 proto/SetUpAvatarTeamReq.proto delete mode 100644 proto/SetUpAvatarTeamRsp.proto delete mode 100644 proto/Shop.proto delete mode 100644 proto/ShopCardProduct.proto delete mode 100644 proto/ShopGoods.proto delete mode 100644 proto/ShopGoodsDisableType.proto delete mode 100644 proto/ShopMcoinProduct.proto delete mode 100644 proto/ShortAbilityHashPair.proto delete mode 100644 proto/SocialDetail.proto delete mode 100644 proto/SocialShowAvatarInfo.proto delete mode 100644 proto/StoreItemChangeNotify.proto delete mode 100644 proto/StoreItemDelNotify.proto delete mode 100644 proto/StoreType.proto delete mode 100644 proto/StoreWeightLimitNotify.proto delete mode 100644 proto/SyncScenePlayTeamEntityNotify.proto delete mode 100644 proto/SyncTeamEntityNotify.proto delete mode 100644 proto/SystemHint.proto delete mode 100644 proto/TakeoffEquipReq.proto delete mode 100644 proto/TakeoffEquipRsp.proto delete mode 100644 proto/TeamEnterSceneInfo.proto delete mode 100644 proto/TeamEntityInfo.proto delete mode 100644 proto/TeamResonanceChangeNotify.proto delete mode 100644 proto/TowerAllDataRsp.proto delete mode 100644 proto/TowerCurLevelRecord.proto delete mode 100644 proto/TowerFloorRecord.proto delete mode 100644 proto/TowerLevelRecord.proto delete mode 100644 proto/TowerMonthlyBrief.proto delete mode 100644 proto/TowerTeam.proto delete mode 100644 proto/TrackingIOInfo.proto delete mode 100644 proto/TrialAvatarGrantRecord.proto delete mode 100644 proto/TrialAvatarInfo.proto delete mode 100644 proto/UnionCmd.proto delete mode 100644 proto/UnionCmdNotify.proto delete mode 100644 proto/UnlockAvatarTalentReq.proto delete mode 100644 proto/UnlockAvatarTalentRsp.proto delete mode 100644 proto/UnlockNameCardNotify.proto delete mode 100644 proto/UseItemReq.proto delete mode 100644 proto/UseItemRsp.proto delete mode 100644 proto/Vector.proto delete mode 100644 proto/VisionType.proto delete mode 100644 proto/Weapon.proto delete mode 100644 proto/WeaponAwakenReq.proto delete mode 100644 proto/WeaponAwakenRsp.proto delete mode 100644 proto/WeaponPromoteReq.proto delete mode 100644 proto/WeaponPromoteRsp.proto delete mode 100644 proto/WeaponUpgradeReq.proto delete mode 100644 proto/WeaponUpgradeRsp.proto delete mode 100644 proto/WearEquipReq.proto delete mode 100644 proto/WearEquipRsp.proto delete mode 100644 proto/WeeklyBossResinDiscountInfo.proto delete mode 100644 proto/WorldDataNotify.proto delete mode 100644 proto/WorldPlayerDieNotify.proto delete mode 100644 proto/WorldPlayerInfoNotify.proto delete mode 100644 proto/WorldPlayerLocationNotify.proto delete mode 100644 proto/WorldPlayerRTTNotify.proto delete mode 100644 proto/WorldPlayerReviveRsp.proto diff --git a/proto/AbilityAppliedAbility.proto b/proto/AbilityAppliedAbility.proto deleted file mode 100644 index f9fd845da..000000000 --- a/proto/AbilityAppliedAbility.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityScalarValueEntry.proto"; -import "AbilityString.proto"; - -message AbilityAppliedAbility { - AbilityString abilityName = 1; - AbilityString abilityOverride = 2; - repeated AbilityScalarValueEntry overrideMap = 3; - uint32 instancedAbilityId = 4; -} diff --git a/proto/AbilityAppliedModifier.proto b/proto/AbilityAppliedModifier.proto deleted file mode 100644 index 857fd8cf2..000000000 --- a/proto/AbilityAppliedModifier.proto +++ /dev/null @@ -1,23 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityAttachedModifier.proto"; -import "AbilityString.proto"; -import "ModifierDurability.proto"; - -message AbilityAppliedModifier { - int32 modifierLocalId = 1; - uint32 parentAbilityEntityId = 2; - AbilityString parentAbilityName = 3; - AbilityString parentAbilityOverride = 4; - uint32 instancedAbilityId = 5; - uint32 instancedModifierId = 6; - float existDuration = 7; - AbilityAttachedModifier attachedInstancedModifier = 8; - uint32 applyEntityId = 9; - bool isAttachedParentAbility = 10; - ModifierDurability modifierDurability = 11; - uint32 sbuffUid = 12; - bool isServerbuffModifier = 13; -} diff --git a/proto/AbilityAttachedModifier.proto b/proto/AbilityAttachedModifier.proto deleted file mode 100644 index c99cb84f5..000000000 --- a/proto/AbilityAttachedModifier.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AbilityAttachedModifier { - bool isInvalid = 1; - uint32 ownerEntityId = 2; - uint32 instancedModifierId = 3; - bool isServerbuffModifier = 4; - int32 attachNameHash = 5; -} diff --git a/proto/AbilityChangeNotify.proto b/proto/AbilityChangeNotify.proto deleted file mode 100644 index 4a3a63e22..000000000 --- a/proto/AbilityChangeNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityControlBlock.proto"; - -message AbilityChangeNotify { - uint32 entityId = 1; - AbilityControlBlock abilityControlBlock = 2; -} diff --git a/proto/AbilityControlBlock.proto b/proto/AbilityControlBlock.proto deleted file mode 100644 index d47c3c9d8..000000000 --- a/proto/AbilityControlBlock.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityEmbryo.proto"; - -message AbilityControlBlock { - repeated AbilityEmbryo abilityEmbryoList = 1; -} diff --git a/proto/AbilityEmbryo.proto b/proto/AbilityEmbryo.proto deleted file mode 100644 index edbb26b44..000000000 --- a/proto/AbilityEmbryo.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AbilityEmbryo { - uint32 abilityId = 1; - fixed32 abilityNameHash = 2; - fixed32 abilityOverrideNameHash = 3; -} diff --git a/proto/AbilityIdentifier.proto b/proto/AbilityIdentifier.proto deleted file mode 100644 index f1ddecd09..000000000 --- a/proto/AbilityIdentifier.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AbilityIdentifier { - uint32 instancedAbilityId = 1; - uint32 abilityCasterId = 2; - int32 localId = 3; - uint32 instancedModifierId = 4; - uint32 modifierOwnerId = 5; - bool isServerbuffModifier = 6; -} diff --git a/proto/AbilityInvocationsNotify.proto b/proto/AbilityInvocationsNotify.proto deleted file mode 100644 index a38535403..000000000 --- a/proto/AbilityInvocationsNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityInvokeEntry.proto"; - -message AbilityInvocationsNotify { - repeated AbilityInvokeEntry invokes = 1; -} diff --git a/proto/AbilityInvokeArgument.proto b/proto/AbilityInvokeArgument.proto deleted file mode 100644 index a5698323a..000000000 --- a/proto/AbilityInvokeArgument.proto +++ /dev/null @@ -1,48 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum AbilityInvokeArgument { - AbilityNone = 0; - AbilityMetaModifierChange = 1; - AbilityMetaCommandModifierChangeRequest = 2; - AbilityMetaSpecialFloatArgument = 3; - AbilityMetaOverrideParam = 4; - AbilityMetaClearOverrideParam = 5; - AbilityMetaReinitOverridemap = 6; - AbilityMetaGlobalFloatValue = 7; - AbilityMetaClearGlobalFloatValue = 8; - AbilityMetaAbilityElementStrength = 9; - AbilityMetaAddOrGetAbilityAndTrigger = 10; - AbilityMetaSetKilledSetate = 11; - AbilityMetaSetAbilityTrigger = 12; - AbilityMetaAddNewAbility = 13; - AbilityMetaRemoveAbility = 14; - AbilityMetaSetModifierApplyEntity = 15; - AbilityMetaModifierDurabilityChange = 16; - AbilityMetaElementReactionVisual = 17; - AbilityMetaSetPoseParameter = 18; - AbilityMetaUpdateBaseReactionDamage = 19; - AbilityActionTriggerAbility = 50; - AbilityActionSetCrashDamage = 51; - AbilityActionEffect = 52; - AbilityActionSummon = 53; - AbilityActionBlink = 54; - AbilityActionCreateGadget = 55; - AbilityActionApplyLevelModifier = 56; - AbilityActionGenerateElemBall = 57; - AbilityActionSetRandomOverrideMapValue = 58; - AbilityActionServerMonsterLog = 59; - AbilityMixinAvatarSteerByCamera = 100; - AbilityMixinMonsterDefend = 101; - AbilityMixinWindZone = 102; - AbilityMixinCostStamina = 103; - AbilityMixinEliteShield = 104; - AbilityMixinElementShield = 105; - AbilityMixinGlobalShield = 106; - AbilityMixinShieldBar = 107; - AbilityMixinWindSeedSpawner = 108; - AbilityMixinDoActionByElementReaction = 109; - AbilityMixinFieldEntityCountChange = 110; - AbilityMixinScenePropSync = 111; -} diff --git a/proto/AbilityInvokeEntry.proto b/proto/AbilityInvokeEntry.proto deleted file mode 100644 index 9a3104312..000000000 --- a/proto/AbilityInvokeEntry.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityInvokeArgument.proto"; -import "AbilityInvokeEntryHead.proto"; -import "ForwardType.proto"; - -message AbilityInvokeEntry { - AbilityInvokeEntryHead head = 1; - AbilityInvokeArgument argumentType = 2; - bytes abilityData = 3; - uint32 entityId = 4; - ForwardType forwardType = 5; - uint32 forwardPeer = 6; - uint32 eventId = 7; -} diff --git a/proto/AbilityInvokeEntryHead.proto b/proto/AbilityInvokeEntryHead.proto deleted file mode 100644 index de7196cd1..000000000 --- a/proto/AbilityInvokeEntryHead.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AbilityInvokeEntryHead { - uint32 instancedAbilityId = 1; - uint32 instancedModifierId = 2; - int32 localId = 3; - int32 modifierConfigLocalId = 4; - uint32 targetId = 5; - bool isServerbuffModifier = 6; - uint32 serverBuffUid = 7; -} diff --git a/proto/AbilityMixinRecoverInfo.proto b/proto/AbilityMixinRecoverInfo.proto deleted file mode 100644 index a23f0d401..000000000 --- a/proto/AbilityMixinRecoverInfo.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MassivePropSyncInfo.proto"; - -message AbilityMixinRecoverInfo { - oneof source { - uint32 instancedAbilityId = 1; - uint32 instancedModifierId = 2; - } - uint32 localId = 3; - repeated uint32 dataList = 4; - bool isServerbuffModifier = 5; - repeated MassivePropSyncInfo massivePropList = 6; -} diff --git a/proto/AbilityScalarType.proto b/proto/AbilityScalarType.proto deleted file mode 100644 index 9f5ce167f..000000000 --- a/proto/AbilityScalarType.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum AbilityScalarType { - Unknow = 0; - Float = 1; - Int = 2; - Bool = 3; - Trigger = 4; - String = 5; - Uint = 6; -} diff --git a/proto/AbilityScalarValueEntry.proto b/proto/AbilityScalarValueEntry.proto deleted file mode 100644 index 7455d9901..000000000 --- a/proto/AbilityScalarValueEntry.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityScalarType.proto"; -import "AbilityString.proto"; - -message AbilityScalarValueEntry { - AbilityString key = 1; - AbilityScalarType valueType = 2; - oneof value { - float floatValue = 3; - string stringValue = 4; - int32 intValue = 5; - uint32 uintValue = 6; - } -} diff --git a/proto/AbilityString.proto b/proto/AbilityString.proto deleted file mode 100644 index 1e8254aa8..000000000 --- a/proto/AbilityString.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AbilityString { - oneof type { - string str = 1; - uint32 hash = 2; - } -} diff --git a/proto/AbilitySyncStateInfo.proto b/proto/AbilitySyncStateInfo.proto deleted file mode 100644 index ec103e22e..000000000 --- a/proto/AbilitySyncStateInfo.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityAppliedAbility.proto"; -import "AbilityAppliedModifier.proto"; -import "AbilityMixinRecoverInfo.proto"; -import "AbilityScalarValueEntry.proto"; - -message AbilitySyncStateInfo { - bool isInited = 1; - repeated AbilityScalarValueEntry dynamicValueMap = 2; - repeated AbilityAppliedAbility appliedAbilities = 3; - repeated AbilityAppliedModifier appliedModifiers = 4; - repeated AbilityMixinRecoverInfo mixinRecoverInfos = 5; -} diff --git a/proto/ActionReasonType.proto b/proto/ActionReasonType.proto deleted file mode 100644 index 29f2639e4..000000000 --- a/proto/ActionReasonType.proto +++ /dev/null @@ -1,179 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum ActionReasonType { - ActionReasonNone = 0; - ActionReasonQuestItem = 1; - ActionReasonQuestReward = 2; - ActionReasonTrifle = 3; - ActionReasonShop = 4; - ActionReasonPlayerUpgradeReward = 5; - ActionReasonAddAvatar = 6; - ActionReasonGadgetEnvAnimal = 7; - ActionReasonMonsterEnvAnimal = 8; - ActionReasonCompound = 9; - ActionReasonCook = 10; - ActionReasonGather = 11; - ActionReasonMailAttachment = 12; - ActionReasonCityLevelupReturn = 15; - ActionReasonCityLevelupReward = 17; - ActionReasonAreaExploreReward = 18; - ActionReasonUnlockPointReward = 19; - ActionReasonDungeonFirstPass = 20; - ActionReasonDungeonPass = 21; - ActionReasonChangeElemType = 23; - ActionReasonFetterOpen = 25; - ActionReasonDailyTaskScore = 26; - ActionReasonDailyTaskHost = 27; - ActionReasonRandTaskHost = 28; - ActionReasonExpedition = 29; - ActionReasonGacha = 30; - ActionReasonCombine = 31; - ActionReasonRandTaskGuest = 32; - ActionReasonDailyTaskGuest = 33; - ActionReasonForgeOutput = 34; - ActionReasonForgeReturn = 35; - ActionReasonInitAvatar = 36; - ActionReasonMonsterDie = 37; - ActionReasonGm = 38; - ActionReasonOpenChest = 39; - ActionReasonGadgetDie = 40; - ActionReasonMonsterChangeHp = 41; - ActionReasonSubfieldDrop = 42; - ActionReasonPushTipsReward = 43; - ActionReasonActivityMonsterDrop = 44; - ActionReasonActivityGather = 45; - ActionReasonActivitySubfieldDrop = 46; - ActionReasonTowerScheduleReward = 47; - ActionReasonTowerFloorStarReward = 48; - ActionReasonTowerFirstPassReward = 49; - ActionReasonTowerDailyReward = 50; - ActionReasonHitClientTrivialEntity = 51; - ActionReasonOpenWorldBossChest = 52; - ActionReasonMaterialDeleteReturn = 53; - ActionReasonSignInReward = 54; - ActionReasonOpenBlossomChest = 55; - ActionReasonRecharge = 56; - ActionReasonBonusActivityReward = 57; - ActionReasonTowerCommemorativeReward = 58; - ActionReasonTowerSkipFloorReward = 59; - ActionReasonRechargeBonus = 60; - ActionReasonRechargeCard = 61; - ActionReasonRechargeCardDaily = 62; - ActionReasonRechargeCardReplace = 63; - ActionReasonRechargeCardReplaceFree = 64; - ActionReasonRechargePlayReplace = 65; - ActionReasonMpPlayTakeReward = 66; - ActionReasonActivityWatcher = 67; - ActionReasonSalesmanDeliverItem = 68; - ActionReasonSalesmanReward = 69; - ActionReasonRebate = 70; - ActionReasonMcoinExchangeHcoin = 71; - ActionReasonDailyTaskExchangeLegendaryKey = 72; - ActionReasonUnlockPersonLine = 73; - ActionReasonFetterLevelReward = 74; - ActionReasonBuyResin = 75; - ActionReasonRechargePackage = 76; - ActionReasonDeliveryDailyReward = 77; - ActionReasonCityReputationLevel = 78; - ActionReasonCityReputationQuest = 79; - ActionReasonCityReputationRequest = 80; - ActionReasonCityReputationExplore = 81; - ActionReasonOffergingLevel = 82; - ActionReasonRoutineHost = 83; - ActionReasonRoutineGuest = 84; - ActionReasonTreasureMapSpotToken = 89; - ActionReasonTreasureMapBonusLevelReward = 90; - ActionReasonTreasureMapMpReward = 91; - ActionReasonConvert = 92; - ActionReasonOverflowTransform = 93; - ActionReasonActivityAvatarSelectionReward = 96; - ActionReasonActivityWatcherBatch = 97; - ActionReasonHitTreeDrop = 98; - ActionReasonGetHomeLevelupReward = 99; - ActionReasonHomeDefaultFurniture = 100; - ActionReasonActivityCond = 101; - ActionReasonBattlePassNotify = 102; - ActionReasonPlayerUseItem = 1001; - ActionReasonDropItem = 1002; - ActionReasonWeaponUpgrade = 1011; - ActionReasonWeaponPromote = 1012; - ActionReasonWeaponAwaken = 1013; - ActionReasonRelicUpgrade = 1014; - ActionReasonAbility = 1015; - ActionReasonDungeonStatueDrop = 1016; - ActionReasonOfflineMsg = 1017; - ActionReasonAvatarUpgrade = 1018; - ActionReasonAvatarPromote = 1019; - ActionReasonQuestAction = 1021; - ActionReasonCityLevelup = 1022; - ActionReasonUpgradeSkill = 1024; - ActionReasonUnlockTalent = 1025; - ActionReasonUpgradeProudSkill = 1026; - ActionReasonPlayerLevelLimitUp = 1027; - ActionReasonDungeonDaily = 1028; - ActionReasonItemGiving = 1030; - ActionReasonForgeCost = 1031; - ActionReasonInvestigationReward = 1032; - ActionReasonInvestigationTargetReward = 1033; - ActionReasonGadgetInteract = 1034; - ActionReasonSeaLampCiMaterial = 1036; - ActionReasonSeaLampContributionReward = 1037; - ActionReasonSeaLampPhaseReward = 1038; - ActionReasonSeaLampFlyLamp = 1039; - ActionReasonAutoRecover = 1040; - ActionReasonActivityExpireItem = 1041; - ActionReasonSubCoinNegative = 1042; - ActionReasonBargainDeduct = 1043; - ActionReasonBattlePassPaidReward = 1044; - ActionReasonBattlePassLevelReward = 1045; - ActionReasonTrialAvatarActivityFirstPassReward = 1046; - ActionReasonBuyBattlePassLevel = 1047; - ActionReasonGrantBirthdayBenefit = 1048; - ActionReasonAchievementReward = 1049; - ActionReasonAchievementGoalReward = 1050; - ActionReasonFirstShareToSocialNetwork = 1051; - ActionReasonDestroyMaterial = 1052; - ActionReasonCodexLevelupReward = 1053; - ActionReasonHuntingOfferReward = 1054; - ActionReasonUseWidgetAnchorPoint = 1055; - ActionReasonUseWidgetBonfire = 1056; - ActionReasonUngradeWeaponReturnMaterial = 1057; - ActionReasonUseWidgetOneoffGatherPointDetector = 1058; - ActionReasonUseWidgetClientCollector = 1059; - ActionReasonUseWidgetClientDetector = 1060; - ActionReasonTakeGeneralReward = 1061; - ActionReasonAsterTakeSpecialReward = 1062; - ActionReasonRemoveCodexBook = 1063; - ActionReasonOfferingItem = 1064; - ActionReasonUseWidgetGadgetBuilder = 1065; - ActionReasonEffigyFirstPassReward = 1066; - ActionReasonEffigyReward = 1067; - ActionReasonReunionFirstGiftReward = 1068; - ActionReasonReunionSignInReward = 1069; - ActionReasonReunionWatcherReward = 1070; - ActionReasonSalesmanMpReward = 1071; - ActionReasionAvatarPromoteReward = 1072; - ActionReasonBlessingRedeemReward = 1073; - ActionMiracleRingReward = 1074; - ActionReasonExpeditionReward = 1075; - ActionReasonTreasureMapRemoveDetector = 1076; - ActionReasonMechanicusDungeonTicket = 1077; - ActionReasonMechanicusLevelupGear = 1078; - ActionReasonMechanicusBattleSettle = 1079; - ActionReasonRegionSearchReward = 1080; - ActionReasonUnlockCoopChapter = 1081; - ActionReasonTakeCoopReward = 1082; - ActionReasonFleurFairDungeonReward = 1083; - ActionReasonActivityScore = 1084; - ActionReasonChannellerSlabOneoffDungeonReward = 1085; - ActionReasonFurnitureMakeStart = 1086; - ActionReasonFurnitureMakeTake = 1087; - ActionReasonFurnitureMakeCancel = 1088; - ActionReasonFurnitureMakeFastFinish = 1089; - ActionReasonChannellerSlabLoopDungeonFirstPassReward = 1090; - ActionReasonChannellerSlabLoopDungeonScoreReward = 1091; - ActionReasonHomeLimitedShopBuy = 1092; - ActionReasonHomeCoinCollect = 1093; -} diff --git a/proto/ActivityInfo.proto b/proto/ActivityInfo.proto deleted file mode 100644 index 836f7d126..000000000 --- a/proto/ActivityInfo.proto +++ /dev/null @@ -1,47 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ActivityNullDetailInfo.proto"; -import "ActivityWatcherInfo.proto"; - -message ActivityInfo { - uint32 activityId = 1; - uint32 scheduleId = 2; - uint32 beginTime = 3; - uint32 endTime = 4; - uint32 activityType = 5; - bool isPlayOpenAnim = 6; - bool isFinished = 7; - bool isStarting = 8; - repeated ActivityWatcherInfo watcherInfoList = 9; - repeated uint32 meetCondList = 10; - repeated uint32 expireCondList = 15; - uint32 selectedAvatarRewardId = 17; - map activityCoinMap = 18; - uint32 scoreLimit = 19; - uint32 curScore = 20; - repeated uint32 takenRewardList = 24; - oneof detail { - ActivityNullDetailInfo samLampInfo = 11; - ActivityNullDetailInfo crucibleInfo = 12; - ActivityNullDetailInfo salesmanInfo = 13; - ActivityNullDetailInfo trialAvatarInfo = 14; - ActivityNullDetailInfo deliveryInfo = 16; - ActivityNullDetailInfo asterInfo = 21; - ActivityNullDetailInfo flightInfo = 25; - ActivityNullDetailInfo dragonSpineInfo = 31; - ActivityNullDetailInfo effigyInfo = 32; - ActivityNullDetailInfo treasureMapInfo = 35; - ActivityNullDetailInfo blessingInfo = 41; - ActivityNullDetailInfo seaLampInfo = 42; - ActivityNullDetailInfo expeditionInfo = 43; - ActivityNullDetailInfo arenaChallengeInfo = 44; - ActivityNullDetailInfo fleurFairInfo = 51; - ActivityNullDetailInfo waterSpiritInfo = 52; - ActivityNullDetailInfo challnelerSlabInfo = 61; - ActivityNullDetailInfo mistTrialActivityInfo = 62; - ActivityNullDetailInfo hideAndSeekInfo = 63; - ActivityNullDetailInfo findHilichurlInfo = 64; - } -} diff --git a/proto/ActivityNullDetailInfo.proto b/proto/ActivityNullDetailInfo.proto deleted file mode 100644 index 90ee7844e..000000000 --- a/proto/ActivityNullDetailInfo.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ActivityNullDetailInfo { - -} diff --git a/proto/ActivityWatcherInfo.proto b/proto/ActivityWatcherInfo.proto deleted file mode 100644 index eb4e0058f..000000000 --- a/proto/ActivityWatcherInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ActivityWatcherInfo { - uint32 watcherId = 1; - uint32 curProgress = 2; - uint32 totalProgress = 3; - bool isTakenReward = 4; -} diff --git a/proto/AiSkillCdInfo.proto b/proto/AiSkillCdInfo.proto deleted file mode 100644 index ad5f072df..000000000 --- a/proto/AiSkillCdInfo.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AiSkillCdInfo { - map skillCdMap = 1; - map skillGroupCdMap = 2; -} diff --git a/proto/AiSyncInfo.proto b/proto/AiSyncInfo.proto deleted file mode 100644 index 1dc25b8fd..000000000 --- a/proto/AiSyncInfo.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AiSyncInfo { - uint32 entityId = 1; - bool hasPathToTarget = 2; -} diff --git a/proto/AiThreatInfo.proto b/proto/AiThreatInfo.proto deleted file mode 100644 index eb4ceeb46..000000000 --- a/proto/AiThreatInfo.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AiThreatInfo { - map aiThreatMap = 1; -} diff --git a/proto/AnimatorParameterValueInfo.proto b/proto/AnimatorParameterValueInfo.proto deleted file mode 100644 index 0735f5154..000000000 --- a/proto/AnimatorParameterValueInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AnimatorParameterValueInfo { - uint32 paraType = 1; - int32 intVal = 2; - float floatVal = 3; - bool boolVal = 4; -} diff --git a/proto/AnimatorParameterValueInfoPair.proto b/proto/AnimatorParameterValueInfoPair.proto deleted file mode 100644 index 1ead0b9a7..000000000 --- a/proto/AnimatorParameterValueInfoPair.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AnimatorParameterValueInfo.proto"; - -message AnimatorParameterValueInfoPair { - int32 name = 1; - AnimatorParameterValueInfo animatorPara = 2; -} diff --git a/proto/AskAddFriendNotify.proto b/proto/AskAddFriendNotify.proto deleted file mode 100644 index ab5f6ef26..000000000 --- a/proto/AskAddFriendNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "FriendBrief.proto"; - -message AskAddFriendNotify { - uint32 targetUid = 1; - FriendBrief targetFriendBrief = 2; -} diff --git a/proto/AskAddFriendReq.proto b/proto/AskAddFriendReq.proto deleted file mode 100644 index ac8a9083e..000000000 --- a/proto/AskAddFriendReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AskAddFriendReq { - uint32 targetUid = 1; -} diff --git a/proto/AskAddFriendRsp.proto b/proto/AskAddFriendRsp.proto deleted file mode 100644 index 4893ea28a..000000000 --- a/proto/AskAddFriendRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AskAddFriendRsp { - int32 retcode = 1; - uint32 targetUid = 2; - uint32 param = 3; -} diff --git a/proto/AttackHitEffectResult.proto b/proto/AttackHitEffectResult.proto deleted file mode 100644 index d997b7ab3..000000000 --- a/proto/AttackHitEffectResult.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AttackHitEffectResult { - uint32 hitEffLevel = 1; - float retreatStrength = 2; - float airStrength = 3; - float hitHaltTime = 4; - float hitHaltTimeScale = 5; - uint32 originalHitEffLevel = 6; -} diff --git a/proto/AttackResult.proto b/proto/AttackResult.proto deleted file mode 100644 index 9b1498718..000000000 --- a/proto/AttackResult.proto +++ /dev/null @@ -1,40 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityIdentifier.proto"; -import "AttackHitEffectResult.proto"; -import "HitCollision.proto"; -import "Vector.proto"; - -message AttackResult { - uint32 attackerId = 1; - uint32 defenseId = 2; - string animEventId = 3; - AbilityIdentifier abilityIdentifier = 4; - float damage = 6; - bool isCrit = 7; - HitCollision hitCollision = 8; - uint32 hitPosType = 9; - uint32 endureBreak = 10; - Vector resolvedDir = 11; - int32 hitRetreatAngleCompat = 12; - AttackHitEffectResult hitEffResult = 13; - uint32 elementType = 14; - bool useGadgetDamageAction = 19; - uint32 gadgetDamageActionIdx = 20; - bool isResistText = 22; - uint32 criticalRand = 23; - float elementAmplifyRate = 24; - float damageShield = 26; - bool muteElementHurt = 27; - uint32 amplifyReactionType = 30; - uint32 addhurtReactionType = 31; - uint32 bulletFlyTimeMs = 32; - uint32 attackCount = 33; - uint32 hashedAnimEventId = 34; - uint32 attackTimestampMs = 36; - float endureDelta = 37; - uint32 targetType = 38; - float elementDurabilityAttenuation = 39; -} diff --git a/proto/AvatarAddNotify.proto b/proto/AvatarAddNotify.proto deleted file mode 100644 index 1bbd17d19..000000000 --- a/proto/AvatarAddNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AvatarInfo.proto"; - -message AvatarAddNotify { - AvatarInfo avatar = 1; - bool isInTeam = 2; -} diff --git a/proto/AvatarChangeCostumeNotify.proto b/proto/AvatarChangeCostumeNotify.proto deleted file mode 100644 index 86a64ad1e..000000000 --- a/proto/AvatarChangeCostumeNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "SceneEntityInfo.proto"; - -message AvatarChangeCostumeNotify { - SceneEntityInfo entity = 1; -} diff --git a/proto/AvatarChangeCostumeReq.proto b/proto/AvatarChangeCostumeReq.proto deleted file mode 100644 index 6a83f9497..000000000 --- a/proto/AvatarChangeCostumeReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarChangeCostumeReq { - uint64 avatarGuid = 1; - uint32 costumeId = 2; -} diff --git a/proto/AvatarChangeCostumeRsp.proto b/proto/AvatarChangeCostumeRsp.proto deleted file mode 100644 index a5a3490c1..000000000 --- a/proto/AvatarChangeCostumeRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarChangeCostumeRsp { - uint32 retcode = 1; - uint64 avatarGuid = 2; - uint32 costumeId = 3; -} diff --git a/proto/AvatarDataNotify.proto b/proto/AvatarDataNotify.proto deleted file mode 100644 index 356d972bc..000000000 --- a/proto/AvatarDataNotify.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AvatarInfo.proto"; -import "AvatarTeam.proto"; - -message AvatarDataNotify { - repeated AvatarInfo avatarList = 1; - map avatarTeamMap = 2; - uint32 curAvatarTeamId = 3; - fixed64 chooseAvatarGuid = 4; - repeated uint64 tempAvatarGuidList = 5; - repeated uint32 ownedFlycloakList = 6; - repeated uint32 ownedCostumeList = 7; -} diff --git a/proto/AvatarDieAnimationEndReq.proto b/proto/AvatarDieAnimationEndReq.proto deleted file mode 100644 index 06bb7b3a8..000000000 --- a/proto/AvatarDieAnimationEndReq.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Vector.proto"; - -message AvatarDieAnimationEndReq { - uint64 dieGuid = 1; - uint32 skillId = 2; - Vector rebornPos = 3; -} diff --git a/proto/AvatarDieAnimationEndRsp.proto b/proto/AvatarDieAnimationEndRsp.proto deleted file mode 100644 index ac0f1eabb..000000000 --- a/proto/AvatarDieAnimationEndRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarDieAnimationEndRsp { - int32 retcode = 1; - uint64 dieGuid = 2; - uint32 skillId = 3; -} diff --git a/proto/AvatarEnterSceneInfo.proto b/proto/AvatarEnterSceneInfo.proto deleted file mode 100644 index c4f15d55b..000000000 --- a/proto/AvatarEnterSceneInfo.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilitySyncStateInfo.proto"; -import "ServerBuff.proto"; - -message AvatarEnterSceneInfo { - uint64 avatarGuid = 1; - uint32 avatarEntityId = 2; - AbilitySyncStateInfo avatarAbilityInfo = 3; - repeated uint32 buffIdList = 4; - uint64 weaponGuid = 5; - uint32 weaponEntityId = 6; - AbilitySyncStateInfo weaponAbilityInfo = 7; - repeated ServerBuff serverBuffList = 8; -} diff --git a/proto/AvatarEquipAffixInfo.proto b/proto/AvatarEquipAffixInfo.proto deleted file mode 100644 index 7e05f57b2..000000000 --- a/proto/AvatarEquipAffixInfo.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarEquipAffixInfo { - uint32 equipAffixId = 1; - uint32 leftCdTime = 2; -} diff --git a/proto/AvatarEquipChangeNotify.proto b/proto/AvatarEquipChangeNotify.proto deleted file mode 100644 index bc6532fdb..000000000 --- a/proto/AvatarEquipChangeNotify.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "SceneReliquaryInfo.proto"; -import "SceneWeaponInfo.proto"; - -message AvatarEquipChangeNotify { - uint64 avatarGuid = 1; - uint32 equipType = 2; - uint32 itemId = 3; - uint64 equipGuid = 4; - SceneWeaponInfo weapon = 5; - SceneReliquaryInfo reliquary = 6; -} diff --git a/proto/AvatarExpeditionState.proto b/proto/AvatarExpeditionState.proto deleted file mode 100644 index 0753dd618..000000000 --- a/proto/AvatarExpeditionState.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum AvatarExpeditionState { - AvatarExpeditionNone = 0; - AvatarExpeditionDoing = 1; - AvatarExpeditionFinishWaitReward = 2; - AvatarExpeditionCallbackWaitReward = 3; -} diff --git a/proto/AvatarFetterInfo.proto b/proto/AvatarFetterInfo.proto deleted file mode 100644 index 408e7acc4..000000000 --- a/proto/AvatarFetterInfo.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "FetterData.proto"; - -message AvatarFetterInfo { - uint32 expNumber = 1; - uint32 expLevel = 2; - repeated uint32 openIdList = 3; - repeated uint32 finishIdList = 4; - repeated uint32 rewardedFetterLevelList = 5; - repeated FetterData fetterList = 6; -} diff --git a/proto/AvatarFightPropNotify.proto b/proto/AvatarFightPropNotify.proto deleted file mode 100644 index 8d24011b8..000000000 --- a/proto/AvatarFightPropNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarFightPropNotify { - uint64 avatarGuid = 1; - map fightPropMap = 2; -} diff --git a/proto/AvatarFightPropUpdateNotify.proto b/proto/AvatarFightPropUpdateNotify.proto deleted file mode 100644 index 040c7d0c8..000000000 --- a/proto/AvatarFightPropUpdateNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarFightPropUpdateNotify { - uint64 avatarGuid = 1; - map fightPropMap = 2; -} diff --git a/proto/AvatarFlycloakChangeNotify.proto b/proto/AvatarFlycloakChangeNotify.proto deleted file mode 100644 index 4d7d35347..000000000 --- a/proto/AvatarFlycloakChangeNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarFlycloakChangeNotify { - uint64 avatarGuid = 1; - uint32 flycloakId = 2; -} diff --git a/proto/AvatarGainCostumeNotify.proto b/proto/AvatarGainCostumeNotify.proto deleted file mode 100644 index 54ef728ee..000000000 --- a/proto/AvatarGainCostumeNotify.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarGainCostumeNotify { - uint32 costumeId = 1; -} diff --git a/proto/AvatarGainFlycloakNotify.proto b/proto/AvatarGainFlycloakNotify.proto deleted file mode 100644 index d21a9cbe3..000000000 --- a/proto/AvatarGainFlycloakNotify.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarGainFlycloakNotify { - uint32 flycloakId = 1; -} diff --git a/proto/AvatarInfo.proto b/proto/AvatarInfo.proto deleted file mode 100644 index f3ab4ccc1..000000000 --- a/proto/AvatarInfo.proto +++ /dev/null @@ -1,37 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AvatarEquipAffixInfo.proto"; -import "AvatarExpeditionState.proto"; -import "AvatarFetterInfo.proto"; -import "AvatarSkillInfo.proto"; -import "PropValue.proto"; -import "TrialAvatarInfo.proto"; - -message AvatarInfo { - uint32 avatarId = 1; - uint64 guid = 2; - map propMap = 3; - uint32 lifeState = 4; - repeated uint64 equipGuidList = 5; - repeated uint32 talentIdList = 6; - map fightPropMap = 7; - TrialAvatarInfo trialAvatarInfoField = 9; - map skillMap = 10; - uint32 skillDepotId = 11; - AvatarFetterInfo fetterInfo = 12; - uint32 coreProudSkillLevel = 13; - repeated uint32 inherentProudSkillList = 14; - map skillLevelMap = 15; - AvatarExpeditionState expeditionState = 16; - map proudSkillExtraLevel = 17; - bool isFocusFieldNumber = 18; - uint32 avatarType = 19; - repeated uint32 teamResonanceList = 20; - uint32 wearingFlycloakId = 21; - repeated AvatarEquipAffixInfo equipAffixList = 22; - uint32 bornTime = 23; - repeated uint32 pendingPromoteRewardListFieldNumber = 24; - uint32 costumeId = 25; -} diff --git a/proto/AvatarLifeStateChangeNotify.proto b/proto/AvatarLifeStateChangeNotify.proto deleted file mode 100644 index 0bf816006..000000000 --- a/proto/AvatarLifeStateChangeNotify.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PlayerDieType.proto"; - -message AvatarLifeStateChangeNotify { - uint64 avatarGuid = 1; - uint32 lifeState = 2; - uint32 sourceEntityId = 3; - string attackTag = 4; - PlayerDieType dieType = 5; - uint32 moveReliableSeq = 6; -} diff --git a/proto/AvatarPromoteReq.proto b/proto/AvatarPromoteReq.proto deleted file mode 100644 index 863ab835c..000000000 --- a/proto/AvatarPromoteReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarPromoteReq { - uint64 guid = 1; -} diff --git a/proto/AvatarPromoteRsp.proto b/proto/AvatarPromoteRsp.proto deleted file mode 100644 index e64b9c9bc..000000000 --- a/proto/AvatarPromoteRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarPromoteRsp { - int32 retcode = 1; - uint64 guid = 2; -} diff --git a/proto/AvatarPropNotify.proto b/proto/AvatarPropNotify.proto deleted file mode 100644 index 231008dd6..000000000 --- a/proto/AvatarPropNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarPropNotify { - uint64 avatarGuid = 1; - map propMap = 2; -} diff --git a/proto/AvatarSkillChangeNotify.proto b/proto/AvatarSkillChangeNotify.proto deleted file mode 100644 index 066412687..000000000 --- a/proto/AvatarSkillChangeNotify.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarSkillChangeNotify { - uint64 avatarGuid = 1; - uint32 entityId = 2; - uint32 skillDepotId = 3; - uint32 avatarSkillId = 4; - uint32 oldLevel = 5; - uint32 curLevel = 6; -} diff --git a/proto/AvatarSkillInfo.proto b/proto/AvatarSkillInfo.proto deleted file mode 100644 index 27417caf4..000000000 --- a/proto/AvatarSkillInfo.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarSkillInfo { - uint32 passCdTime = 1; - repeated uint32 fullCdTimeList = 2; - uint32 maxChargeCount = 3; -} diff --git a/proto/AvatarSkillUpgradeReq.proto b/proto/AvatarSkillUpgradeReq.proto deleted file mode 100644 index 01e78e2b2..000000000 --- a/proto/AvatarSkillUpgradeReq.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarSkillUpgradeReq { - uint64 avatarGuid = 1; - uint32 avatarSkillId = 2; - uint32 oldLevel = 3; -} diff --git a/proto/AvatarSkillUpgradeRsp.proto b/proto/AvatarSkillUpgradeRsp.proto deleted file mode 100644 index a7942f5dd..000000000 --- a/proto/AvatarSkillUpgradeRsp.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarSkillUpgradeRsp { - int32 retcode = 1; - uint64 avatarGuid = 2; - uint32 avatarSkillId = 3; - uint32 oldLevel = 4; - uint32 curLevel = 5; -} diff --git a/proto/AvatarTeam.proto b/proto/AvatarTeam.proto deleted file mode 100644 index 0ca666f00..000000000 --- a/proto/AvatarTeam.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarTeam { - repeated uint64 avatarGuidList = 1; - string teamName = 2; -} diff --git a/proto/AvatarTeamResonanceInfo.proto b/proto/AvatarTeamResonanceInfo.proto deleted file mode 100644 index beae1d212..000000000 --- a/proto/AvatarTeamResonanceInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarTeamResonanceInfo { - uint32 entityId = 1; - uint64 avatarGuid = 2; - repeated uint32 addTeamResonanceIdList = 3; - repeated uint32 delTeamResonanceIdList = 4; -} diff --git a/proto/AvatarTeamUpdateNotify.proto b/proto/AvatarTeamUpdateNotify.proto deleted file mode 100644 index b68f7ce78..000000000 --- a/proto/AvatarTeamUpdateNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AvatarTeam.proto"; - -message AvatarTeamUpdateNotify { - map avatarTeamMap = 1; - repeated uint64 tempAvatarGuidList = 2; -} diff --git a/proto/AvatarUnlockTalentNotify.proto b/proto/AvatarUnlockTalentNotify.proto deleted file mode 100644 index 91500c3fe..000000000 --- a/proto/AvatarUnlockTalentNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarUnlockTalentNotify { - uint64 avatarGuid = 1; - uint32 entityId = 2; - uint32 talentId = 3; - uint32 skillDepotId = 4; -} diff --git a/proto/AvatarUpgradeReq.proto b/proto/AvatarUpgradeReq.proto deleted file mode 100644 index 7ad936c07..000000000 --- a/proto/AvatarUpgradeReq.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarUpgradeReq { - uint32 itemId = 1; - uint32 count = 2; - uint64 avatarGuid = 3; -} diff --git a/proto/AvatarUpgradeRsp.proto b/proto/AvatarUpgradeRsp.proto deleted file mode 100644 index 0d50cfab0..000000000 --- a/proto/AvatarUpgradeRsp.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarUpgradeRsp { - int32 retcode = 1; - uint64 avatarGuid = 2; - uint32 oldLevel = 3; - uint32 curLevel = 4; - map oldFightPropMap = 5; - map curFightPropMap = 6; -} diff --git a/proto/AvatarWearFlycloakReq.proto b/proto/AvatarWearFlycloakReq.proto deleted file mode 100644 index 92b067f98..000000000 --- a/proto/AvatarWearFlycloakReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarWearFlycloakReq { - uint64 avatarGuid = 1; - uint32 flycloakId = 2; -} diff --git a/proto/AvatarWearFlycloakRsp.proto b/proto/AvatarWearFlycloakRsp.proto deleted file mode 100644 index 78d179fa6..000000000 --- a/proto/AvatarWearFlycloakRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message AvatarWearFlycloakRsp { - int32 retcode = 1; - uint64 avatarGuid = 2; - uint32 flycloakId = 3; -} diff --git a/proto/Birthday.proto b/proto/Birthday.proto deleted file mode 100644 index b360bcfd2..000000000 --- a/proto/Birthday.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message Birthday { - uint32 month = 1; - uint32 day = 2; -} diff --git a/proto/BlockInfo.proto b/proto/BlockInfo.proto deleted file mode 100644 index 5905e3573..000000000 --- a/proto/BlockInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message BlockInfo { - uint32 blockId = 1; - uint32 dataVersion = 2; - bytes binData = 3; - bool isDirty = 4; -} diff --git a/proto/CalcWeaponUpgradeReturnItemsReq.proto b/proto/CalcWeaponUpgradeReturnItemsReq.proto deleted file mode 100644 index be6bcd98b..000000000 --- a/proto/CalcWeaponUpgradeReturnItemsReq.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ItemParam.proto"; - -message CalcWeaponUpgradeReturnItemsReq { - uint64 targetWeaponGuid = 1; - repeated uint64 foodWeaponGuidList = 2; - repeated ItemParam itemParamList = 3; -} diff --git a/proto/CalcWeaponUpgradeReturnItemsRsp.proto b/proto/CalcWeaponUpgradeReturnItemsRsp.proto deleted file mode 100644 index 5b0733d36..000000000 --- a/proto/CalcWeaponUpgradeReturnItemsRsp.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ItemParam.proto"; - -message CalcWeaponUpgradeReturnItemsRsp { - int32 retcode = 1; - uint64 targetWeaponGuid = 2; - repeated ItemParam itemParamList = 3; -} diff --git a/proto/ChangeAvatarReq.proto b/proto/ChangeAvatarReq.proto deleted file mode 100644 index 8ef593ea7..000000000 --- a/proto/ChangeAvatarReq.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Vector.proto"; - -message ChangeAvatarReq { - uint64 guid = 1; - uint32 skillId = 2; - bool isMove = 3; - Vector movePos = 4; -} diff --git a/proto/ChangeAvatarRsp.proto b/proto/ChangeAvatarRsp.proto deleted file mode 100644 index 08281c41a..000000000 --- a/proto/ChangeAvatarRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ChangeAvatarRsp { - uint32 retcode = 1; - uint64 currGuid = 2; - uint32 skillId = 3; -} diff --git a/proto/ChangeGameTimeReq.proto b/proto/ChangeGameTimeReq.proto deleted file mode 100644 index 474c964de..000000000 --- a/proto/ChangeGameTimeReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ChangeGameTimeReq { - uint32 gameTime = 1; - bool isForceSet = 2; -} diff --git a/proto/ChangeGameTimeRsp.proto b/proto/ChangeGameTimeRsp.proto deleted file mode 100644 index 75c94a366..000000000 --- a/proto/ChangeGameTimeRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ChangeGameTimeRsp { - int32 retcode = 1; - uint32 curGameTime = 2; -} diff --git a/proto/ChangeHpReason.proto b/proto/ChangeHpReason.proto deleted file mode 100644 index e56d9acc3..000000000 --- a/proto/ChangeHpReason.proto +++ /dev/null @@ -1,31 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum ChangeHpReason { - ChangeHpNone = 0; - ChangeHpSubAvatar = 1; - ChangeHpSubMonster = 2; - ChangeHpSubGear = 3; - ChangeHpSubEnvir = 4; - ChangeHpSubFall = 5; - ChangeHpSubDrawn = 6; - ChangeHpSubAbyss = 7; - ChangeHpSubAbility = 8; - ChangeHpSubSummon = 9; - ChangeHpSubScript = 10; - ChangeHpSubGm = 11; - ChangeHpSubKillSelf = 12; - ChangeHpSubClimateCold = 13; - ChangeHpSubStormLightning = 14; - ChangeHpSubKillServerGadget = 15; - ChangeHpByLua = 51; - ChangeHpAddAbility = 101; - ChangeHpAddItem = 102; - ChangeHpAddRevive = 103; - ChangeHpAddUpgrade = 104; - ChangeHpAddStatue = 105; - ChangeHpAddBackground = 106; - ChangeHpAddGm = 107; - ChangeHpAddTrialAvatarActivity = 108; -} diff --git a/proto/ChangeMpTeamAvatarReq.proto b/proto/ChangeMpTeamAvatarReq.proto deleted file mode 100644 index 8a90c871a..000000000 --- a/proto/ChangeMpTeamAvatarReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ChangeMpTeamAvatarReq { - repeated uint64 avatarGuidList = 1; - uint64 curAvatarGuid = 2; -} diff --git a/proto/ChangeMpTeamAvatarRsp.proto b/proto/ChangeMpTeamAvatarRsp.proto deleted file mode 100644 index ae0b49952..000000000 --- a/proto/ChangeMpTeamAvatarRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ChangeMpTeamAvatarRsp { - int32 retcode = 1; - repeated uint64 avatarGuidList = 2; - uint64 curAvatarGuid = 3; -} diff --git a/proto/ChangeTeamNameReq.proto b/proto/ChangeTeamNameReq.proto deleted file mode 100644 index 87423b3dc..000000000 --- a/proto/ChangeTeamNameReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ChangeTeamNameReq { - int32 teamId = 1; - string teamName = 2; -} diff --git a/proto/ChangeTeamNameRsp.proto b/proto/ChangeTeamNameRsp.proto deleted file mode 100644 index 51607c66a..000000000 --- a/proto/ChangeTeamNameRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ChangeTeamNameRsp { - int32 teamId = 1; - string teamName = 2; - int32 retcode = 3; -} diff --git a/proto/ChatInfo.proto b/proto/ChatInfo.proto deleted file mode 100644 index 7b47d7f28..000000000 --- a/proto/ChatInfo.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "SystemHint.proto"; - -message ChatInfo { - uint32 time = 1; - uint32 uid = 2; - uint32 sequence = 3; - uint32 toUid = 4; - bool isRead = 5; - oneof content { - string text = 100; - uint32 icon = 101; - SystemHint systemHint = 102; - } -} diff --git a/proto/ChooseCurAvatarTeamReq.proto b/proto/ChooseCurAvatarTeamReq.proto deleted file mode 100644 index bc9bd84c8..000000000 --- a/proto/ChooseCurAvatarTeamReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ChooseCurAvatarTeamReq { - uint32 teamId = 1; -} diff --git a/proto/ChooseCurAvatarTeamRsp.proto b/proto/ChooseCurAvatarTeamRsp.proto deleted file mode 100644 index 2a168a763..000000000 --- a/proto/ChooseCurAvatarTeamRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ChooseCurAvatarTeamRsp { - int32 retcode = 1; - uint32 curTeamId = 2; -} diff --git a/proto/CityInfo.proto b/proto/CityInfo.proto deleted file mode 100644 index 8d6f31bf0..000000000 --- a/proto/CityInfo.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message CityInfo { - uint32 cityId = 1; - uint32 level = 2; - uint32 crystalNum = 3; -} diff --git a/proto/ClientAbilityChangeNotify.proto b/proto/ClientAbilityChangeNotify.proto deleted file mode 100644 index 19f1fd57b..000000000 --- a/proto/ClientAbilityChangeNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityInvokeEntry.proto"; - -message ClientAbilityChangeNotify { - uint32 entityId = 1; - repeated AbilityInvokeEntry invokes = 2; -} diff --git a/proto/ClientAbilityInitBeginNotify.proto b/proto/ClientAbilityInitBeginNotify.proto deleted file mode 100644 index 03bc7a630..000000000 --- a/proto/ClientAbilityInitBeginNotify.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ClientAbilityInitBeginNotify { - uint32 entityId = 1; -} diff --git a/proto/ClientAbilityInitFinishNotify.proto b/proto/ClientAbilityInitFinishNotify.proto deleted file mode 100644 index 1078434be..000000000 --- a/proto/ClientAbilityInitFinishNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityInvokeEntry.proto"; - -message ClientAbilityInitFinishNotify { - uint32 entityId = 1; - repeated AbilityInvokeEntry invokes = 2; -} diff --git a/proto/CombatInvocationsNotify.proto b/proto/CombatInvocationsNotify.proto deleted file mode 100644 index 8669d1a9a..000000000 --- a/proto/CombatInvocationsNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "CombatInvokeEntry.proto"; - -message CombatInvocationsNotify { - repeated CombatInvokeEntry invokeList = 1; -} diff --git a/proto/CombatInvokeEntry.proto b/proto/CombatInvokeEntry.proto deleted file mode 100644 index 43e2eedaa..000000000 --- a/proto/CombatInvokeEntry.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "CombatTypeArgument.proto"; -import "ForwardType.proto"; - -message CombatInvokeEntry { - CombatTypeArgument argumentType = 1; - ForwardType forwardType = 2; - bytes combatData = 3; -} diff --git a/proto/CombatTypeArgument.proto b/proto/CombatTypeArgument.proto deleted file mode 100644 index ab5eef088..000000000 --- a/proto/CombatTypeArgument.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum CombatTypeArgument { - CombatNone = 0; - CombatEvtBeingHit = 1; - CombatAnimatorStateChanged = 2; - CombatFaceToDir = 3; - CombatSetAttackTarget = 4; - CombatRushMove = 5; - CombatAnimatorParameterChanged = 6; - EntityMove = 7; - SyncEntityPosition = 8; - CombatSteerMotionInfo = 9; - CombatForceSetPosInfo = 10; - CombatCompensatePosDiff = 11; - CombatMonsterDoBlink = 12; - CombatFixedRushMove = 13; - CombatSyncTransform = 14; -} diff --git a/proto/CoopCg.proto b/proto/CoopCg.proto deleted file mode 100644 index 5702ac651..000000000 --- a/proto/CoopCg.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message CoopCg { - uint32 id = 1; - bool isUnlock = 2; -} diff --git a/proto/CoopChapter.proto b/proto/CoopChapter.proto deleted file mode 100644 index 817f23533..000000000 --- a/proto/CoopChapter.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "CoopCg.proto"; -import "CoopChapterState.proto"; -import "CoopPoint.proto"; -import "CoopReward.proto"; - -message CoopChapter { - uint32 id = 1; - CoopChapterState state = 2; - repeated uint32 lockReasonList = 3; - repeated CoopPoint coopPointList = 4; - repeated CoopReward coopRewardList = 5; - repeated CoopCg coopCgList = 6; - uint32 totalEndCount = 7; - uint32 finishedEndCount = 8; - map seenEndingMap = 9; - repeated uint32 finishDialogList = 10; -} diff --git a/proto/CoopChapterState.proto b/proto/CoopChapterState.proto deleted file mode 100644 index 40ae5f2bd..000000000 --- a/proto/CoopChapterState.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum CoopChapterState { - Close = 0; - CondNotMeet = 1; - CondMeet = 2; - Accept = 3; -} diff --git a/proto/CoopDataNotify.proto b/proto/CoopDataNotify.proto deleted file mode 100644 index ea1ee81e7..000000000 --- a/proto/CoopDataNotify.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "CoopChapter.proto"; - -message CoopDataNotify { - repeated CoopChapter chapterList = 1; - bool isHaveProgress = 2; - uint32 curCoopPoint = 3; - repeated uint32 viewedChapterList = 4; -} diff --git a/proto/CoopPoint.proto b/proto/CoopPoint.proto deleted file mode 100644 index f5391440d..000000000 --- a/proto/CoopPoint.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "CoopPointState.proto"; - -message CoopPoint { - uint32 id = 1; - CoopPointState state = 2; - uint32 selfConfidence = 3; -} diff --git a/proto/CoopPointState.proto b/proto/CoopPointState.proto deleted file mode 100644 index 34288e2b5..000000000 --- a/proto/CoopPointState.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum CoopPointState { - Unstarted = 0; - Started = 1; - Finished = 2; -} diff --git a/proto/CoopReward.proto b/proto/CoopReward.proto deleted file mode 100644 index 47086cc76..000000000 --- a/proto/CoopReward.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "CoopRewardState.proto"; - -message CoopReward { - uint32 id = 1; - CoopRewardState state = 2; -} diff --git a/proto/CoopRewardState.proto b/proto/CoopRewardState.proto deleted file mode 100644 index 60b60d7a7..000000000 --- a/proto/CoopRewardState.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum CoopRewardState { - Unlock = 0; - Lock = 1; - Taken = 2; -} diff --git a/proto/CountDownDelete.proto b/proto/CountDownDelete.proto deleted file mode 100644 index fd394c44d..000000000 --- a/proto/CountDownDelete.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message CountDownDelete { - -} diff --git a/proto/DateTimeDelete.proto b/proto/DateTimeDelete.proto deleted file mode 100644 index 9af357326..000000000 --- a/proto/DateTimeDelete.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message DateTimeDelete { - -} diff --git a/proto/DealAddFriendReq.proto b/proto/DealAddFriendReq.proto deleted file mode 100644 index 5a0fa0878..000000000 --- a/proto/DealAddFriendReq.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "DealAddFriendResultType.proto"; - -message DealAddFriendReq { - uint32 targetUid = 1; - DealAddFriendResultType dealAddFriendResult = 2; -} diff --git a/proto/DealAddFriendResultType.proto b/proto/DealAddFriendResultType.proto deleted file mode 100644 index d9516f5cc..000000000 --- a/proto/DealAddFriendResultType.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum DealAddFriendResultType { - DealAddFriendReject = 0; - DealAddFriendAccept = 1; -} diff --git a/proto/DealAddFriendRsp.proto b/proto/DealAddFriendRsp.proto deleted file mode 100644 index 330c3b3ed..000000000 --- a/proto/DealAddFriendRsp.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "DealAddFriendResultType.proto"; - -message DealAddFriendRsp { - int32 retcode = 1; - uint32 targetUid = 2; - DealAddFriendResultType dealAddFriendResult = 3; -} diff --git a/proto/DelTeamEntityNotify.proto b/proto/DelTeamEntityNotify.proto deleted file mode 100644 index a5fbda5c1..000000000 --- a/proto/DelTeamEntityNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message DelTeamEntityNotify { - uint32 sceneId = 1; - repeated uint32 delEntityIdList = 2; -} diff --git a/proto/DelayWeekCountDownDelete.proto b/proto/DelayWeekCountDownDelete.proto deleted file mode 100644 index 52c2c007e..000000000 --- a/proto/DelayWeekCountDownDelete.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message DelayWeekCountDownDelete { - -} diff --git a/proto/DeleteFriendNotify.proto b/proto/DeleteFriendNotify.proto deleted file mode 100644 index 224e411f4..000000000 --- a/proto/DeleteFriendNotify.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message DeleteFriendNotify { - uint32 targetUid = 1; -} diff --git a/proto/DeleteFriendReq.proto b/proto/DeleteFriendReq.proto deleted file mode 100644 index fa4b371a1..000000000 --- a/proto/DeleteFriendReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message DeleteFriendReq { - uint32 targetUid = 1; -} diff --git a/proto/DeleteFriendRsp.proto b/proto/DeleteFriendRsp.proto deleted file mode 100644 index 666e670d1..000000000 --- a/proto/DeleteFriendRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message DeleteFriendRsp { - int32 retcode = 1; - uint32 targetUid = 2; -} diff --git a/proto/DestroyMaterialReq.proto b/proto/DestroyMaterialReq.proto deleted file mode 100644 index 6dad136b3..000000000 --- a/proto/DestroyMaterialReq.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MaterialInfo.proto"; - -message DestroyMaterialReq { - repeated MaterialInfo materialList = 1; -} diff --git a/proto/DestroyMaterialRsp.proto b/proto/DestroyMaterialRsp.proto deleted file mode 100644 index edbad052f..000000000 --- a/proto/DestroyMaterialRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message DestroyMaterialRsp { - int32 retcode = 1; - repeated uint32 itemIdList = 2; - repeated uint32 itemCountList = 3; -} diff --git a/proto/DoGachaReq.proto b/proto/DoGachaReq.proto deleted file mode 100644 index b841b5358..000000000 --- a/proto/DoGachaReq.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message DoGachaReq { - uint32 gachaType = 1; - uint32 gachaTimes = 2; - uint32 gachaRandom = 3; - uint32 gachaScheduleId = 4; - string gachaTag = 5; -} diff --git a/proto/DoGachaRsp.proto b/proto/DoGachaRsp.proto deleted file mode 100644 index 3aebde56c..000000000 --- a/proto/DoGachaRsp.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "GachaItem.proto"; - -message DoGachaRsp { - int32 retcode = 1; - uint32 gachaType = 2; - uint32 gachaTimes = 3; - uint32 gachaScheduleId = 4; - repeated GachaItem gachaItemList = 5; - uint32 newGachaRandom = 6; - uint32 costItemId = 7; - uint32 costItemNum = 8; - uint32 tenCostItemId = 9; - uint32 tenCostItemNum = 10; - uint32 leftGachaTimes = 11; - uint32 gachaTimesLimit = 12; -} diff --git a/proto/DropHintNotify.proto b/proto/DropHintNotify.proto deleted file mode 100644 index e0d7cf515..000000000 --- a/proto/DropHintNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Vector.proto"; - -message DropHintNotify { - repeated uint32 itemIdList = 1; - Vector position = 2; -} diff --git a/proto/DungeonEntryInfo.proto b/proto/DungeonEntryInfo.proto deleted file mode 100644 index 0af679a1e..000000000 --- a/proto/DungeonEntryInfo.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "WeeklyBossResinDiscountInfo.proto"; - -message DungeonEntryInfo { - uint32 dungeonId = 1; - bool isPassed = 2; - uint32 leftTimes = 3; - uint32 startTime = 4; - uint32 endTime = 5; - uint32 maxBossChestNum = 6; - uint32 bossChestNum = 7; - uint32 nextRefreshTime = 8; - WeeklyBossResinDiscountInfo weeklyBossResinDiscountInfo = 9; -} diff --git a/proto/DungeonEntryInfoReq.proto b/proto/DungeonEntryInfoReq.proto deleted file mode 100644 index 12557f4de..000000000 --- a/proto/DungeonEntryInfoReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message DungeonEntryInfoReq { - uint32 pointId = 1; -} diff --git a/proto/DungeonEntryInfoRsp.proto b/proto/DungeonEntryInfoRsp.proto deleted file mode 100644 index d83bcefe3..000000000 --- a/proto/DungeonEntryInfoRsp.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "DungeonEntryInfo.proto"; - -message DungeonEntryInfoRsp { - int32 retcode = 1; - uint32 pointId = 2; - repeated DungeonEntryInfo dungeonEntryList = 3; - uint32 recommendDungeonId = 4; -} diff --git a/proto/EnterSceneDoneRsp.proto b/proto/EnterSceneDoneRsp.proto deleted file mode 100644 index df1556787..000000000 --- a/proto/EnterSceneDoneRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message EnterSceneDoneRsp { - int32 retcode = 1; - uint32 enterSceneToken = 2; -} diff --git a/proto/EnterScenePeerNotify.proto b/proto/EnterScenePeerNotify.proto deleted file mode 100644 index 17d5302e4..000000000 --- a/proto/EnterScenePeerNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message EnterScenePeerNotify { - uint32 destSceneId = 1; - uint32 peerId = 2; - uint32 hostPeerId = 3; - uint32 EnterSceneToken = 4; -} diff --git a/proto/EnterSceneReadyRsp.proto b/proto/EnterSceneReadyRsp.proto deleted file mode 100644 index 6cde8d190..000000000 --- a/proto/EnterSceneReadyRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message EnterSceneReadyRsp { - int32 retcode = 1; - uint32 enterSceneToken = 2; -} diff --git a/proto/EnterType.proto b/proto/EnterType.proto deleted file mode 100644 index 6794046b2..000000000 --- a/proto/EnterType.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum EnterType { - EnterNone = 0; - EnterSelf = 1; - EnterGoto = 2; - EnterJump = 3; - EnterOther = 4; - EnterBack = 5; - EnterDungeon = 6; - EnterDungeonReplay = 7; - EnterGotoByPortal = 8; - EnterSelfHome = 9; - EnterOtherHome = 10; -} diff --git a/proto/EnterWorldAreaReq.proto b/proto/EnterWorldAreaReq.proto deleted file mode 100644 index d367117a2..000000000 --- a/proto/EnterWorldAreaReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message EnterWorldAreaReq { - uint32 areaType = 1; - uint32 areaId = 2; -} diff --git a/proto/EnterWorldAreaRsp.proto b/proto/EnterWorldAreaRsp.proto deleted file mode 100644 index e2cf96709..000000000 --- a/proto/EnterWorldAreaRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message EnterWorldAreaRsp { - uint32 areaType = 2; - uint32 areaId = 3; -} diff --git a/proto/EntityAiSyncNotify.proto b/proto/EntityAiSyncNotify.proto deleted file mode 100644 index 3e2040d8a..000000000 --- a/proto/EntityAiSyncNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AiSyncInfo.proto"; - -message EntityAiSyncNotify { - repeated AiSyncInfo infoList = 1; - repeated uint32 localAvatarAlertedMonsterList = 2; -} diff --git a/proto/EntityAuthorityInfo.proto b/proto/EntityAuthorityInfo.proto deleted file mode 100644 index aba660f04..000000000 --- a/proto/EntityAuthorityInfo.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilitySyncStateInfo.proto"; -import "AnimatorParameterValueInfoPair.proto"; -import "EntityRendererChangedInfo.proto"; -import "SceneEntityAiInfo.proto"; -import "Vector.proto"; - -message EntityAuthorityInfo { - AbilitySyncStateInfo abilityInfo = 1; - EntityRendererChangedInfo rendererChangedInfo = 2; - SceneEntityAiInfo aiInfo = 3; - Vector bornPos = 4; - repeated AnimatorParameterValueInfoPair poseParaList = 5; -} diff --git a/proto/EntityClientData.proto b/proto/EntityClientData.proto deleted file mode 100644 index df639c9d9..000000000 --- a/proto/EntityClientData.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message EntityClientData { - uint32 windChangeSceneTime = 1; - float windmillSyncAngle = 2; - int32 windChangeTargetLevel = 3; -} diff --git a/proto/EntityEnvironmentInfo.proto b/proto/EntityEnvironmentInfo.proto deleted file mode 100644 index 37ba46781..000000000 --- a/proto/EntityEnvironmentInfo.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message EntityEnvironmentInfo { - uint32 jsonClimateType = 1; - uint32 climateAreaId = 2; -} diff --git a/proto/EntityFightPropChangeReasonNotify.proto b/proto/EntityFightPropChangeReasonNotify.proto deleted file mode 100644 index 2bbda0603..000000000 --- a/proto/EntityFightPropChangeReasonNotify.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ChangeHpReason.proto"; -import "PropChangeReason.proto"; - -message EntityFightPropChangeReasonNotify { - uint32 entityId = 1; - uint32 propType = 2; - float propDelta = 3; - PropChangeReason reason = 4; - repeated uint32 paramList = 5; - ChangeHpReason changeHpReason = 6; -} diff --git a/proto/EntityFightPropUpdateNotify.proto b/proto/EntityFightPropUpdateNotify.proto deleted file mode 100644 index d438a269a..000000000 --- a/proto/EntityFightPropUpdateNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message EntityFightPropUpdateNotify { - uint32 entityId = 1; - map fightPropMap = 2; -} diff --git a/proto/EntityMoveInfo.proto b/proto/EntityMoveInfo.proto deleted file mode 100644 index 008533456..000000000 --- a/proto/EntityMoveInfo.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MotionInfo.proto"; - -message EntityMoveInfo { - uint32 entityId = 1; - MotionInfo motionInfo = 2; - uint32 sceneTime = 3; - uint32 reliableSeq = 4; - bool isReliable = 5; -} diff --git a/proto/EntityPropNotify.proto b/proto/EntityPropNotify.proto deleted file mode 100644 index b2175f3b4..000000000 --- a/proto/EntityPropNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PropValue.proto"; - -message EntityPropNotify { - uint32 entityId = 1; - map propMap = 2; -} diff --git a/proto/EntityRendererChangedInfo.proto b/proto/EntityRendererChangedInfo.proto deleted file mode 100644 index 97141d9c2..000000000 --- a/proto/EntityRendererChangedInfo.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message EntityRendererChangedInfo { - map changedRenderers = 1; - uint32 visibilityCount = 2; - bool isCached = 3; -} diff --git a/proto/Equip.proto b/proto/Equip.proto deleted file mode 100644 index 2c57f6d2c..000000000 --- a/proto/Equip.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Reliquary.proto"; -import "Weapon.proto"; - -message Equip { - oneof detail { - Reliquary reliquary = 1; - Weapon weapon = 2; - } - bool isLocked = 3; -} diff --git a/proto/EvtAiSyncCombatThreatInfoNotify.proto b/proto/EvtAiSyncCombatThreatInfoNotify.proto deleted file mode 100644 index 1ae707900..000000000 --- a/proto/EvtAiSyncCombatThreatInfoNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AiThreatInfo.proto"; - -message EvtAiSyncCombatThreatInfoNotify { - map combatThreatInfoMap = 1; -} diff --git a/proto/EvtAiSyncSkillCdNotify.proto b/proto/EvtAiSyncSkillCdNotify.proto deleted file mode 100644 index 2e33a7c1e..000000000 --- a/proto/EvtAiSyncSkillCdNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AiSkillCdInfo.proto"; - -message EvtAiSyncSkillCdNotify { - map aiCdMap = 1; -} diff --git a/proto/EvtBeingHitInfo.proto b/proto/EvtBeingHitInfo.proto deleted file mode 100644 index cbfbf78f1..000000000 --- a/proto/EvtBeingHitInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AttackResult.proto"; - -message EvtBeingHitInfo { - uint32 peerId = 1; - AttackResult attackResult = 2; -} diff --git a/proto/EvtBeingHitNotify.proto b/proto/EvtBeingHitNotify.proto deleted file mode 100644 index 5e27f02be..000000000 --- a/proto/EvtBeingHitNotify.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "EvtBeingHitInfo.proto"; -import "ForwardType.proto"; - -message EvtBeingHitNotify { - ForwardType forwardType = 1; - EvtBeingHitInfo beingHitInfo = 2; -} diff --git a/proto/EvtBeingHitsCombineNotify.proto b/proto/EvtBeingHitsCombineNotify.proto deleted file mode 100644 index 40ee6738a..000000000 --- a/proto/EvtBeingHitsCombineNotify.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "EvtBeingHitInfo.proto"; -import "ForwardType.proto"; - -message EvtBeingHitsCombineNotify { - ForwardType forwardType = 1; - repeated EvtBeingHitInfo evtBeingHitInfoList = 2; -} diff --git a/proto/EvtCreateGadgetNotify.proto b/proto/EvtCreateGadgetNotify.proto deleted file mode 100644 index ab6eeea0f..000000000 --- a/proto/EvtCreateGadgetNotify.proto +++ /dev/null @@ -1,24 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ForwardType.proto"; -import "Vector.proto"; - -message EvtCreateGadgetNotify { - ForwardType forwardType = 1; - uint32 entityId = 2; - uint32 configId = 3; - uint32 campId = 4; - uint32 campType = 5; - Vector initPos = 6; - Vector initEulerAngles = 7; - uint64 guid = 8; - uint32 ownerEntityId = 9; - uint32 targetEntityId = 10; - bool isAsyncLoad = 11; - uint32 targetLockPointIndex = 12; - uint32 roomId = 13; - uint32 propOwnerEntityId = 14; - bool sightGroupWithOwner = 15; -} diff --git a/proto/EvtDestroyGadgetNotify.proto b/proto/EvtDestroyGadgetNotify.proto deleted file mode 100644 index c1708617d..000000000 --- a/proto/EvtDestroyGadgetNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ForwardType.proto"; - -message EvtDestroyGadgetNotify { - ForwardType forwardType = 1; - uint32 entityId = 2; -} diff --git a/proto/EvtHittingOtherInfo.proto b/proto/EvtHittingOtherInfo.proto deleted file mode 100644 index f2dce261e..000000000 --- a/proto/EvtHittingOtherInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AttackResult.proto"; - -message EvtHittingOtherInfo { - uint32 peerId = 1; - AttackResult attackResult = 2; -} diff --git a/proto/FeatureBlockInfo.proto b/proto/FeatureBlockInfo.proto deleted file mode 100644 index 8feafc83d..000000000 --- a/proto/FeatureBlockInfo.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message FeatureBlockInfo { - uint32 featureType = 1; - uint32 endTime = 2; -} diff --git a/proto/FetterData.proto b/proto/FetterData.proto deleted file mode 100644 index 92ea23266..000000000 --- a/proto/FetterData.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message FetterData { - uint32 fetterId = 1; - uint32 fetterState = 2; - repeated uint32 condIndexList = 3; -} diff --git a/proto/FightPropPair.proto b/proto/FightPropPair.proto deleted file mode 100644 index fb6f0e3eb..000000000 --- a/proto/FightPropPair.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message FightPropPair { - uint32 type = 1; - float propValue = 2; -} diff --git a/proto/ForwardType.proto b/proto/ForwardType.proto deleted file mode 100644 index 329e2ef6f..000000000 --- a/proto/ForwardType.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum ForwardType { - ForwardLocal = 0; - ForwardToAll = 1; - ForwardToAllExceptCur = 2; - ForwardToHost = 3; - ForwardToAllGuest = 4; - ForwardToPeer = 5; - ForwardToPeers = 6; - ForwardOnlyServer = 7; - ForwardToAllExistExceptCur = 8; -} diff --git a/proto/FriendBrief.proto b/proto/FriendBrief.proto deleted file mode 100644 index 9b1819222..000000000 --- a/proto/FriendBrief.proto +++ /dev/null @@ -1,31 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "FriendEnterHomeOption.proto"; -import "FriendOnlineState.proto"; -import "HeadImage.proto"; -import "SocialShowAvatarInfo.proto"; - -message FriendBrief { - uint32 uid = 1; - string nickname = 2; - uint32 level = 3; - uint32 worldLevel = 5; - string signature = 6; - FriendOnlineState onlineState = 7; - uint32 param = 8; - bool isMpModeAvailable = 10; - string onlineId = 11; - uint32 lastActiveTime = 12; - uint32 nameCardId = 13; - uint32 mpPlayerNum = 14; - bool isChatNoDisturb = 15; - uint32 chatSequence = 16; - string remarkName = 17; - repeated SocialShowAvatarInfo showAvatarInfoList = 22; - FriendEnterHomeOption friendEnterHomeOption = 23; - HeadImage avatar = 24; - uint32 unk1 = 25; - uint32 unk2 = 27; -} diff --git a/proto/FriendEnterHomeOption.proto b/proto/FriendEnterHomeOption.proto deleted file mode 100644 index 2e3e6af25..000000000 --- a/proto/FriendEnterHomeOption.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum FriendEnterHomeOption { - NeedConfirm = 0; - Refuse = 1; - Direct = 2; -} diff --git a/proto/FriendOnlineState.proto b/proto/FriendOnlineState.proto deleted file mode 100644 index ea1f2ba86..000000000 --- a/proto/FriendOnlineState.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum FriendOnlineState { - FRIEND_DISCONNECT = 0; - FRIEND_ONLINE = 1; -} diff --git a/proto/Furniture.proto b/proto/Furniture.proto deleted file mode 100644 index dc4a2a383..000000000 --- a/proto/Furniture.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message Furniture { - uint32 count = 1; -} diff --git a/proto/GachaInfo.proto b/proto/GachaInfo.proto deleted file mode 100644 index 5399ab709..000000000 --- a/proto/GachaInfo.proto +++ /dev/null @@ -1,29 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "GachaUpInfo.proto"; - -message GachaInfo { - uint32 gachaType = 1; - uint32 scheduleId = 2; - uint32 beginTime = 3; - uint32 endTime = 4; - uint32 costItemId = 5; - uint32 costItemNum = 6; - string gachaPrefabPath = 7; - string gachaProbUrl = 8; - string gachaRecordUrl = 9; - string gachaPreviewPrefabPath = 10; - uint32 tenCostItemId = 11; - uint32 tenCostItemNum = 12; - uint32 leftGachaTimes = 13; - uint32 gachaTimesLimit = 14; - uint32 gachaSortId = 15; - string gachaProbUrlOversea = 16; - string gachaRecordUrlOversea = 17; - repeated GachaUpInfo gachaUpInfoList = 18; - string gachaTitlePath = 19; - repeated uint32 mainNameId = 20; - repeated uint32 subNameId = 21; -} diff --git a/proto/GachaItem.proto b/proto/GachaItem.proto deleted file mode 100644 index 7b39a9905..000000000 --- a/proto/GachaItem.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "GachaTransferItem.proto"; -import "ItemParam.proto"; - -message GachaItem { - ItemParam gachaItem = 1; - repeated GachaTransferItem transferItems = 2; - bool isFlashCard = 3; - bool isGachaItemNew = 4; - repeated ItemParam tokenItemList = 5; -} diff --git a/proto/GachaTransferItem.proto b/proto/GachaTransferItem.proto deleted file mode 100644 index 715339da6..000000000 --- a/proto/GachaTransferItem.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ItemParam.proto"; - -message GachaTransferItem { - ItemParam item = 1; - bool isTransferItemNew = 2; -} diff --git a/proto/GachaUpInfo.proto b/proto/GachaUpInfo.proto deleted file mode 100644 index df195cf56..000000000 --- a/proto/GachaUpInfo.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GachaUpInfo { - uint32 itemParentType = 1; - repeated uint32 itemIdList = 2; -} diff --git a/proto/GadgetBornType.proto b/proto/GadgetBornType.proto deleted file mode 100644 index beddb854a..000000000 --- a/proto/GadgetBornType.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum GadgetBornType { - GadgetBornNone = 0; - GadgetBornInAir = 1; - GadgetBornPlayer = 2; - GadgetBornMonsterHit = 3; - GadgetBornMonsterDie = 4; - GadgetBornGadget = 5; - GadgetBornGround = 6; -} diff --git a/proto/GadgetClientParam.proto b/proto/GadgetClientParam.proto deleted file mode 100644 index 546ef56c6..000000000 --- a/proto/GadgetClientParam.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GadgetClientParam { - uint32 campId = 1; - uint32 campType = 2; - uint64 guid = 3; - uint32 ownerEntityId = 4; - uint32 targetEntityId = 5; - bool asyncLoad = 6; -} diff --git a/proto/GadgetCrucibleInfo.proto b/proto/GadgetCrucibleInfo.proto deleted file mode 100644 index 766e4556e..000000000 --- a/proto/GadgetCrucibleInfo.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GadgetCrucibleInfo { - -} diff --git a/proto/GadgetInteractReq.proto b/proto/GadgetInteractReq.proto deleted file mode 100644 index fb3df4283..000000000 --- a/proto/GadgetInteractReq.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "InterOpType.proto"; -import "ResinCostType.proto"; - -message GadgetInteractReq { - uint32 gadgetEntityId = 1; - InterOpType opType = 2; - uint32 gadgetId = 3; - bool isUseCondenseResin = 4; - ResinCostType resinCostType = 5; -} diff --git a/proto/GadgetInteractRsp.proto b/proto/GadgetInteractRsp.proto deleted file mode 100644 index c08161b72..000000000 --- a/proto/GadgetInteractRsp.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "InterOpType.proto"; -import "InteractType.proto"; - -message GadgetInteractRsp { - int32 retcode = 1; - uint32 gadgetEntityId = 2; - InteractType interactType = 3; - InterOpType opType = 4; - uint32 gadgetId = 5; -} diff --git a/proto/GadgetPlayInfo.proto b/proto/GadgetPlayInfo.proto deleted file mode 100644 index 28fe9a79a..000000000 --- a/proto/GadgetPlayInfo.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "GadgetCrucibleInfo.proto"; - -message GadgetPlayInfo { - uint32 playType = 1; - uint32 duration = 2; - repeated uint32 progressStageList = 3; - uint32 startCd = 4; - uint32 startTime = 5; - uint32 progress = 6; - oneof playInfo { - GadgetCrucibleInfo crucibleInfo = 21; - } -} diff --git a/proto/GetActivityInfoRsp.proto b/proto/GetActivityInfoRsp.proto deleted file mode 100644 index e44903a4f..000000000 --- a/proto/GetActivityInfoRsp.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ActivityInfo.proto"; - -message GetActivityInfoRsp { - int32 retcode = 1; - repeated ActivityInfo activityInfoList = 2; - repeated uint32 activatedSaleIdList = 3; -} diff --git a/proto/GetAllUnlockNameCardRsp.proto b/proto/GetAllUnlockNameCardRsp.proto deleted file mode 100644 index 1a9335085..000000000 --- a/proto/GetAllUnlockNameCardRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetAllUnlockNameCardRsp { - int32 retcode = 1; - repeated uint32 nameCardList = 2; -} diff --git a/proto/GetAuthkeyReq.proto b/proto/GetAuthkeyReq.proto deleted file mode 100644 index f4c212c23..000000000 --- a/proto/GetAuthkeyReq.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetAuthkeyReq { - string authAppid = 1; - uint32 signType = 2; - uint32 authkeyVer = 3; -} diff --git a/proto/GetAuthkeyRsp.proto b/proto/GetAuthkeyRsp.proto deleted file mode 100644 index 584251a11..000000000 --- a/proto/GetAuthkeyRsp.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetAuthkeyRsp { - int32 retcode = 1; - string authkey = 2; - string authAppid = 3; - uint32 signType = 4; - uint32 authkeyVer = 5; - string gameBiz = 6; -} diff --git a/proto/GetGachaInfoRsp.proto b/proto/GetGachaInfoRsp.proto deleted file mode 100644 index c275f5666..000000000 --- a/proto/GetGachaInfoRsp.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "GachaInfo.proto"; - -message GetGachaInfoRsp { - int32 retcode = 1; - repeated GachaInfo gachaInfoList = 2; - uint32 gachaRandom = 3; -} diff --git a/proto/GetPlayerAskFriendListRsp.proto b/proto/GetPlayerAskFriendListRsp.proto deleted file mode 100644 index c783f380f..000000000 --- a/proto/GetPlayerAskFriendListRsp.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "FriendBrief.proto"; - -message GetPlayerAskFriendListRsp { - int32 retcode = 1; - repeated FriendBrief askFriendList = 2; -} diff --git a/proto/GetPlayerBlacklistRsp.proto b/proto/GetPlayerBlacklistRsp.proto deleted file mode 100644 index 979e983fb..000000000 --- a/proto/GetPlayerBlacklistRsp.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "FriendBrief.proto"; - -message GetPlayerBlacklistRsp { - int32 retcode = 1; - repeated FriendBrief blacklist = 2; -} diff --git a/proto/GetPlayerFriendListRsp.proto b/proto/GetPlayerFriendListRsp.proto deleted file mode 100644 index 95f8c5e87..000000000 --- a/proto/GetPlayerFriendListRsp.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "FriendBrief.proto"; - -message GetPlayerFriendListRsp { - int32 retcode = 1; - repeated FriendBrief friendList = 2; - repeated FriendBrief askFriendList = 3; -} diff --git a/proto/GetPlayerSocialDetailReq.proto b/proto/GetPlayerSocialDetailReq.proto deleted file mode 100644 index 490542654..000000000 --- a/proto/GetPlayerSocialDetailReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetPlayerSocialDetailReq { - uint32 uid = 1; -} diff --git a/proto/GetPlayerSocialDetailRsp.proto b/proto/GetPlayerSocialDetailRsp.proto deleted file mode 100644 index 95d9e893e..000000000 --- a/proto/GetPlayerSocialDetailRsp.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "SocialDetail.proto"; - -message GetPlayerSocialDetailRsp { - int32 retcode = 1; - SocialDetail detailData = 2; -} diff --git a/proto/GetPlayerTokenReq.proto b/proto/GetPlayerTokenReq.proto deleted file mode 100644 index 083a0300b..000000000 --- a/proto/GetPlayerTokenReq.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetPlayerTokenReq { - uint32 accountType = 1; - string accountUid = 2; - string accountToken = 3; - uint64 platformType = 7; - uint64 schannelId = 11; -} diff --git a/proto/GetPlayerTokenRsp.proto b/proto/GetPlayerTokenRsp.proto deleted file mode 100644 index 011e50041..000000000 --- a/proto/GetPlayerTokenRsp.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetPlayerTokenRsp { - uint32 playerUid = 3; - string accountToken = 4; - int32 accountType = 6; - bool isProficientPlayer = 8; - uint32 gmUid = 10; - uint64 secretKey = 11; - bytes secretKeyBuffer = 12; - uint64 platformType = 13; - uint32 channelId = 16; - string countryCode = 19; - string unk1 = 22; - uint32 unk3 = 23; - string clientIp = 24; -} diff --git a/proto/GetSceneAreaReq.proto b/proto/GetSceneAreaReq.proto deleted file mode 100644 index c66483678..000000000 --- a/proto/GetSceneAreaReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetSceneAreaReq { - uint32 sceneId = 1; - uint32 belongUid = 2; -} diff --git a/proto/GetSceneAreaRsp.proto b/proto/GetSceneAreaRsp.proto deleted file mode 100644 index b25ae29f3..000000000 --- a/proto/GetSceneAreaRsp.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "CityInfo.proto"; - -message GetSceneAreaRsp { - int32 retcode = 1; - uint32 sceneId = 2; - repeated uint32 areaIdList = 3; - repeated CityInfo cityInfoList = 4; -} diff --git a/proto/GetScenePointReq.proto b/proto/GetScenePointReq.proto deleted file mode 100644 index 42538a417..000000000 --- a/proto/GetScenePointReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetScenePointReq { - uint32 sceneId = 1; - uint32 belongUid = 2; -} diff --git a/proto/GetScenePointRsp.proto b/proto/GetScenePointRsp.proto deleted file mode 100644 index 7973829c5..000000000 --- a/proto/GetScenePointRsp.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetScenePointRsp { - int32 retcode = 1; - uint32 sceneId = 2; - repeated uint32 unlockedPointList = 3; - uint32 belongUid = 4; - repeated uint32 unlockAreaList = 5; - repeated uint32 lockedPointList = 6; - repeated uint32 toBeExploreDungeonEntryList = 7; - repeated uint32 notExploredDungeonEntryList = 8; - repeated uint32 groupUnlimitPointList = 9; - repeated uint32 notInteractDungeonEntryList = 10; -} diff --git a/proto/GetShopReq.proto b/proto/GetShopReq.proto deleted file mode 100644 index 298e6c065..000000000 --- a/proto/GetShopReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetShopReq { - uint32 shopType = 1; -} diff --git a/proto/GetShopRsp.proto b/proto/GetShopRsp.proto deleted file mode 100644 index e7295dcdb..000000000 --- a/proto/GetShopRsp.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Shop.proto"; - -message GetShopRsp { - int32 retcode = 1; - Shop shop = 2; -} diff --git a/proto/GetShopmallDataRsp.proto b/proto/GetShopmallDataRsp.proto deleted file mode 100644 index 6db6d68d4..000000000 --- a/proto/GetShopmallDataRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetShopmallDataRsp { - int32 retcode = 1; - repeated uint32 shopTypeList = 2; -} diff --git a/proto/GetWorldMpInfoRsp.proto b/proto/GetWorldMpInfoRsp.proto deleted file mode 100644 index c4bebe725..000000000 --- a/proto/GetWorldMpInfoRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message GetWorldMpInfoRsp { - int32 retcode = 1; - bool isInMpMode = 2; - uint32 quitMpValidTime = 3; -} diff --git a/proto/H5ActivityIdsNotify.proto b/proto/H5ActivityIdsNotify.proto deleted file mode 100644 index 59521ed66..000000000 --- a/proto/H5ActivityIdsNotify.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message H5ActivityIdsNotify { - map h5ActivityMap = 1; -} diff --git a/proto/HeadImage.proto b/proto/HeadImage.proto deleted file mode 100644 index 0aa6d697b..000000000 --- a/proto/HeadImage.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message HeadImage { - uint32 avatarId = 1; -} diff --git a/proto/HitColliderType.proto b/proto/HitColliderType.proto deleted file mode 100644 index e06448729..000000000 --- a/proto/HitColliderType.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum HitColliderType { - HitColliderInvalid = 0; - HitColliderHitBox = 1; - HitColliderWetHitBox = 2; - HitColliderHeadBox = 3; -} diff --git a/proto/HitCollision.proto b/proto/HitCollision.proto deleted file mode 100644 index b3766b047..000000000 --- a/proto/HitCollision.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "HitColliderType.proto"; -import "Vector.proto"; - -message HitCollision { - HitColliderType hitColliderType = 1; - int32 hitBoxIndex = 2; - Vector hitPoint = 3; - Vector hitDir = 4; - float attackeeHitForceAngle = 5; - float attackeeHitEntityAngle = 6; -} diff --git a/proto/HostPlayerNotify.proto b/proto/HostPlayerNotify.proto deleted file mode 100644 index 2659edc40..000000000 --- a/proto/HostPlayerNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message HostPlayerNotify { - uint32 hostUid = 1; - uint32 hostPeerId = 2; -} diff --git a/proto/InterOpType.proto b/proto/InterOpType.proto deleted file mode 100644 index 9ccecdb6f..000000000 --- a/proto/InterOpType.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum InterOpType { - InterOpFinish = 0; - InterOpStart = 1; -} diff --git a/proto/InteractType.proto b/proto/InteractType.proto deleted file mode 100644 index 6883ad361..000000000 --- a/proto/InteractType.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum InteractType { - InteractNone = 0; - InteractPickItem = 1; - InteractGather = 2; - InteractOpenChest = 3; - InteractOpenStatue = 4; - InteractConsum = 5; - InteractMpPlayReward = 6; - InteractView = 7; - InteractGeneralReward = 8; - InteractMiracleRing = 9; - InteractFoundation = 10; -} diff --git a/proto/Item.proto b/proto/Item.proto deleted file mode 100644 index f0857bebd..000000000 --- a/proto/Item.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Equip.proto"; -import "Furniture.proto"; -import "Material.proto"; - -message Item { - uint32 itemId = 1; - uint64 guid = 2; - oneof detail { - Material material = 5; - Equip equip = 6; - Furniture furniture = 7; - } -} diff --git a/proto/ItemAddHintNotify.proto b/proto/ItemAddHintNotify.proto deleted file mode 100644 index ea4db2f14..000000000 --- a/proto/ItemAddHintNotify.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ItemHint.proto"; -import "Vector.proto"; - -message ItemAddHintNotify { - repeated ItemHint itemList = 1; - Vector position = 2; - bool isPositionValid = 3; - uint32 reason = 4; - uint32 questId = 5; - bool isTransferedFromAvatarCard = 6; - repeated ItemHint overflowTransformedItemList = 7; -} diff --git a/proto/ItemExceedLimitNotify.proto b/proto/ItemExceedLimitNotify.proto deleted file mode 100644 index d294ba8b9..000000000 --- a/proto/ItemExceedLimitNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ItemExceedLimitNotify { - bool isMaterialExceedLimit = 1; - bool isWeaponExceedLimit = 2; - bool isReliquaryExceedLimit = 3; - repeated uint32 itemIdList = 4; -} diff --git a/proto/ItemGivingReq.proto b/proto/ItemGivingReq.proto deleted file mode 100644 index f09b8c965..000000000 --- a/proto/ItemGivingReq.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ItemParam.proto"; - -message ItemGivingReq { - uint32 givingId = 1; - repeated ItemParam itemParamList = 2; - map itemGuidCountMap = 3; -} diff --git a/proto/ItemGivingRsp.proto b/proto/ItemGivingRsp.proto deleted file mode 100644 index ea3694b78..000000000 --- a/proto/ItemGivingRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ItemGivingRsp { - int32 retcode = 1; - uint32 givingId = 2; -} diff --git a/proto/ItemHint.proto b/proto/ItemHint.proto deleted file mode 100644 index 2d036175e..000000000 --- a/proto/ItemHint.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ItemHint { - uint32 itemId = 1; - uint32 count = 2; - bool isNew = 3; -} diff --git a/proto/ItemParam.proto b/proto/ItemParam.proto deleted file mode 100644 index 2e48028b3..000000000 --- a/proto/ItemParam.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ItemParam { - uint32 itemId = 1; - uint32 count = 2; -} diff --git a/proto/LifeStateChangeNotify.proto b/proto/LifeStateChangeNotify.proto deleted file mode 100644 index 4f16e936c..000000000 --- a/proto/LifeStateChangeNotify.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PlayerDieType.proto"; - -message LifeStateChangeNotify { - uint32 entityId = 1; - uint32 lifeState = 2; - uint32 sourceEntityId = 3; - string attackTag = 4; - PlayerDieType dieType = 5; - uint32 moveReliableSeq = 6; -} diff --git a/proto/MPLevelEntityInfo.proto b/proto/MPLevelEntityInfo.proto deleted file mode 100644 index 810e1d372..000000000 --- a/proto/MPLevelEntityInfo.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilitySyncStateInfo.proto"; - -message MPLevelEntityInfo { - uint32 entityId = 1; - uint32 authorityPeerId = 2; - AbilitySyncStateInfo abilityInfo = 3; -} diff --git a/proto/MapMarkFromType.proto b/proto/MapMarkFromType.proto deleted file mode 100644 index 5d31e1af5..000000000 --- a/proto/MapMarkFromType.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum MapMarkFromType { - None = 0; - MonsterType = 1; - QuestType = 2; -} diff --git a/proto/MapMarkPoint.proto b/proto/MapMarkPoint.proto deleted file mode 100644 index fb244db4e..000000000 --- a/proto/MapMarkPoint.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MapMarkFromType.proto"; -import "MapMarkPointType.proto"; -import "Vector.proto"; - -message MapMarkPoint { - uint32 sceneId = 1; - string name = 2; - Vector pos = 3; - MapMarkPointType pointType = 4; - uint32 monsterId = 5; - MapMarkFromType fromType = 6; - uint32 questId = 7; -} diff --git a/proto/MapMarkPointType.proto b/proto/MapMarkPointType.proto deleted file mode 100644 index 986d30876..000000000 --- a/proto/MapMarkPointType.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum MapMarkPointType { - Npc = 0; - Quest = 1; - Special = 2; - Mine = 3; - Collection = 4; - Monster = 5; -} diff --git a/proto/MarkMapReq.proto b/proto/MarkMapReq.proto deleted file mode 100644 index 2e57ebb55..000000000 --- a/proto/MarkMapReq.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MapMarkPoint.proto"; -import "Operation.proto"; - -message MarkMapReq { - Operation op = 1; - MapMarkPoint old = 2; - MapMarkPoint mark = 3; -} diff --git a/proto/MassivePropParam.proto b/proto/MassivePropParam.proto deleted file mode 100644 index bd30d4597..000000000 --- a/proto/MassivePropParam.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message MassivePropParam { - int32 elementReactionType = 1; - uint32 casterId = 2; - repeated float paramList = 3; - uint32 syncFlag = 4; -} diff --git a/proto/MassivePropSyncInfo.proto b/proto/MassivePropSyncInfo.proto deleted file mode 100644 index 276f7a380..000000000 --- a/proto/MassivePropSyncInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MassivePropParam.proto"; - -message MassivePropSyncInfo { - int64 id = 1; - map propMap = 2; -} diff --git a/proto/Material.proto b/proto/Material.proto deleted file mode 100644 index 4fd76bc51..000000000 --- a/proto/Material.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MaterialDeleteInfo.proto"; - -message Material { - uint32 count = 1; - MaterialDeleteInfo deleteInfo = 2; -} diff --git a/proto/MaterialDeleteInfo.proto b/proto/MaterialDeleteInfo.proto deleted file mode 100644 index 9e5a310c0..000000000 --- a/proto/MaterialDeleteInfo.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "CountDownDelete.proto"; -import "DateTimeDelete.proto"; -import "DelayWeekCountDownDelete.proto"; - -message MaterialDeleteInfo { - bool hasDeleteConfig = 1; - oneof deleteInfo { - CountDownDelete countDownDelete = 2; - DateTimeDelete dateDelete = 3; - DelayWeekCountDownDelete delayWeekCountDownDelete = 4; - } -} diff --git a/proto/MaterialInfo.proto b/proto/MaterialInfo.proto deleted file mode 100644 index ea8701dca..000000000 --- a/proto/MaterialInfo.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message MaterialInfo { - uint64 guid = 1; - uint32 count = 2; -} diff --git a/proto/MathQuaternion.proto b/proto/MathQuaternion.proto deleted file mode 100644 index a3689667a..000000000 --- a/proto/MathQuaternion.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message MathQuaternion { - float x = 1; - float y = 2; - float z = 3; - float w = 4; -} diff --git a/proto/ModifierDurability.proto b/proto/ModifierDurability.proto deleted file mode 100644 index ed8d9e76a..000000000 --- a/proto/ModifierDurability.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ModifierDurability { - float reduceRatio = 1; - float remainingDurability = 2; -} diff --git a/proto/MonsterBornType.proto b/proto/MonsterBornType.proto deleted file mode 100644 index 31aade84c..000000000 --- a/proto/MonsterBornType.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum MonsterBornType { - MonsterBornNone = 0; - MonsterBornDefault = 1; - MonsterBornRandom = 2; -} diff --git a/proto/MonsterRoute.proto b/proto/MonsterRoute.proto deleted file mode 100644 index ac98be7ce..000000000 --- a/proto/MonsterRoute.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "RoutePoint.proto"; - -message MonsterRoute { - RoutePoint routePoints = 1; - uint32 speedLevel = 2; - uint32 routeType = 3; - float arriveRange = 4; -} diff --git a/proto/MotionInfo.proto b/proto/MotionInfo.proto deleted file mode 100644 index faddc14dc..000000000 --- a/proto/MotionInfo.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MotionState.proto"; -import "Vector.proto"; - -message MotionInfo { - Vector pos = 1; - Vector rot = 2; - Vector speed = 3; - MotionState state = 4; - repeated Vector params = 5; - Vector refPos = 6; - uint32 refId = 7; - uint32 sceneTime = 8; - uint32 intervalVelocity = 9; -} diff --git a/proto/MotionState.proto b/proto/MotionState.proto deleted file mode 100644 index 91102eedf..000000000 --- a/proto/MotionState.proto +++ /dev/null @@ -1,53 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum MotionState { - MotionNone = 0; - MotionReset = 1; - MotionStandby = 2; - MotionStandbyMove = 3; - MotionWalk = 4; - MotionRun = 5; - MotionDash = 6; - MotionClimb = 7; - MotionClimbJump = 8; - MotionStandbyToClimb = 9; - MotionFight = 10; - MotionJump = 11; - MotionDrop = 12; - MotionFly = 13; - MotionSwimMove = 14; - MotionSwimIdle = 15; - MotionSwimDash = 16; - MotionSwimJump = 17; - MotionSlip = 18; - MotionGoUpstairs = 19; - MotionFallOnGround = 20; - MotionJumpUpWallForStandby = 21; - MotionJumpOffWall = 22; - MotionPoweredFly = 23; - MotionLadderIdle = 24; - MotionLadderMove = 25; - MotionLadderSlip = 26; - MotionStandbyToLadder = 27; - MotionLadderToStandby = 28; - MotionDangerStandby = 29; - MotionDangerStandbyMove = 30; - MotionDangerWalk = 31; - MotionDangerRun = 32; - MotionDangerDash = 33; - MotionCrouchIdle = 34; - MotionCrouchMove = 35; - MotionCrouchRoll = 36; - MotionNotify = 37; - MotionLandSpeed = 38; - MotionMoveFailAck = 39; - MotionWaterfall = 40; - MotionDashBeforeShake = 41; - MotionSitIdle = 42; - MotionForceSetPos = 43; - MotionQuestForceDrag = 44; - MotionFollowRoute = 45; - MotionNum = 46; -} diff --git a/proto/MovingPlatformType.proto b/proto/MovingPlatformType.proto deleted file mode 100644 index f3861d117..000000000 --- a/proto/MovingPlatformType.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message MovingPlatformType { - -} diff --git a/proto/MpSettingType.proto b/proto/MpSettingType.proto deleted file mode 100644 index f24083b21..000000000 --- a/proto/MpSettingType.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum MpSettingType { - MpSettingNoEnter = 0; - MpSettingEnterFreely = 1; - MpSettingEnterAfterApply = 2; -} diff --git a/proto/OnlinePlayerInfo.proto b/proto/OnlinePlayerInfo.proto deleted file mode 100644 index 76ed24a06..000000000 --- a/proto/OnlinePlayerInfo.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "HeadImage.proto"; -import "MpSettingType.proto"; - -message OnlinePlayerInfo { - uint32 uid = 1; - string nickname = 2; - uint32 playerLevel = 3; - MpSettingType mpSettingType = 5; - uint32 curPlayerNumInWorld = 6; - uint32 worldLevel = 7; - string onlineId = 8; - uint32 nameCardId = 9; - repeated uint32 blacklistUidList = 10; - string signature = 11; - HeadImage avatar = 12; -} diff --git a/proto/OpenStateUpdateNotify.proto b/proto/OpenStateUpdateNotify.proto deleted file mode 100644 index 91d1d2f11..000000000 --- a/proto/OpenStateUpdateNotify.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message OpenStateUpdateNotify { - map openStateMap = 1; -} diff --git a/proto/Operation.proto b/proto/Operation.proto deleted file mode 100644 index c48819bd5..000000000 --- a/proto/Operation.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum Operation { - Add = 0; - Mod = 1; - Del = 2; - Get = 3; -} diff --git a/proto/PacketHead.proto b/proto/PacketHead.proto deleted file mode 100644 index a9e4e5201..000000000 --- a/proto/PacketHead.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PacketHead { - uint32 clientSequenceId = 3; - uint64 timestamp = 6; -} diff --git a/proto/PingReq.proto b/proto/PingReq.proto deleted file mode 100644 index 231ece4b1..000000000 --- a/proto/PingReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PingReq { - int32 seq = 1; - int32 clientTime = 2; -} diff --git a/proto/PingRsp.proto b/proto/PingRsp.proto deleted file mode 100644 index 3efd49701..000000000 --- a/proto/PingRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PingRsp { - int32 retcode = 1; - uint32 seq = 2; - uint32 clientTime = 3; -} diff --git a/proto/PlatformInfo.proto b/proto/PlatformInfo.proto deleted file mode 100644 index c78b36bfe..000000000 --- a/proto/PlatformInfo.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MathQuaternion.proto"; -import "MovingPlatformType.proto"; -import "Route.proto"; -import "Vector.proto"; - -message PlatformInfo { - uint32 routeId = 1; - int32 startIndex = 2; - uint32 startRouteTime = 3; - uint32 startSceneTime = 4; - Vector startPos = 7; - bool isStarted = 8; - MathQuaternion startRot = 9; - uint32 stopSceneTime = 10; - Vector posOffset = 11; - MathQuaternion rotOffset = 12; - MovingPlatformType movingPlatformType = 13; - bool isActive = 14; - Route route = 15; - uint32 pointId = 16; -} diff --git a/proto/PlayerApplyEnterMpNotify.proto b/proto/PlayerApplyEnterMpNotify.proto deleted file mode 100644 index c5b3cc1e9..000000000 --- a/proto/PlayerApplyEnterMpNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "OnlinePlayerInfo.proto"; - -message PlayerApplyEnterMpNotify { - OnlinePlayerInfo srcPlayerInfo = 1; - uint32 srcAppId = 2; -} diff --git a/proto/PlayerApplyEnterMpReason.proto b/proto/PlayerApplyEnterMpReason.proto deleted file mode 100644 index e305e435f..000000000 --- a/proto/PlayerApplyEnterMpReason.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum PlayerApplyEnterMpReason { - PlayerJudge = 0; - SceneCannotEnter = 1; - PlayerCannotEnterMp = 2; - SystemJudge = 3; - AllowEnterPlayerFull = 4; - WorldLevelLowerThanHost = 5; - HostInMatch = 6; - PlayerInBlacklist = 7; - PsPlayerNotAcceptOthers = 8; - HostIsBlocked = 9; - OtherDataVersionNotLatest = 10; - DataVersionNotLatest = 11; - PlayerNotInPlayerWorld = 12; -} diff --git a/proto/PlayerApplyEnterMpReq.proto b/proto/PlayerApplyEnterMpReq.proto deleted file mode 100644 index b4fc37221..000000000 --- a/proto/PlayerApplyEnterMpReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PlayerApplyEnterMpReq { - uint32 targetUid = 1; -} diff --git a/proto/PlayerApplyEnterMpResultNotify.proto b/proto/PlayerApplyEnterMpResultNotify.proto deleted file mode 100644 index 2befeaf2e..000000000 --- a/proto/PlayerApplyEnterMpResultNotify.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PlayerApplyEnterMpReason.proto"; - -message PlayerApplyEnterMpResultNotify { - uint32 targetUid = 1; - bool isAgreed = 2; - PlayerApplyEnterMpReason reason = 3; - string targetNickname = 4; -} diff --git a/proto/PlayerApplyEnterMpResultReq.proto b/proto/PlayerApplyEnterMpResultReq.proto deleted file mode 100644 index 6e151c968..000000000 --- a/proto/PlayerApplyEnterMpResultReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PlayerApplyEnterMpResultReq { - uint32 applyUid = 1; - bool isAgreed = 2; -} diff --git a/proto/PlayerApplyEnterMpResultRsp.proto b/proto/PlayerApplyEnterMpResultRsp.proto deleted file mode 100644 index b38555633..000000000 --- a/proto/PlayerApplyEnterMpResultRsp.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PlayerApplyEnterMpResultRsp { - int32 retcode = 1; - uint32 applyUid = 2; - bool isAgreed = 3; - uint32 param = 4; -} diff --git a/proto/PlayerApplyEnterMpRsp.proto b/proto/PlayerApplyEnterMpRsp.proto deleted file mode 100644 index 29148a025..000000000 --- a/proto/PlayerApplyEnterMpRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PlayerApplyEnterMpRsp { - int32 retcode = 1; - uint32 targetUid = 2; - uint32 param = 3; -} diff --git a/proto/PlayerChatNotify.proto b/proto/PlayerChatNotify.proto deleted file mode 100644 index e6844e8f4..000000000 --- a/proto/PlayerChatNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ChatInfo.proto"; - -message PlayerChatNotify { - uint32 channelId = 1; - ChatInfo chatInfo = 2; -} diff --git a/proto/PlayerChatReq.proto b/proto/PlayerChatReq.proto deleted file mode 100644 index 37e37a17d..000000000 --- a/proto/PlayerChatReq.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ChatInfo.proto"; - -message PlayerChatReq { - uint32 channelId = 1; - ChatInfo chatInfo = 2; -} diff --git a/proto/PlayerChatRsp.proto b/proto/PlayerChatRsp.proto deleted file mode 100644 index 01d9b31c1..000000000 --- a/proto/PlayerChatRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PlayerChatRsp { - int32 retcode = 1; - uint32 chatForbiddenEndtime = 2; -} diff --git a/proto/PlayerDataNotify.proto b/proto/PlayerDataNotify.proto deleted file mode 100644 index 817cc4cb9..000000000 --- a/proto/PlayerDataNotify.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PropValue.proto"; - -message PlayerDataNotify { - string nickName = 1; - uint64 clientTime = 2; - bool isFirstLoginToday = 3; - uint32 regionId = 4; - map propMap = 6; -} diff --git a/proto/PlayerDieType.proto b/proto/PlayerDieType.proto deleted file mode 100644 index d26a55575..000000000 --- a/proto/PlayerDieType.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum PlayerDieType { - PlayerDieNone = 0; - PlayerDieKillByMonster = 1; - PlayerDieKillByGear = 2; - PlayerDieFall = 3; - PlayerDieDrawn = 4; - PlayerDieAbyss = 5; - PlayerDieGm = 6; - PlayerDieClimateCold = 7; - PlayerDieStormLighting = 8; -} diff --git a/proto/PlayerEnterSceneInfoNotify.proto b/proto/PlayerEnterSceneInfoNotify.proto deleted file mode 100644 index 77e952eca..000000000 --- a/proto/PlayerEnterSceneInfoNotify.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AvatarEnterSceneInfo.proto"; -import "MPLevelEntityInfo.proto"; -import "TeamEnterSceneInfo.proto"; - -message PlayerEnterSceneInfoNotify { - uint32 curAvatarEntityId = 1; - repeated AvatarEnterSceneInfo avatarEnterInfo = 2; - TeamEnterSceneInfo teamEnterInfo = 3; - MPLevelEntityInfo mpLevelEntityInfo = 4; - uint32 enterSceneToken = 5; -} diff --git a/proto/PlayerEnterSceneNotify.proto b/proto/PlayerEnterSceneNotify.proto deleted file mode 100644 index 1302e05a9..000000000 --- a/proto/PlayerEnterSceneNotify.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "EnterType.proto"; -import "Vector.proto"; - -message PlayerEnterSceneNotify { - uint32 sceneId = 1; - Vector pos = 2; - uint64 sceneBeginTime = 3; - EnterType type = 4; - uint32 targetUid = 6; - uint32 prevSceneId = 9; - Vector prevPos = 10; - uint32 dungeonId = 11; - uint32 worldLevel = 12; - uint32 enterSceneToken = 13; - bool isFirstLoginEnterScene = 14; - repeated uint32 sceneTagIdList = 15; - bool isSkipUi = 16; - uint32 enterReason = 17; - uint32 unk1 = 18; - string unk2 = 19; -} diff --git a/proto/PlayerGameTimeNotify.proto b/proto/PlayerGameTimeNotify.proto deleted file mode 100644 index c8292aab0..000000000 --- a/proto/PlayerGameTimeNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PlayerGameTimeNotify { - uint32 gameTime = 1; - uint32 uid = 2; -} diff --git a/proto/PlayerGetForceQuitBanInfoRsp.proto b/proto/PlayerGetForceQuitBanInfoRsp.proto deleted file mode 100644 index 35de4f448..000000000 --- a/proto/PlayerGetForceQuitBanInfoRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PlayerGetForceQuitBanInfoRsp { - int32 retcode = 1; - uint32 matchId = 2; - uint32 expireTime = 3; -} diff --git a/proto/PlayerLocationInfo.proto b/proto/PlayerLocationInfo.proto deleted file mode 100644 index 9816560ee..000000000 --- a/proto/PlayerLocationInfo.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Vector.proto"; - -message PlayerLocationInfo { - uint32 uid = 1; - Vector pos = 2; - Vector rot = 3; -} diff --git a/proto/PlayerLoginReq.proto b/proto/PlayerLoginReq.proto deleted file mode 100644 index 9d206ed5c..000000000 --- a/proto/PlayerLoginReq.proto +++ /dev/null @@ -1,41 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "TrackingIOInfo.proto"; - -message PlayerLoginReq { - string token = 1; - string clientVersion = 2; - string systemVersion = 3; - string deviceName = 4; - string deviceUuid = 5; - uint32 targetUid = 6; - uint64 loginRand = 7; - bool isEditor = 8; - uint32 languageType = 9; - uint32 accountType = 10; - string accountUid = 11; - string platform = 12; - string deviceInfo = 13; - uint32 platformType = 14; - bool isGuest = 15; - uint32 cloudClientIp = 16; - uint32 gmUid = 17; - string checksum = 18; - string onlineId = 19; - uint32 clientToken = 20; - bytes securityCmdReply = 21; - bytes extraBinData = 22; - string cps = 23; - uint32 channelId = 24; - uint32 subChannelId = 25; - string checksumClientVersion = 26; - uint32 tag = 27; - TrackingIOInfo trackingIoInfo = 28; - string countryCode = 29; - uint32 clientDataVersion = 30; - bytes environmentErrorCode = 31; - uint32 targetHomeOwnerUid = 32; - string psnId = 33; -} diff --git a/proto/PlayerLoginRsp.proto b/proto/PlayerLoginRsp.proto deleted file mode 100644 index d11fd44f0..000000000 --- a/proto/PlayerLoginRsp.proto +++ /dev/null @@ -1,41 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "BlockInfo.proto"; -import "FeatureBlockInfo.proto"; -import "ResVersionConfig.proto"; -import "ShortAbilityHashPair.proto"; - -message PlayerLoginRsp { - int32 retcode = 1; - bytes playerData = 2; - bool isNewPlayer = 3; - uint32 targetUid = 4; - uint64 loginRand = 5; - bool isUseAbilityHash = 6; - int32 abilityHashCode = 7; - map abilityHashMap = 8; - uint32 clientDataVersion = 9; - bool isRelogin = 11; - uint32 clientSilenceDataVersion = 13; - string gameBiz = 14; - uint32 playerDataVersion = 15; - string clientMd5 = 16; - string clientSilenceMd5 = 17; - ResVersionConfig resVersionConfig = 20; - map blockInfoMap = 21; - string clientVersionSuffix = 24; - string clientSilenceVersionSuffix = 25; - repeated ShortAbilityHashPair shortAbilityHashMap = 27; - bytes scInfo = 28; - bool isAudit = 29; - bool isScOpen = 30; - string registerCps = 31; - repeated FeatureBlockInfo featureBlockInfoList = 32; - bool isDataNeedRelogin = 33; - string countryCode = 34; - ResVersionConfig nextResVersionConfig = 35; - string nextResourceUrl = 36; - uint32 targetHomeOwnerUid = 37; -} diff --git a/proto/PlayerPropNotify.proto b/proto/PlayerPropNotify.proto deleted file mode 100644 index 7341b4df1..000000000 --- a/proto/PlayerPropNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PropValue.proto"; - -message PlayerPropNotify { - map propMap = 1; -} diff --git a/proto/PlayerRTTInfo.proto b/proto/PlayerRTTInfo.proto deleted file mode 100644 index 2ed543319..000000000 --- a/proto/PlayerRTTInfo.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PlayerRTTInfo { - uint32 uid = 1; - uint32 rtt = 2; -} diff --git a/proto/PlayerSetPauseReq.proto b/proto/PlayerSetPauseReq.proto deleted file mode 100644 index 984c2f863..000000000 --- a/proto/PlayerSetPauseReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PlayerSetPauseReq { - bool isPaused = 1; -} diff --git a/proto/PlayerStoreNotify.proto b/proto/PlayerStoreNotify.proto deleted file mode 100644 index 0202dcd93..000000000 --- a/proto/PlayerStoreNotify.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Item.proto"; -import "StoreType.proto"; - -message PlayerStoreNotify { - StoreType storeType = 1; - repeated Item itemList = 2; - uint32 weightLimit = 3; -} diff --git a/proto/PlayerTimeNotify.proto b/proto/PlayerTimeNotify.proto deleted file mode 100644 index 5085127e8..000000000 --- a/proto/PlayerTimeNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PlayerTimeNotify { - bool isPaused = 1; - uint64 playerTime = 2; - uint64 serverTime = 3; -} diff --git a/proto/PostEnterSceneRsp.proto b/proto/PostEnterSceneRsp.proto deleted file mode 100644 index ec362f0fa..000000000 --- a/proto/PostEnterSceneRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PostEnterSceneRsp { - int32 retcode = 1; - uint32 enterSceneToken = 2; -} diff --git a/proto/PrivateChatNotify.proto b/proto/PrivateChatNotify.proto deleted file mode 100644 index 84457efac..000000000 --- a/proto/PrivateChatNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ChatInfo.proto"; - -message PrivateChatNotify { - ChatInfo chatInfo = 1; -} diff --git a/proto/PrivateChatReq.proto b/proto/PrivateChatReq.proto deleted file mode 100644 index 356aee67e..000000000 --- a/proto/PrivateChatReq.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PrivateChatReq { - uint32 targetUid = 1; - oneof content { - string text = 2; - uint32 icon = 3; - } -} diff --git a/proto/PrivateChatRsp.proto b/proto/PrivateChatRsp.proto deleted file mode 100644 index 09e427ae8..000000000 --- a/proto/PrivateChatRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PrivateChatRsp { - int32 retcode = 1; - uint32 chatForbiddenEndtime = 2; -} diff --git a/proto/PropChangeReason.proto b/proto/PropChangeReason.proto deleted file mode 100644 index 123b1d6a7..000000000 --- a/proto/PropChangeReason.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum PropChangeReason { - PropChangeNone = 0; - PropChangeStatueRecover = 1; - PropChangeEnergyBall = 2; - PropChangeAbility = 3; - PropChangeLevelup = 4; - PropChangeItem = 5; - PropChangeAvatarCard = 6; - PropChangeCityLevelup = 7; - PropChangeAvatarUpgrade = 8; - PropChangeAvatarPromote = 9; - PropChangePlayerAddExp = 10; - PropChangeFinishQuest = 11; - PropChangeGm = 12; - PropChangeManualAdjustWorldLevel = 13; -} diff --git a/proto/PropPair.proto b/proto/PropPair.proto deleted file mode 100644 index 4a5ac0ee7..000000000 --- a/proto/PropPair.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PropValue.proto"; - -message PropPair { - uint32 type = 1; - PropValue propValue = 2; -} diff --git a/proto/PropValue.proto b/proto/PropValue.proto deleted file mode 100644 index 6d905517d..000000000 --- a/proto/PropValue.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PropValue { - uint32 type = 1; - oneof value { - uint32 ival = 2; - float fval = 3; - } - uint32 val = 4; -} diff --git a/proto/ProtEntityType.proto b/proto/ProtEntityType.proto deleted file mode 100644 index 9512f7d35..000000000 --- a/proto/ProtEntityType.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum ProtEntityType { - ProtEntityNone = 0; - ProtEntityAvatar = 1; - ProtEntityMonster = 2; - ProtEntityNpc = 3; - ProtEntityGadget = 4; - ProtEntityRegion = 5; - ProtEntityWeapon = 6; - ProtEntityWeather = 7; - ProtEntityScene = 8; - ProtEntityTeam = 9; - ProtEntityMassiveEntity = 10; - ProtEntityMpLevel = 11; - ProtEntityPlayTeamEntity = 12; - ProtEntityEyePoint = 13; - ProtEntityMax = 14; -} diff --git a/proto/ProudSkillChangeNotify.proto b/proto/ProudSkillChangeNotify.proto deleted file mode 100644 index fa5ca0bf5..000000000 --- a/proto/ProudSkillChangeNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ProudSkillChangeNotify { - uint64 avatarGuid = 1; - uint32 entityId = 2; - uint32 skillDepotId = 3; - repeated uint32 proudSkillList = 4; -} diff --git a/proto/ProudSkillExtraLevelNotify.proto b/proto/ProudSkillExtraLevelNotify.proto deleted file mode 100644 index 4d612d33b..000000000 --- a/proto/ProudSkillExtraLevelNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ProudSkillExtraLevelNotify { - uint64 avatarGuid = 1; - uint32 talentType = 2; - uint32 talentIndex = 3; - uint32 extraLevel = 4; -} diff --git a/proto/PullPrivateChatReq.proto b/proto/PullPrivateChatReq.proto deleted file mode 100644 index e7d48092b..000000000 --- a/proto/PullPrivateChatReq.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message PullPrivateChatReq { - uint32 targetUid = 1; - uint32 fromSequence = 2; - uint32 pullNum = 3; -} diff --git a/proto/PullPrivateChatRsp.proto b/proto/PullPrivateChatRsp.proto deleted file mode 100644 index 076ef87cf..000000000 --- a/proto/PullPrivateChatRsp.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ChatInfo.proto"; - -message PullPrivateChatRsp { - int32 retcode = 1; - repeated ChatInfo chatInfo = 2; -} diff --git a/proto/PullRecentChatRsp.proto b/proto/PullRecentChatRsp.proto deleted file mode 100644 index 1aafd001d..000000000 --- a/proto/PullRecentChatRsp.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ChatInfo.proto"; - -message PullRecentChatRsp { - int32 retcode = 1; - repeated ChatInfo chatInfo = 2; -} diff --git a/proto/QueryCurrRegionHttpRsp.proto b/proto/QueryCurrRegionHttpRsp.proto deleted file mode 100644 index 58c2c8be6..000000000 --- a/proto/QueryCurrRegionHttpRsp.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "RegionInfo.proto"; - -message QueryCurrRegionHttpRsp { - int32 retcode = 1; - string message = 2; - RegionInfo regionInfo = 3; - bytes clientSecretKey = 11; - bytes regionCustomConfigEncrypted = 12; - bytes clientRegionCustomConfigEncrypted = 13; -} diff --git a/proto/QueryRegionListHttpRsp.proto b/proto/QueryRegionListHttpRsp.proto deleted file mode 100644 index 934634f5d..000000000 --- a/proto/QueryRegionListHttpRsp.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "RegionSimpleInfo.proto"; - -message QueryRegionListHttpRsp { - uint32 retcode = 1; - repeated RegionSimpleInfo servers = 2; - bytes clientSecretKey = 5; - bytes clientCustomConfigEncrypted = 6; - bool enableLoginPc = 7; -} diff --git a/proto/RegionInfo.proto b/proto/RegionInfo.proto deleted file mode 100644 index 6cad3cb23..000000000 --- a/proto/RegionInfo.proto +++ /dev/null @@ -1,29 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ResVersionConfig.proto"; - -message RegionInfo { - string ip = 1; - int32 port = 2; - string payCallbackUrl = 3; - string areaType = 7; - string resourceUrl = 8; - string dataUrl = 9; - string feedbackUrl = 10; - string bulletinUrl = 11; - string version = 12; - int32 clientDataVersion = 14; - int32 clientSilenceDataVersion = 18; - string clientDataMd5 = 19; - string clientSilenceDataMd5 = 20; - ResVersionConfig config = 22; - bytes secretKey = 23; - string communityUrl = 24; - string clientVersionSuffix = 26; - string clientSilenceVersionSuffix = 27; - string accountUrl = 31; - string cdkeyUrl = 32; - string privacyUrl = 33; - } diff --git a/proto/RegionSimpleInfo.proto b/proto/RegionSimpleInfo.proto deleted file mode 100644 index 093818fbc..000000000 --- a/proto/RegionSimpleInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message RegionSimpleInfo { - string name = 1; - string title = 2; - string type = 3; - string dispatchUrl = 4; -} diff --git a/proto/Reliquary.proto b/proto/Reliquary.proto deleted file mode 100644 index 2801a5e42..000000000 --- a/proto/Reliquary.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message Reliquary { - uint32 level = 1; - uint32 exp = 2; - uint32 promoteLevel = 3; - uint32 mainPropId = 4; - repeated uint32 appendPropIdList = 5; -} diff --git a/proto/ReliquaryPromoteReq.proto b/proto/ReliquaryPromoteReq.proto deleted file mode 100644 index 1841ed866..000000000 --- a/proto/ReliquaryPromoteReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ReliquaryPromoteReq { - uint64 targetGuid = 1; - uint64 itemGuid = 2; -} diff --git a/proto/ReliquaryPromoteRsp.proto b/proto/ReliquaryPromoteRsp.proto deleted file mode 100644 index 053b51e83..000000000 --- a/proto/ReliquaryPromoteRsp.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ReliquaryPromoteRsp { - int32 retcode = 1; - uint64 targetReliquaryGuid = 2; - uint32 oldPromoteLevel = 3; - uint32 curPromoteLevel = 4; - repeated uint32 oldAppendPropList = 5; - repeated uint32 curAppendPropList = 6; -} diff --git a/proto/ReliquaryUpgradeReq.proto b/proto/ReliquaryUpgradeReq.proto deleted file mode 100644 index 468eeb98a..000000000 --- a/proto/ReliquaryUpgradeReq.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ItemParam.proto"; - -message ReliquaryUpgradeReq { - uint64 targetReliquaryGuid = 1; - repeated uint64 foodReliquaryGuidList = 2; - repeated ItemParam itemParamList = 3; -} diff --git a/proto/ReliquaryUpgradeRsp.proto b/proto/ReliquaryUpgradeRsp.proto deleted file mode 100644 index 4bcdbed46..000000000 --- a/proto/ReliquaryUpgradeRsp.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ReliquaryUpgradeRsp { - int32 retcode = 1; - uint64 targetReliquaryGuid = 2; - uint32 oldLevel = 3; - uint32 curLevel = 4; - uint32 powerUpRate = 5; - repeated uint32 oldAppendPropList = 6; - repeated uint32 curAppendPropList = 7; -} diff --git a/proto/ResVersionConfig.proto b/proto/ResVersionConfig.proto deleted file mode 100644 index 71c053f3f..000000000 --- a/proto/ResVersionConfig.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ResVersionConfig { - int32 version = 1; - string md5 = 2; - string size = 3; - string versionSuffix = 4; - string branch = 5; -} diff --git a/proto/ResinCard.proto b/proto/ResinCard.proto deleted file mode 100644 index 66db1bad8..000000000 --- a/proto/ResinCard.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ItemParam.proto"; - -message ResinCard { - repeated ItemParam baseItemList = 1; - repeated ItemParam perDayItemList = 2; -} diff --git a/proto/ResinChangeNotify.proto b/proto/ResinChangeNotify.proto deleted file mode 100644 index bf938b424..000000000 --- a/proto/ResinChangeNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ResinChangeNotify { - int32 currValue = 1; - int32 nextAddTimestamp = 2; - int32 curBuyCount = 3; -} diff --git a/proto/ResinCostType.proto b/proto/ResinCostType.proto deleted file mode 100644 index 1c9ac3ff3..000000000 --- a/proto/ResinCostType.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum ResinCostType { - CostNone = 0; - CostNormal = 1; - CostCondense = 2; - CostReunionPrivilege = 3; - CostOpActivity = 4; - CostMaterial = 5; -} diff --git a/proto/Route.proto b/proto/Route.proto deleted file mode 100644 index 3394a9970..000000000 --- a/proto/Route.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "RoutePoint.proto"; - -message Route { - repeated RoutePoint routePoints = 1; - uint32 routeType = 2; -} diff --git a/proto/RoutePoint.proto b/proto/RoutePoint.proto deleted file mode 100644 index f4cb198be..000000000 --- a/proto/RoutePoint.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MathQuaternion.proto"; -import "Vector.proto"; - -message RoutePoint { - Vector position = 1; - oneof moveParams { - float velocity = 11; - float time = 12; - } - oneof rotateParams { - Vector rotation = 21; - MathQuaternion rotationSpeed = 22; - MathQuaternion axisSpeed = 23; - } -} diff --git a/proto/SceneAreaWeatherNotify.proto b/proto/SceneAreaWeatherNotify.proto deleted file mode 100644 index 4d26db635..000000000 --- a/proto/SceneAreaWeatherNotify.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SceneAreaWeatherNotify { - uint32 weatherGadgetId = 1; - map weatherValueMap = 2; - uint32 weatherAreaId = 3; - uint32 climateType = 4; - float transDuration = 5; -} diff --git a/proto/SceneAvatarInfo.proto b/proto/SceneAvatarInfo.proto deleted file mode 100644 index 5ce71c9f5..000000000 --- a/proto/SceneAvatarInfo.proto +++ /dev/null @@ -1,28 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "SceneReliquaryInfo.proto"; -import "SceneWeaponInfo.proto"; -import "ServerBuff.proto"; - -message SceneAvatarInfo { - uint32 playerId = 1; - uint32 avatarId = 2; - uint64 guid = 3; - uint32 peerId = 4; - repeated uint32 equipIdList = 5; - uint32 skillDepotId = 6; - repeated uint32 talentIdList = 7; - SceneWeaponInfo weapon = 8; - repeated SceneReliquaryInfo reliquaryList = 9; - uint32 coreProudSkillLevel = 11; - repeated uint32 inherentProudSkillList = 12; - map skillLevelMap = 13; - map proudSkillExtraLevelMap = 14; - repeated ServerBuff serverBuffList = 15; - repeated uint32 teamResonanceList = 16; - uint32 wearingFlycloakId = 17; - uint32 bornTime = 18; - uint32 costumeId = 19; -} diff --git a/proto/SceneEntityAiInfo.proto b/proto/SceneEntityAiInfo.proto deleted file mode 100644 index b4754bd11..000000000 --- a/proto/SceneEntityAiInfo.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ServantInfo.proto"; -import "Vector.proto"; - -message SceneEntityAiInfo { - bool isAiOpen = 1; - Vector bornPos = 2; - map skillCdMap = 3; - ServantInfo servantInfo = 4; - map aiThreatMap = 5; - map skillGroupCdMap = 6; - uint32 curTactic = 7; -} diff --git a/proto/SceneEntityAppearNotify.proto b/proto/SceneEntityAppearNotify.proto deleted file mode 100644 index 0694f1676..000000000 --- a/proto/SceneEntityAppearNotify.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "SceneEntityInfo.proto"; -import "VisionType.proto"; - -message SceneEntityAppearNotify { - repeated SceneEntityInfo entityList = 1; - VisionType appearType = 2; - uint32 param = 3; -} diff --git a/proto/SceneEntityDisappearNotify.proto b/proto/SceneEntityDisappearNotify.proto deleted file mode 100644 index 02871b5a4..000000000 --- a/proto/SceneEntityDisappearNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "VisionType.proto"; - -message SceneEntityDisappearNotify { - repeated uint32 entityList = 1; - VisionType disappearType = 2; -} diff --git a/proto/SceneEntityInfo.proto b/proto/SceneEntityInfo.proto deleted file mode 100644 index d79fe4f58..000000000 --- a/proto/SceneEntityInfo.proto +++ /dev/null @@ -1,39 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AnimatorParameterValueInfoPair.proto"; -import "EntityAuthorityInfo.proto"; -import "EntityClientData.proto"; -import "EntityEnvironmentInfo.proto"; -import "FightPropPair.proto"; -import "MotionInfo.proto"; -import "PropPair.proto"; -import "ProtEntityType.proto"; -import "SceneAvatarInfo.proto"; -import "SceneGadgetInfo.proto"; -import "SceneMonsterInfo.proto"; -import "SceneNpcInfo.proto"; - -message SceneEntityInfo { - ProtEntityType entityType = 1; - uint32 entityId = 2; - string name = 3; - MotionInfo motionInfo = 4; - repeated PropPair propList = 5; - repeated FightPropPair fightPropList = 6; - uint32 lifeState = 7; - repeated AnimatorParameterValueInfoPair animatorParaList = 9; - oneof entity { - SceneAvatarInfo avatar = 10; - SceneMonsterInfo monster = 11; - SceneNpcInfo npc = 12; - SceneGadgetInfo gadget = 13; - } - uint32 lastMoveSceneTimeMs = 17; - uint32 lastMoveReliableSeq = 18; - EntityClientData entityClientData = 19; - repeated EntityEnvironmentInfo entityEnvironmentInfoList = 20; - EntityAuthorityInfo entityAuthorityInfo = 21; - repeated string tagList = 22; -} diff --git a/proto/SceneEntityMoveNotify.proto b/proto/SceneEntityMoveNotify.proto deleted file mode 100644 index 8e5016d75..000000000 --- a/proto/SceneEntityMoveNotify.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MotionInfo.proto"; - -message SceneEntityMoveNotify { - uint32 entityId = 1; - MotionInfo motionInfo = 2; - uint32 sceneTime = 3; - uint32 reliableSeq = 4; -} diff --git a/proto/SceneForceUnlockNotify.proto b/proto/SceneForceUnlockNotify.proto deleted file mode 100644 index c78e2dd61..000000000 --- a/proto/SceneForceUnlockNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SceneForceUnlockNotify { - repeated uint32 forceIdList = 1; - bool isAdd = 2; -} diff --git a/proto/SceneGadgetInfo.proto b/proto/SceneGadgetInfo.proto deleted file mode 100644 index b4430fa0c..000000000 --- a/proto/SceneGadgetInfo.proto +++ /dev/null @@ -1,43 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "GadgetBornType.proto"; -import "GadgetClientParam.proto"; -import "GadgetPlayInfo.proto"; -import "Item.proto"; -import "PlatformInfo.proto"; - -message SceneGadgetInfo { - uint32 gadgetId = 1; - uint32 groupId = 2; - uint32 configId = 3; - uint32 ownerEntityId = 4; - GadgetBornType bornType = 5; - uint32 gadgetState = 6; - uint32 gadgetType = 7; - bool isShowCutscene = 8; - uint32 authorityPeerId = 9; - bool isEnableInteract = 10; - uint32 interactId = 11; - Item trifleItem = 12; - uint32 gatherGadget = 13; - uint32 worktop = 14; - GadgetClientParam clientGadget = 15; - uint32 weather = 17; - uint32 abilityGadget = 18; - uint32 statueGadget = 19; - uint32 bossChest = 20; - uint32 blossomChest = 41; - uint32 mpPlayReward = 42; - uint32 generalReward = 43; - uint32 offeringInfo = 44; - uint32 foundationInfo = 45; - uint32 markFlag = 21; - uint32 propOwnerEntityId = 22; - PlatformInfo platform = 23; - repeated uint32 interactUidList = 24; - uint32 draftId = 25; - uint32 gadgetTalkState = 26; - GadgetPlayInfo playInfo = 100; -} diff --git a/proto/SceneInitFinishRsp.proto b/proto/SceneInitFinishRsp.proto deleted file mode 100644 index 1dfc6a2a9..000000000 --- a/proto/SceneInitFinishRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SceneInitFinishRsp { - int32 retcode = 1; - uint32 enterSceneToken = 2; -} diff --git a/proto/SceneKickPlayerNotify.proto b/proto/SceneKickPlayerNotify.proto deleted file mode 100644 index 6a400ae6f..000000000 --- a/proto/SceneKickPlayerNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SceneKickPlayerNotify { - uint32 kickerUid = 1; - uint32 targetUid = 2; -} diff --git a/proto/SceneKickPlayerReq.proto b/proto/SceneKickPlayerReq.proto deleted file mode 100644 index fe7e371b7..000000000 --- a/proto/SceneKickPlayerReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SceneKickPlayerReq { - uint32 targetUid = 1; -} diff --git a/proto/SceneKickPlayerRsp.proto b/proto/SceneKickPlayerRsp.proto deleted file mode 100644 index 81100890d..000000000 --- a/proto/SceneKickPlayerRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SceneKickPlayerRsp { - int32 retcode = 1; - uint32 targetUid = 2; -} diff --git a/proto/SceneMonsterInfo.proto b/proto/SceneMonsterInfo.proto deleted file mode 100644 index f96c6c202..000000000 --- a/proto/SceneMonsterInfo.proto +++ /dev/null @@ -1,30 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "MonsterBornType.proto"; -import "MonsterRoute.proto"; -import "SceneWeaponInfo.proto"; - -message SceneMonsterInfo { - uint32 monsterId = 1; - uint32 groupId = 2; - uint32 configId = 3; - SceneWeaponInfo weaponList = 4; - uint32 authorityPeerId = 5; - repeated uint32 affixList = 6; - bool isElite = 7; - uint32 ownerEntityId = 8; - uint32 summonedTag = 9; - map summonTagMap = 10; - uint32 poseId = 11; - MonsterBornType bornType = 12; - uint32 blockId = 13; - uint32 markFlag = 14; - uint32 titleId = 15; - uint32 specialNameId = 16; - uint32 attackTargetId = 17; - MonsterRoute monsterRoute = 18; - uint32 aiConfigId = 19; - uint32 unk1 = 21; -} diff --git a/proto/SceneNpcInfo.proto b/proto/SceneNpcInfo.proto deleted file mode 100644 index 22e811801..000000000 --- a/proto/SceneNpcInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SceneNpcInfo { - uint32 npcId = 1; - uint32 roomId = 2; - uint32 parentQuestId = 3; - uint32 blockId = 4; -} diff --git a/proto/ScenePlayerInfo.proto b/proto/ScenePlayerInfo.proto deleted file mode 100644 index d1dae174f..000000000 --- a/proto/ScenePlayerInfo.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "OnlinePlayerInfo.proto"; - -message ScenePlayerInfo { - uint32 uid = 1; - uint32 peerId = 2; - string name = 3; - bool isConnected = 4; - uint32 sceneId = 5; - OnlinePlayerInfo onlinePlayerInfo = 6; -} diff --git a/proto/ScenePlayerInfoNotify.proto b/proto/ScenePlayerInfoNotify.proto deleted file mode 100644 index 2c10873a5..000000000 --- a/proto/ScenePlayerInfoNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ScenePlayerInfo.proto"; - -message ScenePlayerInfoNotify { - repeated ScenePlayerInfo playerInfoList = 1; -} diff --git a/proto/ScenePlayerLocationNotify.proto b/proto/ScenePlayerLocationNotify.proto deleted file mode 100644 index 6eccf373b..000000000 --- a/proto/ScenePlayerLocationNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PlayerLocationInfo.proto"; - -message ScenePlayerLocationNotify { - uint32 sceneId = 1; - repeated PlayerLocationInfo playerLocList = 2; -} diff --git a/proto/SceneReliquaryInfo.proto b/proto/SceneReliquaryInfo.proto deleted file mode 100644 index 122ca88b2..000000000 --- a/proto/SceneReliquaryInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SceneReliquaryInfo { - uint32 itemId = 1; - uint64 guid = 2; - uint32 level = 3; - uint32 promoteLevel = 4; -} diff --git a/proto/SceneTeamAvatar.proto b/proto/SceneTeamAvatar.proto deleted file mode 100644 index 0b4683910..000000000 --- a/proto/SceneTeamAvatar.proto +++ /dev/null @@ -1,29 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilityControlBlock.proto"; -import "AbilitySyncStateInfo.proto"; -import "AvatarInfo.proto"; -import "SceneAvatarInfo.proto"; -import "SceneEntityInfo.proto"; -import "ServerBuff.proto"; - -message SceneTeamAvatar { - uint32 playerId = 1; - uint64 avatarGuid = 2; - uint32 sceneId = 3; - uint32 entityId = 4; - AvatarInfo avatarInfo = 5; - SceneAvatarInfo sceneAvatarInfo = 6; - AbilitySyncStateInfo avatarAbilityInfo = 7; - repeated ServerBuff serverBuffList = 8; - SceneEntityInfo sceneEntityInfo = 9; - uint64 weaponGuid = 10; - uint32 weaponEntityId = 11; - AbilitySyncStateInfo weaponAbilityInfo = 12; - AbilityControlBlock abilityControlBlock = 13; - bool isReconnect = 14; - bool isPlayerCurAvatar = 15; - bool isOnScene = 16; -} diff --git a/proto/SceneTeamUpdateNotify.proto b/proto/SceneTeamUpdateNotify.proto deleted file mode 100644 index 6aa586ccc..000000000 --- a/proto/SceneTeamUpdateNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "SceneTeamAvatar.proto"; - -message SceneTeamUpdateNotify { - repeated SceneTeamAvatar sceneTeamAvatarList = 1; - bool isInMp = 3; -} diff --git a/proto/SceneTimeNotify.proto b/proto/SceneTimeNotify.proto deleted file mode 100644 index cafe00ad7..000000000 --- a/proto/SceneTimeNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SceneTimeNotify { - uint32 sceneId = 1; - bool isPaused = 2; - uint64 sceneTime = 3; -} diff --git a/proto/SceneUnlockInfo.proto b/proto/SceneUnlockInfo.proto deleted file mode 100644 index d4dfa2f4f..000000000 --- a/proto/SceneUnlockInfo.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SceneUnlockInfo { - uint32 sceneId = 1; - bool isLocked = 2; - repeated uint32 sceneTagIdList = 3; -} diff --git a/proto/SceneUnlockInfoNotify.proto b/proto/SceneUnlockInfoNotify.proto deleted file mode 100644 index 28be03d6c..000000000 --- a/proto/SceneUnlockInfoNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "SceneUnlockInfo.proto"; - -message SceneUnlockInfoNotify { - repeated SceneUnlockInfo unlockInfos = 1; -} diff --git a/proto/SceneWeaponInfo.proto b/proto/SceneWeaponInfo.proto deleted file mode 100644 index 5b823b9f5..000000000 --- a/proto/SceneWeaponInfo.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilitySyncStateInfo.proto"; - -message SceneWeaponInfo { - uint32 entityId = 1; - uint32 gadgetId = 2; - uint32 itemId = 3; - uint64 guid = 4; - uint32 level = 5; - uint32 promoteLevel = 6; - AbilitySyncStateInfo abilityInfo = 7; - map affixMap = 8; -} diff --git a/proto/ServantInfo.proto b/proto/ServantInfo.proto deleted file mode 100644 index e4c04e33f..000000000 --- a/proto/ServantInfo.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ServantInfo { - uint32 masterEntityId = 1; - uint32 bornSlotIndex = 2; -} diff --git a/proto/ServerBuff.proto b/proto/ServerBuff.proto deleted file mode 100644 index 0de4768e2..000000000 --- a/proto/ServerBuff.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ServerBuff { - uint32 serverBuffUid = 1; - uint32 serverBuffId = 2; - uint32 serverBuffType = 3; - uint32 instancedModifierId = 4; - repeated uint32 doneOnaddedActionList = 5; - bool isOnaddedActionAllow = 6; -} diff --git a/proto/ServerTimeNotify.proto b/proto/ServerTimeNotify.proto deleted file mode 100644 index 9452ef804..000000000 --- a/proto/ServerTimeNotify.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ServerTimeNotify { - uint64 serverTime = 1; -} diff --git a/proto/SetEquipLockStateReq.proto b/proto/SetEquipLockStateReq.proto deleted file mode 100644 index 55f3f9373..000000000 --- a/proto/SetEquipLockStateReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetEquipLockStateReq { - uint64 targetEquipGuid = 1; - bool isLocked = 2; -} diff --git a/proto/SetEquipLockStateRsp.proto b/proto/SetEquipLockStateRsp.proto deleted file mode 100644 index fe70b22dd..000000000 --- a/proto/SetEquipLockStateRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetEquipLockStateRsp { - int32 retcode = 1; - uint64 targetEquipGuid = 2; - bool isLocked = 3; -} diff --git a/proto/SetNameCardReq.proto b/proto/SetNameCardReq.proto deleted file mode 100644 index 4452d3bf6..000000000 --- a/proto/SetNameCardReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetNameCardReq { - uint32 nameCardId = 1; -} diff --git a/proto/SetNameCardRsp.proto b/proto/SetNameCardRsp.proto deleted file mode 100644 index 821c019cd..000000000 --- a/proto/SetNameCardRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetNameCardRsp { - int32 retcode = 1; - uint32 nameCardId = 2; -} diff --git a/proto/SetPlayerBornDataReq.proto b/proto/SetPlayerBornDataReq.proto deleted file mode 100644 index 56b6fd3cf..000000000 --- a/proto/SetPlayerBornDataReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetPlayerBornDataReq { - uint32 avatarId = 1; - string nickName = 2; -} diff --git a/proto/SetPlayerHeadImageReq.proto b/proto/SetPlayerHeadImageReq.proto deleted file mode 100644 index 90016ced6..000000000 --- a/proto/SetPlayerHeadImageReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetPlayerHeadImageReq { - uint32 avatarId = 1; -} diff --git a/proto/SetPlayerHeadImageRsp.proto b/proto/SetPlayerHeadImageRsp.proto deleted file mode 100644 index 6a2ea445f..000000000 --- a/proto/SetPlayerHeadImageRsp.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "HeadImage.proto"; - -message SetPlayerHeadImageRsp { - int32 retcode = 1; - HeadImage avatar = 3; -} diff --git a/proto/SetPlayerNameReq.proto b/proto/SetPlayerNameReq.proto deleted file mode 100644 index 558eb0fbd..000000000 --- a/proto/SetPlayerNameReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetPlayerNameReq { - string nickName = 1; -} diff --git a/proto/SetPlayerNameRsp.proto b/proto/SetPlayerNameRsp.proto deleted file mode 100644 index b4b02e63f..000000000 --- a/proto/SetPlayerNameRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetPlayerNameRsp { - int32 retcode = 1; - string nickName = 2; -} diff --git a/proto/SetPlayerPropReq.proto b/proto/SetPlayerPropReq.proto deleted file mode 100644 index d08c2a50f..000000000 --- a/proto/SetPlayerPropReq.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PropValue.proto"; - -message SetPlayerPropReq { - repeated PropValue propList = 1; -} diff --git a/proto/SetPlayerPropRsp.proto b/proto/SetPlayerPropRsp.proto deleted file mode 100644 index 62d231e96..000000000 --- a/proto/SetPlayerPropRsp.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetPlayerPropRsp { - int32 retcode = 1; -} diff --git a/proto/SetPlayerSignatureReq.proto b/proto/SetPlayerSignatureReq.proto deleted file mode 100644 index 595345bcd..000000000 --- a/proto/SetPlayerSignatureReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetPlayerSignatureReq { - string signature = 1; -} diff --git a/proto/SetPlayerSignatureRsp.proto b/proto/SetPlayerSignatureRsp.proto deleted file mode 100644 index ca09cd1b2..000000000 --- a/proto/SetPlayerSignatureRsp.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetPlayerSignatureRsp { - int32 retcode = 1; - string signature = 2; -} diff --git a/proto/SetUpAvatarTeamReq.proto b/proto/SetUpAvatarTeamReq.proto deleted file mode 100644 index b950cb25a..000000000 --- a/proto/SetUpAvatarTeamReq.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetUpAvatarTeamReq { - uint32 teamId = 1; - repeated uint64 avatarTeamGuidList = 2; - uint64 curAvatarGuid = 3; -} diff --git a/proto/SetUpAvatarTeamRsp.proto b/proto/SetUpAvatarTeamRsp.proto deleted file mode 100644 index fdb634b8d..000000000 --- a/proto/SetUpAvatarTeamRsp.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SetUpAvatarTeamRsp { - int32 retcode = 1; - uint32 teamId = 2; - repeated uint64 avatarTeamGuidList = 3; - uint64 curAvatarGuid = 4; -} diff --git a/proto/Shop.proto b/proto/Shop.proto deleted file mode 100644 index 2172757b8..000000000 --- a/proto/Shop.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ShopCardProduct.proto"; -import "ShopGoods.proto"; -import "ShopMcoinProduct.proto"; - -message Shop { - uint32 shopType = 1; - repeated ShopGoods goodsList = 2; - repeated ShopMcoinProduct mcoinProductList = 3; - repeated ShopCardProduct cardProductList = 4; - uint32 nextRefreshTime = 6; - uint32 cityId = 7; - uint32 cityReputationLevel = 8; -} diff --git a/proto/ShopCardProduct.proto b/proto/ShopCardProduct.proto deleted file mode 100644 index 88b95f7b6..000000000 --- a/proto/ShopCardProduct.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ResinCard.proto"; - -message ShopCardProduct { - string productId = 1; - string priceTier = 2; - uint32 mcoinBase = 3; - uint32 hcoinPerDay = 4; - uint32 days = 5; - uint32 remainRewardDays = 6; - uint32 cardProductType = 7; - oneof extraCardData { - ResinCard resinCard = 101; - } -} diff --git a/proto/ShopGoods.proto b/proto/ShopGoods.proto deleted file mode 100644 index 672578c54..000000000 --- a/proto/ShopGoods.proto +++ /dev/null @@ -1,24 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ItemParam.proto"; - -message ShopGoods { - uint32 goodsId = 1; - ItemParam goodsItem = 2; - uint32 scoin = 3; - uint32 hcoin = 4; - repeated ItemParam costItemList = 5; - uint32 boughtNum = 6; - uint32 buyLimit = 7; - uint32 beginTime = 8; - uint32 endTime = 9; - uint32 nextRefreshTime = 10; - uint32 minLevel = 11; - uint32 maxLevel = 12; - repeated uint32 preGoodsIdList = 13; - uint32 mcoin = 14; - uint32 disableType = 15; - uint32 secondarySheetId = 16; -} diff --git a/proto/ShopGoodsDisableType.proto b/proto/ShopGoodsDisableType.proto deleted file mode 100644 index 2c1b19bd0..000000000 --- a/proto/ShopGoodsDisableType.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum ShopGoodsDisableType { - ShopGoodsDisableNone = 0; - ShopGoodsDisableTalentFull = 1; - ShopGoodsDisableFurnitureFormulaUnlocked = 2; -} diff --git a/proto/ShopMcoinProduct.proto b/proto/ShopMcoinProduct.proto deleted file mode 100644 index 53f3dcbf3..000000000 --- a/proto/ShopMcoinProduct.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ShopMcoinProduct { - string productId = 1; - string priceTier = 2; - uint32 mcoinBase = 3; - uint32 mcoinNonFirst = 4; - uint32 mcoinFirst = 5; - uint32 boughtNum = 6; - bool isAudit = 7; -} diff --git a/proto/ShortAbilityHashPair.proto b/proto/ShortAbilityHashPair.proto deleted file mode 100644 index 0eaf10422..000000000 --- a/proto/ShortAbilityHashPair.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message ShortAbilityHashPair { - int32 abilityNameHash = 1; - int32 abilityConfigHash = 2; -} diff --git a/proto/SocialDetail.proto b/proto/SocialDetail.proto deleted file mode 100644 index bc97aa184..000000000 --- a/proto/SocialDetail.proto +++ /dev/null @@ -1,34 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Birthday.proto"; -import "FriendEnterHomeOption.proto"; -import "HeadImage.proto"; -import "SocialShowAvatarInfo.proto"; - -message SocialDetail { - uint32 uid = 1; - string nickname = 2; - uint32 level = 3; - string signature = 5; - Birthday birthday = 6; - uint32 worldLevel = 7; - uint32 unk1 = 9; - //FriendOnlineState onlineState = 10; - //bool isMpModeAvailable = 10; - bool isFriend = 11; - uint32 unk3 = 12; - uint32 lastActiveTime = 13; - uint32 nameCardId = 14; - bool isInBlacklist = 15; - bool isChatNoDisturb = 16; - string remarkName = 17; - uint32 finishAchievementNum = 18; - uint32 towerFloorIndex = 19; - uint32 towerLevelIndex = 20; - bool isShowAvatar = 21; - repeated SocialShowAvatarInfo showAvatarInfoList = 22; - FriendEnterHomeOption friendEnterHomeOption = 23; - HeadImage avatar = 25; -} diff --git a/proto/SocialShowAvatarInfo.proto b/proto/SocialShowAvatarInfo.proto deleted file mode 100644 index 921cb298a..000000000 --- a/proto/SocialShowAvatarInfo.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SocialShowAvatarInfo { - uint32 avatarId = 1; - uint32 level = 2; -} diff --git a/proto/StoreItemChangeNotify.proto b/proto/StoreItemChangeNotify.proto deleted file mode 100644 index 270d5e46f..000000000 --- a/proto/StoreItemChangeNotify.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Item.proto"; -import "StoreType.proto"; - -message StoreItemChangeNotify { - StoreType storeType = 1; - repeated Item itemList = 2; -} diff --git a/proto/StoreItemDelNotify.proto b/proto/StoreItemDelNotify.proto deleted file mode 100644 index 69a70a8e7..000000000 --- a/proto/StoreItemDelNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "StoreType.proto"; - -message StoreItemDelNotify { - StoreType storeType = 1; - repeated uint64 guidList = 2; -} diff --git a/proto/StoreType.proto b/proto/StoreType.proto deleted file mode 100644 index 78e35b4c1..000000000 --- a/proto/StoreType.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum StoreType { - StoreNone = 0; - StorePack = 1; - StoreDepot = 2; -} diff --git a/proto/StoreWeightLimitNotify.proto b/proto/StoreWeightLimitNotify.proto deleted file mode 100644 index 236bacd59..000000000 --- a/proto/StoreWeightLimitNotify.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "StoreType.proto"; - -message StoreWeightLimitNotify { - StoreType storeType = 1; - uint32 weightLimit = 3; - uint32 materialCountLimit = 4; - uint32 weaponCountLimit = 5; - uint32 reliquaryCountLimit = 6; - uint32 furnitureCountLimit = 7; -} diff --git a/proto/SyncScenePlayTeamEntityNotify.proto b/proto/SyncScenePlayTeamEntityNotify.proto deleted file mode 100644 index 1ffe7be6a..000000000 --- a/proto/SyncScenePlayTeamEntityNotify.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SyncScenePlayTeamEntityNotify { - uint32 sceneId = 1; - //repeated PlayTeamEntityInfo entityInfoList = 2; -} diff --git a/proto/SyncTeamEntityNotify.proto b/proto/SyncTeamEntityNotify.proto deleted file mode 100644 index 1555e37e9..000000000 --- a/proto/SyncTeamEntityNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "TeamEntityInfo.proto"; - -message SyncTeamEntityNotify { - uint32 sceneId = 1; - repeated TeamEntityInfo teamEntityInfoList = 2; -} diff --git a/proto/SystemHint.proto b/proto/SystemHint.proto deleted file mode 100644 index 2bc1f19ef..000000000 --- a/proto/SystemHint.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message SystemHint { - uint32 type = 1; -} diff --git a/proto/TakeoffEquipReq.proto b/proto/TakeoffEquipReq.proto deleted file mode 100644 index bcd6278af..000000000 --- a/proto/TakeoffEquipReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message TakeoffEquipReq { - uint64 avatarGuid = 1; - uint32 slot = 2; -} diff --git a/proto/TakeoffEquipRsp.proto b/proto/TakeoffEquipRsp.proto deleted file mode 100644 index ded14965d..000000000 --- a/proto/TakeoffEquipRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message TakeoffEquipRsp { - int32 retcode = 1; - uint64 avatarGuid = 2; - uint32 slot = 3; -} diff --git a/proto/TeamEnterSceneInfo.proto b/proto/TeamEnterSceneInfo.proto deleted file mode 100644 index d0144a81e..000000000 --- a/proto/TeamEnterSceneInfo.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilitySyncStateInfo.proto"; - -message TeamEnterSceneInfo { - uint32 teamEntityId = 1; - AbilitySyncStateInfo teamAbilityInfo = 2; - AbilitySyncStateInfo unk = 3; -} diff --git a/proto/TeamEntityInfo.proto b/proto/TeamEntityInfo.proto deleted file mode 100644 index 5f0240ae5..000000000 --- a/proto/TeamEntityInfo.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AbilitySyncStateInfo.proto"; - -message TeamEntityInfo { - uint32 teamEntityId = 1; - uint32 authorityPeerId = 2; - AbilitySyncStateInfo teamAbilityInfo = 3; -} diff --git a/proto/TeamResonanceChangeNotify.proto b/proto/TeamResonanceChangeNotify.proto deleted file mode 100644 index 592fc8a98..000000000 --- a/proto/TeamResonanceChangeNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "AvatarTeamResonanceInfo.proto"; - -message TeamResonanceChangeNotify { - repeated AvatarTeamResonanceInfo infoList = 1; -} diff --git a/proto/TowerAllDataRsp.proto b/proto/TowerAllDataRsp.proto deleted file mode 100644 index 7fde18c16..000000000 --- a/proto/TowerAllDataRsp.proto +++ /dev/null @@ -1,27 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "TowerCurLevelRecord.proto"; -import "TowerFloorRecord.proto"; -import "TowerMonthlyBrief.proto"; - -message TowerAllDataRsp { - uint32 towerScheduleId = 1; - repeated TowerFloorRecord towerFloorRecordList = 2; - uint32 dailyFloorId = 3; - uint32 dailyLevelIndex = 4; - TowerCurLevelRecord curLevelRecord = 5; - uint32 nextScheduleChangeTime = 6; - map floorOpenTimeMap = 7; - bool isFirstInteract = 8; - TowerMonthlyBrief monthlyBrief = 9; - uint32 skipToFloorIndex = 10; - uint32 commemorativeRewardId = 11; - map skipFloorGrantedRewardItemMap = 12; - uint32 validTowerRecordNum = 13; - int32 retcode = 14; - bool isFinishedEntranceFloor = 15; - uint32 scheduleStartTime = 16; - TowerMonthlyBrief lastScheduleMonthlyBrief = 17; -} diff --git a/proto/TowerCurLevelRecord.proto b/proto/TowerCurLevelRecord.proto deleted file mode 100644 index 6c4a282f5..000000000 --- a/proto/TowerCurLevelRecord.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "TowerTeam.proto"; - -message TowerCurLevelRecord { - uint32 curFloorId = 1; - uint32 curLevelIndex = 2; - repeated TowerTeam towerTeamList = 3; - repeated uint32 buffIdList = 4; - bool isEmpty = 5; -} diff --git a/proto/TowerFloorRecord.proto b/proto/TowerFloorRecord.proto deleted file mode 100644 index 7096d2b29..000000000 --- a/proto/TowerFloorRecord.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "TowerLevelRecord.proto"; - -message TowerFloorRecord { - uint32 floorId = 1; - map passedLevelMap = 2; - uint32 floorStarRewardProgress = 3; - repeated TowerLevelRecord passedLevelRecordList = 4; -} diff --git a/proto/TowerLevelRecord.proto b/proto/TowerLevelRecord.proto deleted file mode 100644 index e0e5d95c1..000000000 --- a/proto/TowerLevelRecord.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message TowerLevelRecord { - uint32 levelId = 1; - repeated uint32 satisfiedCondList = 2; -} diff --git a/proto/TowerMonthlyBrief.proto b/proto/TowerMonthlyBrief.proto deleted file mode 100644 index 69b0b90de..000000000 --- a/proto/TowerMonthlyBrief.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message TowerMonthlyBrief { - uint32 towerScheduleId = 1; - uint32 bestFloorIndex = 2; - uint32 bestLevelIndex = 3; - uint32 totalStarCount = 4; -} diff --git a/proto/TowerTeam.proto b/proto/TowerTeam.proto deleted file mode 100644 index a478afe7e..000000000 --- a/proto/TowerTeam.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message TowerTeam { - uint32 towerTeamId = 1; - repeated uint64 avatarGuidList = 2; -} diff --git a/proto/TrackingIOInfo.proto b/proto/TrackingIOInfo.proto deleted file mode 100644 index 0b618cb99..000000000 --- a/proto/TrackingIOInfo.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message TrackingIOInfo { - string appid = 1; - string deviceid = 2; - string mac = 3; - string rydevicetype = 4; - string clientTz = 5; - string currentCaid = 6; - string cachedCaid = 7; -} diff --git a/proto/TrialAvatarGrantRecord.proto b/proto/TrialAvatarGrantRecord.proto deleted file mode 100644 index 45dd737c4..000000000 --- a/proto/TrialAvatarGrantRecord.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message TrialAvatarGrantRecord { - uint32 grantReason = 1; - uint32 fromParentQuestId = 2; -} diff --git a/proto/TrialAvatarInfo.proto b/proto/TrialAvatarInfo.proto deleted file mode 100644 index 867c72369..000000000 --- a/proto/TrialAvatarInfo.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "Item.proto"; -import "TrialAvatarGrantRecord.proto"; - -message TrialAvatarInfo { - uint32 trialAvatarId = 1; - repeated Item trialEquipList = 2; - TrialAvatarGrantRecord grantRecord = 3; -} diff --git a/proto/UnionCmd.proto b/proto/UnionCmd.proto deleted file mode 100644 index ed4747651..000000000 --- a/proto/UnionCmd.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message UnionCmd { - uint32 messageId = 1; - bytes body = 2; -} diff --git a/proto/UnionCmdNotify.proto b/proto/UnionCmdNotify.proto deleted file mode 100644 index 04ff8d910..000000000 --- a/proto/UnionCmdNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "UnionCmd.proto"; - -message UnionCmdNotify { - repeated UnionCmd cmdList = 1; -} diff --git a/proto/UnlockAvatarTalentReq.proto b/proto/UnlockAvatarTalentReq.proto deleted file mode 100644 index b0cc42086..000000000 --- a/proto/UnlockAvatarTalentReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message UnlockAvatarTalentReq { - uint64 avatarGuid = 1; - uint32 talentId = 2; -} diff --git a/proto/UnlockAvatarTalentRsp.proto b/proto/UnlockAvatarTalentRsp.proto deleted file mode 100644 index 8bb323484..000000000 --- a/proto/UnlockAvatarTalentRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message UnlockAvatarTalentRsp { - int32 retcode = 1; - uint64 avatarGuid = 2; - uint32 talentId = 3; -} diff --git a/proto/UnlockNameCardNotify.proto b/proto/UnlockNameCardNotify.proto deleted file mode 100644 index 193be0551..000000000 --- a/proto/UnlockNameCardNotify.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message UnlockNameCardNotify { - uint32 nameCardId = 1; -} diff --git a/proto/UseItemReq.proto b/proto/UseItemReq.proto deleted file mode 100644 index 227697ddb..000000000 --- a/proto/UseItemReq.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message UseItemReq { - uint64 guid = 1; - uint32 count = 2; - uint64 targetGuid = 3; - uint32 optionIdx = 4; - bool isEnterMpDungeonTeam = 5; -} diff --git a/proto/UseItemRsp.proto b/proto/UseItemRsp.proto deleted file mode 100644 index 03add18fd..000000000 --- a/proto/UseItemRsp.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message UseItemRsp { - int32 retcode = 1; - uint64 guid = 2; - uint32 itemId = 3; - uint64 targetGuid = 4; - uint32 optionIdx = 5; -} diff --git a/proto/Vector.proto b/proto/Vector.proto deleted file mode 100644 index 562e7436a..000000000 --- a/proto/Vector.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message Vector { - float x = 1; - float y = 2; - float z = 3; -} diff --git a/proto/VisionType.proto b/proto/VisionType.proto deleted file mode 100644 index c3c30492d..000000000 --- a/proto/VisionType.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -enum VisionType { - VisionNone = 0; - VisionMeet = 1; - VisionReborn = 2; - VisionReplace = 3; - VisionWaypointReborn = 4; - VisionMiss = 5; - VisionDie = 6; - VisionGatherEscape = 7; - VisionRefresh = 8; - VisionTransport = 9; - VisionReplaceDie = 10; - VisionReplaceNoNotify = 11; - VisionBorn = 12; - VisionPickup = 13; - VisionRemove = 14; -} diff --git a/proto/Weapon.proto b/proto/Weapon.proto deleted file mode 100644 index e199f58d6..000000000 --- a/proto/Weapon.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message Weapon { - uint32 level = 1; - uint32 exp = 2; - uint32 promoteLevel = 3; - map affixMap = 4; -} diff --git a/proto/WeaponAwakenReq.proto b/proto/WeaponAwakenReq.proto deleted file mode 100644 index 2775c8dbb..000000000 --- a/proto/WeaponAwakenReq.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message WeaponAwakenReq { - uint64 targetWeaponGuid = 1; - uint64 itemGuid = 2; - map affixLevelMap = 3; -} diff --git a/proto/WeaponAwakenRsp.proto b/proto/WeaponAwakenRsp.proto deleted file mode 100644 index 2400cabb2..000000000 --- a/proto/WeaponAwakenRsp.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message WeaponAwakenRsp { - int32 retcode = 1; - uint64 targetWeaponGuid = 2; - uint32 targetWeaponAwakenLevel = 3; - map oldAffixLevelMap = 4; - map curAffixLevelMap = 5; - uint64 avatarGuid = 6; -} diff --git a/proto/WeaponPromoteReq.proto b/proto/WeaponPromoteReq.proto deleted file mode 100644 index dc47477fc..000000000 --- a/proto/WeaponPromoteReq.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message WeaponPromoteReq { - uint64 targetWeaponGuid = 1; -} diff --git a/proto/WeaponPromoteRsp.proto b/proto/WeaponPromoteRsp.proto deleted file mode 100644 index efd7bfb5d..000000000 --- a/proto/WeaponPromoteRsp.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message WeaponPromoteRsp { - int32 retcode = 1; - uint64 targetWeaponGuid = 2; - uint32 oldPromoteLevel = 3; - uint32 curPromoteLevel = 4; -} diff --git a/proto/WeaponUpgradeReq.proto b/proto/WeaponUpgradeReq.proto deleted file mode 100644 index 93e69622b..000000000 --- a/proto/WeaponUpgradeReq.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ItemParam.proto"; - -message WeaponUpgradeReq { - uint64 targetWeaponGuid = 1; - repeated uint64 foodWeaponGuidList = 2; - repeated ItemParam itemParamList = 3; -} diff --git a/proto/WeaponUpgradeRsp.proto b/proto/WeaponUpgradeRsp.proto deleted file mode 100644 index 77a71f24b..000000000 --- a/proto/WeaponUpgradeRsp.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "ItemParam.proto"; - -message WeaponUpgradeRsp { - int32 retcode = 1; - uint64 targetWeaponGuid = 2; - uint32 oldLevel = 3; - uint32 curLevel = 4; - repeated ItemParam itemParamList = 5; -} diff --git a/proto/WearEquipReq.proto b/proto/WearEquipReq.proto deleted file mode 100644 index 805377d4d..000000000 --- a/proto/WearEquipReq.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message WearEquipReq { - uint64 avatarGuid = 1; - uint64 equipGuid = 2; -} diff --git a/proto/WearEquipRsp.proto b/proto/WearEquipRsp.proto deleted file mode 100644 index 61bb36666..000000000 --- a/proto/WearEquipRsp.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message WearEquipRsp { - int32 retcode = 1; - uint64 avatarGuid = 2; - uint64 equipGuid = 3; -} diff --git a/proto/WeeklyBossResinDiscountInfo.proto b/proto/WeeklyBossResinDiscountInfo.proto deleted file mode 100644 index 2c9a85e04..000000000 --- a/proto/WeeklyBossResinDiscountInfo.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message WeeklyBossResinDiscountInfo { - uint32 discountNum = 1; - uint32 discountNumLimit = 2; - uint32 resinCost = 3; - uint32 originalResinCost = 4; -} diff --git a/proto/WorldDataNotify.proto b/proto/WorldDataNotify.proto deleted file mode 100644 index 9bb4e73be..000000000 --- a/proto/WorldDataNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PropValue.proto"; - -message WorldDataNotify { - map worldPropMap = 1; -} diff --git a/proto/WorldPlayerDieNotify.proto b/proto/WorldPlayerDieNotify.proto deleted file mode 100644 index 36ecf0425..000000000 --- a/proto/WorldPlayerDieNotify.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PlayerDieType.proto"; - -message WorldPlayerDieNotify { - PlayerDieType dieType = 1; - uint32 murdererEntityId = 2; - oneof entity { - uint32 monsterId = 3; - uint32 gadgetId = 4; - } -} diff --git a/proto/WorldPlayerInfoNotify.proto b/proto/WorldPlayerInfoNotify.proto deleted file mode 100644 index e9266b666..000000000 --- a/proto/WorldPlayerInfoNotify.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "OnlinePlayerInfo.proto"; - -message WorldPlayerInfoNotify { - repeated OnlinePlayerInfo playerInfoList = 1; - repeated uint32 playerUidList = 2; -} diff --git a/proto/WorldPlayerLocationNotify.proto b/proto/WorldPlayerLocationNotify.proto deleted file mode 100644 index d43efba0c..000000000 --- a/proto/WorldPlayerLocationNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PlayerLocationInfo.proto"; - -message WorldPlayerLocationNotify { - repeated PlayerLocationInfo playerLocList = 1; -} diff --git a/proto/WorldPlayerRTTNotify.proto b/proto/WorldPlayerRTTNotify.proto deleted file mode 100644 index 56474c13e..000000000 --- a/proto/WorldPlayerRTTNotify.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -import "PlayerRTTInfo.proto"; - -message WorldPlayerRTTNotify { - repeated PlayerRTTInfo playerRttList = 1; -} diff --git a/proto/WorldPlayerReviveRsp.proto b/proto/WorldPlayerReviveRsp.proto deleted file mode 100644 index 1c823e8b6..000000000 --- a/proto/WorldPlayerReviveRsp.proto +++ /dev/null @@ -1,7 +0,0 @@ -syntax = "proto3"; - -option java_package = "emu.grasscutter.net.proto"; - -message WorldPlayerReviveRsp { - int32 retcode = 1; -} From b7e79ba48f5c33f8c3705ae39f2ac3ed994cc1a0 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Tue, 19 Apr 2022 10:26:31 -0700 Subject: [PATCH 014/119] Protos --- .gitmodules | 3 +++ Grasscutter-Protos | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 Grasscutter-Protos diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..fbab9b375 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Grasscutter-Protos"] + path = Grasscutter-Protos + url = https://github.com/Melledy/Grasscutter-Protos diff --git a/Grasscutter-Protos b/Grasscutter-Protos new file mode 160000 index 000000000..0537e9cc4 --- /dev/null +++ b/Grasscutter-Protos @@ -0,0 +1 @@ +Subproject commit 0537e9cc4c7856a7c6f88bbbaa908a80c4ee677e From 42260f68a8269ecb0357c1c7ac45e50a14702fa5 Mon Sep 17 00:00:00 2001 From: memetrollsXD Date: Tue, 19 Apr 2022 19:39:54 +0200 Subject: [PATCH 015/119] WIP Restart command - For now disconnects session, preferrably just send PlayerLoginRsp so it does the login sequence all over again --- data/query_cur_region.txt | 2 +- .../grasscutter/commands/PlayerCommands.java | 294 ++++++++++-------- 2 files changed, 169 insertions(+), 127 deletions(-) diff --git a/data/query_cur_region.txt b/data/query_cur_region.txt index 427c13f45..ddef1aff6 100644 --- a/data/query_cur_region.txt +++ b/data/query_cur_region.txt @@ -1 +1 @@ -GpgdCgw0Ny44OS4xNTIuNDcQ1awBGitodHRwczovL29zdXNhb2FzZXJ2ZXIueXVhbnNoZW4uY29tL3JlY2hhcmdlOgNVU0FCOWh0dHBzOi8vYXV0b3BhdGNoaGsueXVhbnNoZW4uY29tL2NsaWVudF9nYW1lX3Jlcy8yLjZfbGl2ZUo8aHR0cHM6Ly9hdXRvcGF0Y2hoay55dWFuc2hlbi5jb20vY2xpZW50X2Rlc2lnbl9kYXRhLzIuNl9saXZlUpIBaHR0cHM6Ly93ZWJzdGF0aWMtc2VhLmhveW92ZXJzZS5jb20veXMvZXZlbnQvaW0tc2VydmljZS9pbmRleC5odG1sP2ltX291dD1mYWxzZSZzaWduX3R5cGU9MiZhdXRoX2FwcGlkPWltX2NjcyZhdXRoa2V5X3Zlcj0xJndpbl9kaXJlY3Rpb249cG9ydHJhaXRiCDIuNl9saXZlcNnsmgOQAdnsmgOaAVx7InJlbW90ZU5hbWUiOiAiZGF0YV92ZXJzaW9ucyIsICJtZDUiOiAiMWE0NDVhZTQ4ZmJkYmUwMzgzMTJiZTg2OGYyODEzZDIiLCAiZmlsZVNpemUiOiA0NDE1faIBW3sicmVtb3RlTmFtZSI6ICJkYXRhX3ZlcnNpb25zIiwgIm1kNSI6ICIxNzU0MmM3YmJhYzQ5YjkxMWRlMjlhOTYyNzU0YmQ2MSIsICJmaWxlU2l6ZSI6IDUxNH2yAYEGCL23mQMa4AV7InJlbW90ZU5hbWUiOiAicmVzX3ZlcnNpb25zX2V4dGVybmFsIiwgIm1kNSI6ICI5ZjA5MmNhMTMwNjdjYWU0MzEzNDkzZWVkM2QzZTlhZSIsICJmaWxlU2l6ZSI6IDUyNjk2Nn0NCnsicmVtb3RlTmFtZSI6ICJyZXNfdmVyc2lvbnNfbWVkaXVtIiwgIm1kNSI6ICI3Yzk0MmU3MDRhODA0YzIxMjJmYzYzZWU5MjhlNzE0OCIsICJmaWxlU2l6ZSI6IDI4NTU1MH0NCnsicmVtb3RlTmFtZSI6ICJyZXNfdmVyc2lvbnNfc3RyZWFtaW5nIiwgIm1kNSI6ICJlMzVmNmQ4NTNkMDRjZTAyMmFjN2MzNmQ0M2Y0MGU3YyIsICJmaWxlU2l6ZSI6IDEyMjAzNn0NCnsicmVtb3RlTmFtZSI6ICJyZWxlYXNlX3Jlc192ZXJzaW9uc19leHRlcm5hbCIsICJtZDUiOiAiODc2NGIwZjJlZDgxNWNkNDQzMGUwODVjNDYxYTZmNGQiLCAiZmlsZVNpemUiOiA1MjY5NjZ9DQp7InJlbW90ZU5hbWUiOiAicmVsZWFzZV9yZXNfdmVyc2lvbnNfbWVkaXVtIiwgIm1kNSI6ICIxYmJlMzc0YzE2YmZmNDU5MTU5OWMyMTk3MzQyMDM0OCIsICJmaWxlU2l6ZSI6IDI4NTU1MH0NCnsicmVtb3RlTmFtZSI6ICJyZWxlYXNlX3Jlc192ZXJzaW9uc19zdHJlYW1pbmciLCAibWQ1IjogIjcyZmE3ZmY2NmQ1MTRmY2JhMzRhZjAwN2YyYjljMmY4IiwgImZpbGVTaXplIjogMTIyMDM2fQ0KeyJyZW1vdGVOYW1lIjogImJhc2VfcmV2aXNpb24iLCAibWQ1IjogImZiZmE2ZDZlMDcwMmQxYzc5ZTA1NjRmYjI4NjdlNzM4IiwgImZpbGVTaXplIjogMTh9IgEwKgo3YTM0YTM2YTZlMggyLjZfbGl2ZboBnBBFYzJiEAAAAJGCjvgHMrTsh3MtgsH5frMACAAAw460k//m++1MxIEXUCck/33uRkbXh2qC29/AivwLhKxa+XHVSAv0dKF5drsBoAKPy4OFKI9DJhCysPt3+RKmbXVvdgaktucaz4GU7/r1wurEHHyf+edEsopDvbCea4nbJVe9+qYHXwBPLepzFNymMWVp9eSkiySwB7aXOMLuWo7utTYk1t3BV+sc7C78f/aPIfGdD/s3XcTQzzEBPYu4FBG4D6PZ8oTGGvg0mWt5q/k2qmEcF8CdzUrJ38l/TiQuNSrWG3s/ALdDwXooplsCEl92sprxZswgpfKIsoPUuVSGUAIPOHY23+Yzx/j0AaMIUbeZB6mwGqffcNtW1qSbeeJWr/2HG9jbdBlr/wnPpDFdGn4oAzsuacaCYGMO8vkU20Lpwn7I3fce3H9zfmDqmroKE5d6tiB3+e212+jgft3b24tdudYGIbFVG7a3+DQYHtSDT5BOKQgbKs4Pw4Lks8vYprrIOHwfxHALjO6YlqkMJcbYPYYUCE3aitVgMFoLztZkVYEBSx6AQOEHG/PkpuDSnmhkDxvNzX8PvmwhEGWROY5kTaDm81bmLrMbf9AYBy5g2ZKP5Vvw6nLwfVrS7gesNPT30JZPHzrZCiUHB79eoWK6hSSlQX1b7z6/qkIFV06X+pgp2lqA4mauJYUm3sx6wmgeJaxDP/I6RpU1EiRFb3TzxkTGo3Wafp2PDg0q8sjj7A+xXREjf3WgsdwPXnCDByOLTV9u4Gd+7KwRZwK/9OChKNU5xXte4VQMf3TvNjBl07AQEtyBQ2swCO7YsiWx3EIv2oqy/zl1QEnVj8BVcfATwghu9vxY2oQ2J7ejxCEtIDRKJXFg8ziB7H1NaWknzlzDOC80UqfWKFCH8fC7KB3ysuAPpN4I0i1y8dRcZdiHK3aImhSs7GXDyr5BpG35RfZk1cBqIl1L8+mWZYKxXinKzKccYXl2JZFvkr+TWDjBoVIBDQBa1RjWPHGF3OT7KWiV6zsHchzVUe7re6WU7PhzRDTB/mw+kxsmcIuuMB2cTsbk29TgScQGd1IkQnzUPUtGYoQiv0i6JbAJFc0nMLl0tMds4xAPAefL2lqfTMIMbJufiohBBMvaEnchohkmDtrGGTuLvBWYSNtlSuSmC8GOlenCUG4bXMWM+ZHwnIA/GsmNsQR1wSlaXFNGnp/Qnw/q7I3Btyayp5Cf3PGLFMdho502/NcY5puROnctNAQKf4+5zUnfnhvqUK3DAWl9Ei5CtTUJ5Vopuh0HFTk0mEjgFutDHjQlXC3F3JWVpIUn22fZHlal2l/evB9sZVJxsMcEEoOrbMmHqmYd4JIdnLMhy9uPZCUoPc+LzrYFXXprNw0XPhFkI4ZtWM95Uz4NfuFWw3d+Ijd3szFMA3WvtZ9Hs1XbdI7sHrRGRIaGn9lNyygofOZhXHQC2ojbRyUOllJQYVUvRB18IxEIHitfD+Q6pUY7FM4TsYoSkoVIjJkQcIv4dsQLyG8StWSL4b4dJZEIi8tk9BQcY52/goO/FbvjB/Rz+cZd/r6J7akGskONwtUBlqe3i+PihvIUbfTA2AwRuaTgpvLwFkOxXRj4Uj0lTExB2to89IRkJ/eADa9eawoh0xswAUxHpmsiUoxRz3UF4gEzpVq4XmmOp2baE2+Uj4rtkzvH5dyODYO39FGudvwZwf6baOlFAKxyBfaVS+W4/udYnLKqoyT7fcuxOqx8cxxLZI6KuDs3nrOe/U9yxIgpvxZSZEejyWVvvRVTzKN3QzMorVXwoPyMlthJpFbAoRt+VPOwMUOAPo3Hhy/6iP03wmUUUBUf4SSSeYoOqXzvj60founyl3ugmpvdEMS2weyTUxq7gkR7xIfAnLzYsb1eLjy0oiRbHGu1QkwhKtqMwjuDfyOcUavzczbNizQHVVORfsiZTMuzLUufVkBug9LrmYkTkUgNs0dCkKQI3RsVP90Kix+gLYmbnIRAhlJbmgzbKULA9ipT3VU3aLXV5/o097pAvpKJGHsk8ibC3yCP2vf2mPLibBHIjGM1T0+sq682kjC1vsJWXl2JVMiDQbHW/zamNixPnU7uTriojCUYLTHt3M5D5d1IxIUIzWyTY6+9zFlO3BBZUCYOaqE0B4ncMfrV9rkuKLay69dPMQLuqF5MxD8oTA1HFDPUEvpFiUhNrxm2VSl7joxjf7TwYkLgDaDKzp5Cmbj4EdCvnRuZ8S+XtzremqnQkwfcbPxkS8GyQxVex9jxrBbz2dicI1hkfvi3hu8qqFJ87/Ozeg9RWjPpLd/Ax5tE6wCh6HO8FUMKO8gKMSFqaTM4i36AN8isOVm2jbKPfWm2Cx8Fwh4VdyKPJ/33FbPTn9dC9ox1/wcDHAta6wGqk224B3QJa6s+gKT1/qb+HObz1i9yRFEcneJkpkt6kTcws1kfoPeQUAwayy9p7Fj1l30TW9oIZwDdyA9746c/bR2dZt0zQtGXsynhjom87f9T2AfvK36EoWQA4hxiZvsKn6E+V4Q229t7FgP0j1oqF7iu+hlgl6IYkmzhf/LVdQJbGslS6Tpa/TpLsFXRnCX/rWBovU01jyvM0w7f7Yyc0S6NcCULtDH2Znqd3JKYAphuWOLWLQlDJg/CRSpK1x4V+hWNuTXETafVlk5ft9do6Et9krcFyHKzATI1SaapornUYv0rgL6hN9y+IZl1CyuL/uyWy9iqLmO5tjx9gitKlCT4Hcj6QWH6Wfg+zmAVraPVjvzCAU9odHRwczovL3dlYnN0YXRpYy1zZWEuaG95b3ZlcnNlLmNvbS95cy9ldmVudC9lMjAyMDA0MTBnb19jb21tdW5pdHkvaW5kZXguaHRtbCMv0gEKYWRmZWI4YmU3MdoBCmFkZmViOGJlNzH6AR1odHRwczovL2FjY291bnQuaG95b3ZlcnNlLmNvbYICcWh0dHBzOi8vaGs0ZS1hcGktb3MuaG95b3ZlcnNlLmNvbS9jb21tb24vYXBpY2RrZXkvYXBpL2V4Y2hhbmdlQ2RrZXk/c2lnbl90eXBlPTImYXV0aF9hcHBpZD1hcGljZGtleSZhdXRoa2V5X3Zlcj0xigJMaHR0cHM6Ly9hY2NvdW50LmhveW92ZXJzZS5jb20vIy9hYm91dC9wcml2YWN5SW5HYW1lP2FwcF9pZD00JmJpej1oazRlX2dsb2JhbFqcEEVjMmIQAAAAkYKO+AcytOyHcy2Cwfl+swAIAADDjrST/+b77UzEgRdQJyT/fe5GRteHaoLb38CK/AuErFr5cdVIC/R0oXl2uwGgAo/Lg4Uoj0MmELKw+3f5EqZtdW92BqS25xrPgZTv+vXC6sQcfJ/550SyikO9sJ5ridslV736pgdfAE8t6nMU3KYxZWn15KSLJLAHtpc4wu5aju61NiTW3cFX6xzsLvx/9o8h8Z0P+zddxNDPMQE9i7gUEbgPo9nyhMYa+DSZa3mr+TaqYRwXwJ3NSsnfyX9OJC41KtYbez8At0PBeiimWwISX3aymvFmzCCl8oiyg9S5VIZQAg84djbf5jPH+PQBowhRt5kHqbAap99w21bWpJt54lav/Ycb2Nt0GWv/Cc+kMV0afigDOy5pxoJgYw7y+RTbQunCfsjd9x7cf3N+YOqaugoTl3q2IHf57bXb6OB+3dvbi1251gYhsVUbtrf4NBge1INPkE4pCBsqzg/DguSzy9imusg4fB/EcAuM7piWqQwlxtg9hhQITdqK1WAwWgvO1mRVgQFLHoBA4Qcb8+Sm4NKeaGQPG83Nfw++bCEQZZE5jmRNoObzVuYusxt/0BgHLmDZko/lW/DqcvB9WtLuB6w09PfQlk8fOtkKJQcHv16hYrqFJKVBfVvvPr+qQgVXTpf6mCnaWoDiZq4lhSbezHrCaB4lrEM/8jpGlTUSJEVvdPPGRMajdZp+nY8ODSryyOPsD7FdESN/daCx3A9ecIMHI4tNX27gZ37srBFnAr/04KEo1TnFe17hVAx/dO82MGXTsBAS3IFDazAI7tiyJbHcQi/airL/OXVASdWPwFVx8BPCCG72/FjahDYnt6PEIS0gNEolcWDzOIHsfU1paSfOXMM4LzRSp9YoUIfx8LsoHfKy4A+k3gjSLXLx1Fxl2IcrdoiaFKzsZcPKvkGkbflF9mTVwGoiXUvz6ZZlgrFeKcrMpxxheXYlkW+Sv5NYOMGhUgENAFrVGNY8cYXc5PspaJXrOwdyHNVR7ut7pZTs+HNENMH+bD6TGyZwi64wHZxOxuTb1OBJxAZ3UiRCfNQ9S0ZihCK/SLolsAkVzScwuXS0x2zjEA8B58vaWp9Mwgxsm5+KiEEEy9oSdyGiGSYO2sYZO4u8FZhI22VK5KYLwY6V6cJQbhtcxYz5kfCcgD8ayY2xBHXBKVpcU0aen9CfD+rsjcG3JrKnkJ/c8YsUx2GjnTb81xjmm5E6dy00BAp/j7nNSd+eG+pQrcMBaX0SLkK1NQnlWim6HQcVOTSYSOAW60MeNCVcLcXclZWkhSfbZ9keVqXaX968H2xlUnGwxwQSg6tsyYeqZh3gkh2csyHL249kJSg9z4vOtgVdems3DRc+EWQjhm1Yz3lTPg1+4VbDd34iN3ezMUwDda+1n0ezVdt0juwetEZEhoaf2U3LKCh85mFcdALaiNtHJQ6WUlBhVS9EHXwjEQgeK18P5DqlRjsUzhOxihKShUiMmRBwi/h2xAvIbxK1ZIvhvh0lkQiLy2T0FBxjnb+Cg78Vu+MH9HP5xl3+vontqQayQ43C1QGWp7eL4+KG8hRt9MDYDBG5pOCm8vAWQ7FdGPhSPSVMTEHa2jz0hGQn94ANr15rCiHTGzABTEemayJSjFHPdQXiATOlWrheaY6nZtoTb5SPiu2TO8fl3I4Ng7f0Ua52/BnB/pto6UUArHIF9pVL5bj+51icsqqjJPt9y7E6rHxzHEtkjoq4Ozees579T3LEiCm/FlJkR6PJZW+9FVPMo3dDMyitVfCg/IyW2EmkVsChG35U87AxQ4A+jceHL/qI/TfCZRRQFR/hJJJ5ig6pfO+PrR+i6fKXe6Cam90QxLbB7JNTGruCRHvEh8CcvNixvV4uPLSiJFsca7VCTCEq2ozCO4N/I5xRq/NzNs2LNAdVU5F+yJlMy7MtS59WQG6D0uuZiRORSA2zR0KQpAjdGxU/3QqLH6AtiZuchECGUluaDNspQsD2KlPdVTdotdXn+jT3ukC+kokYeyTyJsLfII/a9/aY8uJsEciMYzVPT6yrrzaSMLW+wlZeXYlUyINBsdb/NqY2LE+dTu5OuKiMJRgtMe3czkPl3UjEhQjNbJNjr73MWU7cEFlQJg5qoTQHidwx+tX2uS4otrLr108xAu6oXkzEPyhMDUcUM9QS+kWJSE2vGbZVKXuOjGN/tPBiQuANoMrOnkKZuPgR0K+dG5nxL5e3Ot6aqdCTB9xs/GRLwbJDFV7H2PGsFvPZ2JwjWGR++LeG7yqoUnzv87N6D1FaM+kt38DHm0TrAKHoc7wVQwo7yAoxIWppMziLfoA3yKw5WbaNso99abYLHwXCHhV3Io8n/fcVs9Of10L2jHX/BwMcC1rrAaqTbbgHdAlrqz6ApPX+pv4c5vPWL3JEURyd4mSmS3qRNzCzWR+g95BQDBrLL2nsWPWXfRNb2ghnAN3ID3vjpz9tHZ1m3TNC0ZezKeGOibzt/1PYB+8rfoShZADiHGJm+wqfoT5XhDbb23sWA/SPWioXuK76GWCXohiSbOF/8tV1AlsayVLpOlr9OkuwVdGcJf+tYGi9TTWPK8zTDt/tjJzRLo1wJQu0MfZmep3ckpgCmG5Y4tYtCUMmD8JFKkrXHhX6FY25NcRNp9WWTl+312joS32StwXIcrMBMjVJpqmiudRi/SuAvqE33L4hmXULK4v+7JbL2KouY7m2PH2CK0qUJPgdyPpBYfpZ+D7OYBWto9WO/GLVArJ6MMs9QA4I3dIIwrylWFU1xRNtPj3ZUiooCQGiArlYzrMmLb09eDW0QedOr3CPLOlcmZroIV9XmnD9YYJSBxv5L8mbNaGWcZkxZM04GrPcOeDTN2pXq/DdB2cHRC0nT6YaQhvAnvVDFhnoBHnJS9B/aGcgHo3mVzWBi2jeeXNyLZaHhkADBRCPGmTwonHJPIig0hnMvCbLB7b5qHpN8uaQBDW4T6cqIZljsbbXUY1maAcu5vmLK8Tq7Vmu74TTQzghjgxVHB6vIS8vhqWKOKyGSrDGLDnGlcHFRlH/Omz49L2EBfYyDPKUBsi+VMP+cvIrky3XqoBUtTuQwXmcCF3LxPyf8SCVwFZSgDHMND7owHO90vRS60lwsO9QkfojEmbs0MTvFrB/FM1CeHxQeSBA74JVmDRNL4efGIopyTt6SltAxc0flyQzHwW4D8oWg6Tm/Na6 \ No newline at end of file +GpgdCgo4LjIwOS42Ni4xENWsARosaHR0cHM6Ly9vc2V1cm9vYXNlcnZlci55dWFuc2hlbi5jb20vcmVjaGFyZ2U6BGV1cm9COWh0dHBzOi8vYXV0b3BhdGNoaGsueXVhbnNoZW4uY29tL2NsaWVudF9nYW1lX3Jlcy8yLjZfbGl2ZUo8aHR0cHM6Ly9hdXRvcGF0Y2hoay55dWFuc2hlbi5jb20vY2xpZW50X2Rlc2lnbl9kYXRhLzIuNl9saXZlUpIBaHR0cHM6Ly93ZWJzdGF0aWMtc2VhLmhveW92ZXJzZS5jb20veXMvZXZlbnQvaW0tc2VydmljZS9pbmRleC5odG1sP2ltX291dD1mYWxzZSZzaWduX3R5cGU9MiZhdXRoX2FwcGlkPWltX2NjcyZhdXRoa2V5X3Zlcj0xJndpbl9kaXJlY3Rpb249cG9ydHJhaXRiCDIuNl9saXZlcNnsmgOQAdnsmgOaAVx7InJlbW90ZU5hbWUiOiAiZGF0YV92ZXJzaW9ucyIsICJtZDUiOiAiMWE0NDVhZTQ4ZmJkYmUwMzgzMTJiZTg2OGYyODEzZDIiLCAiZmlsZVNpemUiOiA0NDE1faIBW3sicmVtb3RlTmFtZSI6ICJkYXRhX3ZlcnNpb25zIiwgIm1kNSI6ICIxNzU0MmM3YmJhYzQ5YjkxMWRlMjlhOTYyNzU0YmQ2MSIsICJmaWxlU2l6ZSI6IDUxNH2yAYEGCL23mQMa4AV7InJlbW90ZU5hbWUiOiAicmVzX3ZlcnNpb25zX2V4dGVybmFsIiwgIm1kNSI6ICI5ZjA5MmNhMTMwNjdjYWU0MzEzNDkzZWVkM2QzZTlhZSIsICJmaWxlU2l6ZSI6IDUyNjk2Nn0NCnsicmVtb3RlTmFtZSI6ICJyZXNfdmVyc2lvbnNfbWVkaXVtIiwgIm1kNSI6ICI3Yzk0MmU3MDRhODA0YzIxMjJmYzYzZWU5MjhlNzE0OCIsICJmaWxlU2l6ZSI6IDI4NTU1MH0NCnsicmVtb3RlTmFtZSI6ICJyZXNfdmVyc2lvbnNfc3RyZWFtaW5nIiwgIm1kNSI6ICJlMzVmNmQ4NTNkMDRjZTAyMmFjN2MzNmQ0M2Y0MGU3YyIsICJmaWxlU2l6ZSI6IDEyMjAzNn0NCnsicmVtb3RlTmFtZSI6ICJyZWxlYXNlX3Jlc192ZXJzaW9uc19leHRlcm5hbCIsICJtZDUiOiAiODc2NGIwZjJlZDgxNWNkNDQzMGUwODVjNDYxYTZmNGQiLCAiZmlsZVNpemUiOiA1MjY5NjZ9DQp7InJlbW90ZU5hbWUiOiAicmVsZWFzZV9yZXNfdmVyc2lvbnNfbWVkaXVtIiwgIm1kNSI6ICIxYmJlMzc0YzE2YmZmNDU5MTU5OWMyMTk3MzQyMDM0OCIsICJmaWxlU2l6ZSI6IDI4NTU1MH0NCnsicmVtb3RlTmFtZSI6ICJyZWxlYXNlX3Jlc192ZXJzaW9uc19zdHJlYW1pbmciLCAibWQ1IjogIjcyZmE3ZmY2NmQ1MTRmY2JhMzRhZjAwN2YyYjljMmY4IiwgImZpbGVTaXplIjogMTIyMDM2fQ0KeyJyZW1vdGVOYW1lIjogImJhc2VfcmV2aXNpb24iLCAibWQ1IjogImZiZmE2ZDZlMDcwMmQxYzc5ZTA1NjRmYjI4NjdlNzM4IiwgImZpbGVTaXplIjogMTh9IgEwKgo3YTM0YTM2YTZlMggyLjZfbGl2ZboBnBBFYzJiEAAAAJNvNOvzlkCCDSqpQ6a141IACAAA6gq2poqqrhWr1LS/wULjaiSPJIGsouCxUfY40ezmGoMU5SZZLwQ97KrlkCLKvTVycxteFwEPDxFrKxiHE1oigrAAkjc0NU12JqcQBFL8ExWeR+3QfCPnh7MWo424stJoHPADl9E6R/n3YDXAtq1gUzZu5Y4aGtd9XDyVjozcbIrtVVTGVpvRIuwGYoOCRCwDeRKphu9MoJfbi9mawLh5XSq+KLsAksjM90JJ/DEUzP2XCB/QILsiSiwbET5LUrl65OXCN4sLxZg+86qmeU28cdz4tWDewXYFO+Y7AnJAt7JfpgR/8Os7A9CDPD8WA6GBdqyplmoKRtnjjZG9ZGZIk1YF7AdGUhE8672XlWW3clJaNMBpHFkON+t7Utgu6prY/uJJLFZlGm5KMSend8u8GTMYOE5/AJsVkX/5eS8V2F6Dt6mZJgPtGAlX7Rp1a1R57FMKQLS+9nIzKDMclWFs7ebbnv+lcqckuqln19/JMrYQg9E4IiDVn5akaHZbnYBw0+HDR5kfT2xWfWVo8CJu4mPSpVR1kI4HhZXTURnHa7ezObuwHQm3NS7wHK7VO0E+qgnUgb+vK9M0cHTQE6FsCi/bk0VaHZtDxpMCTfKluJiOsxhvRePOjEVyNyLwLJaoxwwSukMfSH9G+q62ygFmmErAQfKKWLreb72UegOgmhD8T8aytvWXHkWk07QCttqgPhax8BAW2OvRJluvorBUIeHDeO6QeBaZns4EXIYUcIQlfi3yGsLKhhGLb2OgN6a6B3ElxdgXRRYMGAdDoAxEnCcWmdZx874vEvf2KFUP6aU8l4lh0XV6RU/D7A+eqWN5bH4ffS4QBQq2MU6CNA5XumMsD4zUfC6od5T7Tt7uQsgbqtIMgXKpO8lRk4pRgnpPsqM1Ou8kTb1UdQSc4yREuJlrL2Tmtf35cAw7W290LIO/GaO9Rj1CPhATMn7jbUTA6+QN7rTxIzbVl66k95wQth81TYuvw1DlGOpVDTbcCB0uvfmcAAGhj57jVBlyVIu+KJzrrx8z9Uh6scsMCgrMPJn7nsCHSXD6yElTgLrF7FVwgqsxDjgcquqkrSnknP92jb+11IJbw05Ass4hcMRGJxdAefSWDIgdi7l4GnppPdUvLkG5uvBlO85AiT2NpqNmShebfst8rQLFc1B7hAcvh9EpM9Sii0/XXfe9tEf7AwKj2SWmS79PsjEiAiv18tJ6gDlaJ0WFSchXNBRPu8ESvKlE8q7myuc2t5nnxv/hctkez5+nh9SgQ3beL34chSL4RPTH32Jqzs5p7s2n87Bv4vfQccYFAF+kKMUZzKnWKl0LCrStSd3+s+4KF/tZXEKue5KoVobNhaQrD33HjWf9Rvw0ULd4ho4A6wj/uga9o7rZ2C2v1YEDNNqZ5/v/udN3hl7tXrWv5UXcUyTtooa66sJ8oITE8+4aDWimtX6dy0CdFQj2mHppbbvRF66flDd/gFA35xQOXfYdOud3NJogglHXofOoB0LEdbao9C6Nt2v+z7C4S0l3cAMXp/yiI9qxJT9b0mQ2zp2GN5i4gvrp+6iKjqxf+IA++oB/JzbbpSVOFJmFSysv4v3Al2AVbmFycYqv0GaoiZ22wiu8Ok3+LCyKJTITtaJLAtgbpwRfa9SUkdpRwMK1vMN1s6jZU9gdejY3oLVKjFpg66c9bagpmvIG1/gfgY9yT++Y8img4aB/JDJMAS2MVGxGlyrRFGaXBWLq3SkhqDqGD5klbvYv2IFMr4BAHP2uwLb92qEhtlksiVQYk8HGxLWlU2Fo+Pxee8L1xvQOgPdY4/cb33BuJXvtyW5ea5EmVtBPo4MU1ws9BvAzLs13Nisl+/FBvBn8ktkZmE5e6nsdpGEtq4/d7MfCLXGRI5L730mIieeAvtQcb0NMWGcubHPgjY58Pv4MSdRpOQakzM2rA5UD5O57rGH5q6p3HZfZk2iPUcJRsebMKJ4l1omr5JeD95DKDKy7Cts3RajufslekL3/wHwUZbAdEWyux2w1zbiukmhTfh0nbenm8Q8KOASCDo0SWO3e9FpOz5o+phHBVYgmfxRt11OonnLt1qKB7j/a7YdufvkFSsFm4UdgsJMPIHzeBjbSSDlLeCdmdKGQtFLC73npe6efYGUupMIV9EYup1D/OoCNlz2r/FhJ7aLRtj6Q6cb161MLp+rmjbSzN+RVFwf7wAVpLQMrHwTvUzB/8M7cTjN5VFE583uhy4KKf+W3iTxzdyX2SAD9QVu6EXv4KaEFBy8Vo0sga907Fi7imkwgjY2cdnEtPMMeO2Jqj3yWPdqrlVtfAn1jd14oix7YObsJ8mVBeueiplG9d7dxcA1GV+7xX9wOyPDcfH5FBAIlglBIEhjSyNQErH+JYRbOUotXMBQa1tlRRtBSLLDCRgEpG8F+Dv5Oao9ZBnKAi0GRjPKo+OjsehWzrNXGDcoTQsGD/bmKpCdaUOuEa6rLA7tbYwqT2SPdCJzBx2J+kI1bwDWhFF9ROrh9MvmwvMBE9dH5mbQj78p2P5gar2BUcNNbSVvSgxtCa1NHsf/GwrPmTQLPxCrEBcDucxIpsqfINp48iCJGZ4NvlRIZolmaVBWlxjVl/XYcb2YOl3K48e+LsfblTU6tyneZimrS+Y0qt7lncte6NZGPnf98wNLxY39IX8gATezGXoZ03TOhy1jX3epf4Bfw5ZyvU8/XJ2BvbPpw+b8LgS0y0DkeQG4mQGlHidnCAU9odHRwczovL3dlYnN0YXRpYy1zZWEuaG95b3ZlcnNlLmNvbS95cy9ldmVudC9lMjAyMDA0MTBnb19jb21tdW5pdHkvaW5kZXguaHRtbCMv0gEKYWRmZWI4YmU3MdoBCmFkZmViOGJlNzH6AR1odHRwczovL2FjY291bnQuaG95b3ZlcnNlLmNvbYICcWh0dHBzOi8vaGs0ZS1hcGktb3MuaG95b3ZlcnNlLmNvbS9jb21tb24vYXBpY2RrZXkvYXBpL2V4Y2hhbmdlQ2RrZXk/c2lnbl90eXBlPTImYXV0aF9hcHBpZD1hcGljZGtleSZhdXRoa2V5X3Zlcj0xigJMaHR0cHM6Ly9hY2NvdW50LmhveW92ZXJzZS5jb20vIy9hYm91dC9wcml2YWN5SW5HYW1lP2FwcF9pZD00JmJpej1oazRlX2dsb2JhbFqcEEVjMmIQAAAAk2806/OWQIINKqlDprXjUgAIAADqCramiqquFavUtL/BQuNqJI8kgayi4LFR9jjR7OYagxTlJlkvBD3squWQIsq9NXJzG14XAQ8PEWsrGIcTWiKCsACSNzQ1TXYmpxAEUvwTFZ5H7dB8I+eHsxajjbiy0mgc8AOX0TpH+fdgNcC2rWBTNm7ljhoa131cPJWOjNxsiu1VVMZWm9Ei7AZig4JELAN5EqmG70ygl9uL2ZrAuHldKr4ouwCSyMz3Qkn8MRTM/ZcIH9AguyJKLBsRPktSuXrk5cI3iwvFmD7zqqZ5Tbxx3Pi1YN7BdgU75jsCckC3sl+mBH/w6zsD0IM8PxYDoYF2rKmWagpG2eONkb1kZkiTVgXsB0ZSETzrvZeVZbdyUlo0wGkcWQ4363tS2C7qmtj+4kksVmUabkoxJ6d3y7wZMxg4Tn8AmxWRf/l5LxXYXoO3qZkmA+0YCVftGnVrVHnsUwpAtL72cjMoMxyVYWzt5tue/6VypyS6qWfX38kythCD0TgiINWflqRodludgHDT4cNHmR9PbFZ9ZWjwIm7iY9KlVHWQjgeFldNRGcdrt7M5u7AdCbc1LvAcrtU7QT6qCdSBv68r0zRwdNAToWwKL9uTRVodm0PGkwJN8qW4mI6zGG9F486MRXI3IvAslqjHDBK6Qx9If0b6rrbKAWaYSsBB8opYut5vvZR6A6CaEPxPxrK29ZceRaTTtAK22qA+FrHwEBbY69EmW6+isFQh4cN47pB4FpmezgRchhRwhCV+LfIawsqGEYtvY6A3proHcSXF2BdFFgwYB0OgDEScJxaZ1nHzvi8S9/YoVQ/ppTyXiWHRdXpFT8PsD56pY3lsfh99LhAFCrYxToI0Dle6YywPjNR8Lqh3lPtO3u5CyBuq0gyBcqk7yVGTilGCek+yozU67yRNvVR1BJzjJES4mWsvZOa1/flwDDtbb3Qsg78Zo71GPUI+EBMyfuNtRMDr5A3utPEjNtWXrqT3nBC2HzVNi6/DUOUY6lUNNtwIHS69+ZwAAaGPnuNUGXJUi74onOuvHzP1SHqxywwKCsw8mfuewIdJcPrISVOAusXsVXCCqzEOOByq6qStKeSc/3aNv7XUglvDTkCyziFwxEYnF0B59JYMiB2LuXgaemk91S8uQbm68GU7zkCJPY2mo2ZKF5t+y3ytAsVzUHuEBy+H0Skz1KKLT9dd9720R/sDAqPZJaZLv0+yMSICK/Xy0nqAOVonRYVJyFc0FE+7wRK8qUTyrubK5za3mefG/+Fy2R7Pn6eH1KBDdt4vfhyFIvhE9MffYmrOzmnuzafzsG/i99BxxgUAX6QoxRnMqdYqXQsKtK1J3f6z7goX+1lcQq57kqhWhs2FpCsPfceNZ/1G/DRQt3iGjgDrCP+6Br2jutnYLa/VgQM02pnn+/+503eGXu1eta/lRdxTJO2ihrrqwnyghMTz7hoNaKa1fp3LQJ0VCPaYemltu9EXrp+UN3+AUDfnFA5d9h0653c0miCCUdeh86gHQsR1tqj0Lo23a/7PsLhLSXdwAxen/KIj2rElP1vSZDbOnYY3mLiC+un7qIqOrF/4gD76gH8nNtulJU4UmYVLKy/i/cCXYBVuYXJxiq/QZqiJnbbCK7w6Tf4sLIolMhO1oksC2BunBF9r1JSR2lHAwrW8w3WzqNlT2B16NjegtUqMWmDrpz1tqCma8gbX+B+Bj3JP75jyKaDhoH8kMkwBLYxUbEaXKtEUZpcFYurdKSGoOoYPmSVu9i/YgUyvgEAc/a7Atv3aoSG2WSyJVBiTwcbEtaVTYWj4/F57wvXG9A6A91jj9xvfcG4le+3Jbl5rkSZW0E+jgxTXCz0G8DMuzXc2KyX78UG8GfyS2RmYTl7qex2kYS2rj93sx8ItcZEjkvvfSYiJ54C+1BxvQ0xYZy5sc+CNjnw+/gxJ1Gk5BqTMzasDlQPk7nusYfmrqncdl9mTaI9RwlGx5swoniXWiavkl4P3kMoMrLsK2zdFqO5+yV6Qvf/AfBRlsB0RbK7HbDXNuK6SaFN+HSdt6ebxDwo4BIIOjRJY7d70Wk7Pmj6mEcFViCZ/FG3XU6iecu3WooHuP9rth25++QVKwWbhR2Cwkw8gfN4GNtJIOUt4J2Z0oZC0UsLveel7p59gZS6kwhX0Ri6nUP86gI2XPav8WEntotG2PpDpxvXrUwun6uaNtLM35FUXB/vABWktAysfBO9TMH/wztxOM3lUUTnze6HLgop/5beJPHN3JfZIAP1BW7oRe/gpoQUHLxWjSyBr3TsWLuKaTCCNjZx2cS08wx47YmqPfJY92quVW18CfWN3XiiLHtg5uwnyZUF656KmUb13t3FwDUZX7vFf3A7I8Nx8fkUEAiWCUEgSGNLI1ASsf4lhFs5Si1cwFBrW2VFG0FIssMJGASkbwX4O/k5qj1kGcoCLQZGM8qj46Ox6FbOs1cYNyhNCwYP9uYqkJ1pQ64RrqssDu1tjCpPZI90InMHHYn6QjVvANaEUX1E6uH0y+bC8wET10fmZtCPvynY/mBqvYFRw01tJW9KDG0JrU0ex/8bCs+ZNAs/EKsQFwO5zEimyp8g2njyIIkZng2+VEhmiWZpUFaXGNWX9dhxvZg6Xcrjx74ux9uVNTq3Kd5mKatL5jSq3uWdy17o1kY+d/3zA0vFjf0hfyABN7MZehnTdM6HLWNfd6l/gF/DlnK9Tz9cnYG9s+nD5vwuBLTLQOR5AbiZAaUeJ2WLVAtaPymwUgxn8nMUMGk2pDMbkJNLgHPcao2F2HLBdC2W3r1Qs5PtDbMuMCIPSYscVx1x66qcJw19SiQyNLxCY9ErLGDY4mChY/X5NX7Pc2ricYE7EzCSZMYQmtUVZoqn1RPGz1P9Gj65Edm70zFOfRWfR+sTboONM7W3oNk1mkI2M5GwQrQpkAiyb5zwdxpsOwtQ0s0Sin4IOonpW9KcRv8yB8rMOMu6+C6m4h2MwRPj6QrVPWd8PV22qB4iAwfV3UYpjo91Mw/V5xT1DRSrb65vYtu8E4lR3HMv37at4aV6v8RluqeAIHHDJBANaUN3eLCSHewfEb+osQ5BV7XQT5Dwdy/LLFo+hdCBp0Retgtiwsq3+EgRs9i/d9tmghRqEdD/6re752aRiyTsf7CkWY6O7cCGfvmOLE0XhNQra+tLnlJCR1y4m1LOTB3ulQnZrA2E7Mmk7 \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index b6401740d..57976381a 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -21,6 +21,7 @@ import emu.grasscutter.game.props.FightProperty; import emu.grasscutter.game.props.PlayerProperty; import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; +import emu.grasscutter.server.packet.send.PacketPlayerLoginRsp; import emu.grasscutter.utils.Position; import java.util.LinkedList; @@ -30,15 +31,15 @@ import java.util.List; * A container for player-related commands. */ public final class PlayerCommands { - @Command(label = "give", aliases = {"g", "item", "giveitem"}, - usage = "Usage: give [player] [amount]") + @Command(label = "give", aliases = { "g", "item", + "giveitem" }, usage = "Usage: give [player] [amount]") public static class GiveCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { int target, item, amount = 1; - switch(args.size()) { + switch (args.size()) { default: CommandHandler.sendMessage(player, "Usage: give [amount]"); return; @@ -56,8 +57,9 @@ public final class PlayerCommands { try { target = Integer.parseInt(args.get(0)); - if(Grasscutter.getGameServer().getPlayerByUid(target) == null) { - target = player.getUid(); amount = Integer.parseInt(args.get(1)); + if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { + target = player.getUid(); + amount = Integer.parseInt(args.get(1)); item = Integer.parseInt(args.get(0)); } else { item = Integer.parseInt(args.get(1)); @@ -71,9 +73,10 @@ public final class PlayerCommands { case 3: try { target = Integer.parseInt(args.get(0)); - - if(Grasscutter.getGameServer().getPlayerByUid(target) == null) { - CommandHandler.sendMessage(player, "Invalid player ID."); return; + + if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { + CommandHandler.sendMessage(player, "Invalid player ID."); + return; } item = Integer.parseInt(args.get(1)); @@ -88,23 +91,26 @@ public final class PlayerCommands { GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if(targetPlayer == null) { - CommandHandler.sendMessage(player, "Player not found."); return; + if (targetPlayer == null) { + CommandHandler.sendMessage(player, "Player not found."); + return; } ItemData itemData = GenshinData.getItemDataMap().get(item); - if(itemData == null) { - CommandHandler.sendMessage(player, "Invalid item id."); return; + if (itemData == null) { + CommandHandler.sendMessage(player, "Invalid item id."); + return; } - + this.item(targetPlayer, itemData, amount); } /** * give [player] [itemId|itemName] [amount] */ - @Override public void execute(List args) { - if(args.size() < 2) { + @Override + public void execute(List args) { + if (args.size() < 2) { CommandHandler.sendMessage(null, "Usage: give [amount]"); return; } @@ -112,32 +118,37 @@ public final class PlayerCommands { try { int target = Integer.parseInt(args.get(0)); int item = Integer.parseInt(args.get(1)); - int amount = 1; if(args.size() > 2) amount = Integer.parseInt(args.get(2)); - + int amount = 1; + if (args.size() > 2) + amount = Integer.parseInt(args.get(2)); + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if(targetPlayer == null) { - CommandHandler.sendMessage(null, "Player not found."); return; + if (targetPlayer == null) { + CommandHandler.sendMessage(null, "Player not found."); + return; } - + ItemData itemData = GenshinData.getItemDataMap().get(item); - if(itemData == null) { - CommandHandler.sendMessage(null, "Invalid item id."); return; + if (itemData == null) { + CommandHandler.sendMessage(null, "Invalid item id."); + return; } - + this.item(targetPlayer, itemData, amount); } catch (NumberFormatException ignored) { CommandHandler.sendMessage(null, "Invalid item or player ID."); } } - + private void item(GenshinPlayer player, ItemData itemData, int amount) { GenshinItem genshinItem = new GenshinItem(itemData); - if(itemData.isEquip()) { + if (itemData.isEquip()) { List items = new LinkedList<>(); - for(int i = 0; i < amount; i++) { + for (int i = 0; i < amount; i++) { items.add(genshinItem); - } player.getInventory().addItems(items); + } + player.getInventory().addItems(items); player.sendPacket(new PacketItemAddHintNotify(items, ActionReason.SubfieldDrop)); } else { genshinItem.setCount(amount); @@ -146,37 +157,41 @@ public final class PlayerCommands { } } } - - @Command(label = "drop", aliases = {"d", "dropitem"}, - usage = "Usage: drop [amount]", - execution = Command.Execution.PLAYER) + + @Command(label = "drop", aliases = { "d", + "dropitem" }, usage = "Usage: drop [amount]", execution = Command.Execution.PLAYER) public static class DropCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { + if (args.size() < 1) { CommandHandler.sendMessage(player, "Usage: drop [amount]"); return; } try { int item = Integer.parseInt(args.get(0)); - int amount = 1; if(args.size() > 1) amount = Integer.parseInt(args.get(1)); + int amount = 1; + if (args.size() > 1) + amount = Integer.parseInt(args.get(1)); ItemData itemData = GenshinData.getItemDataMap().get(item); - if(itemData == null) { - CommandHandler.sendMessage(player, "Invalid item id."); return; + if (itemData == null) { + CommandHandler.sendMessage(player, "Invalid item id."); + return; } if (itemData.isEquip()) { float range = (5f + (.1f * amount)); for (int i = 0; i < amount; i++) { - Position pos = player.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); + Position pos = player.getPos().clone().addX((float) (Math.random() * range) - (range / 2)) + .addY(3f).addZ((float) (Math.random() * range) - (range / 2)); EntityItem entity = new EntityItem(player.getScene(), player, itemData, pos, 1); player.getScene().addEntity(entity); } } else { - EntityItem entity = new EntityItem(player.getScene(), player, itemData, player.getPos().clone().addY(3f), amount); + EntityItem entity = new EntityItem(player.getScene(), player, itemData, + player.getPos().clone().addY(3f), amount); player.getScene().addEntity(entity); } } catch (NumberFormatException ignored) { @@ -185,26 +200,27 @@ public final class PlayerCommands { } } - @Command(label = "givechar", aliases = {"givec"}, - usage = "Usage: givechar [level|avatarId] [level]") + @Command(label = "givechar", aliases = { + "givec" }, usage = "Usage: givechar [level|avatarId] [level]") public static class GiveCharCommand implements CommandHandler { - @Override public void execute(GenshinPlayer player, List args) { + @Override + public void execute(GenshinPlayer player, List args) { int target, avatarId, level = 1, ascension = 1; - if(args.size() < 1) { + if (args.size() < 1) { CommandHandler.sendMessage(player, "Usage: givechar [level]"); return; } - - switch(args.size()) { + + switch (args.size()) { default: - CommandHandler.sendMessage(player, "Usage: givechar [level]"); + CommandHandler.sendMessage(player, "Usage: givechar [level]"); return; case 2: try { target = Integer.parseInt(args.get(0)); - if(Grasscutter.getGameServer().getPlayerByUid(target) == null) { - target = player.getUid(); + if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { + target = player.getUid(); level = Integer.parseInt(args.get(1)); avatarId = Integer.parseInt(args.get(0)); } else { @@ -219,8 +235,9 @@ public final class PlayerCommands { case 3: try { target = Integer.parseInt(args.get(0)); - if(Grasscutter.getGameServer().getPlayerByUid(target) == null) { - CommandHandler.sendMessage(player, "Invalid player ID."); return; + if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { + CommandHandler.sendMessage(player, "Invalid player ID."); + return; } avatarId = Integer.parseInt(args.get(1)); @@ -234,13 +251,15 @@ public final class PlayerCommands { } GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if(targetPlayer == null) { - CommandHandler.sendMessage(player, "Player not found."); return; + if (targetPlayer == null) { + CommandHandler.sendMessage(player, "Player not found."); + return; } - + AvatarData avatarData = GenshinData.getAvatarDataMap().get(avatarId); - if(avatarData == null) { - CommandHandler.sendMessage(player, "Invalid avatar id."); return; + if (avatarData == null) { + CommandHandler.sendMessage(player, "Invalid avatar id."); + return; } // Calculate ascension level. @@ -253,16 +272,16 @@ public final class PlayerCommands { GenshinAvatar avatar = new GenshinAvatar(avatarId); avatar.setLevel(level); avatar.setPromoteLevel(ascension); - + // This will handle stats and talents avatar.recalcStats(); - + targetPlayer.addAvatar(avatar); } @Override public void execute(List args) { - if(args.size() < 2) { + if (args.size() < 2) { CommandHandler.sendMessage(null, "Usage: givechar [amount]"); return; } @@ -270,33 +289,37 @@ public final class PlayerCommands { try { int target = Integer.parseInt(args.get(0)); int avatarID = Integer.parseInt(args.get(1)); - int level = 1; if(args.size() > 2) level = Integer.parseInt(args.get(2)); + int level = 1; + if (args.size() > 2) + level = Integer.parseInt(args.get(2)); int ascension; - + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if(targetPlayer == null) { - CommandHandler.sendMessage(null, "Player not found."); return; + if (targetPlayer == null) { + CommandHandler.sendMessage(null, "Player not found."); + return; } - + AvatarData avatarData = GenshinData.getAvatarDataMap().get(avatarID); - if(avatarData == null) { - CommandHandler.sendMessage(null, "Invalid avatar id."); return; + if (avatarData == null) { + CommandHandler.sendMessage(null, "Invalid avatar id."); + return; } - + // Calculate ascension level. if (level <= 40) { ascension = (int) Math.ceil(level / 20f); } else { ascension = (int) Math.ceil(level / 10f) - 3; } - + GenshinAvatar avatar = new GenshinAvatar(avatarID); avatar.setLevel(level); avatar.setPromoteLevel(ascension); // This will handle stats and talents avatar.recalcStats(); - + targetPlayer.addAvatar(avatar); } catch (NumberFormatException ignored) { CommandHandler.sendMessage(null, "Invalid item or player ID."); @@ -304,30 +327,35 @@ public final class PlayerCommands { } } - @Command(label = "spawn", execution = Command.Execution.PLAYER, - usage = "Usage: spawn [level] [amount]") + @Command(label = "spawn", execution = Command.Execution.PLAYER, usage = "Usage: spawn [level] [amount]") public static class SpawnCommand implements CommandHandler { - + @Override public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { + if (args.size() < 1) { CommandHandler.sendMessage(null, "Usage: spawn [amount]"); return; } try { int entity = Integer.parseInt(args.get(0)); - int level = 1; if(args.size() > 1) level = Integer.parseInt(args.get(1)); - int amount = 1; if(args.size() > 2) amount = Integer.parseInt(args.get(2)); + int level = 1; + if (args.size() > 1) + level = Integer.parseInt(args.get(1)); + int amount = 1; + if (args.size() > 2) + amount = Integer.parseInt(args.get(2)); MonsterData entityData = GenshinData.getMonsterDataMap().get(entity); - if(entityData == null) { - CommandHandler.sendMessage(null, "Invalid entity id."); return; + if (entityData == null) { + CommandHandler.sendMessage(null, "Invalid entity id."); + return; } float range = (5f + (.1f * amount)); for (int i = 0; i < amount; i++) { - Position pos = player.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); + Position pos = player.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f) + .addZ((float) (Math.random() * range) - (range / 2)); EntityMonster monster = new EntityMonster(player.getScene(), entityData, pos, level); player.getScene().addEntity(monster); } @@ -336,9 +364,8 @@ public final class PlayerCommands { } } } - - @Command(label = "killall", - usage = "Usage: killall [playerUid] [sceneId]") + + @Command(label = "killall", usage = "Usage: killall [playerUid] [sceneId]") public static class KillAllCommand implements CommandHandler { @Override @@ -349,29 +376,30 @@ public final class PlayerCommands { .forEach(entity -> scene.killEntity(entity, 0)); CommandHandler.sendMessage(null, "Killing all monsters in scene " + scene.getId()); } - + @Override public void execute(List args) { - if(args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: killall [playerUid] [sceneId]"); return; + if (args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: killall [playerUid] [sceneId]"); + return; } try { - int playerUid = Integer.parseInt(args.get(0)); + int playerUid = Integer.parseInt(args.get(0)); int sceneId = Integer.parseInt(args.get(1)); - + GenshinPlayer player = Grasscutter.getGameServer().getPlayerByUid(playerUid); if (player == null) { - CommandHandler.sendMessage(null, "Player not found or offline."); - return; + CommandHandler.sendMessage(null, "Player not found or offline."); + return; } - + GenshinScene scene = player.getWorld().getSceneById(sceneId); if (scene == null) { - CommandHandler.sendMessage(null, "Scene not found in player world"); - return; + CommandHandler.sendMessage(null, "Scene not found in player world"); + return; } - + scene.getEntities().values().stream() .filter(entity -> entity instanceof EntityMonster) .forEach(entity -> scene.killEntity(entity, 0)); @@ -381,28 +409,29 @@ public final class PlayerCommands { } } } - - @Command(label = "resetconst", aliases = {"resetconstellation"}, - usage = "Usage: resetconst [all]", execution = Command.Execution.PLAYER) + + @Command(label = "resetconst", aliases = { + "resetconstellation" }, usage = "Usage: resetconst [all]", execution = Command.Execution.PLAYER) public static class ResetConstellationCommand implements CommandHandler { - + @Override public void execute(GenshinPlayer player, List args) { - if(args.size() > 0 && args.get(0).equalsIgnoreCase("all")) { + if (args.size() > 0 && args.get(0).equalsIgnoreCase("all")) { player.getAvatars().forEach(this::resetConstellation); player.dropMessage("Reset all avatars' constellations."); } else { - EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); - if(entity == null) + EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); + if (entity == null) return; - + GenshinAvatar avatar = entity.getAvatar(); this.resetConstellation(avatar); - player.dropMessage("Constellations for " + avatar.getAvatarData().getName() + " have been reset. Please relog to see changes."); + player.dropMessage("Constellations for " + avatar.getAvatarData().getName() + + " have been reset. Please relog to see changes."); } } - + private void resetConstellation(GenshinAvatar avatar) { avatar.getTalentIdList().clear(); avatar.setCoreProudSkillLevel(0); @@ -410,36 +439,37 @@ public final class PlayerCommands { avatar.save(); } } - - @Command(label = "godmode", - usage = "Usage: godmode", execution = Command.Execution.PLAYER) + + @Command(label = "godmode", usage = "Usage: godmode", execution = Command.Execution.PLAYER) public static class GodModeCommand implements CommandHandler { - + @Override public void execute(GenshinPlayer player, List args) { player.setGodmode(!player.inGodmode()); player.dropMessage("Godmode is now " + (player.inGodmode() ? "enabled" : "disabled") + "."); } } - - @Command(label = "sethealth", aliases = {"sethp"}, - usage = "Usage: sethealth ", execution = Command.Execution.PLAYER) + + @Command(label = "sethealth", aliases = { + "sethp" }, usage = "Usage: sethealth ", execution = Command.Execution.PLAYER) public static class SetHealthCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { - CommandHandler.sendMessage(null, "Usage: sethealth "); return; + if (args.size() < 1) { + CommandHandler.sendMessage(null, "Usage: sethealth "); + return; } - + try { int health = Integer.parseInt(args.get(0)); EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); - if(entity == null) + if (entity == null) return; - + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); + entity.getWorld().broadcastPacket( + new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); player.dropMessage("Health set to " + health + "."); } catch (NumberFormatException ignored) { CommandHandler.sendMessage(null, "Invalid health value."); @@ -447,15 +477,16 @@ public final class PlayerCommands { } } - @Command(label = "setworldlevel", aliases = {"setworldlvl"}, - usage = "Usage: setworldlevel ", execution = Command.Execution.PLAYER) + @Command(label = "setworldlevel", aliases = { + "setworldlvl" }, usage = "Usage: setworldlevel ", execution = Command.Execution.PLAYER) public static class SetWorldLevelCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { - CommandHandler.sendMessage(player, "Usage: setworldlevel "); return; + if (args.size() < 1) { + CommandHandler.sendMessage(player, "Usage: setworldlevel "); + return; } - + try { int level = Integer.parseInt(args.get(0)); @@ -469,9 +500,9 @@ public final class PlayerCommands { } } } - - @Command(label = "clearartifacts", aliases = {"clearart"}, - usage = "Usage: clearartifacts", execution = Command.Execution.PLAYER) + + @Command(label = "clearartifacts", aliases = { + "clearart" }, usage = "Usage: clearartifacts", execution = Command.Execution.PLAYER) public static class ClearArtifactsCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { @@ -484,15 +515,16 @@ public final class PlayerCommands { } } - @Command(label = "changescene", aliases = {"scene"}, - usage = "Usage: changescene ", execution = Command.Execution.PLAYER) + @Command(label = "changescene", aliases = { + "scene" }, usage = "Usage: changescene ", execution = Command.Execution.PLAYER) public static class ChangeSceneCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { - CommandHandler.sendMessage(player, "Usage: changescene "); return; + if (args.size() < 1) { + CommandHandler.sendMessage(player, "Usage: changescene "); + return; } - + try { int sceneId = Integer.parseInt(args.get(0)); boolean result = player.getWorld().transferPlayerToScene(player, sceneId, player.getPos()); @@ -501,8 +533,18 @@ public final class PlayerCommands { CommandHandler.sendMessage(null, "Scene does not exist or you are already in it"); } } catch (Exception e) { - CommandHandler.sendMessage(player, "Usage: changescene "); return; + CommandHandler.sendMessage(player, "Usage: changescene "); + return; } } } + + @Command(label = "restart", usage = "Usage: restart - Restarts the current session", execution = Command.Execution.PLAYER) + public static class RestartCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer player, List args) { + player.getSession().close(); + } + } } From 1422e20bb3dec9ac3102a1b3f01e1d4f1665841b Mon Sep 17 00:00:00 2001 From: memetrollsXD Date: Tue, 19 Apr 2022 19:45:39 +0200 Subject: [PATCH 016/119] Try PlayerTokenRsp instead of LoginRsp --- src/main/java/emu/grasscutter/commands/PlayerCommands.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index 57976381a..0a84b5424 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -20,6 +20,7 @@ import emu.grasscutter.game.props.ActionReason; import emu.grasscutter.game.props.FightProperty; import emu.grasscutter.game.props.PlayerProperty; import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; +import emu.grasscutter.server.packet.send.PacketGetPlayerTokenRsp; import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; import emu.grasscutter.server.packet.send.PacketPlayerLoginRsp; import emu.grasscutter.utils.Position; @@ -544,7 +545,8 @@ public final class PlayerCommands { @Override public void execute(GenshinPlayer player, List args) { - player.getSession().close(); + // player.getSession().close(); + player.getSession().send(new PacketGetPlayerTokenRsp(player.getSession(), true)); } } } From 85801df482ce36426fd3780fe1c26c4f460de745 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 19 Apr 2022 14:11:48 -0400 Subject: [PATCH 017/119] Small updates to server commands --- .../grasscutter/commands/ServerCommands.java | 23 +++++++------------ .../java/emu/grasscutter/tools/Tools.java | 3 ++- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/ServerCommands.java b/src/main/java/emu/grasscutter/commands/ServerCommands.java index a4014be57..edeac6ca3 100644 --- a/src/main/java/emu/grasscutter/commands/ServerCommands.java +++ b/src/main/java/emu/grasscutter/commands/ServerCommands.java @@ -1,17 +1,11 @@ package emu.grasscutter.commands; -import com.mongodb.internal.connection.CommandHelper; import emu.grasscutter.Grasscutter; import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.game.Account; import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.server.packet.send.PacketSceneKickPlayerRsp; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.stream.Collectors; +import java.util.*; /** * A container for server-related commands. @@ -46,18 +40,17 @@ public final class ServerCommands { @Override public void execute(GenshinPlayer player, List args) { int target = Integer.parseInt(args.get(0)); - String message = String.join(" ", args.subList(1, args.size())); GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); if(targetPlayer == null) { CommandHandler.sendMessage(player, "Player not found."); return; } + if(player != null) { CommandHandler.sendMessage(null, String.format("Player [%s:%s] has kicked player [%s:%s]", player.getAccount().getPlayerId(), player.getAccount().getUsername(), target, targetPlayer.getAccount().getUsername())); } - - CommandHandler.sendMessage(player, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); + CommandHandler.sendMessage(player, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); targetPlayer.getSession().close(); } @@ -259,12 +252,12 @@ public final class ServerCommands { public void execute(GenshinPlayer player, List args) { if(args.size() < 1) { HashMap handlers = CommandMap.getInstance().getHandlers(); - List annotations = new ArrayList(); + List annotations = new ArrayList<>(); for(String key : handlers.keySet()) { Command annotation = handlers.get(key).getClass().getAnnotation(Command.class); if(!Arrays.asList(annotation.aliases()).contains(key)) { - if(player != null && annotation.permission() != "" && !player.getAccount().hasPermission(annotation.permission())) continue; + if(player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) continue; annotations.add(annotation); } } @@ -288,7 +281,7 @@ public final class ServerCommands { builder.append(alias).append(" "); } } - if(player != null && annotation.permission() != "" && !player.getAccount().hasPermission(annotation.permission())) { + if(player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) { builder.append("\n Warning: You do not have permission to run this command."); } } @@ -301,7 +294,7 @@ public final class ServerCommands { if(player == null) { StringBuilder builder = new StringBuilder("\nAvailable commands:\n"); annotations.forEach(annotation -> { - if (annotation.execution() != (player == null ? Command.Execution.PLAYER : Command.Execution.CONSOLE)) { + if (annotation.execution() != Command.Execution.PLAYER) { builder.append(annotation.label()).append("\n"); builder.append(" ").append(annotation.description()).append("\n"); builder.append(" Usage: ").append(annotation.usage()); @@ -320,7 +313,7 @@ public final class ServerCommands { } else { CommandHandler.sendMessage(player, "Available commands:"); annotations.forEach(annotation -> { - if (annotation.execution() != (player == null ? Command.Execution.PLAYER : Command.Execution.CONSOLE)) { + if (annotation.execution() != Command.Execution.CONSOLE) { StringBuilder builder = new StringBuilder(annotation.label()).append("\n"); builder.append(" ").append(annotation.description()).append("\n"); builder.append(" Usage: ").append(annotation.usage()); diff --git a/src/main/java/emu/grasscutter/tools/Tools.java b/src/main/java/emu/grasscutter/tools/Tools.java index 2e4a7e153..6f6466773 100644 --- a/src/main/java/emu/grasscutter/tools/Tools.java +++ b/src/main/java/emu/grasscutter/tools/Tools.java @@ -21,6 +21,7 @@ import emu.grasscutter.data.def.AvatarData; import emu.grasscutter.data.def.ItemData; import emu.grasscutter.data.def.MonsterData; import emu.grasscutter.data.def.SceneData; +import emu.grasscutter.utils.Utils; public final class Tools { @@ -29,7 +30,7 @@ public final class Tools { ResourceLoader.loadResources(); Map map; - try (FileReader fileReader = new FileReader(Grasscutter.getConfig().RESOURCE_FOLDER + "TextMapEN.json")) { + try (FileReader fileReader = new FileReader(Utils.toFilePath(Grasscutter.getConfig().RESOURCE_FOLDER + "TextMap/TextMapEN.json"))) { map = Grasscutter.getGsonFactory().fromJson(fileReader, new TypeToken>() {}.getType()); } From 7e4e1c086c66c1407be7bbbcf9005d7a6556f463 Mon Sep 17 00:00:00 2001 From: junu128 <93566768+junu128@users.noreply.github.com> Date: Wed, 20 Apr 2022 10:50:05 +0800 Subject: [PATCH 018/119] Add files via upload --- add-to-wiki/resources-fun.md | 77 ++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 add-to-wiki/resources-fun.md diff --git a/add-to-wiki/resources-fun.md b/add-to-wiki/resources-fun.md new file mode 100644 index 000000000..7fc3653f6 --- /dev/null +++ b/add-to-wiki/resources-fun.md @@ -0,0 +1,77 @@ +# Fun +## Prerequisites +- [MongoDBCompass](https://www.mongodb.com/try/download/compass) + +*** + +### Colored nickname and signature :peacock: ([written by](https://github.com/actuallyeunha)) +Unity supports colored text by default (See [Unity Manual](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/StyledText.html) for more info) + +By replacing them with `text` or `text` you can change most, if not all, strings' colors. + + +1. Open MongoDBCompass and connect to your db +2. Go to `grasscutter/players` +3. Make your changes. *Change it inside `playerProfile` too!*
+ e.g `nickname: "na.na"`;
+ `signature: "Running on Grasscutter!"` +4. Update the document +5. Relog to see changes + +Enjoy your colorful name :sparkles: + + +*** +## Avatar/Character +### Changing Level/Ascension/Talents +> Make sure you have created an account with the avatars/characters. +1. Open **MongoDBCompass** +2. Connect to the host (default URI is `mongodb://localhost:27017`) +3. Navigate to Databases > `grasscutter` > `avatars` +4. (Optional) Set **View** to `JSON View` +5. In the **Filter** field, type `{ avatarId: X }` where `X` is the Avatar ID that you are trying to modify. **Avatar IDs are 8-digits.** +6. Click the **Find** next to the field. +7. After the documents have been filtered, edit the document + 1. To change character **level**, change the value next to `"level"` + 2. To change character **ascension**, change the value next to `"promoteLevel"` + Check [Wiki](https://genshin-impact.fandom.com/wiki/Characters#:~:text=one%20Acquaint%20Fate.-,Ascension%20Phase,-Max%20Char.%20Level) for ascension values + 3. To change **talents**, expand `"proudSkillList"` + 1. To unlock the avatar's **1st Ascension Passive**, add XX2101 inside `"proudSkillList"`, where **XX is the last 2 digits of the Avatar ID**. **Make sure to add a `,` for each line.** + 2. To unlock the avatar's **4th Ascension Passive**, do the same as before, but replace `2101` with `2201`. +8. After editing, you can now **Replace**. + +### Example +A document in JSON view that has the Avatar ID 10000058, level 90, ascension phase 6, all talents unlocked. + + + + +### Notes +- On the last line of `"proudSkillList"`, a `,` is no longer needed. +- After replacing the document, make sure to restart the server for changes to take effect. + + +## Weapons +> Make sure you have created an account with the weapons. +1. Open **MongoDBCompass** +2. Connect to the host (default URI is `mongodb://localhost:27017`) +3. Navigate to Databases > `grasscutter` > `items` +4. (Optional) Set **View** to `JSON View` +5. In the **Filter** field, type `{ itemId: Y }` where `Y` is the Item/Weapon ID that you are trying to modify. **Weapon IDs are 5 digits.** +6. Click the **Find** next to the field. +7. After the documents have been filtered, edit the document + 1. To change weapon **level**, change the value next to `"level"` + 2. To change weapon **ascension**, change the value next to `"promoteLevel"` + Check [Wiki](https://genshin-impact.fandom.com/wiki/Weapons#:~:text=reaching%202nd%20Ascension.-,Ascension%20Phase,-Max%20Weapon%20Level) for ascension values + 3. To change **refinement**, change the value next to `"refinement"` + * Refinement Rank 1 = 0 + * Refinement Rank 2 = 1 + * Refinement Rank 3 = 2 + * Refinement Rank 4 = 3 + * Refinement Rank 5 = 4 +8. After editing, you can now **Replace**. + +### Example +A document in JSON view that has the Weapon ID 12503, level 90, ascension phase 6, refinement rank 5. + + \ No newline at end of file From 1a92ce80c67ab5a617af6436572a90bfeeddbef5 Mon Sep 17 00:00:00 2001 From: junu128 <93566768+junu128@users.noreply.github.com> Date: Wed, 20 Apr 2022 11:12:16 +0800 Subject: [PATCH 019/119] Update resources-fun.md --- add-to-wiki/resources-fun.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/add-to-wiki/resources-fun.md b/add-to-wiki/resources-fun.md index 7fc3653f6..57808f841 100644 --- a/add-to-wiki/resources-fun.md +++ b/add-to-wiki/resources-fun.md @@ -22,6 +22,7 @@ Enjoy your colorful name :sparkles: *** +This guide is recommended if you have the character/weapon. If you want to get a character at Level Z, then use !givechar [level] ## Avatar/Character ### Changing Level/Ascension/Talents > Make sure you have created an account with the avatars/characters. @@ -74,4 +75,4 @@ A document in JSON view that has the Avatar ID 10000058, level 90, ascension pha ### Example A document in JSON view that has the Weapon ID 12503, level 90, ascension phase 6, refinement rank 5. - \ No newline at end of file + From b7f98972fa5a3c3f0ae3db8d975ffc7ca4a2cea1 Mon Sep 17 00:00:00 2001 From: junu128 <93566768+junu128@users.noreply.github.com> Date: Wed, 20 Apr 2022 11:12:56 +0800 Subject: [PATCH 020/119] Update resources-fun.md --- add-to-wiki/resources-fun.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/add-to-wiki/resources-fun.md b/add-to-wiki/resources-fun.md index 57808f841..86c0e898c 100644 --- a/add-to-wiki/resources-fun.md +++ b/add-to-wiki/resources-fun.md @@ -22,8 +22,8 @@ Enjoy your colorful name :sparkles: *** -This guide is recommended if you have the character/weapon. If you want to get a character at Level Z, then use !givechar [level] ## Avatar/Character +This guide is recommended if you have the character/weapon. If you want to get a character at Level Z, then use !givechar [level] ### Changing Level/Ascension/Talents > Make sure you have created an account with the avatars/characters. 1. Open **MongoDBCompass** From a3bb1b1b54344c1860d1749e8a22aaffc15d0eb3 Mon Sep 17 00:00:00 2001 From: junu128 <93566768+junu128@users.noreply.github.com> Date: Wed, 20 Apr 2022 11:50:56 +0800 Subject: [PATCH 021/119] Update resources-fun.md --- add-to-wiki/resources-fun.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/add-to-wiki/resources-fun.md b/add-to-wiki/resources-fun.md index 86c0e898c..6b1afea25 100644 --- a/add-to-wiki/resources-fun.md +++ b/add-to-wiki/resources-fun.md @@ -23,7 +23,7 @@ Enjoy your colorful name :sparkles: *** ## Avatar/Character -This guide is recommended if you have the character/weapon. If you want to get a character at Level Z, then use !givechar [level] +This guide is recommended if you have the character/weapon. If you want to get a character at Level Z, then use !givechar [avatarID] [level] ### Changing Level/Ascension/Talents > Make sure you have created an account with the avatars/characters. 1. Open **MongoDBCompass** From 50e630b1fa41ebca206f37bd34944539ae50f9a2 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Wed, 20 Apr 2022 00:03:01 -0400 Subject: [PATCH 022/119] Automatically create account on login screen --- .../emu/grasscutter/commands/CommandMap.java | 4 ++-- .../emu/grasscutter/commands/ServerCommands.java | 1 + .../server/dispatch/DispatchServer.java | 16 ++++++++-------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/CommandMap.java b/src/main/java/emu/grasscutter/commands/CommandMap.java index a802551ce..aee080912 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(!Objects.equals(permissionNode, "") && !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..a3c73d465 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -225,16 +225,16 @@ 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."; - } else { - responseData.message = "OK"; - responseData.data.account.uid = account.getId(); - responseData.data.account.token = account.generateSessionKey(); - responseData.data.account.email = account.getEmail(); + account = DatabaseHelper.createAccountWithId(requestData.account, 0); + // This account has been created AUTOMATICALLY. There will be no permissions added. } + + responseData.message = "OK"; + responseData.data.account.uid = account.getId(); + responseData.data.account.token = account.generateSessionKey(); + responseData.data.account.email = account.getEmail(); // Create a response String response = getGsonFactory().toJson(responseData); From c0155b8dcc636d36dd4467261f026dd53f2ed06a Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Wed, 20 Apr 2022 00:10:32 -0400 Subject: [PATCH 023/119] Add config option --- src/main/java/emu/grasscutter/Config.java | 1 + .../server/dispatch/DispatchServer.java | 22 +++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) 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/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index a3c73d465..dab6ba0a4 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -226,15 +226,23 @@ public final class DispatchServer { Account account = DatabaseHelper.getAccountByName(requestData.account); // Check if account exists, else create a new one. - if (account == null) { - account = DatabaseHelper.createAccountWithId(requestData.account, 0); + if (account == null && 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 if (!Grasscutter.getConfig().ServerOptions.AutomaticallyCreateAccounts) { + responseData.retcode = -201; + responseData.message = "Username not found."; + } else { + responseData.message = "OK"; + responseData.data.account.uid = account.getId(); + responseData.data.account.token = account.generateSessionKey(); + responseData.data.account.email = account.getEmail(); } - - responseData.message = "OK"; - responseData.data.account.uid = account.getId(); - responseData.data.account.token = account.generateSessionKey(); - responseData.data.account.email = account.getEmail(); // Create a response String response = getGsonFactory().toJson(responseData); From 7485e9fd4ec822ae1518bef196dd20517c99e471 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Wed, 20 Apr 2022 00:10:43 -0400 Subject: [PATCH 024/119] Change to `String#equals` --- src/main/java/emu/grasscutter/commands/CommandMap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/commands/CommandMap.java b/src/main/java/emu/grasscutter/commands/CommandMap.java index aee080912..ba3fbb7c0 100644 --- a/src/main/java/emu/grasscutter/commands/CommandMap.java +++ b/src/main/java/emu/grasscutter/commands/CommandMap.java @@ -113,7 +113,7 @@ public final class CommandMap { if(player != null) { String permissionNode = this.annotations.get(label).permission(); Account account = player.getAccount(); - if(!Objects.equals(permissionNode, "") && !account.hasPermission(permissionNode)) { + if(!permissionNode.equals("*") && !account.hasPermission(permissionNode)) { CommandHandler.sendMessage(player, "You do not have permission to run this command."); return; } } From 9f2cf00b95b50123689af3eae6d2a97a6789ca10 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Wed, 20 Apr 2022 00:15:37 -0400 Subject: [PATCH 025/119] totally not me forgetting how this works --- src/main/java/emu/grasscutter/commands/CommandMap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/commands/CommandMap.java b/src/main/java/emu/grasscutter/commands/CommandMap.java index ba3fbb7c0..5d7d1110b 100644 --- a/src/main/java/emu/grasscutter/commands/CommandMap.java +++ b/src/main/java/emu/grasscutter/commands/CommandMap.java @@ -113,7 +113,7 @@ public final class CommandMap { if(player != null) { String permissionNode = this.annotations.get(label).permission(); Account account = player.getAccount(); - if(!permissionNode.equals("*") && !account.hasPermission(permissionNode)) { + if(!permissionNode.isEmpty() && !account.hasPermission(permissionNode)) { CommandHandler.sendMessage(player, "You do not have permission to run this command."); return; } } From 10f98cf13c2d7dbd93ba9fa321907e192a9013ea Mon Sep 17 00:00:00 2001 From: w4123 <1840686745@qq.com> Date: Wed, 20 Apr 2022 12:25:38 +0800 Subject: [PATCH 026/119] Implement stub NpcTalk packets --- .../net/proto/NpcTalkReqOuterClass.java | 680 ++++++++++++++++ .../net/proto/NpcTalkRspOuterClass.java | 750 ++++++++++++++++++ .../server/packet/recv/HandlerNpcTalkReq.java | 21 + .../server/packet/send/PacketNpcTalkRsp.java | 19 + 4 files changed, 1470 insertions(+) create mode 100644 src/main/java/emu/grasscutter/net/proto/NpcTalkReqOuterClass.java create mode 100644 src/main/java/emu/grasscutter/net/proto/NpcTalkRspOuterClass.java create mode 100644 src/main/java/emu/grasscutter/server/packet/recv/HandlerNpcTalkReq.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketNpcTalkRsp.java diff --git a/src/main/java/emu/grasscutter/net/proto/NpcTalkReqOuterClass.java b/src/main/java/emu/grasscutter/net/proto/NpcTalkReqOuterClass.java new file mode 100644 index 000000000..a974986b9 --- /dev/null +++ b/src/main/java/emu/grasscutter/net/proto/NpcTalkReqOuterClass.java @@ -0,0 +1,680 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Grasscutter-Protos/proto/NpcTalkReq.proto + +package emu.grasscutter.net.proto; + +public final class NpcTalkReqOuterClass { + private NpcTalkReqOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface NpcTalkReqOrBuilder extends + // @@protoc_insertion_point(interface_extends:NpcTalkReq) + com.google.protobuf.MessageOrBuilder { + + /** + * uint32 npc_entity_id = 1; + * @return The npcEntityId. + */ + int getNpcEntityId(); + + /** + * uint32 talk_id = 3; + * @return The talkId. + */ + int getTalkId(); + + /** + * uint32 entity_id = 4; + * @return The entityId. + */ + int getEntityId(); + } + /** + * Protobuf type {@code NpcTalkReq} + */ + public static final class NpcTalkReq extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:NpcTalkReq) + NpcTalkReqOrBuilder { + private static final long serialVersionUID = 0L; + // Use NpcTalkReq.newBuilder() to construct. + private NpcTalkReq(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private NpcTalkReq() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new NpcTalkReq(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private NpcTalkReq( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + + npcEntityId_ = input.readUInt32(); + break; + } + case 24: { + + talkId_ = input.readUInt32(); + break; + } + case 32: { + + entityId_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.NpcTalkReqOuterClass.internal_static_NpcTalkReq_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.NpcTalkReqOuterClass.internal_static_NpcTalkReq_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq.class, emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq.Builder.class); + } + + public static final int NPC_ENTITY_ID_FIELD_NUMBER = 1; + private int npcEntityId_; + /** + * uint32 npc_entity_id = 1; + * @return The npcEntityId. + */ + @java.lang.Override + public int getNpcEntityId() { + return npcEntityId_; + } + + public static final int TALK_ID_FIELD_NUMBER = 3; + private int talkId_; + /** + * uint32 talk_id = 3; + * @return The talkId. + */ + @java.lang.Override + public int getTalkId() { + return talkId_; + } + + public static final int ENTITY_ID_FIELD_NUMBER = 4; + private int entityId_; + /** + * uint32 entity_id = 4; + * @return The entityId. + */ + @java.lang.Override + public int getEntityId() { + return entityId_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (npcEntityId_ != 0) { + output.writeUInt32(1, npcEntityId_); + } + if (talkId_ != 0) { + output.writeUInt32(3, talkId_); + } + if (entityId_ != 0) { + output.writeUInt32(4, entityId_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (npcEntityId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, npcEntityId_); + } + if (talkId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(3, talkId_); + } + if (entityId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(4, entityId_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq)) { + return super.equals(obj); + } + emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq other = (emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq) obj; + + if (getNpcEntityId() + != other.getNpcEntityId()) return false; + if (getTalkId() + != other.getTalkId()) return false; + if (getEntityId() + != other.getEntityId()) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NPC_ENTITY_ID_FIELD_NUMBER; + hash = (53 * hash) + getNpcEntityId(); + hash = (37 * hash) + TALK_ID_FIELD_NUMBER; + hash = (53 * hash) + getTalkId(); + hash = (37 * hash) + ENTITY_ID_FIELD_NUMBER; + hash = (53 * hash) + getEntityId(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code NpcTalkReq} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:NpcTalkReq) + emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReqOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.NpcTalkReqOuterClass.internal_static_NpcTalkReq_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.NpcTalkReqOuterClass.internal_static_NpcTalkReq_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq.class, emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq.Builder.class); + } + + // Construct using emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + npcEntityId_ = 0; + + talkId_ = 0; + + entityId_ = 0; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return emu.grasscutter.net.proto.NpcTalkReqOuterClass.internal_static_NpcTalkReq_descriptor; + } + + @java.lang.Override + public emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq getDefaultInstanceForType() { + return emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq.getDefaultInstance(); + } + + @java.lang.Override + public emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq build() { + emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq buildPartial() { + emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq result = new emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq(this); + result.npcEntityId_ = npcEntityId_; + result.talkId_ = talkId_; + result.entityId_ = entityId_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq) { + return mergeFrom((emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq other) { + if (other == emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq.getDefaultInstance()) return this; + if (other.getNpcEntityId() != 0) { + setNpcEntityId(other.getNpcEntityId()); + } + if (other.getTalkId() != 0) { + setTalkId(other.getTalkId()); + } + if (other.getEntityId() != 0) { + setEntityId(other.getEntityId()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int npcEntityId_ ; + /** + * uint32 npc_entity_id = 1; + * @return The npcEntityId. + */ + @java.lang.Override + public int getNpcEntityId() { + return npcEntityId_; + } + /** + * uint32 npc_entity_id = 1; + * @param value The npcEntityId to set. + * @return This builder for chaining. + */ + public Builder setNpcEntityId(int value) { + + npcEntityId_ = value; + onChanged(); + return this; + } + /** + * uint32 npc_entity_id = 1; + * @return This builder for chaining. + */ + public Builder clearNpcEntityId() { + + npcEntityId_ = 0; + onChanged(); + return this; + } + + private int talkId_ ; + /** + * uint32 talk_id = 3; + * @return The talkId. + */ + @java.lang.Override + public int getTalkId() { + return talkId_; + } + /** + * uint32 talk_id = 3; + * @param value The talkId to set. + * @return This builder for chaining. + */ + public Builder setTalkId(int value) { + + talkId_ = value; + onChanged(); + return this; + } + /** + * uint32 talk_id = 3; + * @return This builder for chaining. + */ + public Builder clearTalkId() { + + talkId_ = 0; + onChanged(); + return this; + } + + private int entityId_ ; + /** + * uint32 entity_id = 4; + * @return The entityId. + */ + @java.lang.Override + public int getEntityId() { + return entityId_; + } + /** + * uint32 entity_id = 4; + * @param value The entityId to set. + * @return This builder for chaining. + */ + public Builder setEntityId(int value) { + + entityId_ = value; + onChanged(); + return this; + } + /** + * uint32 entity_id = 4; + * @return This builder for chaining. + */ + public Builder clearEntityId() { + + entityId_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:NpcTalkReq) + } + + // @@protoc_insertion_point(class_scope:NpcTalkReq) + private static final emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq(); + } + + public static emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public NpcTalkReq parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new NpcTalkReq(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_NpcTalkReq_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_NpcTalkReq_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n)Grasscutter-Protos/proto/NpcTalkReq.pr" + + "oto\"G\n\nNpcTalkReq\022\025\n\rnpc_entity_id\030\001 \001(\r" + + "\022\017\n\007talk_id\030\003 \001(\r\022\021\n\tentity_id\030\004 \001(\rB1\n\031" + + "emu.grasscutter.net.protoB\024NpcTalkReqOut" + + "erClassb\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_NpcTalkReq_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_NpcTalkReq_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_NpcTalkReq_descriptor, + new java.lang.String[] { "NpcEntityId", "TalkId", "EntityId", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/src/main/java/emu/grasscutter/net/proto/NpcTalkRspOuterClass.java b/src/main/java/emu/grasscutter/net/proto/NpcTalkRspOuterClass.java new file mode 100644 index 000000000..80daa3154 --- /dev/null +++ b/src/main/java/emu/grasscutter/net/proto/NpcTalkRspOuterClass.java @@ -0,0 +1,750 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Grasscutter-Protos/proto/NpcTalkRsp.proto + +package emu.grasscutter.net.proto; + +public final class NpcTalkRspOuterClass { + private NpcTalkRspOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface NpcTalkRspOrBuilder extends + // @@protoc_insertion_point(interface_extends:NpcTalkRsp) + com.google.protobuf.MessageOrBuilder { + + /** + * int32 retcode = 1; + * @return The retcode. + */ + int getRetcode(); + + /** + * uint32 npc_entity_id = 2; + * @return The npcEntityId. + */ + int getNpcEntityId(); + + /** + * uint32 cur_talk_id = 4; + * @return The curTalkId. + */ + int getCurTalkId(); + + /** + * uint32 entity_id = 5; + * @return The entityId. + */ + int getEntityId(); + } + /** + * Protobuf type {@code NpcTalkRsp} + */ + public static final class NpcTalkRsp extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:NpcTalkRsp) + NpcTalkRspOrBuilder { + private static final long serialVersionUID = 0L; + // Use NpcTalkRsp.newBuilder() to construct. + private NpcTalkRsp(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private NpcTalkRsp() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new NpcTalkRsp(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private NpcTalkRsp( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + + retcode_ = input.readInt32(); + break; + } + case 16: { + + npcEntityId_ = input.readUInt32(); + break; + } + case 32: { + + curTalkId_ = input.readUInt32(); + break; + } + case 40: { + + entityId_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.NpcTalkRspOuterClass.internal_static_NpcTalkRsp_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.NpcTalkRspOuterClass.internal_static_NpcTalkRsp_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp.class, emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp.Builder.class); + } + + public static final int RETCODE_FIELD_NUMBER = 1; + private int retcode_; + /** + * int32 retcode = 1; + * @return The retcode. + */ + @java.lang.Override + public int getRetcode() { + return retcode_; + } + + public static final int NPC_ENTITY_ID_FIELD_NUMBER = 2; + private int npcEntityId_; + /** + * uint32 npc_entity_id = 2; + * @return The npcEntityId. + */ + @java.lang.Override + public int getNpcEntityId() { + return npcEntityId_; + } + + public static final int CUR_TALK_ID_FIELD_NUMBER = 4; + private int curTalkId_; + /** + * uint32 cur_talk_id = 4; + * @return The curTalkId. + */ + @java.lang.Override + public int getCurTalkId() { + return curTalkId_; + } + + public static final int ENTITY_ID_FIELD_NUMBER = 5; + private int entityId_; + /** + * uint32 entity_id = 5; + * @return The entityId. + */ + @java.lang.Override + public int getEntityId() { + return entityId_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (retcode_ != 0) { + output.writeInt32(1, retcode_); + } + if (npcEntityId_ != 0) { + output.writeUInt32(2, npcEntityId_); + } + if (curTalkId_ != 0) { + output.writeUInt32(4, curTalkId_); + } + if (entityId_ != 0) { + output.writeUInt32(5, entityId_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (retcode_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(1, retcode_); + } + if (npcEntityId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, npcEntityId_); + } + if (curTalkId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(4, curTalkId_); + } + if (entityId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(5, entityId_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp)) { + return super.equals(obj); + } + emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp other = (emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp) obj; + + if (getRetcode() + != other.getRetcode()) return false; + if (getNpcEntityId() + != other.getNpcEntityId()) return false; + if (getCurTalkId() + != other.getCurTalkId()) return false; + if (getEntityId() + != other.getEntityId()) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + RETCODE_FIELD_NUMBER; + hash = (53 * hash) + getRetcode(); + hash = (37 * hash) + NPC_ENTITY_ID_FIELD_NUMBER; + hash = (53 * hash) + getNpcEntityId(); + hash = (37 * hash) + CUR_TALK_ID_FIELD_NUMBER; + hash = (53 * hash) + getCurTalkId(); + hash = (37 * hash) + ENTITY_ID_FIELD_NUMBER; + hash = (53 * hash) + getEntityId(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code NpcTalkRsp} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:NpcTalkRsp) + emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRspOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.NpcTalkRspOuterClass.internal_static_NpcTalkRsp_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.NpcTalkRspOuterClass.internal_static_NpcTalkRsp_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp.class, emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp.Builder.class); + } + + // Construct using emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + retcode_ = 0; + + npcEntityId_ = 0; + + curTalkId_ = 0; + + entityId_ = 0; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return emu.grasscutter.net.proto.NpcTalkRspOuterClass.internal_static_NpcTalkRsp_descriptor; + } + + @java.lang.Override + public emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp getDefaultInstanceForType() { + return emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp.getDefaultInstance(); + } + + @java.lang.Override + public emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp build() { + emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp buildPartial() { + emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp result = new emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp(this); + result.retcode_ = retcode_; + result.npcEntityId_ = npcEntityId_; + result.curTalkId_ = curTalkId_; + result.entityId_ = entityId_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp) { + return mergeFrom((emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp other) { + if (other == emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp.getDefaultInstance()) return this; + if (other.getRetcode() != 0) { + setRetcode(other.getRetcode()); + } + if (other.getNpcEntityId() != 0) { + setNpcEntityId(other.getNpcEntityId()); + } + if (other.getCurTalkId() != 0) { + setCurTalkId(other.getCurTalkId()); + } + if (other.getEntityId() != 0) { + setEntityId(other.getEntityId()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int retcode_ ; + /** + * int32 retcode = 1; + * @return The retcode. + */ + @java.lang.Override + public int getRetcode() { + return retcode_; + } + /** + * int32 retcode = 1; + * @param value The retcode to set. + * @return This builder for chaining. + */ + public Builder setRetcode(int value) { + + retcode_ = value; + onChanged(); + return this; + } + /** + * int32 retcode = 1; + * @return This builder for chaining. + */ + public Builder clearRetcode() { + + retcode_ = 0; + onChanged(); + return this; + } + + private int npcEntityId_ ; + /** + * uint32 npc_entity_id = 2; + * @return The npcEntityId. + */ + @java.lang.Override + public int getNpcEntityId() { + return npcEntityId_; + } + /** + * uint32 npc_entity_id = 2; + * @param value The npcEntityId to set. + * @return This builder for chaining. + */ + public Builder setNpcEntityId(int value) { + + npcEntityId_ = value; + onChanged(); + return this; + } + /** + * uint32 npc_entity_id = 2; + * @return This builder for chaining. + */ + public Builder clearNpcEntityId() { + + npcEntityId_ = 0; + onChanged(); + return this; + } + + private int curTalkId_ ; + /** + * uint32 cur_talk_id = 4; + * @return The curTalkId. + */ + @java.lang.Override + public int getCurTalkId() { + return curTalkId_; + } + /** + * uint32 cur_talk_id = 4; + * @param value The curTalkId to set. + * @return This builder for chaining. + */ + public Builder setCurTalkId(int value) { + + curTalkId_ = value; + onChanged(); + return this; + } + /** + * uint32 cur_talk_id = 4; + * @return This builder for chaining. + */ + public Builder clearCurTalkId() { + + curTalkId_ = 0; + onChanged(); + return this; + } + + private int entityId_ ; + /** + * uint32 entity_id = 5; + * @return The entityId. + */ + @java.lang.Override + public int getEntityId() { + return entityId_; + } + /** + * uint32 entity_id = 5; + * @param value The entityId to set. + * @return This builder for chaining. + */ + public Builder setEntityId(int value) { + + entityId_ = value; + onChanged(); + return this; + } + /** + * uint32 entity_id = 5; + * @return This builder for chaining. + */ + public Builder clearEntityId() { + + entityId_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:NpcTalkRsp) + } + + // @@protoc_insertion_point(class_scope:NpcTalkRsp) + private static final emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp(); + } + + public static emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public NpcTalkRsp parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new NpcTalkRsp(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_NpcTalkRsp_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_NpcTalkRsp_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n)Grasscutter-Protos/proto/NpcTalkRsp.pr" + + "oto\"\\\n\nNpcTalkRsp\022\017\n\007retcode\030\001 \001(\005\022\025\n\rnp" + + "c_entity_id\030\002 \001(\r\022\023\n\013cur_talk_id\030\004 \001(\r\022\021" + + "\n\tentity_id\030\005 \001(\rB1\n\031emu.grasscutter.net" + + ".protoB\024NpcTalkRspOuterClassb\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_NpcTalkRsp_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_NpcTalkRsp_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_NpcTalkRsp_descriptor, + new java.lang.String[] { "Retcode", "NpcEntityId", "CurTalkId", "EntityId", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerNpcTalkReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerNpcTalkReq.java new file mode 100644 index 000000000..588e1c4e1 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerNpcTalkReq.java @@ -0,0 +1,21 @@ +package emu.grasscutter.server.packet.recv; + +import emu.grasscutter.game.inventory.GenshinItem; +import emu.grasscutter.net.packet.Opcodes; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.NpcTalkReqOuterClass.NpcTalkReq; +import emu.grasscutter.net.packet.PacketHandler; +import emu.grasscutter.server.game.GameSession; +import emu.grasscutter.server.packet.send.PacketNpcTalkRsp; + +@Opcodes(PacketOpcodes.NpcTalkReq) +public class HandlerNpcTalkReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + NpcTalkReq req = NpcTalkReq.parseFrom(payload); + + session.send(new PacketNpcTalkRsp(req.getNpcEntityId(), req.getTalkId(), req.getEntityId())); + } + +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketNpcTalkRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketNpcTalkRsp.java new file mode 100644 index 000000000..b447a19eb --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketNpcTalkRsp.java @@ -0,0 +1,19 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.net.packet.GenshinPacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.NpcTalkRspOuterClass.NpcTalkRsp; + +public class PacketNpcTalkRsp extends GenshinPacket { + public PacketNpcTalkRsp(int npcEntityId, int curTalkId, int entityId) { + super(PacketOpcodes.NpcTalkRsp); + + NpcTalkRsp p = NpcTalkRsp.newBuilder() + .setNpcEntityId(npcEntityId) + .setCurTalkId(curTalkId) + .setEntityId(entityId) + .build(); + + this.setData(p); + } +} From 2a4c08f59f4b071a5607ba572e375b83c5f51f25 Mon Sep 17 00:00:00 2001 From: memetrollsXD Date: Wed, 20 Apr 2022 08:52:47 +0200 Subject: [PATCH 027/119] It won't get better than this for now.. --- src/main/java/emu/grasscutter/commands/PlayerCommands.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index 0a84b5424..2c0827b82 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -545,8 +545,7 @@ public final class PlayerCommands { @Override public void execute(GenshinPlayer player, List args) { - // player.getSession().close(); - player.getSession().send(new PacketGetPlayerTokenRsp(player.getSession(), true)); + player.getSession().close(); } } } From b142be953f63127d9c7f7c4f48185d43877ac63a Mon Sep 17 00:00:00 2001 From: memetrollsXD Date: Wed, 20 Apr 2022 09:00:50 +0200 Subject: [PATCH 028/119] Fix merge conflict --- .../grasscutter/commands/PlayerCommands.java | 85 +++++++++++++------ 1 file changed, 59 insertions(+), 26 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index 2c0827b82..ea2cbfbd6 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -32,8 +32,8 @@ import java.util.List; * A container for player-related commands. */ public final class PlayerCommands { - @Command(label = "give", aliases = { "g", "item", - "giveitem" }, usage = "Usage: give [player] [amount]") + @Command(label = "give", aliases = {"g", "item", "giveitem"}, + usage = "give [player] [amount]", description = "Gives an item to you or the specified player", permission = "player.give") public static class GiveCommand implements CommandHandler { @Override @@ -158,9 +158,9 @@ public final class PlayerCommands { } } } - - @Command(label = "drop", aliases = { "d", - "dropitem" }, usage = "Usage: drop [amount]", execution = Command.Execution.PLAYER) + @Command(label = "drop", aliases = {"d", "dropitem"}, + usage = "drop [amount]", + execution = Command.Execution.PLAYER, description = "Drops an item near you", permission = "server.drop") public static class DropCommand implements CommandHandler { @Override @@ -201,8 +201,8 @@ public final class PlayerCommands { } } - @Command(label = "givechar", aliases = { - "givec" }, usage = "Usage: givechar [level|avatarId] [level]") + @Command(label = "givechar", aliases = { "givec" }, usage = "givechar [level]", + description = "Gives the player a specified character", permission = "player.givechar") public static class GiveCharCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { @@ -328,7 +328,8 @@ public final class PlayerCommands { } } - @Command(label = "spawn", execution = Command.Execution.PLAYER, usage = "Usage: spawn [level] [amount]") + @Command(label = "spawn", execution = Command.Execution.PLAYER, + usage = "spawn [level] [amount]", description = "Spawns an entity near you", permission = "server.spawn") public static class SpawnCommand implements CommandHandler { @Override @@ -365,8 +366,9 @@ public final class PlayerCommands { } } } - - @Command(label = "killall", usage = "Usage: killall [playerUid] [sceneId]") + + @Command(label = "killall", + usage = "killall [playerUid] [sceneId]", description = "Kill all entities", permission = "server.killall") public static class KillAllCommand implements CommandHandler { @Override @@ -411,8 +413,9 @@ public final class PlayerCommands { } } - @Command(label = "resetconst", aliases = { - "resetconstellation" }, usage = "Usage: resetconst [all]", execution = Command.Execution.PLAYER) + @Command(label = "resetconst", aliases = {"resetconstellation"}, + usage = "resetconst [all]", execution = Command.Execution.PLAYER, permission = "player.resetconstellation", + description = "Resets the constellation level on your current active character, will need to relog after using the command to see any changes.") public static class ResetConstellationCommand implements CommandHandler { @Override @@ -440,8 +443,9 @@ public final class PlayerCommands { avatar.save(); } } - - @Command(label = "godmode", usage = "Usage: godmode", execution = Command.Execution.PLAYER) + + @Command(label = "godmode", + usage = "godmode", execution = Command.Execution.PLAYER, description = "Prevents you from taking damage", permission = "player.godmode") public static class GodModeCommand implements CommandHandler { @Override @@ -451,8 +455,9 @@ public final class PlayerCommands { } } - @Command(label = "sethealth", aliases = { - "sethp" }, usage = "Usage: sethealth ", execution = Command.Execution.PLAYER) + @Command(label = "sethealth", aliases = {"sethp"}, + usage = "sethealth ", execution = Command.Execution.PLAYER, description = "Sets your health to the specified value", + permission = "player.sethealth") public static class SetHealthCommand implements CommandHandler { @Override @@ -478,8 +483,9 @@ public final class PlayerCommands { } } - @Command(label = "setworldlevel", aliases = { - "setworldlvl" }, usage = "Usage: setworldlevel ", execution = Command.Execution.PLAYER) + @Command(label = "setworldlevel", aliases = {"setworldlvl"}, usage = "setworldlevel ", + description = "Sets your world level (Relog to see proper effects)", permission = "player.setworldlevel", + execution = Command.Execution.PLAYER) public static class SetWorldLevelCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { @@ -501,9 +507,10 @@ public final class PlayerCommands { } } } - - @Command(label = "clearartifacts", aliases = { - "clearart" }, usage = "Usage: clearartifacts", execution = Command.Execution.PLAYER) + + @Command(label = "clearartifacts", aliases = {"clearart"}, + usage = "clearartifacts", execution = Command.Execution.PLAYER, permission = "player.clearartifacts", + description = "Deletes all unequipped and unlocked level 0 artifacts, including yellow rarity ones from your inventory") public static class ClearArtifactsCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { @@ -516,8 +523,8 @@ public final class PlayerCommands { } } - @Command(label = "changescene", aliases = { - "scene" }, usage = "Usage: changescene ", execution = Command.Execution.PLAYER) + @Command(label = "changescene", aliases = {"scene"}, + usage = "changescene ", description = "Changes your scene", permission = "player.changescene", execution = Command.Execution.PLAYER) public static class ChangeSceneCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { @@ -540,12 +547,38 @@ public final class PlayerCommands { } } - @Command(label = "restart", usage = "Usage: restart - Restarts the current session", execution = Command.Execution.PLAYER) - public static class RestartCommand implements CommandHandler { + @Command(label = "sendservermessage", aliases = {"sendservmsg"}, + usage = "sendservermessage ", description = "Sends a message to a player as the server", + execution = Command.Execution.PLAYER, permission = "server.sendmessage") + public static class SendServerMessageCommand implements CommandHandler { + @Override + public void execute(GenshinPlayer player, List args) { + if(args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: sendmessage "); return; + } + try { + int target = Integer.parseInt(args.get(0)); + String message = String.join(" ", args.subList(1, args.size())); + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + if(targetPlayer == null) { + CommandHandler.sendMessage(null, "Player not found."); return; + } + + targetPlayer.dropMessage(message); + CommandHandler.sendMessage(null, "Message sent."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid player ID."); + } + } + } + + @Command(label = "restart", usage = "Usage: restart", description = "Restarts the current session", execution = Command.Execution.PLAYER, permission = "player.restart") + public static class RestartCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { player.getSession().close(); } } -} +} \ No newline at end of file From c08a341b203334577bfe7fcdba135f807d16a338 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Wed, 20 Apr 2022 16:05:53 +0800 Subject: [PATCH 029/119] Update gradle + Work gacha reload (gs broken atm) --- build.gradle | 24 ++++++---- gradle/wrapper/gradle-wrapper.properties | 2 +- src/main/java/emu/grasscutter/Config.java | 3 +- .../grasscutter/game/gacha/GachaManager.java | 46 ++++++++++++++++++- .../grasscutter/server/game/GameServer.java | 10 ++++ .../server/game/GameServerTickEvent.java | 5 ++ 6 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 src/main/java/emu/grasscutter/server/game/GameServerTickEvent.java diff --git a/build.gradle b/build.gradle index c7c9eae79..97477456a 100644 --- a/build.gradle +++ b/build.gradle @@ -23,19 +23,21 @@ repositories { } dependencies { - compile fileTree(dir: 'lib', include: '*.jar') + implementation fileTree(dir: 'lib', include: ['*.jar']) - compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.32' - compile group: 'ch.qos.logback', name: 'logback-core', version: '1.2.6' - compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.6' - compile group: 'io.netty', name: 'netty-all', version: '4.1.69.Final' + implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.32' + implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.2.6' + implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.6' + implementation group: 'io.netty', name: 'netty-all', version: '4.1.69.Final' - compile group: 'com.google.code.gson', name: 'gson', version: '2.8.8' - compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.18.1' + implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.8' + implementation group: 'com.google.protobuf', name: 'protobuf-java', version: '3.18.1' - compile group: 'org.reflections', name: 'reflections', version: '0.9.12' + implementation group: 'org.reflections', name: 'reflections', version: '0.9.12' - compile group: 'dev.morphia.morphia', name: 'core', version: '1.6.1' + implementation group: 'dev.morphia.morphia', name: 'core', version: '1.6.1' + + implementation group: 'org.greenrobot', name: 'eventbus-java', version: '3.3.1' } application { @@ -51,9 +53,11 @@ jar { jar.baseName = 'grasscutter' from { - configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } + duplicatesStrategy = DuplicatesStrategy.INCLUDE + from('src/main/java') { include '*.xml' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f04d6a20a..aa991fcea 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/emu/grasscutter/Config.java b/src/main/java/emu/grasscutter/Config.java index 983524223..510d7c822 100644 --- a/src/main/java/emu/grasscutter/Config.java +++ b/src/main/java/emu/grasscutter/Config.java @@ -24,7 +24,7 @@ public final class Config { public String DUMPS_FOLDER = "./dumps/"; public String KEY_FOLDER = "./keys/"; public boolean LOG_PACKETS = false; - + public GameRates Game = new GameRates(); public ServerOptions ServerOptions = new ServerOptions(); @@ -51,6 +51,7 @@ public final class Config { public int MaxAvatarsInTeam = 4; public int MaxAvatarsInTeamMultiplayer = 4; public int MaxEntityLimit = 1000; // Max entity limit per world. // TODO: Enforce later. + public boolean WatchGacha = false; public int[] WelcomeEmotes = {2007, 1002, 4010}; public String WelcomeMotd = "Welcome to Grasscutter emu"; } diff --git a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java index 692e09264..390fb5b95 100644 --- a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java +++ b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java @@ -1,6 +1,8 @@ package emu.grasscutter.game.gacha; +import java.io.File; import java.io.FileReader; +import java.nio.file.*; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -21,17 +23,23 @@ import emu.grasscutter.net.proto.GachaTransferItemOuterClass.GachaTransferItem; import emu.grasscutter.net.proto.GetGachaInfoRspOuterClass.GetGachaInfoRsp; import emu.grasscutter.net.proto.ItemParamOuterClass.ItemParam; import emu.grasscutter.server.game.GameServer; +import emu.grasscutter.server.game.GameServerTickEvent; import emu.grasscutter.server.packet.send.PacketDoGachaRsp; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; +import org.greenrobot.eventbus.Subscribe; + +import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; public class GachaManager { private final GameServer server; private final Int2ObjectMap gachaBanners; private GetGachaInfoRsp cachedProto; - + WatchService watchService; + WatchKey watchKey; + private int[] yellowAvatars = new int[] {1003, 1016, 1042, 1035, 1041}; private int[] yellowWeapons = new int[] {11501, 11502, 12501, 12502, 13502, 13505, 14501, 14502, 15501, 15502}; private int[] purpleAvatars = new int[] {1006, 1014, 1015, 1020, 1021, 1023, 1024, 1025, 1027, 1031, 1032, 1034, 1036, 1039, 1043, 1044, 1045, 1048, 1053, 1055, 1056, 1064}; @@ -40,11 +48,12 @@ public class GachaManager { private static int starglitterId = 221; private static int stardustId = 222; - + public GachaManager(GameServer server) { this.server = server; this.gachaBanners = new Int2ObjectOpenHashMap<>(); this.load(); + this.startWatcher(server); } public GameServer getServer() { @@ -266,6 +275,39 @@ public class GachaManager { // Packets player.sendPacket(new PacketDoGachaRsp(banner, list)); } + + private synchronized void startWatcher(GameServer server) { + if(this.watchService == null) { + try { + this.watchService = FileSystems.getDefault().newWatchService(); + Path path = new File(Grasscutter.getConfig().DATA_FOLDER).toPath(); + path.register(watchService, ENTRY_MODIFY); + watchKey = watchService.take(); + + server.OnGameServerTick.register(this); + } catch (Exception e) { + Grasscutter.getLogger().error("Unable to load the Gacha Manager Watch Service. If ServerOptions.watchGacha is true it will not auto-reload"); + e.printStackTrace(); + } + } else { + Grasscutter.getLogger().error("Cannot reinitialise watcher "); + } + } + + @Subscribe + public synchronized void watchBannerJson(GameServerTickEvent tickEvent) { + try { + for (WatchEvent event : watchKey.pollEvents()) { + final Path changed = (Path) event.context(); + if (changed.endsWith("Banners.json")) { + Grasscutter.getLogger().info("Change detected with banners.json. Reloading gacha config"); + this.load(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } private synchronized GetGachaInfoRsp createProto() { GetGachaInfoRsp.Builder proto = GetGachaInfoRsp.newBuilder().setGachaRandom(12345); diff --git a/src/main/java/emu/grasscutter/server/game/GameServer.java b/src/main/java/emu/grasscutter/server/game/GameServer.java index b42ced55c..7304abc9d 100644 --- a/src/main/java/emu/grasscutter/server/game/GameServer.java +++ b/src/main/java/emu/grasscutter/server/game/GameServer.java @@ -3,6 +3,7 @@ package emu.grasscutter.server.game; import java.net.InetSocketAddress; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; import emu.grasscutter.GenshinConstants; import emu.grasscutter.Grasscutter; @@ -19,6 +20,8 @@ import emu.grasscutter.game.shop.ShopManager; import emu.grasscutter.net.packet.PacketHandler; import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail; import emu.grasscutter.netty.MihoyoKcpServer; +import jdk.internal.event.Event; +import org.greenrobot.eventbus.EventBus; public final class GameServer extends MihoyoKcpServer { private final InetSocketAddress address; @@ -33,9 +36,14 @@ public final class GameServer extends MihoyoKcpServer { private final MultiplayerManager multiplayerManager; private final DungeonManager dungeonManager; private final CommandMap commandMap; + + public EventBus OnGameServerTick; + public EventBus OnGameServerStop; // TODO public GameServer(InetSocketAddress address) { super(address); + + OnGameServerTick = EventBus.builder().throwSubscriberException(true).build(); this.setServerInitializer(new GameServerInitializer(this)); this.address = address; @@ -155,6 +163,8 @@ public final class GameServer extends MihoyoKcpServer { for (GenshinPlayer player : this.getPlayers().values()) { player.onTick(); } + + OnGameServerTick.post(new GameServerTickEvent()); } @Override diff --git a/src/main/java/emu/grasscutter/server/game/GameServerTickEvent.java b/src/main/java/emu/grasscutter/server/game/GameServerTickEvent.java new file mode 100644 index 000000000..f9069d2d9 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/game/GameServerTickEvent.java @@ -0,0 +1,5 @@ +package emu.grasscutter.server.game; + +public class GameServerTickEvent { + // Placeholder class for now, probably will get used later +} From a498b81a247213d720aab5012868e9b640164a65 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Wed, 20 Apr 2022 16:07:18 +0800 Subject: [PATCH 030/119] Forgot config check --- .../grasscutter/game/gacha/GachaManager.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java index 390fb5b95..d52dff8bf 100644 --- a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java +++ b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java @@ -296,16 +296,18 @@ public class GachaManager { @Subscribe public synchronized void watchBannerJson(GameServerTickEvent tickEvent) { - try { - for (WatchEvent event : watchKey.pollEvents()) { - final Path changed = (Path) event.context(); - if (changed.endsWith("Banners.json")) { - Grasscutter.getLogger().info("Change detected with banners.json. Reloading gacha config"); - this.load(); + if(Grasscutter.getConfig().getServerOptions().WatchGacha) { + try { + for (WatchEvent event : watchKey.pollEvents()) { + final Path changed = (Path) event.context(); + if (changed.endsWith("Banners.json")) { + Grasscutter.getLogger().info("Change detected with banners.json. Reloading gacha config"); + this.load(); + } } + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); } } From ba56ccff1e650ff85df2a286506ae78bd48ec6a8 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Wed, 20 Apr 2022 17:14:07 +0800 Subject: [PATCH 031/119] Out of my madness and suffering I have achieved the impossible. I almost lost all hope and was about to end it all. However, it worked out in the end and now we have gacha reloading. --- .../grasscutter/game/gacha/GachaManager.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java index d52dff8bf..eb1cba379 100644 --- a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java +++ b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java @@ -10,6 +10,7 @@ import java.util.concurrent.ThreadLocalRandom; import com.google.gson.reflect.TypeToken; +import com.sun.nio.file.SensitivityWatchEventModifier; import emu.grasscutter.Grasscutter; import emu.grasscutter.data.GenshinData; import emu.grasscutter.data.def.ItemData; @@ -31,14 +32,11 @@ import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import org.greenrobot.eventbus.Subscribe; -import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; - public class GachaManager { private final GameServer server; private final Int2ObjectMap gachaBanners; private GetGachaInfoRsp cachedProto; WatchService watchService; - WatchKey watchKey; private int[] yellowAvatars = new int[] {1003, 1016, 1042, 1035, 1041}; private int[] yellowWeapons = new int[] {11501, 11502, 12501, 12502, 13502, 13505, 14501, 14502, 15501, 15502}; @@ -74,9 +72,16 @@ public class GachaManager { public synchronized void load() { try (FileReader fileReader = new FileReader(Grasscutter.getConfig().DATA_FOLDER + "Banners.json")) { + getGachaBanners().clear(); List banners = Grasscutter.getGsonFactory().fromJson(fileReader, TypeToken.getParameterized(Collection.class, GachaBanner.class).getType()); - for (GachaBanner banner : banners) { - getGachaBanners().put(banner.getGachaType(), banner); + if(banners.size() > 0) { + for (GachaBanner banner : banners) { + getGachaBanners().put(banner.getGachaType(), banner); + } + Grasscutter.getLogger().info("Banners successfully loaded."); + this.cachedProto = createProto(); + } else { + Grasscutter.getLogger().error("Unable to load banners. Banners size is 0."); } } catch (Exception e) { // TODO Auto-generated catch block @@ -281,8 +286,7 @@ public class GachaManager { try { this.watchService = FileSystems.getDefault().newWatchService(); Path path = new File(Grasscutter.getConfig().DATA_FOLDER).toPath(); - path.register(watchService, ENTRY_MODIFY); - watchKey = watchService.take(); + path.register(watchService, new WatchEvent.Kind[]{StandardWatchEventKinds.ENTRY_MODIFY}, SensitivityWatchEventModifier.HIGH); server.OnGameServerTick.register(this); } catch (Exception e) { @@ -298,6 +302,8 @@ public class GachaManager { public synchronized void watchBannerJson(GameServerTickEvent tickEvent) { if(Grasscutter.getConfig().getServerOptions().WatchGacha) { try { + WatchKey watchKey = watchService.take(); + for (WatchEvent event : watchKey.pollEvents()) { final Path changed = (Path) event.context(); if (changed.endsWith("Banners.json")) { @@ -305,6 +311,12 @@ public class GachaManager { this.load(); } } + + boolean valid = watchKey.reset(); + if (!valid) { + Grasscutter.getLogger().error("Unable to reset Gacha Manager Watch Key. Auto-reload of banners.json will no longer work."); + return; + } } catch (Exception e) { e.printStackTrace(); } From 51e1afefba7dfe27d6f67f74f018c17b2a5ae0ca Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Wed, 20 Apr 2022 17:16:21 +0800 Subject: [PATCH 032/119] Add /weather Command --- .../grasscutter/commands/PlayerCommands.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index 779e91ef9..656f85a20 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -16,10 +16,12 @@ import emu.grasscutter.game.entity.EntityMonster; import emu.grasscutter.game.inventory.GenshinItem; import emu.grasscutter.game.inventory.Inventory; import emu.grasscutter.game.inventory.ItemType; +import emu.grasscutter.game.props.ClimateType; import emu.grasscutter.game.props.ActionReason; import emu.grasscutter.game.props.FightProperty; import emu.grasscutter.game.props.PlayerProperty; import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; +import emu.grasscutter.server.packet.send.PacketSceneAreaWeatherNotify; import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; import emu.grasscutter.utils.Position; @@ -536,4 +538,29 @@ public final class PlayerCommands { } } } + + @Command(label = "weather", aliases = {"weather", "w"}, + usage = "weather ", description = "Changes the weather.", + execution = Command.Execution.PLAYER, permission = "player.weather" + ) + public static class ChangeWeatherCommand implements CommandHandler { + @Override + public void execute(GenshinPlayer player, List args) { + if (args.size() < 1) { + CommandHandler.sendMessage(player, "Usage: weather "); + return; + } + + try { + int weatherId = Integer.parseInt(args.get(0)); + + ClimateType climate = ClimateType.getTypeByValue(weatherId); + + player.getScene().setClimate(climate); + player.getScene().broadcastPacket(new PacketSceneAreaWeatherNotify(player)); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(player, "Invalid weather ID."); + } + } + } } From 7c557093db30a603aeb1b34ddb0f4e93912f50d7 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Wed, 20 Apr 2022 02:16:39 -0700 Subject: [PATCH 033/119] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e39d4e70d..5041991e8 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ 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 ### Bonus -When you want to teleport to somewhere, use the ingame marking function on Map, then named it `pos`, click Confirm. You will see your character falling from a very high destination, exact location that you marked. +When you want to teleport to somewhere, use the ingame marking function on Map, click Confirm. You will see your character falling from a very high destination, exact location that you marked. # Quick Troubleshooting * If compiling wasnt successful, please check your JDK installation (must be JDK 8 and validated JDK's bin PATH variable) From 149ebaabdba253db2a318fa208b877a3b3729e27 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Wed, 20 Apr 2022 17:17:59 +0800 Subject: [PATCH 034/119] /reload now reloads the gacha as well --- src/main/java/emu/grasscutter/commands/ServerCommands.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/emu/grasscutter/commands/ServerCommands.java b/src/main/java/emu/grasscutter/commands/ServerCommands.java index edeac6ca3..d721edd07 100644 --- a/src/main/java/emu/grasscutter/commands/ServerCommands.java +++ b/src/main/java/emu/grasscutter/commands/ServerCommands.java @@ -18,6 +18,7 @@ public final class ServerCommands { public void execute(List args) { Grasscutter.getLogger().info("Reloading config."); Grasscutter.loadConfig(); + Grasscutter.getGameServer().getGachaManager().load(); Grasscutter.getDispatchServer().loadQueries(); Grasscutter.getLogger().info("Reload complete."); } From c15fc9b6fc826eb46cf69f15800638049989fdcf Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Wed, 20 Apr 2022 17:31:41 +0800 Subject: [PATCH 035/119] Added OnGameServerStop EventBus There is a temporary warning message telling users to ignore the 'No subscribers registered' error. This can be removed once things actually subscribe to it --- .../java/emu/grasscutter/server/game/GameServer.java | 10 ++++++++-- .../grasscutter/server/game/GameServerStopEvent.java | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 src/main/java/emu/grasscutter/server/game/GameServerStopEvent.java diff --git a/src/main/java/emu/grasscutter/server/game/GameServer.java b/src/main/java/emu/grasscutter/server/game/GameServer.java index 7304abc9d..155e84979 100644 --- a/src/main/java/emu/grasscutter/server/game/GameServer.java +++ b/src/main/java/emu/grasscutter/server/game/GameServer.java @@ -38,13 +38,14 @@ public final class GameServer extends MihoyoKcpServer { private final CommandMap commandMap; public EventBus OnGameServerTick; - public EventBus OnGameServerStop; // TODO + public EventBus OnGameServerStop; public GameServer(InetSocketAddress address) { super(address); OnGameServerTick = EventBus.builder().throwSubscriberException(true).build(); - + OnGameServerStop = EventBus.builder().throwSubscriberException(true).build(); + this.setServerInitializer(new GameServerInitializer(this)); this.address = address; this.packetHandler = new GameServerPacketHandler(PacketHandler.class); @@ -173,6 +174,11 @@ public final class GameServer extends MihoyoKcpServer { } public void onServerShutdown() { + OnGameServerStop.post(new GameServerStopEvent()); + Grasscutter.getLogger().info("Ignore the 'No subscribers registered' error"); + // TODO: Remove the log once things actually listen to OnGameServerStop. + // I just added it there to prevent people from flooding #support with this error + // Kick and save all players List list = new ArrayList<>(this.getPlayers().size()); list.addAll(this.getPlayers().values()); diff --git a/src/main/java/emu/grasscutter/server/game/GameServerStopEvent.java b/src/main/java/emu/grasscutter/server/game/GameServerStopEvent.java new file mode 100644 index 000000000..7a7ef40d7 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/game/GameServerStopEvent.java @@ -0,0 +1,5 @@ +package emu.grasscutter.server.game; + +public class GameServerStopEvent { + // Placeholder class for now, probably will get used later +} From 7bca4e4c301d9e0de7abfa00bd3a53bec8629561 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Wed, 20 Apr 2022 17:44:44 +0800 Subject: [PATCH 036/119] Added OnGameServerStartFinish EventBus Removed those temporary warning messages as I figured out how to disable them --- .../emu/grasscutter/server/game/GameServer.java | 13 ++++++------- .../server/game/GameServerStartFinishEvent.java | 5 +++++ 2 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 src/main/java/emu/grasscutter/server/game/GameServerStartFinishEvent.java diff --git a/src/main/java/emu/grasscutter/server/game/GameServer.java b/src/main/java/emu/grasscutter/server/game/GameServer.java index 155e84979..282589a4b 100644 --- a/src/main/java/emu/grasscutter/server/game/GameServer.java +++ b/src/main/java/emu/grasscutter/server/game/GameServer.java @@ -3,7 +3,6 @@ package emu.grasscutter.server.game; import java.net.InetSocketAddress; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CountDownLatch; import emu.grasscutter.GenshinConstants; import emu.grasscutter.Grasscutter; @@ -20,7 +19,6 @@ import emu.grasscutter.game.shop.ShopManager; import emu.grasscutter.net.packet.PacketHandler; import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail; import emu.grasscutter.netty.MihoyoKcpServer; -import jdk.internal.event.Event; import org.greenrobot.eventbus.EventBus; public final class GameServer extends MihoyoKcpServer { @@ -37,14 +35,16 @@ public final class GameServer extends MihoyoKcpServer { private final DungeonManager dungeonManager; private final CommandMap commandMap; + public EventBus OnGameServerStartFinish; public EventBus OnGameServerTick; public EventBus OnGameServerStop; public GameServer(InetSocketAddress address) { super(address); - OnGameServerTick = EventBus.builder().throwSubscriberException(true).build(); - OnGameServerStop = EventBus.builder().throwSubscriberException(true).build(); + OnGameServerStartFinish = EventBus.builder().throwSubscriberException(true).logNoSubscriberMessages(false).build(); + OnGameServerTick = EventBus.builder().throwSubscriberException(true).logNoSubscriberMessages(false).build(); + OnGameServerStop = EventBus.builder().throwSubscriberException(true).logNoSubscriberMessages(false).build(); this.setServerInitializer(new GameServerInitializer(this)); this.address = address; @@ -171,13 +171,12 @@ public final class GameServer extends MihoyoKcpServer { @Override public void onStartFinish() { Grasscutter.getLogger().info("Game Server started on port " + address.getPort()); + + OnGameServerStartFinish.post(new GameServerStartFinishEvent()); } public void onServerShutdown() { OnGameServerStop.post(new GameServerStopEvent()); - Grasscutter.getLogger().info("Ignore the 'No subscribers registered' error"); - // TODO: Remove the log once things actually listen to OnGameServerStop. - // I just added it there to prevent people from flooding #support with this error // Kick and save all players List list = new ArrayList<>(this.getPlayers().size()); diff --git a/src/main/java/emu/grasscutter/server/game/GameServerStartFinishEvent.java b/src/main/java/emu/grasscutter/server/game/GameServerStartFinishEvent.java new file mode 100644 index 000000000..5e960ad1d --- /dev/null +++ b/src/main/java/emu/grasscutter/server/game/GameServerStartFinishEvent.java @@ -0,0 +1,5 @@ +package emu.grasscutter.server.game; + +public class GameServerStartFinishEvent { + // Placeholder class for now, probably will get used later +} From bde8a2114083e3ff312ca09e8bd21d2c543d3ea3 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 18:13:26 +0800 Subject: [PATCH 037/119] Optimize proxy scripts Signed-off-by: Jaida Wu --- proxy.py | 68 +++++++++++++++++++++++++------------------------ proxy_config.py | 2 ++ 2 files changed, 37 insertions(+), 33 deletions(-) create mode 100644 proxy_config.py diff --git a/proxy.py b/proxy.py index b352af3ac..2d2282af9 100644 --- a/proxy.py +++ b/proxy.py @@ -21,43 +21,45 @@ ## from mitmproxy import http +from proxy_config import REMOTE_HOST class MlgmXyysd_Genshin_Impact_Proxy: + LIST_DOMAINS = [ + "api-os-takumi.mihoyo.com", + "hk4e-api-os-static.mihoyo.com", + "hk4e-sdk-os.mihoyo.com", + "dispatchosglobal.yuanshen.com", + "osusadispatch.yuanshen.com", + "account.mihoyo.com", + "log-upload-os.mihoyo.com", + "dispatchcntest.yuanshen.com", + "devlog-upload.mihoyo.com", + "webstatic.mihoyo.com", + "log-upload.mihoyo.com", + "hk4e-sdk.mihoyo.com", + "api-beta-sdk.mihoyo.com", + "api-beta-sdk-os.mihoyo.com", + "cnbeta01dispatch.yuanshen.com", + "dispatchcnglobal.yuanshen.com", + "cnbeta02dispatch.yuanshen.com", + "sdk-os-static.mihoyo.com", + "webstatic-sea.mihoyo.com", + "webstatic-sea.hoyoverse.com", + "hk4e-sdk-os-static.hoyoverse.com", + "sdk-os-static.hoyoverse.com", + "api-account-os.hoyoverse.com", + "hk4e-sdk-os.hoyoverse.com", + "overseauspider.yuanshen.com", + "gameapi-account.mihoyo.com", + "minor-api.mihoyo.com", + "public-data-api.mihoyo.com", + "uspider.yuanshen.com", + "sdk-static.mihoyo.com" + ] + def request(self, flow: http.HTTPFlow) -> None: - - # This can also be replaced with another IP address. - REMOTE_HOST = "localhost" - - LIST_DOMAINS = [ - "api-os-takumi.mihoyo.com", - "hk4e-api-os-static.mihoyo.com", - "hk4e-sdk-os.mihoyo.com", - "dispatchosglobal.yuanshen.com", - "osusadispatch.yuanshen.com", - "account.mihoyo.com", - "log-upload-os.mihoyo.com", - "dispatchcntest.yuanshen.com", - "devlog-upload.mihoyo.com", - "webstatic.mihoyo.com", - "log-upload.mihoyo.com", - "hk4e-sdk.mihoyo.com", - "api-beta-sdk.mihoyo.com", - "api-beta-sdk-os.mihoyo.com", - "cnbeta01dispatch.yuanshen.com", - "dispatchcnglobal.yuanshen.com", - "cnbeta02dispatch.yuanshen.com", - "sdk-os-static.mihoyo.com", - "webstatic-sea.mihoyo.com", - "webstatic-sea.hoyoverse.com", - "hk4e-sdk-os-static.hoyoverse.com", - "sdk-os-static.hoyoverse.com", - "api-account-os.hoyoverse.com", - "hk4e-sdk-os.hoyoverse.com", - "overseauspider.yuanshen.com" - ] - - if flow.request.host in LIST_DOMAINS: + if flow.request.host in self.LIST_DOMAINS: flow.request.host = REMOTE_HOST addons = [ diff --git a/proxy_config.py b/proxy_config.py new file mode 100644 index 000000000..f048ef88c --- /dev/null +++ b/proxy_config.py @@ -0,0 +1,2 @@ +# This can also be replaced with another IP address. +REMOTE_HOST = "localhost" \ No newline at end of file From 968693b84d02f4c882ca129e07298f9a7759d466 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Wed, 20 Apr 2022 03:28:54 -0700 Subject: [PATCH 038/119] Fix account not found issue when logging in --- .../server/dispatch/DispatchServer.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index dab6ba0a4..f13b9dc2f 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -226,18 +226,22 @@ public final class DispatchServer { Account account = DatabaseHelper.getAccountByName(requestData.account); // Check if account exists, else create a new one. - if (account == null && 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 if (!Grasscutter.getConfig().ServerOptions.AutomaticallyCreateAccounts) { - responseData.retcode = -201; - responseData.message = "Username not found."; + if (account == null) { + // 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(); From 1e7d537965811491d910330365d4846c6d00b725 Mon Sep 17 00:00:00 2001 From: alt3ri <95161279+alt3ri@users.noreply.github.com> Date: Wed, 20 Apr 2022 17:40:26 +0700 Subject: [PATCH 039/119] Adding /pos Some people want to get the coordinate, here you go! --- .../java/emu/grasscutter/commands/PlayerCommands.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index 4b7a2b8e1..7426284da 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -573,6 +573,17 @@ public final class PlayerCommands { } } } + + @Command(label = "pos", + usage = "Usage: pos", description = "Get coordinates.", + execution = Command.Execution.PLAYER) + public static class CordCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer player, List args) { + player.dropMessage(String.format("Coord: %.3f, %.3f, %.3f", player.getPos().getX(), player.getPos().getY(), player.getPos().getZ())); + } + } @Command(label = "restart", usage = "Usage: restart", description = "Restarts the current session", execution = Command.Execution.PLAYER, permission = "player.restart") public static class RestartCommand implements CommandHandler { From cfb13acb7d98a50d01d2f0580c2ceb221273a489 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Wed, 20 Apr 2022 03:42:59 -0700 Subject: [PATCH 040/119] Fix character abilities not showing for others in co-op/lasting too long --- .../emu/grasscutter/game/GenshinPlayer.java | 7 + .../proto/EvtDoSkillSuccNotifyOuterClass.java | 923 ++++++++++++++++++ .../SetEntityClientDataNotifyOuterClass.java | 743 ++++++++++++++ .../HandlerClientAbilityInitFinishNotify.java | 26 + .../HandlerSetEntityClientDataNotify.java | 11 +- .../PacketClientAbilityInitFinishNotify.java | 29 + 6 files changed, 1738 insertions(+), 1 deletion(-) create mode 100644 src/main/java/emu/grasscutter/net/proto/EvtDoSkillSuccNotifyOuterClass.java create mode 100644 src/main/java/emu/grasscutter/net/proto/SetEntityClientDataNotifyOuterClass.java create mode 100644 src/main/java/emu/grasscutter/server/packet/recv/HandlerClientAbilityInitFinishNotify.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketClientAbilityInitFinishNotify.java diff --git a/src/main/java/emu/grasscutter/game/GenshinPlayer.java b/src/main/java/emu/grasscutter/game/GenshinPlayer.java index 70fea04f0..1d8650e54 100644 --- a/src/main/java/emu/grasscutter/game/GenshinPlayer.java +++ b/src/main/java/emu/grasscutter/game/GenshinPlayer.java @@ -38,6 +38,7 @@ import emu.grasscutter.server.packet.send.PacketAvatarAddNotify; import emu.grasscutter.server.packet.send.PacketAvatarDataNotify; import emu.grasscutter.server.packet.send.PacketAvatarGainCostumeNotify; import emu.grasscutter.server.packet.send.PacketAvatarGainFlycloakNotify; +import emu.grasscutter.server.packet.send.PacketClientAbilityInitFinishNotify; import emu.grasscutter.server.packet.send.PacketCombatInvocationsNotify; import emu.grasscutter.server.packet.send.PacketGadgetInteractRsp; import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; @@ -104,6 +105,7 @@ public class GenshinPlayer { @Transient private final Int2ObjectMap coopRequests; @Transient private final InvokeHandler combatInvokeHandler; @Transient private final InvokeHandler abilityInvokeHandler; + @Transient private final InvokeHandler clientAbilityInitFinishHandler; @Deprecated @SuppressWarnings({ "rawtypes", "unchecked" }) // Morphia only! public GenshinPlayer() { @@ -126,6 +128,7 @@ public class GenshinPlayer { this.coopRequests = new Int2ObjectOpenHashMap<>(); this.combatInvokeHandler = new InvokeHandler(PacketCombatInvocationsNotify.class); this.abilityInvokeHandler = new InvokeHandler(PacketAbilityInvocationsNotify.class); + this.clientAbilityInitFinishHandler = new InvokeHandler(PacketClientAbilityInitFinishNotify.class); } // On player creation @@ -389,6 +392,10 @@ public class GenshinPlayer { return this.abilityInvokeHandler; } + public InvokeHandler getClientAbilityInitFinishHandler() { + return clientAbilityInitFinishHandler; + } + public void setMpSetting(MpSettingType mpSetting) { this.mpSetting = mpSetting; } diff --git a/src/main/java/emu/grasscutter/net/proto/EvtDoSkillSuccNotifyOuterClass.java b/src/main/java/emu/grasscutter/net/proto/EvtDoSkillSuccNotifyOuterClass.java new file mode 100644 index 000000000..61edb141d --- /dev/null +++ b/src/main/java/emu/grasscutter/net/proto/EvtDoSkillSuccNotifyOuterClass.java @@ -0,0 +1,923 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: EvtDoSkillSuccNotify.proto + +package emu.grasscutter.net.proto; + +public final class EvtDoSkillSuccNotifyOuterClass { + private EvtDoSkillSuccNotifyOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface EvtDoSkillSuccNotifyOrBuilder extends + // @@protoc_insertion_point(interface_extends:EvtDoSkillSuccNotify) + com.google.protobuf.MessageOrBuilder { + + /** + * .ForwardType forwardType = 1; + * @return The enum numeric value on the wire for forwardType. + */ + int getForwardTypeValue(); + /** + * .ForwardType forwardType = 1; + * @return The forwardType. + */ + emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType getForwardType(); + + /** + * uint32 casterId = 2; + * @return The casterId. + */ + int getCasterId(); + + /** + * uint32 skillId = 3; + * @return The skillId. + */ + int getSkillId(); + + /** + * .Vector forward = 4; + * @return Whether the forward field is set. + */ + boolean hasForward(); + /** + * .Vector forward = 4; + * @return The forward. + */ + emu.grasscutter.net.proto.VectorOuterClass.Vector getForward(); + /** + * .Vector forward = 4; + */ + emu.grasscutter.net.proto.VectorOuterClass.VectorOrBuilder getForwardOrBuilder(); + } + /** + * Protobuf type {@code EvtDoSkillSuccNotify} + */ + public static final class EvtDoSkillSuccNotify extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:EvtDoSkillSuccNotify) + EvtDoSkillSuccNotifyOrBuilder { + private static final long serialVersionUID = 0L; + // Use EvtDoSkillSuccNotify.newBuilder() to construct. + private EvtDoSkillSuccNotify(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private EvtDoSkillSuccNotify() { + forwardType_ = 0; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new EvtDoSkillSuccNotify(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private EvtDoSkillSuccNotify( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + + forwardType_ = rawValue; + break; + } + case 16: { + + casterId_ = input.readUInt32(); + break; + } + case 24: { + + skillId_ = input.readUInt32(); + break; + } + case 34: { + emu.grasscutter.net.proto.VectorOuterClass.Vector.Builder subBuilder = null; + if (forward_ != null) { + subBuilder = forward_.toBuilder(); + } + forward_ = input.readMessage(emu.grasscutter.net.proto.VectorOuterClass.Vector.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(forward_); + forward_ = subBuilder.buildPartial(); + } + + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.internal_static_EvtDoSkillSuccNotify_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.internal_static_EvtDoSkillSuccNotify_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify.class, emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify.Builder.class); + } + + public static final int FORWARDTYPE_FIELD_NUMBER = 1; + private int forwardType_; + /** + * .ForwardType forwardType = 1; + * @return The enum numeric value on the wire for forwardType. + */ + @java.lang.Override public int getForwardTypeValue() { + return forwardType_; + } + /** + * .ForwardType forwardType = 1; + * @return The forwardType. + */ + @java.lang.Override public emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType getForwardType() { + @SuppressWarnings("deprecation") + emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType result = emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType.valueOf(forwardType_); + return result == null ? emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType.UNRECOGNIZED : result; + } + + public static final int CASTERID_FIELD_NUMBER = 2; + private int casterId_; + /** + * uint32 casterId = 2; + * @return The casterId. + */ + @java.lang.Override + public int getCasterId() { + return casterId_; + } + + public static final int SKILLID_FIELD_NUMBER = 3; + private int skillId_; + /** + * uint32 skillId = 3; + * @return The skillId. + */ + @java.lang.Override + public int getSkillId() { + return skillId_; + } + + public static final int FORWARD_FIELD_NUMBER = 4; + private emu.grasscutter.net.proto.VectorOuterClass.Vector forward_; + /** + * .Vector forward = 4; + * @return Whether the forward field is set. + */ + @java.lang.Override + public boolean hasForward() { + return forward_ != null; + } + /** + * .Vector forward = 4; + * @return The forward. + */ + @java.lang.Override + public emu.grasscutter.net.proto.VectorOuterClass.Vector getForward() { + return forward_ == null ? emu.grasscutter.net.proto.VectorOuterClass.Vector.getDefaultInstance() : forward_; + } + /** + * .Vector forward = 4; + */ + @java.lang.Override + public emu.grasscutter.net.proto.VectorOuterClass.VectorOrBuilder getForwardOrBuilder() { + return getForward(); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (forwardType_ != emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType.ForwardLocal.getNumber()) { + output.writeEnum(1, forwardType_); + } + if (casterId_ != 0) { + output.writeUInt32(2, casterId_); + } + if (skillId_ != 0) { + output.writeUInt32(3, skillId_); + } + if (forward_ != null) { + output.writeMessage(4, getForward()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (forwardType_ != emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType.ForwardLocal.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, forwardType_); + } + if (casterId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, casterId_); + } + if (skillId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(3, skillId_); + } + if (forward_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, getForward()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify)) { + return super.equals(obj); + } + emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify other = (emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify) obj; + + if (forwardType_ != other.forwardType_) return false; + if (getCasterId() + != other.getCasterId()) return false; + if (getSkillId() + != other.getSkillId()) return false; + if (hasForward() != other.hasForward()) return false; + if (hasForward()) { + if (!getForward() + .equals(other.getForward())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + FORWARDTYPE_FIELD_NUMBER; + hash = (53 * hash) + forwardType_; + hash = (37 * hash) + CASTERID_FIELD_NUMBER; + hash = (53 * hash) + getCasterId(); + hash = (37 * hash) + SKILLID_FIELD_NUMBER; + hash = (53 * hash) + getSkillId(); + if (hasForward()) { + hash = (37 * hash) + FORWARD_FIELD_NUMBER; + hash = (53 * hash) + getForward().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code EvtDoSkillSuccNotify} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:EvtDoSkillSuccNotify) + emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotifyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.internal_static_EvtDoSkillSuccNotify_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.internal_static_EvtDoSkillSuccNotify_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify.class, emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify.Builder.class); + } + + // Construct using emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + forwardType_ = 0; + + casterId_ = 0; + + skillId_ = 0; + + if (forwardBuilder_ == null) { + forward_ = null; + } else { + forward_ = null; + forwardBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.internal_static_EvtDoSkillSuccNotify_descriptor; + } + + @java.lang.Override + public emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify getDefaultInstanceForType() { + return emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify.getDefaultInstance(); + } + + @java.lang.Override + public emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify build() { + emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify buildPartial() { + emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify result = new emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify(this); + result.forwardType_ = forwardType_; + result.casterId_ = casterId_; + result.skillId_ = skillId_; + if (forwardBuilder_ == null) { + result.forward_ = forward_; + } else { + result.forward_ = forwardBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify) { + return mergeFrom((emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify other) { + if (other == emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify.getDefaultInstance()) return this; + if (other.forwardType_ != 0) { + setForwardTypeValue(other.getForwardTypeValue()); + } + if (other.getCasterId() != 0) { + setCasterId(other.getCasterId()); + } + if (other.getSkillId() != 0) { + setSkillId(other.getSkillId()); + } + if (other.hasForward()) { + mergeForward(other.getForward()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int forwardType_ = 0; + /** + * .ForwardType forwardType = 1; + * @return The enum numeric value on the wire for forwardType. + */ + @java.lang.Override public int getForwardTypeValue() { + return forwardType_; + } + /** + * .ForwardType forwardType = 1; + * @param value The enum numeric value on the wire for forwardType to set. + * @return This builder for chaining. + */ + public Builder setForwardTypeValue(int value) { + + forwardType_ = value; + onChanged(); + return this; + } + /** + * .ForwardType forwardType = 1; + * @return The forwardType. + */ + @java.lang.Override + public emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType getForwardType() { + @SuppressWarnings("deprecation") + emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType result = emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType.valueOf(forwardType_); + return result == null ? emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType.UNRECOGNIZED : result; + } + /** + * .ForwardType forwardType = 1; + * @param value The forwardType to set. + * @return This builder for chaining. + */ + public Builder setForwardType(emu.grasscutter.net.proto.ForwardTypeOuterClass.ForwardType value) { + if (value == null) { + throw new NullPointerException(); + } + + forwardType_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .ForwardType forwardType = 1; + * @return This builder for chaining. + */ + public Builder clearForwardType() { + + forwardType_ = 0; + onChanged(); + return this; + } + + private int casterId_ ; + /** + * uint32 casterId = 2; + * @return The casterId. + */ + @java.lang.Override + public int getCasterId() { + return casterId_; + } + /** + * uint32 casterId = 2; + * @param value The casterId to set. + * @return This builder for chaining. + */ + public Builder setCasterId(int value) { + + casterId_ = value; + onChanged(); + return this; + } + /** + * uint32 casterId = 2; + * @return This builder for chaining. + */ + public Builder clearCasterId() { + + casterId_ = 0; + onChanged(); + return this; + } + + private int skillId_ ; + /** + * uint32 skillId = 3; + * @return The skillId. + */ + @java.lang.Override + public int getSkillId() { + return skillId_; + } + /** + * uint32 skillId = 3; + * @param value The skillId to set. + * @return This builder for chaining. + */ + public Builder setSkillId(int value) { + + skillId_ = value; + onChanged(); + return this; + } + /** + * uint32 skillId = 3; + * @return This builder for chaining. + */ + public Builder clearSkillId() { + + skillId_ = 0; + onChanged(); + return this; + } + + private emu.grasscutter.net.proto.VectorOuterClass.Vector forward_; + private com.google.protobuf.SingleFieldBuilderV3< + emu.grasscutter.net.proto.VectorOuterClass.Vector, emu.grasscutter.net.proto.VectorOuterClass.Vector.Builder, emu.grasscutter.net.proto.VectorOuterClass.VectorOrBuilder> forwardBuilder_; + /** + * .Vector forward = 4; + * @return Whether the forward field is set. + */ + public boolean hasForward() { + return forwardBuilder_ != null || forward_ != null; + } + /** + * .Vector forward = 4; + * @return The forward. + */ + public emu.grasscutter.net.proto.VectorOuterClass.Vector getForward() { + if (forwardBuilder_ == null) { + return forward_ == null ? emu.grasscutter.net.proto.VectorOuterClass.Vector.getDefaultInstance() : forward_; + } else { + return forwardBuilder_.getMessage(); + } + } + /** + * .Vector forward = 4; + */ + public Builder setForward(emu.grasscutter.net.proto.VectorOuterClass.Vector value) { + if (forwardBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + forward_ = value; + onChanged(); + } else { + forwardBuilder_.setMessage(value); + } + + return this; + } + /** + * .Vector forward = 4; + */ + public Builder setForward( + emu.grasscutter.net.proto.VectorOuterClass.Vector.Builder builderForValue) { + if (forwardBuilder_ == null) { + forward_ = builderForValue.build(); + onChanged(); + } else { + forwardBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * .Vector forward = 4; + */ + public Builder mergeForward(emu.grasscutter.net.proto.VectorOuterClass.Vector value) { + if (forwardBuilder_ == null) { + if (forward_ != null) { + forward_ = + emu.grasscutter.net.proto.VectorOuterClass.Vector.newBuilder(forward_).mergeFrom(value).buildPartial(); + } else { + forward_ = value; + } + onChanged(); + } else { + forwardBuilder_.mergeFrom(value); + } + + return this; + } + /** + * .Vector forward = 4; + */ + public Builder clearForward() { + if (forwardBuilder_ == null) { + forward_ = null; + onChanged(); + } else { + forward_ = null; + forwardBuilder_ = null; + } + + return this; + } + /** + * .Vector forward = 4; + */ + public emu.grasscutter.net.proto.VectorOuterClass.Vector.Builder getForwardBuilder() { + + onChanged(); + return getForwardFieldBuilder().getBuilder(); + } + /** + * .Vector forward = 4; + */ + public emu.grasscutter.net.proto.VectorOuterClass.VectorOrBuilder getForwardOrBuilder() { + if (forwardBuilder_ != null) { + return forwardBuilder_.getMessageOrBuilder(); + } else { + return forward_ == null ? + emu.grasscutter.net.proto.VectorOuterClass.Vector.getDefaultInstance() : forward_; + } + } + /** + * .Vector forward = 4; + */ + private com.google.protobuf.SingleFieldBuilderV3< + emu.grasscutter.net.proto.VectorOuterClass.Vector, emu.grasscutter.net.proto.VectorOuterClass.Vector.Builder, emu.grasscutter.net.proto.VectorOuterClass.VectorOrBuilder> + getForwardFieldBuilder() { + if (forwardBuilder_ == null) { + forwardBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + emu.grasscutter.net.proto.VectorOuterClass.Vector, emu.grasscutter.net.proto.VectorOuterClass.Vector.Builder, emu.grasscutter.net.proto.VectorOuterClass.VectorOrBuilder>( + getForward(), + getParentForChildren(), + isClean()); + forward_ = null; + } + return forwardBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:EvtDoSkillSuccNotify) + } + + // @@protoc_insertion_point(class_scope:EvtDoSkillSuccNotify) + private static final emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify(); + } + + public static emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public EvtDoSkillSuccNotify parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new EvtDoSkillSuccNotify(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public emu.grasscutter.net.proto.EvtDoSkillSuccNotifyOuterClass.EvtDoSkillSuccNotify getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_EvtDoSkillSuccNotify_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_EvtDoSkillSuccNotify_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\032EvtDoSkillSuccNotify.proto\032\021ForwardTyp" + + "e.proto\032\014Vector.proto\"v\n\024EvtDoSkillSuccN" + + "otify\022!\n\013forwardType\030\001 \001(\0162\014.ForwardType" + + "\022\020\n\010casterId\030\002 \001(\r\022\017\n\007skillId\030\003 \001(\r\022\030\n\007f" + + "orward\030\004 \001(\0132\007.VectorB\033\n\031emu.grasscutter" + + ".net.protob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + emu.grasscutter.net.proto.ForwardTypeOuterClass.getDescriptor(), + emu.grasscutter.net.proto.VectorOuterClass.getDescriptor(), + }); + internal_static_EvtDoSkillSuccNotify_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_EvtDoSkillSuccNotify_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_EvtDoSkillSuccNotify_descriptor, + new java.lang.String[] { "ForwardType", "CasterId", "SkillId", "Forward", }); + emu.grasscutter.net.proto.ForwardTypeOuterClass.getDescriptor(); + emu.grasscutter.net.proto.VectorOuterClass.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/src/main/java/emu/grasscutter/net/proto/SetEntityClientDataNotifyOuterClass.java b/src/main/java/emu/grasscutter/net/proto/SetEntityClientDataNotifyOuterClass.java new file mode 100644 index 000000000..5541ca15b --- /dev/null +++ b/src/main/java/emu/grasscutter/net/proto/SetEntityClientDataNotifyOuterClass.java @@ -0,0 +1,743 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: SetEntityClientDataNotify.proto + +package emu.grasscutter.net.proto; + +public final class SetEntityClientDataNotifyOuterClass { + private SetEntityClientDataNotifyOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface SetEntityClientDataNotifyOrBuilder extends + // @@protoc_insertion_point(interface_extends:SetEntityClientDataNotify) + com.google.protobuf.MessageOrBuilder { + + /** + * uint32 entityId = 1; + * @return The entityId. + */ + int getEntityId(); + + /** + * .EntityClientData entityClientData = 2; + * @return Whether the entityClientData field is set. + */ + boolean hasEntityClientData(); + /** + * .EntityClientData entityClientData = 2; + * @return The entityClientData. + */ + emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData getEntityClientData(); + /** + * .EntityClientData entityClientData = 2; + */ + emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientDataOrBuilder getEntityClientDataOrBuilder(); + } + /** + * Protobuf type {@code SetEntityClientDataNotify} + */ + public static final class SetEntityClientDataNotify extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:SetEntityClientDataNotify) + SetEntityClientDataNotifyOrBuilder { + private static final long serialVersionUID = 0L; + // Use SetEntityClientDataNotify.newBuilder() to construct. + private SetEntityClientDataNotify(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private SetEntityClientDataNotify() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new SetEntityClientDataNotify(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SetEntityClientDataNotify( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + + entityId_ = input.readUInt32(); + break; + } + case 18: { + emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.Builder subBuilder = null; + if (entityClientData_ != null) { + subBuilder = entityClientData_.toBuilder(); + } + entityClientData_ = input.readMessage(emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(entityClientData_); + entityClientData_ = subBuilder.buildPartial(); + } + + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.internal_static_SetEntityClientDataNotify_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.internal_static_SetEntityClientDataNotify_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify.class, emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify.Builder.class); + } + + public static final int ENTITYID_FIELD_NUMBER = 1; + private int entityId_; + /** + * uint32 entityId = 1; + * @return The entityId. + */ + @java.lang.Override + public int getEntityId() { + return entityId_; + } + + public static final int ENTITYCLIENTDATA_FIELD_NUMBER = 2; + private emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData entityClientData_; + /** + * .EntityClientData entityClientData = 2; + * @return Whether the entityClientData field is set. + */ + @java.lang.Override + public boolean hasEntityClientData() { + return entityClientData_ != null; + } + /** + * .EntityClientData entityClientData = 2; + * @return The entityClientData. + */ + @java.lang.Override + public emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData getEntityClientData() { + return entityClientData_ == null ? emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.getDefaultInstance() : entityClientData_; + } + /** + * .EntityClientData entityClientData = 2; + */ + @java.lang.Override + public emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientDataOrBuilder getEntityClientDataOrBuilder() { + return getEntityClientData(); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (entityId_ != 0) { + output.writeUInt32(1, entityId_); + } + if (entityClientData_ != null) { + output.writeMessage(2, getEntityClientData()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (entityId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, entityId_); + } + if (entityClientData_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getEntityClientData()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify)) { + return super.equals(obj); + } + emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify other = (emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify) obj; + + if (getEntityId() + != other.getEntityId()) return false; + if (hasEntityClientData() != other.hasEntityClientData()) return false; + if (hasEntityClientData()) { + if (!getEntityClientData() + .equals(other.getEntityClientData())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + ENTITYID_FIELD_NUMBER; + hash = (53 * hash) + getEntityId(); + if (hasEntityClientData()) { + hash = (37 * hash) + ENTITYCLIENTDATA_FIELD_NUMBER; + hash = (53 * hash) + getEntityClientData().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code SetEntityClientDataNotify} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:SetEntityClientDataNotify) + emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotifyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.internal_static_SetEntityClientDataNotify_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.internal_static_SetEntityClientDataNotify_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify.class, emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify.Builder.class); + } + + // Construct using emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + entityId_ = 0; + + if (entityClientDataBuilder_ == null) { + entityClientData_ = null; + } else { + entityClientData_ = null; + entityClientDataBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.internal_static_SetEntityClientDataNotify_descriptor; + } + + @java.lang.Override + public emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify getDefaultInstanceForType() { + return emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify.getDefaultInstance(); + } + + @java.lang.Override + public emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify build() { + emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify buildPartial() { + emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify result = new emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify(this); + result.entityId_ = entityId_; + if (entityClientDataBuilder_ == null) { + result.entityClientData_ = entityClientData_; + } else { + result.entityClientData_ = entityClientDataBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify) { + return mergeFrom((emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify other) { + if (other == emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify.getDefaultInstance()) return this; + if (other.getEntityId() != 0) { + setEntityId(other.getEntityId()); + } + if (other.hasEntityClientData()) { + mergeEntityClientData(other.getEntityClientData()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int entityId_ ; + /** + * uint32 entityId = 1; + * @return The entityId. + */ + @java.lang.Override + public int getEntityId() { + return entityId_; + } + /** + * uint32 entityId = 1; + * @param value The entityId to set. + * @return This builder for chaining. + */ + public Builder setEntityId(int value) { + + entityId_ = value; + onChanged(); + return this; + } + /** + * uint32 entityId = 1; + * @return This builder for chaining. + */ + public Builder clearEntityId() { + + entityId_ = 0; + onChanged(); + return this; + } + + private emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData entityClientData_; + private com.google.protobuf.SingleFieldBuilderV3< + emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData, emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.Builder, emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientDataOrBuilder> entityClientDataBuilder_; + /** + * .EntityClientData entityClientData = 2; + * @return Whether the entityClientData field is set. + */ + public boolean hasEntityClientData() { + return entityClientDataBuilder_ != null || entityClientData_ != null; + } + /** + * .EntityClientData entityClientData = 2; + * @return The entityClientData. + */ + public emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData getEntityClientData() { + if (entityClientDataBuilder_ == null) { + return entityClientData_ == null ? emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.getDefaultInstance() : entityClientData_; + } else { + return entityClientDataBuilder_.getMessage(); + } + } + /** + * .EntityClientData entityClientData = 2; + */ + public Builder setEntityClientData(emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData value) { + if (entityClientDataBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + entityClientData_ = value; + onChanged(); + } else { + entityClientDataBuilder_.setMessage(value); + } + + return this; + } + /** + * .EntityClientData entityClientData = 2; + */ + public Builder setEntityClientData( + emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.Builder builderForValue) { + if (entityClientDataBuilder_ == null) { + entityClientData_ = builderForValue.build(); + onChanged(); + } else { + entityClientDataBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * .EntityClientData entityClientData = 2; + */ + public Builder mergeEntityClientData(emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData value) { + if (entityClientDataBuilder_ == null) { + if (entityClientData_ != null) { + entityClientData_ = + emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.newBuilder(entityClientData_).mergeFrom(value).buildPartial(); + } else { + entityClientData_ = value; + } + onChanged(); + } else { + entityClientDataBuilder_.mergeFrom(value); + } + + return this; + } + /** + * .EntityClientData entityClientData = 2; + */ + public Builder clearEntityClientData() { + if (entityClientDataBuilder_ == null) { + entityClientData_ = null; + onChanged(); + } else { + entityClientData_ = null; + entityClientDataBuilder_ = null; + } + + return this; + } + /** + * .EntityClientData entityClientData = 2; + */ + public emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.Builder getEntityClientDataBuilder() { + + onChanged(); + return getEntityClientDataFieldBuilder().getBuilder(); + } + /** + * .EntityClientData entityClientData = 2; + */ + public emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientDataOrBuilder getEntityClientDataOrBuilder() { + if (entityClientDataBuilder_ != null) { + return entityClientDataBuilder_.getMessageOrBuilder(); + } else { + return entityClientData_ == null ? + emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.getDefaultInstance() : entityClientData_; + } + } + /** + * .EntityClientData entityClientData = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData, emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.Builder, emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientDataOrBuilder> + getEntityClientDataFieldBuilder() { + if (entityClientDataBuilder_ == null) { + entityClientDataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData, emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData.Builder, emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientDataOrBuilder>( + getEntityClientData(), + getParentForChildren(), + isClean()); + entityClientData_ = null; + } + return entityClientDataBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:SetEntityClientDataNotify) + } + + // @@protoc_insertion_point(class_scope:SetEntityClientDataNotify) + private static final emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify(); + } + + public static emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public SetEntityClientDataNotify parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SetEntityClientDataNotify(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_SetEntityClientDataNotify_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_SetEntityClientDataNotify_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\037SetEntityClientDataNotify.proto\032\026Entit" + + "yClientData.proto\"Z\n\031SetEntityClientData" + + "Notify\022\020\n\010entityId\030\001 \001(\r\022+\n\020entityClient" + + "Data\030\002 \001(\0132\021.EntityClientDataB\033\n\031emu.gra" + + "sscutter.net.protob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + emu.grasscutter.net.proto.EntityClientDataOuterClass.getDescriptor(), + }); + internal_static_SetEntityClientDataNotify_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_SetEntityClientDataNotify_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_SetEntityClientDataNotify_descriptor, + new java.lang.String[] { "EntityId", "EntityClientData", }); + emu.grasscutter.net.proto.EntityClientDataOuterClass.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerClientAbilityInitFinishNotify.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerClientAbilityInitFinishNotify.java new file mode 100644 index 000000000..cfe697b91 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerClientAbilityInitFinishNotify.java @@ -0,0 +1,26 @@ +package emu.grasscutter.server.packet.recv; + +import emu.grasscutter.net.packet.Opcodes; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry; +import emu.grasscutter.net.proto.ClientAbilityInitFinishNotifyOuterClass.ClientAbilityInitFinishNotify; +import emu.grasscutter.net.packet.PacketHandler; +import emu.grasscutter.server.game.GameSession; + +@Opcodes(PacketOpcodes.ClientAbilityInitFinishNotify) +public class HandlerClientAbilityInitFinishNotify extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + ClientAbilityInitFinishNotify notif = ClientAbilityInitFinishNotify.parseFrom(payload); + + for (AbilityInvokeEntry entry : notif.getInvokesList()) { + session.getPlayer().getClientAbilityInitFinishHandler().addEntry(entry.getForwardType(), entry); + } + + if (notif.getInvokesList().size() > 0) { + session.getPlayer().getClientAbilityInitFinishHandler().update(session.getPlayer()); + } + } + +} diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetEntityClientDataNotify.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetEntityClientDataNotify.java index accbd253d..1a60f677b 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetEntityClientDataNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetEntityClientDataNotify.java @@ -1,5 +1,6 @@ package emu.grasscutter.server.packet.recv; +import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.Opcodes; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.packet.PacketHandler; @@ -10,7 +11,15 @@ public class HandlerSetEntityClientDataNotify extends PacketHandler { @Override public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { - // Auto template + // Skip if there is no one to broadcast it too + if (session.getPlayer().getScene().getPlayerCount() <= 1) { + return; + } + + GenshinPacket packet = new GenshinPacket(PacketOpcodes.SetEntityClientDataNotify, true); + packet.setData(payload); + + session.getPlayer().getScene().broadcastPacketToOthers(session.getPlayer(), packet); } } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketClientAbilityInitFinishNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketClientAbilityInitFinishNotify.java new file mode 100644 index 000000000..dc676c4d1 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketClientAbilityInitFinishNotify.java @@ -0,0 +1,29 @@ +package emu.grasscutter.server.packet.send; + +import java.util.List; + +import emu.grasscutter.net.packet.GenshinPacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry; +import emu.grasscutter.net.proto.ClientAbilityInitFinishNotifyOuterClass.ClientAbilityInitFinishNotify; + +public class PacketClientAbilityInitFinishNotify extends GenshinPacket { + + public PacketClientAbilityInitFinishNotify(List entries) { + super(PacketOpcodes.ClientAbilityInitFinishNotify, true); + + int entityId = 0; + + if (entries.size() > 0) { + AbilityInvokeEntry entry = entries.get(0); + entityId = entry.getEntityId(); + } + + ClientAbilityInitFinishNotify proto = ClientAbilityInitFinishNotify.newBuilder() + .setEntityId(entityId) + .addAllInvokes(entries) + .build(); + + this.setData(proto); + } +} From a507172d8124e9db18d80c6f96db939084b2cb9a Mon Sep 17 00:00:00 2001 From: alt3ri <95161279+alt3ri@users.noreply.github.com> Date: Wed, 20 Apr 2022 18:24:32 +0700 Subject: [PATCH 041/119] Replace SetHealth -> SetStats Now you can set basic stats of your current character, but I left a little notice: Input and In-game output (character stats) are not really accurate. So to get an accurate stat: For HP, ATK , DEF, Elemental Mastery (EM): input less than 10 digits. Example: /stats atk 81923 (81293 ATK) For Energy Recharge (ER), Crit Rate, Crit DMG: input less than 6 digits(0-99999) to get the game current format. Example: /stats cdmg 14236 (142.4% Crit DMG) (!) The modified stats will be set to default after you logged out. Press F to pay respect to SetHealth (2022 - 2022) --- .../grasscutter/commands/PlayerCommands.java | 125 ++++++++++++++---- 1 file changed, 102 insertions(+), 23 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index 7426284da..ec56bda7a 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -455,32 +455,111 @@ public final class PlayerCommands { } } - @Command(label = "sethealth", aliases = {"sethp"}, - usage = "sethealth ", execution = Command.Execution.PLAYER, description = "Sets your health to the specified value", - permission = "player.sethealth") - public static class SetHealthCommand implements CommandHandler { - - @Override +@Command(label = "setstats", aliases = {"stats"}, + usage = "Usage: setstats|stats ", execution = Command.Execution.PLAYER) + public static class SetStatsCommand implements CommandHandler { + @Override public void execute(GenshinPlayer player, List args) { - if (args.size() < 1) { - CommandHandler.sendMessage(null, "Usage: sethealth "); - return; - } - - try { - int health = Integer.parseInt(args.get(0)); - EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); - if (entity == null) + String stat = args.get(0); + switch(stat){ + default: + CommandHandler.sendMessage(player, "Usage: setstats|stats "); return; - - entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); - entity.getWorld().broadcastPacket( - new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); - player.dropMessage("Health set to " + health + "."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid health value."); + case "hp": + try { + int health = Integer.parseInt(args.get(1)); + EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); + player.dropMessage("HP set to " + health + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid HP value."); + return; + } + break; + case "def": + try { + int def = Integer.parseInt(args.get(1)); + EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_DEFENSE, def); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_DEFENSE)); + player.dropMessage("DEF set to " + def + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid DEF value."); + return; + } + break; + case "atk": + try { + int atk = Integer.parseInt(args.get(1)); + EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_ATTACK, atk); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_ATTACK)); + player.dropMessage("ATK set to " + atk + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid ATK value."); + return; + } + break; + case "em": + try { + int em = Integer.parseInt(args.get(1)); + EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_ELEMENT_MASTERY, em); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_ELEMENT_MASTERY)); + player.dropMessage("Elemental Mastery set to " + em + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid EM value."); + return; + } + break; + case "er": + try { + float er = Integer.parseInt(args.get(1)); + EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); + float erecharge = er / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY, erecharge); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY)); + float iger = erecharge * 100; + player.dropMessage("Energy recharge set to " + iger + "%."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid ER value."); + return; + } + break; + case "crate": + try { + float cr = Integer.parseInt(args.get(1)); + EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); + float crate = cr / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_CRITICAL, crate); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CRITICAL)); + float igcrate = crate * 100; + player.dropMessage("Crit Rate set to " + igcrate + "%."); + + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid Crit Rate value."); + return; + } + break; + case "cdmg": + try { + float cdmg = Integer.parseInt(args.get(1)); + EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); + float cdamage = cdmg / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_CRITICAL_HURT, cdamage); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CRITICAL_HURT)); + float igcdmg = cdamage * 100; + player.dropMessage("Crit DMG set to " + igcdmg + "%"); + + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid Crit DMG value."); + return; + } + break; + } - } + } } @Command(label = "setworldlevel", aliases = {"setworldlvl"}, usage = "setworldlevel ", From c42d6d81f6e78b64c513dad730f3fed5187ff4a2 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 20:21:38 +0800 Subject: [PATCH 042/119] Rewrite commands Signed-off-by: Jaida Wu --- .../grasscutter/commands/PlayerCommands.java | 307 ---------- .../grasscutter/commands/ServerCommands.java | 171 ------ .../java/emu/grasscutter/Grasscutter.java | 2 +- .../java/emu/grasscutter/command/Command.java | 17 + .../grasscutter/command/CommandHandler.java | 25 + .../{commands => command}/CommandMap.java | 94 +-- .../grasscutter/command/commands/Account.java | 61 ++ .../command/commands/Broadcast.java | 29 + .../command/commands/ChangeScene.java | 36 ++ .../command/commands/ClearArtifacts.java | 30 + .../grasscutter/command/commands/Drop.java | 56 ++ .../grasscutter/command/commands/Give.java | 112 ++++ .../command/commands/GiveChar.java | 93 +++ .../grasscutter/command/commands/GodMode.java | 22 + .../grasscutter/command/commands/Help.java | 91 +++ .../grasscutter/command/commands/Kick.java | 31 + .../grasscutter/command/commands/KillAll.java | 64 +++ .../command/commands/Permission.java | 50 ++ .../grasscutter/command/commands/Reload.java | 21 + .../command/commands/ResetConst.java | 45 ++ .../command/commands/SendMessage.java | 37 ++ .../command/commands/SetHealth.java | 42 ++ .../command/commands/SetWorldLevel.java | 39 ++ .../grasscutter/command/commands/Spawn.java | 51 ++ .../grasscutter/command/commands/Stop.java | 23 + .../emu/grasscutter/commands/Command.java | 25 - .../grasscutter/commands/CommandHandler.java | 28 - .../grasscutter/commands/PlayerCommands.java | 539 ------------------ .../grasscutter/commands/ServerCommands.java | 333 ----------- .../game/managers/ChatManager.java | 2 +- .../grasscutter/server/game/GameServer.java | 2 +- 31 files changed, 1025 insertions(+), 1453 deletions(-) delete mode 100644 src/deprecated/java/emu/grasscutter/commands/PlayerCommands.java delete mode 100644 src/deprecated/java/emu/grasscutter/commands/ServerCommands.java create mode 100644 src/main/java/emu/grasscutter/command/Command.java create mode 100644 src/main/java/emu/grasscutter/command/CommandHandler.java rename src/main/java/emu/grasscutter/{commands => command}/CommandMap.java (75%) create mode 100644 src/main/java/emu/grasscutter/command/commands/Account.java create mode 100644 src/main/java/emu/grasscutter/command/commands/Broadcast.java create mode 100644 src/main/java/emu/grasscutter/command/commands/ChangeScene.java create mode 100644 src/main/java/emu/grasscutter/command/commands/ClearArtifacts.java create mode 100644 src/main/java/emu/grasscutter/command/commands/Drop.java create mode 100644 src/main/java/emu/grasscutter/command/commands/Give.java create mode 100644 src/main/java/emu/grasscutter/command/commands/GiveChar.java create mode 100644 src/main/java/emu/grasscutter/command/commands/GodMode.java create mode 100644 src/main/java/emu/grasscutter/command/commands/Help.java create mode 100644 src/main/java/emu/grasscutter/command/commands/Kick.java create mode 100644 src/main/java/emu/grasscutter/command/commands/KillAll.java create mode 100644 src/main/java/emu/grasscutter/command/commands/Permission.java create mode 100644 src/main/java/emu/grasscutter/command/commands/Reload.java create mode 100644 src/main/java/emu/grasscutter/command/commands/ResetConst.java create mode 100644 src/main/java/emu/grasscutter/command/commands/SendMessage.java create mode 100644 src/main/java/emu/grasscutter/command/commands/SetHealth.java create mode 100644 src/main/java/emu/grasscutter/command/commands/SetWorldLevel.java create mode 100644 src/main/java/emu/grasscutter/command/commands/Spawn.java create mode 100644 src/main/java/emu/grasscutter/command/commands/Stop.java delete mode 100644 src/main/java/emu/grasscutter/commands/Command.java delete mode 100644 src/main/java/emu/grasscutter/commands/CommandHandler.java delete mode 100644 src/main/java/emu/grasscutter/commands/PlayerCommands.java delete mode 100644 src/main/java/emu/grasscutter/commands/ServerCommands.java diff --git a/src/deprecated/java/emu/grasscutter/commands/PlayerCommands.java b/src/deprecated/java/emu/grasscutter/commands/PlayerCommands.java deleted file mode 100644 index 2e8be354d..000000000 --- a/src/deprecated/java/emu/grasscutter/commands/PlayerCommands.java +++ /dev/null @@ -1,307 +0,0 @@ -package emu.grasscutter.commands; - -import java.lang.reflect.Modifier; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; - -import emu.grasscutter.data.GenshinData; -import emu.grasscutter.data.def.ItemData; -import emu.grasscutter.data.def.MonsterData; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.avatar.GenshinAvatar; -import emu.grasscutter.game.entity.EntityAvatar; -import emu.grasscutter.game.entity.EntityItem; -import emu.grasscutter.game.entity.EntityMonster; -import emu.grasscutter.game.entity.GenshinEntity; -import emu.grasscutter.game.inventory.GenshinItem; -import emu.grasscutter.game.inventory.ItemType; -import emu.grasscutter.game.props.ActionReason; -import emu.grasscutter.game.props.FightProperty; -import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; -import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; -import emu.grasscutter.utils.Position; - -public class PlayerCommands { - private static HashMap list = new HashMap<>(); - - static { - try { - // Look for classes - for (Class cls : PlayerCommands.class.getDeclaredClasses()) { - // Get non abstract classes - if (!Modifier.isAbstract(cls.getModifiers())) { - Command commandAnnotation = cls.getAnnotation(Command.class); - PlayerCommand command = (PlayerCommand) cls.newInstance(); - - if (commandAnnotation != null) { - command.setLevel(commandAnnotation.gmLevel()); - for (String alias : commandAnnotation.aliases()) { - if (alias.length() == 0) { - continue; - } - - String commandName = "!" + alias; - list.put(commandName, command); - commandName = "/" + alias; - list.put(commandName, command); - } - } - - String commandName = "!" + cls.getSimpleName().toLowerCase(); - list.put(commandName, command); - commandName = "/" + cls.getSimpleName().toLowerCase(); - list.put(commandName, command); - } - - } - } catch (Exception e) { - - } - } - - public static void handle(GenshinPlayer player, String msg) { - String[] split = msg.split(" "); - - // End if invalid - if (split.length == 0) { - return; - } - - // - String first = split[0].toLowerCase(); - PlayerCommand c = PlayerCommands.list.get(first); - - if (c != null) { - // Level check - if (player.getGmLevel() < c.getLevel()) { - return; - } - // Execute - int len = Math.min(first.length() + 1, msg.length()); - c.execute(player, msg.substring(len)); - } - } - - public static abstract class PlayerCommand { - // GM level required to use this command - private int level; - protected int getLevel() { return this.level; } - protected void setLevel(int minLevel) { this.level = minLevel; } - - // Main - public abstract void execute(GenshinPlayer player, String raw); - } - - // ================ Commands ================ - - @Command(aliases = {"g", "item", "additem"}, helpText = "/give [item id] [count] - Gives {count} amount of {item id}") - public static class Give extends PlayerCommand { - @Override - public void execute(GenshinPlayer player, String raw) { - String[] split = raw.split(" "); - int itemId = 0, count = 1; - - try { - itemId = Integer.parseInt(split[0]); - } catch (Exception e) { - itemId = 0; - } - - try { - count = Math.max(Math.min(Integer.parseInt(split[1]), Integer.MAX_VALUE), 1); - } catch (Exception e) { - count = 1; - } - - // Give - ItemData itemData = GenshinData.getItemDataMap().get(itemId); - GenshinItem item; - - if (itemData == null) { - player.dropMessage("Error: Item data not found"); - return; - } - - if (itemData.isEquip()) { - List items = new LinkedList<>(); - for (int i = 0; i < count; i++) { - item = new GenshinItem(itemData); - items.add(item); - } - player.getInventory().addItems(items); - player.sendPacket(new PacketItemAddHintNotify(items, ActionReason.SubfieldDrop)); - } else { - item = new GenshinItem(itemData, count); - player.getInventory().addItem(item); - player.sendPacket(new PacketItemAddHintNotify(item, ActionReason.SubfieldDrop)); - } - } - } - - @Command(aliases = {"d"}, helpText = "/drop [item id] [count] - Drops {count} amount of {item id}") - public static class Drop extends PlayerCommand { - @Override - public void execute(GenshinPlayer player, String raw) { - String[] split = raw.split(" "); - int itemId = 0, count = 1; - - try { - itemId = Integer.parseInt(split[0]); - } catch (Exception e) { - itemId = 0; - } - - try { - count = Math.max(Math.min(Integer.parseInt(split[1]), Integer.MAX_VALUE), 1); - } catch (Exception e) { - count = 1; - } - - // Give - ItemData itemData = GenshinData.getItemDataMap().get(itemId); - - if (itemData == null) { - player.dropMessage("Error: Item data not found"); - return; - } - - if (itemData.isEquip()) { - float range = (5f + (.1f * count)); - for (int i = 0; i < count; i++) { - Position pos = player.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); - EntityItem entity = new EntityItem(player.getWorld(), player, itemData, pos, 1); - player.getWorld().addEntity(entity); - } - } else { - EntityItem entity = new EntityItem(player.getWorld(), player, itemData, player.getPos().clone().addY(3f), count); - player.getWorld().addEntity(entity); - } - } - } - - @Command(helpText = "/spawn [monster id] [count] - Creates {count} amount of {item id}") - public static class Spawn extends PlayerCommand { - @Override - public void execute(GenshinPlayer player, String raw) { - String[] split = raw.split(" "); - int monsterId = 0, count = 1, level = 1; - - try { - monsterId = Integer.parseInt(split[0]); - } catch (Exception e) { - monsterId = 0; - } - - try { - level = Math.max(Math.min(Integer.parseInt(split[1]), 200), 1); - } catch (Exception e) { - level = 1; - } - - try { - count = Math.max(Math.min(Integer.parseInt(split[2]), 1000), 1); - } catch (Exception e) { - count = 1; - } - - // Give - MonsterData monsterData = GenshinData.getMonsterDataMap().get(monsterId); - - if (monsterData == null) { - player.dropMessage("Error: Monster data not found"); - return; - } - - float range = (5f + (.1f * count)); - for (int i = 0; i < count; i++) { - Position pos = player.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); - EntityMonster entity = new EntityMonster(player.getWorld(), monsterData, pos, level); - player.getWorld().addEntity(entity); - } - } - } - - @Command(helpText = "/killall") - public static class KillAll extends PlayerCommand { - @Override - public void execute(GenshinPlayer player, String raw) { - List toRemove = new LinkedList<>(); - for (GenshinEntity entity : player.getWorld().getEntities().values()) { - if (entity instanceof EntityMonster) { - toRemove.add(entity); - } - } - toRemove.forEach(e -> player.getWorld().killEntity(e, 0)); - } - } - - @Command(helpText = "/resetconst - Resets all constellations for the currently active character") - public static class ResetConst extends PlayerCommand { - @Override - public void execute(GenshinPlayer player, String raw) { - EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); - - if (entity == null) { - return; - } - - GenshinAvatar avatar = entity.getAvatar(); - - avatar.getTalentIdList().clear(); - avatar.setCoreProudSkillLevel(0); - avatar.recalcStats(); - avatar.save(); - - player.dropMessage("Constellations for " + entity.getAvatar().getAvatarData().getName() + " have been reset. Please relogin to see changes."); - } - } - - @Command(helpText = "/godmode - Prevents you from taking damage") - public static class Godmode extends PlayerCommand { - @Override - public void execute(GenshinPlayer player, String raw) { - player.setGodmode(!player.hasGodmode()); - player.dropMessage("Godmode is now " + (player.hasGodmode() ? "ON" : "OFF")); - } - } - - @Command(helpText = "/sethp [hp]") - public static class Sethp extends PlayerCommand { - @Override - public void execute(GenshinPlayer player, String raw) { - String[] split = raw.split(" "); - int hp = 0; - - try { - hp = Math.max(Integer.parseInt(split[0]), 1); - } catch (Exception e) { - hp = 1; - } - - EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); - - if (entity == null) { - return; - } - - entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, hp); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); - } - } - - @Command(aliases = {"clearart"}, helpText = "/clearartifacts") - public static class ClearArtifacts extends PlayerCommand { - @Override - public void execute(GenshinPlayer player, String raw) { - List toRemove = new LinkedList<>(); - for (GenshinItem item : player.getInventory().getItems().values()) { - if (item.getItemType() == ItemType.ITEM_RELIQUARY && item.getLevel() == 1 && item.getExp() == 0 && !item.isLocked() && !item.isEquipped()) { - toRemove.add(item); - } - } - - player.getInventory().removeItems(toRemove); - } - } -} diff --git a/src/deprecated/java/emu/grasscutter/commands/ServerCommands.java b/src/deprecated/java/emu/grasscutter/commands/ServerCommands.java deleted file mode 100644 index 2039d5227..000000000 --- a/src/deprecated/java/emu/grasscutter/commands/ServerCommands.java +++ /dev/null @@ -1,171 +0,0 @@ -package emu.grasscutter.commands; - -import java.lang.reflect.Modifier; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Collectors; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.data.GenshinData; -import emu.grasscutter.data.def.ItemData; -import emu.grasscutter.database.DatabaseHelper; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.inventory.GenshinItem; -import emu.grasscutter.utils.Crypto; -import emu.grasscutter.utils.Utils; - -public class ServerCommands { - private static HashMap list = new HashMap<>(); - - static { - try { - // Look for classes - for (Class cls : ServerCommands.class.getDeclaredClasses()) { - // Get non abstract classes - if (!Modifier.isAbstract(cls.getModifiers())) { - String commandName = cls.getSimpleName().toLowerCase(); - list.put(commandName, (ServerCommand) cls.newInstance()); - } - - } - } catch (Exception e) { - - } - } - - public static void handle(String msg) { - String[] split = msg.split(" "); - - // End if invalid - if (split.length == 0) { - return; - } - - // - String first = split[0].toLowerCase(); - ServerCommand c = ServerCommands.list.get(first); - - if (c != null) { - // Execute - int len = Math.min(first.length() + 1, msg.length()); - c.execute(msg.substring(len)); - } - } - - public static abstract class ServerCommand { - public abstract void execute(String raw); - } - - // ================ Commands ================ - - public static class Reload extends ServerCommand { - @Override - public void execute(String raw) { - Grasscutter.getLogger().info("Reloading config."); - Grasscutter.loadConfig(); - Grasscutter.getDispatchServer().loadQueries(); - Grasscutter.getLogger().info("Reload complete."); - } - } - - public static class sendMsg extends ServerCommand { - @Override - public void execute(String raw) { - List split = Arrays.asList(raw.split(" ")); - - if (split.size() < 2) { - Grasscutter.getLogger().error("Invalid amount of args"); - return; - } - - String playerID = split.get(0); - String message = split.stream().skip(1).collect(Collectors.joining(" ")); - - - emu.grasscutter.game.Account account = DatabaseHelper.getAccountByPlayerId(Integer.parseInt(playerID)); - if (account != null) { - GenshinPlayer player = Grasscutter.getGameServer().getPlayerById(Integer.parseInt(playerID)); - if(player != null) { - player.dropMessage(message); - Grasscutter.getLogger().info(String.format("Successfully sent message to %s: %s", playerID, message)); - } else { - Grasscutter.getLogger().error("Player not online"); - } - } else { - Grasscutter.getLogger().error(String.format("Player %s does not exist", playerID)); - } - } - } - - public static class Account extends ServerCommand { - @Override - public void execute(String raw) { - String[] split = raw.split(" "); - - if (split.length < 2) { - Grasscutter.getLogger().error("Invalid amount of args"); - return; - } - - String command = split[0].toLowerCase(); - String username = split[1]; - - switch (command) { - case "create": - if (split.length < 2) { - Grasscutter.getLogger().error("Invalid amount of args"); - return; - } - - int reservedId = 0; - try { - reservedId = Integer.parseInt(split[2]); - } catch (Exception e) { - reservedId = 0; - } - - emu.grasscutter.game.Account account = DatabaseHelper.createAccountWithId(username, reservedId); - if (account != null) { - Grasscutter.getLogger().info("Account created" + (reservedId > 0 ? " with an id of " + reservedId : "")); - } else { - Grasscutter.getLogger().error("Account already exists"); - } - break; - case "delete": - boolean success = DatabaseHelper.deleteAccount(username); - - if (success) { - Grasscutter.getLogger().info("Account deleted"); - } - break; - /* - case "setpw": - case "setpass": - case "setpassword": - if (split.length < 3) { - Grasscutter.getLogger().error("Invalid amount of args"); - return; - } - - account = DatabaseHelper.getAccountByName(username); - - if (account == null) { - Grasscutter.getLogger().error("No account found!"); - return; - } - - token = split[2]; - token = PasswordHelper.hashPassword(token); - - account.setPassword(token); - DatabaseHelper.saveAccount(account); - - Grasscutter.getLogger().info("Password set"); - break; - */ - } - } - } -} diff --git a/src/main/java/emu/grasscutter/Grasscutter.java b/src/main/java/emu/grasscutter/Grasscutter.java index c9ccb551c..0e34c120d 100644 --- a/src/main/java/emu/grasscutter/Grasscutter.java +++ b/src/main/java/emu/grasscutter/Grasscutter.java @@ -7,7 +7,7 @@ import java.io.FileWriter; import java.io.InputStreamReader; import java.net.InetSocketAddress; -import emu.grasscutter.commands.CommandMap; +import emu.grasscutter.command.CommandMap; import emu.grasscutter.utils.Utils; import org.reflections.Reflections; import org.slf4j.LoggerFactory; diff --git a/src/main/java/emu/grasscutter/command/Command.java b/src/main/java/emu/grasscutter/command/Command.java new file mode 100644 index 000000000..d8a57e1a8 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/Command.java @@ -0,0 +1,17 @@ +package emu.grasscutter.command; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Command { + String label() default ""; + + String usage() default "No usage specified"; + + String description() default "No description specified"; + + String[] aliases() default {}; + + String permission() default ""; +} diff --git a/src/main/java/emu/grasscutter/command/CommandHandler.java b/src/main/java/emu/grasscutter/command/CommandHandler.java new file mode 100644 index 000000000..187dc0b6a --- /dev/null +++ b/src/main/java/emu/grasscutter/command/CommandHandler.java @@ -0,0 +1,25 @@ +package emu.grasscutter.command; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +public interface CommandHandler { + /** + * Send a message to the target. + * + * @param player The player to send the message to, or null for the server console. + * @param message The message to send. + */ + static void sendMessage(GenshinPlayer player, String message) { + if (player == null) { + Grasscutter.getLogger().info(message); + } else { + player.dropMessage(message); + } + } + + default void onCommand(GenshinPlayer sender, List args) { + } +} diff --git a/src/main/java/emu/grasscutter/commands/CommandMap.java b/src/main/java/emu/grasscutter/command/CommandMap.java similarity index 75% rename from src/main/java/emu/grasscutter/commands/CommandMap.java rename to src/main/java/emu/grasscutter/command/CommandMap.java index a802551ce..d61e46833 100644 --- a/src/main/java/emu/grasscutter/commands/CommandMap.java +++ b/src/main/java/emu/grasscutter/command/CommandMap.java @@ -1,4 +1,4 @@ -package emu.grasscutter.commands; +package emu.grasscutter.command; import emu.grasscutter.Grasscutter; import emu.grasscutter.game.Account; @@ -7,75 +7,89 @@ import org.reflections.Reflections; import java.util.*; -@SuppressWarnings("UnusedReturnValue") +@SuppressWarnings({"UnusedReturnValue", "unused"}) public final class CommandMap { + private final Map commands = new HashMap<>(); + private final Map annotations = new HashMap<>(); + public CommandMap() { + this(false); + } + + public CommandMap(boolean scan) { + if (scan) this.scan(); + } + public static CommandMap getInstance() { return Grasscutter.getGameServer().getCommandMap(); } - - private final Map commands = new HashMap<>(); - private final Map annotations = new HashMap<>(); /** * Register a command handler. - * @param label The command label. + * + * @param label The command label. * @param command The command handler. * @return Instance chaining. */ public CommandMap registerCommand(String label, CommandHandler command) { Grasscutter.getLogger().debug("Registered command: " + label); - + // Get command data. Command annotation = command.getClass().getAnnotation(Command.class); this.annotations.put(label, annotation); this.commands.put(label, command); - + // Register aliases. - if(annotation.aliases().length > 0) { + if (annotation.aliases().length > 0) { for (String alias : annotation.aliases()) { this.commands.put(alias, command); this.annotations.put(alias, annotation); } - } return this; + } + return this; } /** * Removes a registered command handler. + * * @param label The command label. * @return Instance chaining. */ public CommandMap unregisterCommand(String label) { Grasscutter.getLogger().debug("Unregistered command: " + label); CommandHandler handler = this.commands.get(label); - if(handler == null) return this; - + if (handler == null) return this; + Command annotation = handler.getClass().getAnnotation(Command.class); this.annotations.remove(label); this.commands.remove(label); - + // Unregister aliases. - if(annotation.aliases().length > 0) { + if (annotation.aliases().length > 0) { for (String alias : annotation.aliases()) { this.commands.remove(alias); this.annotations.remove(alias); } } - + return this; } /** * Returns a list of all registered commands. + * * @return All command handlers as a list. */ public List getHandlersAsList() { return new LinkedList<>(this.commands.values()); } - public HashMap getHandlers() { return new LinkedHashMap<>(this.commands); } + public HashMap getHandlers() { + return new LinkedHashMap<>(this.commands); + } /** * Returns a handler by label/alias. + * * @param label The command label. * @return The command handler. */ @@ -85,58 +99,44 @@ public final class CommandMap { /** * Invoke a command handler with the given arguments. - * @param player The player invoking the command or null for the server console. + * + * @param player The player invoking the command or null for the server console. * @param rawMessage The messaged used to invoke the command. */ public void invoke(GenshinPlayer player, String rawMessage) { rawMessage = rawMessage.trim(); - if(rawMessage.length() == 0) { + if (rawMessage.length() == 0) { CommandHandler.sendMessage(player, "No command specified."); } - + // Remove prefix if present. - if(!Character.isLetter(rawMessage.charAt(0))) + if (!Character.isLetter(rawMessage.charAt(0))) rawMessage = rawMessage.substring(1); - + // Parse message. String[] split = rawMessage.split(" "); List args = new LinkedList<>(Arrays.asList(split)); String label = args.remove(0); - + // Get command handler. CommandHandler handler = this.commands.get(label); - if(handler == null) { - CommandHandler.sendMessage(player, "Unknown command: " + label); return; + if (handler == null) { + CommandHandler.sendMessage(player, "Unknown command: " + label); + return; } - + // Check for permission. - if(player != null) { + if (player != null) { String permissionNode = this.annotations.get(label).permission(); Account account = player.getAccount(); - if(permissionNode != "" && !account.hasPermission(permissionNode)) { - CommandHandler.sendMessage(player, "You do not have permission to run this command."); return; + if (!Objects.equals(permissionNode, "") && !account.hasPermission(permissionNode)) { + CommandHandler.sendMessage(player, "You do not have permission to run this command."); + return; } } - - // Execution power check. - Command.Execution executionPower = this.annotations.get(label).execution(); - if(player == null && executionPower == Command.Execution.PLAYER) { - CommandHandler.sendMessage(null, "Run this command in-game."); return; - } else if (player != null && executionPower == Command.Execution.CONSOLE) { - CommandHandler.sendMessage(player, "This command can only be run from the console."); return; - } - + // Invoke execute method for handler. - if(player == null) handler.execute(args); - else handler.execute(player, args); - } - - public CommandMap() { - this(false); - } - - public CommandMap(boolean scan) { - if(scan) this.scan(); + handler.onCommand(player, args); } /** diff --git a/src/main/java/emu/grasscutter/command/commands/Account.java b/src/main/java/emu/grasscutter/command/commands/Account.java new file mode 100644 index 000000000..4d4a80db4 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Account.java @@ -0,0 +1,61 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.database.DatabaseHelper; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "account", usage = "account [uid]", + description = "Modify user accounts") +public class Account implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender != null) { + CommandHandler.sendMessage(sender, "This command can only be run from the console."); + return; + } + + if (args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: account [uid]"); + return; + } + + String action = args.get(0); + String username = args.get(1); + + switch (action) { + default: + CommandHandler.sendMessage(null, "Usage: account [uid]"); + return; + case "create": + int uid = 0; + if (args.size() > 2) { + try { + uid = Integer.parseInt(args.get(2)); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid UID."); + return; + } + } + + emu.grasscutter.game.Account account = DatabaseHelper.createAccountWithId(username, uid); + if (account == null) { + CommandHandler.sendMessage(null, "Account already exists."); + return; + } else { + CommandHandler.sendMessage(null, "Account created with UID " + account.getPlayerId() + "."); + account.addPermission("*"); // Grant the player superuser permissions. + } + return; + case "delete": + if (DatabaseHelper.deleteAccount(username)) { + CommandHandler.sendMessage(null, "Account deleted."); + } else { + CommandHandler.sendMessage(null, "Account not found."); + } + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Broadcast.java b/src/main/java/emu/grasscutter/command/commands/Broadcast.java new file mode 100644 index 000000000..f8d08eb9c --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Broadcast.java @@ -0,0 +1,29 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "broadcast", usage = "broadcast ", + description = "Sends a message to all the players", aliases = {"b"}, permission = "server.broadcast") +public class Broadcast implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: broadcast "); + return; + } + + String message = String.join(" ", args.subList(0, args.size())); + + for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { + CommandHandler.sendMessage(p, message); + } + + CommandHandler.sendMessage(sender, "Message sent."); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/ChangeScene.java b/src/main/java/emu/grasscutter/command/commands/ChangeScene.java new file mode 100644 index 000000000..fe1521fba --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/ChangeScene.java @@ -0,0 +1,36 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "changescene", usage = "changescene ", + description = "Changes your scene", aliases = {"scene"}, permission = "player.changescene") +public class ChangeScene implements CommandHandler { + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: changescene "); + return; + } + + try { + int sceneId = Integer.parseInt(args.get(0)); + boolean result = sender.getWorld().transferPlayerToScene(sender, sceneId, sender.getPos()); + + CommandHandler.sendMessage(sender, "Changed to scene " + sceneId); + if (!result) { + CommandHandler.sendMessage(sender, "Scene does not exist or you are already in it"); + } + } catch (Exception e) { + CommandHandler.sendMessage(sender, "Usage: changescene "); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/ClearArtifacts.java b/src/main/java/emu/grasscutter/command/commands/ClearArtifacts.java new file mode 100644 index 000000000..2069b0466 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/ClearArtifacts.java @@ -0,0 +1,30 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.inventory.Inventory; +import emu.grasscutter.game.inventory.ItemType; + +import java.util.List; + +@Command(label = "clearartifacts", usage = "clearartifacts", + description = "Deletes all unequipped and unlocked level 0 artifacts, including yellow rarity ones from your inventory", + aliases = {"clearart"}, permission = "player.clearartifacts") +public class ClearArtifacts implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; // TODO: clear player's artifacts from console or other players + } + + Inventory playerInventory = sender.getInventory(); + playerInventory.getItems().values().stream() + .filter(item -> item.getItemType() == ItemType.ITEM_RELIQUARY) + .filter(item -> item.getLevel() == 1 && item.getExp() == 0) + .filter(item -> !item.isLocked() && !item.isEquipped()) + .forEach(item -> playerInventory.removeItem(item, item.getCount())); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Drop.java b/src/main/java/emu/grasscutter/command/commands/Drop.java new file mode 100644 index 000000000..3ef3bc840 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Drop.java @@ -0,0 +1,56 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.data.GenshinData; +import emu.grasscutter.data.def.ItemData; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.entity.EntityItem; +import emu.grasscutter.utils.Position; + +import java.util.List; + +@Command(label = "drop", usage = "drop [amount]", + description = "Drops an item near you", aliases = {"d", "dropitem"}, permission = "server.drop") +public class Drop implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: drop [amount]"); + return; + } + + try { + int item = Integer.parseInt(args.get(0)); + int amount = 1; + if (args.size() > 1) amount = Integer.parseInt(args.get(1)); + + ItemData itemData = GenshinData.getItemDataMap().get(item); + if (itemData == null) { + CommandHandler.sendMessage(sender, "Invalid item id."); + return; + } + + if (itemData.isEquip()) { + float range = (5f + (.1f * amount)); + for (int i = 0; i < amount; i++) { + Position pos = sender.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); + EntityItem entity = new EntityItem(sender.getScene(), sender, itemData, pos, 1); + sender.getScene().addEntity(entity); + } + } else { + EntityItem entity = new EntityItem(sender.getScene(), sender, itemData, sender.getPos().clone().addY(3f), amount); + sender.getScene().addEntity(entity); + } + CommandHandler.sendMessage(sender, String.format("Dropped %s of %s.", amount, item)); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid item or player ID."); + } + } +} \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/command/commands/Give.java b/src/main/java/emu/grasscutter/command/commands/Give.java new file mode 100644 index 000000000..43f1961cc --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Give.java @@ -0,0 +1,112 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.data.GenshinData; +import emu.grasscutter.data.def.ItemData; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.inventory.GenshinItem; +import emu.grasscutter.game.props.ActionReason; +import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; + +import java.util.LinkedList; +import java.util.List; + +@Command(label = "give", usage = "give [player] [amount]", + description = "Gives an item to you or the specified player", aliases = {"g", "item", "giveitem"}, permission = "player.give") +public class Give implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + int target, item, amount = 1; + + if (sender == null && args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: give [amount]"); + return; + } + + switch (args.size()) { + default: // *No args* + CommandHandler.sendMessage(sender, "Usage: give [player] [amount]"); + return; + case 1: // + try { + item = Integer.parseInt(args.get(0)); + target = sender.getUid(); + } catch (NumberFormatException ignored) { + // TODO: Parse from item name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid item id."); + return; + } + break; + case 2: // [amount] | [player] + try { + target = Integer.parseInt(args.get(0)); + + if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { + target = sender.getUid(); + item = Integer.parseInt(args.get(0)); + amount = Integer.parseInt(args.get(1)); + } else { + item = Integer.parseInt(args.get(1)); + } + } catch (NumberFormatException ignored) { + // TODO: Parse from item name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid item or player ID."); + return; + } + break; + case 3: // [player] [amount] + try { + target = Integer.parseInt(args.get(0)); + + if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { + CommandHandler.sendMessage(sender, "Invalid player ID."); + return; + } + + item = Integer.parseInt(args.get(1)); + amount = Integer.parseInt(args.get(2)); + } catch (NumberFormatException ignored) { + // TODO: Parse from item name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid item or player ID."); + return; + } + break; + } + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + + if (targetPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found."); + return; + } + + ItemData itemData = GenshinData.getItemDataMap().get(item); + if (itemData == null) { + CommandHandler.sendMessage(sender, "Invalid item id."); + return; + } + + this.item(targetPlayer, itemData, amount); + + CommandHandler.sendMessage(sender, String.format("Given %s of %s to %s.", amount, item, target)); + } + + private void item(GenshinPlayer player, ItemData itemData, int amount) { + GenshinItem genshinItem = new GenshinItem(itemData); + if (itemData.isEquip()) { + List items = new LinkedList<>(); + for (int i = 0; i < amount; i++) { + items.add(genshinItem); + } + player.getInventory().addItems(items); + player.sendPacket(new PacketItemAddHintNotify(items, ActionReason.SubfieldDrop)); + } else { + genshinItem.setCount(amount); + player.getInventory().addItem(genshinItem); + player.sendPacket(new PacketItemAddHintNotify(genshinItem, ActionReason.SubfieldDrop)); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/GiveChar.java b/src/main/java/emu/grasscutter/command/commands/GiveChar.java new file mode 100644 index 000000000..7eaa56a47 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/GiveChar.java @@ -0,0 +1,93 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.data.GenshinData; +import emu.grasscutter.data.def.AvatarData; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.avatar.GenshinAvatar; + +import java.util.List; + +@Command(label = "givechar", usage = "givechar [level]", + description = "Gives the player a specified character", aliases = {"givec"}, permission = "player.givechar") +public class GiveChar implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + int target, avatarId, level = 1, ascension; + + if (sender == null && args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: givechar [amount]"); + return; + } + + switch (args.size()) { + default: + CommandHandler.sendMessage(sender, "Usage: givechar [level]"); + return; + case 2: + try { + target = Integer.parseInt(args.get(0)); + if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { + target = sender.getUid(); + level = Integer.parseInt(args.get(1)); + avatarId = Integer.parseInt(args.get(0)); + } else { + avatarId = Integer.parseInt(args.get(1)); + } + } catch (NumberFormatException ignored) { + // TODO: Parse from avatar name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid avatar or player ID."); + return; + } + break; + case 3: + try { + target = Integer.parseInt(args.get(0)); + if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { + CommandHandler.sendMessage(sender, "Invalid player ID."); + return; + } + + avatarId = Integer.parseInt(args.get(1)); + level = Integer.parseInt(args.get(2)); + } catch (NumberFormatException ignored) { + // TODO: Parse from avatar name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid avatar or player ID."); + return; + } + break; + } + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + if (targetPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found."); + return; + } + + AvatarData avatarData = GenshinData.getAvatarDataMap().get(avatarId); + if (avatarData == null) { + CommandHandler.sendMessage(sender, "Invalid avatar id."); + return; + } + + // Calculate ascension level. + if (level <= 40) { + ascension = (int) Math.ceil(level / 20f); + } else { + ascension = (int) Math.ceil(level / 10f) - 3; + } + + GenshinAvatar avatar = new GenshinAvatar(avatarId); + avatar.setLevel(level); + avatar.setPromoteLevel(ascension); + + // This will handle stats and talents + avatar.recalcStats(); + + targetPlayer.addAvatar(avatar); + CommandHandler.sendMessage(sender, String.format("Given %s to %s.", avatarId, target)); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/GodMode.java b/src/main/java/emu/grasscutter/command/commands/GodMode.java new file mode 100644 index 000000000..491bf0ba8 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/GodMode.java @@ -0,0 +1,22 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "godmode", usage = "godmode [playerId]", + description = "Prevents you from taking damage", permission = "player.godmode") +public class GodMode implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; // TODO: toggle player's godmode statue from console or other players + } + sender.setGodmode(!sender.inGodmode()); + sender.dropMessage("Godmode is now " + (sender.inGodmode() ? "enabled" : "disabled") + "."); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Help.java b/src/main/java/emu/grasscutter/command/commands/Help.java new file mode 100644 index 000000000..3350160a7 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Help.java @@ -0,0 +1,91 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.command.CommandMap; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.*; + +@Command(label = "help", usage = "help [command]", + description = "Sends the help message or shows information about a specified command") +public class Help implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer player, List args) { + if (args.size() < 1) { + HashMap handlers = CommandMap.getInstance().getHandlers(); + List annotations = new ArrayList<>(); + for (String key : handlers.keySet()) { + Command annotation = handlers.get(key).getClass().getAnnotation(Command.class); + + if (!Arrays.asList(annotation.aliases()).contains(key)) { + if (player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) + continue; + annotations.add(annotation); + } + } + + SendAllHelpMessage(player, annotations); + } else { + String command = args.get(0); + CommandHandler handler = CommandMap.getInstance().getHandler(command); + StringBuilder builder = new StringBuilder(player == null ? "\nHelp - " : "Help - ").append(command).append(": \n"); + if (handler == null) { + builder.append("No command found."); + } else { + Command annotation = handler.getClass().getAnnotation(Command.class); + + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if (annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + if (player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) { + builder.append("\n Warning: You do not have permission to run this command."); + } + } + + CommandHandler.sendMessage(player, builder.toString()); + } + } + + void SendAllHelpMessage(GenshinPlayer player, List annotations) { + if (player == null) { + StringBuilder builder = new StringBuilder("\nAvailable commands:\n"); + annotations.forEach(annotation -> { + builder.append(annotation.label()).append("\n"); + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if (annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + + builder.append("\n"); + }); + + CommandHandler.sendMessage(null, builder.toString()); + } else { + CommandHandler.sendMessage(player, "Available commands:"); + annotations.forEach(annotation -> { + StringBuilder builder = new StringBuilder(annotation.label()).append("\n"); + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if (annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + + CommandHandler.sendMessage(player, builder.toString()); + }); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Kick.java b/src/main/java/emu/grasscutter/command/commands/Kick.java new file mode 100644 index 000000000..d1ef5077e --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Kick.java @@ -0,0 +1,31 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "kick", usage = "kick ", + description = "Kicks the specified player from the server (WIP)", permission = "server.kick") +public class Kick implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + int target = Integer.parseInt(args.get(0)); + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + if (targetPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found."); + return; + } + + if (sender != null) { + CommandHandler.sendMessage(sender, String.format("Player [%s:%s] has kicked player [%s:%s]", sender.getAccount().getPlayerId(), sender.getAccount().getUsername(), target, targetPlayer.getAccount().getUsername())); + } + CommandHandler.sendMessage(sender, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); + + targetPlayer.getSession().close(); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/KillAll.java b/src/main/java/emu/grasscutter/command/commands/KillAll.java new file mode 100644 index 000000000..540c01ce3 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/KillAll.java @@ -0,0 +1,64 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.GenshinScene; +import emu.grasscutter.game.entity.EntityMonster; + +import java.util.List; + +@Command(label = "killall", usage = "killall [playerUid] [sceneId]", + description = "Kill all entities", permission = "server.killall") +public class KillAll implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + GenshinScene scene; + GenshinPlayer genshinPlayer; + + try { + switch (args.size()) { + case 0: // *No args* + if (sender == null) { + CommandHandler.sendMessage(null, "Usage: killall [playerUid] [sceneId]"); + return; + } + scene = sender.getScene(); + break; + case 1: // [playerUid] + genshinPlayer = Grasscutter.getGameServer().getPlayerByUid(Integer.parseInt(args.get(0))); + if (genshinPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found or offline."); + return; + } + scene = genshinPlayer.getScene(); + break; + case 2: // [playerUid] [sceneId] + genshinPlayer = Grasscutter.getGameServer().getPlayerByUid(Integer.parseInt(args.get(0))); + if (genshinPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found or offline."); + return; + } + GenshinScene genshinScene = sender.getWorld().getSceneById(Integer.parseInt(args.get(1))); + if (genshinScene == null) { + CommandHandler.sendMessage(sender, "Scene not found in player world"); + return; + } + scene = genshinScene; + break; + default: + CommandHandler.sendMessage(sender, "Usage: killall [playerUid] [sceneId]"); + return; + } + + scene.getEntities().values().stream() + .filter(entity -> entity instanceof EntityMonster) + .forEach(entity -> scene.killEntity(entity, 0)); + CommandHandler.sendMessage(sender, "Killing all monsters in scene " + scene.getId()); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid arguments."); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Permission.java b/src/main/java/emu/grasscutter/command/commands/Permission.java new file mode 100644 index 000000000..02c047f48 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Permission.java @@ -0,0 +1,50 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.Account; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "permission", usage = "permission ", + description = "Grants or removes a permission for a user", permission = "*") +public class Permission implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (args.size() < 3) { + CommandHandler.sendMessage(sender, "Usage: permission "); + return; + } + + String action = args.get(0); + String username = args.get(1); + String permission = args.get(2); + + Account account = Grasscutter.getGameServer().getAccountByName(username); + if (account == null) { + CommandHandler.sendMessage(sender, "Account not found."); + return; + } + + switch (action) { + default: + CommandHandler.sendMessage(sender, "Usage: permission "); + break; + case "add": + if (account.addPermission(permission)) { + CommandHandler.sendMessage(sender, "Permission added."); + } else CommandHandler.sendMessage(sender, "They already have this permission!"); + break; + case "remove": + if (account.removePermission(permission)) { + CommandHandler.sendMessage(sender, "Permission removed."); + } else CommandHandler.sendMessage(sender, "They don't have this permission!"); + break; + } + + account.save(); + } +} \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/command/commands/Reload.java b/src/main/java/emu/grasscutter/command/commands/Reload.java new file mode 100644 index 000000000..587ffcd9c --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Reload.java @@ -0,0 +1,21 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "reload", usage = "reload", + description = "Reload server config", permission = "server.reload") +public class Reload implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + CommandHandler.sendMessage(sender, "Reloading config."); + Grasscutter.loadConfig(); + Grasscutter.getDispatchServer().loadQueries(); + CommandHandler.sendMessage(sender, "Reload complete."); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/ResetConst.java b/src/main/java/emu/grasscutter/command/commands/ResetConst.java new file mode 100644 index 000000000..cabc00b64 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/ResetConst.java @@ -0,0 +1,45 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.avatar.GenshinAvatar; +import emu.grasscutter.game.entity.EntityAvatar; + +import java.util.List; + +@Command(label = "resetconst", usage = "resetconst [all]", + description = "Resets the constellation level on your current active character, will need to relog after using the command to see any changes.", + aliases = {"resetconstellation"}, permission = "player.resetconstellation") +public class ResetConst implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + if (args.size() > 0 && args.get(0).equalsIgnoreCase("all")) { + sender.getAvatars().forEach(this::resetConstellation); + sender.dropMessage("Reset all avatars' constellations."); + } else { + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + if (entity == null) { + return; + } + + GenshinAvatar avatar = entity.getAvatar(); + this.resetConstellation(avatar); + + sender.dropMessage("Constellations for " + avatar.getAvatarData().getName() + " have been reset. Please relog to see changes."); + } + } + + private void resetConstellation(GenshinAvatar avatar) { + avatar.getTalentIdList().clear(); + avatar.setCoreProudSkillLevel(0); + avatar.recalcStats(); + avatar.save(); + } +} \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/command/commands/SendMessage.java b/src/main/java/emu/grasscutter/command/commands/SendMessage.java new file mode 100644 index 000000000..3d2fd7b70 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/SendMessage.java @@ -0,0 +1,37 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "say", usage = "say ", description = "Sends a message to a player as the server", + aliases = {"sendservmsg", "sendservermessage", "sendmessage"}, permission = "server.sendmessage") +public class SendMessage implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: sendmessage "); + return; + } + + try { + int target = Integer.parseInt(args.get(0)); + String message = String.join(" ", args.subList(1, args.size())); + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + if (targetPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found."); + return; + } + + CommandHandler.sendMessage(targetPlayer, message); + CommandHandler.sendMessage(sender, "Message sent."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid player ID."); + } + } +} \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/command/commands/SetHealth.java b/src/main/java/emu/grasscutter/command/commands/SetHealth.java new file mode 100644 index 000000000..2daf792ef --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/SetHealth.java @@ -0,0 +1,42 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.entity.EntityAvatar; +import emu.grasscutter.game.props.FightProperty; +import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; + +import java.util.List; + +@Command(label = "sethealth", usage = "sethealth ", + description = "Sets your health to the specified value", aliases = {"sethp"}, permission = "player.sethealth") +public class SetHealth implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; // TODO: set player's health from console or other players + } + + if (args.size() < 1) { + CommandHandler.sendMessage(null, "Usage: sethealth "); + return; + } + + try { + int health = Integer.parseInt(args.get(0)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + if (entity == null) { + return; + } + + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); + sender.dropMessage("Health set to " + health + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid health value."); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/SetWorldLevel.java b/src/main/java/emu/grasscutter/command/commands/SetWorldLevel.java new file mode 100644 index 000000000..69eeae1d9 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/SetWorldLevel.java @@ -0,0 +1,39 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.props.PlayerProperty; + +import java.util.List; + +@Command(label = "setworldlevel", usage = "setworldlevel ", + description = "Sets your world level (Relog to see proper effects)", + aliases = {"setworldlvl"}, permission = "player.setworldlevel") +public class SetWorldLevel implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; // TODO: set player's world level from console or other players + } + + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: setworldlevel "); + return; + } + + try { + int level = Integer.parseInt(args.get(0)); + + // Set in both world and player props + sender.getWorld().setWorldLevel(level); + sender.setProperty(PlayerProperty.PROP_PLAYER_WORLD_LEVEL, level); + + sender.dropMessage("World level set to " + level + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid world level."); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Spawn.java b/src/main/java/emu/grasscutter/command/commands/Spawn.java new file mode 100644 index 000000000..def06c362 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Spawn.java @@ -0,0 +1,51 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.data.GenshinData; +import emu.grasscutter.data.def.MonsterData; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.entity.EntityMonster; +import emu.grasscutter.utils.Position; + +import java.util.List; + +@Command(label = "spawn", usage = "spawn [level] [amount]", + description = "Spawns an entity near you", permission = "server.spawn") +public class Spawn implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: spawn [amount]"); + return; + } + + try { + int entity = Integer.parseInt(args.get(0)); + int level = args.size() > 1 ? Integer.parseInt(args.get(1)) : 1; + int amount = args.size() > 2 ? Integer.parseInt(args.get(2)) : 1; + + MonsterData entityData = GenshinData.getMonsterDataMap().get(entity); + if (entityData == null) { + CommandHandler.sendMessage(sender, "Invalid entity id."); + return; + } + + float range = (5f + (.1f * amount)); + for (int i = 0; i < amount; i++) { + Position pos = sender.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); + EntityMonster monster = new EntityMonster(sender.getScene(), entityData, pos, level); + sender.getScene().addEntity(monster); + } + CommandHandler.sendMessage(sender, String.format("Spawned %s of %s.", amount, entity)); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid item or player ID."); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Stop.java b/src/main/java/emu/grasscutter/command/commands/Stop.java new file mode 100644 index 000000000..21676cb7d --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Stop.java @@ -0,0 +1,23 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "stop", usage = "stop", + description = "Stops the server", permission = "server.stop") +public class Stop implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + CommandHandler.sendMessage(null, "Server shutting down..."); + for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { + CommandHandler.sendMessage(p, "Server shutting down..."); + } + + System.exit(1); + } +} diff --git a/src/main/java/emu/grasscutter/commands/Command.java b/src/main/java/emu/grasscutter/commands/Command.java deleted file mode 100644 index d26d7fe29..000000000 --- a/src/main/java/emu/grasscutter/commands/Command.java +++ /dev/null @@ -1,25 +0,0 @@ -package emu.grasscutter.commands; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface Command { - String label() default ""; - - String usage() default "No usage specified"; - - String description() default "No description specified"; - - String[] aliases() default {}; - - Execution execution() default Execution.ALL; - - String permission() default ""; - - enum Execution { - ALL, - CONSOLE, - PLAYER - } -} diff --git a/src/main/java/emu/grasscutter/commands/CommandHandler.java b/src/main/java/emu/grasscutter/commands/CommandHandler.java deleted file mode 100644 index 97bd8c81f..000000000 --- a/src/main/java/emu/grasscutter/commands/CommandHandler.java +++ /dev/null @@ -1,28 +0,0 @@ -package emu.grasscutter.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -public interface CommandHandler { - /* Invoked on player execution. */ - default void execute(GenshinPlayer player, List args) { } - /* Invoked on server execution. */ - default void execute(List args) { } - - /* - * Utilities. - */ - - /** - * Send a message to the target. - * @param player The player to send the message to, or null for the server console. - * @param message The message to send. - */ - static void sendMessage(GenshinPlayer player, String message) { - if(player == null) { - Grasscutter.getLogger().info(message); - } else player.dropMessage(message); - } -} diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java deleted file mode 100644 index 779e91ef9..000000000 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ /dev/null @@ -1,539 +0,0 @@ -package emu.grasscutter.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.data.GenshinData; -import emu.grasscutter.data.def.ItemData; -import emu.grasscutter.data.def.AvatarData; -import emu.grasscutter.data.def.AvatarSkillDepotData; -import emu.grasscutter.data.def.MonsterData; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.GenshinScene; -import emu.grasscutter.game.World; -import emu.grasscutter.game.avatar.GenshinAvatar; -import emu.grasscutter.game.entity.EntityAvatar; -import emu.grasscutter.game.entity.EntityItem; -import emu.grasscutter.game.entity.EntityMonster; -import emu.grasscutter.game.inventory.GenshinItem; -import emu.grasscutter.game.inventory.Inventory; -import emu.grasscutter.game.inventory.ItemType; -import emu.grasscutter.game.props.ActionReason; -import emu.grasscutter.game.props.FightProperty; -import emu.grasscutter.game.props.PlayerProperty; -import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; -import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; -import emu.grasscutter.utils.Position; - -import java.util.LinkedList; -import java.util.List; - -/** - * A container for player-related commands. - */ -public final class PlayerCommands { - @Command(label = "give", aliases = {"g", "item", "giveitem"}, - usage = "give [player] [amount]", description = "Gives an item to you or the specified player", permission = "player.give") - public static class GiveCommand implements CommandHandler { - - @Override - public void execute(GenshinPlayer player, List args) { - int target, item, amount = 1; - - switch(args.size()) { - default: - CommandHandler.sendMessage(player, "Usage: give [amount]"); - return; - case 1: - try { - item = Integer.parseInt(args.get(0)); - target = player.getAccount().getPlayerId(); - } catch (NumberFormatException ignored) { - // TODO: Parse from item name using GM Handbook. - CommandHandler.sendMessage(player, "Invalid item id."); - return; - } - break; - case 2: - try { - target = Integer.parseInt(args.get(0)); - - if(Grasscutter.getGameServer().getPlayerByUid(target) == null) { - target = player.getUid(); amount = Integer.parseInt(args.get(1)); - item = Integer.parseInt(args.get(0)); - } else { - item = Integer.parseInt(args.get(1)); - } - } catch (NumberFormatException ignored) { - // TODO: Parse from item name using GM Handbook. - CommandHandler.sendMessage(player, "Invalid item or player ID."); - return; - } - break; - case 3: - try { - target = Integer.parseInt(args.get(0)); - - if(Grasscutter.getGameServer().getPlayerByUid(target) == null) { - CommandHandler.sendMessage(player, "Invalid player ID."); return; - } - - item = Integer.parseInt(args.get(1)); - amount = Integer.parseInt(args.get(2)); - } catch (NumberFormatException ignored) { - // TODO: Parse from item name using GM Handbook. - CommandHandler.sendMessage(player, "Invalid item or player ID."); - return; - } - break; - } - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - - if(targetPlayer == null) { - CommandHandler.sendMessage(player, "Player not found."); return; - } - - ItemData itemData = GenshinData.getItemDataMap().get(item); - if(itemData == null) { - CommandHandler.sendMessage(player, "Invalid item id."); return; - } - - this.item(targetPlayer, itemData, amount); - } - - /** - * give [player] [itemId|itemName] [amount] - */ - @Override public void execute(List args) { - if(args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: give [amount]"); - return; - } - - try { - int target = Integer.parseInt(args.get(0)); - int item = Integer.parseInt(args.get(1)); - int amount = 1; if(args.size() > 2) amount = Integer.parseInt(args.get(2)); - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - - if(targetPlayer == null) { - CommandHandler.sendMessage(null, "Player not found."); return; - } - - ItemData itemData = GenshinData.getItemDataMap().get(item); - if(itemData == null) { - CommandHandler.sendMessage(null, "Invalid item id."); return; - } - - this.item(targetPlayer, itemData, amount); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid item or player ID."); - } - } - - private void item(GenshinPlayer player, ItemData itemData, int amount) { - GenshinItem genshinItem = new GenshinItem(itemData); - if(itemData.isEquip()) { - List items = new LinkedList<>(); - for(int i = 0; i < amount; i++) { - items.add(genshinItem); - } player.getInventory().addItems(items); - player.sendPacket(new PacketItemAddHintNotify(items, ActionReason.SubfieldDrop)); - } else { - genshinItem.setCount(amount); - player.getInventory().addItem(genshinItem); - player.sendPacket(new PacketItemAddHintNotify(genshinItem, ActionReason.SubfieldDrop)); - } - } - } - - @Command(label = "drop", aliases = {"d", "dropitem"}, - usage = "drop [amount]", - execution = Command.Execution.PLAYER, description = "Drops an item near you", permission = "server.drop") - public static class DropCommand implements CommandHandler { - - @Override - public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { - CommandHandler.sendMessage(player, "Usage: drop [amount]"); - return; - } - - try { - int item = Integer.parseInt(args.get(0)); - int amount = 1; if(args.size() > 1) amount = Integer.parseInt(args.get(1)); - - ItemData itemData = GenshinData.getItemDataMap().get(item); - if(itemData == null) { - CommandHandler.sendMessage(player, "Invalid item id."); return; - } - - if (itemData.isEquip()) { - float range = (5f + (.1f * amount)); - for (int i = 0; i < amount; i++) { - Position pos = player.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); - EntityItem entity = new EntityItem(player.getScene(), player, itemData, pos, 1); - player.getScene().addEntity(entity); - } - } else { - EntityItem entity = new EntityItem(player.getScene(), player, itemData, player.getPos().clone().addY(3f), amount); - player.getScene().addEntity(entity); - } - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(player, "Invalid item or player ID."); - } - } - } - - @Command(label = "givechar", aliases = { "givec" }, usage = "givechar [level]", - description = "Gives the player a specified character", permission = "player.givechar") - public static class GiveCharCommand implements CommandHandler { - @Override public void execute(GenshinPlayer player, List args) { - int target, avatarId, level = 1, ascension = 1; - - if(args.size() < 1) { - CommandHandler.sendMessage(player, "Usage: givechar [level]"); - return; - } - - switch(args.size()) { - default: - CommandHandler.sendMessage(player, "Usage: givechar [level]"); - return; - case 2: - try { - target = Integer.parseInt(args.get(0)); - if(Grasscutter.getGameServer().getPlayerByUid(target) == null) { - target = player.getUid(); - level = Integer.parseInt(args.get(1)); - avatarId = Integer.parseInt(args.get(0)); - } else { - avatarId = Integer.parseInt(args.get(1)); - } - } catch (NumberFormatException ignored) { - // TODO: Parse from avatar name using GM Handbook. - CommandHandler.sendMessage(player, "Invalid avatar or player ID."); - return; - } - break; - case 3: - try { - target = Integer.parseInt(args.get(0)); - if(Grasscutter.getGameServer().getPlayerByUid(target) == null) { - CommandHandler.sendMessage(player, "Invalid player ID."); return; - } - - avatarId = Integer.parseInt(args.get(1)); - level = Integer.parseInt(args.get(2)); - } catch (NumberFormatException ignored) { - // TODO: Parse from avatar name using GM Handbook. - CommandHandler.sendMessage(player, "Invalid avatar or player ID."); - return; - } - break; - } - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if(targetPlayer == null) { - CommandHandler.sendMessage(player, "Player not found."); return; - } - - AvatarData avatarData = GenshinData.getAvatarDataMap().get(avatarId); - if(avatarData == null) { - CommandHandler.sendMessage(player, "Invalid avatar id."); return; - } - - // Calculate ascension level. - if (level <= 40) { - ascension = (int) Math.ceil(level / 20f); - } else { - ascension = (int) Math.ceil(level / 10f) - 3; - } - - GenshinAvatar avatar = new GenshinAvatar(avatarId); - avatar.setLevel(level); - avatar.setPromoteLevel(ascension); - - // This will handle stats and talents - avatar.recalcStats(); - - targetPlayer.addAvatar(avatar); - } - - @Override - public void execute(List args) { - if(args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: givechar [amount]"); - return; - } - - try { - int target = Integer.parseInt(args.get(0)); - int avatarID = Integer.parseInt(args.get(1)); - int level = 1; if(args.size() > 2) level = Integer.parseInt(args.get(2)); - int ascension; - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if(targetPlayer == null) { - CommandHandler.sendMessage(null, "Player not found."); return; - } - - AvatarData avatarData = GenshinData.getAvatarDataMap().get(avatarID); - if(avatarData == null) { - CommandHandler.sendMessage(null, "Invalid avatar id."); return; - } - - // Calculate ascension level. - if (level <= 40) { - ascension = (int) Math.ceil(level / 20f); - } else { - ascension = (int) Math.ceil(level / 10f) - 3; - } - - GenshinAvatar avatar = new GenshinAvatar(avatarID); - avatar.setLevel(level); - avatar.setPromoteLevel(ascension); - - // This will handle stats and talents - avatar.recalcStats(); - - targetPlayer.addAvatar(avatar); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid item or player ID."); - } - } - } - - @Command(label = "spawn", execution = Command.Execution.PLAYER, - usage = "spawn [level] [amount]", description = "Spawns an entity near you", permission = "server.spawn") - public static class SpawnCommand implements CommandHandler { - - @Override - public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { - CommandHandler.sendMessage(null, "Usage: spawn [amount]"); - return; - } - - try { - int entity = Integer.parseInt(args.get(0)); - int level = 1; if(args.size() > 1) level = Integer.parseInt(args.get(1)); - int amount = 1; if(args.size() > 2) amount = Integer.parseInt(args.get(2)); - - MonsterData entityData = GenshinData.getMonsterDataMap().get(entity); - if(entityData == null) { - CommandHandler.sendMessage(null, "Invalid entity id."); return; - } - - float range = (5f + (.1f * amount)); - for (int i = 0; i < amount; i++) { - Position pos = player.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); - EntityMonster monster = new EntityMonster(player.getScene(), entityData, pos, level); - player.getScene().addEntity(monster); - } - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid item or player ID."); - } - } - } - - @Command(label = "killall", - usage = "killall [playerUid] [sceneId]", description = "Kill all entities", permission = "server.killall") - public static class KillAllCommand implements CommandHandler { - - @Override - public void execute(GenshinPlayer player, List args) { - GenshinScene scene = player.getScene(); - scene.getEntities().values().stream() - .filter(entity -> entity instanceof EntityMonster) - .forEach(entity -> scene.killEntity(entity, 0)); - CommandHandler.sendMessage(null, "Killing all monsters in scene " + scene.getId()); - } - - @Override - public void execute(List args) { - if(args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: killall [playerUid] [sceneId]"); return; - } - - try { - int playerUid = Integer.parseInt(args.get(0)); - int sceneId = Integer.parseInt(args.get(1)); - - GenshinPlayer player = Grasscutter.getGameServer().getPlayerByUid(playerUid); - if (player == null) { - CommandHandler.sendMessage(null, "Player not found or offline."); - return; - } - - GenshinScene scene = player.getWorld().getSceneById(sceneId); - if (scene == null) { - CommandHandler.sendMessage(null, "Scene not found in player world"); - return; - } - - scene.getEntities().values().stream() - .filter(entity -> entity instanceof EntityMonster) - .forEach(entity -> scene.killEntity(entity, 0)); - CommandHandler.sendMessage(null, "Killing all monsters in scene " + scene.getId()); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid arguments."); - } - } - } - - @Command(label = "resetconst", aliases = {"resetconstellation"}, - usage = "resetconst [all]", execution = Command.Execution.PLAYER, permission = "player.resetconstellation", - description = "Resets the constellation level on your current active character, will need to relog after using the command to see any changes.") - public static class ResetConstellationCommand implements CommandHandler { - - @Override - public void execute(GenshinPlayer player, List args) { - if(args.size() > 0 && args.get(0).equalsIgnoreCase("all")) { - player.getAvatars().forEach(this::resetConstellation); - player.dropMessage("Reset all avatars' constellations."); - } else { - EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); - if(entity == null) - return; - - GenshinAvatar avatar = entity.getAvatar(); - this.resetConstellation(avatar); - - player.dropMessage("Constellations for " + avatar.getAvatarData().getName() + " have been reset. Please relog to see changes."); - } - } - - private void resetConstellation(GenshinAvatar avatar) { - avatar.getTalentIdList().clear(); - avatar.setCoreProudSkillLevel(0); - avatar.recalcStats(); - avatar.save(); - } - } - - @Command(label = "godmode", - usage = "godmode", execution = Command.Execution.PLAYER, description = "Prevents you from taking damage", permission = "player.godmode") - public static class GodModeCommand implements CommandHandler { - - @Override - public void execute(GenshinPlayer player, List args) { - player.setGodmode(!player.inGodmode()); - player.dropMessage("Godmode is now " + (player.inGodmode() ? "enabled" : "disabled") + "."); - } - } - - @Command(label = "sethealth", aliases = {"sethp"}, - usage = "sethealth ", execution = Command.Execution.PLAYER, description = "Sets your health to the specified value", - permission = "player.sethealth") - public static class SetHealthCommand implements CommandHandler { - - @Override - public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { - CommandHandler.sendMessage(null, "Usage: sethealth "); return; - } - - try { - int health = Integer.parseInt(args.get(0)); - EntityAvatar entity = player.getTeamManager().getCurrentAvatarEntity(); - if(entity == null) - return; - - entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); - player.dropMessage("Health set to " + health + "."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid health value."); - } - } - } - - @Command(label = "setworldlevel", aliases = {"setworldlvl"}, usage = "setworldlevel ", - description = "Sets your world level (Relog to see proper effects)", permission = "player.setworldlevel", - execution = Command.Execution.PLAYER) - public static class SetWorldLevelCommand implements CommandHandler { - @Override - public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { - CommandHandler.sendMessage(player, "Usage: setworldlevel "); return; - } - - try { - int level = Integer.parseInt(args.get(0)); - - // Set in both world and player props - player.getWorld().setWorldLevel(level); - player.setProperty(PlayerProperty.PROP_PLAYER_WORLD_LEVEL, level); - - player.dropMessage("World level set to " + level + "."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid world level."); - } - } - } - - @Command(label = "clearartifacts", aliases = {"clearart"}, - usage = "clearartifacts", execution = Command.Execution.PLAYER, permission = "player.clearartifacts", - description = "Deletes all unequipped and unlocked level 0 artifacts, including yellow rarity ones from your inventory") - public static class ClearArtifactsCommand implements CommandHandler { - @Override - public void execute(GenshinPlayer player, List args) { - Inventory playerInventory = player.getInventory(); - playerInventory.getItems().values().stream() - .filter(item -> item.getItemType() == ItemType.ITEM_RELIQUARY) - .filter(item -> item.getLevel() == 1 && item.getExp() == 0) - .filter(item -> !item.isLocked() && !item.isEquipped()) - .forEach(item -> playerInventory.removeItem(item, item.getCount())); - } - } - - @Command(label = "changescene", aliases = {"scene"}, - usage = "changescene ", description = "Changes your scene", permission = "player.changescene", execution = Command.Execution.PLAYER) - public static class ChangeSceneCommand implements CommandHandler { - @Override - public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { - CommandHandler.sendMessage(player, "Usage: changescene "); return; - } - - try { - int sceneId = Integer.parseInt(args.get(0)); - boolean result = player.getWorld().transferPlayerToScene(player, sceneId, player.getPos()); - - if (!result) { - CommandHandler.sendMessage(null, "Scene does not exist or you are already in it"); - } - } catch (Exception e) { - CommandHandler.sendMessage(player, "Usage: changescene "); return; - } - } - } - - @Command(label = "sendservermessage", aliases = {"sendservmsg"}, - usage = "sendservermessage ", description = "Sends a message to a player as the server", - execution = Command.Execution.PLAYER, permission = "server.sendmessage") - public static class SendServerMessageCommand implements CommandHandler { - @Override - public void execute(GenshinPlayer player, List args) { - if(args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: sendmessage "); return; - } - - try { - int target = Integer.parseInt(args.get(0)); - String message = String.join(" ", args.subList(1, args.size())); - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if(targetPlayer == null) { - CommandHandler.sendMessage(null, "Player not found."); return; - } - - targetPlayer.dropMessage(message); - CommandHandler.sendMessage(null, "Message sent."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid player ID."); - } - } - } -} diff --git a/src/main/java/emu/grasscutter/commands/ServerCommands.java b/src/main/java/emu/grasscutter/commands/ServerCommands.java deleted file mode 100644 index edeac6ca3..000000000 --- a/src/main/java/emu/grasscutter/commands/ServerCommands.java +++ /dev/null @@ -1,333 +0,0 @@ -package emu.grasscutter.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.database.DatabaseHelper; -import emu.grasscutter.game.Account; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.*; - -/** - * A container for server-related commands. - */ -public final class ServerCommands { - @Command(label = "reload", usage = "reload", description = "Reload server config", permission = "server.reload") - public static class ReloadCommand implements CommandHandler { - - @Override - public void execute(List args) { - Grasscutter.getLogger().info("Reloading config."); - Grasscutter.loadConfig(); - Grasscutter.getDispatchServer().loadQueries(); - Grasscutter.getLogger().info("Reload complete."); - } - - @Override - public void execute(GenshinPlayer player, List args) { - CommandHandler.sendMessage(player, "Reloading config."); - this.execute(args); - CommandHandler.sendMessage(player, "Reload complete."); - } - } - - @Command(label = "kick", usage = "kick ", description = "Kicks the specified player from the server (WIP)", permission = "server.kick") - public static class KickCommand implements CommandHandler { - @Override - public void execute(List args) { - this.execute(null, args); - } - - @Override - public void execute(GenshinPlayer player, List args) { - int target = Integer.parseInt(args.get(0)); - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if(targetPlayer == null) { - CommandHandler.sendMessage(player, "Player not found."); - return; - } - - if(player != null) { - CommandHandler.sendMessage(null, String.format("Player [%s:%s] has kicked player [%s:%s]", player.getAccount().getPlayerId(), player.getAccount().getUsername(), target, targetPlayer.getAccount().getUsername())); - } - CommandHandler.sendMessage(player, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); - - targetPlayer.getSession().close(); - } - } - - @Command(label = "stop", usage = "stop", description = "Stops the server", permission = "server.stop") - public static class StopCommand implements CommandHandler { - @Override - public void execute(List args) { - Grasscutter.getLogger().info("Server shutting down..."); - for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { - p.dropMessage("Server shutting down..."); - } - - System.exit(1); - } - } - - @Command(label = "broadcast", aliases = {"b"}, - usage = "broadcast ", description = "Sends a message to all the players", permission = "server.broadcast") - public static class BroadcastCommand implements CommandHandler { - @Override - public void execute(List args) { - if(args.size() < 1) { - CommandHandler.sendMessage(null, "Usage: broadcast "); return; - } - - String message = String.join(" ", args.subList(0, args.size())); - - for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { - p.dropMessage(message); - } - - CommandHandler.sendMessage(null, "Message sent."); - } - - @Override - public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { - CommandHandler.sendMessage(player, "Usage: broadcast "); return; - } - - String message = String.join(" ", args.subList(0, args.size())); - - for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { - p.dropMessage(message); - } - - CommandHandler.sendMessage(player, "Message sent."); - } - } - - @Command(label = "sendmessage", aliases = {"sendmsg", "msg"}, - usage = "sendmessage ", description = "Sends a message to a player") - public static class SendMessageCommand implements CommandHandler { - - @Override - public void execute(List args) { - if(args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: sendmessage "); return; - } - - try { - int target = Integer.parseInt(args.get(0)); - String message = String.join(" ", args.subList(1, args.size())); - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - - if(targetPlayer == null) { - CommandHandler.sendMessage(null, "Player not found."); return; - } - - targetPlayer.dropMessage(message); - CommandHandler.sendMessage(null, "Message sent."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid player ID."); - } - } - - @Override - public void execute(GenshinPlayer player, List args) { - if(args.size() < 2) { - CommandHandler.sendMessage(player, "Usage: sendmessage "); return; - } - - try { - int target = Integer.parseInt(args.get(0)); - String message = String.join(" ", args.subList(1, args.size())); - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - - if(targetPlayer == null) { - CommandHandler.sendMessage(player, "Player not found."); return; - } - - targetPlayer.sendMessage(player, message); - CommandHandler.sendMessage(player, "Message sent."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(player, "Invalid player ID."); - } - } - } - - @Command(label = "account", - usage = "account [uid]", - description = "Modify user accounts", execution = Command.Execution.CONSOLE) - public static class AccountCommand implements CommandHandler { - - @Override - public void execute(List args) { - if(args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: account [uid]"); return; - } - - String action = args.get(0); - String username = args.get(1); - - switch(action) { - default: - CommandHandler.sendMessage(null, "Usage: account [uid]"); - return; - case "create": - int uid = 0; - if(args.size() > 2) { - try { - uid = Integer.parseInt(args.get(2)); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid UID."); return; - } - } - - Account account = DatabaseHelper.createAccountWithId(username, uid); - if(account == null) { - CommandHandler.sendMessage(null, "Account already exists."); return; - } else { - CommandHandler.sendMessage(null, "Account created with UID " + account.getPlayerId() + "."); - account.addPermission("*"); // Grant the player superuser permissions. - } - return; - case "delete": - if(DatabaseHelper.deleteAccount(username)) { - CommandHandler.sendMessage(null, "Account deleted."); return; - } else CommandHandler.sendMessage(null, "Account not found."); - return; - } - } - } - - @Command(label = "permission", - usage = "permission ", - description = "Grants or removes a permission for a user", permission = "*") - public static class PermissionCommand implements CommandHandler { - - @Override - public void execute(List args) { - if(args.size() < 3) { - CommandHandler.sendMessage(null, "Usage: permission "); return; - } - - String action = args.get(0); - String username = args.get(1); - String permission = args.get(2); - - Account account = Grasscutter.getGameServer().getAccountByName(username); - if(account == null) { - CommandHandler.sendMessage(null, "Account not found."); return; - } - - switch(action) { - default: - CommandHandler.sendMessage(null, "Usage: permission "); - break; - case "add": - if(account.addPermission(permission)) { - CommandHandler.sendMessage(null, "Permission added."); - } else CommandHandler.sendMessage(null, "They already have this permission!"); - break; - case "remove": - if(account.removePermission(permission)) { - CommandHandler.sendMessage(null, "Permission removed."); - } else CommandHandler.sendMessage(null, "They don't have this permission!"); - break; - } - - account.save(); - } - } - - @Command(label = "help", - usage = "help [command]", description = "Sends the help message or shows information about a specified command") - public static class HelpCommand implements CommandHandler { - - @Override - public void execute(List args) { - this.execute(null, args); - } - - @Override - public void execute(GenshinPlayer player, List args) { - if(args.size() < 1) { - HashMap handlers = CommandMap.getInstance().getHandlers(); - List annotations = new ArrayList<>(); - for(String key : handlers.keySet()) { - Command annotation = handlers.get(key).getClass().getAnnotation(Command.class); - - if(!Arrays.asList(annotation.aliases()).contains(key)) { - if(player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) continue; - annotations.add(annotation); - } - } - - - SendAllHelpMessage(player, annotations); - } else { - String command = args.get(0); - CommandHandler handler = CommandMap.getInstance().getHandler(command); - StringBuilder builder = new StringBuilder(player == null ? "\nHelp - " : "Help - ").append(command).append(": \n"); - if(handler == null) { - builder.append("No command found."); - } else { - Command annotation = handler.getClass().getAnnotation(Command.class); - - builder.append(" ").append(annotation.description()).append("\n"); - builder.append(" Usage: ").append(annotation.usage()); - if(annotation.aliases().length >= 1) { - builder.append("\n").append(" Aliases: "); - for (String alias : annotation.aliases()) { - builder.append(alias).append(" "); - } - } - if(player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) { - builder.append("\n Warning: You do not have permission to run this command."); - } - } - - CommandHandler.sendMessage(player, builder.toString()); - } - } - - void SendAllHelpMessage(GenshinPlayer player, List annotations) { - if(player == null) { - StringBuilder builder = new StringBuilder("\nAvailable commands:\n"); - annotations.forEach(annotation -> { - if (annotation.execution() != Command.Execution.PLAYER) { - builder.append(annotation.label()).append("\n"); - builder.append(" ").append(annotation.description()).append("\n"); - builder.append(" Usage: ").append(annotation.usage()); - if (annotation.aliases().length >= 1) { - builder.append("\n").append(" Aliases: "); - for (String alias : annotation.aliases()) { - builder.append(alias).append(" "); - } - } - - builder.append("\n"); - } - }); - - CommandHandler.sendMessage(null, builder.toString()); - } else { - CommandHandler.sendMessage(player, "Available commands:"); - annotations.forEach(annotation -> { - if (annotation.execution() != Command.Execution.CONSOLE) { - StringBuilder builder = new StringBuilder(annotation.label()).append("\n"); - builder.append(" ").append(annotation.description()).append("\n"); - builder.append(" Usage: ").append(annotation.usage()); - if (annotation.aliases().length >= 1) { - builder.append("\n").append(" Aliases: "); - for (String alias : annotation.aliases()) { - builder.append(alias).append(" "); - } - } - - CommandHandler.sendMessage(player, builder.toString()); - } - }); - } - } - } -} diff --git a/src/main/java/emu/grasscutter/game/managers/ChatManager.java b/src/main/java/emu/grasscutter/game/managers/ChatManager.java index 40b1a55b5..d9867e875 100644 --- a/src/main/java/emu/grasscutter/game/managers/ChatManager.java +++ b/src/main/java/emu/grasscutter/game/managers/ChatManager.java @@ -1,6 +1,6 @@ package emu.grasscutter.game.managers; -import emu.grasscutter.commands.CommandMap; +import emu.grasscutter.command.CommandMap; import emu.grasscutter.game.GenshinPlayer; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.server.game.GameServer; diff --git a/src/main/java/emu/grasscutter/server/game/GameServer.java b/src/main/java/emu/grasscutter/server/game/GameServer.java index b42ced55c..fce6823fc 100644 --- a/src/main/java/emu/grasscutter/server/game/GameServer.java +++ b/src/main/java/emu/grasscutter/server/game/GameServer.java @@ -6,7 +6,7 @@ import java.util.concurrent.ConcurrentHashMap; import emu.grasscutter.GenshinConstants; import emu.grasscutter.Grasscutter; -import emu.grasscutter.commands.CommandMap; +import emu.grasscutter.command.CommandMap; import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.game.Account; import emu.grasscutter.game.GenshinPlayer; From 87c7fba2d29134b96d108c82a86978f515d5bc0b Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 20:56:22 +0800 Subject: [PATCH 043/119] Save account to database Signed-off-by: Jaida Wu --- src/main/java/emu/grasscutter/command/CommandMap.java | 2 +- src/main/java/emu/grasscutter/command/commands/Account.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/command/CommandMap.java b/src/main/java/emu/grasscutter/command/CommandMap.java index d61e46833..abc61ea30 100644 --- a/src/main/java/emu/grasscutter/command/CommandMap.java +++ b/src/main/java/emu/grasscutter/command/CommandMap.java @@ -129,7 +129,7 @@ public final class CommandMap { if (player != null) { String permissionNode = this.annotations.get(label).permission(); Account account = player.getAccount(); - if (!Objects.equals(permissionNode, "") && !account.hasPermission(permissionNode)) { + if (!permissionNode.equals("") && !account.hasPermission(permissionNode)) { CommandHandler.sendMessage(player, "You do not have permission to run this command."); return; } diff --git a/src/main/java/emu/grasscutter/command/commands/Account.java b/src/main/java/emu/grasscutter/command/commands/Account.java index 4d4a80db4..be93a7a0c 100644 --- a/src/main/java/emu/grasscutter/command/commands/Account.java +++ b/src/main/java/emu/grasscutter/command/commands/Account.java @@ -48,6 +48,7 @@ public class Account implements CommandHandler { } 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": From f898795c11a8649b7d6fc9cd8da9eb34f0bad87f Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 20:58:57 +0800 Subject: [PATCH 044/119] Add pos command Signed-off-by: Jaida Wu --- .../emu/grasscutter/command/commands/Pos.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/emu/grasscutter/command/commands/Pos.java diff --git a/src/main/java/emu/grasscutter/command/commands/Pos.java b/src/main/java/emu/grasscutter/command/commands/Pos.java new file mode 100644 index 000000000..e77eae1ff --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Pos.java @@ -0,0 +1,22 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "pos", + usage = "Usage: pos", description = "Get coordinates.") +public class Pos implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + sender.dropMessage(String.format("Coord: %.3f, %.3f, %.3f", sender.getPos().getX(), sender.getPos().getY(), sender.getPos().getZ())); + } +} From 0dabb4c7c230c7044e708e2eed16d04ad5844ac2 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 21:03:30 +0800 Subject: [PATCH 045/119] Add weather command Signed-off-by: Jaida Wu --- .../grasscutter/command/commands/Weather.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/emu/grasscutter/command/commands/Weather.java diff --git a/src/main/java/emu/grasscutter/command/commands/Weather.java b/src/main/java/emu/grasscutter/command/commands/Weather.java new file mode 100644 index 000000000..569080820 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Weather.java @@ -0,0 +1,39 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.props.ClimateType; +import emu.grasscutter.server.packet.send.PacketSceneAreaWeatherNotify; + +import java.util.List; + +@Command(label = "weather", usage = "weather ", + description = "Changes the weather.", aliases = {"w"}, permission = "player.weather") +public class Weather implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: weather "); + return; + } + + try { + int weatherId = Integer.parseInt(args.get(0)); + + ClimateType climate = ClimateType.getTypeByValue(weatherId); + + sender.getScene().setClimate(climate); + sender.getScene().broadcastPacket(new PacketSceneAreaWeatherNotify(sender)); + CommandHandler.sendMessage(sender, "Changed weather to " + weatherId); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid weather ID."); + } + } +} From 44d0adea8983e957e2a6f08ca141dff576654cb2 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 21:04:09 +0800 Subject: [PATCH 046/119] Correct pos usage Signed-off-by: Jaida Wu --- src/main/java/emu/grasscutter/command/commands/Pos.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/Pos.java b/src/main/java/emu/grasscutter/command/commands/Pos.java index e77eae1ff..5ce495a8b 100644 --- a/src/main/java/emu/grasscutter/command/commands/Pos.java +++ b/src/main/java/emu/grasscutter/command/commands/Pos.java @@ -6,8 +6,8 @@ import emu.grasscutter.game.GenshinPlayer; import java.util.List; -@Command(label = "pos", - usage = "Usage: pos", description = "Get coordinates.") +@Command(label = "pos", usage = "pos", + description = "Get coordinates.") public class Pos implements CommandHandler { @Override From 343acc8c6f1fe2a8c16cdd7ad0d6dacec1569996 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 21:06:59 +0800 Subject: [PATCH 047/119] Add restart command Signed-off-by: Jaida Wu --- .../grasscutter/command/commands/Restart.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/emu/grasscutter/command/commands/Restart.java diff --git a/src/main/java/emu/grasscutter/command/commands/Restart.java b/src/main/java/emu/grasscutter/command/commands/Restart.java new file mode 100644 index 000000000..3457dc6c6 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Restart.java @@ -0,0 +1,16 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "restart", usage = "restart - Restarts the current session") +public class Restart implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + sender.getSession().close(); + } +} From 11ca0cd7359c545495074a504d567afbeaf41867 Mon Sep 17 00:00:00 2001 From: iTruth Date: Wed, 20 Apr 2022 21:14:18 +0800 Subject: [PATCH 048/119] Fix playerOpt is always throw an exception when it's null --- src/main/java/emu/grasscutter/server/game/GameServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/server/game/GameServer.java b/src/main/java/emu/grasscutter/server/game/GameServer.java index b42ced55c..b99063cb6 100644 --- a/src/main/java/emu/grasscutter/server/game/GameServer.java +++ b/src/main/java/emu/grasscutter/server/game/GameServer.java @@ -145,7 +145,7 @@ public final class GameServer extends MihoyoKcpServer { public Account getAccountByName(String username) { Optional playerOpt = getPlayers().values().stream().filter(player -> player.getAccount().getUsername().equals(username)).findFirst(); - if (playerOpt.get() != null) { + if (playerOpt.isPresent()) { return playerOpt.get().getAccount(); } return DatabaseHelper.getAccountByName(username); From 726f03e510e6d6cf80c92c74cd698c2d649518d7 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 21:15:37 +0800 Subject: [PATCH 049/119] Add setstats command Signed-off-by: Jaida Wu --- .../command/commands/SetHealth.java | 42 ------ .../command/commands/SetStats.java | 120 ++++++++++++++++++ 2 files changed, 120 insertions(+), 42 deletions(-) delete mode 100644 src/main/java/emu/grasscutter/command/commands/SetHealth.java create mode 100644 src/main/java/emu/grasscutter/command/commands/SetStats.java diff --git a/src/main/java/emu/grasscutter/command/commands/SetHealth.java b/src/main/java/emu/grasscutter/command/commands/SetHealth.java deleted file mode 100644 index 2daf792ef..000000000 --- a/src/main/java/emu/grasscutter/command/commands/SetHealth.java +++ /dev/null @@ -1,42 +0,0 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.entity.EntityAvatar; -import emu.grasscutter.game.props.FightProperty; -import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; - -import java.util.List; - -@Command(label = "sethealth", usage = "sethealth ", - description = "Sets your health to the specified value", aliases = {"sethp"}, permission = "player.sethealth") -public class SetHealth implements CommandHandler { - - @Override - public void onCommand(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; // TODO: set player's health from console or other players - } - - if (args.size() < 1) { - CommandHandler.sendMessage(null, "Usage: sethealth "); - return; - } - - try { - int health = Integer.parseInt(args.get(0)); - EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); - if (entity == null) { - return; - } - - entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); - sender.dropMessage("Health set to " + health + "."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid health value."); - } - } -} diff --git a/src/main/java/emu/grasscutter/command/commands/SetStats.java b/src/main/java/emu/grasscutter/command/commands/SetStats.java new file mode 100644 index 000000000..64f594ded --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/SetStats.java @@ -0,0 +1,120 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.entity.EntityAvatar; +import emu.grasscutter.game.props.FightProperty; +import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; + +import java.util.List; + +@Command(label = "setstats", usage = "setstats ", + aliases = {"stats"}) +public class SetStats implements CommandHandler { + + @Override + public void onCommand(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + String stat = args.get(0); + switch (stat) { + default: + CommandHandler.sendMessage(sender, "Usage: setstats|stats "); + return; + case "hp": + try { + int health = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); + CommandHandler.sendMessage(sender, "HP set to " + health + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid HP value."); + return; + } + break; + case "def": + try { + int def = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_DEFENSE, def); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_DEFENSE)); + CommandHandler.sendMessage(sender, "DEF set to " + def + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid DEF value."); + return; + } + break; + case "atk": + try { + int atk = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_ATTACK, atk); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_ATTACK)); + CommandHandler.sendMessage(sender, "ATK set to " + atk + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid ATK value."); + return; + } + break; + case "em": + try { + int em = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_ELEMENT_MASTERY, em); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_ELEMENT_MASTERY)); + CommandHandler.sendMessage(sender, "Elemental Mastery set to " + em + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid EM value."); + return; + } + break; + case "er": + try { + float er = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float erecharge = er / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY, erecharge); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY)); + float iger = erecharge * 100; + CommandHandler.sendMessage(sender, "Energy recharge set to " + iger + "%."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid ER value."); + return; + } + break; + case "crate": + try { + float cr = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float crate = cr / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_CRITICAL, crate); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CRITICAL)); + float igcrate = crate * 100; + CommandHandler.sendMessage(sender, "Crit Rate set to " + igcrate + "%."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Crit Rate value."); + return; + } + break; + case "cdmg": + try { + float cdmg = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float cdamage = cdmg / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_CRITICAL_HURT, cdamage); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CRITICAL_HURT)); + float igcdmg = cdamage * 100; + CommandHandler.sendMessage(sender, "Crit DMG set to " + igcdmg + "%"); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Crit DMG value."); + return; + } + break; + } + } +} From dee3afcaf88ca2351d9b328ab16d6bdbc833bdc4 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Wed, 20 Apr 2022 03:28:54 -0700 Subject: [PATCH 050/119] Fix account not found issue when logging in --- .../server/dispatch/DispatchServer.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index dab6ba0a4..f13b9dc2f 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -226,18 +226,22 @@ public final class DispatchServer { Account account = DatabaseHelper.getAccountByName(requestData.account); // Check if account exists, else create a new one. - if (account == null && 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 if (!Grasscutter.getConfig().ServerOptions.AutomaticallyCreateAccounts) { - responseData.retcode = -201; - responseData.message = "Username not found."; + if (account == null) { + // 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(); From 26c0fc3e7b1a4bf008919df49baa5483729c9ef7 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Thu, 21 Apr 2022 00:28:14 +0800 Subject: [PATCH 051/119] Reload command now reloads gacha config (again) --- src/main/java/emu/grasscutter/command/commands/Reload.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/emu/grasscutter/command/commands/Reload.java b/src/main/java/emu/grasscutter/command/commands/Reload.java index 21bf63e52..cf2bae2b1 100644 --- a/src/main/java/emu/grasscutter/command/commands/Reload.java +++ b/src/main/java/emu/grasscutter/command/commands/Reload.java @@ -15,6 +15,7 @@ public class Reload implements CommandHandler { public void execute(GenshinPlayer sender, List args) { CommandHandler.sendMessage(sender, "Reloading config."); Grasscutter.loadConfig(); + Grasscutter.getGameServer().getGachaManager().load(); Grasscutter.getDispatchServer().loadQueries(); CommandHandler.sendMessage(sender, "Reload complete."); } From 49475a92ddf1a23d482634da2f8fab7cac49515f Mon Sep 17 00:00:00 2001 From: alt3ri <95161279+alt3ri@users.noreply.github.com> Date: Thu, 21 Apr 2022 03:43:57 +0700 Subject: [PATCH 052/119] Adding Elemental DMG Bonus Added Elemental DMG Bonus command. > /stats --- .../command/commands/SetStats.java | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/src/main/java/emu/grasscutter/command/commands/SetStats.java b/src/main/java/emu/grasscutter/command/commands/SetStats.java index f8cac4bf4..ddc8b3aab 100644 --- a/src/main/java/emu/grasscutter/command/commands/SetStats.java +++ b/src/main/java/emu/grasscutter/command/commands/SetStats.java @@ -115,6 +115,119 @@ public class SetStats implements CommandHandler { return; } break; + case "epyro": + try { + float epyro = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float pyro = epyro / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_FIRE_ADD_HURT, pyro); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_FIRE_ADD_HURT)); + float igpyro = pyro * 100; + CommandHandler.sendMessage(sender, "Pyro DMG Bonus set to " + igpyro + "%"); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Pyro DMG Bonus value."); + return; + } + break; + case "ecryo": + try { + float ecryo = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float cryo = ecryo / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_ICE_ADD_HURT, cryo); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_ICE_ADD_HURT)); + float igcyro = cryo * 100; + CommandHandler.sendMessage(sender, "Cyro DMG Bonus set to " + igcyro + "%"); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Cryo DMG Bonus value."); + return; + } + break; + case "ehydro": + try { + float ehydro = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float hydro = ehydro / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_WATER_ADD_HURT, hydro); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_WATER_ADD_HURT)); + float ighydro = hydro * 100; + CommandHandler.sendMessage(sender, "Hydro DMG Bonus set to " + ighydro + "%"); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Hydro DMG Bonus value."); + return; + } + break; + case "eanemo": + try { + float eanemo = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float anemo = eanemo / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_WIND_ADD_HURT, anemo); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_WIND_ADD_HURT)); + float iganemo = anemo * 100; + CommandHandler.sendMessage(sender, "Anemo DMG Bonus set to " + iganemo + "%"); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Anemo DMG Bonus value."); + return; + } + break; + case "egeo": + try { + float egeo = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float geo = egeo / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_ROCK_ADD_HURT, geo); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_ROCK_ADD_HURT)); + float iggeo = geo * 100; + CommandHandler.sendMessage(sender, "Geo DMG Bonus set to " + iggeo + "%"); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Geo DMG Bonus value."); + return; + } + break; + case "ethunder": + case "eelec": + try { + float eelec = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float elec = eelec / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_CRITICAL_HURT, elec); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CRITICAL_HURT)); + float igelec = elec * 100; + CommandHandler.sendMessage(sender, "Electro DMG Bonus set to " + igelec + "%"); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Electro DMG Bonus value."); + return; + } + break; + case "ephys": + try { + float ephys = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float phys = ephys / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_PHYSICAL_ADD_HURT, phys); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_PHYSICAL_ADD_HURT)); + float igphys = phys * 100; + CommandHandler.sendMessage(sender, "Physical DMG Bonus set to " + igphys + "%"); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Physical DMG Bonus value."); + return; + } + break; + case "edend": + try { + float edend = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float dend = edend / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_GRASS_ADD_HURT, dend); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_GRASS_ADD_HURT)); + float igdend = dend * 100; + CommandHandler.sendMessage(sender, "Dendro DMG Bonus set to " + igdend + "%"); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Dendro DMG Bonus value."); + return; + } + break; } } } From eb6bb1da07e5c142a1a995be2040ee51212530fc Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Thu, 21 Apr 2022 04:45:38 +0800 Subject: [PATCH 053/119] teleports --- .../emu/grasscutter/data/GenshinData.java | 6 + .../emu/grasscutter/data/ResourceLoader.java | 44 + .../grasscutter/data/common/PointData.java | 43 + .../data/common/ScenePointConfig.java | 15 + .../data/custom/ScenePointEntry.java | 21 + src/main/java/emu/grasscutter/game/World.java | 19 + .../proto/SceneTransToPointReqOuterClass.java | 750 ++++++++++++++++++ .../proto/SceneTransToPointRspOuterClass.java | 750 ++++++++++++++++++ .../recv/HandlerSceneTransToPointReq.java | 18 + .../send/PacketSceneTransToPointRsp.java | 35 + 10 files changed, 1701 insertions(+) create mode 100644 src/main/java/emu/grasscutter/data/common/PointData.java create mode 100644 src/main/java/emu/grasscutter/data/common/ScenePointConfig.java create mode 100644 src/main/java/emu/grasscutter/data/custom/ScenePointEntry.java create mode 100644 src/main/java/emu/grasscutter/net/proto/SceneTransToPointReqOuterClass.java create mode 100644 src/main/java/emu/grasscutter/net/proto/SceneTransToPointRspOuterClass.java create mode 100644 src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketSceneTransToPointRsp.java diff --git a/src/main/java/emu/grasscutter/data/GenshinData.java b/src/main/java/emu/grasscutter/data/GenshinData.java index bb2709108..7dc5a5f7c 100644 --- a/src/main/java/emu/grasscutter/data/GenshinData.java +++ b/src/main/java/emu/grasscutter/data/GenshinData.java @@ -8,6 +8,7 @@ import emu.grasscutter.Grasscutter; import emu.grasscutter.utils.Utils; import emu.grasscutter.data.custom.AbilityEmbryoEntry; import emu.grasscutter.data.custom.OpenConfigEntry; +import emu.grasscutter.data.custom.ScenePointEntry; import emu.grasscutter.data.def.*; import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -18,6 +19,7 @@ public class GenshinData { private static final Int2ObjectMap abilityHashes = new Int2ObjectOpenHashMap<>(); private static final Map abilityEmbryos = new HashMap<>(); private static final Map openConfigEntries = new HashMap<>(); + private static final Map scenePointEntries = new HashMap<>(); // ExcelConfigs private static final Int2ObjectMap playerLevelDataMap = new Int2ObjectOpenHashMap<>(); @@ -82,6 +84,10 @@ public class GenshinData { return openConfigEntries; } + public static Map getScenePointEntries() { + return scenePointEntries; + } + public static Int2ObjectMap getAvatarDataMap() { return avatarDataMap; } diff --git a/src/main/java/emu/grasscutter/data/ResourceLoader.java b/src/main/java/emu/grasscutter/data/ResourceLoader.java index f50067c65..e597257ce 100644 --- a/src/main/java/emu/grasscutter/data/ResourceLoader.java +++ b/src/main/java/emu/grasscutter/data/ResourceLoader.java @@ -10,11 +10,15 @@ import java.util.regex.Pattern; import emu.grasscutter.utils.Utils; import org.reflections.Reflections; +import com.google.gson.JsonElement; import com.google.gson.reflect.TypeToken; import emu.grasscutter.Grasscutter; +import emu.grasscutter.data.common.PointData; +import emu.grasscutter.data.common.ScenePointConfig; import emu.grasscutter.data.custom.AbilityEmbryoEntry; import emu.grasscutter.data.custom.OpenConfigEntry; +import emu.grasscutter.data.custom.ScenePointEntry; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; public class ResourceLoader { @@ -42,6 +46,7 @@ public class ResourceLoader { loadOpenConfig(); // Load resources loadResources(); + loadScenePoints(); // Process into depots GenshinDepot.load(); // Custom - TODO move this somewhere else @@ -121,6 +126,45 @@ public class ResourceLoader { } } + private static void loadScenePoints() { + Pattern pattern = Pattern.compile("(?<=scene)(.*?)(?=_point.json)"); + File folder = new File(Grasscutter.getConfig().RESOURCE_FOLDER + "BinOutPut/Scene/Point"); + List scenePointList = new ArrayList<>(); + for (File file : folder.listFiles()) { + ScenePointConfig config = null; + Integer sceneId = null; + + Matcher matcher = pattern.matcher(file.getName()); + if (matcher.find()) { + sceneId = Integer.parseInt(matcher.group(1)); + } else { + continue; + } + + try (FileReader fileReader = new FileReader(file)) { + config = Grasscutter.getGsonFactory().fromJson(fileReader, ScenePointConfig.class); + } catch (Exception e) { + e.printStackTrace(); + continue; + } + + if (config.points == null) { + continue; + } + + for (Map.Entry entry : config.points.entrySet()) { + PointData pointData = Grasscutter.getGsonFactory().fromJson(entry.getValue(), PointData.class); + + ScenePointEntry sl = new ScenePointEntry(sceneId + "_" + entry.getKey(), pointData); + scenePointList.add(sl); + } + + for (ScenePointEntry entry : scenePointList) { + GenshinData.getScenePointEntries().put(entry.getName(), entry); + } + } + } + private static void loadAbilityEmbryos() { // Read from cached file if exists File embryoCache = new File(Grasscutter.getConfig().DATA_FOLDER + "AbilityEmbryos.json"); diff --git a/src/main/java/emu/grasscutter/data/common/PointData.java b/src/main/java/emu/grasscutter/data/common/PointData.java new file mode 100644 index 000000000..7c31d2f06 --- /dev/null +++ b/src/main/java/emu/grasscutter/data/common/PointData.java @@ -0,0 +1,43 @@ +package emu.grasscutter.data.common; + +public class PointData { + private pos tranPos; + + public pos getTranPos() { + return tranPos; + } + + public void setTranPos(pos tranPos) { + this.tranPos = tranPos; + } + + public class pos { + private float x; + private float y; + private float z; + + public float getX() { + return x; + } + + public void setX(float x) { + this.x = x; + } + + public float getY() { + return y; + } + + public void setY(float y) { + this.y = y; + } + + public float getZ() { + return z; + } + + public void setZ(float z) { + this.z = z; + } + } +} diff --git a/src/main/java/emu/grasscutter/data/common/ScenePointConfig.java b/src/main/java/emu/grasscutter/data/common/ScenePointConfig.java new file mode 100644 index 000000000..340f7476f --- /dev/null +++ b/src/main/java/emu/grasscutter/data/common/ScenePointConfig.java @@ -0,0 +1,15 @@ +package emu.grasscutter.data.common; + +import com.google.gson.JsonObject; + +public class ScenePointConfig { + public JsonObject points; + + public JsonObject getPoints() { + return points; + } + + public void setPoints(JsonObject Points) { + points = Points; + } +} diff --git a/src/main/java/emu/grasscutter/data/custom/ScenePointEntry.java b/src/main/java/emu/grasscutter/data/custom/ScenePointEntry.java new file mode 100644 index 000000000..3e904f5c8 --- /dev/null +++ b/src/main/java/emu/grasscutter/data/custom/ScenePointEntry.java @@ -0,0 +1,21 @@ +package emu.grasscutter.data.custom; + +import emu.grasscutter.data.common.PointData; + +public class ScenePointEntry { + private String name; + private PointData pointData; + + public ScenePointEntry(String name, PointData pointData) { + this.name = name; + this.pointData = pointData; + } + + public String getName() { + return name; + } + + public PointData getPointData() { + return pointData; + } +} diff --git a/src/main/java/emu/grasscutter/game/World.java b/src/main/java/emu/grasscutter/game/World.java index 02c0df63a..4375d8e4f 100644 --- a/src/main/java/emu/grasscutter/game/World.java +++ b/src/main/java/emu/grasscutter/game/World.java @@ -206,6 +206,25 @@ public class World implements Iterable { public void deregisterScene(GenshinScene scene) { this.getScenes().remove(scene.getId()); } + + public boolean forceTransferPlayerToScene(GenshinPlayer player, int sceneId, Position pos) { + // Forces the client to reload the scene map to prevent the player from falling off the map. + if (GenshinData.getSceneDataMap().get(sceneId) == null) { + return false; + } + + if (player.getScene() != null) { + player.getScene().removePlayer(player); + } + + GenshinScene scene = this.getSceneById(sceneId); + scene.addPlayer(player); + player.getPos().set(pos); + + // Teleport packet + player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterSelf, EnterReason.TransPoint, sceneId, pos)); + return true; + } public boolean transferPlayerToScene(GenshinPlayer player, int sceneId, Position pos) { if (player.getScene().getId() == sceneId || GenshinData.getSceneDataMap().get(sceneId) == null) { diff --git a/src/main/java/emu/grasscutter/net/proto/SceneTransToPointReqOuterClass.java b/src/main/java/emu/grasscutter/net/proto/SceneTransToPointReqOuterClass.java new file mode 100644 index 000000000..e807e3b55 --- /dev/null +++ b/src/main/java/emu/grasscutter/net/proto/SceneTransToPointReqOuterClass.java @@ -0,0 +1,750 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: SceneTransToPointReq.proto + +package emu.grasscutter.net.proto; + +public final class SceneTransToPointReqOuterClass { + private SceneTransToPointReqOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface SceneTransToPointReqOrBuilder extends + // @@protoc_insertion_point(interface_extends:SceneTransToPointReq) + com.google.protobuf.MessageOrBuilder { + + /** + * uint32 sceneId = 1; + * @return The sceneId. + */ + int getSceneId(); + + /** + * uint32 pointId = 2; + * @return The pointId. + */ + int getPointId(); + } + /** + * Protobuf type {@code SceneTransToPointReq} + */ + public static final class SceneTransToPointReq extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:SceneTransToPointReq) + SceneTransToPointReqOrBuilder { + private static final long serialVersionUID = 0L; + // Use SceneTransToPointReq.newBuilder() to construct. + private SceneTransToPointReq(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private SceneTransToPointReq() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new SceneTransToPointReq(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SceneTransToPointReq( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + + sceneId_ = input.readUInt32(); + break; + } + case 16: { + + pointId_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.class, emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.Builder.class); + } + + /** + * Protobuf enum {@code SceneTransToPointReq.CmdId} + */ + public enum CmdId + implements com.google.protobuf.ProtocolMessageEnum { + /** + * NONE = 0; + */ + NONE(0, 0), + /** + * ENET_IS_RELIABLE = 1; + */ + ENET_IS_RELIABLE(2, 1), + /** + * CMD_ID = 219; + */ + CMD_ID(4, 219), + UNRECOGNIZED(-1, -1), + ; + + /** + * ENET_CHANNEL_ID = 0; + */ + public static final CmdId ENET_CHANNEL_ID = NONE; + /** + * IS_ALLOW_CLIENT = 1; + */ + public static final CmdId IS_ALLOW_CLIENT = ENET_IS_RELIABLE; + /** + * NONE = 0; + */ + public static final int NONE_VALUE = 0; + /** + * ENET_CHANNEL_ID = 0; + */ + public static final int ENET_CHANNEL_ID_VALUE = 0; + /** + * ENET_IS_RELIABLE = 1; + */ + public static final int ENET_IS_RELIABLE_VALUE = 1; + /** + * IS_ALLOW_CLIENT = 1; + */ + public static final int IS_ALLOW_CLIENT_VALUE = 1; + /** + * CMD_ID = 219; + */ + public static final int CMD_ID_VALUE = 219; + + + public final int getNumber() { + if (index == -1) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static CmdId valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static CmdId forNumber(int value) { + switch (value) { + case 0: return NONE; + case 1: return ENET_IS_RELIABLE; + case 219: return CMD_ID; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + CmdId> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public CmdId findValueByNumber(int number) { + return CmdId.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + if (index == -1) { + throw new java.lang.IllegalStateException( + "Can't get the descriptor of an unrecognized enum value."); + } + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.getDescriptor().getEnumTypes().get(0); + } + + private static final CmdId[] VALUES = getStaticValuesArray(); + private static CmdId[] getStaticValuesArray() { + return new CmdId[] { + NONE, ENET_CHANNEL_ID, ENET_IS_RELIABLE, IS_ALLOW_CLIENT, CMD_ID, + }; + } + public static CmdId valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private CmdId(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:SceneTransToPointReq.CmdId) + } + + public static final int SCENEID_FIELD_NUMBER = 1; + private int sceneId_; + /** + * uint32 sceneId = 1; + * @return The sceneId. + */ + @java.lang.Override + public int getSceneId() { + return sceneId_; + } + + public static final int POINTID_FIELD_NUMBER = 2; + private int pointId_; + /** + * uint32 pointId = 2; + * @return The pointId. + */ + @java.lang.Override + public int getPointId() { + return pointId_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (sceneId_ != 0) { + output.writeUInt32(1, sceneId_); + } + if (pointId_ != 0) { + output.writeUInt32(2, pointId_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (sceneId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, sceneId_); + } + if (pointId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, pointId_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq)) { + return super.equals(obj); + } + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq other = (emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq) obj; + + if (getSceneId() + != other.getSceneId()) return false; + if (getPointId() + != other.getPointId()) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SCENEID_FIELD_NUMBER; + hash = (53 * hash) + getSceneId(); + hash = (37 * hash) + POINTID_FIELD_NUMBER; + hash = (53 * hash) + getPointId(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code SceneTransToPointReq} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:SceneTransToPointReq) + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReqOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.class, emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.Builder.class); + } + + // Construct using emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + sceneId_ = 0; + + pointId_ = 0; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_descriptor; + } + + @java.lang.Override + public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq getDefaultInstanceForType() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.getDefaultInstance(); + } + + @java.lang.Override + public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq build() { + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq buildPartial() { + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq result = new emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq(this); + result.sceneId_ = sceneId_; + result.pointId_ = pointId_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq) { + return mergeFrom((emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq other) { + if (other == emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.getDefaultInstance()) return this; + if (other.getSceneId() != 0) { + setSceneId(other.getSceneId()); + } + if (other.getPointId() != 0) { + setPointId(other.getPointId()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int sceneId_ ; + /** + * uint32 sceneId = 1; + * @return The sceneId. + */ + @java.lang.Override + public int getSceneId() { + return sceneId_; + } + /** + * uint32 sceneId = 1; + * @param value The sceneId to set. + * @return This builder for chaining. + */ + public Builder setSceneId(int value) { + + sceneId_ = value; + onChanged(); + return this; + } + /** + * uint32 sceneId = 1; + * @return This builder for chaining. + */ + public Builder clearSceneId() { + + sceneId_ = 0; + onChanged(); + return this; + } + + private int pointId_ ; + /** + * uint32 pointId = 2; + * @return The pointId. + */ + @java.lang.Override + public int getPointId() { + return pointId_; + } + /** + * uint32 pointId = 2; + * @param value The pointId to set. + * @return This builder for chaining. + */ + public Builder setPointId(int value) { + + pointId_ = value; + onChanged(); + return this; + } + /** + * uint32 pointId = 2; + * @return This builder for chaining. + */ + public Builder clearPointId() { + + pointId_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:SceneTransToPointReq) + } + + // @@protoc_insertion_point(class_scope:SceneTransToPointReq) + private static final emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq(); + } + + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public SceneTransToPointReq parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SceneTransToPointReq(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_SceneTransToPointReq_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_SceneTransToPointReq_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\032SceneTransToPointReq.proto\"\234\001\n\024SceneTr" + + "ansToPointReq\022\017\n\007sceneId\030\001 \001(\r\022\017\n\007pointI" + + "d\030\002 \001(\r\"b\n\005CmdId\022\010\n\004NONE\020\000\022\023\n\017ENET_CHANN" + + "EL_ID\020\000\022\024\n\020ENET_IS_RELIABLE\020\001\022\023\n\017IS_ALLO" + + "W_CLIENT\020\001\022\013\n\006CMD_ID\020\333\001\032\002\020\001B\033\n\031emu.grass" + + "cutter.net.protob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_SceneTransToPointReq_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_SceneTransToPointReq_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_SceneTransToPointReq_descriptor, + new java.lang.String[] { "SceneId", "PointId", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/src/main/java/emu/grasscutter/net/proto/SceneTransToPointRspOuterClass.java b/src/main/java/emu/grasscutter/net/proto/SceneTransToPointRspOuterClass.java new file mode 100644 index 000000000..e807e3b55 --- /dev/null +++ b/src/main/java/emu/grasscutter/net/proto/SceneTransToPointRspOuterClass.java @@ -0,0 +1,750 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: SceneTransToPointReq.proto + +package emu.grasscutter.net.proto; + +public final class SceneTransToPointReqOuterClass { + private SceneTransToPointReqOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface SceneTransToPointReqOrBuilder extends + // @@protoc_insertion_point(interface_extends:SceneTransToPointReq) + com.google.protobuf.MessageOrBuilder { + + /** + * uint32 sceneId = 1; + * @return The sceneId. + */ + int getSceneId(); + + /** + * uint32 pointId = 2; + * @return The pointId. + */ + int getPointId(); + } + /** + * Protobuf type {@code SceneTransToPointReq} + */ + public static final class SceneTransToPointReq extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:SceneTransToPointReq) + SceneTransToPointReqOrBuilder { + private static final long serialVersionUID = 0L; + // Use SceneTransToPointReq.newBuilder() to construct. + private SceneTransToPointReq(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private SceneTransToPointReq() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new SceneTransToPointReq(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SceneTransToPointReq( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + + sceneId_ = input.readUInt32(); + break; + } + case 16: { + + pointId_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.class, emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.Builder.class); + } + + /** + * Protobuf enum {@code SceneTransToPointReq.CmdId} + */ + public enum CmdId + implements com.google.protobuf.ProtocolMessageEnum { + /** + * NONE = 0; + */ + NONE(0, 0), + /** + * ENET_IS_RELIABLE = 1; + */ + ENET_IS_RELIABLE(2, 1), + /** + * CMD_ID = 219; + */ + CMD_ID(4, 219), + UNRECOGNIZED(-1, -1), + ; + + /** + * ENET_CHANNEL_ID = 0; + */ + public static final CmdId ENET_CHANNEL_ID = NONE; + /** + * IS_ALLOW_CLIENT = 1; + */ + public static final CmdId IS_ALLOW_CLIENT = ENET_IS_RELIABLE; + /** + * NONE = 0; + */ + public static final int NONE_VALUE = 0; + /** + * ENET_CHANNEL_ID = 0; + */ + public static final int ENET_CHANNEL_ID_VALUE = 0; + /** + * ENET_IS_RELIABLE = 1; + */ + public static final int ENET_IS_RELIABLE_VALUE = 1; + /** + * IS_ALLOW_CLIENT = 1; + */ + public static final int IS_ALLOW_CLIENT_VALUE = 1; + /** + * CMD_ID = 219; + */ + public static final int CMD_ID_VALUE = 219; + + + public final int getNumber() { + if (index == -1) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static CmdId valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static CmdId forNumber(int value) { + switch (value) { + case 0: return NONE; + case 1: return ENET_IS_RELIABLE; + case 219: return CMD_ID; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + CmdId> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public CmdId findValueByNumber(int number) { + return CmdId.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + if (index == -1) { + throw new java.lang.IllegalStateException( + "Can't get the descriptor of an unrecognized enum value."); + } + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.getDescriptor().getEnumTypes().get(0); + } + + private static final CmdId[] VALUES = getStaticValuesArray(); + private static CmdId[] getStaticValuesArray() { + return new CmdId[] { + NONE, ENET_CHANNEL_ID, ENET_IS_RELIABLE, IS_ALLOW_CLIENT, CMD_ID, + }; + } + public static CmdId valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private CmdId(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:SceneTransToPointReq.CmdId) + } + + public static final int SCENEID_FIELD_NUMBER = 1; + private int sceneId_; + /** + * uint32 sceneId = 1; + * @return The sceneId. + */ + @java.lang.Override + public int getSceneId() { + return sceneId_; + } + + public static final int POINTID_FIELD_NUMBER = 2; + private int pointId_; + /** + * uint32 pointId = 2; + * @return The pointId. + */ + @java.lang.Override + public int getPointId() { + return pointId_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (sceneId_ != 0) { + output.writeUInt32(1, sceneId_); + } + if (pointId_ != 0) { + output.writeUInt32(2, pointId_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (sceneId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, sceneId_); + } + if (pointId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, pointId_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq)) { + return super.equals(obj); + } + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq other = (emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq) obj; + + if (getSceneId() + != other.getSceneId()) return false; + if (getPointId() + != other.getPointId()) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SCENEID_FIELD_NUMBER; + hash = (53 * hash) + getSceneId(); + hash = (37 * hash) + POINTID_FIELD_NUMBER; + hash = (53 * hash) + getPointId(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code SceneTransToPointReq} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:SceneTransToPointReq) + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReqOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.class, emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.Builder.class); + } + + // Construct using emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + sceneId_ = 0; + + pointId_ = 0; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_descriptor; + } + + @java.lang.Override + public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq getDefaultInstanceForType() { + return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.getDefaultInstance(); + } + + @java.lang.Override + public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq build() { + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq buildPartial() { + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq result = new emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq(this); + result.sceneId_ = sceneId_; + result.pointId_ = pointId_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq) { + return mergeFrom((emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq other) { + if (other == emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.getDefaultInstance()) return this; + if (other.getSceneId() != 0) { + setSceneId(other.getSceneId()); + } + if (other.getPointId() != 0) { + setPointId(other.getPointId()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int sceneId_ ; + /** + * uint32 sceneId = 1; + * @return The sceneId. + */ + @java.lang.Override + public int getSceneId() { + return sceneId_; + } + /** + * uint32 sceneId = 1; + * @param value The sceneId to set. + * @return This builder for chaining. + */ + public Builder setSceneId(int value) { + + sceneId_ = value; + onChanged(); + return this; + } + /** + * uint32 sceneId = 1; + * @return This builder for chaining. + */ + public Builder clearSceneId() { + + sceneId_ = 0; + onChanged(); + return this; + } + + private int pointId_ ; + /** + * uint32 pointId = 2; + * @return The pointId. + */ + @java.lang.Override + public int getPointId() { + return pointId_; + } + /** + * uint32 pointId = 2; + * @param value The pointId to set. + * @return This builder for chaining. + */ + public Builder setPointId(int value) { + + pointId_ = value; + onChanged(); + return this; + } + /** + * uint32 pointId = 2; + * @return This builder for chaining. + */ + public Builder clearPointId() { + + pointId_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:SceneTransToPointReq) + } + + // @@protoc_insertion_point(class_scope:SceneTransToPointReq) + private static final emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq(); + } + + public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public SceneTransToPointReq parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SceneTransToPointReq(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_SceneTransToPointReq_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_SceneTransToPointReq_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\032SceneTransToPointReq.proto\"\234\001\n\024SceneTr" + + "ansToPointReq\022\017\n\007sceneId\030\001 \001(\r\022\017\n\007pointI" + + "d\030\002 \001(\r\"b\n\005CmdId\022\010\n\004NONE\020\000\022\023\n\017ENET_CHANN" + + "EL_ID\020\000\022\024\n\020ENET_IS_RELIABLE\020\001\022\023\n\017IS_ALLO" + + "W_CLIENT\020\001\022\013\n\006CMD_ID\020\333\001\032\002\020\001B\033\n\031emu.grass" + + "cutter.net.protob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_SceneTransToPointReq_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_SceneTransToPointReq_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_SceneTransToPointReq_descriptor, + new java.lang.String[] { "SceneId", "PointId", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java new file mode 100644 index 000000000..6e38fb282 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java @@ -0,0 +1,18 @@ +package emu.grasscutter.server.packet.recv; + +import emu.grasscutter.net.packet.Opcodes; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq; +import emu.grasscutter.net.packet.PacketHandler; +import emu.grasscutter.server.game.GameSession; +import emu.grasscutter.server.packet.send.PacketSceneTransToPointRsp; + +@Opcodes(PacketOpcodes.SceneTransToPointReq) +public class HandlerSceneTransToPointReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + SceneTransToPointReq req = SceneTransToPointReq.parseFrom(payload); + } + +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTransToPointRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTransToPointRsp.java new file mode 100644 index 000000000..965c6aa6b --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTransToPointRsp.java @@ -0,0 +1,35 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.data.GenshinData; +import emu.grasscutter.data.custom.ScenePointEntry; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.net.packet.GenshinPacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp; +import emu.grasscutter.utils.Position; + +public class PacketSceneTransToPointRsp extends GenshinPacket { + + public PacketSceneTransToPointRsp(GenshinPlayer player, int pointId, int sceneId) { + super(PacketOpcodes.SceneTransToPointRsp); + + String code = sceneId + "_" + pointId; + ScenePointEntry scenePointEntry = GenshinData.getScenePointEntries().get(code); + + float x = scenePointEntry.getPointData().getTranPos().getX(); + float y = scenePointEntry.getPointData().getTranPos().getY(); + float z = scenePointEntry.getPointData().getTranPos().getZ(); + + player.getPos().set(new Position(x, y, z)); + + player.getWorld().forceTransferPlayerToScene(player, sceneId, player.getPos()); + + SceneTransToPointRsp proto = SceneTransToPointRsp.newBuilder() + .setRetcode(0) + .setPointId(pointId) + .setSceneId(sceneId) + .build(); + + this.setData(proto); + } +} From 8d4d4a32032763e5c3f036882f0f5b934f8958d5 Mon Sep 17 00:00:00 2001 From: alt3ri <95161279+alt3ri@users.noreply.github.com> Date: Thu, 21 Apr 2022 03:47:17 +0700 Subject: [PATCH 054/119] Added Elemental Bonus Usage: /stats for elemental bonus --- src/main/java/emu/grasscutter/command/commands/SetStats.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/SetStats.java b/src/main/java/emu/grasscutter/command/commands/SetStats.java index ddc8b3aab..4ddd60fc0 100644 --- a/src/main/java/emu/grasscutter/command/commands/SetStats.java +++ b/src/main/java/emu/grasscutter/command/commands/SetStats.java @@ -9,7 +9,7 @@ import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; import java.util.List; -@Command(label = "setstats", usage = "setstats ", +@Command(label = "setstats", usage = "setstats|stats ", aliases = {"stats"}) public class SetStats implements CommandHandler { @@ -23,7 +23,8 @@ public class SetStats implements CommandHandler { String stat = args.get(0); switch (stat) { default: - CommandHandler.sendMessage(sender, "Usage: setstats|stats "); + CommandHandler.sendMessage(sender, "Usage: /setstats|stats for basic stats"); + CommandHandler.sendMessage(sender, "Usage: /stats for elemental bonus"); return; case "hp": try { From d3bb4093601ef4196587e61d886f0de26ad0dc7e Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Thu, 21 Apr 2022 04:51:45 +0800 Subject: [PATCH 055/119] rsp sorry --- .../proto/SceneTransToPointRspOuterClass.java | 282 +++++++++++------- 1 file changed, 172 insertions(+), 110 deletions(-) diff --git a/src/main/java/emu/grasscutter/net/proto/SceneTransToPointRspOuterClass.java b/src/main/java/emu/grasscutter/net/proto/SceneTransToPointRspOuterClass.java index e807e3b55..353b88fe5 100644 --- a/src/main/java/emu/grasscutter/net/proto/SceneTransToPointRspOuterClass.java +++ b/src/main/java/emu/grasscutter/net/proto/SceneTransToPointRspOuterClass.java @@ -1,10 +1,10 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! -// source: SceneTransToPointReq.proto +// source: SceneTransToPointRsp.proto package emu.grasscutter.net.proto; -public final class SceneTransToPointReqOuterClass { - private SceneTransToPointReqOuterClass() {} +public final class SceneTransToPointRspOuterClass { + private SceneTransToPointRspOuterClass() {} public static void registerAllExtensions( com.google.protobuf.ExtensionRegistryLite registry) { } @@ -14,42 +14,48 @@ public final class SceneTransToPointReqOuterClass { registerAllExtensions( (com.google.protobuf.ExtensionRegistryLite) registry); } - public interface SceneTransToPointReqOrBuilder extends - // @@protoc_insertion_point(interface_extends:SceneTransToPointReq) + public interface SceneTransToPointRspOrBuilder extends + // @@protoc_insertion_point(interface_extends:SceneTransToPointRsp) com.google.protobuf.MessageOrBuilder { /** - * uint32 sceneId = 1; + * int32 retcode = 1; + * @return The retcode. + */ + int getRetcode(); + + /** + * uint32 sceneId = 2; * @return The sceneId. */ int getSceneId(); /** - * uint32 pointId = 2; + * uint32 pointId = 3; * @return The pointId. */ int getPointId(); } /** - * Protobuf type {@code SceneTransToPointReq} + * Protobuf type {@code SceneTransToPointRsp} */ - public static final class SceneTransToPointReq extends + public static final class SceneTransToPointRsp extends com.google.protobuf.GeneratedMessageV3 implements - // @@protoc_insertion_point(message_implements:SceneTransToPointReq) - SceneTransToPointReqOrBuilder { + // @@protoc_insertion_point(message_implements:SceneTransToPointRsp) + SceneTransToPointRspOrBuilder { private static final long serialVersionUID = 0L; - // Use SceneTransToPointReq.newBuilder() to construct. - private SceneTransToPointReq(com.google.protobuf.GeneratedMessageV3.Builder builder) { + // Use SceneTransToPointRsp.newBuilder() to construct. + private SceneTransToPointRsp(com.google.protobuf.GeneratedMessageV3.Builder builder) { super(builder); } - private SceneTransToPointReq() { + private SceneTransToPointRsp() { } @java.lang.Override @SuppressWarnings({"unused"}) protected java.lang.Object newInstance( UnusedPrivateParameter unused) { - return new SceneTransToPointReq(); + return new SceneTransToPointRsp(); } @java.lang.Override @@ -57,7 +63,7 @@ public final class SceneTransToPointReqOuterClass { getUnknownFields() { return this.unknownFields; } - private SceneTransToPointReq( + private SceneTransToPointRsp( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { @@ -77,11 +83,16 @@ public final class SceneTransToPointReqOuterClass { break; case 8: { - sceneId_ = input.readUInt32(); + retcode_ = input.readInt32(); break; } case 16: { + sceneId_ = input.readUInt32(); + break; + } + case 24: { + pointId_ = input.readUInt32(); break; } @@ -108,19 +119,19 @@ public final class SceneTransToPointReqOuterClass { } public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_descriptor; + return emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.internal_static_SceneTransToPointRsp_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { - return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_fieldAccessorTable + return emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.internal_static_SceneTransToPointRsp_fieldAccessorTable .ensureFieldAccessorsInitialized( - emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.class, emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.Builder.class); + emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp.class, emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp.Builder.class); } /** - * Protobuf enum {@code SceneTransToPointReq.CmdId} + * Protobuf enum {@code SceneTransToPointRsp.CmdId} */ public enum CmdId implements com.google.protobuf.ProtocolMessageEnum { @@ -133,9 +144,9 @@ public final class SceneTransToPointReqOuterClass { */ ENET_IS_RELIABLE(2, 1), /** - * CMD_ID = 219; + * CMD_ID = 220; */ - CMD_ID(4, 219), + CMD_ID(3, 220), UNRECOGNIZED(-1, -1), ; @@ -143,10 +154,6 @@ public final class SceneTransToPointReqOuterClass { * ENET_CHANNEL_ID = 0; */ public static final CmdId ENET_CHANNEL_ID = NONE; - /** - * IS_ALLOW_CLIENT = 1; - */ - public static final CmdId IS_ALLOW_CLIENT = ENET_IS_RELIABLE; /** * NONE = 0; */ @@ -160,13 +167,9 @@ public final class SceneTransToPointReqOuterClass { */ public static final int ENET_IS_RELIABLE_VALUE = 1; /** - * IS_ALLOW_CLIENT = 1; + * CMD_ID = 220; */ - public static final int IS_ALLOW_CLIENT_VALUE = 1; - /** - * CMD_ID = 219; - */ - public static final int CMD_ID_VALUE = 219; + public static final int CMD_ID_VALUE = 220; public final int getNumber() { @@ -195,7 +198,7 @@ public final class SceneTransToPointReqOuterClass { switch (value) { case 0: return NONE; case 1: return ENET_IS_RELIABLE; - case 219: return CMD_ID; + case 220: return CMD_ID; default: return null; } } @@ -226,13 +229,13 @@ public final class SceneTransToPointReqOuterClass { } public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() { - return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.getDescriptor().getEnumTypes().get(0); + return emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp.getDescriptor().getEnumTypes().get(0); } private static final CmdId[] VALUES = getStaticValuesArray(); private static CmdId[] getStaticValuesArray() { return new CmdId[] { - NONE, ENET_CHANNEL_ID, ENET_IS_RELIABLE, IS_ALLOW_CLIENT, CMD_ID, + NONE, ENET_CHANNEL_ID, ENET_IS_RELIABLE, CMD_ID, }; } public static CmdId valueOf( @@ -255,13 +258,24 @@ public final class SceneTransToPointReqOuterClass { this.value = value; } - // @@protoc_insertion_point(enum_scope:SceneTransToPointReq.CmdId) + // @@protoc_insertion_point(enum_scope:SceneTransToPointRsp.CmdId) } - public static final int SCENEID_FIELD_NUMBER = 1; + public static final int RETCODE_FIELD_NUMBER = 1; + private int retcode_; + /** + * int32 retcode = 1; + * @return The retcode. + */ + @java.lang.Override + public int getRetcode() { + return retcode_; + } + + public static final int SCENEID_FIELD_NUMBER = 2; private int sceneId_; /** - * uint32 sceneId = 1; + * uint32 sceneId = 2; * @return The sceneId. */ @java.lang.Override @@ -269,10 +283,10 @@ public final class SceneTransToPointReqOuterClass { return sceneId_; } - public static final int POINTID_FIELD_NUMBER = 2; + public static final int POINTID_FIELD_NUMBER = 3; private int pointId_; /** - * uint32 pointId = 2; + * uint32 pointId = 3; * @return The pointId. */ @java.lang.Override @@ -294,11 +308,14 @@ public final class SceneTransToPointReqOuterClass { @java.lang.Override public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (retcode_ != 0) { + output.writeInt32(1, retcode_); + } if (sceneId_ != 0) { - output.writeUInt32(1, sceneId_); + output.writeUInt32(2, sceneId_); } if (pointId_ != 0) { - output.writeUInt32(2, pointId_); + output.writeUInt32(3, pointId_); } unknownFields.writeTo(output); } @@ -309,13 +326,17 @@ public final class SceneTransToPointReqOuterClass { if (size != -1) return size; size = 0; + if (retcode_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(1, retcode_); + } if (sceneId_ != 0) { size += com.google.protobuf.CodedOutputStream - .computeUInt32Size(1, sceneId_); + .computeUInt32Size(2, sceneId_); } if (pointId_ != 0) { size += com.google.protobuf.CodedOutputStream - .computeUInt32Size(2, pointId_); + .computeUInt32Size(3, pointId_); } size += unknownFields.getSerializedSize(); memoizedSize = size; @@ -327,11 +348,13 @@ public final class SceneTransToPointReqOuterClass { if (obj == this) { return true; } - if (!(obj instanceof emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq)) { + if (!(obj instanceof emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp)) { return super.equals(obj); } - emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq other = (emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq) obj; + emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp other = (emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp) obj; + if (getRetcode() + != other.getRetcode()) return false; if (getSceneId() != other.getSceneId()) return false; if (getPointId() @@ -347,6 +370,8 @@ public final class SceneTransToPointReqOuterClass { } int hash = 41; hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + RETCODE_FIELD_NUMBER; + hash = (53 * hash) + getRetcode(); hash = (37 * hash) + SCENEID_FIELD_NUMBER; hash = (53 * hash) + getSceneId(); hash = (37 * hash) + POINTID_FIELD_NUMBER; @@ -356,69 +381,69 @@ public final class SceneTransToPointReqOuterClass { return hash; } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseFrom( java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseFrom( java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseFrom( com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseFrom( com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom(byte[] data) + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseFrom( byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom(java.io.InputStream input) + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input, extensionRegistry); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseDelimitedFrom(java.io.InputStream input) + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseDelimitedWithIOException(PARSER, input); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseDelimitedFrom( + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseDelimitedFrom( java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseDelimitedWithIOException(PARSER, input, extensionRegistry); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseFrom( com.google.protobuf.CodedInputStream input) throws java.io.IOException { return com.google.protobuf.GeneratedMessageV3 .parseWithIOException(PARSER, input); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parseFrom( + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parseFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -431,7 +456,7 @@ public final class SceneTransToPointReqOuterClass { public static Builder newBuilder() { return DEFAULT_INSTANCE.toBuilder(); } - public static Builder newBuilder(emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq prototype) { + public static Builder newBuilder(emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp prototype) { return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); } @java.lang.Override @@ -447,26 +472,26 @@ public final class SceneTransToPointReqOuterClass { return builder; } /** - * Protobuf type {@code SceneTransToPointReq} + * Protobuf type {@code SceneTransToPointRsp} */ public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements - // @@protoc_insertion_point(builder_implements:SceneTransToPointReq) - emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReqOrBuilder { + // @@protoc_insertion_point(builder_implements:SceneTransToPointRsp) + emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRspOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_descriptor; + return emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.internal_static_SceneTransToPointRsp_descriptor; } @java.lang.Override protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { - return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_fieldAccessorTable + return emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.internal_static_SceneTransToPointRsp_fieldAccessorTable .ensureFieldAccessorsInitialized( - emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.class, emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.Builder.class); + emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp.class, emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp.Builder.class); } - // Construct using emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.newBuilder() + // Construct using emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp.newBuilder() private Builder() { maybeForceBuilderInitialization(); } @@ -484,6 +509,8 @@ public final class SceneTransToPointReqOuterClass { @java.lang.Override public Builder clear() { super.clear(); + retcode_ = 0; + sceneId_ = 0; pointId_ = 0; @@ -494,17 +521,17 @@ public final class SceneTransToPointReqOuterClass { @java.lang.Override public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { - return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.internal_static_SceneTransToPointReq_descriptor; + return emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.internal_static_SceneTransToPointRsp_descriptor; } @java.lang.Override - public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq getDefaultInstanceForType() { - return emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.getDefaultInstance(); + public emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp getDefaultInstanceForType() { + return emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp.getDefaultInstance(); } @java.lang.Override - public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq build() { - emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq result = buildPartial(); + public emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp build() { + emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } @@ -512,8 +539,9 @@ public final class SceneTransToPointReqOuterClass { } @java.lang.Override - public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq buildPartial() { - emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq result = new emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq(this); + public emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp buildPartial() { + emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp result = new emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp(this); + result.retcode_ = retcode_; result.sceneId_ = sceneId_; result.pointId_ = pointId_; onBuilt(); @@ -554,16 +582,19 @@ public final class SceneTransToPointReqOuterClass { } @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { - if (other instanceof emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq) { - return mergeFrom((emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq)other); + if (other instanceof emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp) { + return mergeFrom((emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq other) { - if (other == emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq.getDefaultInstance()) return this; + public Builder mergeFrom(emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp other) { + if (other == emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp.getDefaultInstance()) return this; + if (other.getRetcode() != 0) { + setRetcode(other.getRetcode()); + } if (other.getSceneId() != 0) { setSceneId(other.getSceneId()); } @@ -585,11 +616,11 @@ public final class SceneTransToPointReqOuterClass { com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq parsedMessage = null; + emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp parsedMessage = null; try { parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq) e.getUnfinishedMessage(); + parsedMessage = (emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { if (parsedMessage != null) { @@ -599,9 +630,40 @@ public final class SceneTransToPointReqOuterClass { return this; } + private int retcode_ ; + /** + * int32 retcode = 1; + * @return The retcode. + */ + @java.lang.Override + public int getRetcode() { + return retcode_; + } + /** + * int32 retcode = 1; + * @param value The retcode to set. + * @return This builder for chaining. + */ + public Builder setRetcode(int value) { + + retcode_ = value; + onChanged(); + return this; + } + /** + * int32 retcode = 1; + * @return This builder for chaining. + */ + public Builder clearRetcode() { + + retcode_ = 0; + onChanged(); + return this; + } + private int sceneId_ ; /** - * uint32 sceneId = 1; + * uint32 sceneId = 2; * @return The sceneId. */ @java.lang.Override @@ -609,7 +671,7 @@ public final class SceneTransToPointReqOuterClass { return sceneId_; } /** - * uint32 sceneId = 1; + * uint32 sceneId = 2; * @param value The sceneId to set. * @return This builder for chaining. */ @@ -620,7 +682,7 @@ public final class SceneTransToPointReqOuterClass { return this; } /** - * uint32 sceneId = 1; + * uint32 sceneId = 2; * @return This builder for chaining. */ public Builder clearSceneId() { @@ -632,7 +694,7 @@ public final class SceneTransToPointReqOuterClass { private int pointId_ ; /** - * uint32 pointId = 2; + * uint32 pointId = 3; * @return The pointId. */ @java.lang.Override @@ -640,7 +702,7 @@ public final class SceneTransToPointReqOuterClass { return pointId_; } /** - * uint32 pointId = 2; + * uint32 pointId = 3; * @param value The pointId to set. * @return This builder for chaining. */ @@ -651,7 +713,7 @@ public final class SceneTransToPointReqOuterClass { return this; } /** - * uint32 pointId = 2; + * uint32 pointId = 3; * @return This builder for chaining. */ public Builder clearPointId() { @@ -673,51 +735,51 @@ public final class SceneTransToPointReqOuterClass { } - // @@protoc_insertion_point(builder_scope:SceneTransToPointReq) + // @@protoc_insertion_point(builder_scope:SceneTransToPointRsp) } - // @@protoc_insertion_point(class_scope:SceneTransToPointReq) - private static final emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq DEFAULT_INSTANCE; + // @@protoc_insertion_point(class_scope:SceneTransToPointRsp) + private static final emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp DEFAULT_INSTANCE; static { - DEFAULT_INSTANCE = new emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq(); + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp(); } - public static emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq getDefaultInstance() { + public static emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp getDefaultInstance() { return DEFAULT_INSTANCE; } - private static final com.google.protobuf.Parser - PARSER = new com.google.protobuf.AbstractParser() { + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { @java.lang.Override - public SceneTransToPointReq parsePartialFrom( + public SceneTransToPointRsp parsePartialFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - return new SceneTransToPointReq(input, extensionRegistry); + return new SceneTransToPointRsp(input, extensionRegistry); } }; - public static com.google.protobuf.Parser parser() { + public static com.google.protobuf.Parser parser() { return PARSER; } @java.lang.Override - public com.google.protobuf.Parser getParserForType() { + public com.google.protobuf.Parser getParserForType() { return PARSER; } @java.lang.Override - public emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq getDefaultInstanceForType() { + public emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp getDefaultInstanceForType() { return DEFAULT_INSTANCE; } } private static final com.google.protobuf.Descriptors.Descriptor - internal_static_SceneTransToPointReq_descriptor; + internal_static_SceneTransToPointRsp_descriptor; private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable - internal_static_SceneTransToPointReq_fieldAccessorTable; + internal_static_SceneTransToPointRsp_fieldAccessorTable; public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { @@ -727,23 +789,23 @@ public final class SceneTransToPointReqOuterClass { descriptor; static { java.lang.String[] descriptorData = { - "\n\032SceneTransToPointReq.proto\"\234\001\n\024SceneTr" + - "ansToPointReq\022\017\n\007sceneId\030\001 \001(\r\022\017\n\007pointI" + - "d\030\002 \001(\r\"b\n\005CmdId\022\010\n\004NONE\020\000\022\023\n\017ENET_CHANN" + - "EL_ID\020\000\022\024\n\020ENET_IS_RELIABLE\020\001\022\023\n\017IS_ALLO" + - "W_CLIENT\020\001\022\013\n\006CMD_ID\020\333\001\032\002\020\001B\033\n\031emu.grass" + - "cutter.net.protob\006proto3" + "\n\032SceneTransToPointRsp.proto\"\230\001\n\024SceneTr" + + "ansToPointRsp\022\017\n\007retcode\030\001 \001(\005\022\017\n\007sceneI" + + "d\030\002 \001(\r\022\017\n\007pointId\030\003 \001(\r\"M\n\005CmdId\022\010\n\004NON" + + "E\020\000\022\023\n\017ENET_CHANNEL_ID\020\000\022\024\n\020ENET_IS_RELI" + + "ABLE\020\001\022\013\n\006CMD_ID\020\334\001\032\002\020\001B\033\n\031emu.grasscutt" + + "er.net.protob\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { }); - internal_static_SceneTransToPointReq_descriptor = + internal_static_SceneTransToPointRsp_descriptor = getDescriptor().getMessageTypes().get(0); - internal_static_SceneTransToPointReq_fieldAccessorTable = new + internal_static_SceneTransToPointRsp_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( - internal_static_SceneTransToPointReq_descriptor, - new java.lang.String[] { "SceneId", "PointId", }); + internal_static_SceneTransToPointRsp_descriptor, + new java.lang.String[] { "Retcode", "SceneId", "PointId", }); } // @@protoc_insertion_point(outer_class_scope) From 48cb32f28098b13663475e793526cd5718b2e1c0 Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Thu, 21 Apr 2022 04:59:42 +0800 Subject: [PATCH 056/119] session send sorry --- .../server/packet/recv/HandlerSceneTransToPointReq.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java index 6e38fb282..619a37b1e 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java @@ -13,6 +13,7 @@ public class HandlerSceneTransToPointReq extends PacketHandler { @Override public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { SceneTransToPointReq req = SceneTransToPointReq.parseFrom(payload); + session.send(new PacketSceneTransToPointRsp(session.getPlayer(), req.getPointId(), req.getSceneId())); } } From 2a88b9f49d056c508441deeb8696114f0b88dbed Mon Sep 17 00:00:00 2001 From: lunaticwhat Date: Thu, 21 Apr 2022 05:37:16 +0700 Subject: [PATCH 057/119] gran --- README.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 11f694599..737c804a1 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 From 0cdfe6edd0324115377a447855bb8ddabb025c1f Mon Sep 17 00:00:00 2001 From: lunaticwhat Date: Thu, 21 Apr 2022 05:40:53 +0700 Subject: [PATCH 058/119] resolved issue #56 and cleaned up readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 737c804a1..aedab22f2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Grasscutter A WIP server reimplementation for *some anime game* 2.3-2.6 -**Documentation**: [Grasscutter Wiki](https://github.com/Melledy/Grasscutter/wiki/) +**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 From 6be98b61e4d711427c9790c866152c8227d0a162 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Wed, 20 Apr 2022 18:48:24 -0400 Subject: [PATCH 059/119] Magix sanity. --- .../{Account.java => AccountCommand.java} | 124 ++++----- .../{Broadcast.java => BroadcastCommand.java} | 58 ++--- ...angeScene.java => ChangeSceneCommand.java} | 72 +++--- ...ifacts.java => ClearArtifactsCommand.java} | 60 ++--- .../commands/{Drop.java => DropCommand.java} | 110 ++++---- .../{GiveChar.java => GiveCharCommand.java} | 186 +++++++------- .../commands/{Give.java => GiveCommand.java} | 224 ++++++++-------- .../{GodMode.java => GodModeCommand.java} | 44 ++-- .../commands/{Help.java => HelpCommand.java} | 182 ++++++------- .../commands/{Kick.java => KickCommand.java} | 62 ++--- .../{KillAll.java => KillAllCommand.java} | 128 +++++----- ...Permission.java => PermissionCommand.java} | 98 +++---- .../{Pos.java => PositionCommand.java} | 44 ++-- .../{Reload.java => ReloadCommand.java} | 44 ++-- ...ResetConst.java => ResetConstCommand.java} | 88 +++---- .../{Restart.java => RestartCommand.java} | 32 +-- ...ndMessage.java => SendMessageCommand.java} | 72 +++--- .../{SetStats.java => SetStatsCommand.java} | 240 +++++++++--------- ...ldLevel.java => SetWorldLevelCommand.java} | 78 +++--- .../{Spawn.java => SpawnCommand.java} | 102 ++++---- .../commands/{Stop.java => StopCommand.java} | 46 ++-- .../{Weather.java => WeatherCommand.java} | 78 +++--- 22 files changed, 1086 insertions(+), 1086 deletions(-) rename src/main/java/emu/grasscutter/command/commands/{Account.java => AccountCommand.java} (95%) rename src/main/java/emu/grasscutter/command/commands/{Broadcast.java => BroadcastCommand.java} (91%) rename src/main/java/emu/grasscutter/command/commands/{ChangeScene.java => ChangeSceneCommand.java} (93%) rename src/main/java/emu/grasscutter/command/commands/{ClearArtifacts.java => ClearArtifactsCommand.java} (93%) rename src/main/java/emu/grasscutter/command/commands/{Drop.java => DropCommand.java} (95%) rename src/main/java/emu/grasscutter/command/commands/{GiveChar.java => GiveCharCommand.java} (96%) rename src/main/java/emu/grasscutter/command/commands/{Give.java => GiveCommand.java} (96%) rename src/main/java/emu/grasscutter/command/commands/{GodMode.java => GodModeCommand.java} (91%) rename src/main/java/emu/grasscutter/command/commands/{Help.java => HelpCommand.java} (96%) rename src/main/java/emu/grasscutter/command/commands/{Kick.java => KickCommand.java} (93%) rename src/main/java/emu/grasscutter/command/commands/{KillAll.java => KillAllCommand.java} (96%) rename src/main/java/emu/grasscutter/command/commands/{Permission.java => PermissionCommand.java} (94%) rename src/main/java/emu/grasscutter/command/commands/{Pos.java => PositionCommand.java} (82%) rename src/main/java/emu/grasscutter/command/commands/{Reload.java => ReloadCommand.java} (91%) rename src/main/java/emu/grasscutter/command/commands/{ResetConst.java => ResetConstCommand.java} (94%) rename src/main/java/emu/grasscutter/command/commands/{Restart.java => RestartCommand.java} (86%) rename src/main/java/emu/grasscutter/command/commands/{SendMessage.java => SendMessageCommand.java} (93%) rename src/main/java/emu/grasscutter/command/commands/{SetStats.java => SetStatsCommand.java} (97%) rename src/main/java/emu/grasscutter/command/commands/{SetWorldLevel.java => SetWorldLevelCommand.java} (93%) rename src/main/java/emu/grasscutter/command/commands/{Spawn.java => SpawnCommand.java} (95%) rename src/main/java/emu/grasscutter/command/commands/{Stop.java => StopCommand.java} (90%) rename src/main/java/emu/grasscutter/command/commands/{Weather.java => WeatherCommand.java} (93%) diff --git a/src/main/java/emu/grasscutter/command/commands/Account.java b/src/main/java/emu/grasscutter/command/commands/AccountCommand.java similarity index 95% rename from src/main/java/emu/grasscutter/command/commands/Account.java rename to src/main/java/emu/grasscutter/command/commands/AccountCommand.java index cd2978feb..2c21cba79 100644 --- a/src/main/java/emu/grasscutter/command/commands/Account.java +++ b/src/main/java/emu/grasscutter/command/commands/AccountCommand.java @@ -1,62 +1,62 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.database.DatabaseHelper; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "account", usage = "account [uid]", - description = "Modify user accounts") -public class Account implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender != null) { - CommandHandler.sendMessage(sender, "This command can only be run from the console."); - return; - } - - if (args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: account [uid]"); - return; - } - - String action = args.get(0); - String username = args.get(1); - - switch (action) { - default: - CommandHandler.sendMessage(null, "Usage: account [uid]"); - return; - case "create": - int uid = 0; - if (args.size() > 2) { - try { - uid = Integer.parseInt(args.get(2)); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid UID."); - return; - } - } - - emu.grasscutter.game.Account account = DatabaseHelper.createAccountWithId(username, uid); - if (account == null) { - CommandHandler.sendMessage(null, "Account already exists."); - return; - } 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": - if (DatabaseHelper.deleteAccount(username)) { - CommandHandler.sendMessage(null, "Account deleted."); - } else { - CommandHandler.sendMessage(null, "Account not found."); - } - } - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.database.DatabaseHelper; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "account", usage = "account [uid]", + description = "Modify user accounts") +public final class AccountCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender != null) { + CommandHandler.sendMessage(sender, "This command can only be run from the console."); + return; + } + + if (args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: account [uid]"); + return; + } + + String action = args.get(0); + String username = args.get(1); + + switch (action) { + default: + CommandHandler.sendMessage(null, "Usage: account [uid]"); + return; + case "create": + int uid = 0; + if (args.size() > 2) { + try { + uid = Integer.parseInt(args.get(2)); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid UID."); + return; + } + } + + emu.grasscutter.game.Account account = DatabaseHelper.createAccountWithId(username, uid); + if (account == null) { + CommandHandler.sendMessage(null, "Account already exists."); + return; + } 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": + if (DatabaseHelper.deleteAccount(username)) { + CommandHandler.sendMessage(null, "Account deleted."); + } else { + CommandHandler.sendMessage(null, "Account not found."); + } + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Broadcast.java b/src/main/java/emu/grasscutter/command/commands/BroadcastCommand.java similarity index 91% rename from src/main/java/emu/grasscutter/command/commands/Broadcast.java rename to src/main/java/emu/grasscutter/command/commands/BroadcastCommand.java index 7659fed9e..4922f16f8 100644 --- a/src/main/java/emu/grasscutter/command/commands/Broadcast.java +++ b/src/main/java/emu/grasscutter/command/commands/BroadcastCommand.java @@ -1,29 +1,29 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "broadcast", usage = "broadcast ", - description = "Sends a message to all the players", aliases = {"b"}, permission = "server.broadcast") -public class Broadcast implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (args.size() < 1) { - CommandHandler.sendMessage(sender, "Usage: broadcast "); - return; - } - - String message = String.join(" ", args.subList(0, args.size())); - - for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { - CommandHandler.sendMessage(p, message); - } - - CommandHandler.sendMessage(sender, "Message sent."); - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "broadcast", usage = "broadcast ", + description = "Sends a message to all the players", aliases = {"b"}, permission = "server.broadcast") +public final class BroadcastCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: broadcast "); + return; + } + + String message = String.join(" ", args.subList(0, args.size())); + + for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { + CommandHandler.sendMessage(p, message); + } + + CommandHandler.sendMessage(sender, "Message sent."); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/ChangeScene.java b/src/main/java/emu/grasscutter/command/commands/ChangeSceneCommand.java similarity index 93% rename from src/main/java/emu/grasscutter/command/commands/ChangeScene.java rename to src/main/java/emu/grasscutter/command/commands/ChangeSceneCommand.java index 196c7fea7..a5afe7bf7 100644 --- a/src/main/java/emu/grasscutter/command/commands/ChangeScene.java +++ b/src/main/java/emu/grasscutter/command/commands/ChangeSceneCommand.java @@ -1,36 +1,36 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "changescene", usage = "changescene ", - description = "Changes your scene", aliases = {"scene"}, permission = "player.changescene") -public class ChangeScene implements CommandHandler { - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; - } - - if (args.size() < 1) { - CommandHandler.sendMessage(sender, "Usage: changescene "); - return; - } - - try { - int sceneId = Integer.parseInt(args.get(0)); - boolean result = sender.getWorld().transferPlayerToScene(sender, sceneId, sender.getPos()); - - CommandHandler.sendMessage(sender, "Changed to scene " + sceneId); - if (!result) { - CommandHandler.sendMessage(sender, "Scene does not exist or you are already in it"); - } - } catch (Exception e) { - CommandHandler.sendMessage(sender, "Usage: changescene "); - } - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "changescene", usage = "changescene ", + description = "Changes your scene", aliases = {"scene"}, permission = "player.changescene") +public final class ChangeSceneCommand implements CommandHandler { + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: changescene "); + return; + } + + try { + int sceneId = Integer.parseInt(args.get(0)); + boolean result = sender.getWorld().transferPlayerToScene(sender, sceneId, sender.getPos()); + + CommandHandler.sendMessage(sender, "Changed to scene " + sceneId); + if (!result) { + CommandHandler.sendMessage(sender, "Scene does not exist or you are already in it"); + } + } catch (Exception e) { + CommandHandler.sendMessage(sender, "Usage: changescene "); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/ClearArtifacts.java b/src/main/java/emu/grasscutter/command/commands/ClearArtifactsCommand.java similarity index 93% rename from src/main/java/emu/grasscutter/command/commands/ClearArtifacts.java rename to src/main/java/emu/grasscutter/command/commands/ClearArtifactsCommand.java index 8a46760dd..258e1e1d5 100644 --- a/src/main/java/emu/grasscutter/command/commands/ClearArtifacts.java +++ b/src/main/java/emu/grasscutter/command/commands/ClearArtifactsCommand.java @@ -1,30 +1,30 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.inventory.Inventory; -import emu.grasscutter.game.inventory.ItemType; - -import java.util.List; - -@Command(label = "clearartifacts", usage = "clearartifacts", - description = "Deletes all unequipped and unlocked level 0 artifacts, including yellow rarity ones from your inventory", - aliases = {"clearart"}, permission = "player.clearartifacts") -public class ClearArtifacts implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; // TODO: clear player's artifacts from console or other players - } - - Inventory playerInventory = sender.getInventory(); - playerInventory.getItems().values().stream() - .filter(item -> item.getItemType() == ItemType.ITEM_RELIQUARY) - .filter(item -> item.getLevel() == 1 && item.getExp() == 0) - .filter(item -> !item.isLocked() && !item.isEquipped()) - .forEach(item -> playerInventory.removeItem(item, item.getCount())); - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.inventory.Inventory; +import emu.grasscutter.game.inventory.ItemType; + +import java.util.List; + +@Command(label = "clearartifacts", usage = "clearartifacts", + description = "Deletes all unequipped and unlocked level 0 artifacts, including yellow rarity ones from your inventory", + aliases = {"clearart"}, permission = "player.clearartifacts") +public final class ClearArtifactsCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; // TODO: clear player's artifacts from console or other players + } + + Inventory playerInventory = sender.getInventory(); + playerInventory.getItems().values().stream() + .filter(item -> item.getItemType() == ItemType.ITEM_RELIQUARY) + .filter(item -> item.getLevel() == 1 && item.getExp() == 0) + .filter(item -> !item.isLocked() && !item.isEquipped()) + .forEach(item -> playerInventory.removeItem(item, item.getCount())); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Drop.java b/src/main/java/emu/grasscutter/command/commands/DropCommand.java similarity index 95% rename from src/main/java/emu/grasscutter/command/commands/Drop.java rename to src/main/java/emu/grasscutter/command/commands/DropCommand.java index 21db96881..e2d7644a0 100644 --- a/src/main/java/emu/grasscutter/command/commands/Drop.java +++ b/src/main/java/emu/grasscutter/command/commands/DropCommand.java @@ -1,56 +1,56 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.data.GenshinData; -import emu.grasscutter.data.def.ItemData; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.entity.EntityItem; -import emu.grasscutter.utils.Position; - -import java.util.List; - -@Command(label = "drop", usage = "drop [amount]", - description = "Drops an item near you", aliases = {"d", "dropitem"}, permission = "server.drop") -public class Drop implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; - } - - if (args.size() < 1) { - CommandHandler.sendMessage(sender, "Usage: drop [amount]"); - return; - } - - try { - int item = Integer.parseInt(args.get(0)); - int amount = 1; - if (args.size() > 1) amount = Integer.parseInt(args.get(1)); - - ItemData itemData = GenshinData.getItemDataMap().get(item); - if (itemData == null) { - CommandHandler.sendMessage(sender, "Invalid item id."); - return; - } - - if (itemData.isEquip()) { - float range = (5f + (.1f * amount)); - for (int i = 0; i < amount; i++) { - Position pos = sender.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); - EntityItem entity = new EntityItem(sender.getScene(), sender, itemData, pos, 1); - sender.getScene().addEntity(entity); - } - } else { - EntityItem entity = new EntityItem(sender.getScene(), sender, itemData, sender.getPos().clone().addY(3f), amount); - sender.getScene().addEntity(entity); - } - CommandHandler.sendMessage(sender, String.format("Dropped %s of %s.", amount, item)); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid item or player ID."); - } - } +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.data.GenshinData; +import emu.grasscutter.data.def.ItemData; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.entity.EntityItem; +import emu.grasscutter.utils.Position; + +import java.util.List; + +@Command(label = "drop", usage = "drop [amount]", + description = "Drops an item near you", aliases = {"d", "dropitem"}, permission = "server.drop") +public final class DropCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: drop [amount]"); + return; + } + + try { + int item = Integer.parseInt(args.get(0)); + int amount = 1; + if (args.size() > 1) amount = Integer.parseInt(args.get(1)); + + ItemData itemData = GenshinData.getItemDataMap().get(item); + if (itemData == null) { + CommandHandler.sendMessage(sender, "Invalid item id."); + return; + } + + if (itemData.isEquip()) { + float range = (5f + (.1f * amount)); + for (int i = 0; i < amount; i++) { + Position pos = sender.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); + EntityItem entity = new EntityItem(sender.getScene(), sender, itemData, pos, 1); + sender.getScene().addEntity(entity); + } + } else { + EntityItem entity = new EntityItem(sender.getScene(), sender, itemData, sender.getPos().clone().addY(3f), amount); + sender.getScene().addEntity(entity); + } + CommandHandler.sendMessage(sender, String.format("Dropped %s of %s.", amount, item)); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid item or player ID."); + } + } } \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/command/commands/GiveChar.java b/src/main/java/emu/grasscutter/command/commands/GiveCharCommand.java similarity index 96% rename from src/main/java/emu/grasscutter/command/commands/GiveChar.java rename to src/main/java/emu/grasscutter/command/commands/GiveCharCommand.java index 9c9d87fb5..bfe0f51c0 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveChar.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveCharCommand.java @@ -1,93 +1,93 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.data.GenshinData; -import emu.grasscutter.data.def.AvatarData; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.avatar.GenshinAvatar; - -import java.util.List; - -@Command(label = "givechar", usage = "givechar [level]", - description = "Gives the player a specified character", aliases = {"givec"}, permission = "player.givechar") -public class GiveChar implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - int target, avatarId, level = 1, ascension; - - if (sender == null && args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: givechar [amount]"); - return; - } - - switch (args.size()) { - default: - CommandHandler.sendMessage(sender, "Usage: givechar [level]"); - return; - case 2: - try { - target = Integer.parseInt(args.get(0)); - if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { - target = sender.getUid(); - level = Integer.parseInt(args.get(1)); - avatarId = Integer.parseInt(args.get(0)); - } else { - avatarId = Integer.parseInt(args.get(1)); - } - } catch (NumberFormatException ignored) { - // TODO: Parse from avatar name using GM Handbook. - CommandHandler.sendMessage(sender, "Invalid avatar or player ID."); - return; - } - break; - case 3: - try { - target = Integer.parseInt(args.get(0)); - if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { - CommandHandler.sendMessage(sender, "Invalid player ID."); - return; - } - - avatarId = Integer.parseInt(args.get(1)); - level = Integer.parseInt(args.get(2)); - } catch (NumberFormatException ignored) { - // TODO: Parse from avatar name using GM Handbook. - CommandHandler.sendMessage(sender, "Invalid avatar or player ID."); - return; - } - break; - } - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if (targetPlayer == null) { - CommandHandler.sendMessage(sender, "Player not found."); - return; - } - - AvatarData avatarData = GenshinData.getAvatarDataMap().get(avatarId); - if (avatarData == null) { - CommandHandler.sendMessage(sender, "Invalid avatar id."); - return; - } - - // Calculate ascension level. - if (level <= 40) { - ascension = (int) Math.ceil(level / 20f); - } else { - ascension = (int) Math.ceil(level / 10f) - 3; - } - - GenshinAvatar avatar = new GenshinAvatar(avatarId); - avatar.setLevel(level); - avatar.setPromoteLevel(ascension); - - // This will handle stats and talents - avatar.recalcStats(); - - targetPlayer.addAvatar(avatar); - CommandHandler.sendMessage(sender, String.format("Given %s to %s.", avatarId, target)); - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.data.GenshinData; +import emu.grasscutter.data.def.AvatarData; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.avatar.GenshinAvatar; + +import java.util.List; + +@Command(label = "givechar", usage = "givechar [level]", + description = "Gives the player a specified character", aliases = {"givec"}, permission = "player.givechar") +public final class GiveCharCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + int target, avatarId, level = 1, ascension; + + if (sender == null && args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: givechar [amount]"); + return; + } + + switch (args.size()) { + default: + CommandHandler.sendMessage(sender, "Usage: givechar [level]"); + return; + case 2: + try { + target = Integer.parseInt(args.get(0)); + if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { + target = sender.getUid(); + level = Integer.parseInt(args.get(1)); + avatarId = Integer.parseInt(args.get(0)); + } else { + avatarId = Integer.parseInt(args.get(1)); + } + } catch (NumberFormatException ignored) { + // TODO: Parse from avatar name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid avatar or player ID."); + return; + } + break; + case 3: + try { + target = Integer.parseInt(args.get(0)); + if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { + CommandHandler.sendMessage(sender, "Invalid player ID."); + return; + } + + avatarId = Integer.parseInt(args.get(1)); + level = Integer.parseInt(args.get(2)); + } catch (NumberFormatException ignored) { + // TODO: Parse from avatar name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid avatar or player ID."); + return; + } + break; + } + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + if (targetPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found."); + return; + } + + AvatarData avatarData = GenshinData.getAvatarDataMap().get(avatarId); + if (avatarData == null) { + CommandHandler.sendMessage(sender, "Invalid avatar id."); + return; + } + + // Calculate ascension level. + if (level <= 40) { + ascension = (int) Math.ceil(level / 20f); + } else { + ascension = (int) Math.ceil(level / 10f) - 3; + } + + GenshinAvatar avatar = new GenshinAvatar(avatarId); + avatar.setLevel(level); + avatar.setPromoteLevel(ascension); + + // This will handle stats and talents + avatar.recalcStats(); + + targetPlayer.addAvatar(avatar); + CommandHandler.sendMessage(sender, String.format("Given %s to %s.", avatarId, target)); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Give.java b/src/main/java/emu/grasscutter/command/commands/GiveCommand.java similarity index 96% rename from src/main/java/emu/grasscutter/command/commands/Give.java rename to src/main/java/emu/grasscutter/command/commands/GiveCommand.java index 47c015cf0..7d15a4759 100644 --- a/src/main/java/emu/grasscutter/command/commands/Give.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveCommand.java @@ -1,112 +1,112 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.data.GenshinData; -import emu.grasscutter.data.def.ItemData; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.inventory.GenshinItem; -import emu.grasscutter.game.props.ActionReason; -import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; - -import java.util.LinkedList; -import java.util.List; - -@Command(label = "give", usage = "give [player] [amount]", - description = "Gives an item to you or the specified player", aliases = {"g", "item", "giveitem"}, permission = "player.give") -public class Give implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - int target, item, amount = 1; - - if (sender == null && args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: give [amount]"); - return; - } - - switch (args.size()) { - default: // *No args* - CommandHandler.sendMessage(sender, "Usage: give [player] [amount]"); - return; - case 1: // - try { - item = Integer.parseInt(args.get(0)); - target = sender.getUid(); - } catch (NumberFormatException ignored) { - // TODO: Parse from item name using GM Handbook. - CommandHandler.sendMessage(sender, "Invalid item id."); - return; - } - break; - case 2: // [amount] | [player] - try { - target = Integer.parseInt(args.get(0)); - - if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { - target = sender.getUid(); - item = Integer.parseInt(args.get(0)); - amount = Integer.parseInt(args.get(1)); - } else { - item = Integer.parseInt(args.get(1)); - } - } catch (NumberFormatException ignored) { - // TODO: Parse from item name using GM Handbook. - CommandHandler.sendMessage(sender, "Invalid item or player ID."); - return; - } - break; - case 3: // [player] [amount] - try { - target = Integer.parseInt(args.get(0)); - - if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { - CommandHandler.sendMessage(sender, "Invalid player ID."); - return; - } - - item = Integer.parseInt(args.get(1)); - amount = Integer.parseInt(args.get(2)); - } catch (NumberFormatException ignored) { - // TODO: Parse from item name using GM Handbook. - CommandHandler.sendMessage(sender, "Invalid item or player ID."); - return; - } - break; - } - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - - if (targetPlayer == null) { - CommandHandler.sendMessage(sender, "Player not found."); - return; - } - - ItemData itemData = GenshinData.getItemDataMap().get(item); - if (itemData == null) { - CommandHandler.sendMessage(sender, "Invalid item id."); - return; - } - - this.item(targetPlayer, itemData, amount); - - CommandHandler.sendMessage(sender, String.format("Given %s of %s to %s.", amount, item, target)); - } - - private void item(GenshinPlayer player, ItemData itemData, int amount) { - GenshinItem genshinItem = new GenshinItem(itemData); - if (itemData.isEquip()) { - List items = new LinkedList<>(); - for (int i = 0; i < amount; i++) { - items.add(genshinItem); - } - player.getInventory().addItems(items); - player.sendPacket(new PacketItemAddHintNotify(items, ActionReason.SubfieldDrop)); - } else { - genshinItem.setCount(amount); - player.getInventory().addItem(genshinItem); - player.sendPacket(new PacketItemAddHintNotify(genshinItem, ActionReason.SubfieldDrop)); - } - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.data.GenshinData; +import emu.grasscutter.data.def.ItemData; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.inventory.GenshinItem; +import emu.grasscutter.game.props.ActionReason; +import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; + +import java.util.LinkedList; +import java.util.List; + +@Command(label = "give", usage = "give [player] [amount]", + description = "Gives an item to you or the specified player", aliases = {"g", "item", "giveitem"}, permission = "player.give") +public final class GiveCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + int target, item, amount = 1; + + if (sender == null && args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: give [amount]"); + return; + } + + switch (args.size()) { + default: // *No args* + CommandHandler.sendMessage(sender, "Usage: give [player] [amount]"); + return; + case 1: // + try { + item = Integer.parseInt(args.get(0)); + target = sender.getUid(); + } catch (NumberFormatException ignored) { + // TODO: Parse from item name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid item id."); + return; + } + break; + case 2: // [amount] | [player] + try { + target = Integer.parseInt(args.get(0)); + + if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { + target = sender.getUid(); + item = Integer.parseInt(args.get(0)); + amount = Integer.parseInt(args.get(1)); + } else { + item = Integer.parseInt(args.get(1)); + } + } catch (NumberFormatException ignored) { + // TODO: Parse from item name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid item or player ID."); + return; + } + break; + case 3: // [player] [amount] + try { + target = Integer.parseInt(args.get(0)); + + if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { + CommandHandler.sendMessage(sender, "Invalid player ID."); + return; + } + + item = Integer.parseInt(args.get(1)); + amount = Integer.parseInt(args.get(2)); + } catch (NumberFormatException ignored) { + // TODO: Parse from item name using GM Handbook. + CommandHandler.sendMessage(sender, "Invalid item or player ID."); + return; + } + break; + } + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + + if (targetPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found."); + return; + } + + ItemData itemData = GenshinData.getItemDataMap().get(item); + if (itemData == null) { + CommandHandler.sendMessage(sender, "Invalid item id."); + return; + } + + this.item(targetPlayer, itemData, amount); + + CommandHandler.sendMessage(sender, String.format("Given %s of %s to %s.", amount, item, target)); + } + + private void item(GenshinPlayer player, ItemData itemData, int amount) { + GenshinItem genshinItem = new GenshinItem(itemData); + if (itemData.isEquip()) { + List items = new LinkedList<>(); + for (int i = 0; i < amount; i++) { + items.add(genshinItem); + } + player.getInventory().addItems(items); + player.sendPacket(new PacketItemAddHintNotify(items, ActionReason.SubfieldDrop)); + } else { + genshinItem.setCount(amount); + player.getInventory().addItem(genshinItem); + player.sendPacket(new PacketItemAddHintNotify(genshinItem, ActionReason.SubfieldDrop)); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/GodMode.java b/src/main/java/emu/grasscutter/command/commands/GodModeCommand.java similarity index 91% rename from src/main/java/emu/grasscutter/command/commands/GodMode.java rename to src/main/java/emu/grasscutter/command/commands/GodModeCommand.java index a84085d4d..e5635dc9f 100644 --- a/src/main/java/emu/grasscutter/command/commands/GodMode.java +++ b/src/main/java/emu/grasscutter/command/commands/GodModeCommand.java @@ -1,22 +1,22 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "godmode", usage = "godmode [playerId]", - description = "Prevents you from taking damage", permission = "player.godmode") -public class GodMode implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; // TODO: toggle player's godmode statue from console or other players - } - sender.setGodmode(!sender.inGodmode()); - sender.dropMessage("Godmode is now " + (sender.inGodmode() ? "enabled" : "disabled") + "."); - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "godmode", usage = "godmode [playerId]", + description = "Prevents you from taking damage", permission = "player.godmode") +public final class GodModeCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; // TODO: toggle player's godmode statue from console or other players + } + sender.setGodmode(!sender.inGodmode()); + sender.dropMessage("Godmode is now " + (sender.inGodmode() ? "enabled" : "disabled") + "."); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Help.java b/src/main/java/emu/grasscutter/command/commands/HelpCommand.java similarity index 96% rename from src/main/java/emu/grasscutter/command/commands/Help.java rename to src/main/java/emu/grasscutter/command/commands/HelpCommand.java index 376bb8cbf..abe78e7d3 100644 --- a/src/main/java/emu/grasscutter/command/commands/Help.java +++ b/src/main/java/emu/grasscutter/command/commands/HelpCommand.java @@ -1,91 +1,91 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.command.CommandMap; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.*; - -@Command(label = "help", usage = "help [command]", - description = "Sends the help message or shows information about a specified command") -public class Help implements CommandHandler { - - @Override - public void execute(GenshinPlayer player, List args) { - if (args.size() < 1) { - HashMap handlers = CommandMap.getInstance().getHandlers(); - List annotations = new ArrayList<>(); - for (String key : handlers.keySet()) { - Command annotation = handlers.get(key).getClass().getAnnotation(Command.class); - - if (!Arrays.asList(annotation.aliases()).contains(key)) { - if (player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) - continue; - annotations.add(annotation); - } - } - - SendAllHelpMessage(player, annotations); - } else { - String command = args.get(0); - CommandHandler handler = CommandMap.getInstance().getHandler(command); - StringBuilder builder = new StringBuilder(player == null ? "\nHelp - " : "Help - ").append(command).append(": \n"); - if (handler == null) { - builder.append("No command found."); - } else { - Command annotation = handler.getClass().getAnnotation(Command.class); - - builder.append(" ").append(annotation.description()).append("\n"); - builder.append(" Usage: ").append(annotation.usage()); - if (annotation.aliases().length >= 1) { - builder.append("\n").append(" Aliases: "); - for (String alias : annotation.aliases()) { - builder.append(alias).append(" "); - } - } - if (player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) { - builder.append("\n Warning: You do not have permission to run this command."); - } - } - - CommandHandler.sendMessage(player, builder.toString()); - } - } - - void SendAllHelpMessage(GenshinPlayer player, List annotations) { - if (player == null) { - StringBuilder builder = new StringBuilder("\nAvailable commands:\n"); - annotations.forEach(annotation -> { - builder.append(annotation.label()).append("\n"); - builder.append(" ").append(annotation.description()).append("\n"); - builder.append(" Usage: ").append(annotation.usage()); - if (annotation.aliases().length >= 1) { - builder.append("\n").append(" Aliases: "); - for (String alias : annotation.aliases()) { - builder.append(alias).append(" "); - } - } - - builder.append("\n"); - }); - - CommandHandler.sendMessage(null, builder.toString()); - } else { - CommandHandler.sendMessage(player, "Available commands:"); - annotations.forEach(annotation -> { - StringBuilder builder = new StringBuilder(annotation.label()).append("\n"); - builder.append(" ").append(annotation.description()).append("\n"); - builder.append(" Usage: ").append(annotation.usage()); - if (annotation.aliases().length >= 1) { - builder.append("\n").append(" Aliases: "); - for (String alias : annotation.aliases()) { - builder.append(alias).append(" "); - } - } - - CommandHandler.sendMessage(player, builder.toString()); - }); - } - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.command.CommandMap; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.*; + +@Command(label = "help", usage = "help [command]", + description = "Sends the help message or shows information about a specified command") +public final class HelpCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer player, List args) { + if (args.size() < 1) { + HashMap handlers = CommandMap.getInstance().getHandlers(); + List annotations = new ArrayList<>(); + for (String key : handlers.keySet()) { + Command annotation = handlers.get(key).getClass().getAnnotation(Command.class); + + if (!Arrays.asList(annotation.aliases()).contains(key)) { + if (player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) + continue; + annotations.add(annotation); + } + } + + SendAllHelpMessage(player, annotations); + } else { + String command = args.get(0); + CommandHandler handler = CommandMap.getInstance().getHandler(command); + StringBuilder builder = new StringBuilder(player == null ? "\nHelp - " : "Help - ").append(command).append(": \n"); + if (handler == null) { + builder.append("No command found."); + } else { + Command annotation = handler.getClass().getAnnotation(Command.class); + + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if (annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + if (player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) { + builder.append("\n Warning: You do not have permission to run this command."); + } + } + + CommandHandler.sendMessage(player, builder.toString()); + } + } + + void SendAllHelpMessage(GenshinPlayer player, List annotations) { + if (player == null) { + StringBuilder builder = new StringBuilder("\nAvailable commands:\n"); + annotations.forEach(annotation -> { + builder.append(annotation.label()).append("\n"); + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if (annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + + builder.append("\n"); + }); + + CommandHandler.sendMessage(null, builder.toString()); + } else { + CommandHandler.sendMessage(player, "Available commands:"); + annotations.forEach(annotation -> { + StringBuilder builder = new StringBuilder(annotation.label()).append("\n"); + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if (annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + + CommandHandler.sendMessage(player, builder.toString()); + }); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Kick.java b/src/main/java/emu/grasscutter/command/commands/KickCommand.java similarity index 93% rename from src/main/java/emu/grasscutter/command/commands/Kick.java rename to src/main/java/emu/grasscutter/command/commands/KickCommand.java index 9a9c19f86..188ce1877 100644 --- a/src/main/java/emu/grasscutter/command/commands/Kick.java +++ b/src/main/java/emu/grasscutter/command/commands/KickCommand.java @@ -1,31 +1,31 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "kick", usage = "kick ", - description = "Kicks the specified player from the server (WIP)", permission = "server.kick") -public class Kick implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - int target = Integer.parseInt(args.get(0)); - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if (targetPlayer == null) { - CommandHandler.sendMessage(sender, "Player not found."); - return; - } - - if (sender != null) { - CommandHandler.sendMessage(sender, String.format("Player [%s:%s] has kicked player [%s:%s]", sender.getAccount().getPlayerId(), sender.getAccount().getUsername(), target, targetPlayer.getAccount().getUsername())); - } - CommandHandler.sendMessage(sender, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); - - targetPlayer.getSession().close(); - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "kick", usage = "kick ", + description = "Kicks the specified player from the server (WIP)", permission = "server.kick") +public final class KickCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + int target = Integer.parseInt(args.get(0)); + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + if (targetPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found."); + return; + } + + if (sender != null) { + CommandHandler.sendMessage(sender, String.format("Player [%s:%s] has kicked player [%s:%s]", sender.getAccount().getPlayerId(), sender.getAccount().getUsername(), target, targetPlayer.getAccount().getUsername())); + } + CommandHandler.sendMessage(sender, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); + + targetPlayer.getSession().close(); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/KillAll.java b/src/main/java/emu/grasscutter/command/commands/KillAllCommand.java similarity index 96% rename from src/main/java/emu/grasscutter/command/commands/KillAll.java rename to src/main/java/emu/grasscutter/command/commands/KillAllCommand.java index ba434aa89..436691b57 100644 --- a/src/main/java/emu/grasscutter/command/commands/KillAll.java +++ b/src/main/java/emu/grasscutter/command/commands/KillAllCommand.java @@ -1,64 +1,64 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.GenshinScene; -import emu.grasscutter.game.entity.EntityMonster; - -import java.util.List; - -@Command(label = "killall", usage = "killall [playerUid] [sceneId]", - description = "Kill all entities", permission = "server.killall") -public class KillAll implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - GenshinScene scene; - GenshinPlayer genshinPlayer; - - try { - switch (args.size()) { - case 0: // *No args* - if (sender == null) { - CommandHandler.sendMessage(null, "Usage: killall [playerUid] [sceneId]"); - return; - } - scene = sender.getScene(); - break; - case 1: // [playerUid] - genshinPlayer = Grasscutter.getGameServer().getPlayerByUid(Integer.parseInt(args.get(0))); - if (genshinPlayer == null) { - CommandHandler.sendMessage(sender, "Player not found or offline."); - return; - } - scene = genshinPlayer.getScene(); - break; - case 2: // [playerUid] [sceneId] - genshinPlayer = Grasscutter.getGameServer().getPlayerByUid(Integer.parseInt(args.get(0))); - if (genshinPlayer == null) { - CommandHandler.sendMessage(sender, "Player not found or offline."); - return; - } - GenshinScene genshinScene = sender.getWorld().getSceneById(Integer.parseInt(args.get(1))); - if (genshinScene == null) { - CommandHandler.sendMessage(sender, "Scene not found in player world"); - return; - } - scene = genshinScene; - break; - default: - CommandHandler.sendMessage(sender, "Usage: killall [playerUid] [sceneId]"); - return; - } - - scene.getEntities().values().stream() - .filter(entity -> entity instanceof EntityMonster) - .forEach(entity -> scene.killEntity(entity, 0)); - CommandHandler.sendMessage(sender, "Killing all monsters in scene " + scene.getId()); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid arguments."); - } - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.GenshinScene; +import emu.grasscutter.game.entity.EntityMonster; + +import java.util.List; + +@Command(label = "killall", usage = "killall [playerUid] [sceneId]", + description = "Kill all entities", permission = "server.killall") +public final class KillAllCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + GenshinScene scene; + GenshinPlayer genshinPlayer; + + try { + switch (args.size()) { + case 0: // *No args* + if (sender == null) { + CommandHandler.sendMessage(null, "Usage: killall [playerUid] [sceneId]"); + return; + } + scene = sender.getScene(); + break; + case 1: // [playerUid] + genshinPlayer = Grasscutter.getGameServer().getPlayerByUid(Integer.parseInt(args.get(0))); + if (genshinPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found or offline."); + return; + } + scene = genshinPlayer.getScene(); + break; + case 2: // [playerUid] [sceneId] + genshinPlayer = Grasscutter.getGameServer().getPlayerByUid(Integer.parseInt(args.get(0))); + if (genshinPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found or offline."); + return; + } + GenshinScene genshinScene = sender.getWorld().getSceneById(Integer.parseInt(args.get(1))); + if (genshinScene == null) { + CommandHandler.sendMessage(sender, "Scene not found in player world"); + return; + } + scene = genshinScene; + break; + default: + CommandHandler.sendMessage(sender, "Usage: killall [playerUid] [sceneId]"); + return; + } + + scene.getEntities().values().stream() + .filter(entity -> entity instanceof EntityMonster) + .forEach(entity -> scene.killEntity(entity, 0)); + CommandHandler.sendMessage(sender, "Killing all monsters in scene " + scene.getId()); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid arguments."); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Permission.java b/src/main/java/emu/grasscutter/command/commands/PermissionCommand.java similarity index 94% rename from src/main/java/emu/grasscutter/command/commands/Permission.java rename to src/main/java/emu/grasscutter/command/commands/PermissionCommand.java index 353ba81c8..7218bf2cd 100644 --- a/src/main/java/emu/grasscutter/command/commands/Permission.java +++ b/src/main/java/emu/grasscutter/command/commands/PermissionCommand.java @@ -1,50 +1,50 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.Account; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "permission", usage = "permission ", - description = "Grants or removes a permission for a user", permission = "*") -public class Permission implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (args.size() < 3) { - CommandHandler.sendMessage(sender, "Usage: permission "); - return; - } - - String action = args.get(0); - String username = args.get(1); - String permission = args.get(2); - - Account account = Grasscutter.getGameServer().getAccountByName(username); - if (account == null) { - CommandHandler.sendMessage(sender, "Account not found."); - return; - } - - switch (action) { - default: - CommandHandler.sendMessage(sender, "Usage: permission "); - break; - case "add": - if (account.addPermission(permission)) { - CommandHandler.sendMessage(sender, "Permission added."); - } else CommandHandler.sendMessage(sender, "They already have this permission!"); - break; - case "remove": - if (account.removePermission(permission)) { - CommandHandler.sendMessage(sender, "Permission removed."); - } else CommandHandler.sendMessage(sender, "They don't have this permission!"); - break; - } - - account.save(); - } +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.Account; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "permission", usage = "permission ", + description = "Grants or removes a permission for a user", permission = "*") +public final class PermissionCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (args.size() < 3) { + CommandHandler.sendMessage(sender, "Usage: permission "); + return; + } + + String action = args.get(0); + String username = args.get(1); + String permission = args.get(2); + + Account account = Grasscutter.getGameServer().getAccountByName(username); + if (account == null) { + CommandHandler.sendMessage(sender, "Account not found."); + return; + } + + switch (action) { + default: + CommandHandler.sendMessage(sender, "Usage: permission "); + break; + case "add": + if (account.addPermission(permission)) { + CommandHandler.sendMessage(sender, "Permission added."); + } else CommandHandler.sendMessage(sender, "They already have this permission!"); + break; + case "remove": + if (account.removePermission(permission)) { + CommandHandler.sendMessage(sender, "Permission removed."); + } else CommandHandler.sendMessage(sender, "They don't have this permission!"); + break; + } + + account.save(); + } } \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/command/commands/Pos.java b/src/main/java/emu/grasscutter/command/commands/PositionCommand.java similarity index 82% rename from src/main/java/emu/grasscutter/command/commands/Pos.java rename to src/main/java/emu/grasscutter/command/commands/PositionCommand.java index 3f1d40c9d..639301c7f 100644 --- a/src/main/java/emu/grasscutter/command/commands/Pos.java +++ b/src/main/java/emu/grasscutter/command/commands/PositionCommand.java @@ -1,22 +1,22 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "pos", usage = "pos", - description = "Get coordinates.") -public class Pos implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; - } - - sender.dropMessage(String.format("Coord: %.3f, %.3f, %.3f", sender.getPos().getX(), sender.getPos().getY(), sender.getPos().getZ())); - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "position", usage = "position", aliases = {"pos"}, + description = "Get coordinates.") +public final class PositionCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + sender.dropMessage(String.format("Coord: %.3f, %.3f, %.3f", sender.getPos().getX(), sender.getPos().getY(), sender.getPos().getZ())); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Reload.java b/src/main/java/emu/grasscutter/command/commands/ReloadCommand.java similarity index 91% rename from src/main/java/emu/grasscutter/command/commands/Reload.java rename to src/main/java/emu/grasscutter/command/commands/ReloadCommand.java index cf2bae2b1..b145aaf94 100644 --- a/src/main/java/emu/grasscutter/command/commands/Reload.java +++ b/src/main/java/emu/grasscutter/command/commands/ReloadCommand.java @@ -1,22 +1,22 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "reload", usage = "reload", - description = "Reload server config", permission = "server.reload") -public class Reload implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - CommandHandler.sendMessage(sender, "Reloading config."); - Grasscutter.loadConfig(); - Grasscutter.getGameServer().getGachaManager().load(); - Grasscutter.getDispatchServer().loadQueries(); - CommandHandler.sendMessage(sender, "Reload complete."); - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "reload", usage = "reload", + description = "Reload server config", permission = "server.reload") +public final class ReloadCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + CommandHandler.sendMessage(sender, "Reloading config."); + Grasscutter.loadConfig(); + Grasscutter.getGameServer().getGachaManager().load(); + Grasscutter.getDispatchServer().loadQueries(); + CommandHandler.sendMessage(sender, "Reload complete."); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/ResetConst.java b/src/main/java/emu/grasscutter/command/commands/ResetConstCommand.java similarity index 94% rename from src/main/java/emu/grasscutter/command/commands/ResetConst.java rename to src/main/java/emu/grasscutter/command/commands/ResetConstCommand.java index 027e6addd..77f16f9b8 100644 --- a/src/main/java/emu/grasscutter/command/commands/ResetConst.java +++ b/src/main/java/emu/grasscutter/command/commands/ResetConstCommand.java @@ -1,45 +1,45 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.avatar.GenshinAvatar; -import emu.grasscutter.game.entity.EntityAvatar; - -import java.util.List; - -@Command(label = "resetconst", usage = "resetconst [all]", - description = "Resets the constellation level on your current active character, will need to relog after using the command to see any changes.", - aliases = {"resetconstellation"}, permission = "player.resetconstellation") -public class ResetConst implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; - } - - if (args.size() > 0 && args.get(0).equalsIgnoreCase("all")) { - sender.getAvatars().forEach(this::resetConstellation); - sender.dropMessage("Reset all avatars' constellations."); - } else { - EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); - if (entity == null) { - return; - } - - GenshinAvatar avatar = entity.getAvatar(); - this.resetConstellation(avatar); - - sender.dropMessage("Constellations for " + avatar.getAvatarData().getName() + " have been reset. Please relog to see changes."); - } - } - - private void resetConstellation(GenshinAvatar avatar) { - avatar.getTalentIdList().clear(); - avatar.setCoreProudSkillLevel(0); - avatar.recalcStats(); - avatar.save(); - } +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.avatar.GenshinAvatar; +import emu.grasscutter.game.entity.EntityAvatar; + +import java.util.List; + +@Command(label = "resetconst", usage = "resetconst [all]", + description = "Resets the constellation level on your current active character, will need to relog after using the command to see any changes.", + aliases = {"resetconstellation"}, permission = "player.resetconstellation") +public final class ResetConstCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + if (args.size() > 0 && args.get(0).equalsIgnoreCase("all")) { + sender.getAvatars().forEach(this::resetConstellation); + sender.dropMessage("Reset all avatars' constellations."); + } else { + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + if (entity == null) { + return; + } + + GenshinAvatar avatar = entity.getAvatar(); + this.resetConstellation(avatar); + + sender.dropMessage("Constellations for " + avatar.getAvatarData().getName() + " have been reset. Please relog to see changes."); + } + } + + private void resetConstellation(GenshinAvatar avatar) { + avatar.getTalentIdList().clear(); + avatar.setCoreProudSkillLevel(0); + avatar.recalcStats(); + avatar.save(); + } } \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/command/commands/Restart.java b/src/main/java/emu/grasscutter/command/commands/RestartCommand.java similarity index 86% rename from src/main/java/emu/grasscutter/command/commands/Restart.java rename to src/main/java/emu/grasscutter/command/commands/RestartCommand.java index a00e8af67..cf40fa9bd 100644 --- a/src/main/java/emu/grasscutter/command/commands/Restart.java +++ b/src/main/java/emu/grasscutter/command/commands/RestartCommand.java @@ -1,16 +1,16 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "restart", usage = "restart - Restarts the current session") -public class Restart implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - sender.getSession().close(); - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "restart", usage = "restart - Restarts the current session") +public final class RestartCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + sender.getSession().close(); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/SendMessage.java b/src/main/java/emu/grasscutter/command/commands/SendMessageCommand.java similarity index 93% rename from src/main/java/emu/grasscutter/command/commands/SendMessage.java rename to src/main/java/emu/grasscutter/command/commands/SendMessageCommand.java index 9da80ef91..061009c19 100644 --- a/src/main/java/emu/grasscutter/command/commands/SendMessage.java +++ b/src/main/java/emu/grasscutter/command/commands/SendMessageCommand.java @@ -1,37 +1,37 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "say", usage = "say ", description = "Sends a message to a player as the server", - aliases = {"sendservmsg", "sendservermessage", "sendmessage"}, permission = "server.sendmessage") -public class SendMessage implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (args.size() < 2) { - CommandHandler.sendMessage(null, "Usage: sendmessage "); - return; - } - - try { - int target = Integer.parseInt(args.get(0)); - String message = String.join(" ", args.subList(1, args.size())); - - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if (targetPlayer == null) { - CommandHandler.sendMessage(sender, "Player not found."); - return; - } - - CommandHandler.sendMessage(targetPlayer, message); - CommandHandler.sendMessage(sender, "Message sent."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid player ID."); - } - } +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "say", usage = "say ", description = "Sends a message to a player as the server", + aliases = {"sendservmsg", "sendservermessage", "sendmessage"}, permission = "server.sendmessage") +public final class SendMessageCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: sendmessage "); + return; + } + + try { + int target = Integer.parseInt(args.get(0)); + String message = String.join(" ", args.subList(1, args.size())); + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + if (targetPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found."); + return; + } + + CommandHandler.sendMessage(targetPlayer, message); + CommandHandler.sendMessage(sender, "Message sent."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid player ID."); + } + } } \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/command/commands/SetStats.java b/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java similarity index 97% rename from src/main/java/emu/grasscutter/command/commands/SetStats.java rename to src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java index f8cac4bf4..30e8c9f12 100644 --- a/src/main/java/emu/grasscutter/command/commands/SetStats.java +++ b/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java @@ -1,120 +1,120 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.entity.EntityAvatar; -import emu.grasscutter.game.props.FightProperty; -import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; - -import java.util.List; - -@Command(label = "setstats", usage = "setstats ", - aliases = {"stats"}) -public class SetStats implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; - } - - String stat = args.get(0); - switch (stat) { - default: - CommandHandler.sendMessage(sender, "Usage: setstats|stats "); - return; - case "hp": - try { - int health = Integer.parseInt(args.get(1)); - EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); - entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); - CommandHandler.sendMessage(sender, "HP set to " + health + "."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid HP value."); - return; - } - break; - case "def": - try { - int def = Integer.parseInt(args.get(1)); - EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); - entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_DEFENSE, def); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_DEFENSE)); - CommandHandler.sendMessage(sender, "DEF set to " + def + "."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid DEF value."); - return; - } - break; - case "atk": - try { - int atk = Integer.parseInt(args.get(1)); - EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); - entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_ATTACK, atk); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_ATTACK)); - CommandHandler.sendMessage(sender, "ATK set to " + atk + "."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid ATK value."); - return; - } - break; - case "em": - try { - int em = Integer.parseInt(args.get(1)); - EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); - entity.setFightProperty(FightProperty.FIGHT_PROP_ELEMENT_MASTERY, em); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_ELEMENT_MASTERY)); - CommandHandler.sendMessage(sender, "Elemental Mastery set to " + em + "."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid EM value."); - return; - } - break; - case "er": - try { - float er = Integer.parseInt(args.get(1)); - EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); - float erecharge = er / 10000; - entity.setFightProperty(FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY, erecharge); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY)); - float iger = erecharge * 100; - CommandHandler.sendMessage(sender, "Energy recharge set to " + iger + "%."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid ER value."); - return; - } - break; - case "crate": - try { - float cr = Integer.parseInt(args.get(1)); - EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); - float crate = cr / 10000; - entity.setFightProperty(FightProperty.FIGHT_PROP_CRITICAL, crate); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CRITICAL)); - float igcrate = crate * 100; - CommandHandler.sendMessage(sender, "Crit Rate set to " + igcrate + "%."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid Crit Rate value."); - return; - } - break; - case "cdmg": - try { - float cdmg = Integer.parseInt(args.get(1)); - EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); - float cdamage = cdmg / 10000; - entity.setFightProperty(FightProperty.FIGHT_PROP_CRITICAL_HURT, cdamage); - entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CRITICAL_HURT)); - float igcdmg = cdamage * 100; - CommandHandler.sendMessage(sender, "Crit DMG set to " + igcdmg + "%"); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid Crit DMG value."); - return; - } - break; - } - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.entity.EntityAvatar; +import emu.grasscutter.game.props.FightProperty; +import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; + +import java.util.List; + +@Command(label = "setstats", usage = "setstats ", + aliases = {"stats"}) +public final class SetStatsCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + String stat = args.get(0); + switch (stat) { + default: + CommandHandler.sendMessage(sender, "Usage: setstats|stats "); + return; + case "hp": + try { + int health = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_HP)); + CommandHandler.sendMessage(sender, "HP set to " + health + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid HP value."); + return; + } + break; + case "def": + try { + int def = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_DEFENSE, def); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_DEFENSE)); + CommandHandler.sendMessage(sender, "DEF set to " + def + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid DEF value."); + return; + } + break; + case "atk": + try { + int atk = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_CUR_ATTACK, atk); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CUR_ATTACK)); + CommandHandler.sendMessage(sender, "ATK set to " + atk + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid ATK value."); + return; + } + break; + case "em": + try { + int em = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + entity.setFightProperty(FightProperty.FIGHT_PROP_ELEMENT_MASTERY, em); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_ELEMENT_MASTERY)); + CommandHandler.sendMessage(sender, "Elemental Mastery set to " + em + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid EM value."); + return; + } + break; + case "er": + try { + float er = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float erecharge = er / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY, erecharge); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY)); + float iger = erecharge * 100; + CommandHandler.sendMessage(sender, "Energy recharge set to " + iger + "%."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid ER value."); + return; + } + break; + case "crate": + try { + float cr = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float crate = cr / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_CRITICAL, crate); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CRITICAL)); + float igcrate = crate * 100; + CommandHandler.sendMessage(sender, "Crit Rate set to " + igcrate + "%."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Crit Rate value."); + return; + } + break; + case "cdmg": + try { + float cdmg = Integer.parseInt(args.get(1)); + EntityAvatar entity = sender.getTeamManager().getCurrentAvatarEntity(); + float cdamage = cdmg / 10000; + entity.setFightProperty(FightProperty.FIGHT_PROP_CRITICAL_HURT, cdamage); + entity.getWorld().broadcastPacket(new PacketEntityFightPropUpdateNotify(entity, FightProperty.FIGHT_PROP_CRITICAL_HURT)); + float igcdmg = cdamage * 100; + CommandHandler.sendMessage(sender, "Crit DMG set to " + igcdmg + "%"); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid Crit DMG value."); + return; + } + break; + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/SetWorldLevel.java b/src/main/java/emu/grasscutter/command/commands/SetWorldLevelCommand.java similarity index 93% rename from src/main/java/emu/grasscutter/command/commands/SetWorldLevel.java rename to src/main/java/emu/grasscutter/command/commands/SetWorldLevelCommand.java index 2619ee3b6..146837523 100644 --- a/src/main/java/emu/grasscutter/command/commands/SetWorldLevel.java +++ b/src/main/java/emu/grasscutter/command/commands/SetWorldLevelCommand.java @@ -1,39 +1,39 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.props.PlayerProperty; - -import java.util.List; - -@Command(label = "setworldlevel", usage = "setworldlevel ", - description = "Sets your world level (Relog to see proper effects)", - aliases = {"setworldlvl"}, permission = "player.setworldlevel") -public class SetWorldLevel implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; // TODO: set player's world level from console or other players - } - - if (args.size() < 1) { - CommandHandler.sendMessage(sender, "Usage: setworldlevel "); - return; - } - - try { - int level = Integer.parseInt(args.get(0)); - - // Set in both world and player props - sender.getWorld().setWorldLevel(level); - sender.setProperty(PlayerProperty.PROP_PLAYER_WORLD_LEVEL, level); - - sender.dropMessage("World level set to " + level + "."); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid world level."); - } - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.props.PlayerProperty; + +import java.util.List; + +@Command(label = "setworldlevel", usage = "setworldlevel ", + description = "Sets your world level (Relog to see proper effects)", + aliases = {"setworldlvl"}, permission = "player.setworldlevel") +public final class SetWorldLevelCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; // TODO: set player's world level from console or other players + } + + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: setworldlevel "); + return; + } + + try { + int level = Integer.parseInt(args.get(0)); + + // Set in both world and player props + sender.getWorld().setWorldLevel(level); + sender.setProperty(PlayerProperty.PROP_PLAYER_WORLD_LEVEL, level); + + sender.dropMessage("World level set to " + level + "."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid world level."); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Spawn.java b/src/main/java/emu/grasscutter/command/commands/SpawnCommand.java similarity index 95% rename from src/main/java/emu/grasscutter/command/commands/Spawn.java rename to src/main/java/emu/grasscutter/command/commands/SpawnCommand.java index 5a3fc2b9c..969872119 100644 --- a/src/main/java/emu/grasscutter/command/commands/Spawn.java +++ b/src/main/java/emu/grasscutter/command/commands/SpawnCommand.java @@ -1,51 +1,51 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.data.GenshinData; -import emu.grasscutter.data.def.MonsterData; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.entity.EntityMonster; -import emu.grasscutter.utils.Position; - -import java.util.List; - -@Command(label = "spawn", usage = "spawn [level] [amount]", - description = "Spawns an entity near you", permission = "server.spawn") -public class Spawn implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; - } - - if (args.size() < 1) { - CommandHandler.sendMessage(sender, "Usage: spawn [amount]"); - return; - } - - try { - int entity = Integer.parseInt(args.get(0)); - int level = args.size() > 1 ? Integer.parseInt(args.get(1)) : 1; - int amount = args.size() > 2 ? Integer.parseInt(args.get(2)) : 1; - - MonsterData entityData = GenshinData.getMonsterDataMap().get(entity); - if (entityData == null) { - CommandHandler.sendMessage(sender, "Invalid entity id."); - return; - } - - float range = (5f + (.1f * amount)); - for (int i = 0; i < amount; i++) { - Position pos = sender.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); - EntityMonster monster = new EntityMonster(sender.getScene(), entityData, pos, level); - sender.getScene().addEntity(monster); - } - CommandHandler.sendMessage(sender, String.format("Spawned %s of %s.", amount, entity)); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid item or player ID."); - } - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.data.GenshinData; +import emu.grasscutter.data.def.MonsterData; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.entity.EntityMonster; +import emu.grasscutter.utils.Position; + +import java.util.List; + +@Command(label = "spawn", usage = "spawn [level] [amount]", + description = "Spawns an entity near you", permission = "server.spawn") +public final class SpawnCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: spawn [amount]"); + return; + } + + try { + int entity = Integer.parseInt(args.get(0)); + int level = args.size() > 1 ? Integer.parseInt(args.get(1)) : 1; + int amount = args.size() > 2 ? Integer.parseInt(args.get(2)) : 1; + + MonsterData entityData = GenshinData.getMonsterDataMap().get(entity); + if (entityData == null) { + CommandHandler.sendMessage(sender, "Invalid entity id."); + return; + } + + float range = (5f + (.1f * amount)); + for (int i = 0; i < amount; i++) { + Position pos = sender.getPos().clone().addX((float) (Math.random() * range) - (range / 2)).addY(3f).addZ((float) (Math.random() * range) - (range / 2)); + EntityMonster monster = new EntityMonster(sender.getScene(), entityData, pos, level); + sender.getScene().addEntity(monster); + } + CommandHandler.sendMessage(sender, String.format("Spawned %s of %s.", amount, entity)); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid item or player ID."); + } + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Stop.java b/src/main/java/emu/grasscutter/command/commands/StopCommand.java similarity index 90% rename from src/main/java/emu/grasscutter/command/commands/Stop.java rename to src/main/java/emu/grasscutter/command/commands/StopCommand.java index a76e33435..4b63cd44e 100644 --- a/src/main/java/emu/grasscutter/command/commands/Stop.java +++ b/src/main/java/emu/grasscutter/command/commands/StopCommand.java @@ -1,23 +1,23 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; - -import java.util.List; - -@Command(label = "stop", usage = "stop", - description = "Stops the server", permission = "server.stop") -public class Stop implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - CommandHandler.sendMessage(null, "Server shutting down..."); - for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { - CommandHandler.sendMessage(p, "Server shutting down..."); - } - - System.exit(1); - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; + +@Command(label = "stop", usage = "stop", + description = "Stops the server", permission = "server.stop") +public final class StopCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + CommandHandler.sendMessage(null, "Server shutting down..."); + for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { + CommandHandler.sendMessage(p, "Server shutting down..."); + } + + System.exit(1); + } +} diff --git a/src/main/java/emu/grasscutter/command/commands/Weather.java b/src/main/java/emu/grasscutter/command/commands/WeatherCommand.java similarity index 93% rename from src/main/java/emu/grasscutter/command/commands/Weather.java rename to src/main/java/emu/grasscutter/command/commands/WeatherCommand.java index ff3c77044..919432ed1 100644 --- a/src/main/java/emu/grasscutter/command/commands/Weather.java +++ b/src/main/java/emu/grasscutter/command/commands/WeatherCommand.java @@ -1,39 +1,39 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.props.ClimateType; -import emu.grasscutter.server.packet.send.PacketSceneAreaWeatherNotify; - -import java.util.List; - -@Command(label = "weather", usage = "weather ", - description = "Changes the weather.", aliases = {"w"}, permission = "player.weather") -public class Weather implements CommandHandler { - - @Override - public void execute(GenshinPlayer sender, List args) { - if (sender == null) { - CommandHandler.sendMessage(null, "Run this command in-game."); - return; - } - - if (args.size() < 1) { - CommandHandler.sendMessage(sender, "Usage: weather "); - return; - } - - try { - int weatherId = Integer.parseInt(args.get(0)); - - ClimateType climate = ClimateType.getTypeByValue(weatherId); - - sender.getScene().setClimate(climate); - sender.getScene().broadcastPacket(new PacketSceneAreaWeatherNotify(sender)); - CommandHandler.sendMessage(sender, "Changed weather to " + weatherId); - } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid weather ID."); - } - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.props.ClimateType; +import emu.grasscutter.server.packet.send.PacketSceneAreaWeatherNotify; + +import java.util.List; + +@Command(label = "weather", usage = "weather ", + description = "Changes the weather.", aliases = {"w"}, permission = "player.weather") +public final class WeatherCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + + if (args.size() < 1) { + CommandHandler.sendMessage(sender, "Usage: weather "); + return; + } + + try { + int weatherId = Integer.parseInt(args.get(0)); + + ClimateType climate = ClimateType.getTypeByValue(weatherId); + + sender.getScene().setClimate(climate); + sender.getScene().broadcastPacket(new PacketSceneAreaWeatherNotify(sender)); + CommandHandler.sendMessage(sender, "Changed weather to " + weatherId); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid weather ID."); + } + } +} From 56d693331955bfebaee2e4001e40dca40382fc96 Mon Sep 17 00:00:00 2001 From: JuliusP <93566768+JuliusPtolemy@users.noreply.github.com> Date: Thu, 21 Apr 2022 08:56:15 +0800 Subject: [PATCH 060/119] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aedab22f2..299093c4c 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ There is a dummy user named "Server" in every player's friends list that you can `!resetconst` - Resets the constellation level on your current active character, will need to relog after using the command to see any changes. -`!sethp [hp]` +`!setstats [stat] [value]` `!clearartifacts` - Deletes all unequipped and unlocked level 0 artifacts, **including yellow rarity ones** from your inventory From baf392e476c4a7b7612f977ec3d37c7f60f7218d Mon Sep 17 00:00:00 2001 From: JuliusP <93566768+JuliusPtolemy@users.noreply.github.com> Date: Thu, 21 Apr 2022 08:57:32 +0800 Subject: [PATCH 061/119] Delete add-to-wiki directory --- add-to-wiki/resources-fun.md | 78 ------------------------------------ 1 file changed, 78 deletions(-) delete mode 100644 add-to-wiki/resources-fun.md diff --git a/add-to-wiki/resources-fun.md b/add-to-wiki/resources-fun.md deleted file mode 100644 index 6b1afea25..000000000 --- a/add-to-wiki/resources-fun.md +++ /dev/null @@ -1,78 +0,0 @@ -# Fun -## Prerequisites -- [MongoDBCompass](https://www.mongodb.com/try/download/compass) - -*** - -### Colored nickname and signature :peacock: ([written by](https://github.com/actuallyeunha)) -Unity supports colored text by default (See [Unity Manual](https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/StyledText.html) for more info) - -By replacing them with `text` or `text` you can change most, if not all, strings' colors. - - -1. Open MongoDBCompass and connect to your db -2. Go to `grasscutter/players` -3. Make your changes. *Change it inside `playerProfile` too!*
- e.g `nickname: "na.na"`;
- `signature: "Running on Grasscutter!"` -4. Update the document -5. Relog to see changes - -Enjoy your colorful name :sparkles: - - -*** -## Avatar/Character -This guide is recommended if you have the character/weapon. If you want to get a character at Level Z, then use !givechar [avatarID] [level] -### Changing Level/Ascension/Talents -> Make sure you have created an account with the avatars/characters. -1. Open **MongoDBCompass** -2. Connect to the host (default URI is `mongodb://localhost:27017`) -3. Navigate to Databases > `grasscutter` > `avatars` -4. (Optional) Set **View** to `JSON View` -5. In the **Filter** field, type `{ avatarId: X }` where `X` is the Avatar ID that you are trying to modify. **Avatar IDs are 8-digits.** -6. Click the **Find** next to the field. -7. After the documents have been filtered, edit the document - 1. To change character **level**, change the value next to `"level"` - 2. To change character **ascension**, change the value next to `"promoteLevel"` - Check [Wiki](https://genshin-impact.fandom.com/wiki/Characters#:~:text=one%20Acquaint%20Fate.-,Ascension%20Phase,-Max%20Char.%20Level) for ascension values - 3. To change **talents**, expand `"proudSkillList"` - 1. To unlock the avatar's **1st Ascension Passive**, add XX2101 inside `"proudSkillList"`, where **XX is the last 2 digits of the Avatar ID**. **Make sure to add a `,` for each line.** - 2. To unlock the avatar's **4th Ascension Passive**, do the same as before, but replace `2101` with `2201`. -8. After editing, you can now **Replace**. - -### Example -A document in JSON view that has the Avatar ID 10000058, level 90, ascension phase 6, all talents unlocked. - - - - -### Notes -- On the last line of `"proudSkillList"`, a `,` is no longer needed. -- After replacing the document, make sure to restart the server for changes to take effect. - - -## Weapons -> Make sure you have created an account with the weapons. -1. Open **MongoDBCompass** -2. Connect to the host (default URI is `mongodb://localhost:27017`) -3. Navigate to Databases > `grasscutter` > `items` -4. (Optional) Set **View** to `JSON View` -5. In the **Filter** field, type `{ itemId: Y }` where `Y` is the Item/Weapon ID that you are trying to modify. **Weapon IDs are 5 digits.** -6. Click the **Find** next to the field. -7. After the documents have been filtered, edit the document - 1. To change weapon **level**, change the value next to `"level"` - 2. To change weapon **ascension**, change the value next to `"promoteLevel"` - Check [Wiki](https://genshin-impact.fandom.com/wiki/Weapons#:~:text=reaching%202nd%20Ascension.-,Ascension%20Phase,-Max%20Weapon%20Level) for ascension values - 3. To change **refinement**, change the value next to `"refinement"` - * Refinement Rank 1 = 0 - * Refinement Rank 2 = 1 - * Refinement Rank 3 = 2 - * Refinement Rank 4 = 3 - * Refinement Rank 5 = 4 -8. After editing, you can now **Replace**. - -### Example -A document in JSON view that has the Weapon ID 12503, level 90, ascension phase 6, refinement rank 5. - - From eb466ffec041e5d0b39ef14e26fb43a4a0446418 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Wed, 20 Apr 2022 18:37:07 -0700 Subject: [PATCH 062/119] Fix water and the visual map in archipelago --- .../server/packet/send/PacketSceneUnlockInfoNotify.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneUnlockInfoNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneUnlockInfoNotify.java index 857f9879c..fb45bb361 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneUnlockInfoNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneUnlockInfoNotify.java @@ -13,7 +13,7 @@ public class PacketSceneUnlockInfoNotify extends GenshinPacket { SceneUnlockInfoNotify proto = SceneUnlockInfoNotify.newBuilder() .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(1)) .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(3)) - .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(4)) + .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(4).addSceneTagIdList(106).addSceneTagIdList(109)) .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(5)) .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(6)) .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(7)) From 268a0f94ce8c8884319ec90f4c229c6111f5c41b Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Wed, 20 Apr 2022 18:44:02 -0700 Subject: [PATCH 063/119] Fix player location updates in co-op --- .../emu/grasscutter/game/GenshinPlayer.java | 26 +- .../WorldPlayerLocationInfoOuterClass.java | 743 ++++++++++++++++++ .../WorldPlayerLocationNotifyOuterClass.java | 144 ++-- .../packet/recv/HandlerEnterSceneDoneReq.java | 5 +- .../send/PacketScenePlayerLocationNotify.java | 7 +- .../send/PacketWorldPlayerLocationNotify.java | 2 +- 6 files changed, 849 insertions(+), 78 deletions(-) create mode 100644 src/main/java/emu/grasscutter/net/proto/WorldPlayerLocationInfoOuterClass.java diff --git a/src/main/java/emu/grasscutter/game/GenshinPlayer.java b/src/main/java/emu/grasscutter/game/GenshinPlayer.java index 1d8650e54..b60a5e7ac 100644 --- a/src/main/java/emu/grasscutter/game/GenshinPlayer.java +++ b/src/main/java/emu/grasscutter/game/GenshinPlayer.java @@ -31,6 +31,7 @@ import emu.grasscutter.net.proto.OnlinePlayerInfoOuterClass.OnlinePlayerInfo; import emu.grasscutter.net.proto.PlayerApplyEnterMpReasonOuterClass.PlayerApplyEnterMpReason; import emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo; import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail; +import emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo; import emu.grasscutter.server.game.GameServer; import emu.grasscutter.server.game.GameSession; import emu.grasscutter.server.packet.send.PacketAbilityInvocationsNotify; @@ -49,9 +50,11 @@ import emu.grasscutter.server.packet.send.PacketPlayerEnterSceneNotify; import emu.grasscutter.server.packet.send.PacketPlayerPropNotify; import emu.grasscutter.server.packet.send.PacketPlayerStoreNotify; import emu.grasscutter.server.packet.send.PacketPrivateChatNotify; +import emu.grasscutter.server.packet.send.PacketScenePlayerLocationNotify; import emu.grasscutter.server.packet.send.PacketSetNameCardRsp; import emu.grasscutter.server.packet.send.PacketStoreWeightLimitNotify; import emu.grasscutter.server.packet.send.PacketUnlockNameCardNotify; +import emu.grasscutter.server.packet.send.PacketWorldPlayerLocationNotify; import emu.grasscutter.server.packet.send.PacketWorldPlayerRTTNotify; import emu.grasscutter.utils.Position; @@ -101,6 +104,7 @@ public class GenshinPlayer { @Transient private int enterSceneToken; @Transient private SceneLoadState sceneState; @Transient private boolean hasSentAvatarDataNotify; + @Transient private long nextSendPlayerLocTime = 0; @Transient private final Int2ObjectMap coopRequests; @Transient private final InvokeHandler combatInvokeHandler; @@ -654,6 +658,13 @@ public class GenshinPlayer { return social; } + public WorldPlayerLocationInfo getWorldPlayerLocationInfo() { + return WorldPlayerLocationInfo.newBuilder() + .setSceneId(this.getSceneId()) + .setPlayerLoc(this.getPlayerLocationInfo()) + .build(); + } + public PlayerLocationInfo getPlayerLocationInfo() { return PlayerLocationInfo.newBuilder() .setUid(this.getUid()) @@ -679,9 +690,22 @@ public class GenshinPlayer { } // Ping if (this.getWorld() != null) { - this.sendPacket(new PacketWorldPlayerRTTNotify(this.getWorld())); // Player ping + // RTT notify - very important to send this often + this.sendPacket(new PacketWorldPlayerRTTNotify(this.getWorld())); + + // Update player locations if in multiplayer every 5 seconds + long time = System.currentTimeMillis(); + if (this.getWorld().isMultiplayer() && this.getScene() != null && time > nextSendPlayerLocTime) { + this.sendPacket(new PacketWorldPlayerLocationNotify(this.getWorld())); + this.sendPacket(new PacketScenePlayerLocationNotify(this.getScene())); + this.resetSendPlayerLocTime(); + } } } + + public void resetSendPlayerLocTime() { + this.nextSendPlayerLocTime = System.currentTimeMillis() + 5000; + } @PostLoad private void onLoad() { diff --git a/src/main/java/emu/grasscutter/net/proto/WorldPlayerLocationInfoOuterClass.java b/src/main/java/emu/grasscutter/net/proto/WorldPlayerLocationInfoOuterClass.java new file mode 100644 index 000000000..b8c634fd1 --- /dev/null +++ b/src/main/java/emu/grasscutter/net/proto/WorldPlayerLocationInfoOuterClass.java @@ -0,0 +1,743 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: WorldPlayerLocationInfo.proto + +package emu.grasscutter.net.proto; + +public final class WorldPlayerLocationInfoOuterClass { + private WorldPlayerLocationInfoOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface WorldPlayerLocationInfoOrBuilder extends + // @@protoc_insertion_point(interface_extends:WorldPlayerLocationInfo) + com.google.protobuf.MessageOrBuilder { + + /** + * uint32 sceneId = 1; + * @return The sceneId. + */ + int getSceneId(); + + /** + * .PlayerLocationInfo playerLoc = 2; + * @return Whether the playerLoc field is set. + */ + boolean hasPlayerLoc(); + /** + * .PlayerLocationInfo playerLoc = 2; + * @return The playerLoc. + */ + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo getPlayerLoc(); + /** + * .PlayerLocationInfo playerLoc = 2; + */ + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder getPlayerLocOrBuilder(); + } + /** + * Protobuf type {@code WorldPlayerLocationInfo} + */ + public static final class WorldPlayerLocationInfo extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:WorldPlayerLocationInfo) + WorldPlayerLocationInfoOrBuilder { + private static final long serialVersionUID = 0L; + // Use WorldPlayerLocationInfo.newBuilder() to construct. + private WorldPlayerLocationInfo(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private WorldPlayerLocationInfo() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new WorldPlayerLocationInfo(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private WorldPlayerLocationInfo( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + + sceneId_ = input.readUInt32(); + break; + } + case 18: { + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder subBuilder = null; + if (playerLoc_ != null) { + subBuilder = playerLoc_.toBuilder(); + } + playerLoc_ = input.readMessage(emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(playerLoc_); + playerLoc_ = subBuilder.buildPartial(); + } + + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.internal_static_WorldPlayerLocationInfo_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.internal_static_WorldPlayerLocationInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.class, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder.class); + } + + public static final int SCENEID_FIELD_NUMBER = 1; + private int sceneId_; + /** + * uint32 sceneId = 1; + * @return The sceneId. + */ + @java.lang.Override + public int getSceneId() { + return sceneId_; + } + + public static final int PLAYERLOC_FIELD_NUMBER = 2; + private emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo playerLoc_; + /** + * .PlayerLocationInfo playerLoc = 2; + * @return Whether the playerLoc field is set. + */ + @java.lang.Override + public boolean hasPlayerLoc() { + return playerLoc_ != null; + } + /** + * .PlayerLocationInfo playerLoc = 2; + * @return The playerLoc. + */ + @java.lang.Override + public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo getPlayerLoc() { + return playerLoc_ == null ? emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.getDefaultInstance() : playerLoc_; + } + /** + * .PlayerLocationInfo playerLoc = 2; + */ + @java.lang.Override + public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder getPlayerLocOrBuilder() { + return getPlayerLoc(); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (sceneId_ != 0) { + output.writeUInt32(1, sceneId_); + } + if (playerLoc_ != null) { + output.writeMessage(2, getPlayerLoc()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (sceneId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, sceneId_); + } + if (playerLoc_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getPlayerLoc()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo)) { + return super.equals(obj); + } + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo other = (emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo) obj; + + if (getSceneId() + != other.getSceneId()) return false; + if (hasPlayerLoc() != other.hasPlayerLoc()) return false; + if (hasPlayerLoc()) { + if (!getPlayerLoc() + .equals(other.getPlayerLoc())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SCENEID_FIELD_NUMBER; + hash = (53 * hash) + getSceneId(); + if (hasPlayerLoc()) { + hash = (37 * hash) + PLAYERLOC_FIELD_NUMBER; + hash = (53 * hash) + getPlayerLoc().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code WorldPlayerLocationInfo} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:WorldPlayerLocationInfo) + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfoOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.internal_static_WorldPlayerLocationInfo_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.internal_static_WorldPlayerLocationInfo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.class, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder.class); + } + + // Construct using emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + sceneId_ = 0; + + if (playerLocBuilder_ == null) { + playerLoc_ = null; + } else { + playerLoc_ = null; + playerLocBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.internal_static_WorldPlayerLocationInfo_descriptor; + } + + @java.lang.Override + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo getDefaultInstanceForType() { + return emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.getDefaultInstance(); + } + + @java.lang.Override + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo build() { + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo buildPartial() { + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo result = new emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo(this); + result.sceneId_ = sceneId_; + if (playerLocBuilder_ == null) { + result.playerLoc_ = playerLoc_; + } else { + result.playerLoc_ = playerLocBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo) { + return mergeFrom((emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo other) { + if (other == emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.getDefaultInstance()) return this; + if (other.getSceneId() != 0) { + setSceneId(other.getSceneId()); + } + if (other.hasPlayerLoc()) { + mergePlayerLoc(other.getPlayerLoc()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int sceneId_ ; + /** + * uint32 sceneId = 1; + * @return The sceneId. + */ + @java.lang.Override + public int getSceneId() { + return sceneId_; + } + /** + * uint32 sceneId = 1; + * @param value The sceneId to set. + * @return This builder for chaining. + */ + public Builder setSceneId(int value) { + + sceneId_ = value; + onChanged(); + return this; + } + /** + * uint32 sceneId = 1; + * @return This builder for chaining. + */ + public Builder clearSceneId() { + + sceneId_ = 0; + onChanged(); + return this; + } + + private emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo playerLoc_; + private com.google.protobuf.SingleFieldBuilderV3< + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder> playerLocBuilder_; + /** + * .PlayerLocationInfo playerLoc = 2; + * @return Whether the playerLoc field is set. + */ + public boolean hasPlayerLoc() { + return playerLocBuilder_ != null || playerLoc_ != null; + } + /** + * .PlayerLocationInfo playerLoc = 2; + * @return The playerLoc. + */ + public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo getPlayerLoc() { + if (playerLocBuilder_ == null) { + return playerLoc_ == null ? emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.getDefaultInstance() : playerLoc_; + } else { + return playerLocBuilder_.getMessage(); + } + } + /** + * .PlayerLocationInfo playerLoc = 2; + */ + public Builder setPlayerLoc(emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo value) { + if (playerLocBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + playerLoc_ = value; + onChanged(); + } else { + playerLocBuilder_.setMessage(value); + } + + return this; + } + /** + * .PlayerLocationInfo playerLoc = 2; + */ + public Builder setPlayerLoc( + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder builderForValue) { + if (playerLocBuilder_ == null) { + playerLoc_ = builderForValue.build(); + onChanged(); + } else { + playerLocBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * .PlayerLocationInfo playerLoc = 2; + */ + public Builder mergePlayerLoc(emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo value) { + if (playerLocBuilder_ == null) { + if (playerLoc_ != null) { + playerLoc_ = + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.newBuilder(playerLoc_).mergeFrom(value).buildPartial(); + } else { + playerLoc_ = value; + } + onChanged(); + } else { + playerLocBuilder_.mergeFrom(value); + } + + return this; + } + /** + * .PlayerLocationInfo playerLoc = 2; + */ + public Builder clearPlayerLoc() { + if (playerLocBuilder_ == null) { + playerLoc_ = null; + onChanged(); + } else { + playerLoc_ = null; + playerLocBuilder_ = null; + } + + return this; + } + /** + * .PlayerLocationInfo playerLoc = 2; + */ + public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder getPlayerLocBuilder() { + + onChanged(); + return getPlayerLocFieldBuilder().getBuilder(); + } + /** + * .PlayerLocationInfo playerLoc = 2; + */ + public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder getPlayerLocOrBuilder() { + if (playerLocBuilder_ != null) { + return playerLocBuilder_.getMessageOrBuilder(); + } else { + return playerLoc_ == null ? + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.getDefaultInstance() : playerLoc_; + } + } + /** + * .PlayerLocationInfo playerLoc = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder> + getPlayerLocFieldBuilder() { + if (playerLocBuilder_ == null) { + playerLocBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder>( + getPlayerLoc(), + getParentForChildren(), + isClean()); + playerLoc_ = null; + } + return playerLocBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:WorldPlayerLocationInfo) + } + + // @@protoc_insertion_point(class_scope:WorldPlayerLocationInfo) + private static final emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo(); + } + + public static emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public WorldPlayerLocationInfo parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new WorldPlayerLocationInfo(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_WorldPlayerLocationInfo_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_WorldPlayerLocationInfo_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\035WorldPlayerLocationInfo.proto\032\030PlayerL" + + "ocationInfo.proto\"R\n\027WorldPlayerLocation" + + "Info\022\017\n\007sceneId\030\001 \001(\r\022&\n\tplayerLoc\030\002 \001(\013" + + "2\023.PlayerLocationInfoB\033\n\031emu.grasscutter" + + ".net.protob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.getDescriptor(), + }); + internal_static_WorldPlayerLocationInfo_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_WorldPlayerLocationInfo_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_WorldPlayerLocationInfo_descriptor, + new java.lang.String[] { "SceneId", "PlayerLoc", }); + emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/src/main/java/emu/grasscutter/net/proto/WorldPlayerLocationNotifyOuterClass.java b/src/main/java/emu/grasscutter/net/proto/WorldPlayerLocationNotifyOuterClass.java index fb3321673..89859a9d1 100644 --- a/src/main/java/emu/grasscutter/net/proto/WorldPlayerLocationNotifyOuterClass.java +++ b/src/main/java/emu/grasscutter/net/proto/WorldPlayerLocationNotifyOuterClass.java @@ -19,27 +19,27 @@ public final class WorldPlayerLocationNotifyOuterClass { com.google.protobuf.MessageOrBuilder { /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - java.util.List + java.util.List getPlayerLocListList(); /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo getPlayerLocList(int index); + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo getPlayerLocList(int index); /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ int getPlayerLocListCount(); /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - java.util.List + java.util.List getPlayerLocListOrBuilderList(); /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder getPlayerLocListOrBuilder( + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfoOrBuilder getPlayerLocListOrBuilder( int index); } /** @@ -89,13 +89,13 @@ public final class WorldPlayerLocationNotifyOuterClass { case 0: done = true; break; - case 10: { + case 18: { if (!((mutable_bitField0_ & 0x00000001) != 0)) { - playerLocList_ = new java.util.ArrayList(); + playerLocList_ = new java.util.ArrayList(); mutable_bitField0_ |= 0x00000001; } playerLocList_.add( - input.readMessage(emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.parser(), extensionRegistry)); + input.readMessage(emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.parser(), extensionRegistry)); break; } default: { @@ -133,42 +133,42 @@ public final class WorldPlayerLocationNotifyOuterClass { emu.grasscutter.net.proto.WorldPlayerLocationNotifyOuterClass.WorldPlayerLocationNotify.class, emu.grasscutter.net.proto.WorldPlayerLocationNotifyOuterClass.WorldPlayerLocationNotify.Builder.class); } - public static final int PLAYERLOCLIST_FIELD_NUMBER = 1; - private java.util.List playerLocList_; + public static final int PLAYERLOCLIST_FIELD_NUMBER = 2; + private java.util.List playerLocList_; /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ @java.lang.Override - public java.util.List getPlayerLocListList() { + public java.util.List getPlayerLocListList() { return playerLocList_; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ @java.lang.Override - public java.util.List + public java.util.List getPlayerLocListOrBuilderList() { return playerLocList_; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ @java.lang.Override public int getPlayerLocListCount() { return playerLocList_.size(); } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ @java.lang.Override - public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo getPlayerLocList(int index) { + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo getPlayerLocList(int index) { return playerLocList_.get(index); } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ @java.lang.Override - public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder getPlayerLocListOrBuilder( + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfoOrBuilder getPlayerLocListOrBuilder( int index) { return playerLocList_.get(index); } @@ -188,7 +188,7 @@ public final class WorldPlayerLocationNotifyOuterClass { public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { for (int i = 0; i < playerLocList_.size(); i++) { - output.writeMessage(1, playerLocList_.get(i)); + output.writeMessage(2, playerLocList_.get(i)); } unknownFields.writeTo(output); } @@ -201,7 +201,7 @@ public final class WorldPlayerLocationNotifyOuterClass { size = 0; for (int i = 0; i < playerLocList_.size(); i++) { size += com.google.protobuf.CodedOutputStream - .computeMessageSize(1, playerLocList_.get(i)); + .computeMessageSize(2, playerLocList_.get(i)); } size += unknownFields.getSerializedSize(); memoizedSize = size; @@ -515,22 +515,22 @@ public final class WorldPlayerLocationNotifyOuterClass { } private int bitField0_; - private java.util.List playerLocList_ = + private java.util.List playerLocList_ = java.util.Collections.emptyList(); private void ensurePlayerLocListIsMutable() { if (!((bitField0_ & 0x00000001) != 0)) { - playerLocList_ = new java.util.ArrayList(playerLocList_); + playerLocList_ = new java.util.ArrayList(playerLocList_); bitField0_ |= 0x00000001; } } private com.google.protobuf.RepeatedFieldBuilderV3< - emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder> playerLocListBuilder_; + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfoOrBuilder> playerLocListBuilder_; /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - public java.util.List getPlayerLocListList() { + public java.util.List getPlayerLocListList() { if (playerLocListBuilder_ == null) { return java.util.Collections.unmodifiableList(playerLocList_); } else { @@ -538,7 +538,7 @@ public final class WorldPlayerLocationNotifyOuterClass { } } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ public int getPlayerLocListCount() { if (playerLocListBuilder_ == null) { @@ -548,9 +548,9 @@ public final class WorldPlayerLocationNotifyOuterClass { } } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo getPlayerLocList(int index) { + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo getPlayerLocList(int index) { if (playerLocListBuilder_ == null) { return playerLocList_.get(index); } else { @@ -558,10 +558,10 @@ public final class WorldPlayerLocationNotifyOuterClass { } } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ public Builder setPlayerLocList( - int index, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo value) { + int index, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo value) { if (playerLocListBuilder_ == null) { if (value == null) { throw new NullPointerException(); @@ -575,10 +575,10 @@ public final class WorldPlayerLocationNotifyOuterClass { return this; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ public Builder setPlayerLocList( - int index, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder builderForValue) { + int index, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder builderForValue) { if (playerLocListBuilder_ == null) { ensurePlayerLocListIsMutable(); playerLocList_.set(index, builderForValue.build()); @@ -589,9 +589,9 @@ public final class WorldPlayerLocationNotifyOuterClass { return this; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - public Builder addPlayerLocList(emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo value) { + public Builder addPlayerLocList(emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo value) { if (playerLocListBuilder_ == null) { if (value == null) { throw new NullPointerException(); @@ -605,10 +605,10 @@ public final class WorldPlayerLocationNotifyOuterClass { return this; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ public Builder addPlayerLocList( - int index, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo value) { + int index, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo value) { if (playerLocListBuilder_ == null) { if (value == null) { throw new NullPointerException(); @@ -622,10 +622,10 @@ public final class WorldPlayerLocationNotifyOuterClass { return this; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ public Builder addPlayerLocList( - emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder builderForValue) { + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder builderForValue) { if (playerLocListBuilder_ == null) { ensurePlayerLocListIsMutable(); playerLocList_.add(builderForValue.build()); @@ -636,10 +636,10 @@ public final class WorldPlayerLocationNotifyOuterClass { return this; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ public Builder addPlayerLocList( - int index, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder builderForValue) { + int index, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder builderForValue) { if (playerLocListBuilder_ == null) { ensurePlayerLocListIsMutable(); playerLocList_.add(index, builderForValue.build()); @@ -650,10 +650,10 @@ public final class WorldPlayerLocationNotifyOuterClass { return this; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ public Builder addAllPlayerLocList( - java.lang.Iterable values) { + java.lang.Iterable values) { if (playerLocListBuilder_ == null) { ensurePlayerLocListIsMutable(); com.google.protobuf.AbstractMessageLite.Builder.addAll( @@ -665,7 +665,7 @@ public final class WorldPlayerLocationNotifyOuterClass { return this; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ public Builder clearPlayerLocList() { if (playerLocListBuilder_ == null) { @@ -678,7 +678,7 @@ public final class WorldPlayerLocationNotifyOuterClass { return this; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ public Builder removePlayerLocList(int index) { if (playerLocListBuilder_ == null) { @@ -691,16 +691,16 @@ public final class WorldPlayerLocationNotifyOuterClass { return this; } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder getPlayerLocListBuilder( + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder getPlayerLocListBuilder( int index) { return getPlayerLocListFieldBuilder().getBuilder(index); } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder getPlayerLocListOrBuilder( + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfoOrBuilder getPlayerLocListOrBuilder( int index) { if (playerLocListBuilder_ == null) { return playerLocList_.get(index); } else { @@ -708,9 +708,9 @@ public final class WorldPlayerLocationNotifyOuterClass { } } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - public java.util.List + public java.util.List getPlayerLocListOrBuilderList() { if (playerLocListBuilder_ != null) { return playerLocListBuilder_.getMessageOrBuilderList(); @@ -719,33 +719,33 @@ public final class WorldPlayerLocationNotifyOuterClass { } } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder addPlayerLocListBuilder() { + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder addPlayerLocListBuilder() { return getPlayerLocListFieldBuilder().addBuilder( - emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.getDefaultInstance()); + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.getDefaultInstance()); } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - public emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder addPlayerLocListBuilder( + public emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder addPlayerLocListBuilder( int index) { return getPlayerLocListFieldBuilder().addBuilder( - index, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.getDefaultInstance()); + index, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.getDefaultInstance()); } /** - * repeated .PlayerLocationInfo playerLocList = 1; + * repeated .WorldPlayerLocationInfo playerLocList = 2; */ - public java.util.List + public java.util.List getPlayerLocListBuilderList() { return getPlayerLocListFieldBuilder().getBuilderList(); } private com.google.protobuf.RepeatedFieldBuilderV3< - emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder> + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfoOrBuilder> getPlayerLocListFieldBuilder() { if (playerLocListBuilder_ == null) { playerLocListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< - emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo.Builder, emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfoOrBuilder>( + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfo.Builder, emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.WorldPlayerLocationInfoOrBuilder>( playerLocList_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), @@ -821,16 +821,16 @@ public final class WorldPlayerLocationNotifyOuterClass { descriptor; static { java.lang.String[] descriptorData = { - "\n\037WorldPlayerLocationNotify.proto\032\030Playe" + - "rLocationInfo.proto\"G\n\031WorldPlayerLocati" + - "onNotify\022*\n\rplayerLocList\030\001 \003(\0132\023.Player" + - "LocationInfoB\033\n\031emu.grasscutter.net.prot" + - "ob\006proto3" + "\n\037WorldPlayerLocationNotify.proto\032\035World" + + "PlayerLocationInfo.proto\"L\n\031WorldPlayerL" + + "ocationNotify\022/\n\rplayerLocList\030\002 \003(\0132\030.W" + + "orldPlayerLocationInfoB\033\n\031emu.grasscutte" + + "r.net.protob\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { - emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.getDescriptor(), + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.getDescriptor(), }); internal_static_WorldPlayerLocationNotify_descriptor = getDescriptor().getMessageTypes().get(0); @@ -838,7 +838,7 @@ public final class WorldPlayerLocationNotifyOuterClass { com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_WorldPlayerLocationNotify_descriptor, new java.lang.String[] { "PlayerLocList", }); - emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.getDescriptor(); + emu.grasscutter.net.proto.WorldPlayerLocationInfoOuterClass.getDescriptor(); } // @@protoc_insertion_point(outer_class_scope) diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerEnterSceneDoneReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerEnterSceneDoneReq.java index 5b56a39f4..2f7da6884 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerEnterSceneDoneReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerEnterSceneDoneReq.java @@ -31,8 +31,11 @@ public class HandlerEnterSceneDoneReq extends PacketHandler { // Locations session.send(new PacketWorldPlayerLocationNotify(session.getPlayer().getWorld())); - session.send(new PacketScenePlayerLocationNotify(session.getPlayer())); + session.send(new PacketScenePlayerLocationNotify(session.getPlayer().getScene())); session.send(new PacketWorldPlayerRTTNotify(session.getPlayer().getWorld())); + + // Reset timer for sending player locations + session.getPlayer().resetSendPlayerLocTime(); } } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketScenePlayerLocationNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketScenePlayerLocationNotify.java index f6fa9b8f0..2e9fb479d 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketScenePlayerLocationNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketScenePlayerLocationNotify.java @@ -1,19 +1,20 @@ package emu.grasscutter.server.packet.send; import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.GenshinScene; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.ScenePlayerLocationNotifyOuterClass.ScenePlayerLocationNotify; public class PacketScenePlayerLocationNotify extends GenshinPacket { - public PacketScenePlayerLocationNotify(GenshinPlayer player) { + public PacketScenePlayerLocationNotify(GenshinScene scene) { super(PacketOpcodes.ScenePlayerLocationNotify); ScenePlayerLocationNotify.Builder proto = ScenePlayerLocationNotify.newBuilder() - .setSceneId(player.getSceneId()); + .setSceneId(scene.getId()); - for (GenshinPlayer p : player.getWorld().getPlayers()) { + for (GenshinPlayer p : scene.getPlayers()) { proto.addPlayerLocList(p.getPlayerLocationInfo()); } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketWorldPlayerLocationNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketWorldPlayerLocationNotify.java index cb546f0e7..1bb09f8db 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketWorldPlayerLocationNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketWorldPlayerLocationNotify.java @@ -14,7 +14,7 @@ public class PacketWorldPlayerLocationNotify extends GenshinPacket { WorldPlayerLocationNotify.Builder proto = WorldPlayerLocationNotify.newBuilder(); for (GenshinPlayer p : world.getPlayers()) { - proto.addPlayerLocList(p.getPlayerLocationInfo()); + proto.addPlayerLocList(p.getWorldPlayerLocationInfo()); } this.setData(proto); From 434573115c2913e4bc376afae4d9b3decde09e7f Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Wed, 20 Apr 2022 18:48:26 -0700 Subject: [PATCH 064/119] Fix not being able to join friend's world --- .../emu/grasscutter/game/GenshinPlayer.java | 20 +++++++++---------- .../game/friends/PlayerProfile.java | 1 + .../send/PacketGetPlayerFriendListRsp.java | 1 - 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/GenshinPlayer.java b/src/main/java/emu/grasscutter/game/GenshinPlayer.java index b60a5e7ac..c7ac82bc6 100644 --- a/src/main/java/emu/grasscutter/game/GenshinPlayer.java +++ b/src/main/java/emu/grasscutter/game/GenshinPlayer.java @@ -125,6 +125,12 @@ public class GenshinPlayer { } this.properties.put(prop.getId(), 0); } + + this.gachaInfo = new PlayerGachaInfo(); + this.nameCardList = new HashSet<>(); + this.flyCloakList = new HashSet<>(); + this.costumeList = new HashSet<>(); + this.setSceneId(3); this.setRegionId(1); this.sceneState = SceneLoadState.NONE; @@ -144,11 +150,6 @@ public class GenshinPlayer { this.nickname = "Traveler"; this.signature = ""; this.teamManager = new TeamManager(this); - this.gachaInfo = new PlayerGachaInfo(); - this.playerProfile = new PlayerProfile(this); - this.nameCardList = new HashSet<>(); - this.flyCloakList = new HashSet<>(); - this.costumeList = new HashSet<>(); this.setProperty(PlayerProperty.PROP_PLAYER_LEVEL, 1); this.setProperty(PlayerProperty.PROP_IS_SPRING_AUTO_USE, 1); this.setProperty(PlayerProperty.PROP_SPRING_AUTO_USE_PERCENT, 50); @@ -169,6 +170,7 @@ public class GenshinPlayer { public void setUid(int id) { this.id = id; + this.getProfile().syncWithCharacter(this); } public long getNextGenshinGuid() { @@ -720,12 +722,8 @@ public class GenshinPlayer { // Make sure these exist if (this.getTeamManager() == null) { this.teamManager = new TeamManager(this); - } if (this.getGachaInfo() == null) { - this.gachaInfo = new PlayerGachaInfo(); - } if (this.nameCardList == null) { - this.nameCardList = new HashSet<>(); - } if (this.costumeList == null) { - this.costumeList = new HashSet<>(); + } if (this.getProfile().getId() == 0) { + this.getProfile().syncWithCharacter(this); } // Check if player object exists in server diff --git a/src/main/java/emu/grasscutter/game/friends/PlayerProfile.java b/src/main/java/emu/grasscutter/game/friends/PlayerProfile.java index cc7408aa6..067cca28d 100644 --- a/src/main/java/emu/grasscutter/game/friends/PlayerProfile.java +++ b/src/main/java/emu/grasscutter/game/friends/PlayerProfile.java @@ -87,6 +87,7 @@ public class PlayerProfile { return; } + this.id = player.getUid(); this.name = player.getNickname(); this.avatarId = player.getHeadImage(); this.signature = player.getSignature(); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerFriendListRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerFriendListRsp.java index 9df89af5f..4d22f9603 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerFriendListRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerFriendListRsp.java @@ -23,7 +23,6 @@ public class PacketGetPlayerFriendListRsp extends GenshinPacket { .setWorldLevel(0) .setSignature("") .setLastActiveTime((int) (System.currentTimeMillis() / 1000f)) - .setIsMpModeAvailable(true) .setNameCardId(210001) .setOnlineState(FriendOnlineState.FRIEND_ONLINE) .setParam(1) From 639eba528fa48060379e1e4a583be4986bf3d8b9 Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Thu, 21 Apr 2022 10:37:24 +0800 Subject: [PATCH 065/119] folder check --- src/main/java/emu/grasscutter/data/ResourceLoader.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/emu/grasscutter/data/ResourceLoader.java b/src/main/java/emu/grasscutter/data/ResourceLoader.java index e597257ce..8a29f5a72 100644 --- a/src/main/java/emu/grasscutter/data/ResourceLoader.java +++ b/src/main/java/emu/grasscutter/data/ResourceLoader.java @@ -129,6 +129,12 @@ public class ResourceLoader { private static void loadScenePoints() { Pattern pattern = Pattern.compile("(?<=scene)(.*?)(?=_point.json)"); File folder = new File(Grasscutter.getConfig().RESOURCE_FOLDER + "BinOutPut/Scene/Point"); + + if (!folder.isDirectory() || !folder.exists() || folder.listFiles() == null) { + Grasscutter.getLogger().error("Scene point files cannot be found, you cannot use teleport waypoints!"); + return; + } + List scenePointList = new ArrayList<>(); for (File file : folder.listFiles()) { ScenePointConfig config = null; From 636d9ff206526f8b6792d34ef72c0430095feacf Mon Sep 17 00:00:00 2001 From: fengyuecanzhu <1021300691@qq.com> Date: Thu, 21 Apr 2022 11:43:31 +0800 Subject: [PATCH 066/119] add description and permission to setstats command --- .../java/emu/grasscutter/command/commands/SetStatsCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java b/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java index afc1a3e14..e9c4254b6 100644 --- a/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java @@ -10,7 +10,7 @@ import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; import java.util.List; @Command(label = "setstats", usage = "setstats|stats ", - aliases = {"stats"}) + description = "Set fight property for the specific player", aliases = {"stats"}, permission = "player.setstats") public final class SetStatsCommand implements CommandHandler { @Override From 56ee7b719a01cf52e758ae0ec17cc2c0b7921eab Mon Sep 17 00:00:00 2001 From: fengyuecanzhu <1021300691@qq.com> Date: Thu, 21 Apr 2022 11:52:53 +0800 Subject: [PATCH 067/119] change description --- .../java/emu/grasscutter/command/commands/SetStatsCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java b/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java index e9c4254b6..78f15de2d 100644 --- a/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java @@ -10,7 +10,7 @@ import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; import java.util.List; @Command(label = "setstats", usage = "setstats|stats ", - description = "Set fight property for the specific player", aliases = {"stats"}, permission = "player.setstats") + description = "Set fight property for your current active character", aliases = {"stats"}, permission = "player.setstats") public final class SetStatsCommand implements CommandHandler { @Override From 252fa6b958f6c7101f42d3482fc08792f77f8d06 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Wed, 20 Apr 2022 21:03:18 -0700 Subject: [PATCH 068/119] Fix weapon skills (and artifact sets) not working when you equip them --- .../game/avatar/GenshinAvatar.java | 47 ++++++++++++------- .../grasscutter/game/entity/EntityAvatar.java | 4 +- .../game/managers/InventoryManager.java | 28 +++-------- .../send/PacketAbilityChangeNotify.java | 4 +- 4 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java index a5dcb3ee8..9723c23d7 100644 --- a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java +++ b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java @@ -13,6 +13,7 @@ import dev.morphia.annotations.Indexed; import dev.morphia.annotations.PostLoad; import dev.morphia.annotations.PrePersist; import dev.morphia.annotations.Transient; +import emu.grasscutter.Grasscutter; import emu.grasscutter.data.GenshinData; import emu.grasscutter.data.common.FightPropData; import emu.grasscutter.data.custom.OpenConfigEntry; @@ -42,6 +43,7 @@ import emu.grasscutter.game.props.FightProperty; import emu.grasscutter.game.props.PlayerProperty; import emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo; import emu.grasscutter.net.proto.AvatarInfoOuterClass.AvatarInfo; +import emu.grasscutter.server.packet.send.PacketAbilityChangeNotify; import emu.grasscutter.server.packet.send.PacketAvatarEquipChangeNotify; import emu.grasscutter.server.packet.send.PacketAvatarFightPropNotify; import emu.grasscutter.utils.ProtoHelper; @@ -69,7 +71,7 @@ public class GenshinAvatar { @Transient private final Int2ObjectMap equips; @Transient private final Int2FloatOpenHashMap fightProp; - @Transient private final Set bonusAbilityList; + @Transient private Set extraAbilityEmbryos; private Map skillLevelMap; // Talent levels private Map proudSkillBonusMap; // Talent bonus levels (from const) @@ -86,7 +88,7 @@ public class GenshinAvatar { // Morhpia only! this.equips = new Int2ObjectOpenHashMap<>(); this.fightProp = new Int2FloatOpenHashMap(); - this.bonusAbilityList = new HashSet<>(); + this.extraAbilityEmbryos = new HashSet<>(); this.proudSkillBonusMap = new HashMap<>(); // TODO Move to genshin avatar } @@ -260,8 +262,8 @@ public class GenshinAvatar { return proudSkillBonusMap; } - public Set getBonusAbilityList() { - return bonusAbilityList; + public Set getExtraAbilityEmbryos() { + return extraAbilityEmbryos; } public float getCurrentHp() { @@ -347,14 +349,14 @@ public class GenshinAvatar { item.setEquipCharacter(this.getAvatarId()); item.save(); + if (this.getPlayer().hasSentAvatarDataNotify()) { + this.getPlayer().sendPacket(new PacketAvatarEquipChangeNotify(this, item)); + } + if (shouldRecalc) { this.recalcStats(); } - if (this.getPlayer().hasSentAvatarDataNotify()) { - this.getPlayer().sendPacket(new PacketAvatarEquipChangeNotify(this, item)); - } - return true; } @@ -371,11 +373,18 @@ public class GenshinAvatar { } public void recalcStats() { + recalcStats(false); + } + + public void recalcStats(boolean forceSendAbilityChange) { // Setup AvatarData data = this.getAvatarData(); AvatarPromoteData promoteData = GenshinData.getAvatarPromoteData(data.getAvatarPromoteId(), this.getPromoteLevel()); Int2IntOpenHashMap setMap = new Int2IntOpenHashMap(); - this.getBonusAbilityList().clear(); + + // Extra ability embryos + Set prevExtraAbilityEmbryos = this.getExtraAbilityEmbryos(); + this.extraAbilityEmbryos = new HashSet<>(); // Get hp percent, set to 100% if none float hpPercent = this.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) <= 0 ? 1f : this.getFightProperty(FightProperty.FIGHT_PROP_CUR_HP) / this.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP); @@ -458,7 +467,7 @@ public class GenshinAvatar { } // Add any skill strings from this affix - this.addToAbilityList(affix.getOpenConfig(), true); + this.addToExtraAbilityEmbryos(affix.getOpenConfig(), true); } else { break; } @@ -505,7 +514,7 @@ public class GenshinAvatar { } // Add any skill strings from this affix - this.addToAbilityList(affix.getOpenConfig(), true); + this.addToExtraAbilityEmbryos(affix.getOpenConfig(), true); } } } @@ -538,7 +547,7 @@ public class GenshinAvatar { } // Add any skill strings from this proud skill - this.addToAbilityList(proudSkillData.getOpenConfig(), true); + this.addToExtraAbilityEmbryos(proudSkillData.getOpenConfig(), true); } // Constellations @@ -550,7 +559,7 @@ public class GenshinAvatar { } // Add any skill strings from this constellation - this.addToAbilityList(avatarTalentData.getOpenConfig(), false); + this.addToExtraAbilityEmbryos(avatarTalentData.getOpenConfig(), false); } } @@ -573,11 +582,17 @@ public class GenshinAvatar { // Packet if (getPlayer() != null && getPlayer().hasSentAvatarDataNotify()) { + // Update stats for client getPlayer().sendPacket(new PacketAvatarFightPropNotify(this)); + // Update client abilities + EntityAvatar entity = this.getAsEntity(); + if (entity != null && (!this.getExtraAbilityEmbryos().equals(prevExtraAbilityEmbryos) || forceSendAbilityChange)) { + getPlayer().sendPacket(new PacketAbilityChangeNotify(entity)); + } } } - public void addToAbilityList(String openConfig, boolean forceAdd) { + public void addToExtraAbilityEmbryos(String openConfig, boolean forceAdd) { if (openConfig == null || openConfig.length() == 0) { return; } @@ -586,14 +601,14 @@ public class GenshinAvatar { if (entry == null) { if (forceAdd) { // Add config string to ability skill list anyways - this.getBonusAbilityList().add(openConfig); + this.getExtraAbilityEmbryos().add(openConfig); } return; } if (entry.getAddAbilities() != null) { for (String ability : entry.getAddAbilities()) { - this.getBonusAbilityList().add(ability); + this.getExtraAbilityEmbryos().add(ability); } } } diff --git a/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java b/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java index 86e8ea458..233da5288 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java @@ -223,8 +223,8 @@ public class EntityAvatar extends GenshinEntity { } } // Add equip abilities - if (this.getAvatar().getBonusAbilityList().size() > 0) { - for (String skill : this.getAvatar().getBonusAbilityList()) { + if (this.getAvatar().getExtraAbilityEmbryos().size() > 0) { + for (String skill : this.getAvatar().getExtraAbilityEmbryos()) { AbilityEmbryo emb = AbilityEmbryo.newBuilder() .setAbilityId(++embryoId) .setAbilityNameHash(Utils.abilityHash(skill)) diff --git a/src/main/java/emu/grasscutter/game/managers/InventoryManager.java b/src/main/java/emu/grasscutter/game/managers/InventoryManager.java index 935652d77..532155db1 100644 --- a/src/main/java/emu/grasscutter/game/managers/InventoryManager.java +++ b/src/main/java/emu/grasscutter/game/managers/InventoryManager.java @@ -589,7 +589,6 @@ public class InventoryManager { // Update proud skills AvatarSkillDepotData skillDepot = GenshinData.getAvatarSkillDepotDataMap().get(avatar.getSkillDepotId()); - boolean hasAddedProudSkill = false; if (skillDepot != null && skillDepot.getInherentProudSkillOpens() != null) { for (InherentProudSkillOpens openData : skillDepot.getInherentProudSkillOpens()) { @@ -599,7 +598,6 @@ public class InventoryManager { if (openData.getNeedAvatarPromoteLevel() == avatar.getPromoteLevel()) { int proudSkillId = (openData.getProudSkillGroupId() * 100) + 1; if (GenshinData.getProudSkillDataMap().containsKey(proudSkillId)) { - hasAddedProudSkill = true; avatar.getProudSkillList().add(proudSkillId); player.sendPacket(new PacketProudSkillChangeNotify(avatar)); } @@ -607,20 +605,13 @@ public class InventoryManager { } } - // Racalc stats and save avatar - avatar.recalcStats(); - avatar.save(); - - // Resend ability embryos if proud skill has been added - if (hasAddedProudSkill && avatar.getAsEntity() != null) { - player.sendPacket(new PacketAbilityChangeNotify(avatar.getAsEntity())); - } - - // TODO Send entity prop update packet to world - // Packets player.sendPacket(new PacketAvatarPropNotify(avatar)); player.sendPacket(new PacketAvatarPromoteRsp(avatar)); + + // TODO Send entity prop update packet to world + avatar.recalcStats(true); + avatar.save(); } public void upgradeAvatar(GenshinPlayer player, long guid, int itemId, int count) { @@ -827,25 +818,20 @@ public class InventoryManager { // Apply + recalc avatar.getTalentIdList().add(talentData.getId()); avatar.setCoreProudSkillLevel(currentTalentLevel + 1); - avatar.recalcStats(); // Packet player.sendPacket(new PacketAvatarUnlockTalentNotify(avatar, nextTalentId)); player.sendPacket(new PacketUnlockAvatarTalentRsp(avatar, nextTalentId)); - // Proud skill bonus map + // Proud skill bonus map (Extra skills) OpenConfigEntry entry = GenshinData.getOpenConfigEntries().get(talentData.getOpenConfig()); if (entry != null && entry.getExtraTalentIndex() > 0) { avatar.recalcProudSkillBonusMap(); player.sendPacket(new PacketProudSkillExtraLevelNotify(avatar, entry.getExtraTalentIndex())); } - // Resend ability embryos - if (avatar.getAsEntity() != null) { - player.sendPacket(new PacketAbilityChangeNotify(avatar.getAsEntity())); - } - - // Save avatar + // Recalc + save avatar + avatar.recalcStats(true); avatar.save(); } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketAbilityChangeNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketAbilityChangeNotify.java index a6e1fb452..d8cdfdef8 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketAbilityChangeNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketAbilityChangeNotify.java @@ -8,8 +8,8 @@ import emu.grasscutter.net.proto.AbilityChangeNotifyOuterClass.AbilityChangeNoti public class PacketAbilityChangeNotify extends GenshinPacket { public PacketAbilityChangeNotify(EntityAvatar entity) { - super(PacketOpcodes.AbilityChangeNotify); - + super(PacketOpcodes.AbilityChangeNotify, true); + AbilityChangeNotify proto = AbilityChangeNotify.newBuilder() .setEntityId(entity.getId()) .setAbilityControlBlock(entity.getAbilityControlBlock()) From 35925903a14a110d964bf6043f4e382518dde44e Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Wed, 20 Apr 2022 21:33:58 -0700 Subject: [PATCH 069/119] Refactor PacketSceneTransToPointRsp and add a null check when getting ScenePointEntries --- .../command/commands/ChangeSceneCommand.java | 10 +++++-- src/main/java/emu/grasscutter/game/World.java | 21 +------------- .../recv/HandlerSceneTransToPointReq.java | 19 +++++++++++- .../send/PacketSceneTransToPointRsp.java | 29 +++++++++---------- 4 files changed, 41 insertions(+), 38 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/ChangeSceneCommand.java b/src/main/java/emu/grasscutter/command/commands/ChangeSceneCommand.java index a5afe7bf7..eb2e998f2 100644 --- a/src/main/java/emu/grasscutter/command/commands/ChangeSceneCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/ChangeSceneCommand.java @@ -23,11 +23,17 @@ public final class ChangeSceneCommand implements CommandHandler { try { int sceneId = Integer.parseInt(args.get(0)); + + if (sceneId == sender.getSceneId()) { + CommandHandler.sendMessage(sender, "You are already in that scene"); + return; + } + boolean result = sender.getWorld().transferPlayerToScene(sender, sceneId, sender.getPos()); - CommandHandler.sendMessage(sender, "Changed to scene " + sceneId); + if (!result) { - CommandHandler.sendMessage(sender, "Scene does not exist or you are already in it"); + CommandHandler.sendMessage(sender, "Scene does not exist"); } } catch (Exception e) { CommandHandler.sendMessage(sender, "Usage: changescene "); diff --git a/src/main/java/emu/grasscutter/game/World.java b/src/main/java/emu/grasscutter/game/World.java index 4375d8e4f..f88d3bee4 100644 --- a/src/main/java/emu/grasscutter/game/World.java +++ b/src/main/java/emu/grasscutter/game/World.java @@ -206,28 +206,9 @@ public class World implements Iterable { public void deregisterScene(GenshinScene scene) { this.getScenes().remove(scene.getId()); } - - public boolean forceTransferPlayerToScene(GenshinPlayer player, int sceneId, Position pos) { - // Forces the client to reload the scene map to prevent the player from falling off the map. - if (GenshinData.getSceneDataMap().get(sceneId) == null) { - return false; - } - - if (player.getScene() != null) { - player.getScene().removePlayer(player); - } - - GenshinScene scene = this.getSceneById(sceneId); - scene.addPlayer(player); - player.getPos().set(pos); - - // Teleport packet - player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterSelf, EnterReason.TransPoint, sceneId, pos)); - return true; - } public boolean transferPlayerToScene(GenshinPlayer player, int sceneId, Position pos) { - if (player.getScene().getId() == sceneId || GenshinData.getSceneDataMap().get(sceneId) == null) { + if (GenshinData.getSceneDataMap().get(sceneId) == null) { return false; } diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java index 619a37b1e..f01f5980d 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneTransToPointReq.java @@ -1,11 +1,15 @@ package emu.grasscutter.server.packet.recv; +import emu.grasscutter.data.GenshinData; +import emu.grasscutter.data.custom.ScenePointEntry; import emu.grasscutter.net.packet.Opcodes; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.SceneTransToPointReqOuterClass.SceneTransToPointReq; +import emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp; import emu.grasscutter.net.packet.PacketHandler; import emu.grasscutter.server.game.GameSession; import emu.grasscutter.server.packet.send.PacketSceneTransToPointRsp; +import emu.grasscutter.utils.Position; @Opcodes(PacketOpcodes.SceneTransToPointReq) public class HandlerSceneTransToPointReq extends PacketHandler { @@ -13,7 +17,20 @@ public class HandlerSceneTransToPointReq extends PacketHandler { @Override public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { SceneTransToPointReq req = SceneTransToPointReq.parseFrom(payload); - session.send(new PacketSceneTransToPointRsp(session.getPlayer(), req.getPointId(), req.getSceneId())); + + String code = req.getSceneId() + "_" + req.getPointId(); + ScenePointEntry scenePointEntry = GenshinData.getScenePointEntries().get(code); + + if (scenePointEntry != null) { + float x = scenePointEntry.getPointData().getTranPos().getX(); + float y = scenePointEntry.getPointData().getTranPos().getY(); + float z = scenePointEntry.getPointData().getTranPos().getZ(); + + session.getPlayer().getWorld().transferPlayerToScene(session.getPlayer(), req.getSceneId(), new Position(x, y, z)); + session.send(new PacketSceneTransToPointRsp(session.getPlayer(), req.getPointId(), req.getSceneId())); + } else { + session.send(new PacketSceneTransToPointRsp()); + } } } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTransToPointRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTransToPointRsp.java index 965c6aa6b..4795c5e9f 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTransToPointRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTransToPointRsp.java @@ -13,23 +13,22 @@ public class PacketSceneTransToPointRsp extends GenshinPacket { public PacketSceneTransToPointRsp(GenshinPlayer player, int pointId, int sceneId) { super(PacketOpcodes.SceneTransToPointRsp); - String code = sceneId + "_" + pointId; - ScenePointEntry scenePointEntry = GenshinData.getScenePointEntries().get(code); - - float x = scenePointEntry.getPointData().getTranPos().getX(); - float y = scenePointEntry.getPointData().getTranPos().getY(); - float z = scenePointEntry.getPointData().getTranPos().getZ(); - - player.getPos().set(new Position(x, y, z)); - - player.getWorld().forceTransferPlayerToScene(player, sceneId, player.getPos()); - SceneTransToPointRsp proto = SceneTransToPointRsp.newBuilder() - .setRetcode(0) - .setPointId(pointId) - .setSceneId(sceneId) - .build(); + .setRetcode(0) + .setPointId(pointId) + .setSceneId(sceneId) + .build(); + + this.setData(proto); + } + + public PacketSceneTransToPointRsp() { + super(PacketOpcodes.SceneTransToPointRsp); + SceneTransToPointRsp proto = SceneTransToPointRsp.newBuilder() + .setRetcode(1) // Internal server error + .build(); + this.setData(proto); } } From 7b43e9a6d8962cbf053247bd51c74a1dacd4ab95 Mon Sep 17 00:00:00 2001 From: labalityowo <56186498+labalityowo@users.noreply.github.com> Date: Thu, 21 Apr 2022 11:42:21 +0700 Subject: [PATCH 070/119] Remove the stella appearance --- src/main/java/emu/grasscutter/game/gacha/GachaManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java index eb1cba379..a38b91812 100644 --- a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java +++ b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java @@ -218,7 +218,6 @@ public class GachaManager { addStarglitter = 2; // Add 1 const gachaItem.addTransferItems(GachaTransferItem.newBuilder().setItem(ItemParam.newBuilder().setItemId(constItemId).setCount(1)).setIsTransferItemNew(constItem == null)); - gachaItem.addTokenItemList(ItemParam.newBuilder().setItemId(constItemId).setCount(1)); player.getInventory().addItem(constItemId, 1); } else { // Is max const From 9c136859eb9ed842e43905868d81414e8848928f Mon Sep 17 00:00:00 2001 From: fengyuecanzhu <1021300691@qq.com> Date: Thu, 21 Apr 2022 12:49:23 +0800 Subject: [PATCH 071/119] add args check --- .../emu/grasscutter/command/commands/SetStatsCommand.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java b/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java index 78f15de2d..e3efdb0d5 100644 --- a/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/SetStatsCommand.java @@ -20,6 +20,11 @@ public final class SetStatsCommand implements CommandHandler { return; } + if (args.size() < 2){ + CommandHandler.sendMessage(sender, "Usage: setstats|stats "); + return; + } + String stat = args.get(0); switch (stat) { default: From 75cea5bc4872b79b2eb8964cab113824f2a8be51 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Wed, 20 Apr 2022 21:50:33 -0700 Subject: [PATCH 072/119] More refactoring (player id -> player uid) --- .../grasscutter/command/commands/AccountCommand.java | 2 +- .../emu/grasscutter/command/commands/KickCommand.java | 2 +- src/main/java/emu/grasscutter/game/Account.java | 5 +++-- src/main/java/emu/grasscutter/game/GenshinPlayer.java | 2 +- .../java/emu/grasscutter/game/friends/FriendsList.java | 2 +- .../java/emu/grasscutter/game/friends/Friendship.java | 2 +- .../emu/grasscutter/game/friends/PlayerProfile.java | 10 +++++----- .../server/packet/recv/HandlerGetPlayerTokenReq.java | 8 ++++---- .../server/packet/recv/HandlerPlayerLoginReq.java | 2 +- .../packet/recv/HandlerSetPlayerBornDataReq.java | 2 +- .../server/packet/send/PacketGetPlayerTokenRsp.java | 2 +- 11 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/AccountCommand.java b/src/main/java/emu/grasscutter/command/commands/AccountCommand.java index 2c21cba79..26570e0e8 100644 --- a/src/main/java/emu/grasscutter/command/commands/AccountCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/AccountCommand.java @@ -46,7 +46,7 @@ public final class AccountCommand implements CommandHandler { CommandHandler.sendMessage(null, "Account already exists."); return; } else { - CommandHandler.sendMessage(null, "Account created with UID " + account.getPlayerId() + "."); + CommandHandler.sendMessage(null, "Account created with UID " + account.getPlayerUid() + "."); account.addPermission("*"); // Grant the player superuser permissions. account.save(); // Save account to database. } diff --git a/src/main/java/emu/grasscutter/command/commands/KickCommand.java b/src/main/java/emu/grasscutter/command/commands/KickCommand.java index 188ce1877..61e9d759b 100644 --- a/src/main/java/emu/grasscutter/command/commands/KickCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/KickCommand.java @@ -22,7 +22,7 @@ public final class KickCommand implements CommandHandler { } if (sender != null) { - CommandHandler.sendMessage(sender, String.format("Player [%s:%s] has kicked player [%s:%s]", sender.getAccount().getPlayerId(), sender.getAccount().getUsername(), target, targetPlayer.getAccount().getUsername())); + CommandHandler.sendMessage(sender, String.format("Player [%s:%s] has kicked player [%s:%s]", sender.getAccount().getPlayerUid(), sender.getAccount().getUsername(), target, targetPlayer.getAccount().getUsername())); } CommandHandler.sendMessage(sender, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); diff --git a/src/main/java/emu/grasscutter/game/Account.java b/src/main/java/emu/grasscutter/game/Account.java index 2eeeed3b1..dfb1e2829 100644 --- a/src/main/java/emu/grasscutter/game/Account.java +++ b/src/main/java/emu/grasscutter/game/Account.java @@ -1,5 +1,6 @@ package emu.grasscutter.game; +import dev.morphia.annotations.AlsoLoad; import dev.morphia.annotations.Collation; import dev.morphia.annotations.Entity; import dev.morphia.annotations.Id; @@ -24,7 +25,7 @@ public class Account { private String username; private String password; // Unused for now - private int playerId; + @AlsoLoad("playerUid") private int playerId; private String email; private String token; @@ -68,7 +69,7 @@ public class Account { this.token = token; } - public int getPlayerId() { + public int getPlayerUid() { return this.playerId; } diff --git a/src/main/java/emu/grasscutter/game/GenshinPlayer.java b/src/main/java/emu/grasscutter/game/GenshinPlayer.java index c7ac82bc6..1bc989183 100644 --- a/src/main/java/emu/grasscutter/game/GenshinPlayer.java +++ b/src/main/java/emu/grasscutter/game/GenshinPlayer.java @@ -722,7 +722,7 @@ public class GenshinPlayer { // Make sure these exist if (this.getTeamManager() == null) { this.teamManager = new TeamManager(this); - } if (this.getProfile().getId() == 0) { + } if (this.getProfile().getUid() == 0) { this.getProfile().syncWithCharacter(this); } diff --git a/src/main/java/emu/grasscutter/game/friends/FriendsList.java b/src/main/java/emu/grasscutter/game/friends/FriendsList.java index 582a10efd..45a11fb1c 100644 --- a/src/main/java/emu/grasscutter/game/friends/FriendsList.java +++ b/src/main/java/emu/grasscutter/game/friends/FriendsList.java @@ -220,7 +220,7 @@ public class FriendsList { friendship.setOwner(getPlayer()); // Check if friend is online - GenshinPlayer friend = getPlayer().getSession().getServer().getPlayerByUid(friendship.getFriendProfile().getId()); + GenshinPlayer friend = getPlayer().getSession().getServer().getPlayerByUid(friendship.getFriendProfile().getUid()); if (friend != null) { // Set friend to online mode friendship.setFriendProfile(friend); diff --git a/src/main/java/emu/grasscutter/game/friends/Friendship.java b/src/main/java/emu/grasscutter/game/friends/Friendship.java index 2be7d1fce..172d1bd43 100644 --- a/src/main/java/emu/grasscutter/game/friends/Friendship.java +++ b/src/main/java/emu/grasscutter/game/friends/Friendship.java @@ -88,7 +88,7 @@ public class Friendship { public FriendBrief toProto() { FriendBrief proto = FriendBrief.newBuilder() - .setUid(getFriendProfile().getId()) + .setUid(getFriendProfile().getUid()) .setNickname(getFriendProfile().getName()) .setLevel(getFriendProfile().getPlayerLevel()) .setAvatar(HeadImage.newBuilder().setAvatarId(getFriendProfile().getAvatarId())) diff --git a/src/main/java/emu/grasscutter/game/friends/PlayerProfile.java b/src/main/java/emu/grasscutter/game/friends/PlayerProfile.java index 067cca28d..b9381c901 100644 --- a/src/main/java/emu/grasscutter/game/friends/PlayerProfile.java +++ b/src/main/java/emu/grasscutter/game/friends/PlayerProfile.java @@ -7,7 +7,7 @@ import emu.grasscutter.utils.Utils; public class PlayerProfile { @Transient private GenshinPlayer player; - private int id; + @AlsoLoad("id") private int uid; private int nameCard; private int avatarId; private String name; @@ -22,12 +22,12 @@ public class PlayerProfile { public PlayerProfile() { } public PlayerProfile(GenshinPlayer player) { - this.id = player.getUid(); + this.uid = player.getUid(); this.syncWithCharacter(player); } - public int getId() { - return id; + public int getUid() { + return uid; } public GenshinPlayer getPlayer() { @@ -87,7 +87,7 @@ public class PlayerProfile { return; } - this.id = player.getUid(); + this.uid = player.getUid(); this.name = player.getNickname(); this.avatarId = player.getHeadImage(); this.signature = player.getSignature(); diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerTokenReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerTokenReq.java index dc686f5c1..5034fb01a 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerTokenReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerTokenReq.java @@ -35,15 +35,15 @@ public class HandlerGetPlayerTokenReq extends PacketHandler { // Has character boolean doesPlayerExist = false; - if (account.getPlayerId() > 0) { + if (account.getPlayerUid() > 0) { // Set flag for player existing - doesPlayerExist = DatabaseHelper.checkPlayerExists(account.getPlayerId()); + doesPlayerExist = DatabaseHelper.checkPlayerExists(account.getPlayerUid()); } // Set reserve player id if account doesnt exist if (!doesPlayerExist) { - int id = DatabaseHelper.getNextPlayerId(session.getAccount().getPlayerId()); - if (id != session.getAccount().getPlayerId()) { + int id = DatabaseHelper.getNextPlayerId(session.getAccount().getPlayerUid()); + if (id != session.getAccount().getPlayerUid()) { session.getAccount().setPlayerId(id); session.getAccount().save(); } diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerPlayerLoginReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerPlayerLoginReq.java index 183ef7461..05753aec0 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerPlayerLoginReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerPlayerLoginReq.java @@ -30,7 +30,7 @@ public class HandlerPlayerLoginReq extends PacketHandler { } // Load character from db - GenshinPlayer player = DatabaseHelper.getPlayerById(session.getAccount().getPlayerId()); + GenshinPlayer player = DatabaseHelper.getPlayerById(session.getAccount().getPlayerUid()); if (player == null) { // Send packets diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerBornDataReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerBornDataReq.java index 5cbbd8d04..72fc709d9 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerBornDataReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetPlayerBornDataReq.java @@ -43,7 +43,7 @@ public class HandlerSetPlayerBornDataReq extends PacketHandler { try { // Save to db - DatabaseHelper.createPlayer(player, session.getAccount().getPlayerId()); + DatabaseHelper.createPlayer(player, session.getAccount().getPlayerUid()); // Create avatar if (player.getAvatars().getAvatarCount() == 0) { diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerTokenRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerTokenRsp.java index 2306aa0ae..00f512ea7 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerTokenRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerTokenRsp.java @@ -16,7 +16,7 @@ public class PacketGetPlayerTokenRsp extends GenshinPacket { this.setUseDispatchKey(true); GetPlayerTokenRsp p = GetPlayerTokenRsp.newBuilder() - .setPlayerUid(session.getAccount().getPlayerId()) + .setPlayerUid(session.getAccount().getPlayerUid()) .setAccountToken(session.getAccount().getToken()) .setAccountType(1) .setIsProficientPlayer(doesPlayerExist) // Not sure where this goes From 75719c5b3be720d87405f83034291021e3d98090 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Thu, 21 Apr 2022 13:53:50 +0800 Subject: [PATCH 073/119] Restructured the config file in preperation for server run modes --- src/main/java/emu/grasscutter/Config.java | 70 ++++++++++--------- .../java/emu/grasscutter/Grasscutter.java | 2 +- .../emu/grasscutter/game/GenshinPlayer.java | 2 +- .../java/emu/grasscutter/game/TeamInfo.java | 6 +- .../emu/grasscutter/game/TeamManager.java | 4 +- .../grasscutter/game/gacha/GachaBanner.java | 2 +- .../grasscutter/game/gacha/GachaManager.java | 2 +- .../grasscutter/game/inventory/Inventory.java | 8 +-- .../server/dispatch/DispatchServer.java | 28 ++++---- .../server/game/GameServerPacketHandler.java | 2 +- .../grasscutter/server/game/GameSession.java | 4 +- .../packet/send/PacketPlayerStoreNotify.java | 2 +- .../packet/send/PacketPullRecentChatRsp.java | 6 +- .../send/PacketStoreWeightLimitNotify.java | 10 +-- 14 files changed, 77 insertions(+), 71 deletions(-) diff --git a/src/main/java/emu/grasscutter/Config.java b/src/main/java/emu/grasscutter/Config.java index dddbbfa9e..c6748fb41 100644 --- a/src/main/java/emu/grasscutter/Config.java +++ b/src/main/java/emu/grasscutter/Config.java @@ -1,20 +1,7 @@ package emu.grasscutter; public final class Config { - public String DispatchServerIp = "127.0.0.1"; - public String DispatchServerPublicIp = ""; - public int DispatchServerPort = 443; - public String DispatchServerKeystorePath = "./keystore.p12"; - public String DispatchServerKeystorePassword = ""; - public Boolean UseSSL = true; - - public String GameServerName = "Test"; - public String GameServerIp = "127.0.0.1"; - public String GameServerPublicIp = ""; - public int GameServerPort = 22102; - - public int UploadLogPort = 80; - + public String DatabaseUrl = "mongodb://localhost:27017"; public String DatabaseCollection = "grasscutter"; @@ -23,26 +10,36 @@ public final class Config { public String PACKETS_FOLDER = "./packets/"; public String DUMPS_FOLDER = "./dumps/"; public String KEY_FOLDER = "./keys/"; - public boolean LOG_PACKETS = false; - public GameRates Game = new GameRates(); - public ServerOptions ServerOptions = new ServerOptions(); - - public GameRates getGameRates() { - return Game; + public GameServerOptions GameServer = new GameServerOptions(); + public DispatchServerOptions DispatchServer = new DispatchServerOptions(); + + public GameServerOptions getGameServerOptions() { + return GameServer; + } + + public DispatchServerOptions getDispatchOptions() { return DispatchServer; } + + public static class DispatchServerOptions { + public String Ip = "127.0.0.1"; + public String PublicIp = ""; + public int Port = 443; + public int UploadLogPort = 80; + public String KeystorePath = "./keystore.p12"; + public String KeystorePassword = ""; + public Boolean UseSSL = true; + + public boolean AutomaticallyCreateAccounts = false; } - public ServerOptions getServerOptions() { - return ServerOptions; - } - - public static class GameRates { - public float ADVENTURE_EXP_RATE = 1.0f; - public float MORA_RATE = 1.0f; - public float DOMAIN_DROP_RATE = 1.0f; - } - - public static class ServerOptions { + public static class GameServerOptions { + public String Name = "Test"; + public String Ip = "127.0.0.1"; + public String PublicIp = ""; + public int Port = 22102; + + public boolean LOG_PACKETS = false; + public int InventoryLimitWeapon = 2000; public int InventoryLimitRelic = 2000; public int InventoryLimitMaterial = 2000; @@ -54,6 +51,15 @@ public final class Config { public boolean WatchGacha = false; public int[] WelcomeEmotes = {2007, 1002, 4010}; public String WelcomeMotd = "Welcome to Grasscutter emu"; - public boolean AutomaticallyCreateAccounts = false; + + public GameRates Game = new GameRates(); + + public GameRates getGameRates() { return Game; } + + public static class GameRates { + public float ADVENTURE_EXP_RATE = 1.0f; + public float MORA_RATE = 1.0f; + public float DOMAIN_DROP_RATE = 1.0f; + } } } diff --git a/src/main/java/emu/grasscutter/Grasscutter.java b/src/main/java/emu/grasscutter/Grasscutter.java index 0e34c120d..0b8f1efd8 100644 --- a/src/main/java/emu/grasscutter/Grasscutter.java +++ b/src/main/java/emu/grasscutter/Grasscutter.java @@ -76,7 +76,7 @@ public final class Grasscutter { dispatchServer = new DispatchServer(); dispatchServer.start(); - gameServer = new GameServer(new InetSocketAddress(getConfig().GameServerIp, getConfig().GameServerPort)); + gameServer = new GameServer(new InetSocketAddress(getConfig().getGameServerOptions().Ip, getConfig().getGameServerOptions().Port)); gameServer.start(); // Open console. diff --git a/src/main/java/emu/grasscutter/game/GenshinPlayer.java b/src/main/java/emu/grasscutter/game/GenshinPlayer.java index 1d8650e54..bf841090e 100644 --- a/src/main/java/emu/grasscutter/game/GenshinPlayer.java +++ b/src/main/java/emu/grasscutter/game/GenshinPlayer.java @@ -288,7 +288,7 @@ public class GenshinPlayer { } private float getExpModifier() { - return Grasscutter.getConfig().getGameRates().ADVENTURE_EXP_RATE; + return Grasscutter.getConfig().getGameServerOptions().getGameRates().ADVENTURE_EXP_RATE; } // Affected by exp rate diff --git a/src/main/java/emu/grasscutter/game/TeamInfo.java b/src/main/java/emu/grasscutter/game/TeamInfo.java index 0a12b1d2c..c60ce8cc0 100644 --- a/src/main/java/emu/grasscutter/game/TeamInfo.java +++ b/src/main/java/emu/grasscutter/game/TeamInfo.java @@ -13,7 +13,7 @@ public class TeamInfo { public TeamInfo() { this.name = ""; - this.avatars = new ArrayList<>(Grasscutter.getConfig().getServerOptions().MaxAvatarsInTeam); + this.avatars = new ArrayList<>(Grasscutter.getConfig().getGameServerOptions().MaxAvatarsInTeam); } public String getName() { @@ -37,7 +37,7 @@ public class TeamInfo { } public boolean addAvatar(GenshinAvatar avatar) { - if (size() >= Grasscutter.getConfig().getServerOptions().MaxAvatarsInTeam || contains(avatar)) { + if (size() >= Grasscutter.getConfig().getGameServerOptions().MaxAvatarsInTeam || contains(avatar)) { return false; } @@ -57,7 +57,7 @@ public class TeamInfo { } public void copyFrom(TeamInfo team) { - copyFrom(team, Grasscutter.getConfig().getServerOptions().MaxAvatarsInTeam); + copyFrom(team, Grasscutter.getConfig().getGameServerOptions().MaxAvatarsInTeam); } public void copyFrom(TeamInfo team, int maxTeamSize) { diff --git a/src/main/java/emu/grasscutter/game/TeamManager.java b/src/main/java/emu/grasscutter/game/TeamManager.java index 4cd7bfcdf..065c3bd28 100644 --- a/src/main/java/emu/grasscutter/game/TeamManager.java +++ b/src/main/java/emu/grasscutter/game/TeamManager.java @@ -164,13 +164,13 @@ public class TeamManager { public int getMaxTeamSize() { if (getPlayer().isInMultiplayer()) { - int max = Grasscutter.getConfig().getServerOptions().MaxAvatarsInTeamMultiplayer; + int max = Grasscutter.getConfig().getGameServerOptions().MaxAvatarsInTeamMultiplayer; if (getPlayer().getWorld().getHost() == this.getPlayer()) { return Math.max(1, (int) Math.ceil(max / (double) getWorld().getPlayerCount())); } return Math.max(1, (int) Math.floor(max / (double) getWorld().getPlayerCount())); } - return Grasscutter.getConfig().getServerOptions().MaxAvatarsInTeam; + return Grasscutter.getConfig().getGameServerOptions().MaxAvatarsInTeam; } // Methods diff --git a/src/main/java/emu/grasscutter/game/gacha/GachaBanner.java b/src/main/java/emu/grasscutter/game/gacha/GachaBanner.java index 3e6bcdf7e..ed5492b62 100644 --- a/src/main/java/emu/grasscutter/game/gacha/GachaBanner.java +++ b/src/main/java/emu/grasscutter/game/gacha/GachaBanner.java @@ -92,7 +92,7 @@ public class GachaBanner { } public GachaInfo toProto() { - String record = "http://" + (Grasscutter.getConfig().DispatchServerPublicIp.isEmpty() ? Grasscutter.getConfig().DispatchServerIp : Grasscutter.getConfig().DispatchServerPublicIp) + "/gacha"; + String record = "http://" + (Grasscutter.getConfig().getDispatchOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getDispatchOptions().Ip : Grasscutter.getConfig().getDispatchOptions().PublicIp) + "/gacha"; GachaInfo.Builder info = GachaInfo.newBuilder() .setGachaType(this.getGachaType()) diff --git a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java index a38b91812..079f0dda3 100644 --- a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java +++ b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java @@ -299,7 +299,7 @@ public class GachaManager { @Subscribe public synchronized void watchBannerJson(GameServerTickEvent tickEvent) { - if(Grasscutter.getConfig().getServerOptions().WatchGacha) { + if(Grasscutter.getConfig().getGameServerOptions().WatchGacha) { try { WatchKey watchKey = watchService.take(); diff --git a/src/main/java/emu/grasscutter/game/inventory/Inventory.java b/src/main/java/emu/grasscutter/game/inventory/Inventory.java index 19bdcc525..8954b1031 100644 --- a/src/main/java/emu/grasscutter/game/inventory/Inventory.java +++ b/src/main/java/emu/grasscutter/game/inventory/Inventory.java @@ -37,10 +37,10 @@ public class Inventory implements Iterable { this.store = new Long2ObjectOpenHashMap<>(); this.inventoryTypes = new Int2ObjectOpenHashMap<>(); - this.createInventoryTab(ItemType.ITEM_WEAPON, new EquipInventoryTab(Grasscutter.getConfig().getServerOptions().InventoryLimitWeapon)); - this.createInventoryTab(ItemType.ITEM_RELIQUARY, new EquipInventoryTab(Grasscutter.getConfig().getServerOptions().InventoryLimitRelic)); - this.createInventoryTab(ItemType.ITEM_MATERIAL, new MaterialInventoryTab(Grasscutter.getConfig().getServerOptions().InventoryLimitMaterial)); - this.createInventoryTab(ItemType.ITEM_FURNITURE, new MaterialInventoryTab(Grasscutter.getConfig().getServerOptions().InventoryLimitFurniture)); + this.createInventoryTab(ItemType.ITEM_WEAPON, new EquipInventoryTab(Grasscutter.getConfig().getGameServerOptions().InventoryLimitWeapon)); + this.createInventoryTab(ItemType.ITEM_RELIQUARY, new EquipInventoryTab(Grasscutter.getConfig().getGameServerOptions().InventoryLimitRelic)); + this.createInventoryTab(ItemType.ITEM_MATERIAL, new MaterialInventoryTab(Grasscutter.getConfig().getGameServerOptions().InventoryLimitMaterial)); + this.createInventoryTab(ItemType.ITEM_FURNITURE, new MaterialInventoryTab(Grasscutter.getConfig().getGameServerOptions().InventoryLimitFurniture)); } public GenshinPlayer getPlayer() { diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index f13b9dc2f..cda908480 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -55,7 +55,7 @@ public final class DispatchServer { public static String query_cur_region = ""; public DispatchServer() { - this.address = new InetSocketAddress(Grasscutter.getConfig().DispatchServerIp, Grasscutter.getConfig().DispatchServerPort); + this.address = new InetSocketAddress(Grasscutter.getConfig().getDispatchOptions().Ip, Grasscutter.getConfig().getDispatchOptions().Port); this.gson = new GsonBuilder().create(); this.loadQueries(); @@ -99,19 +99,19 @@ public final class DispatchServer { byte[] decoded2 = Base64.getDecoder().decode(query_cur_region); QueryCurrRegionHttpRsp regionQuery = QueryCurrRegionHttpRsp.parseFrom(decoded2); - + RegionSimpleInfo server = RegionSimpleInfo.newBuilder() .setName("os_usa") - .setTitle(Grasscutter.getConfig().GameServerName) + .setTitle(Grasscutter.getConfig().getGameServerOptions().Name) .setType("DEV_PUBLIC") - .setDispatchUrl("https://" + (Grasscutter.getConfig().DispatchServerPublicIp.isEmpty() ? Grasscutter.getConfig().DispatchServerIp : Grasscutter.getConfig().DispatchServerPublicIp) + ":" + getAddress().getPort() + "/query_cur_region") + .setDispatchUrl("https://" + (Grasscutter.getConfig().getDispatchOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getDispatchOptions().Ip : Grasscutter.getConfig().getDispatchOptions().PublicIp) + ":" + getAddress().getPort() + "/query_cur_region") .build(); RegionSimpleInfo serverTest2 = RegionSimpleInfo.newBuilder() .setName("os_euro") .setTitle("Grasscutter") .setType("DEV_PUBLIC") - .setDispatchUrl("https://" + (Grasscutter.getConfig().DispatchServerPublicIp.isEmpty() ? Grasscutter.getConfig().DispatchServerIp : Grasscutter.getConfig().DispatchServerPublicIp) + ":" + getAddress().getPort() + "/query_cur_region") + .setDispatchUrl("https://" + (Grasscutter.getConfig().getDispatchOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getDispatchOptions().Ip : Grasscutter.getConfig().getDispatchOptions().PublicIp) + ":" + getAddress().getPort() + "/query_cur_region") .build(); QueryRegionListHttpRsp regionList = QueryRegionListHttpRsp.newBuilder() @@ -123,8 +123,8 @@ public final class DispatchServer { .build(); RegionInfo currentRegion = regionQuery.getRegionInfo().toBuilder() - .setIp((Grasscutter.getConfig().GameServerPublicIp.isEmpty() ? Grasscutter.getConfig().GameServerIp : Grasscutter.getConfig().GameServerPublicIp)) - .setPort(Grasscutter.getConfig().GameServerPort) + .setIp((Grasscutter.getConfig().getGameServerOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getGameServerOptions().Ip : Grasscutter.getConfig().getGameServerOptions().PublicIp)) + .setPort(Grasscutter.getConfig().getGameServerOptions().Port) .setSecretKey(ByteString.copyFrom(FileUtils.read(Grasscutter.getConfig().KEY_FOLDER + "dispatchSeed.bin"))) .build(); @@ -140,12 +140,12 @@ public final class DispatchServer { public void start() throws Exception { HttpServer server; - if(Grasscutter.getConfig().UseSSL) { + if(Grasscutter.getConfig().getDispatchOptions().UseSSL) { HttpsServer httpsServer; httpsServer = HttpsServer.create(getAddress(), 0); SSLContext sslContext = SSLContext.getInstance("TLS"); - try (FileInputStream fis = new FileInputStream(Grasscutter.getConfig().DispatchServerKeystorePath)) { - char[] keystorePassword = Grasscutter.getConfig().DispatchServerKeystorePassword.toCharArray(); + try (FileInputStream fis = new FileInputStream(Grasscutter.getConfig().getDispatchOptions().KeystorePath)) { + char[] keystorePassword = Grasscutter.getConfig().getDispatchOptions().KeystorePassword.toCharArray(); KeyStore ks = KeyStore.getInstance("PKCS12"); ks.load(fis, keystorePassword); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); @@ -228,7 +228,7 @@ public final class DispatchServer { // Check if account exists, else create a new one. if (account == null) { // Account doesnt exist, so we can either auto create it if the config value is set - if (Grasscutter.getConfig().ServerOptions.AutomaticallyCreateAccounts) { + if (Grasscutter.getConfig().getDispatchOptions().AutomaticallyCreateAccounts) { // This account has been created AUTOMATICALLY. There will be no permissions added. account = DatabaseHelper.createAccountWithId(requestData.account, 0); @@ -410,7 +410,7 @@ public final class DispatchServer { Grasscutter.getLogger().info("Dispatch server started on port " + getAddress().getPort()); // Logging servers - HttpServer overseaLogServer = HttpServer.create(new InetSocketAddress(Grasscutter.getConfig().DispatchServerIp, 8888), 0); + HttpServer overseaLogServer = HttpServer.create(new InetSocketAddress(Grasscutter.getConfig().getDispatchOptions().Ip, 8888), 0); overseaLogServer.createContext( // overseauspider.yuanshen.com "/log", new DispatchHttpJsonHandler("{\"code\":0}") @@ -418,7 +418,7 @@ public final class DispatchServer { overseaLogServer.start(); Grasscutter.getLogger().info("Log server (overseauspider) started on port " + 8888); - HttpServer uploadLogServer = HttpServer.create(new InetSocketAddress(Grasscutter.getConfig().DispatchServerIp, Grasscutter.getConfig().UploadLogPort), 0); + HttpServer uploadLogServer = HttpServer.create(new InetSocketAddress(Grasscutter.getConfig().getDispatchOptions().Ip, Grasscutter.getConfig().getDispatchOptions().UploadLogPort), 0); uploadLogServer.createContext( // log-upload-os.mihoyo.com "/crash/dataUpload", new DispatchHttpJsonHandler("{\"code\":0}") @@ -435,7 +435,7 @@ public final class DispatchServer { os.close(); }); uploadLogServer.start(); - Grasscutter.getLogger().info("Log server (log-upload-os) started on port " + Grasscutter.getConfig().UploadLogPort); + Grasscutter.getLogger().info("Log server (log-upload-os) started on port " + Grasscutter.getConfig().getDispatchOptions().UploadLogPort); } private Map parseQueryString(String qs) { diff --git a/src/main/java/emu/grasscutter/server/game/GameServerPacketHandler.java b/src/main/java/emu/grasscutter/server/game/GameServerPacketHandler.java index 118637668..62a57df91 100644 --- a/src/main/java/emu/grasscutter/server/game/GameServerPacketHandler.java +++ b/src/main/java/emu/grasscutter/server/game/GameServerPacketHandler.java @@ -87,7 +87,7 @@ public class GameServerPacketHandler { } // Log unhandled packets - if (Grasscutter.getConfig().LOG_PACKETS) { + if (Grasscutter.getConfig().getGameServerOptions().LOG_PACKETS) { //Grasscutter.getLogger().info("Unhandled packet (" + opcode + "): " + PacketOpcodesUtil.getOpcodeName(opcode)); } } diff --git a/src/main/java/emu/grasscutter/server/game/GameSession.java b/src/main/java/emu/grasscutter/server/game/GameSession.java index 1a54f31ba..ebd66dc20 100644 --- a/src/main/java/emu/grasscutter/server/game/GameSession.java +++ b/src/main/java/emu/grasscutter/server/game/GameSession.java @@ -165,7 +165,7 @@ public class GameSession extends MihoyoKcpChannel { byte[] data = genshinPacket.build(); // Log - if (Grasscutter.getConfig().LOG_PACKETS) { + if (Grasscutter.getConfig().getGameServerOptions().LOG_PACKETS) { logPacket(genshinPacket); } @@ -225,7 +225,7 @@ public class GameSession extends MihoyoKcpChannel { } // Log packet - if (Grasscutter.getConfig().LOG_PACKETS) { + if (Grasscutter.getConfig().getGameServerOptions().LOG_PACKETS) { Grasscutter.getLogger().info("RECV: " + PacketOpcodesUtil.getOpcodeName(opcode) + " (" + opcode + ")"); System.out.println(Utils.bytesToHex(payload)); } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerStoreNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerStoreNotify.java index c21a15351..a3309a5c1 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerStoreNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerStoreNotify.java @@ -19,7 +19,7 @@ public class PacketPlayerStoreNotify extends GenshinPacket { PlayerStoreNotify.Builder p = PlayerStoreNotify.newBuilder() .setStoreType(StoreType.StorePack) - .setWeightLimit(Grasscutter.getConfig().getServerOptions().InventoryLimitAll); + .setWeightLimit(Grasscutter.getConfig().getGameServerOptions().InventoryLimitAll); for (GenshinItem item : player.getInventory()) { Item itemProto = item.toProto(); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPullRecentChatRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPullRecentChatRsp.java index 8048e4b0d..5af6999d5 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPullRecentChatRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPullRecentChatRsp.java @@ -1,6 +1,6 @@ package emu.grasscutter.server.packet.send; -import emu.grasscutter.Config.ServerOptions; +import emu.grasscutter.Config.GameServerOptions; import emu.grasscutter.GenshinConstants; import emu.grasscutter.Grasscutter; import emu.grasscutter.game.GenshinPlayer; @@ -14,7 +14,7 @@ public class PacketPullRecentChatRsp extends GenshinPacket { public PacketPullRecentChatRsp(GenshinPlayer player) { super(PacketOpcodes.PullRecentChatRsp); - ServerOptions serverOptions = Grasscutter.getConfig().getServerOptions(); + GameServerOptions serverOptions = Grasscutter.getConfig().getGameServerOptions(); PullRecentChatRsp.Builder proto = PullRecentChatRsp.newBuilder(); if (serverOptions.WelcomeEmotes != null && serverOptions.WelcomeEmotes.length > 0) { @@ -33,7 +33,7 @@ public class PacketPullRecentChatRsp extends GenshinPacket { .setTime((int) (System.currentTimeMillis() / 1000)) .setUid(GenshinConstants.SERVER_CONSOLE_UID) .setToUid(player.getUid()) - .setText(Grasscutter.getConfig().getServerOptions().WelcomeMotd) + .setText(Grasscutter.getConfig().getGameServerOptions().WelcomeMotd) .build(); proto.addChatInfo(welcomeMotd); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketStoreWeightLimitNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketStoreWeightLimitNotify.java index b93130388..04668b00e 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketStoreWeightLimitNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketStoreWeightLimitNotify.java @@ -13,11 +13,11 @@ public class PacketStoreWeightLimitNotify extends GenshinPacket { StoreWeightLimitNotify p = StoreWeightLimitNotify.newBuilder() .setStoreType(StoreType.StorePack) - .setWeightLimit(Grasscutter.getConfig().getServerOptions().InventoryLimitAll) - .setWeaponCountLimit(Grasscutter.getConfig().getServerOptions().InventoryLimitWeapon) - .setReliquaryCountLimit(Grasscutter.getConfig().getServerOptions().InventoryLimitRelic) - .setMaterialCountLimit(Grasscutter.getConfig().getServerOptions().InventoryLimitMaterial) - .setFurnitureCountLimit(Grasscutter.getConfig().getServerOptions().InventoryLimitFurniture) + .setWeightLimit(Grasscutter.getConfig().getGameServerOptions().InventoryLimitAll) + .setWeaponCountLimit(Grasscutter.getConfig().getGameServerOptions().InventoryLimitWeapon) + .setReliquaryCountLimit(Grasscutter.getConfig().getGameServerOptions().InventoryLimitRelic) + .setMaterialCountLimit(Grasscutter.getConfig().getGameServerOptions().InventoryLimitMaterial) + .setFurnitureCountLimit(Grasscutter.getConfig().getGameServerOptions().InventoryLimitFurniture) .build(); this.setData(p); From 39cad79279afd007f3d03243073613c4afeedddf Mon Sep 17 00:00:00 2001 From: labalityowo <56186498+labalityowo@users.noreply.github.com> Date: Thu, 21 Apr 2022 14:01:51 +0700 Subject: [PATCH 074/119] Fix Ayaka and weapon banner titles not showing up --- data/Banners.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/Banners.json b/data/Banners.json index 959a8b436..a4f724ac9 100644 --- a/data/Banners.json +++ b/data/Banners.json @@ -19,7 +19,7 @@ "bannerType": "EVENT", "prefabPath": "GachaShowPanel_A079", "previewPrefabPath": "UI_Tab_GachaShowPanel_A079", - "titlePath": "UI_GACHA_SHOW_PANEL_A079_TITLE", + "titlePath": "UI_GACHA_SHOW_PANEL_A048_TITLE", "costItem": 223, "beginTime": 0, "endTime": 1924992000, @@ -34,7 +34,7 @@ "bannerType": "WEAPON", "prefabPath": "GachaShowPanel_A080", "previewPrefabPath": "UI_Tab_GachaShowPanel_A080", - "titlePath": "UI_GACHA_SHOW_PANEL_A080_TITLE", + "titlePath": "UI_GACHA_SHOW_PANEL_A021_TITLE", "costItem": 223, "beginTime": 0, "endTime": 1924992000, From c0e859b17c5639ef219ad56a3d5449fe22f4a8a9 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Thu, 21 Apr 2022 00:28:28 -0700 Subject: [PATCH 075/119] Add config entry for OverseaLogPort (default: 8888) --- src/main/java/emu/grasscutter/Config.java | 1 + .../java/emu/grasscutter/server/dispatch/DispatchServer.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/Config.java b/src/main/java/emu/grasscutter/Config.java index dddbbfa9e..4d4cf4a38 100644 --- a/src/main/java/emu/grasscutter/Config.java +++ b/src/main/java/emu/grasscutter/Config.java @@ -13,6 +13,7 @@ public final class Config { public String GameServerPublicIp = ""; public int GameServerPort = 22102; + public int OverseaLogPort = 8888; public int UploadLogPort = 80; public String DatabaseUrl = "mongodb://localhost:27017"; diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index f13b9dc2f..6b4336858 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -410,7 +410,7 @@ public final class DispatchServer { Grasscutter.getLogger().info("Dispatch server started on port " + getAddress().getPort()); // Logging servers - HttpServer overseaLogServer = HttpServer.create(new InetSocketAddress(Grasscutter.getConfig().DispatchServerIp, 8888), 0); + HttpServer overseaLogServer = HttpServer.create(new InetSocketAddress(Grasscutter.getConfig().DispatchServerIp, Grasscutter.getConfig().OverseaLogPort), 0); overseaLogServer.createContext( // overseauspider.yuanshen.com "/log", new DispatchHttpJsonHandler("{\"code\":0}") From 3a0997bb5a1940cd2c81da21f92ba344ff3753b9 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Thu, 21 Apr 2022 00:29:06 -0700 Subject: [PATCH 076/119] Make sure SetEntityClientDataNotify is a valid proto before replaying it to the other players --- .../packet/recv/HandlerSetEntityClientDataNotify.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetEntityClientDataNotify.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetEntityClientDataNotify.java index 1a60f677b..d194e1465 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetEntityClientDataNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetEntityClientDataNotify.java @@ -3,6 +3,7 @@ package emu.grasscutter.server.packet.recv; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.Opcodes; import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.SetEntityClientDataNotifyOuterClass.SetEntityClientDataNotify; import emu.grasscutter.net.packet.PacketHandler; import emu.grasscutter.server.game.GameSession; @@ -16,8 +17,11 @@ public class HandlerSetEntityClientDataNotify extends PacketHandler { return; } + // Make sure packet is a valid proto before replaying it to the other players + SetEntityClientDataNotify notif = SetEntityClientDataNotify.parseFrom(payload); + GenshinPacket packet = new GenshinPacket(PacketOpcodes.SetEntityClientDataNotify, true); - packet.setData(payload); + packet.setData(notif); session.getPlayer().getScene().broadcastPacketToOthers(session.getPlayer(), packet); } From 6a091b254c9843ce36a38af24d04998989592e31 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Thu, 21 Apr 2022 18:04:00 +0800 Subject: [PATCH 077/119] Multi-server dispatch support and server run modes --- src/main/java/emu/grasscutter/Config.java | 19 +++ .../java/emu/grasscutter/Grasscutter.java | 32 +++- .../grasscutter/database/DatabaseHelper.java | 12 +- .../grasscutter/database/DatabaseManager.java | 43 ++++- .../server/dispatch/DispatchServer.java | 161 ++++++++++++------ .../packet/send/PacketPlayerLoginRsp.java | 2 +- 6 files changed, 198 insertions(+), 71 deletions(-) diff --git a/src/main/java/emu/grasscutter/Config.java b/src/main/java/emu/grasscutter/Config.java index c6748fb41..938cbec77 100644 --- a/src/main/java/emu/grasscutter/Config.java +++ b/src/main/java/emu/grasscutter/Config.java @@ -1,5 +1,7 @@ package emu.grasscutter; +import java.util.ArrayList; + public final class Config { public String DatabaseUrl = "mongodb://localhost:27017"; @@ -11,6 +13,7 @@ public final class Config { public String DUMPS_FOLDER = "./dumps/"; public String KEY_FOLDER = "./keys/"; + public String RunMode = "HYBRID"; // HYBRID, DISPATCH_ONLY, GAME_ONLY public GameServerOptions GameServer = new GameServerOptions(); public DispatchServerOptions DispatchServer = new DispatchServerOptions(); @@ -30,6 +33,19 @@ public final class Config { public Boolean UseSSL = true; public boolean AutomaticallyCreateAccounts = false; + + public RegionInfo[] GameServers = {}; + + public RegionInfo[] getGameServers() { + return GameServers; + } + + public static class RegionInfo { + public String Name = "os_usa"; + public String Title = "Test"; + public String Ip = "127.0.0.1"; + public int Port = 22102; + } } public static class GameServerOptions { @@ -38,6 +54,9 @@ public final class Config { public String PublicIp = ""; public int Port = 22102; + public String DispatchServerDatabaseUrl = "mongodb://localhost:27017"; + public String DispatchServerDatabaseCollection = "grasscutter"; + public boolean LOG_PACKETS = false; public int InventoryLimitWeapon = 2000; diff --git a/src/main/java/emu/grasscutter/Grasscutter.java b/src/main/java/emu/grasscutter/Grasscutter.java index 0b8f1efd8..614b67ca1 100644 --- a/src/main/java/emu/grasscutter/Grasscutter.java +++ b/src/main/java/emu/grasscutter/Grasscutter.java @@ -73,11 +73,26 @@ public final class Grasscutter { DatabaseManager.initialize(); // Start servers. - dispatchServer = new DispatchServer(); - dispatchServer.start(); - - gameServer = new GameServer(new InetSocketAddress(getConfig().getGameServerOptions().Ip, getConfig().getGameServerOptions().Port)); - gameServer.start(); + if(getConfig().RunMode.equalsIgnoreCase("HYBRID")) { + dispatchServer = new DispatchServer(); + dispatchServer.start(); + + gameServer = new GameServer(new InetSocketAddress(getConfig().getGameServerOptions().Ip, getConfig().getGameServerOptions().Port)); + gameServer.start(); + } else if(getConfig().RunMode.equalsIgnoreCase("DISPATCH_ONLY")) { + dispatchServer = new DispatchServer(); + dispatchServer.start(); + } else if(getConfig().RunMode.equalsIgnoreCase("GAME_ONLY")) { + gameServer = new GameServer(new InetSocketAddress(getConfig().getGameServerOptions().Ip, getConfig().getGameServerOptions().Port)); + gameServer.start(); + } else { + getLogger().error("Invalid server run mode. " + getConfig().RunMode); + getLogger().error("Server run mode must be 'HYBRID', 'DISPATCH_ONLY', or 'GAME_ONLY'. Unable to start Grasscutter..."); + getLogger().error("Shutting down..."); + System.exit(1); + } + + // Open console. startConsole(); @@ -104,9 +119,14 @@ public final class Grasscutter { try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { while ((input = br.readLine()) != null) { try { + if(getConfig().RunMode.equalsIgnoreCase("DISPATCH_ONLY")) { + getLogger().error("Commands are not supported in dispatch only mode"); + return; + } CommandMap.getInstance().invoke(null, input); } catch (Exception e) { - Grasscutter.getLogger().error("Command error: " + e.getMessage()); + Grasscutter.getLogger().error("Command error: "); + e.printStackTrace(); } } } catch (Exception e) { diff --git a/src/main/java/emu/grasscutter/database/DatabaseHelper.java b/src/main/java/emu/grasscutter/database/DatabaseHelper.java index 0289c3e71..ed092e976 100644 --- a/src/main/java/emu/grasscutter/database/DatabaseHelper.java +++ b/src/main/java/emu/grasscutter/database/DatabaseHelper.java @@ -74,36 +74,36 @@ public class DatabaseHelper { } public static void saveAccount(Account account) { - DatabaseManager.getDatastore().save(account); + DatabaseManager.getAccountDatastore().save(account); } public static Account getAccountByName(String username) { - MorphiaCursor cursor = DatabaseManager.getDatastore().createQuery(Account.class).field("username").equalIgnoreCase(username).find(FIND_ONE); + MorphiaCursor cursor = DatabaseManager.getAccountDatastore().createQuery(Account.class).field("username").equalIgnoreCase(username).find(FIND_ONE); if (!cursor.hasNext()) return null; return cursor.next(); } public static Account getAccountByToken(String token) { if (token == null) return null; - MorphiaCursor cursor = DatabaseManager.getDatastore().createQuery(Account.class).field("token").equal(token).find(FIND_ONE); + MorphiaCursor cursor = DatabaseManager.getAccountDatastore().createQuery(Account.class).field("token").equal(token).find(FIND_ONE); if (!cursor.hasNext()) return null; return cursor.next(); } public static Account getAccountById(String uid) { - MorphiaCursor cursor = DatabaseManager.getDatastore().createQuery(Account.class).field("_id").equal(uid).find(FIND_ONE); + MorphiaCursor cursor = DatabaseManager.getAccountDatastore().createQuery(Account.class).field("_id").equal(uid).find(FIND_ONE); if (!cursor.hasNext()) return null; return cursor.next(); } public static Account getAccountByPlayerId(int playerId) { - MorphiaCursor cursor = DatabaseManager.getDatastore().createQuery(Account.class).field("playerId").equal(playerId).find(FIND_ONE); + MorphiaCursor cursor = DatabaseManager.getAccountDatastore().createQuery(Account.class).field("playerId").equal(playerId).find(FIND_ONE); if (!cursor.hasNext()) return null; return cursor.next(); } public static boolean deleteAccount(String username) { - Query q = DatabaseManager.getDatastore().createQuery(Account.class).field("username").equalIgnoreCase(username); + Query q = DatabaseManager.getAccountDatastore().createQuery(Account.class).field("username").equalIgnoreCase(username); return DatabaseManager.getDatastore().findAndDelete(q) != null; } diff --git a/src/main/java/emu/grasscutter/database/DatabaseManager.java b/src/main/java/emu/grasscutter/database/DatabaseManager.java index 97e27a81a..530581517 100644 --- a/src/main/java/emu/grasscutter/database/DatabaseManager.java +++ b/src/main/java/emu/grasscutter/database/DatabaseManager.java @@ -17,7 +17,10 @@ import emu.grasscutter.game.inventory.GenshinItem; public final class DatabaseManager { private static MongoClient mongoClient; + private static MongoClient dispatchMongoClient; + private static Datastore datastore; + private static Datastore dispatchDatastore; private static final Class[] mappedClasses = new Class[] { DatabaseCounter.class, Account.class, GenshinPlayer.class, GenshinAvatar.class, GenshinItem.class, Friendship.class @@ -26,18 +29,28 @@ public final class DatabaseManager { public static MongoClient getMongoClient() { return mongoClient; } - - public static Datastore getDatastore() { - return datastore; - } - - public static MongoDatabase getDatabase() { + + public static Datastore getDatastore() { + return datastore; + } + + public static MongoDatabase getDatabase() { return getDatastore().getDatabase(); } + + // Yes. I very dislike this method also but I'm lazy. Probably replace it by making the game server connect to the dispatch server instead. + public static Datastore getAccountDatastore() { + if(Grasscutter.getConfig().RunMode.equalsIgnoreCase("GAME_ONLY")) { + return dispatchDatastore; + } else { + return datastore; + } + } public static void initialize() { // Initialize mongoClient = new MongoClient(new MongoClientURI(Grasscutter.getConfig().DatabaseUrl)); + dispatchMongoClient = new MongoClient(new MongoClientURI(Grasscutter.getConfig().getGameServerOptions().DispatchServerDatabaseUrl)); Morphia morphia = new Morphia(); // TODO Update when migrating to Morphia 2.0 @@ -50,6 +63,7 @@ public final class DatabaseManager { // Build datastore datastore = morphia.createDatastore(mongoClient, Grasscutter.getConfig().DatabaseCollection); + dispatchDatastore = morphia.createDatastore(dispatchMongoClient, Grasscutter.getConfig().getGameServerOptions().DispatchServerDatabaseCollection); // Ensure indexes try { @@ -67,6 +81,23 @@ public final class DatabaseManager { datastore.ensureIndexes(); } } + + // Ensure indexes for dispatch server + try { + dispatchDatastore.ensureIndexes(); + } catch (MongoCommandException e) { + Grasscutter.getLogger().info("Mongo index error: ", e); + // Duplicate index error + if (e.getCode() == 85) { + // Drop all indexes and re add them + MongoIterable collections = dispatchDatastore.getDatabase().listCollectionNames(); + for (String name : collections) { + dispatchDatastore.getDatabase().getCollection(name).dropIndexes(); + } + // Add back indexes + dispatchDatastore.ensureIndexes(); + } + } } public static synchronized int getNextId(Class c) { diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index cda908480..53699b05b 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -9,10 +9,7 @@ import java.net.InetSocketAddress; import java.net.URI; import java.net.URLDecoder; import java.security.KeyStore; -import java.util.Base64; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; @@ -25,6 +22,7 @@ import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpsConfigurator; import com.sun.net.httpserver.HttpsServer; +import emu.grasscutter.Config; import emu.grasscutter.Grasscutter; import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.game.Account; @@ -46,15 +44,18 @@ import com.sun.net.httpserver.HttpServer; public final class DispatchServer { private final InetSocketAddress address; private final Gson gson; - private QueryCurrRegionHttpRsp currRegion; + //private QueryCurrRegionHttpRsp currRegion; public String regionListBase64; - public String regionCurrentBase64; - + public HashMap regions; + public HashMap usersIngame; + public static String query_region_list = ""; public static String query_cur_region = ""; - + public DispatchServer() { + this.regions = new HashMap(); + this.usersIngame = new HashMap(); this.address = new InetSocketAddress(Grasscutter.getConfig().getDispatchOptions().Ip, Grasscutter.getConfig().getDispatchOptions().Port); this.gson = new GsonBuilder().create(); @@ -70,8 +71,13 @@ public final class DispatchServer { return gson; } - public QueryCurrRegionHttpRsp getCurrRegion() { - return currRegion; + public QueryCurrRegionHttpRsp getCurrRegion(InetSocketAddress address) { + if(usersIngame.containsKey(address)) { + return regions.get(usersIngame.get(address)).parsedRegionQuery; + } + + Grasscutter.getLogger().error("User is not logged in to dispatch server. " + address.getAddress() + ":" + address.getPort()); + return null; } public void loadQueries() { @@ -100,39 +106,67 @@ public final class DispatchServer { byte[] decoded2 = Base64.getDecoder().decode(query_cur_region); QueryCurrRegionHttpRsp regionQuery = QueryCurrRegionHttpRsp.parseFrom(decoded2); - RegionSimpleInfo server = RegionSimpleInfo.newBuilder() - .setName("os_usa") - .setTitle(Grasscutter.getConfig().getGameServerOptions().Name) - .setType("DEV_PUBLIC") - .setDispatchUrl("https://" + (Grasscutter.getConfig().getDispatchOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getDispatchOptions().Ip : Grasscutter.getConfig().getDispatchOptions().PublicIp) + ":" + getAddress().getPort() + "/query_cur_region") - .build(); - - RegionSimpleInfo serverTest2 = RegionSimpleInfo.newBuilder() - .setName("os_euro") - .setTitle("Grasscutter") - .setType("DEV_PUBLIC") - .setDispatchUrl("https://" + (Grasscutter.getConfig().getDispatchOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getDispatchOptions().Ip : Grasscutter.getConfig().getDispatchOptions().PublicIp) + ":" + getAddress().getPort() + "/query_cur_region") - .build(); - + List servers = new ArrayList(); + List usedNames = new ArrayList(); // List to check for potential naming conflicts + if(Grasscutter.getConfig().RunMode.equalsIgnoreCase("HYBRID")) { // Automatically add the game server if in hybrid mode + String defaultServerName = "os_usa"; + RegionSimpleInfo server = RegionSimpleInfo.newBuilder() + .setName("os_usa") + .setTitle(Grasscutter.getConfig().getGameServerOptions().Name) + .setType("DEV_PUBLIC") + .setDispatchUrl("https://" + (Grasscutter.getConfig().getDispatchOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getDispatchOptions().Ip : Grasscutter.getConfig().getDispatchOptions().PublicIp) + ":" + getAddress().getPort() + "/query_cur_region_" + defaultServerName) + .build(); + usedNames.add(defaultServerName); + servers.add(server); + + RegionInfo serverRegion = regionQuery.getRegionInfo().toBuilder() + .setIp((Grasscutter.getConfig().getGameServerOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getGameServerOptions().Ip : Grasscutter.getConfig().getGameServerOptions().PublicIp)) + .setPort(Grasscutter.getConfig().getGameServerOptions().Port) + .setSecretKey(ByteString.copyFrom(FileUtils.read(Grasscutter.getConfig().KEY_FOLDER + "dispatchSeed.bin"))) + .build(); + + QueryCurrRegionHttpRsp parsedRegionQuery = regionQuery.toBuilder().setRegionInfo(serverRegion).build(); + regions.put(defaultServerName, new RegionData(parsedRegionQuery, Base64.getEncoder().encodeToString(parsedRegionQuery.toByteString().toByteArray()))); + + } else { + if(Grasscutter.getConfig().getDispatchOptions().getGameServers().length == 0) { + Grasscutter.getLogger().error("Dispatch server has no game servers available. Exiting due to unplayable state."); + System.exit(1); + } + } + + for (Config.DispatchServerOptions.RegionInfo regionInfo : Grasscutter.getConfig().getDispatchOptions().getGameServers()) { + if(usedNames.contains(regionInfo.Name)) { + Grasscutter.getLogger().error("Region name already in use."); + continue; + } + RegionSimpleInfo server = RegionSimpleInfo.newBuilder() + .setName(regionInfo.Name) + .setTitle(regionInfo.Title) + .setType("DEV_PUBLIC") + .setDispatchUrl("https://" + (Grasscutter.getConfig().getDispatchOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getDispatchOptions().Ip : Grasscutter.getConfig().getDispatchOptions().PublicIp) + ":" + getAddress().getPort() + "/query_cur_region_" + regionInfo.Name) + .build(); + usedNames.add(regionInfo.Name); + servers.add(server); + + RegionInfo serverRegion = regionQuery.getRegionInfo().toBuilder() + .setIp(regionInfo.Ip) + .setPort(regionInfo.Port) + .setSecretKey(ByteString.copyFrom(FileUtils.read(Grasscutter.getConfig().KEY_FOLDER + "dispatchSeed.bin"))) + .build(); + + QueryCurrRegionHttpRsp parsedRegionQuery = regionQuery.toBuilder().setRegionInfo(serverRegion).build(); + regions.put(regionInfo.Name, new RegionData(parsedRegionQuery, Base64.getEncoder().encodeToString(parsedRegionQuery.toByteString().toByteArray()))); + } + QueryRegionListHttpRsp regionList = QueryRegionListHttpRsp.newBuilder() - .addServers(server) - .addServers(serverTest2) + .addAllServers(servers) .setClientSecretKey(rl.getClientSecretKey()) .setClientCustomConfigEncrypted(rl.getClientCustomConfigEncrypted()) .setEnableLoginPc(true) .build(); - - RegionInfo currentRegion = regionQuery.getRegionInfo().toBuilder() - .setIp((Grasscutter.getConfig().getGameServerOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getGameServerOptions().Ip : Grasscutter.getConfig().getGameServerOptions().PublicIp)) - .setPort(Grasscutter.getConfig().getGameServerOptions().Port) - .setSecretKey(ByteString.copyFrom(FileUtils.read(Grasscutter.getConfig().KEY_FOLDER + "dispatchSeed.bin"))) - .build(); - - QueryCurrRegionHttpRsp parsedRegionQuery = regionQuery.toBuilder().setRegionInfo(currentRegion).build(); this.regionListBase64 = Base64.getEncoder().encodeToString(regionList.toByteString().toByteArray()); - this.regionCurrentBase64 = Base64.getEncoder().encodeToString(parsedRegionQuery.toByteString().toByteArray()); - this.currRegion = parsedRegionQuery; } catch (Exception e) { Grasscutter.getLogger().error("Error while initializing region info!", e); } @@ -188,24 +222,36 @@ public final class DispatchServer { OutputStream os = t.getResponseBody(); os.write(response.getBytes()); os.close(); - }); - server.createContext("/query_cur_region", t -> { - // Log - Grasscutter.getLogger().info("Client request: query_cur_region"); - // Create a response form the request query parameters - URI uri = t.getRequestURI(); - String response = "CAESGE5vdCBGb3VuZCB2ZXJzaW9uIGNvbmZpZw=="; - if (uri.getQuery() != null && uri.getQuery().length() > 0) { - response = regionCurrentBase64; + + if(usersIngame.containsKey(t.getRemoteAddress())) { + usersIngame.remove(t.getRemoteAddress()); } - // Set the response header status and length - t.getResponseHeaders().put("Content-Type", Collections.singletonList("text/html; charset=UTF-8")); - t.sendResponseHeaders(200, response.getBytes().length); - // Write the response string - OutputStream os = t.getResponseBody(); - os.write(response.getBytes()); - os.close(); }); + + for (String regionName : regions.keySet()) { + server.createContext("/query_cur_region_" + regionName, t -> { + String regionCurrentBase64 = regions.get(regionName).Base64; + + // Log + Grasscutter.getLogger().info("Client request: query_cur_region_" + regionName); + // Create a response form the request query parameters + URI uri = t.getRequestURI(); + String response = "CAESGE5vdCBGb3VuZCB2ZXJzaW9uIGNvbmZpZw=="; + if (uri.getQuery() != null && uri.getQuery().length() > 0) { + response = regionCurrentBase64; + } + // Set the response header status and length + t.getResponseHeaders().put("Content-Type", Collections.singletonList("text/html; charset=UTF-8")); + t.sendResponseHeaders(200, response.getBytes().length); + // Write the response string + OutputStream os = t.getResponseBody(); + os.write(response.getBytes()); + os.close(); + //Save region info to hashmap for user, this for getCurrRegion(); + usersIngame.put(t.getRemoteAddress(), regionName); + }); + } + // Login via account server.createContext("/hk4e_global/mdk/shield/api/login", t -> { // Get post data @@ -464,4 +510,15 @@ public final class DispatchServer { } return result; } + + public static class RegionData { + + QueryCurrRegionHttpRsp parsedRegionQuery; + String Base64; + + public RegionData(QueryCurrRegionHttpRsp prq, String b64) { + this.parsedRegionQuery = prq; + this.Base64 = b64; + } + } } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java index 0d0871ca9..eef1a03e6 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java @@ -14,7 +14,7 @@ public class PacketPlayerLoginRsp extends GenshinPacket { this.setUseDispatchKey(true); - RegionInfo info = Grasscutter.getDispatchServer().getCurrRegion().getRegionInfo(); + RegionInfo info = Grasscutter.getDispatchServer().getCurrRegion(session.getAddress()).getRegionInfo(); PlayerLoginRsp p = PlayerLoginRsp.newBuilder() .setIsUseAbilityHash(true) // true From 585187bebef5de277603467fde0c82e281dbcc80 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Thu, 21 Apr 2022 19:20:49 +0800 Subject: [PATCH 078/119] Fixed null pointer exception in hybrid mode. --- .../server/dispatch/DispatchServer.java | 27 +++++++++---------- .../packet/send/PacketPlayerLoginRsp.java | 2 +- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index 6b2661def..37ed6c5ac 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -5,6 +5,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.URI; import java.net.URLDecoder; @@ -44,18 +45,18 @@ import com.sun.net.httpserver.HttpServer; public final class DispatchServer { private final InetSocketAddress address; private final Gson gson; + private final String defaultServerName = "os_usa"; //private QueryCurrRegionHttpRsp currRegion; public String regionListBase64; public HashMap regions; - public HashMap usersIngame; + public HashMap usersConnected; public static String query_region_list = ""; public static String query_cur_region = ""; public DispatchServer() { this.regions = new HashMap(); - this.usersIngame = new HashMap(); this.address = new InetSocketAddress(Grasscutter.getConfig().getDispatchOptions().Ip, Grasscutter.getConfig().getDispatchOptions().Port); this.gson = new GsonBuilder().create(); @@ -71,12 +72,13 @@ public final class DispatchServer { return gson; } - public QueryCurrRegionHttpRsp getCurrRegion(InetSocketAddress address) { - if(usersIngame.containsKey(address)) { - return regions.get(usersIngame.get(address)).parsedRegionQuery; + public QueryCurrRegionHttpRsp getCurrRegion() { + // Needs to be fixed by having the game servers connect to the dispatch server. + if(Grasscutter.getConfig().RunMode.equalsIgnoreCase("HYBRID")) { + return regions.get(defaultServerName).parsedRegionQuery; } - Grasscutter.getLogger().error("User is not logged in to dispatch server. " + address.getAddress() + ":" + address.getPort()); + Grasscutter.getLogger().error("Ignore the error below"); return null; } @@ -109,7 +111,6 @@ public final class DispatchServer { List servers = new ArrayList(); List usedNames = new ArrayList(); // List to check for potential naming conflicts if(Grasscutter.getConfig().RunMode.equalsIgnoreCase("HYBRID")) { // Automatically add the game server if in hybrid mode - String defaultServerName = "os_usa"; RegionSimpleInfo server = RegionSimpleInfo.newBuilder() .setName("os_usa") .setTitle(Grasscutter.getConfig().getGameServerOptions().Name) @@ -222,16 +223,11 @@ public final class DispatchServer { OutputStream os = t.getResponseBody(); os.write(response.getBytes()); os.close(); - - if(usersIngame.containsKey(t.getRemoteAddress())) { - usersIngame.remove(t.getRemoteAddress()); - } }); for (String regionName : regions.keySet()) { server.createContext("/query_cur_region_" + regionName, t -> { String regionCurrentBase64 = regions.get(regionName).Base64; - // Log Grasscutter.getLogger().info("Client request: query_cur_region_" + regionName); // Create a response form the request query parameters @@ -247,8 +243,6 @@ public final class DispatchServer { OutputStream os = t.getResponseBody(); os.write(response.getBytes()); os.close(); - //Save region info to hashmap for user, this for getCurrRegion(); - usersIngame.put(t.getRemoteAddress(), regionName); }); } @@ -521,4 +515,9 @@ public final class DispatchServer { this.Base64 = b64; } } + + public static class UserConnnectionData { + public InetAddress dispatchConnectedAddress; + public String connectedRegion; + } } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java index eef1a03e6..0d0871ca9 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java @@ -14,7 +14,7 @@ public class PacketPlayerLoginRsp extends GenshinPacket { this.setUseDispatchKey(true); - RegionInfo info = Grasscutter.getDispatchServer().getCurrRegion(session.getAddress()).getRegionInfo(); + RegionInfo info = Grasscutter.getDispatchServer().getCurrRegion().getRegionInfo(); PlayerLoginRsp p = PlayerLoginRsp.newBuilder() .setIsUseAbilityHash(true) // true From ced378cee84a943532e45bab0de38e1e1d21c4da Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Thu, 21 Apr 2022 21:41:07 +0800 Subject: [PATCH 079/119] Add port & SSL options to proxy script Signed-off-by: Jaida Wu --- proxy.py | 9 ++++++++- proxy_config.py | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/proxy.py b/proxy.py index 2d2282af9..86145cde6 100644 --- a/proxy.py +++ b/proxy.py @@ -16,12 +16,14 @@ # - mitmdump from mitmproxy # # @author MlgmXyysd -# @version 1.0 +# @version 1.1 # ## from mitmproxy import http +from proxy_config import USE_SSL from proxy_config import REMOTE_HOST +from proxy_config import REMOTE_PORT class MlgmXyysd_Genshin_Impact_Proxy: @@ -60,7 +62,12 @@ class MlgmXyysd_Genshin_Impact_Proxy: def request(self, flow: http.HTTPFlow) -> None: if flow.request.host in self.LIST_DOMAINS: + if USE_SSL: + flow.request.scheme = "https" + else: + flow.request.scheme = "http" flow.request.host = REMOTE_HOST + flow.request.port = REMOTE_PORT addons = [ MlgmXyysd_Genshin_Impact_Proxy() diff --git a/proxy_config.py b/proxy_config.py index f048ef88c..5025a974e 100644 --- a/proxy_config.py +++ b/proxy_config.py @@ -1,2 +1,4 @@ # This can also be replaced with another IP address. -REMOTE_HOST = "localhost" \ No newline at end of file +USE_SSL = True +REMOTE_HOST = "127.0.0.1" +REMOTE_PORT = 443 \ No newline at end of file From 65e0799e79d42044df80c192a37914464600b38a Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Thu, 21 Apr 2022 21:41:30 +0800 Subject: [PATCH 080/119] Drop independent log server Signed-off-by: Jaida Wu --- src/main/java/emu/grasscutter/Config.java | 3 --- .../server/dispatch/DispatchServer.java | 18 ++++++------------ 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/main/java/emu/grasscutter/Config.java b/src/main/java/emu/grasscutter/Config.java index 4d4cf4a38..65ada3969 100644 --- a/src/main/java/emu/grasscutter/Config.java +++ b/src/main/java/emu/grasscutter/Config.java @@ -13,9 +13,6 @@ public final class Config { public String GameServerPublicIp = ""; public int GameServerPort = 22102; - public int OverseaLogPort = 8888; - public int UploadLogPort = 80; - public String DatabaseUrl = "mongodb://localhost:27017"; public String DatabaseCollection = "grasscutter"; diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index 6b4336858..e59f9d251 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -405,25 +405,18 @@ public final class DispatchServer { "/perf/config/verify", new DispatchHttpJsonHandler("{\"code\":0}") ); - // Start server - server.start(); - Grasscutter.getLogger().info("Dispatch server started on port " + getAddress().getPort()); // Logging servers - HttpServer overseaLogServer = HttpServer.create(new InetSocketAddress(Grasscutter.getConfig().DispatchServerIp, Grasscutter.getConfig().OverseaLogPort), 0); - overseaLogServer.createContext( // overseauspider.yuanshen.com + server.createContext( // overseauspider.yuanshen.com "/log", new DispatchHttpJsonHandler("{\"code\":0}") ); - overseaLogServer.start(); - Grasscutter.getLogger().info("Log server (overseauspider) started on port " + 8888); - HttpServer uploadLogServer = HttpServer.create(new InetSocketAddress(Grasscutter.getConfig().DispatchServerIp, Grasscutter.getConfig().UploadLogPort), 0); - uploadLogServer.createContext( // log-upload-os.mihoyo.com + server.createContext( // log-upload-os.mihoyo.com "/crash/dataUpload", new DispatchHttpJsonHandler("{\"code\":0}") ); - uploadLogServer.createContext("/gacha", t -> { + server.createContext("/gacha", t -> { //Create a response form the request query parameters String response = "Gacha"; //Set the response header status and length @@ -434,8 +427,9 @@ public final class DispatchServer { os.write(response.getBytes()); os.close(); }); - uploadLogServer.start(); - Grasscutter.getLogger().info("Log server (log-upload-os) started on port " + Grasscutter.getConfig().UploadLogPort); + // Start server + server.start(); + Grasscutter.getLogger().info("Dispatch server started on port " + getAddress().getPort()); } private Map parseQueryString(String qs) { From 66c956d10e10d18516ec6be949a259e75db4c2d9 Mon Sep 17 00:00:00 2001 From: xmplay <81370285+xmplay@users.noreply.github.com> Date: Thu, 21 Apr 2022 15:04:47 +0100 Subject: [PATCH 081/119] bring back the jade chamber and other old scene tags --- .../server/packet/send/PacketSceneUnlockInfoNotify.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneUnlockInfoNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneUnlockInfoNotify.java index fb45bb361..bd1b30685 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneUnlockInfoNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneUnlockInfoNotify.java @@ -12,7 +12,7 @@ public class PacketSceneUnlockInfoNotify extends GenshinPacket { SceneUnlockInfoNotify proto = SceneUnlockInfoNotify.newBuilder() .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(1)) - .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(3)) + .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(3).addSceneTagIdList(102).addSceneTagIdList(113).addSceneTagIdList(117)) .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(4).addSceneTagIdList(106).addSceneTagIdList(109)) .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(5)) .addUnlockInfos(SceneUnlockInfo.newBuilder().setSceneId(6)) From 1d5408431780e0cccc6899d22a87cd68ded10669 Mon Sep 17 00:00:00 2001 From: zamlty <29914613+zamlty@users.noreply.github.com> Date: Thu, 21 Apr 2022 22:21:39 +0800 Subject: [PATCH 082/119] Fix artifact & weapon generation by give command --- .../java/emu/grasscutter/command/commands/GiveCommand.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/GiveCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveCommand.java index 7d15a4759..a533130bc 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveCommand.java @@ -95,18 +95,19 @@ public final class GiveCommand implements CommandHandler { } private void item(GenshinPlayer player, ItemData itemData, int amount) { - GenshinItem genshinItem = new GenshinItem(itemData); if (itemData.isEquip()) { List items = new LinkedList<>(); for (int i = 0; i < amount; i++) { - items.add(genshinItem); + items.add(new GenshinItem(itemData)); } player.getInventory().addItems(items); player.sendPacket(new PacketItemAddHintNotify(items, ActionReason.SubfieldDrop)); } else { + GenshinItem genshinItem = new GenshinItem(itemData); genshinItem.setCount(amount); player.getInventory().addItem(genshinItem); player.sendPacket(new PacketItemAddHintNotify(genshinItem, ActionReason.SubfieldDrop)); } } } + From a36f29cdf1bb98596cb8f21ee9926d3ed11cc4f6 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Thu, 21 Apr 2022 22:38:01 +0800 Subject: [PATCH 083/119] Fixed null pointer exception in game only mode PacketPlayerLoginRsp now creates the required QuerryCurrRegionHttpRsp itself. --- .../packet/send/PacketPlayerLoginRsp.java | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java index 0d0871ca9..a5e167100 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java @@ -1,21 +1,61 @@ package emu.grasscutter.server.packet.send; +import com.google.protobuf.ByteString; import emu.grasscutter.Grasscutter; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.PlayerLoginRspOuterClass.PlayerLoginRsp; +import emu.grasscutter.net.proto.QueryCurrRegionHttpRspOuterClass; import emu.grasscutter.net.proto.RegionInfoOuterClass.RegionInfo; import emu.grasscutter.server.game.GameSession; +import emu.grasscutter.utils.FileUtils; + +import java.io.File; +import java.net.URL; +import java.util.Base64; public class PacketPlayerLoginRsp extends GenshinPacket { + private static QueryCurrRegionHttpRspOuterClass.QueryCurrRegionHttpRsp regionCache; + public PacketPlayerLoginRsp(GameSession session) { super(PacketOpcodes.PlayerLoginRsp, 1); this.setUseDispatchKey(true); - - RegionInfo info = Grasscutter.getDispatchServer().getCurrRegion().getRegionInfo(); - + + RegionInfo info; + + if(Grasscutter.getConfig().RunMode.equalsIgnoreCase("GAME_ONLY")) { + if (regionCache == null) { + try { + File file = new File(Grasscutter.getConfig().DATA_FOLDER + "query_cur_region.txt"); + String query_cur_region = ""; + if (file.exists()) { + query_cur_region = new String(FileUtils.read(file)); + } else { + Grasscutter.getLogger().warn("query_cur_region not found! Using default current region."); + } + + byte[] decodedCurRegion = Base64.getDecoder().decode(query_cur_region); + QueryCurrRegionHttpRspOuterClass.QueryCurrRegionHttpRsp regionQuery = QueryCurrRegionHttpRspOuterClass.QueryCurrRegionHttpRsp.parseFrom(decodedCurRegion); + + RegionInfo serverRegion = regionQuery.getRegionInfo().toBuilder() + .setIp((Grasscutter.getConfig().getGameServerOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getGameServerOptions().Ip : Grasscutter.getConfig().getGameServerOptions().PublicIp)) + .setPort(Grasscutter.getConfig().getGameServerOptions().Port) + .setSecretKey(ByteString.copyFrom(FileUtils.read(Grasscutter.getConfig().KEY_FOLDER + "dispatchSeed.bin"))) + .build(); + + regionCache = regionQuery.toBuilder().setRegionInfo(serverRegion).build(); + } catch (Exception e) { + Grasscutter.getLogger().error("Error while initializing region cache!", e); + } + } + + info = regionCache.getRegionInfo(); + } else { + info = Grasscutter.getDispatchServer().getCurrRegion().getRegionInfo(); + } + PlayerLoginRsp p = PlayerLoginRsp.newBuilder() .setIsUseAbilityHash(true) // true .setAbilityHashCode(1844674) // 1844674 From 63e008cbcf971c81e02fd9d632a7987c46fc41e0 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Thu, 21 Apr 2022 22:50:06 +0800 Subject: [PATCH 084/119] DatabaseManager clean up --- .../grasscutter/database/DatabaseManager.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/emu/grasscutter/database/DatabaseManager.java b/src/main/java/emu/grasscutter/database/DatabaseManager.java index 530581517..46dad537d 100644 --- a/src/main/java/emu/grasscutter/database/DatabaseManager.java +++ b/src/main/java/emu/grasscutter/database/DatabaseManager.java @@ -38,7 +38,8 @@ public final class DatabaseManager { return getDatastore().getDatabase(); } - // Yes. I very dislike this method also but I'm lazy. Probably replace it by making the game server connect to the dispatch server instead. + // Yes. I very dislike this method. However, this will be good for now. + // TODO: Add dispatch routes for player account management public static Datastore getAccountDatastore() { if(Grasscutter.getConfig().RunMode.equalsIgnoreCase("GAME_ONLY")) { return dispatchDatastore; @@ -50,7 +51,6 @@ public final class DatabaseManager { public static void initialize() { // Initialize mongoClient = new MongoClient(new MongoClientURI(Grasscutter.getConfig().DatabaseUrl)); - dispatchMongoClient = new MongoClient(new MongoClientURI(Grasscutter.getConfig().getGameServerOptions().DispatchServerDatabaseUrl)); Morphia morphia = new Morphia(); // TODO Update when migrating to Morphia 2.0 @@ -63,7 +63,6 @@ public final class DatabaseManager { // Build datastore datastore = morphia.createDatastore(mongoClient, Grasscutter.getConfig().DatabaseCollection); - dispatchDatastore = morphia.createDatastore(dispatchMongoClient, Grasscutter.getConfig().getGameServerOptions().DispatchServerDatabaseCollection); // Ensure indexes try { @@ -82,20 +81,25 @@ public final class DatabaseManager { } } - // Ensure indexes for dispatch server - try { - dispatchDatastore.ensureIndexes(); - } catch (MongoCommandException e) { - Grasscutter.getLogger().info("Mongo index error: ", e); - // Duplicate index error - if (e.getCode() == 85) { - // Drop all indexes and re add them - MongoIterable collections = dispatchDatastore.getDatabase().listCollectionNames(); - for (String name : collections) { - dispatchDatastore.getDatabase().getCollection(name).dropIndexes(); - } - // Add back indexes + if(Grasscutter.getConfig().RunMode.equalsIgnoreCase("GAME_ONLY")) { + dispatchMongoClient = new MongoClient(new MongoClientURI(Grasscutter.getConfig().getGameServerOptions().DispatchServerDatabaseUrl)); + dispatchDatastore = morphia.createDatastore(dispatchMongoClient, Grasscutter.getConfig().getGameServerOptions().DispatchServerDatabaseCollection); + + // Ensure indexes for dispatch server + try { dispatchDatastore.ensureIndexes(); + } catch (MongoCommandException e) { + Grasscutter.getLogger().info("Mongo index error: ", e); + // Duplicate index error + if (e.getCode() == 85) { + // Drop all indexes and re add them + MongoIterable collections = dispatchDatastore.getDatabase().listCollectionNames(); + for (String name : collections) { + dispatchDatastore.getDatabase().getCollection(name).dropIndexes(); + } + // Add back indexes + dispatchDatastore.ensureIndexes(); + } } } } From dee31057635d9978027d3463a5fd71539c039ad9 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Thu, 21 Apr 2022 22:55:32 +0800 Subject: [PATCH 085/119] Add list command Signed-off-by: Jaida Wu --- .../command/commands/ListCommand.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/emu/grasscutter/command/commands/ListCommand.java diff --git a/src/main/java/emu/grasscutter/command/commands/ListCommand.java b/src/main/java/emu/grasscutter/command/commands/ListCommand.java new file mode 100644 index 000000000..6afca4a6d --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/ListCommand.java @@ -0,0 +1,33 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; + +import java.util.List; +import java.util.Map; + +@Command(label = "list", description = "List online players") +public class ListCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + Map playersMap = Grasscutter.getGameServer().getPlayers(); + + CommandHandler.sendMessage(sender, String.format("There are %s player(s) online:", playersMap.size())); + + if (playersMap.size() != 0) { + StringBuilder playerSet = new StringBuilder(); + + for (Map.Entry entry : playersMap.entrySet()) { + playerSet.append(entry.getValue().getNickname()); + playerSet.append(", "); + } + + String players = playerSet.toString(); + + CommandHandler.sendMessage(sender, players.substring(0, players.length() - 2)); + } + } +} From 72355dd3c5c1cc1db16dfb04c7217084b2c1f184 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Thu, 21 Apr 2022 23:00:36 +0800 Subject: [PATCH 086/119] Removed class left over from testing --- .../java/emu/grasscutter/server/dispatch/DispatchServer.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index 37ed6c5ac..1978e6b08 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -515,9 +515,4 @@ public final class DispatchServer { this.Base64 = b64; } } - - public static class UserConnnectionData { - public InetAddress dispatchConnectedAddress; - public String connectedRegion; - } } From 66b5ed8a8399f7a5c7fddfaf4105c190ad0f69ae Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Thu, 21 Apr 2022 23:04:02 +0800 Subject: [PATCH 087/119] Should probably remove this as well... --- .../java/emu/grasscutter/server/dispatch/DispatchServer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index 1978e6b08..f77c264eb 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -50,7 +50,6 @@ public final class DispatchServer { public String regionListBase64; public HashMap regions; - public HashMap usersConnected; public static String query_region_list = ""; public static String query_cur_region = ""; From ae086ed18c2f149be4af706a599856dc4e6b2651 Mon Sep 17 00:00:00 2001 From: alt3ri <95161279+alt3ri@users.noreply.github.com> Date: Thu, 21 Apr 2022 22:45:02 +0700 Subject: [PATCH 088/119] Update README.md Removed !sethp, added !setstats, !pos, !weather --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 19f2a1e3e..24269f6b9 100644 --- a/README.md +++ b/README.md @@ -60,10 +60,14 @@ There is a dummy user named "Server" in every player's friends list that you can `!resetconst` - Resets the constellation level on your current active character, will need to relog after using the command to see any changes. -`!sethp [hp]` +`!setstats [stats] [amount]` - Changes the current character's specified stat. `!clearartifacts` - Deletes all unequipped and unlocked level 0 artifacts, **including yellow rarity ones** from your inventory +`!pos` - Gets your current coordinate. + +`!weather [weather id]` - Changes the current weather. + *More commands will be updated in the [wiki](https://github.com/Melledy/Grasscutter/wiki/).* ### Bonus From a1567895fa8e489117a46b225fd440b9ef5a73a9 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Thu, 21 Apr 2022 22:06:25 +0800 Subject: [PATCH 089/119] Refact code Signed-off-by: Jaida Wu --- src/main/java/emu/grasscutter/Config.java | 12 +- .../server/dispatch/DispatchServer.java | 283 ++++++++---------- .../dispatch/json/ComboTokenReqJson.java | 2 +- .../dispatch/json/ComboTokenResJson.java | 2 +- .../server/dispatch/json/LoginResultJson.java | 4 +- 5 files changed, 141 insertions(+), 162 deletions(-) diff --git a/src/main/java/emu/grasscutter/Config.java b/src/main/java/emu/grasscutter/Config.java index 65ada3969..f51e5cd59 100644 --- a/src/main/java/emu/grasscutter/Config.java +++ b/src/main/java/emu/grasscutter/Config.java @@ -12,10 +12,10 @@ public final class Config { public String GameServerIp = "127.0.0.1"; public String GameServerPublicIp = ""; public int GameServerPort = 22102; - + public String DatabaseUrl = "mongodb://localhost:27017"; public String DatabaseCollection = "grasscutter"; - + public String RESOURCE_FOLDER = "./resources/"; public String DATA_FOLDER = "./data/"; public String PACKETS_FOLDER = "./packets/"; @@ -25,21 +25,21 @@ public final class Config { public GameRates Game = new GameRates(); public ServerOptions ServerOptions = new ServerOptions(); - + public GameRates getGameRates() { return Game; } - + public ServerOptions getServerOptions() { return ServerOptions; } - + public static class GameRates { public float ADVENTURE_EXP_RATE = 1.0f; public float MORA_RATE = 1.0f; public float DOMAIN_DROP_RATE = 1.0f; } - + public static class ServerOptions { public int InventoryLimitWeapon = 2000; public int InventoryLimitRelic = 2000; diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index e59f9d251..b4d4993d8 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -1,10 +1,27 @@ package emu.grasscutter.server.dispatch; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.protobuf.ByteString; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpServer; +import com.sun.net.httpserver.HttpsConfigurator; +import com.sun.net.httpserver.HttpsServer; +import emu.grasscutter.Grasscutter; +import emu.grasscutter.database.DatabaseHelper; +import emu.grasscutter.game.Account; +import emu.grasscutter.net.proto.QueryCurrRegionHttpRspOuterClass.QueryCurrRegionHttpRsp; +import emu.grasscutter.net.proto.QueryRegionListHttpRspOuterClass.QueryRegionListHttpRsp; +import emu.grasscutter.net.proto.RegionInfoOuterClass.RegionInfo; +import emu.grasscutter.net.proto.RegionSimpleInfoOuterClass.RegionSimpleInfo; +import emu.grasscutter.server.dispatch.json.*; +import emu.grasscutter.server.dispatch.json.ComboTokenReqJson.LoginTokenData; +import emu.grasscutter.utils.FileUtils; +import emu.grasscutter.utils.Utils; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import java.io.*; import java.net.InetSocketAddress; import java.net.URI; import java.net.URLDecoder; @@ -14,58 +31,27 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.protobuf.ByteString; -import com.sun.net.httpserver.HttpExchange; -import com.sun.net.httpserver.HttpHandler; -import com.sun.net.httpserver.HttpsConfigurator; -import com.sun.net.httpserver.HttpsServer; - -import emu.grasscutter.Grasscutter; -import emu.grasscutter.database.DatabaseHelper; -import emu.grasscutter.game.Account; -import emu.grasscutter.net.proto.QueryCurrRegionHttpRspOuterClass.QueryCurrRegionHttpRsp; -import emu.grasscutter.net.proto.QueryRegionListHttpRspOuterClass.QueryRegionListHttpRsp; -import emu.grasscutter.net.proto.RegionInfoOuterClass.RegionInfo; -import emu.grasscutter.net.proto.RegionSimpleInfoOuterClass.RegionSimpleInfo; -import emu.grasscutter.server.dispatch.json.ComboTokenReqJson; -import emu.grasscutter.server.dispatch.json.ComboTokenResJson; -import emu.grasscutter.server.dispatch.json.LoginAccountRequestJson; -import emu.grasscutter.server.dispatch.json.LoginResultJson; -import emu.grasscutter.server.dispatch.json.LoginTokenRequestJson; -import emu.grasscutter.server.dispatch.json.ComboTokenReqJson.LoginTokenData; -import emu.grasscutter.utils.FileUtils; -import emu.grasscutter.utils.Utils; - -import com.sun.net.httpserver.HttpServer; - public final class DispatchServer { - private final InetSocketAddress address; - private final Gson gson; - private QueryCurrRegionHttpRsp currRegion; - - public String regionListBase64; - public String regionCurrentBase64; - public static String query_region_list = ""; public static String query_cur_region = ""; - + private final InetSocketAddress address; + private final Gson gson; + public String regionListBase64; + public String regionCurrentBase64; + private QueryCurrRegionHttpRsp currRegion; + public DispatchServer() { this.address = new InetSocketAddress(Grasscutter.getConfig().DispatchServerIp, Grasscutter.getConfig().DispatchServerPort); this.gson = new GsonBuilder().create(); - + this.loadQueries(); this.initRegion(); } - + public InetSocketAddress getAddress() { return address; } - + public Gson getGsonFactory() { return gson; } @@ -73,17 +59,17 @@ public final class DispatchServer { public QueryCurrRegionHttpRsp getCurrRegion() { return currRegion; } - + public void loadQueries() { File file; - + file = new File(Grasscutter.getConfig().DATA_FOLDER + "query_region_list.txt"); if (file.exists()) { query_region_list = new String(FileUtils.read(file)); } else { Grasscutter.getLogger().warn("query_region_list not found! Using default region list."); } - + file = new File(Grasscutter.getConfig().DATA_FOLDER + "query_cur_region.txt"); if (file.exists()) { query_cur_region = new String(FileUtils.read(file)); @@ -96,38 +82,38 @@ public final class DispatchServer { try { byte[] decoded = Base64.getDecoder().decode(query_region_list); QueryRegionListHttpRsp rl = QueryRegionListHttpRsp.parseFrom(decoded); - + byte[] decoded2 = Base64.getDecoder().decode(query_cur_region); QueryCurrRegionHttpRsp regionQuery = QueryCurrRegionHttpRsp.parseFrom(decoded2); - + RegionSimpleInfo server = RegionSimpleInfo.newBuilder() .setName("os_usa") .setTitle(Grasscutter.getConfig().GameServerName) .setType("DEV_PUBLIC") .setDispatchUrl("https://" + (Grasscutter.getConfig().DispatchServerPublicIp.isEmpty() ? Grasscutter.getConfig().DispatchServerIp : Grasscutter.getConfig().DispatchServerPublicIp) + ":" + getAddress().getPort() + "/query_cur_region") .build(); - + RegionSimpleInfo serverTest2 = RegionSimpleInfo.newBuilder() .setName("os_euro") .setTitle("Grasscutter") .setType("DEV_PUBLIC") .setDispatchUrl("https://" + (Grasscutter.getConfig().DispatchServerPublicIp.isEmpty() ? Grasscutter.getConfig().DispatchServerIp : Grasscutter.getConfig().DispatchServerPublicIp) + ":" + getAddress().getPort() + "/query_cur_region") .build(); - + QueryRegionListHttpRsp regionList = QueryRegionListHttpRsp.newBuilder() - .addServers(server) - .addServers(serverTest2) - .setClientSecretKey(rl.getClientSecretKey()) - .setClientCustomConfigEncrypted(rl.getClientCustomConfigEncrypted()) - .setEnableLoginPc(true) - .build(); - + .addServers(server) + .addServers(serverTest2) + .setClientSecretKey(rl.getClientSecretKey()) + .setClientCustomConfigEncrypted(rl.getClientCustomConfigEncrypted()) + .setEnableLoginPc(true) + .build(); + RegionInfo currentRegion = regionQuery.getRegionInfo().toBuilder() .setIp((Grasscutter.getConfig().GameServerPublicIp.isEmpty() ? Grasscutter.getConfig().GameServerIp : Grasscutter.getConfig().GameServerPublicIp)) .setPort(Grasscutter.getConfig().GameServerPort) .setSecretKey(ByteString.copyFrom(FileUtils.read(Grasscutter.getConfig().KEY_FOLDER + "dispatchSeed.bin"))) .build(); - + QueryCurrRegionHttpRsp parsedRegionQuery = regionQuery.toBuilder().setRegionInfo(currentRegion).build(); this.regionListBase64 = Base64.getEncoder().encodeToString(regionList.toByteString().toByteArray()); @@ -140,7 +126,7 @@ public final class DispatchServer { public void start() throws Exception { HttpServer server; - if(Grasscutter.getConfig().UseSSL) { + if (Grasscutter.getConfig().UseSSL) { HttpsServer httpsServer; httpsServer = HttpsServer.create(getAddress(), 0); SSLContext sslContext = SSLContext.getInstance("TLS"); @@ -150,9 +136,9 @@ public final class DispatchServer { ks.load(fis, keystorePassword); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(ks, keystorePassword); - + sslContext.init(kmf.getKeyManagers(), null, null); - + httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext)); server = httpsServer; } catch (Exception e) { @@ -162,7 +148,7 @@ public final class DispatchServer { } else { server = HttpServer.create(getAddress(), 0); } - + server.createContext("/", t -> { //Create a response form the request query parameters String response = "Hello"; @@ -174,7 +160,7 @@ public final class DispatchServer { os.write(response.getBytes()); os.close(); }); - + // Dispatch server.createContext("/query_region_list", t -> { // Log @@ -213,33 +199,38 @@ public final class DispatchServer { try { String body = Utils.toString(t.getRequestBody()); requestData = getGsonFactory().fromJson(body, LoginAccountRequestJson.class); - } catch (Exception e) { - + } catch (Exception ignored) { + } // Create response json if (requestData == null) { return; } LoginResultJson responseData = new LoginResultJson(); - + // Login Account account = DatabaseHelper.getAccountByName(requestData.account); - + // Check if account exists, else create a new one. if (account == null) { // 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(); + + if (account != null) { + 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, create failed."; + } } else { responseData.retcode = -201; responseData.message = "Username not found."; - } + } } else { // Account was found, log the player in responseData.message = "OK"; @@ -247,16 +238,8 @@ public final class DispatchServer { responseData.data.account.token = account.generateSessionKey(); responseData.data.account.email = account.getEmail(); } - - // Create a response - String response = getGsonFactory().toJson(responseData); - // Set the response header status and length - t.getResponseHeaders().put("Content-Type", Collections.singletonList("application/json")); - t.sendResponseHeaders(200, response.getBytes().length); - // Write the response string - OutputStream os = t.getResponseBody(); - os.write(response.getBytes()); - os.close(); + + responseJson(t, responseData); }); // Login via token server.createContext("/hk4e_global/mdk/shield/api/verify", t -> { @@ -265,8 +248,8 @@ public final class DispatchServer { try { String body = Utils.toString(t.getRequestBody()); requestData = getGsonFactory().fromJson(body, LoginTokenRequestJson.class); - } catch (Exception e) { - + } catch (Exception ignored) { + } // Create response json if (requestData == null) { @@ -276,7 +259,7 @@ public final class DispatchServer { // Login Account account = DatabaseHelper.getAccountById(requestData.uid); - + // Test if (account == null || !account.getSessionKey().equals(requestData.token)) { responseData.retcode = -111; @@ -287,16 +270,8 @@ public final class DispatchServer { responseData.data.account.token = requestData.token; responseData.data.account.email = account.getEmail(); } - - // Create a response - String response = getGsonFactory().toJson(responseData); - // Set the response header status and length - t.getResponseHeaders().put("Content-Type", Collections.singletonList("application/json")); - t.sendResponseHeaders(200, response.getBytes().length); - // Write the response string - OutputStream os = t.getResponseBody(); - os.write(response.getBytes()); - os.close(); + + responseJson(t, responseData); }); // Exchange for combo token server.createContext("/hk4e_global/combo/granter/login/v2/login", t -> { @@ -305,8 +280,8 @@ public final class DispatchServer { try { String body = Utils.toString(t.getRequestBody()); requestData = getGsonFactory().fromJson(body, ComboTokenReqJson.class); - } catch (Exception e) { - + } catch (Exception ignored) { + } // Create response json if (requestData == null || requestData.data == null) { @@ -317,7 +292,7 @@ public final class DispatchServer { // Login Account account = DatabaseHelper.getAccountById(loginData.uid); - + // Test if (account == null || !account.getSessionKey().equals(loginData.token)) { responseData.retcode = -201; @@ -328,29 +303,21 @@ public final class DispatchServer { responseData.data.combo_id = "157795300"; responseData.data.combo_token = account.generateLoginToken(); } - - // Create a response - String response = getGsonFactory().toJson(responseData); - // Set the response header status and length - t.getResponseHeaders().put("Content-Type", Collections.singletonList("application/json")); - t.sendResponseHeaders(200, response.getBytes().length); - // Write the response string - OutputStream os = t.getResponseBody(); - os.write(response.getBytes()); - os.close(); + + responseJson(t, responseData); }); // Agreement and Protocol server.createContext( // hk4e-sdk-os.hoyoverse.com - "/hk4e_global/mdk/agreement/api/getAgreementInfos", + "/hk4e_global/mdk/agreement/api/getAgreementInfos", new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"marketing_agreements\":[]}}") ); server.createContext( // hk4e-sdk-os.hoyoverse.com - "/hk4e_global/combo/granter/api/compareProtocolVersion", + "/hk4e_global/combo/granter/api/compareProtocolVersion", new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"modified\":true,\"protocol\":{\"id\":0,\"app_id\":4,\"language\":\"en\",\"user_proto\":\"\",\"priv_proto\":\"\",\"major\":7,\"minimum\":0,\"create_time\":\"0\",\"teenager_proto\":\"\",\"third_proto\":\"\"}}}") ); // Game data server.createContext( // hk4e-api-os.hoyoverse.com - "/common/hk4e_global/announcement/api/getAlertPic", + "/common/hk4e_global/announcement/api/getAlertPic", new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"total\":0,\"list\":[]}}") ); server.createContext( // hk4e-api-os.hoyoverse.com @@ -358,62 +325,62 @@ public final class DispatchServer { new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"alert\":false,\"alert_id\":0,\"remind\":true}}") ); server.createContext( // hk4e-api-os.hoyoverse.com - "/common/hk4e_global/announcement/api/getAnnList", + "/common/hk4e_global/announcement/api/getAnnList", new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"list\":[],\"total\":0,\"type_list\":[],\"alert\":false,\"alert_id\":0,\"timezone\":0,\"t\":\"" + System.currentTimeMillis() + "\"}}") ); server.createContext( // hk4e-api-os-static.hoyoverse.com - "/common/hk4e_global/announcement/api/getAnnContent", + "/common/hk4e_global/announcement/api/getAnnContent", new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"list\":[],\"total\":0}}") ); server.createContext( // hk4e-sdk-os.hoyoverse.com - "/hk4e_global/mdk/shopwindow/shopwindow/listPriceTier", + "/hk4e_global/mdk/shopwindow/shopwindow/listPriceTier", new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"suggest_currency\":\"USD\",\"tiers\":[]}}") ); // Captcha server.createContext( // api-account-os.hoyoverse.com - "/account/risky/api/check", + "/account/risky/api/check", new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"id\":\"c8820f246a5241ab9973f71df3ddd791\",\"action\":\"\",\"geetest\":{\"challenge\":\"\",\"gt\":\"\",\"new_captcha\":0,\"success\":1}}}") ); // Config server.createContext( // sdk-os-static.hoyoverse.com - "/combo/box/api/config/sdk/combo", + "/combo/box/api/config/sdk/combo", new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"vals\":{\"disable_email_bind_skip\":\"false\",\"email_bind_remind_interval\":\"7\",\"email_bind_remind\":\"true\"}}}") ); server.createContext( // hk4e-sdk-os-static.hoyoverse.com - "/hk4e_global/combo/granter/api/getConfig", + "/hk4e_global/combo/granter/api/getConfig", new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"protocol\":true,\"qr_enabled\":false,\"log_level\":\"INFO\",\"announce_url\":\"https://webstatic-sea.hoyoverse.com/hk4e/announcement/index.html?sdk_presentation_style=fullscreen\\u0026sdk_screen_transparent=true\\u0026game_biz=hk4e_global\\u0026auth_appid=announcement\\u0026game=hk4e#/\",\"push_alias_type\":2,\"disable_ysdk_guard\":false,\"enable_announce_pic_popup\":true}}") ); server.createContext( // hk4e-sdk-os-static.hoyoverse.com - "/hk4e_global/mdk/shield/api/loadConfig", + "/hk4e_global/mdk/shield/api/loadConfig", new DispatchHttpJsonHandler("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"id\":6,\"game_key\":\"hk4e_global\",\"client\":\"PC\",\"identity\":\"I_IDENTITY\",\"guest\":false,\"ignore_versions\":\"\",\"scene\":\"S_NORMAL\",\"name\":\"原神海外\",\"disable_regist\":false,\"enable_email_captcha\":false,\"thirdparty\":[\"fb\",\"tw\"],\"disable_mmt\":false,\"server_guest\":false,\"thirdparty_ignore\":{\"tw\":\"\",\"fb\":\"\"},\"enable_ps_bind_account\":false,\"thirdparty_login_configs\":{\"tw\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":604800},\"fb\":{\"token_type\":\"TK_GAME_TOKEN\",\"game_token_expires_in\":604800}}}}") ); // Test api? server.createContext( // abtest-api-data-sg.hoyoverse.com - "/data_abtest_api/config/experiment/list", + "/data_abtest_api/config/experiment/list", new DispatchHttpJsonHandler("{\"retcode\":0,\"success\":true,\"message\":\"\",\"data\":[{\"code\":1000,\"type\":2,\"config_id\":\"14\",\"period_id\":\"6036_99\",\"version\":\"1\",\"configs\":{\"cardType\":\"old\"}}]}") ); // Log Server server.createContext( // log-upload-os.mihoyo.com - "/log/sdk/upload", + "/log/sdk/upload", new DispatchHttpJsonHandler("{\"code\":0}") ); server.createContext( // log-upload-os.mihoyo.com - "/sdk/upload", + "/sdk/upload", new DispatchHttpJsonHandler("{\"code\":0}") ); server.createContext( // /perf/config/verify?device_id=xxx&platform=x&name=xxx - "/perf/config/verify", + "/perf/config/verify", new DispatchHttpJsonHandler("{\"code\":0}") ); - + // Logging servers server.createContext( // overseauspider.yuanshen.com - "/log", + "/log", new DispatchHttpJsonHandler("{\"code\":0}") ); - + server.createContext( // log-upload-os.mihoyo.com - "/crash/dataUpload", + "/crash/dataUpload", new DispatchHttpJsonHandler("{\"code\":0}") ); server.createContext("/gacha", t -> { @@ -431,31 +398,43 @@ public final class DispatchServer { server.start(); Grasscutter.getLogger().info("Dispatch server started on port " + getAddress().getPort()); } - + + private void responseJson(HttpExchange t, Object data) throws IOException { + // Create a response + String response = getGsonFactory().toJson(data); + // Set the response header status and length + t.getResponseHeaders().put("Content-Type", Collections.singletonList("application/json")); + t.sendResponseHeaders(200, response.getBytes().length); + // Write the response string + OutputStream os = t.getResponseBody(); + os.write(response.getBytes()); + os.close(); + } + private Map parseQueryString(String qs) { - Map result = new HashMap<>(); - if (qs == null) - return result; + Map result = new HashMap<>(); + if (qs == null) + return result; - int last = 0, next, l = qs.length(); - while (last < l) { - next = qs.indexOf('&', last); - if (next == -1) - next = l; + int last = 0, next, l = qs.length(); + while (last < l) { + next = qs.indexOf('&', last); + if (next == -1) + next = l; - if (next > last) { - int eqPos = qs.indexOf('=', last); - try { - if (eqPos < 0 || eqPos > next) - result.put(URLDecoder.decode(qs.substring(last, next), "utf-8"), ""); - else - result.put(URLDecoder.decode(qs.substring(last, eqPos), "utf-8"), URLDecoder.decode(qs.substring(eqPos + 1, next), "utf-8")); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); // will never happen, utf-8 support is mandatory for java - } - } - last = next + 1; - } - return result; + if (next > last) { + int eqPos = qs.indexOf('=', last); + try { + if (eqPos < 0 || eqPos > next) + result.put(URLDecoder.decode(qs.substring(last, next), "utf-8"), ""); + else + result.put(URLDecoder.decode(qs.substring(last, eqPos), "utf-8"), URLDecoder.decode(qs.substring(eqPos + 1, next), "utf-8")); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); // will never happen, utf-8 support is mandatory for java + } + } + last = next + 1; + } + return result; } } diff --git a/src/main/java/emu/grasscutter/server/dispatch/json/ComboTokenReqJson.java b/src/main/java/emu/grasscutter/server/dispatch/json/ComboTokenReqJson.java index dac26cfa4..b3497f8d4 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/json/ComboTokenReqJson.java +++ b/src/main/java/emu/grasscutter/server/dispatch/json/ComboTokenReqJson.java @@ -7,7 +7,7 @@ public class ComboTokenReqJson { public String device; public String sign; - public class LoginTokenData { + public static class LoginTokenData { public String uid; public String token; public boolean guest; diff --git a/src/main/java/emu/grasscutter/server/dispatch/json/ComboTokenResJson.java b/src/main/java/emu/grasscutter/server/dispatch/json/ComboTokenResJson.java index 731d50853..7c49d1278 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/json/ComboTokenResJson.java +++ b/src/main/java/emu/grasscutter/server/dispatch/json/ComboTokenResJson.java @@ -5,7 +5,7 @@ public class ComboTokenResJson { public int retcode; public LoginData data = new LoginData(); - public class LoginData { + public static class LoginData { public int account_type = 1; public boolean heartbeat; public String combo_id; diff --git a/src/main/java/emu/grasscutter/server/dispatch/json/LoginResultJson.java b/src/main/java/emu/grasscutter/server/dispatch/json/LoginResultJson.java index 5988752d8..88e142d4f 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/json/LoginResultJson.java +++ b/src/main/java/emu/grasscutter/server/dispatch/json/LoginResultJson.java @@ -5,7 +5,7 @@ public class LoginResultJson { public int retcode; public VerifyData data = new VerifyData(); - public class VerifyData { + public static class VerifyData { public VerifyAccountData account = new VerifyAccountData(); public boolean device_grant_required = false; public String realname_operation = "NONE"; @@ -13,7 +13,7 @@ public class LoginResultJson { public boolean safe_mobile_required = false; } - public class VerifyAccountData { + public static class VerifyAccountData { public String uid; public String name = ""; public String email; From 2df8625b24181912d28bbe330fc5783d079751a6 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Thu, 21 Apr 2022 22:21:28 +0800 Subject: [PATCH 090/119] Fallback to HTTP if no SSL cert Signed-off-by: Jaida Wu --- .../java/emu/grasscutter/server/dispatch/DispatchServer.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index b4d4993d8..392609a07 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -142,8 +142,9 @@ public final class DispatchServer { httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext)); server = httpsServer; } catch (Exception e) { - Grasscutter.getLogger().error("No SSL cert found!"); - return; + Grasscutter.getLogger().error("No SSL cert found! Falling back to HTTP server."); + Grasscutter.getConfig().UseSSL = false; + server = HttpServer.create(getAddress(), 0); } } else { server = HttpServer.create(getAddress(), 0); From b0d2d29b1cdaa76715dbad869abe29d26eafc3c8 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Thu, 21 Apr 2022 22:22:40 +0800 Subject: [PATCH 091/119] Add some log to dispatch server Signed-off-by: Jaida Wu --- .../server/dispatch/DispatchServer.java | 100 +++++++++--------- 1 file changed, 49 insertions(+), 51 deletions(-) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index 392609a07..0e2283652 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -150,48 +150,26 @@ public final class DispatchServer { server = HttpServer.create(getAddress(), 0); } - server.createContext("/", t -> { - //Create a response form the request query parameters - String response = "Hello"; - //Set the response header status and length - t.getResponseHeaders().put("Content-Type", Collections.singletonList("text/html; charset=UTF-8")); - t.sendResponseHeaders(200, response.getBytes().length); - //Write the response string - OutputStream os = t.getResponseBody(); - os.write(response.getBytes()); - os.close(); - }); + server.createContext("/", t -> responseHTML(t, "Hello")); // Dispatch server.createContext("/query_region_list", t -> { // Log - Grasscutter.getLogger().info("Client request: query_region_list"); - // Create a response form the request query parameters - String response = regionListBase64; - // Set the response header status and length - t.getResponseHeaders().put("Content-Type", Collections.singletonList("text/html; charset=UTF-8")); - t.sendResponseHeaders(200, response.getBytes().length); - // Write the response string - OutputStream os = t.getResponseBody(); - os.write(response.getBytes()); - os.close(); + Grasscutter.getLogger().info(String.format("Client %s request: query_region_list", t.getRemoteAddress())); + + responseHTML(t, regionListBase64); }); server.createContext("/query_cur_region", t -> { // Log - Grasscutter.getLogger().info("Client request: query_cur_region"); + Grasscutter.getLogger().info(String.format("Client %s request: query_cur_region", t.getRemoteAddress())); // Create a response form the request query parameters URI uri = t.getRequestURI(); String response = "CAESGE5vdCBGb3VuZCB2ZXJzaW9uIGNvbmZpZw=="; if (uri.getQuery() != null && uri.getQuery().length() > 0) { response = regionCurrentBase64; } - // Set the response header status and length - t.getResponseHeaders().put("Content-Type", Collections.singletonList("text/html; charset=UTF-8")); - t.sendResponseHeaders(200, response.getBytes().length); - // Write the response string - OutputStream os = t.getResponseBody(); - os.write(response.getBytes()); - os.close(); + + responseHTML(t, response); }); // Login via account server.createContext("/hk4e_global/mdk/shield/api/login", t -> { @@ -201,7 +179,6 @@ public final class DispatchServer { String body = Utils.toString(t.getRequestBody()); requestData = getGsonFactory().fromJson(body, LoginAccountRequestJson.class); } catch (Exception ignored) { - } // Create response json if (requestData == null) { @@ -209,6 +186,8 @@ public final class DispatchServer { } LoginResultJson responseData = new LoginResultJson(); + Grasscutter.getLogger().info(String.format("Client %s is trying to log in", t.getRemoteAddress())); + // Login Account account = DatabaseHelper.getAccountByName(requestData.account); @@ -224,13 +203,19 @@ public final class DispatchServer { responseData.data.account.uid = account.getId(); responseData.data.account.token = account.generateSessionKey(); responseData.data.account.email = account.getEmail(); + + Grasscutter.getLogger().info(String.format("Client %s failed to log in: Account %s created", t.getRemoteAddress(), responseData.data.account.uid)); } else { responseData.retcode = -201; responseData.message = "Username not found, create failed."; + + Grasscutter.getLogger().info(String.format("Client %s failed to log in: Account create failed", t.getRemoteAddress())); } } else { responseData.retcode = -201; responseData.message = "Username not found."; + + Grasscutter.getLogger().info(String.format("Client %s failed to log in: Account no found", t.getRemoteAddress())); } } else { // Account was found, log the player in @@ -238,10 +223,13 @@ public final class DispatchServer { responseData.data.account.uid = account.getId(); responseData.data.account.token = account.generateSessionKey(); responseData.data.account.email = account.getEmail(); + + Grasscutter.getLogger().info(String.format("Client %s logged in as %s", t.getRemoteAddress(), responseData.data.account.uid)); } - responseJson(t, responseData); + responseJSON(t, responseData); }); + // Login via token server.createContext("/hk4e_global/mdk/shield/api/verify", t -> { // Get post data @@ -250,13 +238,13 @@ public final class DispatchServer { String body = Utils.toString(t.getRequestBody()); requestData = getGsonFactory().fromJson(body, LoginTokenRequestJson.class); } catch (Exception ignored) { - } // Create response json if (requestData == null) { return; } LoginResultJson responseData = new LoginResultJson(); + Grasscutter.getLogger().info(String.format("Client %s is trying to log in via token", t.getRemoteAddress())); // Login Account account = DatabaseHelper.getAccountById(requestData.uid); @@ -265,14 +253,18 @@ public final class DispatchServer { if (account == null || !account.getSessionKey().equals(requestData.token)) { responseData.retcode = -111; responseData.message = "Game account cache information error"; + + Grasscutter.getLogger().info(String.format("Client %s failed to log in via token", t.getRemoteAddress())); } else { responseData.message = "OK"; responseData.data.account.uid = requestData.uid; responseData.data.account.token = requestData.token; responseData.data.account.email = account.getEmail(); + + Grasscutter.getLogger().info(String.format("Client %s logged in via token as %s", t.getRemoteAddress(), responseData.data.account.uid)); } - responseJson(t, responseData); + responseJSON(t, responseData); }); // Exchange for combo token server.createContext("/hk4e_global/combo/granter/login/v2/login", t -> { @@ -282,7 +274,6 @@ public final class DispatchServer { String body = Utils.toString(t.getRequestBody()); requestData = getGsonFactory().fromJson(body, ComboTokenReqJson.class); } catch (Exception ignored) { - } // Create response json if (requestData == null || requestData.data == null) { @@ -298,14 +289,18 @@ public final class DispatchServer { if (account == null || !account.getSessionKey().equals(loginData.token)) { responseData.retcode = -201; responseData.message = "Wrong session key."; + + Grasscutter.getLogger().info(String.format("Client %s failed to exchange combo token", t.getRemoteAddress())); } else { responseData.message = "OK"; responseData.data.open_id = loginData.uid; responseData.data.combo_id = "157795300"; responseData.data.combo_token = account.generateLoginToken(); + + Grasscutter.getLogger().info(String.format("Client %s succeed to exchange combo token", t.getRemoteAddress())); } - responseJson(t, responseData); + responseJSON(t, responseData); }); // Agreement and Protocol server.createContext( // hk4e-sdk-os.hoyoverse.com @@ -384,23 +379,13 @@ public final class DispatchServer { "/crash/dataUpload", new DispatchHttpJsonHandler("{\"code\":0}") ); - server.createContext("/gacha", t -> { - //Create a response form the request query parameters - String response = "Gacha"; - //Set the response header status and length - t.getResponseHeaders().put("Content-Type", Collections.singletonList("text/html; charset=UTF-8")); - t.sendResponseHeaders(200, response.getBytes().length); - //Write the response string - OutputStream os = t.getResponseBody(); - os.write(response.getBytes()); - os.close(); - }); + server.createContext("/gacha", t -> responseHTML(t, "Gacha")); // Start server server.start(); Grasscutter.getLogger().info("Dispatch server started on port " + getAddress().getPort()); } - private void responseJson(HttpExchange t, Object data) throws IOException { + private void responseJSON(HttpExchange t, Object data) throws IOException { // Create a response String response = getGsonFactory().toJson(data); // Set the response header status and length @@ -412,24 +397,37 @@ public final class DispatchServer { os.close(); } + private void responseHTML(HttpExchange t, String response) throws IOException { + // Set the response header status and length + t.getResponseHeaders().put("Content-Type", Collections.singletonList("text/html; charset=UTF-8")); + t.sendResponseHeaders(200, response.getBytes().length); + //Write the response string + OutputStream os = t.getResponseBody(); + os.write(response.getBytes()); + os.close(); + } + private Map parseQueryString(String qs) { Map result = new HashMap<>(); - if (qs == null) + if (qs == null) { return result; + } int last = 0, next, l = qs.length(); while (last < l) { next = qs.indexOf('&', last); - if (next == -1) + if (next == -1) { next = l; + } if (next > last) { int eqPos = qs.indexOf('=', last); try { - if (eqPos < 0 || eqPos > next) + if (eqPos < 0 || eqPos > next) { result.put(URLDecoder.decode(qs.substring(last, next), "utf-8"), ""); - else + } else { result.put(URLDecoder.decode(qs.substring(last, eqPos), "utf-8"), URLDecoder.decode(qs.substring(eqPos + 1, next), "utf-8")); + } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); // will never happen, utf-8 support is mandatory for java } From aacd261206c1149ddaa8bbff5de3eccfd884310b Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Thu, 21 Apr 2022 22:26:28 +0800 Subject: [PATCH 092/119] Add dispatch server log prefix Signed-off-by: Jaida Wu --- .../server/dispatch/DispatchServer.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index 0e2283652..5b46f9def 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -67,14 +67,14 @@ public final class DispatchServer { if (file.exists()) { query_region_list = new String(FileUtils.read(file)); } else { - Grasscutter.getLogger().warn("query_region_list not found! Using default region list."); + Grasscutter.getLogger().warn("[Dispatch] query_region_list not found! Using default region list."); } file = new File(Grasscutter.getConfig().DATA_FOLDER + "query_cur_region.txt"); if (file.exists()) { query_cur_region = new String(FileUtils.read(file)); } else { - Grasscutter.getLogger().warn("query_cur_region not found! Using default current region."); + Grasscutter.getLogger().warn("[Dispatch] query_cur_region not found! Using default current region."); } } @@ -120,7 +120,7 @@ public final class DispatchServer { this.regionCurrentBase64 = Base64.getEncoder().encodeToString(parsedRegionQuery.toByteString().toByteArray()); this.currRegion = parsedRegionQuery; } catch (Exception e) { - Grasscutter.getLogger().error("Error while initializing region info!", e); + Grasscutter.getLogger().error("[Dispatch] Error while initializing region info!", e); } } @@ -142,7 +142,7 @@ public final class DispatchServer { httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext)); server = httpsServer; } catch (Exception e) { - Grasscutter.getLogger().error("No SSL cert found! Falling back to HTTP server."); + Grasscutter.getLogger().warn("[Dispatch] No SSL cert found! Falling back to HTTP server."); Grasscutter.getConfig().UseSSL = false; server = HttpServer.create(getAddress(), 0); } @@ -155,13 +155,13 @@ public final class DispatchServer { // Dispatch server.createContext("/query_region_list", t -> { // Log - Grasscutter.getLogger().info(String.format("Client %s request: query_region_list", t.getRemoteAddress())); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s request: query_region_list", t.getRemoteAddress())); responseHTML(t, regionListBase64); }); server.createContext("/query_cur_region", t -> { // Log - Grasscutter.getLogger().info(String.format("Client %s request: query_cur_region", t.getRemoteAddress())); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s request: query_cur_region", t.getRemoteAddress())); // Create a response form the request query parameters URI uri = t.getRequestURI(); String response = "CAESGE5vdCBGb3VuZCB2ZXJzaW9uIGNvbmZpZw=="; @@ -186,7 +186,7 @@ public final class DispatchServer { } LoginResultJson responseData = new LoginResultJson(); - Grasscutter.getLogger().info(String.format("Client %s is trying to log in", t.getRemoteAddress())); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s is trying to log in", t.getRemoteAddress())); // Login Account account = DatabaseHelper.getAccountByName(requestData.account); @@ -204,18 +204,18 @@ public final class DispatchServer { responseData.data.account.token = account.generateSessionKey(); responseData.data.account.email = account.getEmail(); - Grasscutter.getLogger().info(String.format("Client %s failed to log in: Account %s created", t.getRemoteAddress(), responseData.data.account.uid)); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s failed to log in: Account %s created", t.getRemoteAddress(), responseData.data.account.uid)); } else { responseData.retcode = -201; responseData.message = "Username not found, create failed."; - Grasscutter.getLogger().info(String.format("Client %s failed to log in: Account create failed", t.getRemoteAddress())); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s failed to log in: Account create failed", t.getRemoteAddress())); } } else { responseData.retcode = -201; responseData.message = "Username not found."; - Grasscutter.getLogger().info(String.format("Client %s failed to log in: Account no found", t.getRemoteAddress())); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s failed to log in: Account no found", t.getRemoteAddress())); } } else { // Account was found, log the player in @@ -224,7 +224,7 @@ public final class DispatchServer { responseData.data.account.token = account.generateSessionKey(); responseData.data.account.email = account.getEmail(); - Grasscutter.getLogger().info(String.format("Client %s logged in as %s", t.getRemoteAddress(), responseData.data.account.uid)); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s logged in as %s", t.getRemoteAddress(), responseData.data.account.uid)); } responseJSON(t, responseData); @@ -244,7 +244,7 @@ public final class DispatchServer { return; } LoginResultJson responseData = new LoginResultJson(); - Grasscutter.getLogger().info(String.format("Client %s is trying to log in via token", t.getRemoteAddress())); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s is trying to log in via token", t.getRemoteAddress())); // Login Account account = DatabaseHelper.getAccountById(requestData.uid); @@ -254,14 +254,14 @@ public final class DispatchServer { responseData.retcode = -111; responseData.message = "Game account cache information error"; - Grasscutter.getLogger().info(String.format("Client %s failed to log in via token", t.getRemoteAddress())); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s failed to log in via token", t.getRemoteAddress())); } else { responseData.message = "OK"; responseData.data.account.uid = requestData.uid; responseData.data.account.token = requestData.token; responseData.data.account.email = account.getEmail(); - Grasscutter.getLogger().info(String.format("Client %s logged in via token as %s", t.getRemoteAddress(), responseData.data.account.uid)); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s logged in via token as %s", t.getRemoteAddress(), responseData.data.account.uid)); } responseJSON(t, responseData); @@ -290,14 +290,14 @@ public final class DispatchServer { responseData.retcode = -201; responseData.message = "Wrong session key."; - Grasscutter.getLogger().info(String.format("Client %s failed to exchange combo token", t.getRemoteAddress())); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s failed to exchange combo token", t.getRemoteAddress())); } else { responseData.message = "OK"; responseData.data.open_id = loginData.uid; responseData.data.combo_id = "157795300"; responseData.data.combo_token = account.generateLoginToken(); - Grasscutter.getLogger().info(String.format("Client %s succeed to exchange combo token", t.getRemoteAddress())); + Grasscutter.getLogger().info(String.format("[Dispatch] Client %s succeed to exchange combo token", t.getRemoteAddress())); } responseJSON(t, responseData); @@ -382,7 +382,7 @@ public final class DispatchServer { server.createContext("/gacha", t -> responseHTML(t, "Gacha")); // Start server server.start(); - Grasscutter.getLogger().info("Dispatch server started on port " + getAddress().getPort()); + Grasscutter.getLogger().info("[Dispatch] Dispatch server started on port " + getAddress().getPort()); } private void responseJSON(HttpExchange t, Object data) throws IOException { From 68deff0c95a52009c12a359545e15b80a1f111e9 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Thu, 21 Apr 2022 22:27:26 +0800 Subject: [PATCH 093/119] Listens to all addresses by default Signed-off-by: Jaida Wu --- src/main/java/emu/grasscutter/Config.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/emu/grasscutter/Config.java b/src/main/java/emu/grasscutter/Config.java index f51e5cd59..0b011e576 100644 --- a/src/main/java/emu/grasscutter/Config.java +++ b/src/main/java/emu/grasscutter/Config.java @@ -1,16 +1,16 @@ package emu.grasscutter; public final class Config { - public String DispatchServerIp = "127.0.0.1"; - public String DispatchServerPublicIp = ""; + public String DispatchServerIp = "0.0.0.0"; + public String DispatchServerPublicIp = "127.0.0.1"; public int DispatchServerPort = 443; public String DispatchServerKeystorePath = "./keystore.p12"; public String DispatchServerKeystorePassword = ""; public Boolean UseSSL = true; public String GameServerName = "Test"; - public String GameServerIp = "127.0.0.1"; - public String GameServerPublicIp = ""; + public String GameServerIp = "0.0.0.0"; + public String GameServerPublicIp = "127.0.0.1"; public int GameServerPort = 22102; public String DatabaseUrl = "mongodb://localhost:27017"; From ff6958ed1f23608dbe9ca019e0ab47d958738a0b Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Fri, 22 Apr 2022 01:15:05 +0800 Subject: [PATCH 094/119] Forgot a dispatch prefix on error while merging --- .../java/emu/grasscutter/server/dispatch/DispatchServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index a058bed6b..ad8354867 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -155,7 +155,7 @@ public final class DispatchServer { this.regionListBase64 = Base64.getEncoder().encodeToString(regionList.toByteString().toByteArray()); } catch (Exception e) { - Grasscutter.getLogger().error("Error while initializing region info!", e); + Grasscutter.getLogger().error("[Dispatch] Error while initializing region info!", e); } } From 38c0c9eb7c0c10df1abbcc0bbe9fa1252fd3839b Mon Sep 17 00:00:00 2001 From: yarik0chka Date: Thu, 21 Apr 2022 22:21:24 +0500 Subject: [PATCH 095/119] Add a changing weather id --- README.md | 2 +- .../grasscutter/command/commands/WeatherCommand.java | 12 +++++++----- src/main/java/emu/grasscutter/game/GenshinScene.java | 11 ++++++++++- .../packet/send/PacketSceneAreaWeatherNotify.java | 2 +- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 24269f6b9..1aef752c0 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ There is a dummy user named "Server" in every player's friends list that you can `!pos` - Gets your current coordinate. -`!weather [weather id]` - Changes the current weather. +`!weather [weather id] [climate id]` - Changes the current weather. *More commands will be updated in the [wiki](https://github.com/Melledy/Grasscutter/wiki/).* diff --git a/src/main/java/emu/grasscutter/command/commands/WeatherCommand.java b/src/main/java/emu/grasscutter/command/commands/WeatherCommand.java index 919432ed1..bb9ae4a42 100644 --- a/src/main/java/emu/grasscutter/command/commands/WeatherCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/WeatherCommand.java @@ -8,7 +8,7 @@ import emu.grasscutter.server.packet.send.PacketSceneAreaWeatherNotify; import java.util.List; -@Command(label = "weather", usage = "weather ", +@Command(label = "weather", usage = "weather [climateId]", description = "Changes the weather.", aliases = {"w"}, permission = "player.weather") public final class WeatherCommand implements CommandHandler { @@ -20,20 +20,22 @@ public final class WeatherCommand implements CommandHandler { } if (args.size() < 1) { - CommandHandler.sendMessage(sender, "Usage: weather "); + CommandHandler.sendMessage(sender, "Usage: weather [climateId]"); return; } try { int weatherId = Integer.parseInt(args.get(0)); + int climateId = args.size() > 1 ? Integer.parseInt(args.get(1)) : 1; - ClimateType climate = ClimateType.getTypeByValue(weatherId); + ClimateType climate = ClimateType.getTypeByValue(climateId); + sender.getScene().setWeather(weatherId); sender.getScene().setClimate(climate); sender.getScene().broadcastPacket(new PacketSceneAreaWeatherNotify(sender)); - CommandHandler.sendMessage(sender, "Changed weather to " + weatherId); + CommandHandler.sendMessage(sender, "Changed weather to " + weatherId + " with climate " + climateId); } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(sender, "Invalid weather ID."); + CommandHandler.sendMessage(sender, "Invalid ID."); } } } diff --git a/src/main/java/emu/grasscutter/game/GenshinScene.java b/src/main/java/emu/grasscutter/game/GenshinScene.java index 668902d87..ea462fcdb 100644 --- a/src/main/java/emu/grasscutter/game/GenshinScene.java +++ b/src/main/java/emu/grasscutter/game/GenshinScene.java @@ -34,7 +34,8 @@ public class GenshinScene { private int time; private ClimateType climate; - + private int weather; + public GenshinScene(World world, SceneData sceneData) { this.world = world; this.sceneData = sceneData; @@ -89,10 +90,18 @@ public class GenshinScene { return climate; } + public int getWeather() { + return weather; + } + public void setClimate(ClimateType climate) { this.climate = climate; } + public void setWeather(int weather) { + this.weather = weather; + } + public boolean isInScene(GenshinEntity entity) { return this.entities.containsKey(entity.getId()); } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAreaWeatherNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAreaWeatherNotify.java index de26dd064..69c40dba0 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAreaWeatherNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneAreaWeatherNotify.java @@ -12,7 +12,7 @@ public class PacketSceneAreaWeatherNotify extends GenshinPacket { super(PacketOpcodes.SceneAreaWeatherNotify); SceneAreaWeatherNotify proto = SceneAreaWeatherNotify.newBuilder() - .setWeatherAreaId(1) + .setWeatherAreaId(player.getScene().getWeather()) .setClimateType(player.getScene().getClimate().getValue()) .build(); From 2cc8d48fde890b7bde8fc2d5de76098d085dcf20 Mon Sep 17 00:00:00 2001 From: alt3ri <95161279+alt3ri@users.noreply.github.com> Date: Fri, 22 Apr 2022 00:54:06 +0700 Subject: [PATCH 096/119] Fix typo "When you create a new account via auto register or console server then during scene select a character and write a name on it press it it will get stuck and make the server disconnected. Some can get through and some can't passed it, so currently I'm still on the stable version . even how many times have I deleted the datebase and tried it on some linux and directly on windows too :/ btw https://github.com/Grasscutters/Grasscutter/blob/686360086569d52467a95b289b8bbe5c85cb2fe4/src/main/java/emu/grasscutter/data/ResourceLoader.java#L131 in scene folder there is a typo name "BinOutPut" it should be "BinOutput" so scene file can't be found." - [Yuki#4985](https://discord.com/channels/965284035985305680/965284036333424722/966756877100789760) Thanks [Yuki#4985](https://discord.com/channels/965284035985305680/965284036333424722/966756877100789760) --- src/main/java/emu/grasscutter/data/ResourceLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/data/ResourceLoader.java b/src/main/java/emu/grasscutter/data/ResourceLoader.java index 8a29f5a72..bb95d70e9 100644 --- a/src/main/java/emu/grasscutter/data/ResourceLoader.java +++ b/src/main/java/emu/grasscutter/data/ResourceLoader.java @@ -128,7 +128,7 @@ public class ResourceLoader { private static void loadScenePoints() { Pattern pattern = Pattern.compile("(?<=scene)(.*?)(?=_point.json)"); - File folder = new File(Grasscutter.getConfig().RESOURCE_FOLDER + "BinOutPut/Scene/Point"); + File folder = new File(Grasscutter.getConfig().RESOURCE_FOLDER + "BinOutput/Scene/Point"); if (!folder.isDirectory() || !folder.exists() || folder.listFiles() == null) { Grasscutter.getLogger().error("Scene point files cannot be found, you cannot use teleport waypoints!"); From a01783ef3c9926d012168e06aa38a22f7966441d Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Fri, 22 Apr 2022 02:23:02 +0800 Subject: [PATCH 097/119] Teleport Small Fix --- src/main/java/emu/grasscutter/game/World.java | 9 ++++++++- .../server/packet/send/PacketPlayerEnterSceneNotify.java | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/World.java b/src/main/java/emu/grasscutter/game/World.java index f88d3bee4..ffffb1e53 100644 --- a/src/main/java/emu/grasscutter/game/World.java +++ b/src/main/java/emu/grasscutter/game/World.java @@ -212,7 +212,10 @@ public class World implements Iterable { return false; } + Integer oldSceneId = null; + if (player.getScene() != null) { + oldSceneId = player.getScene().getId(); player.getScene().removePlayer(player); } @@ -221,7 +224,11 @@ public class World implements Iterable { player.getPos().set(pos); // Teleport packet - player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterSelf, EnterReason.TransPoint, sceneId, pos)); + if (oldSceneId.equals(sceneId)) { + player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterGoto, EnterReason.TransPoint, sceneId, pos)); + } else { + player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterJump, EnterReason.TransPoint, sceneId, pos)); + } return true; } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java index e2db99153..d66575273 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java @@ -52,7 +52,7 @@ public class PacketPlayerEnterSceneNotify extends GenshinPacket { .setSceneId(newScene) .setPos(newPos.toProto()) .setSceneBeginTime(System.currentTimeMillis()) - .setType(EnterType.EnterSelf) + .setType(type) .setTargetUid(target.getUid()) .setEnterSceneToken(player.getEnterSceneToken()) .setWorldLevel(target.getWorld().getWorldLevel()) From 96a252f9dded00c259b29bfab5101806a43135f7 Mon Sep 17 00:00:00 2001 From: alt3ri <95161279+alt3ri@users.noreply.github.com> Date: Fri, 22 Apr 2022 02:28:52 +0700 Subject: [PATCH 098/119] Added /revive command Now it's more convenient to revive character without food :> --- .../grasscutter/command/commands/Revive.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/emu/grasscutter/command/commands/Revive.java diff --git a/src/main/java/emu/grasscutter/command/commands/Revive.java b/src/main/java/emu/grasscutter/command/commands/Revive.java new file mode 100644 index 000000000..3f830f3e2 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/Revive.java @@ -0,0 +1,33 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.TeamManager; +//import emu.grasscutter.game.avatar.GenshinAvatar; +//import emu.grasscutter.game.TeamInfo; +import emu.grasscutter.game.entity.EntityAvatar; +import emu.grasscutter.game.props.FightProperty; +import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify; +import emu.grasscutter.server.packet.send.PacketAvatarLifeStateChangeNotify; + +import java.util.List; + +@Command(label = "revive", aliases = {"rev"}, + usage = "revive|rev", description = "Revive character(s) that died)") +public class Revive implements CommandHandler { + //private Object teamId; + + @Override + public void execute(GenshinPlayer player, List args) { + for (EntityAvatar entity2 : TeamManager.getActiveTeam()) { + entity2.setFightProperty( + FightProperty.FIGHT_PROP_CUR_HP, + entity2.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) * .4f + ); + player.sendPacket(new PacketAvatarFightPropUpdateNotify(entity2.getAvatar(), FightProperty.FIGHT_PROP_CUR_HP)); + player.sendPacket(new PacketAvatarLifeStateChangeNotify(entity2.getAvatar())); + } + player.dropMessage("Character revived."); + } +} From dca137a93e4a20e699b1dca97ec7e8f208b726ab Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Thu, 21 Apr 2022 14:02:17 -0700 Subject: [PATCH 099/119] Fix account dupe key error after selecting starting character --- src/main/java/emu/grasscutter/game/GenshinPlayer.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/GenshinPlayer.java b/src/main/java/emu/grasscutter/game/GenshinPlayer.java index 1bc989183..95ae5176d 100644 --- a/src/main/java/emu/grasscutter/game/GenshinPlayer.java +++ b/src/main/java/emu/grasscutter/game/GenshinPlayer.java @@ -170,7 +170,6 @@ public class GenshinPlayer { public void setUid(int id) { this.id = id; - this.getProfile().syncWithCharacter(this); } public long getNextGenshinGuid() { @@ -353,7 +352,6 @@ public class GenshinPlayer { public PlayerProfile getProfile() { if (this.playerProfile == null) { this.playerProfile = new PlayerProfile(this); - this.save(); } return playerProfile; } From d19d80fa4e2aef5addf2c09a7d5d1d333671fc19 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Thu, 21 Apr 2022 14:44:55 -0700 Subject: [PATCH 100/119] Save config everytime you load so the new options show up --- src/main/java/emu/grasscutter/Grasscutter.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/Grasscutter.java b/src/main/java/emu/grasscutter/Grasscutter.java index 0e34c120d..51d0835cd 100644 --- a/src/main/java/emu/grasscutter/Grasscutter.java +++ b/src/main/java/emu/grasscutter/Grasscutter.java @@ -86,8 +86,10 @@ public final class Grasscutter { public static void loadConfig() { try (FileReader file = new FileReader(configFile)) { config = gson.fromJson(file, Config.class); + saveConfig(); } catch (Exception e) { - Grasscutter.config = new Config(); saveConfig(); + Grasscutter.config = new Config(); + saveConfig(); } } From eb44fc88c4dcf9217cf0d3a028e65a1fe1daf1e9 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Thu, 21 Apr 2022 14:47:04 -0700 Subject: [PATCH 101/119] Refactor Revive Command + fix syntax error No idea how I missed the syntax error while reviewing --- .../{Revive.java => ReviveCommand.java} | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) rename src/main/java/emu/grasscutter/command/commands/{Revive.java => ReviveCommand.java} (88%) diff --git a/src/main/java/emu/grasscutter/command/commands/Revive.java b/src/main/java/emu/grasscutter/command/commands/ReviveCommand.java similarity index 88% rename from src/main/java/emu/grasscutter/command/commands/Revive.java rename to src/main/java/emu/grasscutter/command/commands/ReviveCommand.java index 3f830f3e2..554af4a50 100644 --- a/src/main/java/emu/grasscutter/command/commands/Revive.java +++ b/src/main/java/emu/grasscutter/command/commands/ReviveCommand.java @@ -1,33 +1,33 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.TeamManager; -//import emu.grasscutter.game.avatar.GenshinAvatar; -//import emu.grasscutter.game.TeamInfo; -import emu.grasscutter.game.entity.EntityAvatar; -import emu.grasscutter.game.props.FightProperty; -import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify; -import emu.grasscutter.server.packet.send.PacketAvatarLifeStateChangeNotify; - -import java.util.List; - -@Command(label = "revive", aliases = {"rev"}, - usage = "revive|rev", description = "Revive character(s) that died)") -public class Revive implements CommandHandler { - //private Object teamId; - - @Override - public void execute(GenshinPlayer player, List args) { - for (EntityAvatar entity2 : TeamManager.getActiveTeam()) { - entity2.setFightProperty( - FightProperty.FIGHT_PROP_CUR_HP, - entity2.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) * .4f - ); - player.sendPacket(new PacketAvatarFightPropUpdateNotify(entity2.getAvatar(), FightProperty.FIGHT_PROP_CUR_HP)); - player.sendPacket(new PacketAvatarLifeStateChangeNotify(entity2.getAvatar())); - } - player.dropMessage("Character revived."); - } -} +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.TeamManager; +//import emu.grasscutter.game.avatar.GenshinAvatar; +//import emu.grasscutter.game.TeamInfo; +import emu.grasscutter.game.entity.EntityAvatar; +import emu.grasscutter.game.props.FightProperty; +import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify; +import emu.grasscutter.server.packet.send.PacketAvatarLifeStateChangeNotify; + +import java.util.List; + +@Command(label = "revive", aliases = {"rev"}, + usage = "revive|rev", description = "Revive character(s) that died)") +public class ReviveCommand implements CommandHandler { + //private Object teamId; + + @Override + public void execute(GenshinPlayer player, List args) { + for (EntityAvatar entity2 : player.getTeamManager().getActiveTeam()) { + entity2.setFightProperty( + FightProperty.FIGHT_PROP_CUR_HP, + entity2.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) * .4f + ); + player.sendPacket(new PacketAvatarFightPropUpdateNotify(entity2.getAvatar(), FightProperty.FIGHT_PROP_CUR_HP)); + player.sendPacket(new PacketAvatarLifeStateChangeNotify(entity2.getAvatar())); + } + player.dropMessage("Character revived."); + } +} From 6b8b6b48998e9a34d8b678d61d3adfb858d87535 Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Fri, 22 Apr 2022 07:37:25 +0800 Subject: [PATCH 102/119] fetter try --- .../emu/grasscutter/data/GenshinData.java | 15 + .../emu/grasscutter/data/def/AvatarData.java | 9 + .../emu/grasscutter/data/def/FetterData.java | 24 + .../game/avatar/GenshinAvatar.java | 34 +- .../grasscutter/game/props/FetterState.java | 42 + .../AvatarFetterDataNotifyOuterClass.java | 810 ++++++++++++++++++ .../AvatarFetterLevelRewardReqOuterClass.java | 610 +++++++++++++ .../AvatarFetterLevelRewardRspOuterClass.java | 751 ++++++++++++++++ 8 files changed, 2293 insertions(+), 2 deletions(-) create mode 100644 src/main/java/emu/grasscutter/data/def/FetterData.java create mode 100644 src/main/java/emu/grasscutter/game/props/FetterState.java create mode 100644 src/main/java/emu/grasscutter/net/proto/AvatarFetterDataNotifyOuterClass.java create mode 100644 src/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardReqOuterClass.java create mode 100644 src/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardRspOuterClass.java diff --git a/src/main/java/emu/grasscutter/data/GenshinData.java b/src/main/java/emu/grasscutter/data/GenshinData.java index 7dc5a5f7c..1996bf074 100644 --- a/src/main/java/emu/grasscutter/data/GenshinData.java +++ b/src/main/java/emu/grasscutter/data/GenshinData.java @@ -1,7 +1,9 @@ package emu.grasscutter.data; import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import emu.grasscutter.Grasscutter; @@ -54,6 +56,7 @@ public class GenshinData { private static final Int2ObjectMap avatarCostumeDataItemIdMap = new Int2ObjectLinkedOpenHashMap<>(); private static final Int2ObjectMap sceneDataMap = new Int2ObjectLinkedOpenHashMap<>(); + private static final Int2ObjectMap fetterDataMap = new Int2ObjectOpenHashMap<>(); public static Int2ObjectMap getMapByResourceDef(Class resourceDefinition) { Int2ObjectMap map = null; @@ -221,4 +224,16 @@ public class GenshinData { public static Int2ObjectMap getSceneDataMap() { return sceneDataMap; } + + public static Map> getFetterDataEntries() { + // Can I do this? + Map> fetters = new HashMap<>(); + fetterDataMap.forEach((k, v) -> { + if (!fetters.containsKey(v.getAvatarId())) { + fetters.put(v.getAvatarId(), new ArrayList<>()); + } + fetters.get(v.getAvatarId()).add(k); + }); + return fetters; + } } diff --git a/src/main/java/emu/grasscutter/data/def/AvatarData.java b/src/main/java/emu/grasscutter/data/def/AvatarData.java index dcc503994..8097e04a7 100644 --- a/src/main/java/emu/grasscutter/data/def/AvatarData.java +++ b/src/main/java/emu/grasscutter/data/def/AvatarData.java @@ -55,6 +55,8 @@ public class AvatarData extends GenshinResource { private float[] defenseGrowthCurve; private AvatarSkillDepotData skillDepot; private IntList abilities; + + private List fetters; @Override public int getId(){ @@ -193,9 +195,16 @@ public class AvatarData extends GenshinResource { return abilities; } + public List getFetters() { + return fetters; + } + @Override public void onLoad() { this.skillDepot = GenshinData.getAvatarSkillDepotDataMap().get(this.SkillDepotId); + + // Get fetters from GenshinData + this.fetters = GenshinData.getFetterDataEntries().get(this.Id); int size = GenshinData.getAvatarCurveDataMap().size(); this.hpGrowthCurve = new float[size]; diff --git a/src/main/java/emu/grasscutter/data/def/FetterData.java b/src/main/java/emu/grasscutter/data/def/FetterData.java new file mode 100644 index 000000000..d17c940d1 --- /dev/null +++ b/src/main/java/emu/grasscutter/data/def/FetterData.java @@ -0,0 +1,24 @@ +package emu.grasscutter.data.def; + +import emu.grasscutter.data.GenshinResource; +import emu.grasscutter.data.ResourceType; +import emu.grasscutter.data.ResourceType.LoadPriority; + +@ResourceType(name = {"FetterInfoExcelConfigData.json", "FettersExcelConfigData.json", "FetterStoryExcelConfigData.json"}, loadPriority = LoadPriority.HIGHEST) +public class FetterData extends GenshinResource { + private int AvatarId; + private int FetterId; + + @Override + public int getId() { + return FetterId; + } + + public int getAvatarId() { + return AvatarId; + } + + @Override + public void onLoad() { + } +} diff --git a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java index 9723c23d7..e5dccc42d 100644 --- a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java +++ b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java @@ -1,7 +1,9 @@ package emu.grasscutter.game.avatar; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -39,9 +41,11 @@ import emu.grasscutter.game.inventory.EquipType; import emu.grasscutter.game.inventory.GenshinItem; import emu.grasscutter.game.props.ElementType; import emu.grasscutter.game.props.EntityIdType; +import emu.grasscutter.game.props.FetterState; import emu.grasscutter.game.props.FightProperty; import emu.grasscutter.game.props.PlayerProperty; import emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo; +import emu.grasscutter.net.proto.FetterDataOuterClass.FetterData; import emu.grasscutter.net.proto.AvatarInfoOuterClass.AvatarInfo; import emu.grasscutter.server.packet.send.PacketAbilityChangeNotify; import emu.grasscutter.server.packet.send.PacketAvatarEquipChangeNotify; @@ -73,6 +77,8 @@ public class GenshinAvatar { @Transient private final Int2FloatOpenHashMap fightProp; @Transient private Set extraAbilityEmbryos; + private List fetters; + private Map skillLevelMap; // Talent levels private Map proudSkillBonusMap; // Talent bonus levels (from const) private int skillDepotId; @@ -89,7 +95,8 @@ public class GenshinAvatar { this.equips = new Int2ObjectOpenHashMap<>(); this.fightProp = new Int2FloatOpenHashMap(); this.extraAbilityEmbryos = new HashSet<>(); - this.proudSkillBonusMap = new HashMap<>(); // TODO Move to genshin avatar + this.proudSkillBonusMap = new HashMap<>(); + this.fetters = new ArrayList<>(); // TODO Move to genshin avatar } // On creation @@ -266,6 +273,14 @@ public class GenshinAvatar { return extraAbilityEmbryos; } + public void setFetterList(List fetterList) { + this.fetterList = fetterList; + } + + public List getFetterList() { + return fetterList; + } + public float getCurrentHp() { return currentHp; } @@ -385,6 +400,9 @@ public class GenshinAvatar { // Extra ability embryos Set prevExtraAbilityEmbryos = this.getExtraAbilityEmbryos(); this.extraAbilityEmbryos = new HashSet<>(); + + // Fetters + this.setFetterList(data.getFetters()); // Get hp percent, set to 100% if none float hpPercent = this.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) <= 0 ? 1f : this.getFightProperty(FightProperty.FIGHT_PROP_CUR_HP) / this.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP); @@ -683,6 +701,18 @@ public class GenshinAvatar { } public AvatarInfo toProto() { + AvatarFetterInfo.Builder avatarFetter = AvatarFetterInfo.newBuilder() + .setExpLevel(10) + .setExpNumber(6325); // Highest Level + + for (int i = 0; i < this.getFetterList().size(); i++) { + avatarFetter.addFetterList( + FetterData.newBuilder() + .setFetterId(this.getFetterList().get(i)) + .setFetterState(FetterState.FINISH.getValue()) + ); + } + AvatarInfo.Builder avatarInfo = AvatarInfo.newBuilder() .setAvatarId(this.getAvatarId()) .setGuid(this.getGuid()) @@ -696,7 +726,7 @@ public class GenshinAvatar { .putAllProudSkillExtraLevel(getProudSkillBonusMap()) .setAvatarType(1) .setBornTime(this.getBornTime()) - .setFetterInfo(AvatarFetterInfo.newBuilder().setExpLevel(1)) + .setFetterInfo(avatarFetter) .setWearingFlycloakId(this.getFlyCloak()) .setCostumeId(this.getCostume()); diff --git a/src/main/java/emu/grasscutter/game/props/FetterState.java b/src/main/java/emu/grasscutter/game/props/FetterState.java new file mode 100644 index 000000000..346060e19 --- /dev/null +++ b/src/main/java/emu/grasscutter/game/props/FetterState.java @@ -0,0 +1,42 @@ +package emu.grasscutter.game.props; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Stream; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +public enum FetterState { + NONE(0), + NOT_OPEN(1), + OPEN(1), + FINISH(3); + + private final int value; + private static final Int2ObjectMap map = new Int2ObjectOpenHashMap<>(); + private static final Map stringMap = new HashMap<>(); + + static { + Stream.of(values()).forEach(e -> { + map.put(e.getValue(), e); + stringMap.put(e.name(), e); + }); + } + + private FetterState(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static FetterState getTypeByValue(int value) { + return map.getOrDefault(value, NONE); + } + + public static FetterState getTypeByName(String name) { + return stringMap.getOrDefault(name, NONE); + } +} diff --git a/src/main/java/emu/grasscutter/net/proto/AvatarFetterDataNotifyOuterClass.java b/src/main/java/emu/grasscutter/net/proto/AvatarFetterDataNotifyOuterClass.java new file mode 100644 index 000000000..08eb7158d --- /dev/null +++ b/src/main/java/emu/grasscutter/net/proto/AvatarFetterDataNotifyOuterClass.java @@ -0,0 +1,810 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: AvatarFetterDataNotify.proto + +package emu.grasscutter.net.proto; + +public final class AvatarFetterDataNotifyOuterClass { + private AvatarFetterDataNotifyOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface AvatarFetterDataNotifyOrBuilder extends + // @@protoc_insertion_point(interface_extends:AvatarFetterDataNotify) + com.google.protobuf.MessageOrBuilder { + + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + int getFetterInfoMapCount(); + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + boolean containsFetterInfoMap( + long key); + /** + * Use {@link #getFetterInfoMapMap()} instead. + */ + @java.lang.Deprecated + java.util.Map + getFetterInfoMap(); + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + java.util.Map + getFetterInfoMapMap(); + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + + /* nullable */ +emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo getFetterInfoMapOrDefault( + long key, + /* nullable */ +emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo defaultValue); + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + + emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo getFetterInfoMapOrThrow( + long key); + } + /** + * Protobuf type {@code AvatarFetterDataNotify} + */ + public static final class AvatarFetterDataNotify extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:AvatarFetterDataNotify) + AvatarFetterDataNotifyOrBuilder { + private static final long serialVersionUID = 0L; + // Use AvatarFetterDataNotify.newBuilder() to construct. + private AvatarFetterDataNotify(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private AvatarFetterDataNotify() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new AvatarFetterDataNotify(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private AvatarFetterDataNotify( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + fetterInfoMap_ = com.google.protobuf.MapField.newMapField( + FetterInfoMapDefaultEntryHolder.defaultEntry); + mutable_bitField0_ |= 0x00000001; + } + com.google.protobuf.MapEntry + fetterInfoMap__ = input.readMessage( + FetterInfoMapDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry); + fetterInfoMap_.getMutableMap().put( + fetterInfoMap__.getKey(), fetterInfoMap__.getValue()); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.internal_static_AvatarFetterDataNotify_descriptor; + } + + @SuppressWarnings({"rawtypes"}) + @java.lang.Override + protected com.google.protobuf.MapField internalGetMapField( + int number) { + switch (number) { + case 1: + return internalGetFetterInfoMap(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.internal_static_AvatarFetterDataNotify_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify.class, emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify.Builder.class); + } + + public static final int FETTERINFOMAP_FIELD_NUMBER = 1; + private static final class FetterInfoMapDefaultEntryHolder { + static final com.google.protobuf.MapEntry< + java.lang.Long, emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo> defaultEntry = + com.google.protobuf.MapEntry + .newDefaultInstance( + emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.internal_static_AvatarFetterDataNotify_FetterInfoMapEntry_descriptor, + com.google.protobuf.WireFormat.FieldType.UINT64, + 0L, + com.google.protobuf.WireFormat.FieldType.MESSAGE, + emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo.getDefaultInstance()); + } + private com.google.protobuf.MapField< + java.lang.Long, emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo> fetterInfoMap_; + private com.google.protobuf.MapField + internalGetFetterInfoMap() { + if (fetterInfoMap_ == null) { + return com.google.protobuf.MapField.emptyMapField( + FetterInfoMapDefaultEntryHolder.defaultEntry); + } + return fetterInfoMap_; + } + + public int getFetterInfoMapCount() { + return internalGetFetterInfoMap().getMap().size(); + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + + @java.lang.Override + public boolean containsFetterInfoMap( + long key) { + + return internalGetFetterInfoMap().getMap().containsKey(key); + } + /** + * Use {@link #getFetterInfoMapMap()} instead. + */ + @java.lang.Override + @java.lang.Deprecated + public java.util.Map getFetterInfoMap() { + return getFetterInfoMapMap(); + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + @java.lang.Override + + public java.util.Map getFetterInfoMapMap() { + return internalGetFetterInfoMap().getMap(); + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + @java.lang.Override + + public emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo getFetterInfoMapOrDefault( + long key, + emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo defaultValue) { + + java.util.Map map = + internalGetFetterInfoMap().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + @java.lang.Override + + public emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo getFetterInfoMapOrThrow( + long key) { + + java.util.Map map = + internalGetFetterInfoMap().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + com.google.protobuf.GeneratedMessageV3 + .serializeLongMapTo( + output, + internalGetFetterInfoMap(), + FetterInfoMapDefaultEntryHolder.defaultEntry, + 1); + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (java.util.Map.Entry entry + : internalGetFetterInfoMap().getMap().entrySet()) { + com.google.protobuf.MapEntry + fetterInfoMap__ = FetterInfoMapDefaultEntryHolder.defaultEntry.newBuilderForType() + .setKey(entry.getKey()) + .setValue(entry.getValue()) + .build(); + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, fetterInfoMap__); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify)) { + return super.equals(obj); + } + emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify other = (emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify) obj; + + if (!internalGetFetterInfoMap().equals( + other.internalGetFetterInfoMap())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (!internalGetFetterInfoMap().getMap().isEmpty()) { + hash = (37 * hash) + FETTERINFOMAP_FIELD_NUMBER; + hash = (53 * hash) + internalGetFetterInfoMap().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code AvatarFetterDataNotify} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:AvatarFetterDataNotify) + emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotifyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.internal_static_AvatarFetterDataNotify_descriptor; + } + + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMapField( + int number) { + switch (number) { + case 1: + return internalGetFetterInfoMap(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @SuppressWarnings({"rawtypes"}) + protected com.google.protobuf.MapField internalGetMutableMapField( + int number) { + switch (number) { + case 1: + return internalGetMutableFetterInfoMap(); + default: + throw new RuntimeException( + "Invalid map field number: " + number); + } + } + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.internal_static_AvatarFetterDataNotify_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify.class, emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify.Builder.class); + } + + // Construct using emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + internalGetMutableFetterInfoMap().clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.internal_static_AvatarFetterDataNotify_descriptor; + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify getDefaultInstanceForType() { + return emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify.getDefaultInstance(); + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify build() { + emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify buildPartial() { + emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify result = new emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify(this); + int from_bitField0_ = bitField0_; + result.fetterInfoMap_ = internalGetFetterInfoMap(); + result.fetterInfoMap_.makeImmutable(); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify) { + return mergeFrom((emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify other) { + if (other == emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify.getDefaultInstance()) return this; + internalGetMutableFetterInfoMap().mergeFrom( + other.internalGetFetterInfoMap()); + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.google.protobuf.MapField< + java.lang.Long, emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo> fetterInfoMap_; + private com.google.protobuf.MapField + internalGetFetterInfoMap() { + if (fetterInfoMap_ == null) { + return com.google.protobuf.MapField.emptyMapField( + FetterInfoMapDefaultEntryHolder.defaultEntry); + } + return fetterInfoMap_; + } + private com.google.protobuf.MapField + internalGetMutableFetterInfoMap() { + onChanged();; + if (fetterInfoMap_ == null) { + fetterInfoMap_ = com.google.protobuf.MapField.newMapField( + FetterInfoMapDefaultEntryHolder.defaultEntry); + } + if (!fetterInfoMap_.isMutable()) { + fetterInfoMap_ = fetterInfoMap_.copy(); + } + return fetterInfoMap_; + } + + public int getFetterInfoMapCount() { + return internalGetFetterInfoMap().getMap().size(); + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + + @java.lang.Override + public boolean containsFetterInfoMap( + long key) { + + return internalGetFetterInfoMap().getMap().containsKey(key); + } + /** + * Use {@link #getFetterInfoMapMap()} instead. + */ + @java.lang.Override + @java.lang.Deprecated + public java.util.Map getFetterInfoMap() { + return getFetterInfoMapMap(); + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + @java.lang.Override + + public java.util.Map getFetterInfoMapMap() { + return internalGetFetterInfoMap().getMap(); + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + @java.lang.Override + + public emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo getFetterInfoMapOrDefault( + long key, + emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo defaultValue) { + + java.util.Map map = + internalGetFetterInfoMap().getMap(); + return map.containsKey(key) ? map.get(key) : defaultValue; + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + @java.lang.Override + + public emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo getFetterInfoMapOrThrow( + long key) { + + java.util.Map map = + internalGetFetterInfoMap().getMap(); + if (!map.containsKey(key)) { + throw new java.lang.IllegalArgumentException(); + } + return map.get(key); + } + + public Builder clearFetterInfoMap() { + internalGetMutableFetterInfoMap().getMutableMap() + .clear(); + return this; + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + + public Builder removeFetterInfoMap( + long key) { + + internalGetMutableFetterInfoMap().getMutableMap() + .remove(key); + return this; + } + /** + * Use alternate mutation accessors instead. + */ + @java.lang.Deprecated + public java.util.Map + getMutableFetterInfoMap() { + return internalGetMutableFetterInfoMap().getMutableMap(); + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + public Builder putFetterInfoMap( + long key, + emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo value) { + + if (value == null) { + throw new NullPointerException("map value"); +} + + internalGetMutableFetterInfoMap().getMutableMap() + .put(key, value); + return this; + } + /** + * map<uint64, .AvatarFetterInfo> fetterInfoMap = 1; + */ + + public Builder putAllFetterInfoMap( + java.util.Map values) { + internalGetMutableFetterInfoMap().getMutableMap() + .putAll(values); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:AvatarFetterDataNotify) + } + + // @@protoc_insertion_point(class_scope:AvatarFetterDataNotify) + private static final emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify(); + } + + public static emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public AvatarFetterDataNotify parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new AvatarFetterDataNotify(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterDataNotifyOuterClass.AvatarFetterDataNotify getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_AvatarFetterDataNotify_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_AvatarFetterDataNotify_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_AvatarFetterDataNotify_FetterInfoMapEntry_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_AvatarFetterDataNotify_FetterInfoMapEntry_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\034AvatarFetterDataNotify.proto\032\026AvatarFe" + + "tterInfo.proto\"\244\001\n\026AvatarFetterDataNotif" + + "y\022A\n\rfetterInfoMap\030\001 \003(\0132*.AvatarFetterD" + + "ataNotify.FetterInfoMapEntry\032G\n\022FetterIn" + + "foMapEntry\022\013\n\003key\030\001 \001(\004\022 \n\005value\030\002 \001(\0132\021" + + ".AvatarFetterInfo:\0028\001B\033\n\031emu.grasscutter" + + ".net.protob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.getDescriptor(), + }); + internal_static_AvatarFetterDataNotify_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_AvatarFetterDataNotify_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_AvatarFetterDataNotify_descriptor, + new java.lang.String[] { "FetterInfoMap", }); + internal_static_AvatarFetterDataNotify_FetterInfoMapEntry_descriptor = + internal_static_AvatarFetterDataNotify_descriptor.getNestedTypes().get(0); + internal_static_AvatarFetterDataNotify_FetterInfoMapEntry_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_AvatarFetterDataNotify_FetterInfoMapEntry_descriptor, + new java.lang.String[] { "Key", "Value", }); + emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/src/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardReqOuterClass.java b/src/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardReqOuterClass.java new file mode 100644 index 000000000..be66bde26 --- /dev/null +++ b/src/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardReqOuterClass.java @@ -0,0 +1,610 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: AvatarFetterLevelRewardReq.proto + +package emu.grasscutter.net.proto; + +public final class AvatarFetterLevelRewardReqOuterClass { + private AvatarFetterLevelRewardReqOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface AvatarFetterLevelRewardReqOrBuilder extends + // @@protoc_insertion_point(interface_extends:AvatarFetterLevelRewardReq) + com.google.protobuf.MessageOrBuilder { + + /** + * uint64 avatarGuid = 1; + * @return The avatarGuid. + */ + long getAvatarGuid(); + + /** + * uint32 fetterLevel = 2; + * @return The fetterLevel. + */ + int getFetterLevel(); + } + /** + * Protobuf type {@code AvatarFetterLevelRewardReq} + */ + public static final class AvatarFetterLevelRewardReq extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:AvatarFetterLevelRewardReq) + AvatarFetterLevelRewardReqOrBuilder { + private static final long serialVersionUID = 0L; + // Use AvatarFetterLevelRewardReq.newBuilder() to construct. + private AvatarFetterLevelRewardReq(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private AvatarFetterLevelRewardReq() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new AvatarFetterLevelRewardReq(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private AvatarFetterLevelRewardReq( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + + avatarGuid_ = input.readUInt64(); + break; + } + case 16: { + + fetterLevel_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.internal_static_AvatarFetterLevelRewardReq_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.internal_static_AvatarFetterLevelRewardReq_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq.class, emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq.Builder.class); + } + + public static final int AVATARGUID_FIELD_NUMBER = 1; + private long avatarGuid_; + /** + * uint64 avatarGuid = 1; + * @return The avatarGuid. + */ + @java.lang.Override + public long getAvatarGuid() { + return avatarGuid_; + } + + public static final int FETTERLEVEL_FIELD_NUMBER = 2; + private int fetterLevel_; + /** + * uint32 fetterLevel = 2; + * @return The fetterLevel. + */ + @java.lang.Override + public int getFetterLevel() { + return fetterLevel_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (avatarGuid_ != 0L) { + output.writeUInt64(1, avatarGuid_); + } + if (fetterLevel_ != 0) { + output.writeUInt32(2, fetterLevel_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (avatarGuid_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, avatarGuid_); + } + if (fetterLevel_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, fetterLevel_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq)) { + return super.equals(obj); + } + emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq other = (emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq) obj; + + if (getAvatarGuid() + != other.getAvatarGuid()) return false; + if (getFetterLevel() + != other.getFetterLevel()) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + AVATARGUID_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getAvatarGuid()); + hash = (37 * hash) + FETTERLEVEL_FIELD_NUMBER; + hash = (53 * hash) + getFetterLevel(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code AvatarFetterLevelRewardReq} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:AvatarFetterLevelRewardReq) + emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReqOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.internal_static_AvatarFetterLevelRewardReq_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.internal_static_AvatarFetterLevelRewardReq_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq.class, emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq.Builder.class); + } + + // Construct using emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + avatarGuid_ = 0L; + + fetterLevel_ = 0; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.internal_static_AvatarFetterLevelRewardReq_descriptor; + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq getDefaultInstanceForType() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq.getDefaultInstance(); + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq build() { + emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq buildPartial() { + emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq result = new emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq(this); + result.avatarGuid_ = avatarGuid_; + result.fetterLevel_ = fetterLevel_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq) { + return mergeFrom((emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq other) { + if (other == emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq.getDefaultInstance()) return this; + if (other.getAvatarGuid() != 0L) { + setAvatarGuid(other.getAvatarGuid()); + } + if (other.getFetterLevel() != 0) { + setFetterLevel(other.getFetterLevel()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private long avatarGuid_ ; + /** + * uint64 avatarGuid = 1; + * @return The avatarGuid. + */ + @java.lang.Override + public long getAvatarGuid() { + return avatarGuid_; + } + /** + * uint64 avatarGuid = 1; + * @param value The avatarGuid to set. + * @return This builder for chaining. + */ + public Builder setAvatarGuid(long value) { + + avatarGuid_ = value; + onChanged(); + return this; + } + /** + * uint64 avatarGuid = 1; + * @return This builder for chaining. + */ + public Builder clearAvatarGuid() { + + avatarGuid_ = 0L; + onChanged(); + return this; + } + + private int fetterLevel_ ; + /** + * uint32 fetterLevel = 2; + * @return The fetterLevel. + */ + @java.lang.Override + public int getFetterLevel() { + return fetterLevel_; + } + /** + * uint32 fetterLevel = 2; + * @param value The fetterLevel to set. + * @return This builder for chaining. + */ + public Builder setFetterLevel(int value) { + + fetterLevel_ = value; + onChanged(); + return this; + } + /** + * uint32 fetterLevel = 2; + * @return This builder for chaining. + */ + public Builder clearFetterLevel() { + + fetterLevel_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:AvatarFetterLevelRewardReq) + } + + // @@protoc_insertion_point(class_scope:AvatarFetterLevelRewardReq) + private static final emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq(); + } + + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public AvatarFetterLevelRewardReq parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new AvatarFetterLevelRewardReq(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterLevelRewardReqOuterClass.AvatarFetterLevelRewardReq getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_AvatarFetterLevelRewardReq_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_AvatarFetterLevelRewardReq_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n AvatarFetterLevelRewardReq.proto\"E\n\032Av" + + "atarFetterLevelRewardReq\022\022\n\navatarGuid\030\001" + + " \001(\004\022\023\n\013fetterLevel\030\002 \001(\rB\033\n\031emu.grasscu" + + "tter.net.protob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_AvatarFetterLevelRewardReq_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_AvatarFetterLevelRewardReq_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_AvatarFetterLevelRewardReq_descriptor, + new java.lang.String[] { "AvatarGuid", "FetterLevel", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/src/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardRspOuterClass.java b/src/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardRspOuterClass.java new file mode 100644 index 000000000..6801ce7ec --- /dev/null +++ b/src/main/java/emu/grasscutter/net/proto/AvatarFetterLevelRewardRspOuterClass.java @@ -0,0 +1,751 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: AvatarFetterLevelRewardRsp.proto + +package emu.grasscutter.net.proto; + +public final class AvatarFetterLevelRewardRspOuterClass { + private AvatarFetterLevelRewardRspOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface AvatarFetterLevelRewardRspOrBuilder extends + // @@protoc_insertion_point(interface_extends:AvatarFetterLevelRewardRsp) + com.google.protobuf.MessageOrBuilder { + + /** + * int32 retcode = 1; + * @return The retcode. + */ + int getRetcode(); + + /** + * uint64 avatarGuid = 2; + * @return The avatarGuid. + */ + long getAvatarGuid(); + + /** + * uint32 fetterLevel = 3; + * @return The fetterLevel. + */ + int getFetterLevel(); + + /** + * uint32 rewardId = 4; + * @return The rewardId. + */ + int getRewardId(); + } + /** + * Protobuf type {@code AvatarFetterLevelRewardRsp} + */ + public static final class AvatarFetterLevelRewardRsp extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:AvatarFetterLevelRewardRsp) + AvatarFetterLevelRewardRspOrBuilder { + private static final long serialVersionUID = 0L; + // Use AvatarFetterLevelRewardRsp.newBuilder() to construct. + private AvatarFetterLevelRewardRsp(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private AvatarFetterLevelRewardRsp() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new AvatarFetterLevelRewardRsp(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private AvatarFetterLevelRewardRsp( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + + retcode_ = input.readInt32(); + break; + } + case 16: { + + avatarGuid_ = input.readUInt64(); + break; + } + case 24: { + + fetterLevel_ = input.readUInt32(); + break; + } + case 32: { + + rewardId_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.internal_static_AvatarFetterLevelRewardRsp_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.internal_static_AvatarFetterLevelRewardRsp_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp.class, emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp.Builder.class); + } + + public static final int RETCODE_FIELD_NUMBER = 1; + private int retcode_; + /** + * int32 retcode = 1; + * @return The retcode. + */ + @java.lang.Override + public int getRetcode() { + return retcode_; + } + + public static final int AVATARGUID_FIELD_NUMBER = 2; + private long avatarGuid_; + /** + * uint64 avatarGuid = 2; + * @return The avatarGuid. + */ + @java.lang.Override + public long getAvatarGuid() { + return avatarGuid_; + } + + public static final int FETTERLEVEL_FIELD_NUMBER = 3; + private int fetterLevel_; + /** + * uint32 fetterLevel = 3; + * @return The fetterLevel. + */ + @java.lang.Override + public int getFetterLevel() { + return fetterLevel_; + } + + public static final int REWARDID_FIELD_NUMBER = 4; + private int rewardId_; + /** + * uint32 rewardId = 4; + * @return The rewardId. + */ + @java.lang.Override + public int getRewardId() { + return rewardId_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (retcode_ != 0) { + output.writeInt32(1, retcode_); + } + if (avatarGuid_ != 0L) { + output.writeUInt64(2, avatarGuid_); + } + if (fetterLevel_ != 0) { + output.writeUInt32(3, fetterLevel_); + } + if (rewardId_ != 0) { + output.writeUInt32(4, rewardId_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (retcode_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(1, retcode_); + } + if (avatarGuid_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(2, avatarGuid_); + } + if (fetterLevel_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(3, fetterLevel_); + } + if (rewardId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(4, rewardId_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp)) { + return super.equals(obj); + } + emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp other = (emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp) obj; + + if (getRetcode() + != other.getRetcode()) return false; + if (getAvatarGuid() + != other.getAvatarGuid()) return false; + if (getFetterLevel() + != other.getFetterLevel()) return false; + if (getRewardId() + != other.getRewardId()) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + RETCODE_FIELD_NUMBER; + hash = (53 * hash) + getRetcode(); + hash = (37 * hash) + AVATARGUID_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getAvatarGuid()); + hash = (37 * hash) + FETTERLEVEL_FIELD_NUMBER; + hash = (53 * hash) + getFetterLevel(); + hash = (37 * hash) + REWARDID_FIELD_NUMBER; + hash = (53 * hash) + getRewardId(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code AvatarFetterLevelRewardRsp} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:AvatarFetterLevelRewardRsp) + emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRspOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.internal_static_AvatarFetterLevelRewardRsp_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.internal_static_AvatarFetterLevelRewardRsp_fieldAccessorTable + .ensureFieldAccessorsInitialized( + emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp.class, emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp.Builder.class); + } + + // Construct using emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + retcode_ = 0; + + avatarGuid_ = 0L; + + fetterLevel_ = 0; + + rewardId_ = 0; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.internal_static_AvatarFetterLevelRewardRsp_descriptor; + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp getDefaultInstanceForType() { + return emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp.getDefaultInstance(); + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp build() { + emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp buildPartial() { + emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp result = new emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp(this); + result.retcode_ = retcode_; + result.avatarGuid_ = avatarGuid_; + result.fetterLevel_ = fetterLevel_; + result.rewardId_ = rewardId_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp) { + return mergeFrom((emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp other) { + if (other == emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp.getDefaultInstance()) return this; + if (other.getRetcode() != 0) { + setRetcode(other.getRetcode()); + } + if (other.getAvatarGuid() != 0L) { + setAvatarGuid(other.getAvatarGuid()); + } + if (other.getFetterLevel() != 0) { + setFetterLevel(other.getFetterLevel()); + } + if (other.getRewardId() != 0) { + setRewardId(other.getRewardId()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int retcode_ ; + /** + * int32 retcode = 1; + * @return The retcode. + */ + @java.lang.Override + public int getRetcode() { + return retcode_; + } + /** + * int32 retcode = 1; + * @param value The retcode to set. + * @return This builder for chaining. + */ + public Builder setRetcode(int value) { + + retcode_ = value; + onChanged(); + return this; + } + /** + * int32 retcode = 1; + * @return This builder for chaining. + */ + public Builder clearRetcode() { + + retcode_ = 0; + onChanged(); + return this; + } + + private long avatarGuid_ ; + /** + * uint64 avatarGuid = 2; + * @return The avatarGuid. + */ + @java.lang.Override + public long getAvatarGuid() { + return avatarGuid_; + } + /** + * uint64 avatarGuid = 2; + * @param value The avatarGuid to set. + * @return This builder for chaining. + */ + public Builder setAvatarGuid(long value) { + + avatarGuid_ = value; + onChanged(); + return this; + } + /** + * uint64 avatarGuid = 2; + * @return This builder for chaining. + */ + public Builder clearAvatarGuid() { + + avatarGuid_ = 0L; + onChanged(); + return this; + } + + private int fetterLevel_ ; + /** + * uint32 fetterLevel = 3; + * @return The fetterLevel. + */ + @java.lang.Override + public int getFetterLevel() { + return fetterLevel_; + } + /** + * uint32 fetterLevel = 3; + * @param value The fetterLevel to set. + * @return This builder for chaining. + */ + public Builder setFetterLevel(int value) { + + fetterLevel_ = value; + onChanged(); + return this; + } + /** + * uint32 fetterLevel = 3; + * @return This builder for chaining. + */ + public Builder clearFetterLevel() { + + fetterLevel_ = 0; + onChanged(); + return this; + } + + private int rewardId_ ; + /** + * uint32 rewardId = 4; + * @return The rewardId. + */ + @java.lang.Override + public int getRewardId() { + return rewardId_; + } + /** + * uint32 rewardId = 4; + * @param value The rewardId to set. + * @return This builder for chaining. + */ + public Builder setRewardId(int value) { + + rewardId_ = value; + onChanged(); + return this; + } + /** + * uint32 rewardId = 4; + * @return This builder for chaining. + */ + public Builder clearRewardId() { + + rewardId_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:AvatarFetterLevelRewardRsp) + } + + // @@protoc_insertion_point(class_scope:AvatarFetterLevelRewardRsp) + private static final emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp(); + } + + public static emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public AvatarFetterLevelRewardRsp parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new AvatarFetterLevelRewardRsp(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public emu.grasscutter.net.proto.AvatarFetterLevelRewardRspOuterClass.AvatarFetterLevelRewardRsp getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_AvatarFetterLevelRewardRsp_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_AvatarFetterLevelRewardRsp_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n AvatarFetterLevelRewardRsp.proto\"h\n\032Av" + + "atarFetterLevelRewardRsp\022\017\n\007retcode\030\001 \001(" + + "\005\022\022\n\navatarGuid\030\002 \001(\004\022\023\n\013fetterLevel\030\003 \001" + + "(\r\022\020\n\010rewardId\030\004 \001(\rB\033\n\031emu.grasscutter." + + "net.protob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_AvatarFetterLevelRewardRsp_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_AvatarFetterLevelRewardRsp_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_AvatarFetterLevelRewardRsp_descriptor, + new java.lang.String[] { "Retcode", "AvatarGuid", "FetterLevel", "RewardId", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} From a3f528ede0d28b11d6033fd9bf872bfb5ab10d96 Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Fri, 22 Apr 2022 07:42:17 +0800 Subject: [PATCH 103/119] typo --- src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java index e5dccc42d..d3b4d7147 100644 --- a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java +++ b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java @@ -77,7 +77,7 @@ public class GenshinAvatar { @Transient private final Int2FloatOpenHashMap fightProp; @Transient private Set extraAbilityEmbryos; - private List fetters; + private List fetters; private Map skillLevelMap; // Talent levels private Map proudSkillBonusMap; // Talent bonus levels (from const) From 1c6aa32cea905c62a9e1b5afd8155b6524fb98a1 Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Fri, 22 Apr 2022 07:49:35 +0800 Subject: [PATCH 104/119] ee, forget to change variables when copying from local --- src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java index d3b4d7147..0560ba4e5 100644 --- a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java +++ b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java @@ -274,11 +274,11 @@ public class GenshinAvatar { } public void setFetterList(List fetterList) { - this.fetterList = fetterList; + this.fetters = fetterList; } public List getFetterList() { - return fetterList; + return fetters; } public float getCurrentHp() { From a47655db7a8723e17979f8482ec927d61170751d Mon Sep 17 00:00:00 2001 From: fengyuecanzhu <1021300691@qq.com> Date: Fri, 22 Apr 2022 08:08:47 +0800 Subject: [PATCH 105/119] add fullfp command --- .../command/commands/FullHpCommand.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/emu/grasscutter/command/commands/FullHpCommand.java diff --git a/src/main/java/emu/grasscutter/command/commands/FullHpCommand.java b/src/main/java/emu/grasscutter/command/commands/FullHpCommand.java new file mode 100644 index 000000000..f27533a8d --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/FullHpCommand.java @@ -0,0 +1,36 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.props.FightProperty; +import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify; +import emu.grasscutter.server.packet.send.PacketAvatarLifeStateChangeNotify; +import emu.grasscutter.server.packet.send.PacketEntityFightPropUpdateNotify; +import emu.grasscutter.server.packet.send.PacketLifeStateChangeNotify; + +import java.util.List; + +@Command(label = "fullhp", usage = "fullhp|fhp", + description = "Recover all characters in your current team to full health.", aliases = {"fhp"}, permission = "player.fullhp") +public class FullHpCommand implements CommandHandler { + @Override + public void execute(GenshinPlayer sender, List args) { + if (sender == null) { + CommandHandler.sendMessage(null, "Run this command in-game."); + return; + } + sender.getTeamManager().getActiveTeam().forEach(entity -> { + boolean isAlive = entity.isAlive(); + entity.setFightProperty( + FightProperty.FIGHT_PROP_CUR_HP, + entity.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) + ); + entity.getWorld().broadcastPacket(new PacketAvatarFightPropUpdateNotify(entity.getAvatar(), FightProperty.FIGHT_PROP_CUR_HP)); + if (!isAlive) { + entity.getWorld().broadcastPacket(new PacketAvatarLifeStateChangeNotify(entity.getAvatar())); + } + }); + CommandHandler.sendMessage(sender, "All hp recover to full."); + } +} From 85fd060561254e4ed56d4e814361b0cc2cb7f148 Mon Sep 17 00:00:00 2001 From: fengyuecanzhu <1021300691@qq.com> Date: Fri, 22 Apr 2022 08:26:48 +0800 Subject: [PATCH 106/119] remove revive command --- .../command/commands/ReviveCommand.java | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 src/main/java/emu/grasscutter/command/commands/ReviveCommand.java diff --git a/src/main/java/emu/grasscutter/command/commands/ReviveCommand.java b/src/main/java/emu/grasscutter/command/commands/ReviveCommand.java deleted file mode 100644 index 554af4a50..000000000 --- a/src/main/java/emu/grasscutter/command/commands/ReviveCommand.java +++ /dev/null @@ -1,33 +0,0 @@ -package emu.grasscutter.command.commands; - -import emu.grasscutter.command.Command; -import emu.grasscutter.command.CommandHandler; -import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.game.TeamManager; -//import emu.grasscutter.game.avatar.GenshinAvatar; -//import emu.grasscutter.game.TeamInfo; -import emu.grasscutter.game.entity.EntityAvatar; -import emu.grasscutter.game.props.FightProperty; -import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify; -import emu.grasscutter.server.packet.send.PacketAvatarLifeStateChangeNotify; - -import java.util.List; - -@Command(label = "revive", aliases = {"rev"}, - usage = "revive|rev", description = "Revive character(s) that died)") -public class ReviveCommand implements CommandHandler { - //private Object teamId; - - @Override - public void execute(GenshinPlayer player, List args) { - for (EntityAvatar entity2 : player.getTeamManager().getActiveTeam()) { - entity2.setFightProperty( - FightProperty.FIGHT_PROP_CUR_HP, - entity2.getFightProperty(FightProperty.FIGHT_PROP_MAX_HP) * .4f - ); - player.sendPacket(new PacketAvatarFightPropUpdateNotify(entity2.getAvatar(), FightProperty.FIGHT_PROP_CUR_HP)); - player.sendPacket(new PacketAvatarLifeStateChangeNotify(entity2.getAvatar())); - } - player.dropMessage("Character revived."); - } -} From cb043e0644927ae1907a219c122d1d829e7874e0 Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Fri, 22 Apr 2022 08:30:02 +0800 Subject: [PATCH 107/119] no more NullPointerException pls --- .../emu/grasscutter/game/avatar/GenshinAvatar.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java index 0560ba4e5..6906d3896 100644 --- a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java +++ b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java @@ -705,12 +705,14 @@ public class GenshinAvatar { .setExpLevel(10) .setExpNumber(6325); // Highest Level - for (int i = 0; i < this.getFetterList().size(); i++) { - avatarFetter.addFetterList( - FetterData.newBuilder() - .setFetterId(this.getFetterList().get(i)) - .setFetterState(FetterState.FINISH.getValue()) - ); + if (this.getFetterList() != null) { + for (int i = 0; i < this.getFetterList().size(); i++) { + avatarFetter.addFetterList( + FetterData.newBuilder() + .setFetterId(this.getFetterList().get(i)) + .setFetterState(FetterState.FINISH.getValue()) + ); + } } AvatarInfo.Builder avatarInfo = AvatarInfo.newBuilder() From fd42dd558fa9c4bb67b393dbcb24e763d023688f Mon Sep 17 00:00:00 2001 From: fengyuecanzhu <1021300691@qq.com> Date: Fri, 22 Apr 2022 08:45:46 +0800 Subject: [PATCH 108/119] change fhp to heal --- .../commands/{FullHpCommand.java => HealCommand.java} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename src/main/java/emu/grasscutter/command/commands/{FullHpCommand.java => HealCommand.java} (81%) diff --git a/src/main/java/emu/grasscutter/command/commands/FullHpCommand.java b/src/main/java/emu/grasscutter/command/commands/HealCommand.java similarity index 81% rename from src/main/java/emu/grasscutter/command/commands/FullHpCommand.java rename to src/main/java/emu/grasscutter/command/commands/HealCommand.java index f27533a8d..511e52812 100644 --- a/src/main/java/emu/grasscutter/command/commands/FullHpCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/HealCommand.java @@ -11,9 +11,9 @@ import emu.grasscutter.server.packet.send.PacketLifeStateChangeNotify; import java.util.List; -@Command(label = "fullhp", usage = "fullhp|fhp", - description = "Recover all characters in your current team to full health.", aliases = {"fhp"}, permission = "player.fullhp") -public class FullHpCommand implements CommandHandler { +@Command(label = "heal", usage = "heal|h", + description = "Heal all characters in your current team.", aliases = {"h"}, permission = "player.heal") +public class HealCommand implements CommandHandler { @Override public void execute(GenshinPlayer sender, List args) { if (sender == null) { @@ -31,6 +31,6 @@ public class FullHpCommand implements CommandHandler { entity.getWorld().broadcastPacket(new PacketAvatarLifeStateChangeNotify(entity.getAvatar())); } }); - CommandHandler.sendMessage(sender, "All hp recover to full."); + CommandHandler.sendMessage(sender, "All characters are healed."); } } From d37543beaf4385482e672fdc07e259399c47e0fc Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Fri, 22 Apr 2022 10:39:25 +0800 Subject: [PATCH 109/119] cache fetters --- .../emu/grasscutter/data/GenshinData.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/emu/grasscutter/data/GenshinData.java b/src/main/java/emu/grasscutter/data/GenshinData.java index 1996bf074..7e14b1b46 100644 --- a/src/main/java/emu/grasscutter/data/GenshinData.java +++ b/src/main/java/emu/grasscutter/data/GenshinData.java @@ -57,6 +57,9 @@ public class GenshinData { private static final Int2ObjectMap sceneDataMap = new Int2ObjectLinkedOpenHashMap<>(); private static final Int2ObjectMap fetterDataMap = new Int2ObjectOpenHashMap<>(); + + // Cache + private static Map> fetters = new HashMap<>(); public static Int2ObjectMap getMapByResourceDef(Class resourceDefinition) { Int2ObjectMap map = null; @@ -226,14 +229,15 @@ public class GenshinData { } public static Map> getFetterDataEntries() { - // Can I do this? - Map> fetters = new HashMap<>(); - fetterDataMap.forEach((k, v) -> { - if (!fetters.containsKey(v.getAvatarId())) { - fetters.put(v.getAvatarId(), new ArrayList<>()); - } - fetters.get(v.getAvatarId()).add(k); - }); + if (fetters.isEmpty()) { + fetterDataMap.forEach((k, v) -> { + if (!fetters.containsKey(v.getAvatarId())) { + fetters.put(v.getAvatarId(), new ArrayList<>()); + } + fetters.get(v.getAvatarId()).add(k); + }); + } + return fetters; } } From c157aaec5ba2f247769cdae8f1c132654afd8009 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Fri, 22 Apr 2022 11:32:49 +0800 Subject: [PATCH 110/119] Make proxy daemon run imperceptibly Signed-off-by: Jaida Wu --- run.cmd => start.cmd | 84 ++++++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 35 deletions(-) rename run.cmd => start.cmd (62%) diff --git a/run.cmd b/start.cmd similarity index 62% rename from run.cmd rename to start.cmd index 36a20d811..e3425d0e4 100644 --- a/run.cmd +++ b/start.cmd @@ -4,67 +4,90 @@ @if "%DEBUG%" == "" echo off pushd %~dp0 +set CUR_PATH=%~dp0 title Grasscutter -call :LOG [INFO] Grasscutter +call :LOG [INFO] Welcome to Grasscutter +call :LOG [INFO] To proper exit this console, use [Ctrl + C] and enter N not Y. +call :LOG [INFO] call :LOG [INFO] Initializing... -@rem This will not work if your java or mitmproxy is in a different location, plugin as necessary -@rem this just saves you from changing your PATH -set JAVA_PATH=C:\Program Files\Java\jdk1.8.0_202\ -set MITMPROXY_PATH=%~dp0 -set PROXY_SCRIPT=proxy @rem TODO: MongoDB integration -set SERVER_PATH=%~dp0 +set JAVA_PATH=DO_NOT_CHECK_PATH +set MITMDUMP_PATH=DO_NOT_CHECK_PATH + +set SERVER_JAR_PATH=%CUR_PATH% + +set SERVER_JAR_NAME=grasscutter.jar +set PROXY_SCRIPT_NAME=proxy + +if not "%JAVA_PATH%" == "DO_NOT_CHECK_PATH" ( + if not exist "%JAVA_PATH%java.exe" ( + call :LOG [ERROR] Java not found. + goto :EXIT + ) +) else set JAVA_PATH= +if not exist "%SERVER_PATH%grasscutter.jar" ( + call :LOG [ERROR] Server jar not found. + goto :EXIT +) @rem mitmproxy not found, server only -if not exist "%MITMPROXY_PATH%mitmdump.exe" ( - call :LOG [WARN] mitmproxy not found, server only mode. - goto :SERVER -) +if not "%MITMDUMP_PATH%" == "DO_NOT_CHECK_PATH" ( + if not exist "%MITMDUMP_PATH%mitmdump.exe" ( + call :LOG [WARN] mitmdump not found, server only mode. + goto :SERVER + ) +) else set MITMDUMP_PATH= @rem proxy script not found, server only -if not exist "%PROXY_SCRIPT%.py" ( - if not exist "%PROXY_SCRIPT%.pyc" ( +if not exist "%PROXY_SCRIPT_NAME%.py" ( + if not exist "%PROXY_SCRIPT_NAME%.pyc" ( call :LOG [WARN] Missing proxy script or compiled proxy script, server only mode. goto :SERVER - ) else set PROXY_SCRIPT=%PROXY_SCRIPT%.pyc -) else set PROXY_SCRIPT=%PROXY_SCRIPT%.py + ) else set PROXY_SCRIPT_NAME=%PROXY_SCRIPT_NAME%.pyc +) else set PROXY_SCRIPT_NAME=%PROXY_SCRIPT_NAME%.py :PROXY @rem UAC Administrator privileges >nul 2>&1 reg query "HKU\S-1-5-19" || ( call :LOG [WARN] Currently running with non Administrator privileges, raising... echo set UAC = CreateObject^("Shell.Application"^) > "%temp%\UAC.vbs" - echo UAC.ShellExecute "%~f0", "%1", "", "runas", 1 >> "%temp%\UAC.vbs" + echo UAC.ShellExecute "%~f0","%1","","runas",1 >> "%temp%\UAC.vbs" "%temp%\UAC.vbs" del /f /q "%temp%\UAC.vbs" >nul 2>nul exit /b ) +call :LOG [INFO] Starting proxy daemon... + set PROXY=true + @rem Store original proxy settings for /f "tokens=2*" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable 2^>nul') do set "ORIG_PROXY_ENABLE=%%b" for /f "tokens=2*" %%a in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer 2^>nul') do set "ORIG_PROXY_SERVER=%%b" -call :LOG [INFO] Starting proxy daemon... @rem TODO: External proxy when ORIG_PROXY_ENABLE == 0x1 -start /min "" "%MITMPROXY_PATH%mitmdump.exe" -s %PROXY_SCRIPT% --ssl-insecure +echo set ws = createobject("wscript.shell") > "%temp%\proxy.vbs" +echo ws.currentdirectory = "%MITMDUMP_PATH%" >> "%temp%\proxy.vbs" +echo ws.run "cmd /c mitmdump.exe -s "^&chr(34)^&"%PROXY_SCRIPT_NAME%"^&chr(34)^&" -k",0 >> "%temp%\proxy.vbs" +"%temp%\proxy.vbs" +del /f /q "%temp%\proxy.vbs" >nul 2>nul -@rem CA certificate for possible HTTPS scheme +@rem CA certificate for HTTPS scheme call :LOG [INFO] Waiting for CA certificate generation... set CA_CERT_FILE="%USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer" -set /A TIMEOUT_COUNT=0 +set /a TIMEOUT_COUNT=0 :CERT_CA_CHECK if not exist %CA_CERT_FILE% ( - timeout /T 1 >nul 2>nul - set /A TIMEOUT_COUNT+=1 + timeout /t 1 >nul 2>nul + set /a TIMEOUT_COUNT+=1 goto CERT_CA_CHECK ) :EXTRA_TIMEOUT if %TIMEOUT_COUNT% LEQ 2 ( - timeout /T 1 >nul 2>nul - set /A TIMEOUT_COUNT+=1 + timeout /t 1 >nul 2>nul + set /a TIMEOUT_COUNT+=1 goto EXTRA_TIMEOUT ) call :LOG [INFO] Adding CA certificate to store... @@ -75,21 +98,13 @@ reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v Pr reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "127.0.0.1:8080" /f >nul 2>nul :SERVER -if not exist "%JAVA_PATH%bin\java.exe" ( - call :LOG [ERROR] Java not found. - goto :EXIT -) -if not exist "%SERVER_PATH%grasscutter.jar" ( - call :LOG [ERROR] Server jar not found. - goto :EXIT -) call :LOG [INFO] Starting server... -"%JAVA_PATH%bin\java.exe" -jar "%SERVER_PATH%grasscutter.jar" +"%JAVA_PATH%java.exe" -jar "%SERVER_PATH%grasscutter.jar" call :LOG [INFO] Server stopped :EXIT if "%PROXY%" == "" ( - call :LOG [INFO] Proxy not started, no need to clean up. + call :LOG [INFO] Proxy daemon not started, no need to clean up. ) else ( call :LOG [INFO] Restoring network settings... @@ -100,7 +115,6 @@ if "%PROXY%" == "" ( taskkill /t /f /im mitmdump.exe >nul 2>nul call :LOG [INFO] Removing CA certificate... - for /F "tokens=2" %%s in ('certutil -dump %CA_CERT_FILE% ^| findstr ^"^sha1^"') do ( set SERIAL=%%s ) From 1133ffd9aad7f8ad604886213eeba50c01aaa579 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Fri, 22 Apr 2022 11:33:54 +0800 Subject: [PATCH 111/119] Integrate MongoDB into C2R Signed-off-by: Jaida Wu --- start.cmd | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/start.cmd b/start.cmd index e3425d0e4..bf154bfd5 100644 --- a/start.cmd +++ b/start.cmd @@ -11,11 +11,12 @@ call :LOG [INFO] To proper exit this console, use [Ctrl + C] and enter N not Y. call :LOG [INFO] call :LOG [INFO] Initializing... -@rem TODO: MongoDB integration set JAVA_PATH=DO_NOT_CHECK_PATH set MITMDUMP_PATH=DO_NOT_CHECK_PATH +set MONGODB_PATH=DO_NOT_CHECK_PATH set SERVER_JAR_PATH=%CUR_PATH% +set DATABASE_STORAGE_PATH=%CUR_PATH%resources\Database set SERVER_JAR_NAME=grasscutter.jar set PROXY_SCRIPT_NAME=proxy @@ -98,11 +99,35 @@ reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v Pr reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d "127.0.0.1:8080" /f >nul 2>nul :SERVER +if not "%MONGODB_PATH%" == "DO_NOT_CHECK_PATH" ( + if not exist "%MONGODB_PATH%mongod.exe" ( + call :LOG [WARN] MongoDB daemon not found, server only mode. + goto :GAME + ) +) else set MONGODB_PATH= +call :LOG [INFO] Starting MongoDB daemon... +set DATABASE=true + +mkdir "%DATABASE_STORAGE_PATH%" >nul 2>nul + +echo set ws = createobject("wscript.shell") > "%temp%\db.vbs" +echo ws.currentdirectory = "%MONGODB_PATH%" >> "%temp%\db.vbs" +echo ws.run "cmd /c mongod.exe --dbpath "^&chr(34)^&"%DATABASE_STORAGE_PATH%"^&chr(34)^&"",0 >> "%temp%\db.vbs" +"%temp%\db.vbs" +del /f /q "%temp%\db.vbs" >nul 2>nul + +:GAME call :LOG [INFO] Starting server... "%JAVA_PATH%java.exe" -jar "%SERVER_PATH%grasscutter.jar" call :LOG [INFO] Server stopped :EXIT +if "%DATABASE%" == "" ( + call :LOG [INFO] MongoDB daemon not started, no need to clean up. +) else ( + call :LOG [INFO] Shutting down MongoDB daemon... + taskkill /t /f /im mongod.exe >nul 2>nul +) if "%PROXY%" == "" ( call :LOG [INFO] Proxy daemon not started, no need to clean up. ) else ( From 8d78897a29daeaf788a00971f7b5c3c3c328df94 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Fri, 22 Apr 2022 11:34:22 +0800 Subject: [PATCH 112/119] Allow configuration overrides Signed-off-by: Jaida Wu --- start.cmd | 6 ++++++ start_config.cmd | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 start_config.cmd diff --git a/start.cmd b/start.cmd index bf154bfd5..8c89f359e 100644 --- a/start.cmd +++ b/start.cmd @@ -11,6 +11,8 @@ call :LOG [INFO] To proper exit this console, use [Ctrl + C] and enter N not Y. call :LOG [INFO] call :LOG [INFO] Initializing... +set CONFIG=start_config + set JAVA_PATH=DO_NOT_CHECK_PATH set MITMDUMP_PATH=DO_NOT_CHECK_PATH set MONGODB_PATH=DO_NOT_CHECK_PATH @@ -21,6 +23,10 @@ set DATABASE_STORAGE_PATH=%CUR_PATH%resources\Database set SERVER_JAR_NAME=grasscutter.jar set PROXY_SCRIPT_NAME=proxy +if exist "%CUR_PATH%%CONFIG%.cmd" ( + call "%CUR_PATH%%CONFIG%.cmd" >nul 2>nul +) + if not "%JAVA_PATH%" == "DO_NOT_CHECK_PATH" ( if not exist "%JAVA_PATH%java.exe" ( call :LOG [ERROR] Java not found. diff --git a/start_config.cmd b/start_config.cmd new file mode 100644 index 000000000..575e4d8df --- /dev/null +++ b/start_config.cmd @@ -0,0 +1,25 @@ +@rem +@rem Copyright (C) 2002-2022 MlgmXyysd All Rights Reserved. +@rem + +@echo off +pushd %~dp0 +set CUR_PATH=%~dp0 + +@rem This will not work if your java or mitmproxy is in a different location, plugin as necessary +@rem this just saves you from changing your PATH + +@rem Executable Path +@rem Note: Fill DO_NOT_CHECK_PATH if you need to run it from PATH +@rem without detecting whether the executable file exists +set JAVA_PATH=C:\Program Files\Java\jdk1.8.0_202\bin\ +set MITMDUMP_PATH=%CUR_PATH% +set MONGODB_PATH=%CUR_PATH% + +@rem Utility Path +set SERVER_JAR_PATH=%CUR_PATH% +set DATABASE_STORAGE_PATH=%CUR_PATH%resources\Database + +@rem Utility Name +set SERVER_JAR_NAME=grasscutter.jar +set PROXY_SCRIPT_NAME=proxy \ No newline at end of file From 195b602fcc5c6955327eb0a366943214959a9983 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Fri, 22 Apr 2022 11:46:55 +0800 Subject: [PATCH 113/119] Update README.md --- README.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 1aef752c0..853c37ae3 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ A WIP server reimplementation for *some anime game* 2.3-2.6 * Friends list * Co-op *partially* work # Quick setup guide +### Note +* If you update from an older version, delete `config.json` for regeneration + ### 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+) @@ -26,7 +29,7 @@ A WIP server reimplementation for *some anime game* 2.3-2.6 ### Connecting with the client ½. Create an account using *server console command* below 1. Run a proxy daemon: (choose either one) - - mitmdump: `mitmdump -s proxy.py --ssl-insecure` + - mitmdump: `mitmdump -s proxy.py -k` - 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). - [Hosts file](https://github.com/Melledy/Grasscutter/wiki/Running#traffic-route-map) 2. Trust CA certificate: @@ -37,36 +40,33 @@ A WIP server reimplementation for *some anime game* 2.3-2.6 * or you can use `run.cmd` to start Server & Proxy daemon with one click # Grasscutter commands -### Server console commands +There is a dummy user named "Server" in every player's friends list that you can message to use commands. Commands also work in other chat rooms, such as private/team chats. `account create [username] {playerid}` - Creates an account with the specified username and the in-game uid for that account. The playerid parameter is optional and will be auto generated if not set. -### In-Game commands -There is a dummy user named "Server" in every player's friends list that you can message to use commands. Commands also work in other chat rooms, such as private/team chats. +`spawn [monster id] [level] [amount]` -`!spawn [monster id] [level] [amount]` +`give [item id] [amount]` -`!give [item id] [amount]` +`givechar [avatar id] [level]` -`!givechar [avatar id] [level]` +`drop [item id] [amount]` -`!drop [item id] [amount]` +`killall` -`!killall` +`setworldlevel [level]` - Relog to see effects properly -`!setworldlevel [level]` - Relog to see effects properly +`godmode` - Prevents you from taking damage -`!godmode` - Prevents you from taking damage +`resetconst` - Resets the constellation level on your current active character, will need to relog after using the command to see any changes. -`!resetconst` - Resets the constellation level on your current active character, will need to relog after using the command to see any changes. +`setstats [stats] [amount]` - Changes the current character's specified stat. -`!setstats [stats] [amount]` - Changes the current character's specified stat. +`clearartifacts` - Deletes all unequipped and unlocked level 0 artifacts, **including yellow rarity ones** from your inventory -`!clearartifacts` - Deletes all unequipped and unlocked level 0 artifacts, **including yellow rarity ones** from your inventory +`pos` - Gets your current coordinate. -`!pos` - Gets your current coordinate. - -`!weather [weather id] [climate id]` - Changes the current weather. +`weather [weather id] [climate id]` - Changes the current weather. *More commands will be updated in the [wiki](https://github.com/Melledy/Grasscutter/wiki/).* From 523329d1a04ee7a3952510b2d666537530aa18c0 Mon Sep 17 00:00:00 2001 From: SpikeHD Date: Thu, 21 Apr 2022 20:52:23 -0700 Subject: [PATCH 114/119] create empty action file --- .github/workflows/build.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..e69de29bb From 976d84183785716d89bffec35f4911a79ca57678 Mon Sep 17 00:00:00 2001 From: SpikeHD Date: Thu, 21 Apr 2022 20:55:43 -0700 Subject: [PATCH 115/119] begin compile env setup --- .github/workflows/build.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e69de29bb..8e5b8391a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -0,0 +1,12 @@ +name: "Build" +on: "Push" +jobs: + Build-Server-Jar: + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: '8' + - run: gradlew From 671d2f1898b63661f3f9116985ac4c075892f21a Mon Sep 17 00:00:00 2001 From: SpikeHD Date: Thu, 21 Apr 2022 20:57:30 -0700 Subject: [PATCH 116/119] Update build.yml --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8e5b8391a..ce4f17416 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,12 +1,12 @@ name: "Build" -on: "Push" +on: "push" jobs: Build-Server-Jar: runs-on: windows-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: '8' + with: + distribution: temurin + java-version: '8' - run: gradlew From dde88db8953b3fadcc72c6adb1e38e68126d9a2b Mon Sep 17 00:00:00 2001 From: SpikeHD Date: Thu, 21 Apr 2022 21:04:00 -0700 Subject: [PATCH 117/119] build steps --- .github/workflows/build.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ce4f17416..29bbfdd04 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,9 +4,10 @@ jobs: Build-Server-Jar: runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v2 - uses: actions/setup-java@v3 with: distribution: temurin java-version: '8' - - run: gradlew + - run: .\gradlew.bat + - run: .\gradlew jar From e4fc815cd8f47ba825b1d85ac6c725ff7b13288d Mon Sep 17 00:00:00 2001 From: SpikeHD Date: Thu, 21 Apr 2022 21:13:38 -0700 Subject: [PATCH 118/119] upload artifact --- .github/workflows/build.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 29bbfdd04..b8efbad05 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,10 +4,18 @@ jobs: Build-Server-Jar: runs-on: windows-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v3 + - name: Checkout + uses: actions/checkout@v2 + - name: Setup Java + uses: actions/setup-java@v3 with: distribution: temurin java-version: '8' - - run: .\gradlew.bat - - run: .\gradlew jar + - name: Run Gradle + run: .\gradlew.bat && .\gradlew jar + - name: Upload build + uses: actions/upload-artifact@v3 + with: + name: Grasscutter + path: grasscutter.jar + From 1989d552b92c81af8d57340b471eb4a524dc20b3 Mon Sep 17 00:00:00 2001 From: SpikeHD Date: Thu, 21 Apr 2022 21:21:08 -0700 Subject: [PATCH 119/119] only build on stable --- .github/workflows/build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b8efbad05..8457bf7ac 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,5 +1,8 @@ name: "Build" -on: "push" +on: + push: + branches: + - "stable" jobs: Build-Server-Jar: runs-on: windows-latest