From f3330e2a6db5bb185c580c513b0f8ca164b27b66 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Mon, 2 Feb 2026 22:32:32 -0800 Subject: [PATCH] Add skins to the `giveall` command Example usage: `!giveall skins` Description: Gives all non-basic/non-ascension skins for trekkers owned by the target player. Requires handbook generation to be enabled. --- .../command/commands/GiveAllCommand.java | 39 ++++++++++++++++++- .../data/resources/CharacterSkinDef.java | 4 ++ src/main/java/emu/nebula/util/Handbook.java | 8 ++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/main/java/emu/nebula/command/commands/GiveAllCommand.java b/src/main/java/emu/nebula/command/commands/GiveAllCommand.java index be894fc..e19ccbc 100644 --- a/src/main/java/emu/nebula/command/commands/GiveAllCommand.java +++ b/src/main/java/emu/nebula/command/commands/GiveAllCommand.java @@ -13,6 +13,7 @@ import emu.nebula.game.inventory.ItemSubType; import emu.nebula.game.player.Player; import emu.nebula.game.player.PlayerChangeInfo; import emu.nebula.net.NetMsgId; +import emu.nebula.proto.Public.Item; @Command( label = "giveall", @@ -67,7 +68,7 @@ public class GiveAllCommand implements CommandHandler { // Send message message.append("Giving " + target.getName() + " " + items.size() + " items.\n"); } - case "d", "discs" -> { + case "d", "disc", "discs" -> { // Get all discs for (var data : GameData.getDiscDataTable()) { // Skip unavailable discs @@ -97,7 +98,7 @@ public class GiveAllCommand implements CommandHandler { // Send message message.append("Giving " + target.getName() + " all discs.\n"); } - case "c", "characters", "trekkers", "t" -> { + case "c", "char", "characters", "trekkers", "t" -> { // Get all characters for (var data : GameData.getCharacterDataTable()) { // Skip unavailable characters @@ -127,6 +128,40 @@ public class GiveAllCommand implements CommandHandler { // Send message message.append("Giving " + target.getName() + " all characters.\n"); } + case "skin", "skins" -> { + // Skins count + int count = 0; + + // Get all paid skins + for (var data : GameData.getCharacterSkinDataTable()) { + // Skip basic/ascension skins + if (data.getType() != 3) { + continue; + } + + // Make sure player has the character the skin is for + if (!target.getCharacters().hasCharacter(data.getCharId())) { + continue; + } + + // Make sure skin is released + if (!data.isReleased()) { + continue; + } + + // Add skin for player, will return true if we successfully added the skin + if (target.getInventory().addSkin(data.getId())) { + // Increment counter + count++; + + // Add change info + change.add(Item.newInstance().setId(data.getId()).setQty(1)); + } + } + + // Send message + message.append("Giving " + count + " skins.\n"); + } default -> { // Ignored } diff --git a/src/main/java/emu/nebula/data/resources/CharacterSkinDef.java b/src/main/java/emu/nebula/data/resources/CharacterSkinDef.java index 8ea46ee..d29506d 100644 --- a/src/main/java/emu/nebula/data/resources/CharacterSkinDef.java +++ b/src/main/java/emu/nebula/data/resources/CharacterSkinDef.java @@ -3,6 +3,7 @@ package emu.nebula.data.resources; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; import lombok.Getter; +import lombok.Setter; @Getter @ResourceType(name = "CharacterSkin.json") @@ -11,6 +12,9 @@ public class CharacterSkinDef extends BaseDef { private int CharId; private int Type; + @Setter + private transient boolean released; + @Override public int getId() { return Id; diff --git a/src/main/java/emu/nebula/util/Handbook.java b/src/main/java/emu/nebula/util/Handbook.java index 035e2f8..b7eda42 100644 --- a/src/main/java/emu/nebula/util/Handbook.java +++ b/src/main/java/emu/nebula/util/Handbook.java @@ -77,6 +77,14 @@ public class Handbook { } } + // Hacky way of checking if a skin is released or not + if (data.getItemType() == ItemType.CharacterSkin) { + var skinData = GameData.getCharacterSkinDataTable().get(id); + if (skinData != null) { + skinData.setReleased(itemLanguageKey.containsKey(data.getTitle())); + } + } + writer.println(""); }