From e5ff253624aa13b2cd74817bbc4215a8ad3c2788 Mon Sep 17 00:00:00 2001 From: Melledy <52122272+Melledy@users.noreply.github.com> Date: Fri, 22 Jul 2022 09:26:00 -0700 Subject: [PATCH] Add `unlockall` command to unlock all openstates --- .../command/commands/UnlockAllCommand.java | 35 +++++++++++++++++++ .../send/PacketOpenStateChangeNotify.java | 15 +++++++- src/main/resources/languages/en-US.json | 4 +++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/main/java/emu/grasscutter/command/commands/UnlockAllCommand.java diff --git a/src/main/java/emu/grasscutter/command/commands/UnlockAllCommand.java b/src/main/java/emu/grasscutter/command/commands/UnlockAllCommand.java new file mode 100644 index 000000000..a9b76e5c3 --- /dev/null +++ b/src/main/java/emu/grasscutter/command/commands/UnlockAllCommand.java @@ -0,0 +1,35 @@ +package emu.grasscutter.command.commands; + +import emu.grasscutter.command.Command; +import emu.grasscutter.command.CommandHandler; +import emu.grasscutter.game.player.Player; +import emu.grasscutter.game.props.OpenState; +import emu.grasscutter.server.packet.send.PacketOpenStateChangeNotify; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static emu.grasscutter.utils.Language.translate; + +@Command(label = "unlockall", usage = {""}, permission = "player.unlockall", permissionTargeted = "player.unlockall.others") +public final class UnlockAllCommand implements CommandHandler { + + @Override + public void execute(Player sender, Player targetPlayer, List args) { + Map changed = new HashMap<>(); + + for (OpenState state : OpenState.values()) { + if (state == OpenState.OPEN_STATE_NONE || state == OpenState.OPEN_STATE_LIMIT_REGION_GLOBAL) continue; + + if (targetPlayer.getOpenStateManager().getOpenStateMap().getOrDefault(state.getValue(), 0) == 0) { + targetPlayer.getOpenStateManager().getOpenStateMap().put(state.getValue(), 1); + changed.put(state.getValue(), 1); + } + } + + targetPlayer.sendPacket(new PacketOpenStateChangeNotify(changed)); + + CommandHandler.sendMessage(sender, translate(sender, "commands.unlockall.success", targetPlayer.getNickname())); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketOpenStateChangeNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketOpenStateChangeNotify.java index 902caebcb..5e2c12d04 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketOpenStateChangeNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketOpenStateChangeNotify.java @@ -1,5 +1,7 @@ package emu.grasscutter.server.packet.send; +import java.util.Map; + import emu.grasscutter.net.packet.BasePacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.OpenStateChangeNotifyOuterClass.OpenStateChangeNotify; @@ -11,7 +13,18 @@ public class PacketOpenStateChangeNotify extends BasePacket { super(PacketOpcodes.OpenStateChangeNotify); OpenStateChangeNotify proto = OpenStateChangeNotify.newBuilder() - .putOpenStateMap(openState,value).build(); + .putOpenStateMap(openState, value) + .build(); + + this.setData(proto); + } + + public PacketOpenStateChangeNotify(Map map) { + super(PacketOpcodes.OpenStateChangeNotify); + + OpenStateChangeNotify proto = OpenStateChangeNotify.newBuilder() + .putAllOpenStateMap(map) + .build(); this.setData(proto); } diff --git a/src/main/resources/languages/en-US.json b/src/main/resources/languages/en-US.json index 1815b5139..d3aca0349 100644 --- a/src/main/resources/languages/en-US.json +++ b/src/main/resources/languages/en-US.json @@ -326,6 +326,10 @@ "invalid_time": "Unable to parse timestamp.", "description": "Ban a player" }, + "unlockall": { + "success": "Unlocked all open states for %s.", + "description": "Unlocks all open states for a player." + }, "unban": { "success": "Successful.", "failure": "Failed, player not found.",