Skip to content

Commit

Permalink
Add skin layer toggle and visibility commands
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
NonSwag committed Dec 29, 2024
1 parent adad2fb commit dc14807
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -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<CommandSourceStack> create(CharacterPlugin plugin) {
return Commands.literal("skin");
return Commands.literal("skin")
.then(layer(plugin))
.then(reset(plugin))
.then(set(plugin));
}


private static ArgumentBuilder<CommandSourceStack, ?> layer(CharacterPlugin plugin) {
return Commands.literal("layer")
.then(layer("hide", plugin, false))
.then(layer("show", plugin, true));
}

private static LiteralArgumentBuilder<CommandSourceStack> 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<CommandSourceStack, ?> layerArgument(CharacterPlugin plugin) {
return Commands.argument("layer", new EnumArgument<>(SkinLayer.class));
}

private static ArgumentBuilder<CommandSourceStack, ?> reset(CharacterPlugin plugin) {
return Commands.literal("reset").then(playerCharacterArgument(plugin));
}

private static ArgumentBuilder<CommandSourceStack, ?> set(CharacterPlugin plugin) {
return Commands.literal("set").then(playerCharacterArgument(plugin));
}

private static int layerToggle(CommandContext<CommandSourceStack> 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;
}
}
3 changes: 3 additions & 0 deletions src/main/resources/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ character.list.empty=<red><prefix> There are no characters yet</red>
character.list=<gray><prefix> <character> <dark_gray>(<yellow><type></yellow>) [ <hover:show_text:'<gray>Click to teleport</gray>'><click:run_command:'/character teleport <character>'><green>→</green></click></hover> | <hover:show_text:'<gray>Click to delete'><click:suggest_command:'/character delete <character>'><red>🗑</red></click></hover> ]</dark_gray></gray>
character.name.too-long=<red><prefix> Name cannot be longer than 16 characters</red>
character.not_found=<red><prefix> A character named <dark_red><name></dark_red> does not exist</red>
character.not_player=<red><prefix> You have to provide a <dark_red>player</dark_red> character</red>
character.pose=<gray><prefix> Changed pose of <green><character></green> to <green><pose></green></gray>
character.skin_layer.shown=<gray><prefix> The <green><layer></green> of <green><character></green> is now visible</gray>
character.skin_layer.hidden=<gray><prefix> The <green><layer></green> of <green><character></green> is now hidden</gray>
character.tag.hidden=<gray><prefix> The name tag of <green><character></green> is no longer visible</gray>
character.tag.reset=<gray><prefix> Reset the name tag of <green><character></green></gray>
character.tag.set=<gray><prefix> Set the name tag <green><character></green> to <green><tag></green></gray>
Expand Down

0 comments on commit dc14807

Please sign in to comment.