From 02ef9d84c7e8f96114f9fa70eaa51873351e6085 Mon Sep 17 00:00:00 2001 From: BaiSugar Date: Sun, 24 Apr 2022 14:01:03 +0800 Subject: [PATCH 01/20] Added command to get all items --- .../command/commands/GiveAllCommand.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java diff --git a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java new file mode 100644 index 000000000..a90080e0a --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java @@ -0,0 +1,109 @@ +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.data.def.ItemData; +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.avatar.GenshinAvatar; +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 = "giveall", usage = "giveall [player] ", + description = "Gives All item to you or the specified player", aliases = {"givea"}, permission = "player.giveall") +public class GiveAllCommand implements CommandHandler { + + @Override + public void execute(GenshinPlayer sender, List args) { + int target,amount=99999; + + switch (args.size()) { + default: // giveall *no args* + target = sender.getUid(); + break; + case 1: //[player] + try { + target = Integer.parseInt(args.get(0)); + if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { + CommandHandler.sendMessage(sender, "Invalid player ID."); + return; + } + }catch (NumberFormatException ignored){ + CommandHandler.sendMessage(sender, "Invalid amount or player ID."); + return; + } + break; + case 2: //[player] [amount] + try { + target = Integer.parseInt(args.get(0)); + if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { + target = sender.getUid(); + amount = Integer.parseInt(args.get(0)); + } else { + amount = Integer.parseInt(args.get(1)); + } + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(sender, "Invalid amount or player ID."); + return; + } + break; + } + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + + if (targetPlayer == null) { + CommandHandler.sendMessage(sender, "Player not found."); + return; + } + + this.GetAllItem(targetPlayer,amount); + CommandHandler.sendMessage(sender, String.format("Get All Items Done.")); + } + + public void GetAllItem(GenshinPlayer player, int amount){ + CommandHandler.sendMessage(player, "Get All Items..."); + for (ItemData itemdata: GenshinData.getItemDataMap().values()) { + if(itemdata.getId() > 1000 && itemdata.getId() <= 2000)continue;//is avatar + if (itemdata.isEquip()) { + List items = new LinkedList<>(); + for (int i = 0; i < 20; i++) { + 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)); + } + } + for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) + { + int ascension; + int level = 90; + // Calculate ascension level. + if (level <= 40) { + ascension = (int) Math.ceil(90 / 20f); + } else { + ascension = (int) Math.ceil(90 / 10f) - 3; + } + + GenshinAvatar avatar = new GenshinAvatar(avatarData); + avatar.setLevel(level); + avatar.setPromoteLevel(ascension); + for (int i = 1;i<=6;i++){ + avatar.getTalentIdList().add((avatar.getAvatarId()-10000000)*10+i);//(10000058-10000000)*10+i + } + // This will handle stats and talents + avatar.recalcStats(); + player.addAvatar(avatar); + } + } + +} From 079695775159a4dc1b596ee1cf83e8ff3288ae43 Mon Sep 17 00:00:00 2001 From: BaiSugar Date: Sun, 24 Apr 2022 21:52:50 +0800 Subject: [PATCH 02/20] Added command to get all items --- .../java/emu/grasscutter/command/Command.java | 2 ++ .../emu/grasscutter/command/CommandMap.java | 19 +++++++---- .../command/commands/GiveAllCommand.java | 33 ++++++++++--------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/Command.java b/src/main/java/emu/grasscutter/command/Command.java index d8a57e1a8..c38568d65 100644 --- a/src/main/java/emu/grasscutter/command/Command.java +++ b/src/main/java/emu/grasscutter/command/Command.java @@ -14,4 +14,6 @@ public @interface Command { String[] aliases() default {}; String permission() default ""; + + boolean threading() default false; } diff --git a/src/main/java/emu/grasscutter/command/CommandMap.java b/src/main/java/emu/grasscutter/command/CommandMap.java index f735bc642..19ab687ad 100644 --- a/src/main/java/emu/grasscutter/command/CommandMap.java +++ b/src/main/java/emu/grasscutter/command/CommandMap.java @@ -11,7 +11,6 @@ import java.util.*; public final class CommandMap { private final Map commands = new HashMap<>(); private final Map annotations = new HashMap<>(); - public CommandMap() { this(false); } @@ -106,8 +105,9 @@ public final class CommandMap { */ public void invoke(GenshinPlayer player, String rawMessage) { rawMessage = rawMessage.trim(); - if(rawMessage.length() == 0) { - CommandHandler.sendMessage(player, "No command specified."); return; + if (rawMessage.length() == 0) { + CommandHandler.sendMessage(player, "No command specified."); + return; } // Remove prefix if present. @@ -118,7 +118,6 @@ public final class CommandMap { 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) { @@ -130,14 +129,22 @@ public final class CommandMap { if (player != null) { String permissionNode = this.annotations.get(label).permission(); Account account = player.getAccount(); - if(!permissionNode.isEmpty() && !account.hasPermission(permissionNode)) { + if (!permissionNode.isEmpty() && !account.hasPermission(permissionNode)) { CommandHandler.sendMessage(player, "You do not have permission to run this command."); return; } } // Invoke execute method for handler. - handler.execute(player, args); + boolean threading = this.annotations.get(label).threading(); + Runnable runnable = () -> handler.execute(player, args); + if(threading) { + Thread command = new Thread(runnable); + command.start(); + } + else { + runnable.run(); + } } /** diff --git a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java index a90080e0a..ad4240b01 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java @@ -1,5 +1,6 @@ package emu.grasscutter.command.commands; +import com.thoughtworks.proxy.toys.nullobject.Null; import emu.grasscutter.Grasscutter; import emu.grasscutter.command.Command; import emu.grasscutter.command.CommandHandler; @@ -9,14 +10,11 @@ import emu.grasscutter.data.def.ItemData; import emu.grasscutter.game.GenshinPlayer; import emu.grasscutter.game.avatar.GenshinAvatar; 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; +import java.util.*; @Command(label = "giveall", usage = "giveall [player] ", - description = "Gives All item to you or the specified player", aliases = {"givea"}, permission = "player.giveall") + description = "Gives all items", aliases = {"givea"}, permission = "player.giveall",threading = true) public class GiveAllCommand implements CommandHandler { @Override @@ -25,7 +23,12 @@ public class GiveAllCommand implements CommandHandler { switch (args.size()) { default: // giveall *no args* - target = sender.getUid(); + try { + target = sender.getUid(); + }catch (NullPointerException ignored){ + CommandHandler.sendMessage(sender, "Player not found."); + return; + } break; case 1: //[player] try { @@ -62,27 +65,27 @@ public class GiveAllCommand implements CommandHandler { } this.GetAllItem(targetPlayer,amount); - CommandHandler.sendMessage(sender, String.format("Get All Items Done.")); + CommandHandler.sendMessage(sender, "Done! or Getting all items done"); } public void GetAllItem(GenshinPlayer player, int amount){ - CommandHandler.sendMessage(player, "Get All Items..."); + CommandHandler.sendMessage(player, "Getting all items…"); + + Collection genshinItemList =new LinkedList<>(); for (ItemData itemdata: GenshinData.getItemDataMap().values()) { - if(itemdata.getId() > 1000 && itemdata.getId() <= 2000)continue;//is avatar + if(itemdata.getId() > 1000 && itemdata.getId() <= 1099)continue;//is avatar if (itemdata.isEquip()) { - List items = new LinkedList<>(); for (int i = 0; i < 20; i++) { - items.add(new GenshinItem(itemdata)); + genshinItemList.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)); + genshinItemList.add(genshinItem); } } + player.getInventory().addItems(genshinItemList); + for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) { int ascension; From 60319ee9eb0d54dc7b8d99c85bda9d3a92a88118 Mon Sep 17 00:00:00 2001 From: BaiSugar Date: Sun, 24 Apr 2022 22:38:53 +0800 Subject: [PATCH 03/20] Corrected format --- .../java/emu/grasscutter/command/Command.java | 2 +- .../emu/grasscutter/command/CommandMap.java | 2 ++ .../command/commands/GiveAllCommand.java | 23 ++++++------------- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/Command.java b/src/main/java/emu/grasscutter/command/Command.java index c38568d65..a0edc5cdc 100644 --- a/src/main/java/emu/grasscutter/command/Command.java +++ b/src/main/java/emu/grasscutter/command/Command.java @@ -15,5 +15,5 @@ public @interface Command { String permission() default ""; - boolean threading() default false; + boolean threading() default false; } diff --git a/src/main/java/emu/grasscutter/command/CommandMap.java b/src/main/java/emu/grasscutter/command/CommandMap.java index 19ab687ad..f104e3bfc 100644 --- a/src/main/java/emu/grasscutter/command/CommandMap.java +++ b/src/main/java/emu/grasscutter/command/CommandMap.java @@ -136,9 +136,11 @@ public final class CommandMap { } // Invoke execute method for handler. + // Get whether the command starts a thread boolean threading = this.annotations.get(label).threading(); Runnable runnable = () -> handler.execute(player, args); if(threading) { + //start thread Thread command = new Thread(runnable); command.start(); } diff --git a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java index ad4240b01..d817b2967 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java @@ -1,6 +1,5 @@ package emu.grasscutter.command.commands; -import com.thoughtworks.proxy.toys.nullobject.Null; import emu.grasscutter.Grasscutter; import emu.grasscutter.command.Command; import emu.grasscutter.command.CommandHandler; @@ -22,7 +21,7 @@ public class GiveAllCommand implements CommandHandler { int target,amount=99999; switch (args.size()) { - default: // giveall *no args* + default: // *no args* try { target = sender.getUid(); }catch (NullPointerException ignored){ @@ -38,7 +37,7 @@ public class GiveAllCommand implements CommandHandler { return; } }catch (NumberFormatException ignored){ - CommandHandler.sendMessage(sender, "Invalid amount or player ID."); + CommandHandler.sendMessage(sender, "Invalid player ID."); return; } break; @@ -73,7 +72,7 @@ public class GiveAllCommand implements CommandHandler { Collection genshinItemList =new LinkedList<>(); for (ItemData itemdata: GenshinData.getItemDataMap().values()) { - if(itemdata.getId() > 1000 && itemdata.getId() <= 1099)continue;//is avatar + if(itemdata.getId() > 1000 && itemdata.getId() <= 1099) continue; if (itemdata.isEquip()) { for (int i = 0; i < 20; i++) { genshinItemList.add(new GenshinItem(itemdata)); @@ -86,22 +85,14 @@ public class GiveAllCommand implements CommandHandler { } player.getInventory().addItems(genshinItemList); - for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) - { - int ascension; - int level = 90; + for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) { // Calculate ascension level. - if (level <= 40) { - ascension = (int) Math.ceil(90 / 20f); - } else { - ascension = (int) Math.ceil(90 / 10f) - 3; - } - + int ascension = (int) Math.ceil(90 / 10f) - 3; GenshinAvatar avatar = new GenshinAvatar(avatarData); - avatar.setLevel(level); + avatar.setLevel(90); avatar.setPromoteLevel(ascension); for (int i = 1;i<=6;i++){ - avatar.getTalentIdList().add((avatar.getAvatarId()-10000000)*10+i);//(10000058-10000000)*10+i + avatar.getTalentIdList().add((avatar.getAvatarId()-10000000)*10+i); } // This will handle stats and talents avatar.recalcStats(); From f3d561cd062309763af79630e8c2e410b12dc27f Mon Sep 17 00:00:00 2001 From: BaiSugar Date: Sun, 24 Apr 2022 22:42:44 +0800 Subject: [PATCH 04/20] Revert "Corrected format" This reverts commit 60319ee9eb0d54dc7b8d99c85bda9d3a92a88118. --- .../java/emu/grasscutter/command/Command.java | 2 +- .../emu/grasscutter/command/CommandMap.java | 2 -- .../command/commands/GiveAllCommand.java | 23 +++++++++++++------ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/Command.java b/src/main/java/emu/grasscutter/command/Command.java index a0edc5cdc..c38568d65 100644 --- a/src/main/java/emu/grasscutter/command/Command.java +++ b/src/main/java/emu/grasscutter/command/Command.java @@ -15,5 +15,5 @@ public @interface Command { String permission() default ""; - boolean threading() default false; + boolean threading() default false; } diff --git a/src/main/java/emu/grasscutter/command/CommandMap.java b/src/main/java/emu/grasscutter/command/CommandMap.java index f104e3bfc..19ab687ad 100644 --- a/src/main/java/emu/grasscutter/command/CommandMap.java +++ b/src/main/java/emu/grasscutter/command/CommandMap.java @@ -136,11 +136,9 @@ public final class CommandMap { } // Invoke execute method for handler. - // Get whether the command starts a thread boolean threading = this.annotations.get(label).threading(); Runnable runnable = () -> handler.execute(player, args); if(threading) { - //start thread Thread command = new Thread(runnable); command.start(); } diff --git a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java index d817b2967..ad4240b01 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java @@ -1,5 +1,6 @@ package emu.grasscutter.command.commands; +import com.thoughtworks.proxy.toys.nullobject.Null; import emu.grasscutter.Grasscutter; import emu.grasscutter.command.Command; import emu.grasscutter.command.CommandHandler; @@ -21,7 +22,7 @@ public class GiveAllCommand implements CommandHandler { int target,amount=99999; switch (args.size()) { - default: // *no args* + default: // giveall *no args* try { target = sender.getUid(); }catch (NullPointerException ignored){ @@ -37,7 +38,7 @@ public class GiveAllCommand implements CommandHandler { return; } }catch (NumberFormatException ignored){ - CommandHandler.sendMessage(sender, "Invalid player ID."); + CommandHandler.sendMessage(sender, "Invalid amount or player ID."); return; } break; @@ -72,7 +73,7 @@ public class GiveAllCommand implements CommandHandler { Collection genshinItemList =new LinkedList<>(); for (ItemData itemdata: GenshinData.getItemDataMap().values()) { - if(itemdata.getId() > 1000 && itemdata.getId() <= 1099) continue; + if(itemdata.getId() > 1000 && itemdata.getId() <= 1099)continue;//is avatar if (itemdata.isEquip()) { for (int i = 0; i < 20; i++) { genshinItemList.add(new GenshinItem(itemdata)); @@ -85,14 +86,22 @@ public class GiveAllCommand implements CommandHandler { } player.getInventory().addItems(genshinItemList); - for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) { + for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) + { + int ascension; + int level = 90; // Calculate ascension level. - int ascension = (int) Math.ceil(90 / 10f) - 3; + if (level <= 40) { + ascension = (int) Math.ceil(90 / 20f); + } else { + ascension = (int) Math.ceil(90 / 10f) - 3; + } + GenshinAvatar avatar = new GenshinAvatar(avatarData); - avatar.setLevel(90); + avatar.setLevel(level); avatar.setPromoteLevel(ascension); for (int i = 1;i<=6;i++){ - avatar.getTalentIdList().add((avatar.getAvatarId()-10000000)*10+i); + avatar.getTalentIdList().add((avatar.getAvatarId()-10000000)*10+i);//(10000058-10000000)*10+i } // This will handle stats and talents avatar.recalcStats(); From 885e2d078ce909d28adc3280ad0eb021c4ccc6c9 Mon Sep 17 00:00:00 2001 From: BaiSugar Date: Sun, 24 Apr 2022 22:45:30 +0800 Subject: [PATCH 05/20] Corrected format --- .../java/emu/grasscutter/command/commands/GiveAllCommand.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java index ad4240b01..8d6bba061 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java @@ -1,6 +1,5 @@ package emu.grasscutter.command.commands; -import com.thoughtworks.proxy.toys.nullobject.Null; import emu.grasscutter.Grasscutter; import emu.grasscutter.command.Command; import emu.grasscutter.command.CommandHandler; From 5eeea84f8e5175c7e1d3ee1d08f924f021bc93cc Mon Sep 17 00:00:00 2001 From: BaiSugar Date: Sun, 24 Apr 2022 22:46:43 +0800 Subject: [PATCH 06/20] Corrected format --- src/main/java/emu/grasscutter/command/Command.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/command/Command.java b/src/main/java/emu/grasscutter/command/Command.java index c38568d65..a0edc5cdc 100644 --- a/src/main/java/emu/grasscutter/command/Command.java +++ b/src/main/java/emu/grasscutter/command/Command.java @@ -15,5 +15,5 @@ public @interface Command { String permission() default ""; - boolean threading() default false; + boolean threading() default false; } From 1c15dd3c322bae8ed80f691482c63040c57f3a5c Mon Sep 17 00:00:00 2001 From: BaiSugar Date: Sun, 24 Apr 2022 22:49:33 +0800 Subject: [PATCH 07/20] fix --- .../command/commands/GiveAllCommand.java | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java index 8d6bba061..4a7777565 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java @@ -21,7 +21,7 @@ public class GiveAllCommand implements CommandHandler { int target,amount=99999; switch (args.size()) { - default: // giveall *no args* + default: // *no args* try { target = sender.getUid(); }catch (NullPointerException ignored){ @@ -29,7 +29,7 @@ public class GiveAllCommand implements CommandHandler { return; } break; - case 1: //[player] + case 1: // [player] try { target = Integer.parseInt(args.get(0)); if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { @@ -37,11 +37,11 @@ public class GiveAllCommand implements CommandHandler { return; } }catch (NumberFormatException ignored){ - CommandHandler.sendMessage(sender, "Invalid amount or player ID."); + CommandHandler.sendMessage(sender, "Invalid player ID."); return; } break; - case 2: //[player] [amount] + case 2: // [player] [amount] try { target = Integer.parseInt(args.get(0)); if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { @@ -85,19 +85,11 @@ public class GiveAllCommand implements CommandHandler { } player.getInventory().addItems(genshinItemList); - for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) - { - int ascension; - int level = 90; + for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) { // Calculate ascension level. - if (level <= 40) { - ascension = (int) Math.ceil(90 / 20f); - } else { - ascension = (int) Math.ceil(90 / 10f) - 3; - } - + int ascension = (int) Math.ceil(90 / 10f) - 3; GenshinAvatar avatar = new GenshinAvatar(avatarData); - avatar.setLevel(level); + avatar.setLevel(90); avatar.setPromoteLevel(ascension); for (int i = 1;i<=6;i++){ avatar.getTalentIdList().add((avatar.getAvatarId()-10000000)*10+i);//(10000058-10000000)*10+i From c6bd1fa5d41eba91bb3cf17e4d57531b852b5e20 Mon Sep 17 00:00:00 2001 From: BaiSugar Date: Mon, 25 Apr 2022 15:17:55 +0800 Subject: [PATCH 08/20] remove test avatar --- .../command/commands/GiveAllCommand.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java index 4a7777565..b994fe419 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java @@ -9,25 +9,24 @@ import emu.grasscutter.data.def.ItemData; import emu.grasscutter.game.GenshinPlayer; import emu.grasscutter.game.avatar.GenshinAvatar; import emu.grasscutter.game.inventory.GenshinItem; +import emu.grasscutter.game.inventory.ItemType; import java.util.*; @Command(label = "giveall", usage = "giveall [player] ", description = "Gives all items", aliases = {"givea"}, permission = "player.giveall",threading = true) public class GiveAllCommand implements CommandHandler { - @Override public void execute(GenshinPlayer sender, List args) { int target,amount=99999; + if(sender == null){ + CommandHandler.sendMessage(null, "Run this command in-game"); + return; + } switch (args.size()) { default: // *no args* - try { - target = sender.getUid(); - }catch (NullPointerException ignored){ - CommandHandler.sendMessage(sender, "Player not found."); - return; - } + target = sender.getUid(); break; case 1: // [player] try { @@ -44,7 +43,7 @@ public class GiveAllCommand implements CommandHandler { case 2: // [player] [amount] try { target = Integer.parseInt(args.get(0)); - if (Grasscutter.getGameServer().getPlayerByUid(target) == null && sender != null) { + if (Grasscutter.getGameServer().getPlayerByUid(target) == null) { target = sender.getUid(); amount = Integer.parseInt(args.get(0)); } else { @@ -56,8 +55,8 @@ public class GiveAllCommand implements CommandHandler { } break; } - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); if (targetPlayer == null) { CommandHandler.sendMessage(sender, "Player not found."); return; @@ -68,14 +67,19 @@ public class GiveAllCommand implements CommandHandler { } public void GetAllItem(GenshinPlayer player, int amount){ - CommandHandler.sendMessage(player, "Getting all items…"); + CommandHandler.sendMessage(player, "Getting all item...."); Collection genshinItemList =new LinkedList<>(); for (ItemData itemdata: GenshinData.getItemDataMap().values()) { if(itemdata.getId() > 1000 && itemdata.getId() <= 1099)continue;//is avatar if (itemdata.isEquip()) { for (int i = 0; i < 20; i++) { - genshinItemList.add(new GenshinItem(itemdata)); + GenshinItem genshinItem = new GenshinItem(itemdata); + if(itemdata.getItemType() == ItemType.ITEM_WEAPON){ + genshinItem.setLevel(90); + genshinItem.setPromoteLevel(6); + } + genshinItemList.add(genshinItem); } } else { GenshinItem genshinItem = new GenshinItem(itemdata); @@ -86,6 +90,7 @@ public class GiveAllCommand implements CommandHandler { player.getInventory().addItems(genshinItemList); for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) { + if(avatarData.getId() == 10000001 || avatarData.getId() >= 10000099)continue; // Calculate ascension level. int ascension = (int) Math.ceil(90 / 10f) - 3; GenshinAvatar avatar = new GenshinAvatar(avatarData); From 03988414ce4071a1b338686d6ccd3b3ff2bbb6d3 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 26 Apr 2022 00:04:03 -0400 Subject: [PATCH 09/20] Refactor classes --- .../grasscutter/command/commands/HealCommand.java | 11 +++++------ .../grasscutter/command/commands/ListCommand.java | 12 ++++-------- .../grasscutter/command/commands/TalentCommand.java | 2 +- .../{TelePortCommand.java => TeleportCommand.java} | 2 +- .../grasscutter/server/dispatch/DispatchServer.java | 4 ++-- 5 files changed, 13 insertions(+), 18 deletions(-) rename src/main/java/emu/grasscutter/command/commands/{TelePortCommand.java => TeleportCommand.java} (97%) diff --git a/src/main/java/emu/grasscutter/command/commands/HealCommand.java b/src/main/java/emu/grasscutter/command/commands/HealCommand.java index 511e52812..27511e527 100644 --- a/src/main/java/emu/grasscutter/command/commands/HealCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/HealCommand.java @@ -6,20 +6,19 @@ 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 = "heal", usage = "heal|h", - description = "Heal all characters in your current team.", aliases = {"h"}, permission = "player.heal") -public class HealCommand implements CommandHandler { +@Command(label = "heal", usage = "heal|h", aliases = {"h"}, + description = "Heal all characters in your current team.", permission = "player.heal") +public final class HealCommand 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( @@ -31,6 +30,6 @@ public class HealCommand implements CommandHandler { entity.getWorld().broadcastPacket(new PacketAvatarLifeStateChangeNotify(entity.getAvatar())); } }); - CommandHandler.sendMessage(sender, "All characters are healed."); + CommandHandler.sendMessage(sender, "All characters have been healed."); } } diff --git a/src/main/java/emu/grasscutter/command/commands/ListCommand.java b/src/main/java/emu/grasscutter/command/commands/ListCommand.java index 6afca4a6d..1fb7f0eed 100644 --- a/src/main/java/emu/grasscutter/command/commands/ListCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/ListCommand.java @@ -9,7 +9,7 @@ import java.util.List; import java.util.Map; @Command(label = "list", description = "List online players") -public class ListCommand implements CommandHandler { +public final class ListCommand implements CommandHandler { @Override public void execute(GenshinPlayer sender, List args) { @@ -19,14 +19,10 @@ public class ListCommand implements CommandHandler { if (playersMap.size() != 0) { StringBuilder playerSet = new StringBuilder(); - - for (Map.Entry entry : playersMap.entrySet()) { - playerSet.append(entry.getValue().getNickname()); - playerSet.append(", "); - } - + playersMap.values().forEach(player -> + playerSet.append(player.getNickname()).append(", ")); + String players = playerSet.toString(); - CommandHandler.sendMessage(sender, players.substring(0, players.length() - 2)); } } diff --git a/src/main/java/emu/grasscutter/command/commands/TalentCommand.java b/src/main/java/emu/grasscutter/command/commands/TalentCommand.java index 21cf66249..59fc83226 100644 --- a/src/main/java/emu/grasscutter/command/commands/TalentCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/TalentCommand.java @@ -13,7 +13,7 @@ import java.util.List; @Command(label = "talent", usage = "talent ", description = "Set talent level for your current active character", permission = "player.settalent") -public class TalentCommand implements CommandHandler { +public final class TalentCommand implements CommandHandler { @Override public void execute(GenshinPlayer sender, List args) { diff --git a/src/main/java/emu/grasscutter/command/commands/TelePortCommand.java b/src/main/java/emu/grasscutter/command/commands/TeleportCommand.java similarity index 97% rename from src/main/java/emu/grasscutter/command/commands/TelePortCommand.java rename to src/main/java/emu/grasscutter/command/commands/TeleportCommand.java index 84848afa5..6b08fb333 100644 --- a/src/main/java/emu/grasscutter/command/commands/TelePortCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/TeleportCommand.java @@ -9,7 +9,7 @@ import java.util.List; @Command(label = "teleport", usage = "teleport ", aliases = {"tp"}, description = "Change the player's position.", permission = "player.teleport") -public class TelePortCommand implements CommandHandler { +public final class TeleportCommand implements CommandHandler { @Override public void execute(GenshinPlayer sender, List args) { diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index 5cb06d5e1..fe8e79abc 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -98,8 +98,8 @@ public final class DispatchServer { byte[] decoded2 = Base64.getDecoder().decode(query_cur_region); QueryCurrRegionHttpRsp regionQuery = QueryCurrRegionHttpRsp.parseFrom(decoded2); - List servers = new ArrayList(); - List usedNames = new ArrayList(); // List to check for potential naming conflicts + 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 RegionSimpleInfo server = RegionSimpleInfo.newBuilder() From f74b95aa713c21efe4ff24bf9df07b537324f366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9C=9F=E5=BF=83?= Date: Tue, 26 Apr 2022 12:37:14 +0800 Subject: [PATCH 10/20] Update README.md --- README.md | 2 +- README_zh-CN.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fdd0b1e27..d32e1ca9e 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ Grasscutter uses Gradle to handle dependencies & building. **Requirements:** -- Java SE Development Kits - 16 +- Java SE Development Kits - 17 - Git ##### Windows diff --git a/README_zh-CN.md b/README_zh-CN.md index 17f7e70f0..a2fe023b7 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -75,7 +75,7 @@ Grasscutter 使用 Gradle 来处理依赖及构建. **依赖:** -- Java SE Development Kits - 16 +- Java SE Development Kits - 17 - Git ##### Windows From 2369f92cb4a0a2fc7fbcdc1acda40e3b3c02b2a8 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 26 Apr 2022 00:39:05 -0400 Subject: [PATCH 11/20] Fix command issue --- src/main/java/emu/grasscutter/Grasscutter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/Grasscutter.java b/src/main/java/emu/grasscutter/Grasscutter.java index 8246588ae..3db73eb1b 100644 --- a/src/main/java/emu/grasscutter/Grasscutter.java +++ b/src/main/java/emu/grasscutter/Grasscutter.java @@ -36,7 +36,7 @@ public final class Grasscutter { private static GameServer gameServer; private static PluginManager pluginManager; - public static final Reflections reflector = new Reflections(); + public static final Reflections reflector = new Reflections("emu.grasscutter"); static { // Declare logback configuration. From d23050ffa5d30cb430032593c2c522f17964e73d Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 26 Apr 2022 00:39:30 -0400 Subject: [PATCH 12/20] Bug fix & Cleanup --- .../command/commands/ClearCommand.java | 87 +++++++++---------- .../commands/SetFetterLevelCommand.java | 2 +- 2 files changed, 42 insertions(+), 47 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/ClearCommand.java b/src/main/java/emu/grasscutter/command/commands/ClearCommand.java index 8d16e58c1..fc6295253 100644 --- a/src/main/java/emu/grasscutter/command/commands/ClearCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/ClearCommand.java @@ -3,15 +3,10 @@ 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.inventory.Inventory; import emu.grasscutter.game.inventory.ItemType; -import java.util.Collection; -import java.util.LinkedList; import java.util.List; @Command(label = "clear", usage = "clear ", //Merged /clearartifacts and /clearweapons to /clear [uid] @@ -33,62 +28,62 @@ public final class ClearCommand implements CommandHandler { try { target = Integer.parseInt(args.get(0)); GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); - if (targetPlayer == null && sender != null) { + if (targetPlayer == null) { target = sender.getUid(); } else { - switch (cmdSwitch){ - case "wp": + switch (cmdSwitch) { + case "wp" -> { playerInventory.getItems().values().stream() - .filter(item -> item.getItemType() == ItemType.ITEM_WEAPON) - .filter(item -> !item.isLocked() && !item.isEquipped()) - .forEach(item -> playerInventory.removeItem(item, item.getCount())); + .filter(item -> item.getItemType() == ItemType.ITEM_WEAPON) + .filter(item -> !item.isLocked() && !item.isEquipped()) + .forEach(item -> playerInventory.removeItem(item, item.getCount())); sender.dropMessage("Cleared weapons for " + targetPlayer.getNickname() + " ."); - break; - case "art": + } + case "art" -> { 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())); + .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())); sender.dropMessage("Cleared artifacts for " + targetPlayer.getNickname() + " ."); - break; - case "mat": + } + case "mat" -> { playerInventory.getItems().values().stream() - .filter(item -> item.getItemType() == ItemType.ITEM_MATERIAL) - .filter(item -> item.getLevel() == 1 && item.getExp() == 0) - .filter(item -> !item.isLocked() && !item.isEquipped()) - .forEach(item -> playerInventory.removeItem(item, item.getCount())); + .filter(item -> item.getItemType() == ItemType.ITEM_MATERIAL) + .filter(item -> item.getLevel() == 1 && item.getExp() == 0) + .filter(item -> !item.isLocked() && !item.isEquipped()) + .forEach(item -> playerInventory.removeItem(item, item.getCount())); sender.dropMessage("Cleared artifacts for " + targetPlayer.getNickname() + " ."); - break; - case "all": + } + case "all" -> { playerInventory.getItems().values().stream() - .filter(item1 -> item1.getItemType() == ItemType.ITEM_RELIQUARY) - .filter(item1 -> item1.getLevel() == 1 && item1.getExp() == 0) - .filter(item1 -> !item1.isLocked() && !item1.isEquipped()) - .forEach(item1 -> playerInventory.removeItem(item1, item1.getCount())); + .filter(item1 -> item1.getItemType() == ItemType.ITEM_RELIQUARY) + .filter(item1 -> item1.getLevel() == 1 && item1.getExp() == 0) + .filter(item1 -> !item1.isLocked() && !item1.isEquipped()) + .forEach(item1 -> playerInventory.removeItem(item1, item1.getCount())); playerInventory.getItems().values().stream() - .filter(item2 -> item2.getItemType() == ItemType.ITEM_MATERIAL) - .filter(item2 -> !item2.isLocked() && !item2.isEquipped()) - .forEach(item2 -> playerInventory.removeItem(item2, item2.getCount())); + .filter(item2 -> item2.getItemType() == ItemType.ITEM_MATERIAL) + .filter(item2 -> !item2.isLocked() && !item2.isEquipped()) + .forEach(item2 -> playerInventory.removeItem(item2, item2.getCount())); playerInventory.getItems().values().stream() - .filter(item3 -> item3.getItemType() == ItemType.ITEM_WEAPON) - .filter(item3 -> item3.getLevel() == 1 && item3.getExp() == 0) - .filter(item3 -> !item3.isLocked() && !item3.isEquipped()) - .forEach(item3 -> playerInventory.removeItem(item3, item3.getCount())); + .filter(item3 -> item3.getItemType() == ItemType.ITEM_WEAPON) + .filter(item3 -> item3.getLevel() == 1 && item3.getExp() == 0) + .filter(item3 -> !item3.isLocked() && !item3.isEquipped()) + .forEach(item3 -> playerInventory.removeItem(item3, item3.getCount())); playerInventory.getItems().values().stream() - .filter(item4 -> item4.getItemType() == ItemType.ITEM_FURNITURE) - .filter(item4 -> !item4.isLocked() && !item4.isEquipped()) - .forEach(item4 -> playerInventory.removeItem(item4, item4.getCount())); + .filter(item4 -> item4.getItemType() == ItemType.ITEM_FURNITURE) + .filter(item4 -> !item4.isLocked() && !item4.isEquipped()) + .forEach(item4 -> playerInventory.removeItem(item4, item4.getCount())); playerInventory.getItems().values().stream() - .filter(item5 -> item5.getItemType() == ItemType.ITEM_DISPLAY) - .filter(item5 -> !item5.isLocked() && !item5.isEquipped()) - .forEach(item5 -> playerInventory.removeItem(item5, item5.getCount())); + .filter(item5 -> item5.getItemType() == ItemType.ITEM_DISPLAY) + .filter(item5 -> !item5.isLocked() && !item5.isEquipped()) + .forEach(item5 -> playerInventory.removeItem(item5, item5.getCount())); playerInventory.getItems().values().stream() - .filter(item6 -> item6.getItemType() == ItemType.ITEM_VIRTUAL) - .filter(item6 -> !item6.isLocked() && !item6.isEquipped()) - .forEach(item6 -> playerInventory.removeItem(item6, item6.getCount())); + .filter(item6 -> item6.getItemType() == ItemType.ITEM_VIRTUAL) + .filter(item6 -> !item6.isLocked() && !item6.isEquipped()) + .forEach(item6 -> playerInventory.removeItem(item6, item6.getCount())); sender.dropMessage("Cleared everything for " + targetPlayer.getNickname() + " ."); - break; + } } } } catch (NumberFormatException ignored) { diff --git a/src/main/java/emu/grasscutter/command/commands/SetFetterLevelCommand.java b/src/main/java/emu/grasscutter/command/commands/SetFetterLevelCommand.java index 676a2b279..565a480dc 100644 --- a/src/main/java/emu/grasscutter/command/commands/SetFetterLevelCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/SetFetterLevelCommand.java @@ -43,7 +43,7 @@ public final class SetFetterLevelCommand implements CommandHandler { sender.sendPacket(new PacketAvatarFetterDataNotify(avatar)); CommandHandler.sendMessage(sender, "Fetter level set to " + fetterLevel); } catch (NumberFormatException ignored) { - CommandHandler.sendMessage(null, "Invalid fetter level."); + CommandHandler.sendMessage(sender, "Invalid fetter level."); } } From e681453a1577535b5c33f33d69c3fa926967e702 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 26 Apr 2022 00:39:43 -0400 Subject: [PATCH 13/20] Begin on plugin API --- .../java/emu/grasscutter/plugin/api/Item.java | 5 + .../grasscutter/plugin/api/PlayerHook.java | 113 ++++++++++++++++++ .../java/emu/grasscutter/plugin/api/README.md | 2 + 3 files changed, 120 insertions(+) create mode 100644 src/main/java/emu/grasscutter/plugin/api/Item.java create mode 100644 src/main/java/emu/grasscutter/plugin/api/PlayerHook.java create mode 100644 src/main/java/emu/grasscutter/plugin/api/README.md diff --git a/src/main/java/emu/grasscutter/plugin/api/Item.java b/src/main/java/emu/grasscutter/plugin/api/Item.java new file mode 100644 index 000000000..91b1a8a5c --- /dev/null +++ b/src/main/java/emu/grasscutter/plugin/api/Item.java @@ -0,0 +1,5 @@ +package emu.grasscutter.plugin.api; + +public enum Item { + /* TODO: Use handbook to generate an Item enum. */ +} diff --git a/src/main/java/emu/grasscutter/plugin/api/PlayerHook.java b/src/main/java/emu/grasscutter/plugin/api/PlayerHook.java new file mode 100644 index 000000000..f4a479acb --- /dev/null +++ b/src/main/java/emu/grasscutter/plugin/api/PlayerHook.java @@ -0,0 +1,113 @@ +package emu.grasscutter.plugin.api; + +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.game.avatar.GenshinAvatar; +import emu.grasscutter.game.entity.EntityAvatar; +import emu.grasscutter.game.props.EnterReason; +import emu.grasscutter.game.props.FightProperty; +import emu.grasscutter.net.packet.GenshinPacket; +import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType; +import emu.grasscutter.server.packet.send.PacketAvatarFightPropUpdateNotify; +import emu.grasscutter.server.packet.send.PacketAvatarLifeStateChangeNotify; +import emu.grasscutter.server.packet.send.PacketPlayerEnterSceneNotify; +import emu.grasscutter.utils.Position; + +/** + * Hooks into the {@link GenshinPlayer} class, adding convenient ways to do certain things. + */ +public final class PlayerHook { + private final GenshinPlayer player; + + /** + * Hooks into the player. + * @param player The player to hook into. + */ + public PlayerHook(GenshinPlayer player) { + this.player = player; + } + + /** + * Kicks a player from the server. + */ + public void kick() { + this.player.getSession().close(); + } + + /** + * Sends a player to another scene. + * @param sceneId The scene to send the player to. + */ + public void changeScenes(int sceneId) { + this.player.getWorld().transferPlayerToScene(this.player, sceneId, this.player.getPos()); + } + + /** + * Broadcasts an avatar property notify to all world players. + * @param property The property that was updated. + */ + public void updateFightProperty(FightProperty property) { + this.broadcastPacketToWorld(new PacketAvatarFightPropUpdateNotify(this.getCurrentAvatar(), property)); + } + + /** + * Broadcasts the packet sent to all world players. + * @param packet The packet to send. + */ + public void broadcastPacketToWorld(GenshinPacket packet) { + this.player.getWorld().broadcastPacket(packet); + } + + /** + * Set the currently equipped avatar's health. + * @param health The health to set the avatar to. + */ + public void setHealth(float health) { + this.getCurrentAvatarEntity().setFightProperty(FightProperty.FIGHT_PROP_CUR_HP, health); + this.updateFightProperty(FightProperty.FIGHT_PROP_CUR_HP); + } + + /** + * Revives the specified avatar. + * @param avatar The avatar to revive. + */ + public void reviveAvatar(GenshinAvatar avatar) { + this.broadcastPacketToWorld(new PacketAvatarLifeStateChangeNotify(avatar)); + } + + /** + * Teleports a player to a position. + * This will **not** transfer the player to another scene. + * @param position The position to teleport the player to. + */ + public void teleport(Position position) { + this.player.getPos().set(position); + this.player.sendPacket(new PacketPlayerEnterSceneNotify(this.player, + EnterType.EnterJump, EnterReason.TransPoint, + this.player.getSceneId(), position + )); + } + + /** + * Gets the currently selected avatar's max health. + * @return The max health as a float. + */ + public float getMaxHealth() { + return this.getCurrentAvatarEntity().getFightProperty(FightProperty.FIGHT_PROP_MAX_HP); + } + + /** + * Gets the currently selected avatar in entity form. + * @return The avatar as an {@link EntityAvatar}. + */ + public EntityAvatar getCurrentAvatarEntity() { + return this.player.getTeamManager().getCurrentAvatarEntity(); + } + + /** + * Gets the currently selected avatar. + * @return The avatar as an {@link GenshinAvatar}. + */ + public GenshinAvatar getCurrentAvatar() { + return this.getCurrentAvatarEntity().getAvatar(); + } +} \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/plugin/api/README.md b/src/main/java/emu/grasscutter/plugin/api/README.md new file mode 100644 index 000000000..73a5a75ee --- /dev/null +++ b/src/main/java/emu/grasscutter/plugin/api/README.md @@ -0,0 +1,2 @@ +# Grasscutter Plugin API +**Warning!** As of now, this is a work in progress and isn't completely documented. \ No newline at end of file From 502fe7ed13628dc718911bdb151a505266102bbf Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 26 Apr 2022 00:45:42 -0400 Subject: [PATCH 14/20] Reimplement the region list event --- .../java/emu/grasscutter/server/dispatch/DispatchServer.java | 5 ++++- 1 file changed, 4 insertions(+), 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 fe8e79abc..2cb3808fb 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -264,7 +264,10 @@ public final class DispatchServer { Grasscutter.getLogger() .info(String.format("[Dispatch] Client %s request: query_region_list", t.getRemoteAddress())); - responseHTML(t, regionListBase64); + // Invoke event. + QueryAllRegionsEvent event = new QueryAllRegionsEvent(regionListBase64); event.call(); + // Respond with event result. + responseHTML(t, event.getRegionList()); }); for (String regionName : regions.keySet()) { From e27bdd9bb6594a132da168ec165f8b731aab4b36 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 26 Apr 2022 02:07:00 -0400 Subject: [PATCH 15/20] Add more events --- .../java/emu/grasscutter/Grasscutter.java | 6 +-- .../grasscutter/game/gacha/GachaManager.java | 2 - .../grasscutter/plugin/api/ServerHook.java | 41 +++++++++++++++++++ .../grasscutter/server/event/ServerEvent.java | 4 ++ .../server/event/game/ServerTickEvent.java | 9 ++++ .../event/internal/ServerStartEvent.java | 19 +++++++++ .../event/internal/ServerStopEvent.java | 19 +++++++++ .../grasscutter/server/game/GameServer.java | 23 ++++------- 8 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 src/main/java/emu/grasscutter/plugin/api/ServerHook.java create mode 100644 src/main/java/emu/grasscutter/server/event/game/ServerTickEvent.java create mode 100644 src/main/java/emu/grasscutter/server/event/internal/ServerStartEvent.java create mode 100644 src/main/java/emu/grasscutter/server/event/internal/ServerStopEvent.java diff --git a/src/main/java/emu/grasscutter/Grasscutter.java b/src/main/java/emu/grasscutter/Grasscutter.java index 3db73eb1b..dcd6a3b6f 100644 --- a/src/main/java/emu/grasscutter/Grasscutter.java +++ b/src/main/java/emu/grasscutter/Grasscutter.java @@ -70,13 +70,13 @@ public final class Grasscutter { // Database DatabaseManager.initialize(); + // Create plugin manager instance. + pluginManager = new PluginManager(); + // Create server instances. dispatchServer = new DispatchServer(); gameServer = new GameServer(new InetSocketAddress(getConfig().getGameServerOptions().Ip, getConfig().getGameServerOptions().Port)); - // Create plugin manager instance. - pluginManager = new PluginManager(); - // Start servers. if(getConfig().RunMode.equalsIgnoreCase("HYBRID")) { dispatchServer.start(); diff --git a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java index 079f0dda3..ffb68a1d7 100644 --- a/src/main/java/emu/grasscutter/game/gacha/GachaManager.java +++ b/src/main/java/emu/grasscutter/game/gacha/GachaManager.java @@ -286,8 +286,6 @@ public class GachaManager { this.watchService = FileSystems.getDefault().newWatchService(); Path path = new File(Grasscutter.getConfig().DATA_FOLDER).toPath(); path.register(watchService, new WatchEvent.Kind[]{StandardWatchEventKinds.ENTRY_MODIFY}, SensitivityWatchEventModifier.HIGH); - - 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(); diff --git a/src/main/java/emu/grasscutter/plugin/api/ServerHook.java b/src/main/java/emu/grasscutter/plugin/api/ServerHook.java new file mode 100644 index 000000000..34ceb25f4 --- /dev/null +++ b/src/main/java/emu/grasscutter/plugin/api/ServerHook.java @@ -0,0 +1,41 @@ +package emu.grasscutter.plugin.api; + +import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.server.game.GameServer; + +import java.util.LinkedList; +import java.util.List; + +/** + * Hooks into the {@link GameServer} class, adding convenient ways to do certain things. + */ +public final class ServerHook { + private static ServerHook instance; + private final GameServer server; + + /** + * Gets the server hook instance. + * @return A {@link ServerHook} singleton. + */ + public static ServerHook getInstance() { + return instance; + } + + /** + * Hooks into a server. + * @param server The server to hook into. + */ + public ServerHook(GameServer server) { + this.server = server; + + instance = this; + } + + /** + * Gets all online players. + * @return Players connected to the server. + */ + public List getOnlinePlayers() { + return new LinkedList<>(this.server.getPlayers().values()); + } +} \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/server/event/ServerEvent.java b/src/main/java/emu/grasscutter/server/event/ServerEvent.java index e87abae0d..5e73afdec 100644 --- a/src/main/java/emu/grasscutter/server/event/ServerEvent.java +++ b/src/main/java/emu/grasscutter/server/event/ServerEvent.java @@ -10,6 +10,10 @@ public abstract class ServerEvent extends Event { this.type = type; } + public Type getServerType() { + return this.type; + } + public enum Type { DISPATCH, GAME diff --git a/src/main/java/emu/grasscutter/server/event/game/ServerTickEvent.java b/src/main/java/emu/grasscutter/server/event/game/ServerTickEvent.java new file mode 100644 index 000000000..8ca7c8379 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/event/game/ServerTickEvent.java @@ -0,0 +1,9 @@ +package emu.grasscutter.server.event.game; + +import emu.grasscutter.server.event.ServerEvent; + +public final class ServerTickEvent extends ServerEvent { + public ServerTickEvent() { + super(Type.GAME); + } +} diff --git a/src/main/java/emu/grasscutter/server/event/internal/ServerStartEvent.java b/src/main/java/emu/grasscutter/server/event/internal/ServerStartEvent.java new file mode 100644 index 000000000..fd950a002 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/event/internal/ServerStartEvent.java @@ -0,0 +1,19 @@ +package emu.grasscutter.server.event.internal; + +import emu.grasscutter.server.event.ServerEvent; + +import java.time.OffsetDateTime; + +public final class ServerStartEvent extends ServerEvent { + private final OffsetDateTime startTime; + + public ServerStartEvent(Type type, OffsetDateTime startTime) { + super(type); + + this.startTime = startTime; + } + + public OffsetDateTime getStartTime() { + return this.startTime; + } +} diff --git a/src/main/java/emu/grasscutter/server/event/internal/ServerStopEvent.java b/src/main/java/emu/grasscutter/server/event/internal/ServerStopEvent.java new file mode 100644 index 000000000..5d105e3b3 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/event/internal/ServerStopEvent.java @@ -0,0 +1,19 @@ +package emu.grasscutter.server.event.internal; + +import emu.grasscutter.server.event.ServerEvent; + +import java.time.OffsetDateTime; + +public final class ServerStopEvent extends ServerEvent { + private final OffsetDateTime stopTime; + + public ServerStopEvent(Type type, OffsetDateTime stopTime) { + super(type); + + this.stopTime = stopTime; + } + + public OffsetDateTime getStopTime() { + return this.stopTime; + } +} diff --git a/src/main/java/emu/grasscutter/server/game/GameServer.java b/src/main/java/emu/grasscutter/server/game/GameServer.java index 065344ee2..a1986d1a2 100644 --- a/src/main/java/emu/grasscutter/server/game/GameServer.java +++ b/src/main/java/emu/grasscutter/server/game/GameServer.java @@ -1,6 +1,7 @@ package emu.grasscutter.server.game; import java.net.InetSocketAddress; +import java.time.OffsetDateTime; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -19,7 +20,10 @@ 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 org.greenrobot.eventbus.EventBus; +import emu.grasscutter.server.event.ServerEvent; +import emu.grasscutter.server.event.game.ServerTickEvent; +import emu.grasscutter.server.event.internal.ServerStartEvent; +import emu.grasscutter.server.event.internal.ServerStopEvent; public final class GameServer extends MihoyoKcpServer { private final InetSocketAddress address; @@ -34,18 +38,10 @@ public final class GameServer extends MihoyoKcpServer { private final MultiplayerManager multiplayerManager; private final DungeonManager dungeonManager; private final CommandMap commandMap; - - public EventBus OnGameServerStartFinish; - public EventBus OnGameServerTick; - public EventBus OnGameServerStop; public GameServer(InetSocketAddress address) { super(address); - 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; this.packetHandler = new GameServerPacketHandler(PacketHandler.class); @@ -160,23 +156,22 @@ public final class GameServer extends MihoyoKcpServer { return DatabaseHelper.getAccountByName(username); } - public void onTick() throws Exception { + public void onTick() { for (GenshinPlayer player : this.getPlayers().values()) { player.onTick(); } - OnGameServerTick.post(new GameServerTickEvent()); + ServerTickEvent event = new ServerTickEvent(); event.call(); } @Override public void onStartFinish() { Grasscutter.getLogger().info("Game Server started on port " + address.getPort()); - - OnGameServerStartFinish.post(new GameServerStartFinishEvent()); + ServerStartEvent event = new ServerStartEvent(ServerEvent.Type.GAME, OffsetDateTime.now()); event.call(); } public void onServerShutdown() { - OnGameServerStop.post(new GameServerStopEvent()); + ServerStopEvent event = new ServerStopEvent(ServerEvent.Type.GAME, OffsetDateTime.now()); event.call(); // Kick and save all players List list = new ArrayList<>(this.getPlayers().size()); From 3c5f3d415706f2473ade5f84ca36576d5b2e4e21 Mon Sep 17 00:00:00 2001 From: BaiSugar Date: Tue, 26 Apr 2022 16:35:06 +0800 Subject: [PATCH 16/20] remove test avatar --- .../command/commands/GiveAllCommand.java | 157 +++++++++++++----- 1 file changed, 119 insertions(+), 38 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java index b994fe419..47ac08405 100644 --- a/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/GiveAllCommand.java @@ -14,20 +14,22 @@ import emu.grasscutter.game.inventory.ItemType; import java.util.*; @Command(label = "giveall", usage = "giveall [player] ", - description = "Gives all items", aliases = {"givea"}, permission = "player.giveall",threading = true) + description = "Gives all items", aliases = {"givea"}, permission = "player.giveall", threading = true) public class GiveAllCommand implements CommandHandler { + @Override public void execute(GenshinPlayer sender, List args) { - int target,amount=99999; + int target, amount = 99999; - if(sender == null){ - CommandHandler.sendMessage(null, "Run this command in-game"); - return; - } switch (args.size()) { - default: // *no args* + case 0: // *no args* + if (sender == null) { + CommandHandler.sendMessage(null, "This usage can only be run in-game"); + return; + } target = sender.getUid(); break; + case 1: // [player] try { target = Integer.parseInt(args.get(0)); @@ -40,6 +42,7 @@ public class GiveAllCommand implements CommandHandler { return; } break; + case 2: // [player] [amount] try { target = Integer.parseInt(args.get(0)); @@ -49,11 +52,15 @@ public class GiveAllCommand implements CommandHandler { } else { amount = Integer.parseInt(args.get(1)); } - } catch (NumberFormatException ignored) { + } catch (NumberFormatException ignored) { CommandHandler.sendMessage(sender, "Invalid amount or player ID."); return; } break; + + default: // invalid + CommandHandler.sendMessage(null, "Usage: giveall [player] "); + return; } GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); @@ -62,47 +69,121 @@ public class GiveAllCommand implements CommandHandler { return; } - this.GetAllItem(targetPlayer,amount); - CommandHandler.sendMessage(sender, "Done! or Getting all items done"); + this.giveAllItems(targetPlayer, amount); + CommandHandler.sendMessage(sender, "Giving all items done"); } - public void GetAllItem(GenshinPlayer player, int amount){ - CommandHandler.sendMessage(player, "Getting all item...."); + public void giveAllItems(GenshinPlayer player, int amount) { + CommandHandler.sendMessage(player, "Giving all items..."); - Collection genshinItemList =new LinkedList<>(); - for (ItemData itemdata: GenshinData.getItemDataMap().values()) { - if(itemdata.getId() > 1000 && itemdata.getId() <= 1099)continue;//is avatar - if (itemdata.isEquip()) { - for (int i = 0; i < 20; i++) { - GenshinItem genshinItem = new GenshinItem(itemdata); - if(itemdata.getItemType() == ItemType.ITEM_WEAPON){ - genshinItem.setLevel(90); - genshinItem.setPromoteLevel(6); - } - genshinItemList.add(genshinItem); - } - } else { - GenshinItem genshinItem = new GenshinItem(itemdata); - genshinItem.setCount(amount); - genshinItemList.add(genshinItem); - } - } - player.getInventory().addItems(genshinItemList); + for (AvatarData avatarData: GenshinData.getAvatarDataMap().values()) { + //Exclude test avatar + if (isTestAvatar(avatarData.getId())) continue; - for(AvatarData avatarData:GenshinData.getAvatarDataMap().values()) { - if(avatarData.getId() == 10000001 || avatarData.getId() >= 10000099)continue; - // Calculate ascension level. - int ascension = (int) Math.ceil(90 / 10f) - 3; GenshinAvatar avatar = new GenshinAvatar(avatarData); avatar.setLevel(90); - avatar.setPromoteLevel(ascension); - for (int i = 1;i<=6;i++){ - avatar.getTalentIdList().add((avatar.getAvatarId()-10000000)*10+i);//(10000058-10000000)*10+i + avatar.setPromoteLevel(6); + for (int i = 1; i <= 6; ++i) { + avatar.getTalentIdList().add((avatar.getAvatarId() - 10000000) * 10 + i); } // This will handle stats and talents avatar.recalcStats(); player.addAvatar(avatar); } + + //some test items + List genshinItemList = new ArrayList<>(); + for (ItemData itemdata: GenshinData.getItemDataMap().values()) { + //Exclude test item + if (isTestItem(itemdata.getId())) continue; + + if (itemdata.isEquip()) { + for (int i = 0; i < 10; ++i) { + GenshinItem genshinItem = new GenshinItem(itemdata); + if (itemdata.getItemType() == ItemType.ITEM_WEAPON) { + genshinItem.setLevel(90); + genshinItem.setPromoteLevel(6); + genshinItem.setRefinement(4); + } + genshinItemList.add(genshinItem); + } + } + else { + GenshinItem genshinItem = new GenshinItem(itemdata); + genshinItem.setCount(amount); + genshinItemList.add(genshinItem); + } + } + int packetNum = 20; + int itemLength = genshinItemList.size(); + int number = itemLength / packetNum; + int remainder = itemLength % packetNum; + int offset = 0; + for (int i = 0; i < packetNum; ++i) { + if (remainder > 0) { + player.getInventory().addItems(genshinItemList.subList(i * number + offset, (i + 1) * number + offset + 1)); + --remainder; + ++offset; + } + else { + player.getInventory().addItems(genshinItemList.subList(i * number + offset, (i + 1) * number + offset)); + } + } } + public boolean isTestAvatar(int avatarId) { + return avatarId < 10000002 || avatarId >= 11000000; + } + + public boolean isTestItem(int itemId) { + for (Range range: testItemRanges) { + if (range.check(itemId)) { + return true; + } + } + + if (testItemsList.contains(itemId)) { + return true; + } + + return false; + } + + static class Range { + private int min; + private int max; + + public Range(int min, int max) { + if(min > max){ + min ^= max; + max ^= min; + min ^= max; + } + this.min = min; + this.max = max; + } + + public boolean check(int value) { + return value >= this.min && value <= this.max; + } + } + + private static final Range[] testItemRanges = new Range[] { + new Range(106, 139), + new Range(1000, 1099), + new Range(2001, 2008), + new Range(2017, 2029), + // new Range(108001, 108387) //food + }; + + private static final Integer[] testItemsIds = new Integer[] { + 210, 211, 314, 315, 317, 1005, 1007, 1105, 1107, 1201, 1202, 2800, + 100001, 100002, 100244, 100305, 100312, 100313, 101212, 11411, 11506, 11507, 11508, 12505, + 12506, 12508, 12509, 13503, 13506, 14411, 14503, 14505, 14508, 15411, 15504, 15505, + 15506, 15508, 20001, 10002, 10003, 10004, 10005, 10006, 10008 //9 + }; + + private static final Collection testItemsList = Arrays.asList(testItemsIds); + } + From 9fb5b69ddd53044ec57481b5ea8c3dfc9df5baf6 Mon Sep 17 00:00:00 2001 From: muhammadeko Date: Tue, 26 Apr 2022 19:45:23 +0700 Subject: [PATCH 17/20] load all classes from plugin --- .../java/emu/grasscutter/plugin/PluginManager.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/plugin/PluginManager.java b/src/main/java/emu/grasscutter/plugin/PluginManager.java index 7b54f460f..2c6b9f23d 100644 --- a/src/main/java/emu/grasscutter/plugin/PluginManager.java +++ b/src/main/java/emu/grasscutter/plugin/PluginManager.java @@ -13,6 +13,8 @@ import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.*; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; /** * Manages the server's plugins & the event system. @@ -52,13 +54,22 @@ public final class PluginManager { try (URLClassLoader loader = new URLClassLoader(new URL[]{url})) { URL configFile = loader.findResource("plugin.json"); InputStreamReader fileReader = new InputStreamReader(configFile.openStream()); - + PluginConfig pluginConfig = Grasscutter.getGsonFactory().fromJson(fileReader, PluginConfig.class); if(!pluginConfig.validate()) { Utils.logObject(pluginConfig); Grasscutter.getLogger().warn("Plugin " + plugin.getName() + " has an invalid config file."); return; } + + JarFile jarFile = new JarFile(plugin); + Enumeration entries = jarFile.entries(); + while(entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + if(entry.isDirectory() || !entry.getName().endsWith(".class")) continue; + String className = entry.getName().replace(".class", "").replace("/", "."); + Class clazz = loader.loadClass(className); + } Class pluginClass = loader.loadClass(pluginConfig.mainClass); Plugin pluginInstance = (Plugin) pluginClass.getDeclaredConstructor().newInstance(); From c9299d8444559456eb0cb40ddde461770d42803a Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 26 Apr 2022 11:13:25 -0400 Subject: [PATCH 18/20] Publish to Maven central --- build.gradle | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/build.gradle b/build.gradle index bf839316a..fccaa9b68 100644 --- a/build.gradle +++ b/build.gradle @@ -12,11 +12,22 @@ plugins { // Apply the application plugin to add support for building a CLI application id 'application' + + id 'maven-publish' + id 'signing' } +group = 'tech.xigam' +version = '1.0.0-dev' + sourceCompatibility = 17 targetCompatibility = 17 +java { + withJavadocJar() + withSourcesJar() +} + repositories { mavenCentral() } @@ -64,3 +75,68 @@ jar { destinationDir = file(".") } +publishing { + publications { + mavenJava(MavenPublication) { + artifactId = 'grasscutter' + from components.java + versionMapping { + usage('java-api') { + fromResolutionOf('runtimeClasspath') + } + usage('java-runtime') { + fromResolutionResult() + } + } + pom { + name = 'Grasscutter' + description = 'A server software reimplementation for an anime game.' + url = 'https://github.com/Grasscutters/Grasscutter' + licenses { + license { + name = 'The Apache License, Version 2.0' + url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + developers { + developer { + id = 'melledy' + name = 'Melledy' + email = 'melledy@xigam.tech' // not a real email kek + } + developer { + id = 'magix' + name = 'Magix' + email = 'magix@xigam.tech' + } + } + scm { + connection = 'scm:git:git@github.com:Grasscutters/Grasscutter.git' + developerConnection = 'scm:git:ssh://github.com:Grasscutters/Grasscutter.git' + url = 'https://github.com/Grasscutters/Grasscutter' + } + } + } + } + repositories { + maven { + // change URLs to point to your repos, e.g. http://my.org/repo + def releasesRepoUrl = 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/' + def snapshotsRepoUrl = 'https://s01.oss.sonatype.org/content/repositories/snapshots/' + url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl + + name = 'sonatype' + credentials(PasswordCredentials) + } + } +} + +signing { + sign publishing.publications.mavenJava +} + +javadoc { + if(JavaVersion.current().isJava9Compatible()) { + options.addBooleanOption('html5', true) + } +} \ No newline at end of file From 444270fd9c7a6c56c02a54f89834e3dc9cbc115a Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 26 Apr 2022 11:14:39 -0400 Subject: [PATCH 19/20] Ignore `gradle.properties` --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 8422b6e18..ebb48dcaa 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,9 @@ hs_err_pid* build/ out/ +# Ignore Gradle properties +gradle.properties + # Eclipse .project .classpath From addfb5eb5d350434db1de9433b92dc0e84645dd1 Mon Sep 17 00:00:00 2001 From: WetABQ Date: Wed, 27 Apr 2022 05:44:30 +0800 Subject: [PATCH 20/20] [BREAKING CHANGE] proto auto compiled by gradle (#226) * [BREAK] proto auto compiled by gradle * [BREAK] move proto to submodule * update gitmodules * [BREAK] move proto to submodule * move proto to submodule * fix merge conflict * fix github action after merging * fix merge conflicts and del submodule * upload the proto --- .gitignore | 7 ++- .gitmodules | 3 - Grasscutter-Protos | 1 - build.gradle | 58 ++++++++++++++++++- .../emu/grasscutter/data/ResourceLoader.java | 16 ++--- .../emu/grasscutter/data/def/CombineData.java | 10 ++++ .../emu/grasscutter/game/GenshinPlayer.java | 21 ++++--- .../emu/grasscutter/game/GenshinScene.java | 18 +++--- .../emu/grasscutter/game/InvokeHandler.java | 17 ++---- .../emu/grasscutter/game/TeamManager.java | 4 +- src/main/java/emu/grasscutter/game/World.java | 16 ++--- .../game/avatar/GenshinAvatar.java | 2 +- .../grasscutter/game/entity/EntityAvatar.java | 8 +-- .../game/entity/EntityClientGadget.java | 5 +- .../grasscutter/game/entity/EntityItem.java | 4 +- .../game/entity/EntityMonster.java | 8 +-- .../game/entity/GenshinEntity.java | 2 +- .../grasscutter/game/friends/FriendsList.java | 2 +- .../grasscutter/game/friends/Friendship.java | 9 +-- .../game/managers/MultiplayerManager.java | 15 ++--- .../grasscutter/net/packet/PacketOpcodes.java | 3 +- .../emu/grasscutter/net/packet/Retcode.java | 6 -- .../emu/grasscutter/plugin/PluginManager.java | 2 +- .../grasscutter/plugin/api/PlayerHook.java | 2 +- .../server/dispatch/DispatchServer.java | 10 ++-- .../server/game/GameServerPacketHandler.java | 2 +- .../grasscutter/server/game/GameSession.java | 25 ++++++-- .../server/packet/recv/HandleSitReq.java | 24 -------- .../recv/HandlerCombatInvocationsNotify.java | 4 +- .../server/packet/recv/HandlerCombineReq.java | 20 +++++++ .../server/packet/recv/HandlerMarkMapReq.java | 2 +- .../HandlerPlayerGetForceQuitBanInfoReq.java | 5 +- .../recv/HandlerSceneEntityDrownReq.java | 0 .../send/PacketAvatarChangeCostumeNotify.java | 2 +- .../send/PacketAvatarChangeCostumeRsp.java | 3 +- .../send/PacketAvatarWearFlycloakRsp.java | 3 +- ...PacketCalcWeaponUpgradeReturnItemsRsp.java | 4 +- .../packet/send/PacketChangeAvatarRsp.java | 5 +- .../server/packet/send/PacketCombineRsp.java | 58 +++++++++++++++++++ .../server/packet/send/PacketDoGachaRsp.java | 3 +- .../packet/send/PacketGadgetInteractRsp.java | 3 +- .../packet/send/PacketGetAuthkeyRsp.java | 3 +- .../send/PacketGetPlayerFriendListRsp.java | 7 ++- .../send/PacketGetPlayerSocialDetailRsp.java | 3 +- .../packet/send/PacketGetPlayerTokenRsp.java | 14 ++--- .../PacketPlayerApplyEnterMpResultNotify.java | 4 +- .../packet/send/PacketPlayerChatNotify.java | 2 +- .../packet/send/PacketPlayerDataNotify.java | 2 +- .../PacketPlayerEnterSceneInfoNotify.java | 3 +- .../send/PacketPlayerEnterSceneNotify.java | 10 ++-- .../packet/send/PacketPlayerLoginRsp.java | 6 +- .../packet/send/PacketPlayerStoreNotify.java | 2 +- .../send/PacketSceneEntityAppearNotify.java | 2 +- .../send/PacketSceneEntityDrownRsp.java | 0 .../packet/send/PacketSceneKickPlayerRsp.java | 3 +- .../send/PacketSceneTeamUpdateNotify.java | 2 +- .../send/PacketSceneTransToPointRsp.java | 3 +- .../send/PacketSetPlayerBirthdayRsp.java | 1 + .../send/PacketSetPlayerHeadImageRsp.java | 2 +- .../server/packet/send/PacketSitRsp.java | 21 ------- .../send/PacketStoreItemChangeNotify.java | 6 +- .../packet/send/PacketStoreItemDelNotify.java | 4 +- .../send/PacketStoreWeightLimitNotify.java | 2 +- .../server/packet/send/PacketUseItemRsp.java | 3 +- .../send/PacketWorldPlayerLocationNotify.java | 2 +- .../java/emu/grasscutter/utils/Crypto.java | 2 +- 66 files changed, 316 insertions(+), 205 deletions(-) delete mode 100644 .gitmodules delete mode 160000 Grasscutter-Protos create mode 100644 src/main/java/emu/grasscutter/data/def/CombineData.java delete mode 100644 src/main/java/emu/grasscutter/net/packet/Retcode.java delete mode 100644 src/main/java/emu/grasscutter/server/packet/recv/HandleSitReq.java create mode 100644 src/main/java/emu/grasscutter/server/packet/recv/HandlerCombineReq.java create mode 100644 src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneEntityDrownReq.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketCombineRsp.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketSceneEntityDrownRsp.java delete mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketSitRsp.java diff --git a/.gitignore b/.gitignore index ebb48dcaa..77647f08c 100644 --- a/.gitignore +++ b/.gitignore @@ -56,9 +56,10 @@ resources/* logs/* data/AbilityEmbryos.json data/OpenConfig.json -proto/* GM Handbook.txt config.json mitmdump.exe -grasscutter.jar -mongod.exe \ No newline at end of file +*.jar +mongod.exe +/src/generated/ +/*.sh \ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index fbab9b375..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "Grasscutter-Protos"] - path = Grasscutter-Protos - url = https://github.com/Melledy/Grasscutter-Protos diff --git a/Grasscutter-Protos b/Grasscutter-Protos deleted file mode 160000 index 0537e9cc4..000000000 --- a/Grasscutter-Protos +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0537e9cc4c7856a7c6f88bbbaa908a80c4ee677e diff --git a/build.gradle b/build.gradle index 1be86626c..d9f616ca9 100644 --- a/build.gradle +++ b/build.gradle @@ -6,10 +6,23 @@ * User Manual available at https://docs.gradle.org/5.6.3/userguide/tutorial_java_projects.html */ +buildscript { + repositories { + maven { url "https://plugins.gradle.org/m2/" } + } + dependencies { + classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' + } +} + plugins { // Apply the java plugin to add support for Java id 'java' + // Apply the protobuf auto generator + id 'com.google.protobuf' version "0.8.18" + id 'idea' + // Apply the application plugin to add support for building a CLI application id 'application' @@ -17,6 +30,10 @@ plugins { id 'signing' } + +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 + group = 'tech.xigam' version = '1.0.0-dev' @@ -34,7 +51,7 @@ repositories { dependencies { implementation fileTree(dir: 'lib', include: ['*.jar']) - + implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.32' implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.2.9' implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.9' @@ -49,6 +66,9 @@ dependencies { implementation group: 'org.greenrobot', name: 'eventbus-java', version: '3.3.1' implementation group: 'org.danilopianini', name: 'java-quadtree', version: '0.1.9' + + protobuf files('proto/') + } application { @@ -125,13 +145,47 @@ publishing { def releasesRepoUrl = 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/' def snapshotsRepoUrl = 'https://s01.oss.sonatype.org/content/repositories/snapshots/' url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl - + name = 'sonatype' credentials(PasswordCredentials) } } } +clean { + delete protobuf.generatedFilesBaseDir +} + +protobuf { + protoc { + // The artifact spec for the Protobuf Compiler + artifact = 'com.google.protobuf:protoc:3.18.1' + } +// generatedFilesBaseDir = "$projectDir/src/main/java/emu/grasscutter/net/proto/" + generatedFilesBaseDir = "$projectDir/src/generated/" +} + +sourceSets { + main { + proto { + // In addition to the default 'src/main/proto' + srcDir 'src/generated' + } + java { + srcDir 'src/java' + } + } +} + +idea { + module { + // proto files and generated Java files are automatically added as + // source dirs. + // If you have additional sources, add them here: + sourceDirs += file("/proto/"); + } +} + signing { sign publishing.publications.mavenJava } diff --git a/src/main/java/emu/grasscutter/data/ResourceLoader.java b/src/main/java/emu/grasscutter/data/ResourceLoader.java index da9facfd3..57d0ea824 100644 --- a/src/main/java/emu/grasscutter/data/ResourceLoader.java +++ b/src/main/java/emu/grasscutter/data/ResourceLoader.java @@ -140,7 +140,7 @@ public class ResourceLoader { } List scenePointList = new ArrayList<>(); - for (File file : folder.listFiles()) { + for (File file : Objects.requireNonNull(folder.listFiles())) { ScenePointConfig config = null; Integer sceneId = null; @@ -190,7 +190,7 @@ public class ResourceLoader { } else { // Load from BinOutput Pattern pattern = Pattern.compile("(?<=ConfigAvatar_)(.*?)(?=.json)"); - + embryoList = new LinkedList<>(); File folder = new File(Utils.toFilePath(Grasscutter.getConfig().RESOURCE_FOLDER + "BinOutput/Avatar/")); File[] files = folder.listFiles(); @@ -198,29 +198,29 @@ public class ResourceLoader { Grasscutter.getLogger().error("Error loading ability embryos: no files found in " + folder.getAbsolutePath()); return; } - + for (File file : files) { AvatarConfig config; String avatarName; - + Matcher matcher = pattern.matcher(file.getName()); if (matcher.find()) { avatarName = matcher.group(0); } else { continue; } - + try (FileReader fileReader = new FileReader(file)) { config = Grasscutter.getGsonFactory().fromJson(fileReader, AvatarConfig.class); } catch (Exception e) { e.printStackTrace(); continue; } - + if (config.abilities == null) { continue; } - + int s = config.abilities.size(); AbilityEmbryoEntry al = new AbilityEmbryoEntry(avatarName, config.abilities.stream().map(Object::toString).toArray(size -> new String[s])); embryoList.add(al); @@ -331,7 +331,7 @@ public class ResourceLoader { GenshinData.getOpenConfigEntries().put(entry.getName(), entry); } } - + // BinOutput configs private static class AvatarConfig { diff --git a/src/main/java/emu/grasscutter/data/def/CombineData.java b/src/main/java/emu/grasscutter/data/def/CombineData.java new file mode 100644 index 000000000..c4c19794f --- /dev/null +++ b/src/main/java/emu/grasscutter/data/def/CombineData.java @@ -0,0 +1,10 @@ +package emu.grasscutter.data.def; + +import emu.grasscutter.data.ResourceType; + +@ResourceType(name = "CombineExcelConfigData.json") +public class CombineData { + + + +} diff --git a/src/main/java/emu/grasscutter/game/GenshinPlayer.java b/src/main/java/emu/grasscutter/game/GenshinPlayer.java index 95edb99b6..eac10a0cc 100644 --- a/src/main/java/emu/grasscutter/game/GenshinPlayer.java +++ b/src/main/java/emu/grasscutter/game/GenshinPlayer.java @@ -27,9 +27,10 @@ import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType; import emu.grasscutter.net.proto.MpSettingTypeOuterClass.MpSettingType; import emu.grasscutter.net.proto.OnlinePlayerInfoOuterClass.OnlinePlayerInfo; import emu.grasscutter.net.proto.PlayerApplyEnterMpReasonOuterClass.PlayerApplyEnterMpReason; +import emu.grasscutter.net.proto.PlayerApplyEnterMpResultNotifyOuterClass; import emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo; +import emu.grasscutter.net.proto.PlayerWorldLocationInfoOuterClass; 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.*; @@ -70,7 +71,7 @@ public class GenshinPlayer { private TeamManager teamManager; private PlayerGachaInfo gachaInfo; private PlayerProfile playerProfile; - private MpSettingType mpSetting = MpSettingType.MpSettingEnterAfterApply; + private MpSettingType mpSetting = MpSettingType.MP_SETTING_ENTER_AFTER_APPLY; private boolean showAvatar; private ArrayList shownAvatars; private Set rewardedLevels; @@ -587,7 +588,7 @@ public class GenshinPlayer { // Add to inventory boolean success = getInventory().addItem(item); if (success) { - this.sendPacket(new PacketGadgetInteractRsp(drop, InteractType.InteractPickItem)); + this.sendPacket(new PacketGadgetInteractRsp(drop, InteractType.INTERACT_PICK_ITEM)); this.sendPacket(new PacketItemAddHintNotify(item, ActionReason.SubfieldDrop)); } } @@ -617,7 +618,7 @@ public class GenshinPlayer { .setMpSettingType(this.getMpSetting()) .setNameCardId(this.getNameCardId()) .setSignature(this.getSignature()) - .setAvatar(HeadImage.newBuilder().setAvatarId(this.getHeadImage())); + .setAvatarId(HeadImage.newBuilder().setAvatarId(this.getHeadImage()).getAvatarId()); if (this.getWorld() != null) { onlineInfo.setCurPlayerNumInWorld(this.getWorld().getPlayers().indexOf(this) + 1); @@ -652,21 +653,19 @@ public class GenshinPlayer { public SocialDetail.Builder getSocialDetail() { SocialDetail.Builder social = SocialDetail.newBuilder() .setUid(this.getUid()) - .setAvatar(HeadImage.newBuilder().setAvatarId(this.getHeadImage())) + .setAvatarId(HeadImage.newBuilder().setAvatarId(this.getHeadImage()).getAvatarId()) .setNickname(this.getNickname()) .setSignature(this.getSignature()) .setLevel(this.getLevel()) .setBirthday(this.getBirthday().getFilledProtoWhenNotEmpty()) .setWorldLevel(this.getWorldLevel()) - .setUnk1(1) - .setUnk3(1) .setNameCardId(this.getNameCardId()) .setFinishAchievementNum(0); return social; } - - public WorldPlayerLocationInfo getWorldPlayerLocationInfo() { - return WorldPlayerLocationInfo.newBuilder() + + public PlayerWorldLocationInfoOuterClass.PlayerWorldLocationInfo getWorldPlayerLocationInfo() { + return PlayerWorldLocationInfoOuterClass.PlayerWorldLocationInfo.newBuilder() .setSceneId(this.getSceneId()) .setPlayerLoc(this.getPlayerLocationInfo()) .build(); @@ -691,7 +690,7 @@ public class GenshinPlayer { while (it.hasNext()) { CoopRequest req = it.next(); if (req.isExpired()) { - req.getRequester().sendPacket(new PacketPlayerApplyEnterMpResultNotify(this, false, PlayerApplyEnterMpReason.SystemJudge)); + req.getRequester().sendPacket(new PacketPlayerApplyEnterMpResultNotify(this, false, PlayerApplyEnterMpResultNotifyOuterClass.PlayerApplyEnterMpResultNotify.Reason.SYSTEM_JUDGE)); it.remove(); } } diff --git a/src/main/java/emu/grasscutter/game/GenshinScene.java b/src/main/java/emu/grasscutter/game/GenshinScene.java index 431134b5f..6f8591348 100644 --- a/src/main/java/emu/grasscutter/game/GenshinScene.java +++ b/src/main/java/emu/grasscutter/game/GenshinScene.java @@ -202,7 +202,7 @@ public class GenshinScene { private void removePlayerAvatars(GenshinPlayer player) { Iterator it = player.getTeamManager().getActiveTeam().iterator(); while (it.hasNext()) { - this.removeEntity(it.next(), VisionType.VisionRemove); + this.removeEntity(it.next(), VisionType.VISION_REMOVE); it.remove(); } } @@ -233,7 +233,7 @@ public class GenshinScene { this.addEntityDirectly(entity); } - this.broadcastPacket(new PacketSceneEntityAppearNotify(entities, VisionType.VisionBorn)); + this.broadcastPacket(new PacketSceneEntityAppearNotify(entities, VisionType.VISION_BORN)); } private GenshinEntity removeEntityDirectly(GenshinEntity entity) { @@ -241,7 +241,7 @@ public class GenshinScene { } public void removeEntity(GenshinEntity entity) { - this.removeEntity(entity, VisionType.VisionDie); + this.removeEntity(entity, VisionType.VISION_DIE); } public synchronized void removeEntity(GenshinEntity entity, VisionType visionType) { @@ -254,8 +254,8 @@ public class GenshinScene { public synchronized void replaceEntity(EntityAvatar oldEntity, EntityAvatar newEntity) { this.removeEntityDirectly(oldEntity); this.addEntityDirectly(newEntity); - this.broadcastPacket(new PacketSceneEntityDisappearNotify(oldEntity, VisionType.VisionReplace)); - this.broadcastPacket(new PacketSceneEntityAppearNotify(newEntity, VisionType.VisionReplace, oldEntity.getId())); + this.broadcastPacket(new PacketSceneEntityDisappearNotify(oldEntity, VisionType.VISION_REPLACE)); + this.broadcastPacket(new PacketSceneEntityAppearNotify(newEntity, VisionType.VISION_REPLACE, oldEntity.getId())); } public void showOtherEntities(GenshinPlayer player) { @@ -269,7 +269,7 @@ public class GenshinScene { entities.add(entity); } - player.sendPacket(new PacketSceneEntityAppearNotify(entities, VisionType.VisionMeet)); + player.sendPacket(new PacketSceneEntityAppearNotify(entities, VisionType.VISION_MEET)); } public void handleAttack(AttackResult result) { @@ -381,11 +381,11 @@ public class GenshinScene { if (toAdd.size() > 0) { toAdd.stream().forEach(this::addEntityDirectly); - this.broadcastPacket(new PacketSceneEntityAppearNotify(toAdd, VisionType.VisionBorn)); + this.broadcastPacket(new PacketSceneEntityAppearNotify(toAdd, VisionType.VISION_BORN)); } if (toRemove.size() > 0) { toRemove.stream().forEach(this::removeEntityDirectly); - this.broadcastPacket(new PacketSceneEntityDisappearNotify(toRemove, VisionType.VisionRemove)); + this.broadcastPacket(new PacketSceneEntityDisappearNotify(toRemove, VisionType.VISION_REMOVE)); } } @@ -425,7 +425,7 @@ public class GenshinScene { return; } - this.broadcastPacketToOthers(gadget.getOwner(), new PacketSceneEntityDisappearNotify(gadget, VisionType.VisionDie)); + this.broadcastPacketToOthers(gadget.getOwner(), new PacketSceneEntityDisappearNotify(gadget, VisionType.VISION_DIE)); } // Broadcasting diff --git a/src/main/java/emu/grasscutter/game/InvokeHandler.java b/src/main/java/emu/grasscutter/game/InvokeHandler.java index 727f93509..b8272d30b 100644 --- a/src/main/java/emu/grasscutter/game/InvokeHandler.java +++ b/src/main/java/emu/grasscutter/game/InvokeHandler.java @@ -20,18 +20,11 @@ public class InvokeHandler { public synchronized void addEntry(ForwardType forward, T entry) { switch (forward) { - case ForwardToAll: - entryListForwardAll.add(entry); - break; - case ForwardToAllExceptCur: - case ForwardToAllExistExceptCur: - entryListForwardAllExceptCur.add(entry); - break; - case ForwardToHost: - entryListForwardHost.add(entry); - break; - default: - break; + case FORWARD_TO_ALL -> entryListForwardAll.add(entry); + case FORWARD_TO_ALL_EXCEPT_CUR, FORWARD_TO_ALL_EXIST_EXCEPT_CUR -> entryListForwardAllExceptCur.add(entry); + case FORWARD_TO_HOST -> entryListForwardHost.add(entry); + default -> { + } } } diff --git a/src/main/java/emu/grasscutter/game/TeamManager.java b/src/main/java/emu/grasscutter/game/TeamManager.java index 6cd447d49..c32d3edfb 100644 --- a/src/main/java/emu/grasscutter/game/TeamManager.java +++ b/src/main/java/emu/grasscutter/game/TeamManager.java @@ -397,7 +397,7 @@ public class TeamManager { this.setCurrentCharacterIndex(index); // Old entity motion state - oldEntity.setMotionState(MotionState.MotionStandby); + oldEntity.setMotionState(MotionState.MOTION_STANDBY); // Remove and Add getPlayer().getScene().replaceEntity(oldEntity, newEntity); @@ -476,7 +476,7 @@ public class TeamManager { } // Teleport player - getPlayer().sendPacket(new PacketPlayerEnterSceneNotify(getPlayer(), EnterType.EnterSelf, EnterReason.Revival, 3, GenshinConstants.START_POSITION)); + getPlayer().sendPacket(new PacketPlayerEnterSceneNotify(getPlayer(), EnterType.ENTER_SELF, EnterReason.Revival, 3, GenshinConstants.START_POSITION)); // Set player position player.setSceneId(3); diff --git a/src/main/java/emu/grasscutter/game/World.java b/src/main/java/emu/grasscutter/game/World.java index 9dd6b6905..eefaabc16 100644 --- a/src/main/java/emu/grasscutter/game/World.java +++ b/src/main/java/emu/grasscutter/game/World.java @@ -64,7 +64,7 @@ public class World implements Iterable { this.levelEntityId = getNextEntityId(EntityIdType.MPLEVEL); this.worldLevel = player.getWorldLevel(); this.isMultiplayer = isMultiplayer; - + this.owner.getServer().registerWorld(this); } @@ -197,7 +197,7 @@ public class World implements Iterable { World world = new World(victim); world.addPlayer(victim); - victim.sendPacket(new PacketPlayerEnterSceneNotify(victim, EnterType.EnterSelf, EnterReason.TeamKick, victim.getSceneId(), victim.getPos())); + victim.sendPacket(new PacketPlayerEnterSceneNotify(victim, EnterType.ENTER_SELF, EnterReason.TeamKick, victim.getSceneId(), victim.getPos())); } } } @@ -219,12 +219,12 @@ public class World implements Iterable { if (player.getScene() != null) { oldScene = player.getScene(); - + // Dont deregister scenes if the player is going to tp back into them if (oldScene.getId() == sceneId) { oldScene.setDontDestroyWhenEmpty(true); } - + oldScene.removePlayer(player); } @@ -235,12 +235,12 @@ public class World implements Iterable { if (oldScene != null) { oldScene.setDontDestroyWhenEmpty(false); } - + // Teleport packet if (oldScene == newScene) { - player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterGoto, EnterReason.TransPoint, sceneId, pos)); + player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.ENTER_GOTO, EnterReason.TransPoint, sceneId, pos)); } else { - player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterJump, EnterReason.TransPoint, sceneId, pos)); + player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.ENTER_JUMP, EnterReason.TransPoint, sceneId, pos)); } return true; } @@ -281,7 +281,7 @@ public class World implements Iterable { scene.onTick(); } } - + public void close() { } diff --git a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java index b6007e280..a68e2683e 100644 --- a/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java +++ b/src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java @@ -778,7 +778,7 @@ public class GenshinAvatar { .setCoreProudSkillLevel(this.getCoreProudSkillLevel()) .putAllSkillLevelMap(this.getSkillLevelMap()) .addAllInherentProudSkillList(this.getProudSkillList()) - .putAllProudSkillExtraLevel(getProudSkillBonusMap()) + .putAllProudSkillExtraLevelMap(getProudSkillBonusMap()) .setAvatarType(1) .setBornTime(this.getBornTime()) .setFetterInfo(avatarFetter) diff --git a/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java b/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java index 233da5288..7788f932a 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityAvatar.java @@ -101,13 +101,13 @@ public class EntityAvatar extends GenshinEntity { @Override public void onDeath(int killerId) { - this.killedType = PlayerDieType.PlayerDieKillByMonster; + this.killedType = PlayerDieType.PLAYER_DIE_KILL_BY_MONSTER; this.killedBy = killerId; } public SceneAvatarInfo getSceneAvatarInfo() { SceneAvatarInfo.Builder avatarInfo = SceneAvatarInfo.newBuilder() - .setPlayerId(this.getPlayer().getUid()) + .setUid(this.getPlayer().getUid()) .setAvatarId(this.getAvatar().getAvatarId()) .setGuid(this.getAvatar().getGuid()) .setPeerId(this.getPlayer().getPeerId()) @@ -145,7 +145,7 @@ public class EntityAvatar extends GenshinEntity { SceneEntityInfo.Builder entityInfo = SceneEntityInfo.newBuilder() .setEntityId(getId()) - .setEntityType(ProtEntityType.ProtEntityAvatar) + .setEntityType(ProtEntityType.PROT_ENTITY_AVATAR) .addAnimatorParaList(AnimatorParameterValueInfoPair.newBuilder()) .setEntityClientData(EntityClientData.newBuilder()) .setEntityAuthorityInfo(authority) @@ -161,7 +161,7 @@ public class EntityAvatar extends GenshinEntity { if (entry.getIntKey() == 0) { continue; } - FightPropPair fightProp = FightPropPair.newBuilder().setType(entry.getIntKey()).setPropValue(entry.getFloatValue()).build(); + FightPropPair fightProp = FightPropPair.newBuilder().setPropType(entry.getIntKey()).setPropValue(entry.getFloatValue()).build(); entityInfo.addFightPropList(fightProp); } diff --git a/src/main/java/emu/grasscutter/game/entity/EntityClientGadget.java b/src/main/java/emu/grasscutter/game/entity/EntityClientGadget.java index 5fbd26502..04f045c03 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityClientGadget.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityClientGadget.java @@ -6,6 +6,7 @@ import emu.grasscutter.game.World; import emu.grasscutter.game.props.PlayerProperty; import emu.grasscutter.net.proto.AbilitySyncStateInfoOuterClass.AbilitySyncStateInfo; import emu.grasscutter.net.proto.AnimatorParameterValueInfoPairOuterClass.AnimatorParameterValueInfoPair; +import emu.grasscutter.net.proto.ClientGadgetInfoOuterClass; import emu.grasscutter.net.proto.EntityAuthorityInfoOuterClass.EntityAuthorityInfo; import emu.grasscutter.net.proto.EntityClientDataOuterClass.EntityClientData; import emu.grasscutter.net.proto.EntityRendererChangedInfoOuterClass.EntityRendererChangedInfo; @@ -112,7 +113,7 @@ public class EntityClientGadget extends EntityGadget { SceneEntityInfo.Builder entityInfo = SceneEntityInfo.newBuilder() .setEntityId(getId()) - .setEntityType(ProtEntityType.ProtEntityGadget) + .setEntityType(ProtEntityType.PROT_ENTITY_GADGET) .setMotionInfo(MotionInfo.newBuilder().setPos(getPosition().toProto()).setRot(getRotation().toProto()).setSpeed(Vector.newBuilder())) .addAnimatorParaList(AnimatorParameterValueInfoPair.newBuilder()) .setEntityClientData(EntityClientData.newBuilder()) @@ -125,7 +126,7 @@ public class EntityClientGadget extends EntityGadget { .build(); entityInfo.addPropList(pair); - GadgetClientParam clientGadget = GadgetClientParam.newBuilder() + ClientGadgetInfoOuterClass.ClientGadgetInfo clientGadget = ClientGadgetInfoOuterClass.ClientGadgetInfo.newBuilder() .setCampId(this.getCampId()) .setCampType(this.getCampType()) .setOwnerEntityId(this.getOwnerEntityId()) diff --git a/src/main/java/emu/grasscutter/game/entity/EntityItem.java b/src/main/java/emu/grasscutter/game/entity/EntityItem.java index ba1188f13..ebd8051e6 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityItem.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityItem.java @@ -92,7 +92,7 @@ public class EntityItem extends EntityGadget { SceneEntityInfo.Builder entityInfo = SceneEntityInfo.newBuilder() .setEntityId(getId()) - .setEntityType(ProtEntityType.ProtEntityGadget) + .setEntityType(ProtEntityType.PROT_ENTITY_GADGET) .setMotionInfo(MotionInfo.newBuilder().setPos(getPosition().toProto()).setRot(getRotation().toProto()).setSpeed(Vector.newBuilder())) .addAnimatorParaList(AnimatorParameterValueInfoPair.newBuilder()) .setEntityClientData(EntityClientData.newBuilder()) @@ -108,7 +108,7 @@ public class EntityItem extends EntityGadget { SceneGadgetInfo.Builder gadgetInfo = SceneGadgetInfo.newBuilder() .setGadgetId(this.getItemData().getGadgetId()) .setTrifleItem(this.getItem().toProto()) - .setBornType(GadgetBornType.GadgetBornInAir) + .setBornType(GadgetBornType.GADGET_BORN_IN_AIR) .setAuthorityPeerId(this.getWorld().getHostPeerId()) .setIsEnableInteract(true); diff --git a/src/main/java/emu/grasscutter/game/entity/EntityMonster.java b/src/main/java/emu/grasscutter/game/entity/EntityMonster.java index 754def22c..a1900f5c9 100644 --- a/src/main/java/emu/grasscutter/game/entity/EntityMonster.java +++ b/src/main/java/emu/grasscutter/game/entity/EntityMonster.java @@ -197,7 +197,7 @@ public class EntityMonster extends GenshinEntity { SceneEntityInfo.Builder entityInfo = SceneEntityInfo.newBuilder() .setEntityId(getId()) - .setEntityType(ProtEntityType.ProtEntityMonster) + .setEntityType(ProtEntityType.PROT_ENTITY_MONSTER) .setMotionInfo(this.getMotionInfo()) .addAnimatorParaList(AnimatorParameterValueInfoPair.newBuilder()) .setEntityClientData(EntityClientData.newBuilder()) @@ -208,7 +208,7 @@ public class EntityMonster extends GenshinEntity { if (entry.getIntKey() == 0) { continue; } - FightPropPair fightProp = FightPropPair.newBuilder().setType(entry.getIntKey()).setPropValue(entry.getFloatValue()).build(); + FightPropPair fightProp = FightPropPair.newBuilder().setPropType(entry.getIntKey()).setPropValue(entry.getFloatValue()).build(); entityInfo.addFightPropList(fightProp); } @@ -226,7 +226,7 @@ public class EntityMonster extends GenshinEntity { .setAuthorityPeerId(getWorld().getHostPeerId()) .setPoseId(this.getPoseId()) .setBlockId(3001) - .setBornType(MonsterBornType.MonsterBornDefault) + .setBornType(MonsterBornType.MONSTER_BORN_DEFAULT) .setSpecialNameId(40); if (getMonsterData().getDescribeData() != null) { @@ -240,7 +240,7 @@ public class EntityMonster extends GenshinEntity { .setAbilityInfo(AbilitySyncStateInfo.newBuilder()) .build(); - monsterInfo.setWeaponList(weaponInfo); + monsterInfo.addWeaponList(weaponInfo); } entityInfo.setMonster(monsterInfo); diff --git a/src/main/java/emu/grasscutter/game/entity/GenshinEntity.java b/src/main/java/emu/grasscutter/game/entity/GenshinEntity.java index a65d30f07..c766f493c 100644 --- a/src/main/java/emu/grasscutter/game/entity/GenshinEntity.java +++ b/src/main/java/emu/grasscutter/game/entity/GenshinEntity.java @@ -23,7 +23,7 @@ public abstract class GenshinEntity { public GenshinEntity(GenshinScene scene) { this.scene = scene; - this.moveState = MotionState.MotionNone; + this.moveState = MotionState.MOTION_NONE; } public int getId() { diff --git a/src/main/java/emu/grasscutter/game/friends/FriendsList.java b/src/main/java/emu/grasscutter/game/friends/FriendsList.java index 45a11fb1c..c7756763c 100644 --- a/src/main/java/emu/grasscutter/game/friends/FriendsList.java +++ b/src/main/java/emu/grasscutter/game/friends/FriendsList.java @@ -104,7 +104,7 @@ public class FriendsList { } // Handle - if (result == DealAddFriendResultType.DealAddFriendAccept) { // Request accepted + if (result == DealAddFriendResultType.DEAL_ADD_FRIEND_ACCEPT) { // Request accepted myFriendship.setIsFriend(true); theirFriendship.setIsFriend(true); diff --git a/src/main/java/emu/grasscutter/game/friends/Friendship.java b/src/main/java/emu/grasscutter/game/friends/Friendship.java index 28561dc39..81d219901 100644 --- a/src/main/java/emu/grasscutter/game/friends/Friendship.java +++ b/src/main/java/emu/grasscutter/game/friends/Friendship.java @@ -1,5 +1,6 @@ package emu.grasscutter.game.friends; +import emu.grasscutter.net.proto.PlatformTypeOuterClass; import org.bson.types.ObjectId; import dev.morphia.annotations.*; @@ -91,16 +92,16 @@ public class Friendship { .setUid(getFriendProfile().getUid()) .setNickname(getFriendProfile().getName()) .setLevel(getFriendProfile().getPlayerLevel()) - .setAvatar(HeadImage.newBuilder().setAvatarId(getFriendProfile().getAvatarId())) + .setAvatarId(HeadImage.newBuilder().setAvatarId(getFriendProfile().getAvatarId()).getAvatarId()) .setWorldLevel(getFriendProfile().getWorldLevel()) .setSignature(getFriendProfile().getSignature()) - .setOnlineState(getFriendProfile().isOnline() ? FriendOnlineState.FRIEND_ONLINE : FriendOnlineState.FRIEND_DISCONNECT) + .setOnlineState(getFriendProfile().isOnline() ? FriendOnlineState.FRIEND_ONLINE : FriendOnlineState.FREIEND_DISCONNECT) .setIsMpModeAvailable(true) .setLastActiveTime(getFriendProfile().getLastActiveTime()) .setNameCardId(getFriendProfile().getNameCard()) .setParam(getFriendProfile().getDaysSinceLogin()) - .setUnk1(1) - .setUnk2(3) + .setIsGameSource(true) + .setPlatformType(PlatformTypeOuterClass.PlatformType.PC) .build(); return proto; diff --git a/src/main/java/emu/grasscutter/game/managers/MultiplayerManager.java b/src/main/java/emu/grasscutter/game/managers/MultiplayerManager.java index 56d629036..e42f7a789 100644 --- a/src/main/java/emu/grasscutter/game/managers/MultiplayerManager.java +++ b/src/main/java/emu/grasscutter/game/managers/MultiplayerManager.java @@ -7,6 +7,7 @@ import emu.grasscutter.game.props.EnterReason; import emu.grasscutter.net.proto.EnterTypeOuterClass.EnterType; import emu.grasscutter.net.proto.PlayerApplyEnterMpReasonOuterClass.PlayerApplyEnterMpReason; import emu.grasscutter.game.World; +import emu.grasscutter.net.proto.PlayerApplyEnterMpResultNotifyOuterClass; import emu.grasscutter.server.game.GameServer; import emu.grasscutter.server.packet.send.PacketPlayerApplyEnterMpNotify; import emu.grasscutter.server.packet.send.PacketPlayerApplyEnterMpResultNotify; @@ -26,7 +27,7 @@ public class MultiplayerManager { public void applyEnterMp(GenshinPlayer player, int targetUid) { GenshinPlayer target = getServer().getPlayerByUid(targetUid); if (target == null) { - player.sendPacket(new PacketPlayerApplyEnterMpResultNotify(targetUid, "", false, PlayerApplyEnterMpReason.PlayerCannotEnterMp)); + player.sendPacket(new PacketPlayerApplyEnterMpResultNotify(targetUid, "", false, PlayerApplyEnterMpResultNotifyOuterClass.PlayerApplyEnterMpResultNotify.Reason.PLAYER_CANNOT_ENTER_MP)); return; } @@ -71,12 +72,12 @@ public class MultiplayerManager { // Sanity checks - Dont let the requesting player join if they are already in multiplayer if (requester.getWorld().isMultiplayer()) { - request.getRequester().sendPacket(new PacketPlayerApplyEnterMpResultNotify(hostPlayer, false, PlayerApplyEnterMpReason.PlayerCannotEnterMp)); + request.getRequester().sendPacket(new PacketPlayerApplyEnterMpResultNotify(hostPlayer, false, PlayerApplyEnterMpResultNotifyOuterClass.PlayerApplyEnterMpResultNotify.Reason.PLAYER_CANNOT_ENTER_MP)); return; } // Response packet - request.getRequester().sendPacket(new PacketPlayerApplyEnterMpResultNotify(hostPlayer, isAgreed, PlayerApplyEnterMpReason.PlayerJudge)); + request.getRequester().sendPacket(new PacketPlayerApplyEnterMpResultNotify(hostPlayer, isAgreed, PlayerApplyEnterMpResultNotifyOuterClass.PlayerApplyEnterMpResultNotify.Reason.PLAYER_JUDGE)); // Declined if (!isAgreed) { @@ -92,7 +93,7 @@ public class MultiplayerManager { world.addPlayer(hostPlayer); // Rejoin packet - hostPlayer.sendPacket(new PacketPlayerEnterSceneNotify(hostPlayer, hostPlayer, EnterType.EnterSelf, EnterReason.HostFromSingleToMp, hostPlayer.getScene().getId(), hostPlayer.getPos())); + hostPlayer.sendPacket(new PacketPlayerEnterSceneNotify(hostPlayer, hostPlayer, EnterType.ENTER_SELF, EnterReason.HostFromSingleToMp, hostPlayer.getScene().getId(), hostPlayer.getPos())); } // Set scene pos and id of requester to the host player's @@ -104,7 +105,7 @@ public class MultiplayerManager { hostPlayer.getWorld().addPlayer(requester); // Packet - requester.sendPacket(new PacketPlayerEnterSceneNotify(requester, hostPlayer, EnterType.EnterOther, EnterReason.TeamJoin, hostPlayer.getScene().getId(), hostPlayer.getPos())); + requester.sendPacket(new PacketPlayerEnterSceneNotify(requester, hostPlayer, EnterType.ENTER_OTHER, EnterReason.TeamJoin, hostPlayer.getScene().getId(), hostPlayer.getPos())); } public boolean leaveCoop(GenshinPlayer player) { @@ -125,7 +126,7 @@ public class MultiplayerManager { world.addPlayer(player); // Packet - player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.EnterSelf, EnterReason.TeamBack, player.getScene().getId(), player.getPos())); + player.sendPacket(new PacketPlayerEnterSceneNotify(player, EnterType.ENTER_SELF, EnterReason.TeamBack, player.getScene().getId(), player.getPos())); return true; } @@ -152,7 +153,7 @@ public class MultiplayerManager { World world = new World(victim); world.addPlayer(victim); - victim.sendPacket(new PacketPlayerEnterSceneNotify(victim, EnterType.EnterSelf, EnterReason.TeamKick, victim.getScene().getId(), victim.getPos())); + victim.sendPacket(new PacketPlayerEnterSceneNotify(victim, EnterType.ENTER_SELF, EnterReason.TeamKick, victim.getScene().getId(), victim.getPos())); return true; } } diff --git a/src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java b/src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java index 365055e26..b65bc5e5c 100644 --- a/src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java +++ b/src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java @@ -1009,6 +1009,7 @@ public class PacketOpcodes { public static final int SetNameCardRsp = 4009; public static final int SetOpenStateReq = 162; public static final int SetOpenStateRsp = 189; + public static final int SetPlayerBirthdayReq = 4097; public static final int SetPlayerBirthdayRsp = 4088; public static final int SetPlayerBornDataReq = 155; @@ -1034,8 +1035,6 @@ public class PacketOpcodes { public static final int ShowTemplateReminderNotify = 3164; public static final int SignInInfoReq = 2510; public static final int SignInInfoRsp = 2515; - public static final int SitReq = 354; - public static final int SitRsp = 335; public static final int SocialDataNotify = 4063; public static final int SpringUseReq = 1720; public static final int SpringUseRsp = 1727; diff --git a/src/main/java/emu/grasscutter/net/packet/Retcode.java b/src/main/java/emu/grasscutter/net/packet/Retcode.java deleted file mode 100644 index c061a1897..000000000 --- a/src/main/java/emu/grasscutter/net/packet/Retcode.java +++ /dev/null @@ -1,6 +0,0 @@ -package emu.grasscutter.net.packet; - -public class Retcode { - public static final int SUCCESS = 0; - public static final int FAIL = 1; -} diff --git a/src/main/java/emu/grasscutter/plugin/PluginManager.java b/src/main/java/emu/grasscutter/plugin/PluginManager.java index 2c6b9f23d..89adfeda0 100644 --- a/src/main/java/emu/grasscutter/plugin/PluginManager.java +++ b/src/main/java/emu/grasscutter/plugin/PluginManager.java @@ -17,7 +17,7 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; /** - * Manages the server's plugins & the event system. + * Manages the server's plugins and the event system. */ public final class PluginManager { private final Map plugins = new HashMap<>(); diff --git a/src/main/java/emu/grasscutter/plugin/api/PlayerHook.java b/src/main/java/emu/grasscutter/plugin/api/PlayerHook.java index f4a479acb..3f2961e19 100644 --- a/src/main/java/emu/grasscutter/plugin/api/PlayerHook.java +++ b/src/main/java/emu/grasscutter/plugin/api/PlayerHook.java @@ -82,7 +82,7 @@ public final class PlayerHook { public void teleport(Position position) { this.player.getPos().set(position); this.player.sendPacket(new PacketPlayerEnterSceneNotify(this.player, - EnterType.EnterJump, EnterReason.TransPoint, + EnterType.ENTER_JUMP, EnterReason.TransPoint, this.player.getSceneId(), position )); } diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index e8caaaea8..654cf91b3 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -126,10 +126,10 @@ public final class DispatchServer { servers.add(server); RegionInfo serverRegion = regionQuery.getRegionInfo().toBuilder() - .setIp((Grasscutter.getConfig().getGameServerOptions().PublicIp.isEmpty() + .setGateserverIp((Grasscutter.getConfig().getGameServerOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getGameServerOptions().Ip : Grasscutter.getConfig().getGameServerOptions().PublicIp)) - .setPort(Grasscutter.getConfig().getGameServerOptions().PublicPort != 0 + .setGateserverPort(Grasscutter.getConfig().getGameServerOptions().PublicPort != 0 ? Grasscutter.getConfig().getGameServerOptions().PublicPort : Grasscutter.getConfig().getGameServerOptions().Port) .setSecretKey(ByteString @@ -169,8 +169,8 @@ public final class DispatchServer { servers.add(server); RegionInfo serverRegion = regionQuery.getRegionInfo().toBuilder() - .setIp(regionInfo.Ip) - .setPort(regionInfo.Port) + .setGateserverIp(regionInfo.Ip) + .setGateserverPort(regionInfo.Port) .setSecretKey(ByteString .copyFrom(FileUtils.read(Grasscutter.getConfig().KEY_FOLDER + "dispatchSeed.bin"))) .build(); @@ -181,7 +181,7 @@ public final class DispatchServer { } QueryRegionListHttpRsp regionList = QueryRegionListHttpRsp.newBuilder() - .addAllServers(servers) + .addAllRegionList(servers) .setClientSecretKey(rl.getClientSecretKey()) .setClientCustomConfigEncrypted(rl.getClientCustomConfigEncrypted()) .setEnableLoginPc(true) diff --git a/src/main/java/emu/grasscutter/server/game/GameServerPacketHandler.java b/src/main/java/emu/grasscutter/server/game/GameServerPacketHandler.java index 50d508bed..e6d6564ed 100644 --- a/src/main/java/emu/grasscutter/server/game/GameServerPacketHandler.java +++ b/src/main/java/emu/grasscutter/server/game/GameServerPacketHandler.java @@ -89,7 +89,7 @@ public class GameServerPacketHandler { // Log unhandled packets if (Grasscutter.getConfig().getGameServerOptions().LOG_PACKETS) { - //Grasscutter.getLogger().info("Unhandled packet (" + opcode + "): " + PacketOpcodesUtil.getOpcodeName(opcode)); + Grasscutter.getLogger().info("Unhandled packet (" + opcode + "): " + emu.grasscutter.net.packet.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 53b4f32cc..1beea2f3a 100644 --- a/src/main/java/emu/grasscutter/server/game/GameSession.java +++ b/src/main/java/emu/grasscutter/server/game/GameSession.java @@ -3,11 +3,14 @@ package emu.grasscutter.server.game; import java.io.File; import java.net.InetSocketAddress; import java.nio.ByteBuffer; +import java.util.HashSet; +import java.util.Set; import emu.grasscutter.Grasscutter; import emu.grasscutter.game.Account; import emu.grasscutter.game.GenshinPlayer; import emu.grasscutter.net.packet.GenshinPacket; +import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.packet.PacketOpcodesUtil; import emu.grasscutter.netty.MihoyoKcpChannel; import emu.grasscutter.server.event.game.SendPacketEvent; @@ -177,10 +180,20 @@ public class GameSession extends MihoyoKcpChannel { //Grasscutter.getLogger().info("SEND: " + PacketOpcodesUtil.getOpcodeName(opcode)); //System.out.println(Utils.bytesToHex(genshinPacket.getData())); } - + + private static final Set loopPacket = Set.of( + PacketOpcodes.PingReq, + PacketOpcodes.PingRsp, + PacketOpcodes.WorldPlayerRTTNotify, + PacketOpcodes.UnionCmdNotify, + PacketOpcodes.QueryPathReq + ); + private void logPacket(GenshinPacket genshinPacket) { - Grasscutter.getLogger().info("SEND: " + PacketOpcodesUtil.getOpcodeName(genshinPacket.getOpcode()) + " (" + genshinPacket.getOpcode() + ")"); - System.out.println(Utils.bytesToHex(genshinPacket.getData())); + if (!loopPacket.contains(genshinPacket.getOpcode())) { + Grasscutter.getLogger().info("SEND: " + PacketOpcodesUtil.getOpcodeName(genshinPacket.getOpcode()) + " (" + genshinPacket.getOpcode() + ")"); + System.out.println(Utils.bytesToHex(genshinPacket.getData())); + } } @Override @@ -226,8 +239,10 @@ public class GameSession extends MihoyoKcpChannel { // Log packet if (Grasscutter.getConfig().getGameServerOptions().LOG_PACKETS) { - Grasscutter.getLogger().info("RECV: " + PacketOpcodesUtil.getOpcodeName(opcode) + " (" + opcode + ")"); - System.out.println(Utils.bytesToHex(payload)); + if (!loopPacket.contains(opcode)) { + Grasscutter.getLogger().info("RECV: " + PacketOpcodesUtil.getOpcodeName(opcode) + " (" + opcode + ")"); + System.out.println(Utils.bytesToHex(payload)); + } } // Handle diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandleSitReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandleSitReq.java deleted file mode 100644 index 418d99eef..000000000 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandleSitReq.java +++ /dev/null @@ -1,24 +0,0 @@ -package emu.grasscutter.server.packet.recv; - -import emu.grasscutter.net.packet.Opcodes; -import emu.grasscutter.net.packet.PacketHandler; -import emu.grasscutter.net.packet.PacketOpcodes; -import emu.grasscutter.net.proto.SitReqOuterClass; -import emu.grasscutter.server.game.GameSession; -import emu.grasscutter.server.packet.send.PacketSitRsp; -import emu.grasscutter.utils.Position; - -@Opcodes(PacketOpcodes.SitReq) -public class HandleSitReq extends PacketHandler { - @Override - public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { - SitReqOuterClass.SitReq req = SitReqOuterClass.SitReq.parseFrom(payload); - - float x = req.getPosition().getX(); - float y = req.getPosition().getY(); - float z = req.getPosition().getZ(); - - session.send(new PacketSitRsp(req.getChairId(), new Position(x, y, z), session.getPlayer().getTeamManager().getCurrentAvatarEntity().getId())); - } - -} \ No newline at end of file diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerCombatInvocationsNotify.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerCombatInvocationsNotify.java index 570c3e981..e06cd51da 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerCombatInvocationsNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerCombatInvocationsNotify.java @@ -19,12 +19,12 @@ public class HandlerCombatInvocationsNotify extends PacketHandler { for (CombatInvokeEntry entry : notif.getInvokeListList()) { switch (entry.getArgumentType()) { - case CombatEvtBeingHit: + case COMBAT_EVT_BEING_HIT: // Handle damage EvtBeingHitInfo hitInfo = EvtBeingHitInfo.parseFrom(entry.getCombatData()); session.getPlayer().getScene().handleAttack(hitInfo.getAttackResult()); break; - case EntityMove: + case ENTITY_MOVE: // Handle movement EntityMoveInfo moveInfo = EntityMoveInfo.parseFrom(entry.getCombatData()); GenshinEntity entity = session.getPlayer().getScene().getEntityById(moveInfo.getEntityId()); diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerCombineReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerCombineReq.java new file mode 100644 index 000000000..d5ff27a15 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerCombineReq.java @@ -0,0 +1,20 @@ +package emu.grasscutter.server.packet.recv; + +import emu.grasscutter.net.packet.Opcodes; +import emu.grasscutter.net.packet.PacketHandler; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.CombineReqOuterClass; +import emu.grasscutter.server.game.GameSession; + +@Opcodes(PacketOpcodes.CombineReq) +public class HandlerCombineReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + + CombineReqOuterClass.CombineReq req = CombineReqOuterClass.CombineReq.parseFrom(payload); + + } + +} + diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerMarkMapReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerMarkMapReq.java index 60d58e75e..a46aec718 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerMarkMapReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerMarkMapReq.java @@ -32,7 +32,7 @@ public class HandlerMarkMapReq extends PacketHandler { public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { MarkMapReq req = MarkMapReq.parseFrom(payload); - if (req.getOp() != Operation.Add) { + if (req.getOp() != MarkMapReq.Operation.ADD) { return; } diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerPlayerGetForceQuitBanInfoReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerPlayerGetForceQuitBanInfoReq.java index b7afdb905..65740c7fd 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerPlayerGetForceQuitBanInfoReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerPlayerGetForceQuitBanInfoReq.java @@ -3,6 +3,7 @@ package emu.grasscutter.server.packet.recv; import emu.grasscutter.net.packet.Opcodes; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.packet.PacketHandler; +import emu.grasscutter.net.proto.RetcodeOuterClass; import emu.grasscutter.server.game.GameSession; import emu.grasscutter.server.packet.send.PacketPlayerGetForceQuitBanInfoRsp; @@ -14,10 +15,10 @@ public class HandlerPlayerGetForceQuitBanInfoReq extends PacketHandler { if (session.getServer().getMultiplayerManager().leaveCoop(session.getPlayer())) { // Success - session.send(new PacketPlayerGetForceQuitBanInfoRsp(0)); + session.send(new PacketPlayerGetForceQuitBanInfoRsp(RetcodeOuterClass.Retcode.RET_SUCC_VALUE)); } else { // Fail - session.send(new PacketPlayerGetForceQuitBanInfoRsp(1)); + session.send(new PacketPlayerGetForceQuitBanInfoRsp(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE)); } } diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneEntityDrownReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSceneEntityDrownReq.java new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarChangeCostumeNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarChangeCostumeNotify.java index 0319fc4c9..4176bf71d 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarChangeCostumeNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarChangeCostumeNotify.java @@ -11,7 +11,7 @@ public class PacketAvatarChangeCostumeNotify extends GenshinPacket { super(PacketOpcodes.AvatarChangeCostumeNotify); AvatarChangeCostumeNotify proto = AvatarChangeCostumeNotify.newBuilder() - .setEntity(entity.toProto()) + .setEntityInfo(entity.toProto()) .build(); this.setData(proto); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarChangeCostumeRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarChangeCostumeRsp.java index 66c1d5050..cb39f6bbd 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarChangeCostumeRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarChangeCostumeRsp.java @@ -3,6 +3,7 @@ package emu.grasscutter.server.packet.send; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.AvatarChangeCostumeRspOuterClass.AvatarChangeCostumeRsp; +import emu.grasscutter.net.proto.RetcodeOuterClass; public class PacketAvatarChangeCostumeRsp extends GenshinPacket { @@ -21,7 +22,7 @@ public class PacketAvatarChangeCostumeRsp extends GenshinPacket { super(PacketOpcodes.AvatarChangeCostumeRsp); AvatarChangeCostumeRsp proto = AvatarChangeCostumeRsp.newBuilder() - .setRetcode(1) + .setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE) .build(); this.setData(proto); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarWearFlycloakRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarWearFlycloakRsp.java index b95cfafcf..6cb513a7a 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarWearFlycloakRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketAvatarWearFlycloakRsp.java @@ -3,6 +3,7 @@ package emu.grasscutter.server.packet.send; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.AvatarWearFlycloakRspOuterClass.AvatarWearFlycloakRsp; +import emu.grasscutter.net.proto.RetcodeOuterClass; public class PacketAvatarWearFlycloakRsp extends GenshinPacket { public PacketAvatarWearFlycloakRsp(long avatarGuid, int costumeId) { @@ -20,7 +21,7 @@ public class PacketAvatarWearFlycloakRsp extends GenshinPacket { super(PacketOpcodes.AvatarWearFlycloakRsp); AvatarWearFlycloakRsp proto = AvatarWearFlycloakRsp.newBuilder() - .setRetcode(1) + .setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE) .build(); this.setData(proto); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketCalcWeaponUpgradeReturnItemsRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketCalcWeaponUpgradeReturnItemsRsp.java index d3a30a700..874f7da73 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketCalcWeaponUpgradeReturnItemsRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketCalcWeaponUpgradeReturnItemsRsp.java @@ -4,9 +4,9 @@ import java.util.List; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; -import emu.grasscutter.net.packet.Retcode; import emu.grasscutter.net.proto.CalcWeaponUpgradeReturnItemsRspOuterClass.CalcWeaponUpgradeReturnItemsRsp; import emu.grasscutter.net.proto.ItemParamOuterClass.ItemParam; +import emu.grasscutter.net.proto.RetcodeOuterClass; public class PacketCalcWeaponUpgradeReturnItemsRsp extends GenshinPacket { @@ -25,7 +25,7 @@ public class PacketCalcWeaponUpgradeReturnItemsRsp extends GenshinPacket { super(PacketOpcodes.CalcWeaponUpgradeReturnItemsRsp); CalcWeaponUpgradeReturnItemsRsp proto = CalcWeaponUpgradeReturnItemsRsp.newBuilder() - .setRetcode(Retcode.FAIL) + .setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE) .build(); this.setData(proto); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketChangeAvatarRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketChangeAvatarRsp.java index ac222a43f..720e924ec 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketChangeAvatarRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketChangeAvatarRsp.java @@ -3,6 +3,7 @@ package emu.grasscutter.server.packet.send; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.ChangeAvatarRspOuterClass.ChangeAvatarRsp; +import emu.grasscutter.net.proto.RetcodeOuterClass; public class PacketChangeAvatarRsp extends GenshinPacket { @@ -10,8 +11,8 @@ public class PacketChangeAvatarRsp extends GenshinPacket { super(PacketOpcodes.ChangeAvatarRsp); ChangeAvatarRsp p = ChangeAvatarRsp.newBuilder() - .setRetcode(0) - .setCurrGuid(guid) + .setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE) + .setCurGuid(guid) .build(); this.setData(p); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketCombineRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketCombineRsp.java new file mode 100644 index 000000000..d5fda887b --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketCombineRsp.java @@ -0,0 +1,58 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.net.packet.GenshinPacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.CombineReqOuterClass; +import emu.grasscutter.net.proto.CombineRspOuterClass; +import emu.grasscutter.net.proto.ItemParamOuterClass; +import emu.grasscutter.net.proto.RetcodeOuterClass; + +public class PacketCombineRsp extends GenshinPacket { + + public PacketCombineRsp() { + super(PacketOpcodes.CombineRsp); + + CombineRspOuterClass.CombineRsp proto = CombineRspOuterClass.CombineRsp.newBuilder() + .setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE).build(); + + + this.setData(proto); + } + + public PacketCombineRsp(int retcode) { + super(PacketOpcodes.CombineRsp); + + CombineRspOuterClass.CombineRsp proto = CombineRspOuterClass.CombineRsp.newBuilder() + .setRetcode(retcode).build(); + + + this.setData(proto); + } + + public PacketCombineRsp(CombineReqOuterClass.CombineReq combineReq, + Iterable costItemList, + Iterable resultItemList, + Iterable totalRandomItemList, + Iterable totalReturnItemList, + Iterable totalExtraItemList) { + + super(PacketOpcodes.CombineRsp); + + CombineRspOuterClass.CombineRsp proto = CombineRspOuterClass.CombineRsp.newBuilder() + .setRetcode(RetcodeOuterClass.Retcode.RET_SUCC_VALUE) + .setCombineId(combineReq.getCombineId()) + .setCombineCount(combineReq.getCombineCount()) + .setAvatarGuid(combineReq.getAvatarGuid()) + .addAllCostItemList(costItemList) + .addAllResultItemList(resultItemList) + .addAllTotalRandomItemList(totalRandomItemList) + .addAllTotalReturnItemList(totalReturnItemList) + .addAllTotalExtraItemList(totalExtraItemList) + .build(); + + this.setData(proto); + } + + + +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketDoGachaRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketDoGachaRsp.java index 090fcfc23..f019239b9 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketDoGachaRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketDoGachaRsp.java @@ -7,6 +7,7 @@ import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.DoGachaRspOuterClass.DoGachaRsp; import emu.grasscutter.net.proto.GachaItemOuterClass.GachaItem; +import emu.grasscutter.net.proto.RetcodeOuterClass; public class PacketDoGachaRsp extends GenshinPacket { @@ -33,7 +34,7 @@ public class PacketDoGachaRsp extends GenshinPacket { super(PacketOpcodes.DoGachaRsp); DoGachaRsp p = DoGachaRsp.newBuilder() - .setRetcode(1) + .setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE) .build(); this.setData(p); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGadgetInteractRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGadgetInteractRsp.java index 3cb2661de..e7847dfdb 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketGadgetInteractRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGadgetInteractRsp.java @@ -5,6 +5,7 @@ import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.GadgetInteractRspOuterClass.GadgetInteractRsp; import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType; +import emu.grasscutter.net.proto.RetcodeOuterClass; public class PacketGadgetInteractRsp extends GenshinPacket { public PacketGadgetInteractRsp(EntityGadget gadget, InteractType interact) { @@ -23,7 +24,7 @@ public class PacketGadgetInteractRsp extends GenshinPacket { super(PacketOpcodes.GadgetInteractRsp); GadgetInteractRsp proto = GadgetInteractRsp.newBuilder() - .setRetcode(1) + .setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE) .build(); this.setData(proto); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGetAuthkeyRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGetAuthkeyRsp.java index da250fec8..2265f2f6f 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketGetAuthkeyRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetAuthkeyRsp.java @@ -3,13 +3,14 @@ package emu.grasscutter.server.packet.send; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.GetAuthkeyRspOuterClass.GetAuthkeyRsp; +import emu.grasscutter.net.proto.RetcodeOuterClass; public class PacketGetAuthkeyRsp extends GenshinPacket { public PacketGetAuthkeyRsp() { super(PacketOpcodes.GetAuthkeyRsp); - GetAuthkeyRsp proto = GetAuthkeyRsp.newBuilder().setRetcode(1).build(); + GetAuthkeyRsp proto = GetAuthkeyRsp.newBuilder().setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE).build(); this.setData(proto); } 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 4d22f9603..85e0b9849 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerFriendListRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerFriendListRsp.java @@ -9,6 +9,7 @@ import emu.grasscutter.net.proto.FriendBriefOuterClass.FriendBrief; import emu.grasscutter.net.proto.FriendOnlineStateOuterClass.FriendOnlineState; import emu.grasscutter.net.proto.GetPlayerFriendListRspOuterClass.GetPlayerFriendListRsp; import emu.grasscutter.net.proto.HeadImageOuterClass.HeadImage; +import emu.grasscutter.net.proto.PlatformTypeOuterClass; public class PacketGetPlayerFriendListRsp extends GenshinPacket { @@ -19,15 +20,15 @@ public class PacketGetPlayerFriendListRsp extends GenshinPacket { .setUid(GenshinConstants.SERVER_CONSOLE_UID) .setNickname("Server") .setLevel(1) - .setAvatar(HeadImage.newBuilder().setAvatarId(GenshinConstants.MAIN_CHARACTER_FEMALE)) + .setAvatarId(HeadImage.newBuilder().setAvatarId(GenshinConstants.MAIN_CHARACTER_FEMALE).getAvatarId()) .setWorldLevel(0) .setSignature("") .setLastActiveTime((int) (System.currentTimeMillis() / 1000f)) .setNameCardId(210001) .setOnlineState(FriendOnlineState.FRIEND_ONLINE) .setParam(1) - .setUnk1(1) - .setUnk2(3) + .setIsGameSource(true) + .setPlatformType(PlatformTypeOuterClass.PlatformType.PC) .build(); GetPlayerFriendListRsp.Builder proto = GetPlayerFriendListRsp.newBuilder().addFriendList(serverFriend); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerSocialDetailRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerSocialDetailRsp.java index 5529d7227..c704afa2f 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerSocialDetailRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerSocialDetailRsp.java @@ -3,6 +3,7 @@ package emu.grasscutter.server.packet.send; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.GetPlayerSocialDetailRspOuterClass.GetPlayerSocialDetailRsp; +import emu.grasscutter.net.proto.RetcodeOuterClass; import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail; public class PacketGetPlayerSocialDetailRsp extends GenshinPacket { @@ -15,7 +16,7 @@ public class PacketGetPlayerSocialDetailRsp extends GenshinPacket { if (detail != null) { proto.setDetailData(detail); } else { - proto.setRetcode(1); + proto.setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE); } this.setData(proto); 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 00f512ea7..994987232 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerTokenRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetPlayerTokenRsp.java @@ -16,18 +16,18 @@ public class PacketGetPlayerTokenRsp extends GenshinPacket { this.setUseDispatchKey(true); GetPlayerTokenRsp p = GetPlayerTokenRsp.newBuilder() - .setPlayerUid(session.getAccount().getPlayerUid()) - .setAccountToken(session.getAccount().getToken()) + .setUid(session.getAccount().getPlayerUid()) + .setToken(session.getAccount().getToken()) .setAccountType(1) .setIsProficientPlayer(doesPlayerExist) // Not sure where this goes - .setSecretKey(Crypto.ENCRYPT_SEED) - .setSecretKeyBuffer(ByteString.copyFrom(Crypto.ENCRYPT_SEED_BUFFER)) + .setSecretKeySeed(Crypto.ENCRYPT_SEED) + .setSecurityCmdBuffer(ByteString.copyFrom(Crypto.ENCRYPT_SEED_BUFFER)) .setPlatformType(3) .setChannelId(1) .setCountryCode("US") - .setUnk1("c25-314dd05b0b5f") - .setUnk3(3) - .setClientIp(session.getAddress().getAddress().getHostAddress()) + .setClientVersionRandomKey("c25-314dd05b0b5f") + .setRegPlatform(3) + .setClientIpStr(session.getAddress().getAddress().getHostAddress()) .build(); this.setData(p.toByteArray()); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpResultNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpResultNotify.java index d2b5be7f5..c55ee3b12 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpResultNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpResultNotify.java @@ -8,7 +8,7 @@ import emu.grasscutter.net.proto.PlayerApplyEnterMpResultNotifyOuterClass.Player public class PacketPlayerApplyEnterMpResultNotify extends GenshinPacket { - public PacketPlayerApplyEnterMpResultNotify(GenshinPlayer target, boolean isAgreed, PlayerApplyEnterMpReason reason) { + public PacketPlayerApplyEnterMpResultNotify(GenshinPlayer target, boolean isAgreed, PlayerApplyEnterMpResultNotify.Reason reason) { super(PacketOpcodes.PlayerApplyEnterMpResultNotify); PlayerApplyEnterMpResultNotify proto = PlayerApplyEnterMpResultNotify.newBuilder() @@ -21,7 +21,7 @@ public class PacketPlayerApplyEnterMpResultNotify extends GenshinPacket { this.setData(proto); } - public PacketPlayerApplyEnterMpResultNotify(int targetId, String targetName, boolean isAgreed, PlayerApplyEnterMpReason reason) { + public PacketPlayerApplyEnterMpResultNotify(int targetId, String targetName, boolean isAgreed, PlayerApplyEnterMpResultNotify.Reason reason) { super(PacketOpcodes.PlayerApplyEnterMpResultNotify); PlayerApplyEnterMpResultNotify proto = PlayerApplyEnterMpResultNotify.newBuilder() diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerChatNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerChatNotify.java index 287292ee4..3118adf57 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerChatNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerChatNotify.java @@ -43,7 +43,7 @@ public class PacketPlayerChatNotify extends GenshinPacket { this.setData(proto); } - public PacketPlayerChatNotify(GenshinPlayer sender, int channelId, SystemHint systemHint) { + public PacketPlayerChatNotify(GenshinPlayer sender, int channelId, ChatInfo.SystemHint systemHint) { super(PacketOpcodes.PlayerChatNotify); ChatInfo info = ChatInfo.newBuilder() diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerDataNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerDataNotify.java index 51b043ab3..c5eb76238 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerDataNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerDataNotify.java @@ -13,7 +13,7 @@ public class PacketPlayerDataNotify extends GenshinPacket { PlayerDataNotify.Builder p = PlayerDataNotify.newBuilder() .setNickName(player.getNickname()) - .setClientTime(System.currentTimeMillis()) + .setServerTime(System.currentTimeMillis()) .setIsFirstLoginToday(true) .setRegionId(player.getRegionId()); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneInfoNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneInfoNotify.java index e47021a05..9668a250c 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneInfoNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneInfoNotify.java @@ -5,6 +5,7 @@ import emu.grasscutter.game.entity.EntityAvatar; import emu.grasscutter.game.inventory.GenshinItem; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.AbilityControlBlockOuterClass; import emu.grasscutter.net.proto.AbilitySyncStateInfoOuterClass.AbilitySyncStateInfo; import emu.grasscutter.net.proto.AvatarEnterSceneInfoOuterClass.AvatarEnterSceneInfo; import emu.grasscutter.net.proto.MPLevelEntityInfoOuterClass.MPLevelEntityInfo; @@ -26,7 +27,7 @@ public class PacketPlayerEnterSceneInfoNotify extends GenshinPacket { TeamEnterSceneInfo.newBuilder() .setTeamEntityId(player.getTeamManager().getEntityId()) // 150995833 .setTeamAbilityInfo(empty) - .setUnk(empty) + .setAbilityControlBlock(AbilityControlBlockOuterClass.AbilityControlBlock.newBuilder().build()) ); proto.setMpLevelEntityInfo( MPLevelEntityInfo.newBuilder() 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 d66575273..cd2f78a0d 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java @@ -23,14 +23,14 @@ public class PacketPlayerEnterSceneNotify extends GenshinPacket { .setSceneId(player.getSceneId()) .setPos(player.getPos().toProto()) .setSceneBeginTime(System.currentTimeMillis()) - .setType(EnterType.EnterSelf) + .setType(EnterType.ENTER_SELF) .setTargetUid(player.getUid()) .setEnterSceneToken(player.getEnterSceneToken()) .setWorldLevel(player.getWorldLevel()) .setEnterReason(EnterReason.Login.getValue()) .setIsFirstLoginEnterScene(player.isFirstLoginEnterScene()) - .setUnk1(1) - .setUnk2("3-" + player.getUid() + "-" + (int) (System.currentTimeMillis() / 1000) + "-" + 18402) + .setWorldType(1) + .setSceneTransaction("3-" + player.getUid() + "-" + (int) (System.currentTimeMillis() / 1000) + "-" + 18402) .build(); this.setData(proto); @@ -62,8 +62,8 @@ public class PacketPlayerEnterSceneNotify extends GenshinPacket { .addSceneTagIdList(109) .addSceneTagIdList(113) .addSceneTagIdList(117) - .setUnk1(1) - .setUnk2(newScene + "-" + target.getUid() + "-" + (int) (System.currentTimeMillis() / 1000) + "-" + 18402) + .setWorldType(1) + .setSceneTransaction(newScene + "-" + target.getUid() + "-" + (int) (System.currentTimeMillis() / 1000) + "-" + 18402) .build(); this.setData(proto); 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 3a796c7ad..f48047633 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerLoginRsp.java @@ -40,8 +40,8 @@ public class PacketPlayerLoginRsp extends GenshinPacket { 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().PublicPort != 0 ? Grasscutter.getConfig().getGameServerOptions().PublicPort : Grasscutter.getConfig().getGameServerOptions().Port) + .setGateserverIp((Grasscutter.getConfig().getGameServerOptions().PublicIp.isEmpty() ? Grasscutter.getConfig().getGameServerOptions().Ip : Grasscutter.getConfig().getGameServerOptions().PublicIp)) + .setGateserverPort(Grasscutter.getConfig().getGameServerOptions().PublicPort != 0 ? Grasscutter.getConfig().getGameServerOptions().PublicPort : Grasscutter.getConfig().getGameServerOptions().Port) .setSecretKey(ByteString.copyFrom(FileUtils.read(Grasscutter.getConfig().KEY_FOLDER + "dispatchSeed.bin"))) .build(); @@ -64,7 +64,7 @@ public class PacketPlayerLoginRsp extends GenshinPacket { .setClientSilenceDataVersion(info.getClientSilenceDataVersion()) .setClientMd5(info.getClientDataMd5()) .setClientSilenceMd5(info.getClientSilenceDataMd5()) - .setResVersionConfig(info.getConfig()) + .setResVersionConfig(info.getResVersionConfig()) .setClientVersionSuffix(info.getClientVersionSuffix()) .setClientSilenceVersionSuffix(info.getClientSilenceVersionSuffix()) .setIsScOpen(false) 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 a3309a5c1..f9649d4b4 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerStoreNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerStoreNotify.java @@ -18,7 +18,7 @@ public class PacketPlayerStoreNotify extends GenshinPacket { this.buildHeader(2); PlayerStoreNotify.Builder p = PlayerStoreNotify.newBuilder() - .setStoreType(StoreType.StorePack) + .setStoreType(StoreType.STORE_PACK) .setWeightLimit(Grasscutter.getConfig().getGameServerOptions().InventoryLimitAll); for (GenshinItem item : player.getInventory()) { diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneEntityAppearNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneEntityAppearNotify.java index 3b8a39025..10cac2453 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneEntityAppearNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneEntityAppearNotify.java @@ -15,7 +15,7 @@ public class PacketSceneEntityAppearNotify extends GenshinPacket { super(PacketOpcodes.SceneEntityAppearNotify, true); SceneEntityAppearNotify.Builder proto = SceneEntityAppearNotify.newBuilder() - .setAppearType(VisionType.VisionBorn) + .setAppearType(VisionType.VISION_BORN) .addEntityList(entity.toProto()); this.setData(proto.build()); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneEntityDrownRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneEntityDrownRsp.java new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneKickPlayerRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneKickPlayerRsp.java index 7f0a6a12e..edc73d5e7 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneKickPlayerRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneKickPlayerRsp.java @@ -2,6 +2,7 @@ package emu.grasscutter.server.packet.send; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.RetcodeOuterClass; import emu.grasscutter.net.proto.SceneKickPlayerRspOuterClass.SceneKickPlayerRsp; public class PacketSceneKickPlayerRsp extends GenshinPacket { @@ -20,7 +21,7 @@ public class PacketSceneKickPlayerRsp extends GenshinPacket { super(PacketOpcodes.SceneKickPlayerRsp); SceneKickPlayerRsp proto = SceneKickPlayerRsp.newBuilder() - .setRetcode(1) + .setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE) .build(); this.setData(proto); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTeamUpdateNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTeamUpdateNotify.java index 20e199bc4..ddfc4e154 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTeamUpdateNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTeamUpdateNotify.java @@ -19,7 +19,7 @@ public class PacketSceneTeamUpdateNotify extends GenshinPacket { for (GenshinPlayer p : player.getWorld().getPlayers()) { for (EntityAvatar entityAvatar : p.getTeamManager().getActiveTeam()) { SceneTeamAvatar.Builder avatarProto = SceneTeamAvatar.newBuilder() - .setPlayerId(p.getUid()) + .setPlayerUid(p.getUid()) .setAvatarGuid(entityAvatar.getAvatar().getGuid()) .setSceneId(p.getSceneId()) .setEntityId(entityAvatar.getId()) 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 4795c5e9f..7aea3e333 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTransToPointRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSceneTransToPointRsp.java @@ -5,6 +5,7 @@ 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.RetcodeOuterClass; import emu.grasscutter.net.proto.SceneTransToPointRspOuterClass.SceneTransToPointRsp; import emu.grasscutter.utils.Position; @@ -26,7 +27,7 @@ public class PacketSceneTransToPointRsp extends GenshinPacket { super(PacketOpcodes.SceneTransToPointRsp); SceneTransToPointRsp proto = SceneTransToPointRsp.newBuilder() - .setRetcode(1) // Internal server error + .setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE) // Internal server error .build(); this.setData(proto); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerBirthdayRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerBirthdayRsp.java index 8a343bf1d..a023ec761 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerBirthdayRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerBirthdayRsp.java @@ -4,6 +4,7 @@ import emu.grasscutter.game.GenshinPlayer; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.SetPlayerBirthdayRspOuterClass.SetPlayerBirthdayRsp; +import emu.grasscutter.net.proto.SetPlayerBornDataReqOuterClass; public class PacketSetPlayerBirthdayRsp extends GenshinPacket { diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerHeadImageRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerHeadImageRsp.java index 148c536f0..b3b17416c 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerHeadImageRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSetPlayerHeadImageRsp.java @@ -12,7 +12,7 @@ public class PacketSetPlayerHeadImageRsp extends GenshinPacket { super(PacketOpcodes.SetPlayerHeadImageRsp); SetPlayerHeadImageRsp proto = SetPlayerHeadImageRsp.newBuilder() - .setAvatar(HeadImage.newBuilder().setAvatarId(player.getHeadImage())) + .setAvatarId(HeadImage.newBuilder().setAvatarId(player.getHeadImage()).getAvatarId()) .build(); this.setData(proto); diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSitRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSitRsp.java deleted file mode 100644 index 70893965b..000000000 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketSitRsp.java +++ /dev/null @@ -1,21 +0,0 @@ -package emu.grasscutter.server.packet.send; - -import emu.grasscutter.net.packet.GenshinPacket; -import emu.grasscutter.net.packet.PacketOpcodes; -import emu.grasscutter.net.proto.SitRspOuterClass.SitRsp; -import emu.grasscutter.utils.Position; - -public class PacketSitRsp extends GenshinPacket { - - public PacketSitRsp(long chairId, Position pos, int EntityId) { - super(PacketOpcodes.SitRsp); - - SitRsp proto = SitRsp.newBuilder() - .setEntityId(EntityId) - .setPosition(pos.toProto()) - .setChairId(chairId) - .build(); - - this.setData(proto); - } -} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketStoreItemChangeNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketStoreItemChangeNotify.java index 70f86b782..20082582e 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketStoreItemChangeNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketStoreItemChangeNotify.java @@ -18,7 +18,7 @@ public class PacketStoreItemChangeNotify extends GenshinPacket { this(); StoreItemChangeNotify.Builder proto = StoreItemChangeNotify.newBuilder() - .setStoreType(StoreType.StorePack) + .setStoreType(StoreType.STORE_PACK) .addItemList(item.toProto()); this.setData(proto); @@ -28,9 +28,9 @@ public class PacketStoreItemChangeNotify extends GenshinPacket { this(); StoreItemChangeNotify.Builder proto = StoreItemChangeNotify.newBuilder() - .setStoreType(StoreType.StorePack); + .setStoreType(StoreType.STORE_PACK); - items.stream().forEach(item -> proto.addItemList(item.toProto())); + items.forEach(item -> proto.addItemList(item.toProto())); this.setData(proto); } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketStoreItemDelNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketStoreItemDelNotify.java index 0bd585720..6bf377a44 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketStoreItemDelNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketStoreItemDelNotify.java @@ -18,7 +18,7 @@ public class PacketStoreItemDelNotify extends GenshinPacket { this(); StoreItemDelNotify.Builder proto = StoreItemDelNotify.newBuilder() - .setStoreType(StoreType.StorePack) + .setStoreType(StoreType.STORE_PACK) .addGuidList(item.getGuid()); this.setData(proto); @@ -28,7 +28,7 @@ public class PacketStoreItemDelNotify extends GenshinPacket { this(); StoreItemDelNotify.Builder proto = StoreItemDelNotify.newBuilder() - .setStoreType(StoreType.StorePack); + .setStoreType(StoreType.STORE_PACK); items.stream().forEach(item -> proto.addGuidList(item.getGuid())); 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 04668b00e..590efd800 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketStoreWeightLimitNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketStoreWeightLimitNotify.java @@ -12,7 +12,7 @@ public class PacketStoreWeightLimitNotify extends GenshinPacket { super(PacketOpcodes.StoreWeightLimitNotify); StoreWeightLimitNotify p = StoreWeightLimitNotify.newBuilder() - .setStoreType(StoreType.StorePack) + .setStoreType(StoreType.STORE_PACK) .setWeightLimit(Grasscutter.getConfig().getGameServerOptions().InventoryLimitAll) .setWeaponCountLimit(Grasscutter.getConfig().getGameServerOptions().InventoryLimitWeapon) .setReliquaryCountLimit(Grasscutter.getConfig().getGameServerOptions().InventoryLimitRelic) diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketUseItemRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketUseItemRsp.java index 0069ee114..b58638ebb 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketUseItemRsp.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketUseItemRsp.java @@ -3,6 +3,7 @@ package emu.grasscutter.server.packet.send; import emu.grasscutter.game.inventory.GenshinItem; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.RetcodeOuterClass; import emu.grasscutter.net.proto.UseItemRspOuterClass.UseItemRsp; public class PacketUseItemRsp extends GenshinPacket { @@ -22,7 +23,7 @@ public class PacketUseItemRsp extends GenshinPacket { public PacketUseItemRsp() { super(PacketOpcodes.UseItemRsp); - UseItemRsp proto = UseItemRsp.newBuilder().setRetcode(1).build(); + UseItemRsp proto = UseItemRsp.newBuilder().setRetcode(RetcodeOuterClass.Retcode.RET_SVR_ERROR_VALUE).build(); this.setData(proto); } 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 1bb09f8db..9ef9cfb73 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.getWorldPlayerLocationInfo()); + proto.addPlayerWorldLocList(p.getWorldPlayerLocationInfo()); } this.setData(proto); diff --git a/src/main/java/emu/grasscutter/utils/Crypto.java b/src/main/java/emu/grasscutter/utils/Crypto.java index 2d3e96c16..e6d260e94 100644 --- a/src/main/java/emu/grasscutter/utils/Crypto.java +++ b/src/main/java/emu/grasscutter/utils/Crypto.java @@ -34,7 +34,7 @@ public final class Crypto { public static void extractSecretKeyBuffer(byte[] data) { try { GetPlayerTokenRsp p = GetPlayerTokenRsp.parseFrom(data); - FileUtils.write(Grasscutter.getConfig().KEY_FOLDER + "secretKeyBuffer.bin", p.getSecretKeyBuffer().toByteArray()); + FileUtils.write(Grasscutter.getConfig().KEY_FOLDER + "secretKeyBuffer.bin", p.getSecretKeyBytes().toByteArray()); Grasscutter.getLogger().info("Secret Key: " + p.getSecretKey()); } catch (Exception e) { Grasscutter.getLogger().error("Crypto error.", e);