From e789acfebcee1aa1a3c10395bf2ed5061c3c3ff7 Mon Sep 17 00:00:00 2001 From: haykam821 <24855774+haykam821@users.noreply.github.com> Date: Sun, 8 Dec 2024 14:24:30 -0500 Subject: [PATCH] Add administration subcommands (#23) * Add the add subcommand to the party command * Add the remove subcommand to the party command --- src/main/java/xyz/nucleoid/parties/Party.java | 14 ++-- .../xyz/nucleoid/parties/PartyCommand.java | 64 +++++++++++++++++++ .../xyz/nucleoid/parties/PartyManager.java | 42 +++++++++++- .../java/xyz/nucleoid/parties/PartyTexts.java | 8 +++ .../data/game_parties/lang/en_us.json | 2 + 5 files changed, 123 insertions(+), 7 deletions(-) diff --git a/src/main/java/xyz/nucleoid/parties/Party.java b/src/main/java/xyz/nucleoid/parties/Party.java index db93073..086ff02 100644 --- a/src/main/java/xyz/nucleoid/parties/Party.java +++ b/src/main/java/xyz/nucleoid/parties/Party.java @@ -29,9 +29,7 @@ public final class Party { void setOwner(PlayerRef owner) { this.owner = owner; - if (this.memberPlayers.add(owner)) { - this.members.add(owner); - } + this.add(owner); } boolean invite(PlayerRef player) { @@ -41,6 +39,12 @@ boolean invite(PlayerRef player) { return this.pendingMembers.add(player); } + void add(PlayerRef player) { + if (this.memberPlayers.add(player)) { + this.members.add(player); + } + } + boolean remove(PlayerRef player) { if (this.memberPlayers.remove(player)) { this.members.remove(player); @@ -51,9 +55,7 @@ boolean remove(PlayerRef player) { boolean acceptInvite(PlayerRef player) { if (this.pendingMembers.remove(player)) { - if (this.memberPlayers.add(player)) { - this.members.add(player); - } + this.add(player); return true; } return false; diff --git a/src/main/java/xyz/nucleoid/parties/PartyCommand.java b/src/main/java/xyz/nucleoid/parties/PartyCommand.java index 861c59a..7f96c67 100644 --- a/src/main/java/xyz/nucleoid/parties/PartyCommand.java +++ b/src/main/java/xyz/nucleoid/parties/PartyCommand.java @@ -50,6 +50,22 @@ public static void register(CommandDispatcher dispatcher) { ) .then(literal("leave").executes(PartyCommand::leave)) .then(literal("disband").executes(PartyCommand::disband)) + .then(literal("add") + .requires(source -> source.hasPermissionLevel(2)) + .then(argument("player", EntityArgumentType.player()) + .then(argument("owner", EntityArgumentType.player()) + .executes(PartyCommand::addPlayerByOwner) + ) + .then(argument("party", UuidArgumentType.uuid()) + .executes(PartyCommand::addPlayerByUuid) + ) + ) + ) + .then(literal("remove") + .requires(source -> source.hasPermissionLevel(2)) + .then(argument("player", EntityArgumentType.player()) + .executes(PartyCommand::removePlayer) + )) ); } // @formatter:on @@ -247,4 +263,52 @@ private static int disband(CommandContext ctx) throws Comma return Command.SINGLE_SUCCESS; } + + private static int addPlayerByOwner(CommandContext ctx) throws CommandSyntaxException { + var owner = EntityArgumentType.getPlayer(ctx, "owner"); + var partyManager = PartyManager.get(ctx.getSource().getServer()); + + return addPlayer(ctx, partyManager.getOrCreateOwnParty(PlayerRef.of(owner))); + } + + private static int addPlayerByUuid(CommandContext ctx) throws CommandSyntaxException { + var uuid = UuidArgumentType.getUuid(ctx, "party"); + var partyManager = PartyManager.get(ctx.getSource().getServer()); + + return addPlayer(ctx, partyManager.getParty(uuid)); + } + + private static int addPlayer(CommandContext ctx, Party party) throws CommandSyntaxException { + var source = ctx.getSource(); + var player = EntityArgumentType.getPlayer(ctx, "player"); + + var partyManager = PartyManager.get(source.getServer()); + var result = partyManager.addPlayer(PlayerRef.of(player), party); + if (result.isOk()) { + var message = PartyTexts.addSuccess(player); + party.getMemberPlayers().sendMessage(message.formatted(Formatting.GOLD)); + } else { + var error = result.error(); + source.sendError(PartyTexts.displayError(error, player)); + } + + return Command.SINGLE_SUCCESS; + } + + private static int removePlayer(CommandContext ctx) throws CommandSyntaxException { + var source = ctx.getSource(); + var player = EntityArgumentType.getPlayer(ctx, "player"); + + var partyManager = PartyManager.get(source.getServer()); + var result = partyManager.removePlayer(PlayerRef.of(player)); + if (result.isOk()) { + var message = PartyTexts.removeSuccess(player); + result.party().getMemberPlayers().sendMessage(message.formatted(Formatting.GOLD)); + } else { + var error = result.error(); + source.sendError(PartyTexts.displayError(error, player)); + } + + return Command.SINGLE_SUCCESS; + } } diff --git a/src/main/java/xyz/nucleoid/parties/PartyManager.java b/src/main/java/xyz/nucleoid/parties/PartyManager.java index 7e2ac9c..675713c 100644 --- a/src/main/java/xyz/nucleoid/parties/PartyManager.java +++ b/src/main/java/xyz/nucleoid/parties/PartyManager.java @@ -194,6 +194,45 @@ public void disbandParty(Party party) { } } + public PartyResult addPlayer(PlayerRef player, @Nullable Party party) { + if (party == null) { + return PartyResult.err(PartyError.DOES_NOT_EXIST); + } + + var oldParty = this.getParty(player); + if (party == oldParty) { + return PartyResult.err(PartyError.ALREADY_IN_PARTY); + } else if (oldParty != null) { + if (party.isOwner(player)) { + this.disbandParty(player); + } else if (party.remove(player)) { + this.playerToParty.remove(player, party); + } + } + + this.playerToParty.put(player, party); + if (!party.acceptInvite(player)) { + party.add(player); + } + + return PartyResult.ok(party); + } + + public PartyResult removePlayer(PlayerRef player) { + var party = this.getParty(player); + if (party == null) { + return PartyResult.err(PartyError.NOT_IN_PARTY); + } + + if (party.isOwner(player)) { + this.disbandParty(player); + } else if (party.remove(player)) { + this.playerToParty.remove(player, party); + } + + return PartyResult.ok(party); + } + @Nullable public Party getParty(PlayerRef player) { return this.playerToParty.get(player); @@ -219,7 +258,8 @@ public Party getOwnParty(PlayerRef owner) { return null; } - private Party getOrCreateOwnParty(PlayerRef owner) { + @Nullable + Party getOrCreateOwnParty(PlayerRef owner) { var party = this.playerToParty.computeIfAbsent(owner, this::createParty); if (party.isOwner(owner)) { return party; diff --git a/src/main/java/xyz/nucleoid/parties/PartyTexts.java b/src/main/java/xyz/nucleoid/parties/PartyTexts.java index 792a3bd..971a140 100644 --- a/src/main/java/xyz/nucleoid/parties/PartyTexts.java +++ b/src/main/java/xyz/nucleoid/parties/PartyTexts.java @@ -39,6 +39,14 @@ public static MutableText disbandSuccess() { return Text.translatable("text.game_parties.party.disband.success"); } + public static MutableText addSuccess(ServerPlayerEntity player) { + return Text.translatable("text.game_parties.party.add.success", player.getDisplayName()); + } + + public static MutableText removeSuccess(ServerPlayerEntity player) { + return Text.translatable("text.game_parties.party.remove.success", player.getDisplayName()); + } + public static MutableText transferredSender(ServerPlayerEntity transferredTo) { return Text.translatable("text.game_parties.party.transferred.sender", transferredTo.getDisplayName()); } diff --git a/src/main/resources/data/game_parties/lang/en_us.json b/src/main/resources/data/game_parties/lang/en_us.json index 4d7269b..f2eac95 100644 --- a/src/main/resources/data/game_parties/lang/en_us.json +++ b/src/main/resources/data/game_parties/lang/en_us.json @@ -1,4 +1,5 @@ { + "text.game_parties.party.add.success": "%s has been added to the party!", "text.game_parties.party.disband.success": "Your party has been disbanded!", "text.game_parties.party.error.already_in_party": "You are already in this party!", "text.game_parties.party.error.already_invited": "%s is already invited to this party!", @@ -20,6 +21,7 @@ "text.game_parties.party.list.member.type.owner": "owner", "text.game_parties.party.list.member.type.pending": "pending", "text.game_parties.party.list.none": "There are no parties!", + "text.game_parties.party.remove.success": "%s has been removed from the party", "text.game_parties.party.transferred.receiver": "%s's party has been transferred to you", "text.game_parties.party.transferred.sender": "Your party has been transferred to %s", "text.game_parties.party.left_game": "%s left the game and has been removed from the party!"