From 5cea728eb750e6b3f29b1ada860f351347912ec7 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Tue, 19 Apr 2022 18:17:19 +0800 Subject: [PATCH 01/14] Admin cmds, perms and descriptions for all cmds + Additonal stuff: Fixed + refactored help command. Removed 'Usage: ' from all commands. Created 'player.hasPermission(permission)' function. Created default for Usage annotation. Created hashmap version of 'getHandlers' and renamed the original to getHandlersAsList() --- .../emu/grasscutter/commands/Command.java | 8 +- .../emu/grasscutter/commands/CommandMap.java | 7 +- .../grasscutter/commands/PlayerCommands.java | 48 ++++- .../grasscutter/commands/ServerCommands.java | 186 ++++++++++++++---- .../java/emu/grasscutter/game/Account.java | 4 + 5 files changed, 202 insertions(+), 51 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/Command.java b/src/main/java/emu/grasscutter/commands/Command.java index d1e181e20..d26d7fe29 100644 --- a/src/main/java/emu/grasscutter/commands/Command.java +++ b/src/main/java/emu/grasscutter/commands/Command.java @@ -7,14 +7,16 @@ import java.lang.annotation.RetentionPolicy; public @interface Command { String label() default ""; - String usage() default ""; + String usage() default "No usage specified"; + + String description() default "No description specified"; - String[] aliases() default {""}; + String[] aliases() default {}; Execution execution() default Execution.ALL; String permission() default ""; - + enum Execution { ALL, CONSOLE, diff --git a/src/main/java/emu/grasscutter/commands/CommandMap.java b/src/main/java/emu/grasscutter/commands/CommandMap.java index e9ca260e7..a802551ce 100644 --- a/src/main/java/emu/grasscutter/commands/CommandMap.java +++ b/src/main/java/emu/grasscutter/commands/CommandMap.java @@ -68,10 +68,12 @@ public final class CommandMap { * Returns a list of all registered commands. * @return All command handlers as a list. */ - public List getHandlers() { + public List getHandlersAsList() { return new LinkedList<>(this.commands.values()); } + public HashMap getHandlers() { return new LinkedHashMap<>(this.commands); } + /** * Returns a handler by label/alias. * @param label The command label. @@ -111,8 +113,7 @@ public final class CommandMap { if(player != null) { String permissionNode = this.annotations.get(label).permission(); Account account = player.getAccount(); - List permissions = account.getPermissions(); - if(!permissions.contains("*") && !permissions.contains(permissionNode)) { + if(permissionNode != "" && !account.hasPermission(permissionNode)) { CommandHandler.sendMessage(player, "You do not have permission to run this command."); return; } } diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index ae80c5d25..2ffcbae06 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -27,7 +27,7 @@ import java.util.List; */ public final class PlayerCommands { @Command(label = "give", aliases = {"g", "item", "giveitem"}, - usage = "Usage: give [player] [amount]") + usage = "give [player] [amount]", description = "Gives an item to you or the specified player", permission = "player.give") public static class GiveCommand implements CommandHandler { @Override @@ -140,8 +140,8 @@ public final class PlayerCommands { } @Command(label = "drop", aliases = {"d", "dropitem"}, - usage = "Usage: drop [amount]", - execution = Command.Execution.PLAYER) + usage = "drop [amount]", + execution = Command.Execution.PLAYER, description = "Drops an item near you", permission = "server.drop") public static class DropCommand implements CommandHandler { @Override @@ -178,7 +178,7 @@ public final class PlayerCommands { } @Command(label = "spawn", execution = Command.Execution.PLAYER, - usage = "Usage: spawn [level] [amount]") + usage = "spawn [level] [amount]", description = "Spawns an entity near you", permission = "server.spawn") public static class SpawnCommand implements CommandHandler { @Override @@ -211,7 +211,7 @@ public final class PlayerCommands { } @Command(label = "killall", - usage = "Usage: killall [sceneId]") + usage = "killall [sceneId]", description = "Kill all entities", permission = "server.killall") public static class KillAllCommand implements CommandHandler { @Override @@ -239,7 +239,8 @@ public final class PlayerCommands { } @Command(label = "resetconst", aliases = {"resetconstellation"}, - usage = "Usage: resetconst [all]", execution = Command.Execution.PLAYER) + usage = "resetconst [all]", execution = Command.Execution.PLAYER, permission = "player.resetconstellation", + description = "Resets the constellation level on your current active character, will need to relog after using the command to see any changes.") public static class ResetConstellationCommand implements CommandHandler { @Override @@ -268,7 +269,7 @@ public final class PlayerCommands { } @Command(label = "godmode", - usage = "Usage: godmode", execution = Command.Execution.PLAYER) + usage = "godmode", execution = Command.Execution.PLAYER, description = "Prevents you from taking damage", permission = "player.godmode") public static class GodModeCommand implements CommandHandler { @Override @@ -279,7 +280,8 @@ public final class PlayerCommands { } @Command(label = "sethealth", aliases = {"sethp"}, - usage = "Usage: sethealth ", execution = Command.Execution.PLAYER) + usage = "sethealth ", execution = Command.Execution.PLAYER, description = "Sets your health to the specified value", + permission = "player.sethealth") public static class SetHealthCommand implements CommandHandler { @Override @@ -304,7 +306,8 @@ public final class PlayerCommands { } @Command(label = "clearartifacts", aliases = {"clearart"}, - usage = "Usage: clearartifacts", execution = Command.Execution.PLAYER) + usage = "clearartifacts", execution = Command.Execution.PLAYER, permission = "player.clearartifacts", + description = "Deletes all unequipped and unlocked level 0 artifacts, including yellow rarity ones from your inventory") public static class ClearArtifactsCommand implements CommandHandler { @Override @@ -317,4 +320,31 @@ public final class PlayerCommands { .forEach(item -> playerInventory.removeItem(item, item.getCount())); } } + + @Command(label = "sendservermessage", aliases = {"sendservmsg"}, + usage = "sendservermessage ", description = "Sends a message to a player as the server", + execution = Command.Execution.PLAYER, permission = "server.sendmessage") + public static class SendServerMessageCommand implements CommandHandler { + @Override + public void execute(GenshinPlayer player, List args) { + if(args.size() < 2) { + CommandHandler.sendMessage(null, "Usage: sendmessage "); return; + } + + try { + int target = Integer.parseInt(args.get(0)); + String message = String.join(" ", args.subList(1, args.size())); + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerById(target); + if(targetPlayer == null) { + CommandHandler.sendMessage(null, "Player not found."); return; + } + + targetPlayer.dropMessage(message); + CommandHandler.sendMessage(null, "Message sent."); + } catch (NumberFormatException ignored) { + CommandHandler.sendMessage(null, "Invalid player ID."); + } + } + } } diff --git a/src/main/java/emu/grasscutter/commands/ServerCommands.java b/src/main/java/emu/grasscutter/commands/ServerCommands.java index 1262fae97..052bb149e 100644 --- a/src/main/java/emu/grasscutter/commands/ServerCommands.java +++ b/src/main/java/emu/grasscutter/commands/ServerCommands.java @@ -1,10 +1,15 @@ package emu.grasscutter.commands; +import com.mongodb.internal.connection.CommandHelper; import emu.grasscutter.Grasscutter; import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.game.Account; import emu.grasscutter.game.GenshinPlayer; +import emu.grasscutter.server.packet.send.PacketSceneKickPlayerRsp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -12,7 +17,7 @@ import java.util.stream.Collectors; * A container for server-related commands. */ public final class ServerCommands { - @Command(label = "reload", usage = "Usage: reload") + @Command(label = "reload", usage = "reload", description = "Reload server config", permission = "server.reload") public static class ReloadCommand implements CommandHandler { @Override @@ -25,12 +30,78 @@ public final class ServerCommands { @Override public void execute(GenshinPlayer player, List args) { + CommandHandler.sendMessage(player, "Reloading config."); this.execute(args); + CommandHandler.sendMessage(player, "Reload complete."); } } - + + @Command(label = "kick", usage = "kick ", description = "Kicks the specified player from the server (WIP)", permission = "server.kick") + public static class KickCommand implements CommandHandler { + @Override + public void execute(List args) { + int target = Integer.parseInt(args.get(0)); + String message = String.join(" ", args.subList(1, args.size())); + + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerById(target); + if(targetPlayer == null) { + CommandHandler.sendMessage(null, "Player not found."); return; + } + + targetPlayer.sendPacket(new PacketSceneKickPlayerRsp(targetPlayer.getId())); + //targetPlayer.getSession().close(); + } + } + + @Command(label = "stop", usage = "stop", description = "Stops the server", permission = "server.stop") + public static class StopCommand implements CommandHandler { + @Override + public void execute(List args) { + Grasscutter.getLogger().info("Server shutting down..."); + for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { + p.dropMessage("Server shutting down..."); + } + + System.exit(1); + } + } + + @Command(label = "broadcast", aliases = {"b"}, + usage = "broadcast ", description = "Sends a message to all the players", permission = "server.broadcast") + public static class BroadcastCommand implements CommandHandler { + @Override + public void execute(List args) { + if(args.size() < 1) { + CommandHandler.sendMessage(null, "Usage: broadcast "); return; + } + + String message = String.join(" ", args.subList(0, args.size())); + + for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { + p.dropMessage(message); + } + + CommandHandler.sendMessage(null, "Message sent."); + } + + @Override + public void execute(GenshinPlayer player, List args) { + if(args.size() < 1) { + CommandHandler.sendMessage(player, "Usage: broadcast "); return; + } + + String message = String.join(" ", args.subList(0, args.size())); + + for (GenshinPlayer p : Grasscutter.getGameServer().getPlayers().values()) { + p.dropMessage(message); + } + + CommandHandler.sendMessage(player, "Message sent."); + } + } + @Command(label = "sendmessage", aliases = {"sendmsg", "msg"}, - usage = "Usage: sendmessage ") + usage = "sendmessage ", description = "Sends a message to a player") public static class SendMessageCommand implements CommandHandler { @Override @@ -79,8 +150,8 @@ public final class ServerCommands { } @Command(label = "account", - usage = "Usage: account [uid]", - execution = Command.Execution.CONSOLE) + usage = "account [uid]", + description = "Modify user accounts", execution = Command.Execution.CONSOLE) public static class AccountCommand implements CommandHandler { @Override @@ -124,8 +195,8 @@ public final class ServerCommands { } @Command(label = "permission", - usage = "Usage: permission ", - execution = Command.Execution.CONSOLE) + usage = "permission ", + description = "Grants or removes a permission for a user", permission = "*") public static class PermissionCommand implements CommandHandler { @Override @@ -164,50 +235,93 @@ public final class ServerCommands { } @Command(label = "help", - usage = "Usage: help [command]") + usage = "help [command]", description = "Sends the help message or shows information about a specified command") public static class HelpCommand implements CommandHandler { @Override public void execute(List args) { - List handlers = CommandMap.getInstance().getHandlers(); - List annotations = handlers.stream() - .map(handler -> handler.getClass().getAnnotation(Command.class)) - .collect(Collectors.toList()); - - if(args.size() < 1) { - StringBuilder builder = new StringBuilder("Available commands:\n"); - annotations.forEach(annotation -> builder.append(annotation.usage()).append("\n")); - CommandHandler.sendMessage(null, builder.toString()); - } else { - String command = args.get(0); - CommandHandler handler = CommandMap.getInstance().getHandler(command); - if(handler == null) { - CommandHandler.sendMessage(null, "Command not found."); return; - } - - Command annotation = handler.getClass().getAnnotation(Command.class); - CommandHandler.sendMessage(null, annotation.usage()); - } + this.execute(null, args); } @Override public void execute(GenshinPlayer player, List args) { - List handlers = CommandMap.getInstance().getHandlers(); - List annotations = handlers.stream() - .map(handler -> handler.getClass().getAnnotation(Command.class)) - .collect(Collectors.toList()); - if(args.size() < 1) { - annotations.forEach(annotation -> player.dropMessage(annotation.usage())); + HashMap handlers = CommandMap.getInstance().getHandlers(); + List annotations = new ArrayList(); + for(String key : handlers.keySet()) { + Command annotation = handlers.get(key).getClass().getAnnotation(Command.class); + + if(!Arrays.asList(annotation.aliases()).contains(key)) { + if(player != null && annotation.permission() != "" && !player.getAccount().hasPermission(annotation.permission())) continue; + annotations.add(annotation); + } + } + + + SendAllHelpMessage(player, annotations); } else { String command = args.get(0); CommandHandler handler = CommandMap.getInstance().getHandler(command); + StringBuilder builder = new StringBuilder(player == null ? "\nHelp - " : "Help - ").append(command).append(": \n"); if(handler == null) { - CommandHandler.sendMessage(player, "Command not found."); return; + builder.append("No command found."); + } else { + Command annotation = handler.getClass().getAnnotation(Command.class); + + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if(annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + if(player != null && annotation.permission() != "" && !player.getAccount().hasPermission(annotation.permission())) { + builder.append("\n Warning: You do not have permission to run this command."); + } } - Command annotation = handler.getClass().getAnnotation(Command.class); - CommandHandler.sendMessage(player, annotation.usage()); + CommandHandler.sendMessage(player, builder.toString()); + } + } + + void SendAllHelpMessage(GenshinPlayer player, List annotations) { + if(player == null) { + StringBuilder builder = new StringBuilder("\nAvailable commands:\n"); + annotations.forEach(annotation -> { + if (annotation.execution() != (player == null ? Command.Execution.PLAYER : Command.Execution.CONSOLE)) { + builder.append(annotation.label()).append("\n"); + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if (annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + + builder.append("\n"); + } + }); + + CommandHandler.sendMessage(null, builder.toString()); + } else { + CommandHandler.sendMessage(player, "Available commands:"); + annotations.forEach(annotation -> { + if (annotation.execution() != (player == null ? Command.Execution.PLAYER : Command.Execution.CONSOLE)) { + StringBuilder builder = new StringBuilder(annotation.label()).append("\n"); + builder.append(" ").append(annotation.description()).append("\n"); + builder.append(" Usage: ").append(annotation.usage()); + if (annotation.aliases().length >= 1) { + builder.append("\n").append(" Aliases: "); + for (String alias : annotation.aliases()) { + builder.append(alias).append(" "); + } + } + + CommandHandler.sendMessage(player, builder.toString()); + } + }); } } } diff --git a/src/main/java/emu/grasscutter/game/Account.java b/src/main/java/emu/grasscutter/game/Account.java index dffbb0d86..2eeeed3b1 100644 --- a/src/main/java/emu/grasscutter/game/Account.java +++ b/src/main/java/emu/grasscutter/game/Account.java @@ -105,6 +105,10 @@ public class Account { if(this.permissions.contains(permission)) return false; this.permissions.add(permission); return true; } + + public boolean hasPermission(String permission) { + return this.permissions.contains(permission) || this.permissions.contains("*") ? true : false; + } public boolean removePermission(String permission) { return this.permissions.remove(permission); From dfc956a19f5424e46688a2e11fc05de2a79e63e1 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Tue, 19 Apr 2022 18:55:49 +0800 Subject: [PATCH 02/14] Modified the new commands to be compliant with my changes --- .../java/emu/grasscutter/commands/PlayerCommands.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/PlayerCommands.java b/src/main/java/emu/grasscutter/commands/PlayerCommands.java index ebe72e6ae..f7135dac9 100644 --- a/src/main/java/emu/grasscutter/commands/PlayerCommands.java +++ b/src/main/java/emu/grasscutter/commands/PlayerCommands.java @@ -180,7 +180,8 @@ public final class PlayerCommands { } } - @Command(label = "givechar", aliases = { "givec" }, usage = "Usage: givechar [level]") + @Command(label = "givechar", aliases = { "givec" }, usage = "givechar [level]", + description = "Gives the player a specified character", permission = "player.givechar") public static class GiveCharCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { int target, avatarID, level = 1, ascension = 1; @@ -435,8 +436,9 @@ public final class PlayerCommands { } } - @Command(label = "setworldlevel", aliases = {"setworldlvl"}, - usage = "Usage: setworldlevel ", execution = Command.Execution.PLAYER) + @Command(label = "setworldlevel", aliases = {"setworldlvl"}, usage = "setworldlevel ", + description = "Sets your world level (Relog to see proper effects)", permission = "player.setworldlevel", + execution = Command.Execution.PLAYER) public static class SetWorldLevelCommand implements CommandHandler { @Override public void execute(GenshinPlayer player, List args) { From 1db13a6fa9867fbf0a7e1ce133fa2f29ce7b69c8 Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Tue, 19 Apr 2022 19:48:26 +0800 Subject: [PATCH 03/14] Constellation fix --- .../emu/grasscutter/game/managers/InventoryManager.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/managers/InventoryManager.java b/src/main/java/emu/grasscutter/game/managers/InventoryManager.java index 3d56dfad2..d98f917e2 100644 --- a/src/main/java/emu/grasscutter/game/managers/InventoryManager.java +++ b/src/main/java/emu/grasscutter/game/managers/InventoryManager.java @@ -471,7 +471,7 @@ public class InventoryManager { } // Consume weapon - player.getInventory().removeItem(feed); + player.getInventory().removeItem(feed, 1); // Get weapon.setRefinement(targetRefineLevel); @@ -804,7 +804,11 @@ public class InventoryManager { // Get talent int currentTalentLevel = avatar.getCoreProudSkillLevel(); int nextTalentId = ((avatar.getAvatarId() % 10000000) * 10) + currentTalentLevel + 1; - AvatarTalentData talentData = GenshinData.getAvatarTalentDataMap().get(nextTalentId); + + if (avatar.getAvatarId() == 10000006) { + // Lisa is special in that her talentId starts with 4 instead of 6. + nextTalentId = 40 + currentTalentLevel + 1; + } if (talentData == null) { return; From 4b279b45e03979527ba009bfb21470d715658f15 Mon Sep 17 00:00:00 2001 From: xmplay <81370285+xmplay@users.noreply.github.com> Date: Tue, 19 Apr 2022 13:03:43 +0100 Subject: [PATCH 04/14] Update PacketPlayerEnterSceneNotify.java --- .../server/packet/send/PacketPlayerEnterSceneNotify.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java index 69ca9cb5f..e2db99153 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerEnterSceneNotify.java @@ -59,6 +59,7 @@ public class PacketPlayerEnterSceneNotify extends GenshinPacket { .setEnterReason(reason.getValue()) .addSceneTagIdList(102) .addSceneTagIdList(107) + .addSceneTagIdList(109) .addSceneTagIdList(113) .addSceneTagIdList(117) .setUnk1(1) From 5fcecfc73420390651847aaeaa30b2f54bbb613f Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Tue, 19 Apr 2022 20:05:45 +0800 Subject: [PATCH 05/14] talentData sorry again, forgot to add --- .../java/emu/grasscutter/game/managers/InventoryManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/emu/grasscutter/game/managers/InventoryManager.java b/src/main/java/emu/grasscutter/game/managers/InventoryManager.java index d98f917e2..935652d77 100644 --- a/src/main/java/emu/grasscutter/game/managers/InventoryManager.java +++ b/src/main/java/emu/grasscutter/game/managers/InventoryManager.java @@ -810,6 +810,8 @@ public class InventoryManager { nextTalentId = 40 + currentTalentLevel + 1; } + AvatarTalentData talentData = GenshinData.getAvatarTalentDataMap().get(nextTalentId); + if (talentData == null) { return; } From 1df7665e3e12fa8972e34c021fbc375339240d52 Mon Sep 17 00:00:00 2001 From: xmplay <81370285+xmplay@users.noreply.github.com> Date: Tue, 19 Apr 2022 13:23:57 +0100 Subject: [PATCH 06/14] Updated Banners.json with the latest banners (19 Apr) --- data/Banners.json | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/data/Banners.json b/data/Banners.json index 163319f5e..959a8b436 100644 --- a/data/Banners.json +++ b/data/Banners.json @@ -17,39 +17,24 @@ "gachaType": 301, "scheduleId": 903, "bannerType": "EVENT", - "prefabPath": "GachaShowPanel_A076", - "previewPrefabPath": "UI_Tab_GachaShowPanel_A076", - "titlePath": "UI_GACHA_SHOW_PANEL_A076_TITLE", + "prefabPath": "GachaShowPanel_A079", + "previewPrefabPath": "UI_Tab_GachaShowPanel_A079", + "titlePath": "UI_GACHA_SHOW_PANEL_A079_TITLE", "costItem": 223, "beginTime": 0, "endTime": 1924992000, "sortId": 9998, "maxItemType": 1, - "rateUpItems1": [1066], - "rateUpItems2": [1023, 1043, 1064] - }, - { - "gachaType": 400, - "scheduleId": 913, - "bannerType": "EVENT", - "prefabPath": "GachaShowPanel_A077", - "previewPrefabPath": "UI_Tab_GachaShowPanel_A077", - "titlePath": "UI_Tab_GachaShowPanel_A077", - "costItem": 223, - "beginTime": 0, - "endTime": 1924992000, - "sortId": 9998, - "maxItemType": 1, - "rateUpItems1": [1022], - "rateUpItems2": [1023, 1043, 1064] + "rateUpItems1": [1002], + "rateUpItems2": [1053, 1020, 1045] }, { "gachaType": 302, - "scheduleId": 923, + "scheduleId": 913, "bannerType": "WEAPON", - "prefabPath": "GachaShowPanel_A078", - "previewPrefabPath": "UI_Tab_GachaShowPanel_A078", - "titlePath": "UI_GACHA_SHOW_PANEL_A078_TITLE", + "prefabPath": "GachaShowPanel_A080", + "previewPrefabPath": "UI_Tab_GachaShowPanel_A080", + "titlePath": "UI_GACHA_SHOW_PANEL_A080_TITLE", "costItem": 223, "beginTime": 0, "endTime": 1924992000, @@ -58,7 +43,7 @@ "eventChance": 75, "softPity": 80, "hardPity": 80, - "rateUpItems1": [11510, 15503], - "rateUpItems2": [11402, 12403, 13401, 14402, 15405] + "rateUpItems1": [11509, 12504], + "rateUpItems2": [11401, 12402, 13407, 14401, 15401] } -] \ No newline at end of file +] From f54cfc6c7543d3a87e450e7e7c253b099ec09462 Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Tue, 19 Apr 2022 20:36:15 +0800 Subject: [PATCH 07/14] Fixed an issue with kicking players (Still broken but now it actually disconnects the player) --- .../grasscutter/commands/ServerCommands.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/ServerCommands.java b/src/main/java/emu/grasscutter/commands/ServerCommands.java index 67c33338c..a4014be57 100644 --- a/src/main/java/emu/grasscutter/commands/ServerCommands.java +++ b/src/main/java/emu/grasscutter/commands/ServerCommands.java @@ -40,16 +40,26 @@ public final class ServerCommands { public static class KickCommand implements CommandHandler { @Override public void execute(List args) { + this.execute(null, args); + } + + @Override + public void execute(GenshinPlayer player, List args) { int target = Integer.parseInt(args.get(0)); String message = String.join(" ", args.subList(1, args.size())); - GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerById(target); + GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); if(targetPlayer == null) { - CommandHandler.sendMessage(null, "Player not found."); return; + CommandHandler.sendMessage(player, "Player not found."); + return; + } + if(player != null) { + CommandHandler.sendMessage(null, String.format("Player [%s:%s] has kicked player [%s:%s]", player.getAccount().getPlayerId(), player.getAccount().getUsername(), target, targetPlayer.getAccount().getUsername())); } - targetPlayer.sendPacket(new PacketSceneKickPlayerRsp(targetPlayer.getId())); - //targetPlayer.getSession().close(); + CommandHandler.sendMessage(player, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); + + targetPlayer.getSession().close(); } } From e1257739b780bce774b5e360f900f50b946bb4fd Mon Sep 17 00:00:00 2001 From: OtakuNekoP Date: Tue, 19 Apr 2022 14:48:03 +0200 Subject: [PATCH 08/14] skip beta server device id verify --- .../java/emu/grasscutter/server/dispatch/DispatchServer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java index da90caa42..0ac4c4fc8 100644 --- a/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java +++ b/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java @@ -389,6 +389,10 @@ public final class DispatchServer { "/sdk/upload", new DispatchHttpJsonHandler("{\"code\":0}") ); + server.createContext( // /perf/config/verify?device_id=xxx&platform=x&name=xxx + "/perf/config/verify", + new DispatchHttpJsonHandler("{\"code\":0}") + ); // Start server server.start(); Grasscutter.getLogger().info("Dispatch server started on port " + getAddress().getPort()); From ac6ae1178dcc17acaf5f8202edd6550cdd30231e Mon Sep 17 00:00:00 2001 From: ayy lmao Date: Tue, 19 Apr 2022 19:21:14 +0300 Subject: [PATCH 09/14] Fix folder seperators --- src/main/java/emu/grasscutter/data/ResourceLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/data/ResourceLoader.java b/src/main/java/emu/grasscutter/data/ResourceLoader.java index f5b9f4f72..f50067c65 100644 --- a/src/main/java/emu/grasscutter/data/ResourceLoader.java +++ b/src/main/java/emu/grasscutter/data/ResourceLoader.java @@ -197,7 +197,7 @@ public class ResourceLoader { } else { Map map = new TreeMap<>(); java.lang.reflect.Type type = new TypeToken>() {}.getType(); - String[] folderNames = {"BinOutput\\Talent\\EquipTalents\\", "BinOutput\\Talent\\AvatarTalents\\"}; + String[] folderNames = {"BinOutput/Talent/EquipTalents/", "BinOutput/Talent/AvatarTalents/"}; for (String name : folderNames) { File folder = new File(Utils.toFilePath(Grasscutter.getConfig().RESOURCE_FOLDER + name)); From f739ddb29ea1de36bcd455421c53ff0faf526c52 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 00:40:44 +0800 Subject: [PATCH 10/14] Delete run.bat --- run.bat | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 run.bat diff --git a/run.bat b/run.bat deleted file mode 100644 index 36530cf77..000000000 --- a/run.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off - - - -::This will not work if your java is in a different location, plugin as necessary -::this just saves you from changing your PATH -"C:\Program Files\Java\jdk1.8.0_202\bin\java.exe" -jar ./grasscutter.jar \ No newline at end of file From c2a2f569efd279eed0de0c5b3f1797d189060fd1 Mon Sep 17 00:00:00 2001 From: Jaida Wu Date: Wed, 20 Apr 2022 00:43:01 +0800 Subject: [PATCH 11/14] Make overseauspider.yuanshen.com reachable * Since DispatchServer has handled the server correctly, so it should not be invalidated: https://github.com/Melledy/Grasscutter/blob/main/src/main/java/emu/grasscutter/server/dispatch/DispatchServer.java#L402 --- proxy.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/proxy.py b/proxy.py index 1961c90dc..b352af3ac 100644 --- a/proxy.py +++ b/proxy.py @@ -20,7 +20,7 @@ # ## -from mitmproxy import ctx, http +from mitmproxy import http class MlgmXyysd_Genshin_Impact_Proxy: @@ -53,16 +53,13 @@ class MlgmXyysd_Genshin_Impact_Proxy: "hk4e-sdk-os-static.hoyoverse.com", "sdk-os-static.hoyoverse.com", "api-account-os.hoyoverse.com", - "hk4e-sdk-os.hoyoverse.com" + "hk4e-sdk-os.hoyoverse.com", + "overseauspider.yuanshen.com" ] - if flow.request.url.startswith("http://overseauspider.yuanshen.com:8888/log"): - ctx.log.info("Block overseauspider.yuanshen.com") - flow.response = http.HTTPResponse.make(404) - elif flow.request.host in LIST_DOMAINS: - ctx.log.info("Redirect " + flow.request.host) + if flow.request.host in LIST_DOMAINS: flow.request.host = REMOTE_HOST addons = [ MlgmXyysd_Genshin_Impact_Proxy() -] \ No newline at end of file +] From b7a7c8e41a2ea02fad0aada2e5b169febfcb1a1c Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Tue, 19 Apr 2022 10:23:08 -0700 Subject: [PATCH 12/14] Remove protos From 14da6c474b18fa0592ab688205f3aff8ce23b71d Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Tue, 19 Apr 2022 10:26:31 -0700 Subject: [PATCH 13/14] Protos --- .gitmodules | 3 +++ Grasscutter-Protos | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 Grasscutter-Protos diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..fbab9b375 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Grasscutter-Protos"] + path = Grasscutter-Protos + url = https://github.com/Melledy/Grasscutter-Protos diff --git a/Grasscutter-Protos b/Grasscutter-Protos new file mode 160000 index 000000000..0537e9cc4 --- /dev/null +++ b/Grasscutter-Protos @@ -0,0 +1 @@ +Subproject commit 0537e9cc4c7856a7c6f88bbbaa908a80c4ee677e From 866941589bbaaa549db978104d7cac58dbfadea8 Mon Sep 17 00:00:00 2001 From: KingRainbow44 Date: Tue, 19 Apr 2022 14:11:48 -0400 Subject: [PATCH 14/14] Small updates to server commands --- .../grasscutter/commands/ServerCommands.java | 23 +++++++------------ .../java/emu/grasscutter/tools/Tools.java | 3 ++- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/main/java/emu/grasscutter/commands/ServerCommands.java b/src/main/java/emu/grasscutter/commands/ServerCommands.java index a4014be57..edeac6ca3 100644 --- a/src/main/java/emu/grasscutter/commands/ServerCommands.java +++ b/src/main/java/emu/grasscutter/commands/ServerCommands.java @@ -1,17 +1,11 @@ package emu.grasscutter.commands; -import com.mongodb.internal.connection.CommandHelper; import emu.grasscutter.Grasscutter; import emu.grasscutter.database.DatabaseHelper; import emu.grasscutter.game.Account; import emu.grasscutter.game.GenshinPlayer; -import emu.grasscutter.server.packet.send.PacketSceneKickPlayerRsp; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.stream.Collectors; +import java.util.*; /** * A container for server-related commands. @@ -46,18 +40,17 @@ public final class ServerCommands { @Override public void execute(GenshinPlayer player, List args) { int target = Integer.parseInt(args.get(0)); - String message = String.join(" ", args.subList(1, args.size())); GenshinPlayer targetPlayer = Grasscutter.getGameServer().getPlayerByUid(target); if(targetPlayer == null) { CommandHandler.sendMessage(player, "Player not found."); return; } + if(player != null) { CommandHandler.sendMessage(null, String.format("Player [%s:%s] has kicked player [%s:%s]", player.getAccount().getPlayerId(), player.getAccount().getUsername(), target, targetPlayer.getAccount().getUsername())); } - - CommandHandler.sendMessage(player, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); + CommandHandler.sendMessage(player, String.format("Kicking player [%s:%s]", target, targetPlayer.getAccount().getUsername())); targetPlayer.getSession().close(); } @@ -259,12 +252,12 @@ public final class ServerCommands { public void execute(GenshinPlayer player, List args) { if(args.size() < 1) { HashMap handlers = CommandMap.getInstance().getHandlers(); - List annotations = new ArrayList(); + List annotations = new ArrayList<>(); for(String key : handlers.keySet()) { Command annotation = handlers.get(key).getClass().getAnnotation(Command.class); if(!Arrays.asList(annotation.aliases()).contains(key)) { - if(player != null && annotation.permission() != "" && !player.getAccount().hasPermission(annotation.permission())) continue; + if(player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) continue; annotations.add(annotation); } } @@ -288,7 +281,7 @@ public final class ServerCommands { builder.append(alias).append(" "); } } - if(player != null && annotation.permission() != "" && !player.getAccount().hasPermission(annotation.permission())) { + if(player != null && !Objects.equals(annotation.permission(), "") && !player.getAccount().hasPermission(annotation.permission())) { builder.append("\n Warning: You do not have permission to run this command."); } } @@ -301,7 +294,7 @@ public final class ServerCommands { if(player == null) { StringBuilder builder = new StringBuilder("\nAvailable commands:\n"); annotations.forEach(annotation -> { - if (annotation.execution() != (player == null ? Command.Execution.PLAYER : Command.Execution.CONSOLE)) { + if (annotation.execution() != Command.Execution.PLAYER) { builder.append(annotation.label()).append("\n"); builder.append(" ").append(annotation.description()).append("\n"); builder.append(" Usage: ").append(annotation.usage()); @@ -320,7 +313,7 @@ public final class ServerCommands { } else { CommandHandler.sendMessage(player, "Available commands:"); annotations.forEach(annotation -> { - if (annotation.execution() != (player == null ? Command.Execution.PLAYER : Command.Execution.CONSOLE)) { + if (annotation.execution() != Command.Execution.CONSOLE) { StringBuilder builder = new StringBuilder(annotation.label()).append("\n"); builder.append(" ").append(annotation.description()).append("\n"); builder.append(" Usage: ").append(annotation.usage()); diff --git a/src/main/java/emu/grasscutter/tools/Tools.java b/src/main/java/emu/grasscutter/tools/Tools.java index 2e4a7e153..6f6466773 100644 --- a/src/main/java/emu/grasscutter/tools/Tools.java +++ b/src/main/java/emu/grasscutter/tools/Tools.java @@ -21,6 +21,7 @@ import emu.grasscutter.data.def.AvatarData; import emu.grasscutter.data.def.ItemData; import emu.grasscutter.data.def.MonsterData; import emu.grasscutter.data.def.SceneData; +import emu.grasscutter.utils.Utils; public final class Tools { @@ -29,7 +30,7 @@ public final class Tools { ResourceLoader.loadResources(); Map map; - try (FileReader fileReader = new FileReader(Grasscutter.getConfig().RESOURCE_FOLDER + "TextMapEN.json")) { + try (FileReader fileReader = new FileReader(Utils.toFilePath(Grasscutter.getConfig().RESOURCE_FOLDER + "TextMap/TextMapEN.json"))) { map = Grasscutter.getGsonFactory().fromJson(fileReader, new TypeToken>() {}.getType()); }