From dc148070966d578e15cf57d9ab453880d03895d4 Mon Sep 17 00:00:00 2001 From: david Date: Sun, 29 Dec 2024 15:45:23 +0100 Subject: [PATCH] Add skin layer toggle and visibility commands This commit introduces new commands to toggle skin layer visibility for characters, allowing layers to be shown or hidden. It also updates the message bundle with corresponding feedback messages for these actions. --- .../plugin/command/CharacterSkinCommand.java | 73 ++++++++++++++++++- src/main/resources/messages.properties | 3 + 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/thenextlvl/character/plugin/command/CharacterSkinCommand.java b/src/main/java/net/thenextlvl/character/plugin/command/CharacterSkinCommand.java index f37bd6a..a159198 100644 --- a/src/main/java/net/thenextlvl/character/plugin/command/CharacterSkinCommand.java +++ b/src/main/java/net/thenextlvl/character/plugin/command/CharacterSkinCommand.java @@ -1,14 +1,85 @@ package net.thenextlvl.character.plugin.command; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; import io.papermc.paper.command.brigadier.CommandSourceStack; import io.papermc.paper.command.brigadier.Commands; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.thenextlvl.character.PlayerCharacter; import net.thenextlvl.character.plugin.CharacterPlugin; +import net.thenextlvl.character.plugin.command.argument.EnumArgument; +import net.thenextlvl.character.skin.SkinLayer; +import net.thenextlvl.character.skin.SkinPartBuilder; import org.jspecify.annotations.NullMarked; +import static net.thenextlvl.character.plugin.command.CharacterCommand.playerCharacterArgument; + @NullMarked class CharacterSkinCommand { static LiteralArgumentBuilder create(CharacterPlugin plugin) { - return Commands.literal("skin"); + return Commands.literal("skin") + .then(layer(plugin)) + .then(reset(plugin)) + .then(set(plugin)); + } + + + private static ArgumentBuilder layer(CharacterPlugin plugin) { + return Commands.literal("layer") + .then(layer("hide", plugin, false)) + .then(layer("show", plugin, true)); + } + + private static LiteralArgumentBuilder layer(String name, CharacterPlugin plugin, boolean visible) { + return Commands.literal(name).then(layerArgument(plugin).then(playerCharacterArgument(plugin) + .executes(context -> layerToggle(context, plugin, visible)))); + } + + private static ArgumentBuilder layerArgument(CharacterPlugin plugin) { + return Commands.argument("layer", new EnumArgument<>(SkinLayer.class)); + } + + private static ArgumentBuilder reset(CharacterPlugin plugin) { + return Commands.literal("reset").then(playerCharacterArgument(plugin)); + } + + private static ArgumentBuilder set(CharacterPlugin plugin) { + return Commands.literal("set").then(playerCharacterArgument(plugin)); + } + + private static int layerToggle(CommandContext context, CharacterPlugin plugin, boolean visible) { + var sender = context.getSource().getSender(); + var name = context.getArgument("character", String.class); + var character = plugin.characterController().getCharacter(name).orElse(null); + + if (character == null) { + plugin.bundle().sendMessage(sender, "character.not_found", Placeholder.unparsed("name", name)); + return 0; + } + + if (!(character instanceof PlayerCharacter player)) { + plugin.bundle().sendMessage(sender, "character.not_player"); + return 0; + } + + var layer = context.getArgument("layer", SkinLayer.class); + var skinParts = SkinPartBuilder.of(player.getSkinParts()).toggle(layer, visible).build(); + + if (skinParts.equals(player.getSkinParts())) { + plugin.bundle().sendMessage(sender, "nothing.changed"); + return 0; + } + + player.setSkinParts(skinParts); + + var message = visible ? "character.skin_layer.shown" : "character.skin_layer.hidden"; + plugin.bundle().sendMessage(sender, message, + Placeholder.component("layer", Component.translatable(layer)), + Placeholder.unparsed("character", name)); + + return Command.SINGLE_SUCCESS; } } diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 9dbf4cd..358f6cb 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -5,7 +5,10 @@ character.list.empty= There are no characters yet character.list= () [ Click to teleport'>'> | Click to delete'>'>🗑 ] character.name.too-long= Name cannot be longer than 16 characters character.not_found= A character named does not exist +character.not_player= You have to provide a player character character.pose= Changed pose of to +character.skin_layer.shown= The of is now visible +character.skin_layer.hidden= The of is now hidden character.tag.hidden= The name tag of is no longer visible character.tag.reset= Reset the name tag of character.tag.set= Set the name tag to