diff options
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 6 | ||||
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java | 15 | ||||
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java | 31 | ||||
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java | 5 | ||||
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorDyeColors.java | 87 | ||||
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java (renamed from src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRenaming.java) | 21 | ||||
-rw-r--r-- | src/main/resources/assets/skyblocker/lang/en_us.json | 13 | ||||
-rw-r--r-- | src/main/resources/skyblocker.mixins.json | 1 |
8 files changed, 156 insertions, 23 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 63b4adbf..ada86624 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -11,7 +11,8 @@ import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap; import me.xmrvizzy.skyblocker.skyblock.dungeon.LividColor; import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud; -import me.xmrvizzy.skyblocker.skyblock.item.ItemRenaming; +import me.xmrvizzy.skyblocker.skyblock.item.CustomArmorDyeColors; +import me.xmrvizzy.skyblocker.skyblock.item.CustomItemNames; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; @@ -89,7 +90,8 @@ public class SkyblockerMod implements ClientModInitializer { TitleContainer.init(); OcclusionCulling.init(); TeleportOverlay.init(); - ItemRenaming.init(); + CustomItemNames.init(); + CustomArmorDyeColors.init(); containerSolverManager.init(); scheduler.scheduleCyclic(Utils::update, 20); scheduler.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 100); diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index fac8055d..7d44fecb 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.config; -import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -17,11 +18,11 @@ import me.xmrvizzy.skyblocker.utils.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.resource.language.I18n; +import net.minecraft.text.Style; import net.minecraft.text.Text; import java.util.ArrayList; import java.util.List; -import java.util.Map; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; @@ -196,7 +197,9 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.Excluded public List<Integer> lockedSlots = new ArrayList<>(); - public Map<String, Text> customItemNames = new Object2ObjectLinkedOpenHashMap<>(); + public Object2ObjectOpenHashMap<String, Text> customItemNames = new Object2ObjectOpenHashMap<>(); + + public Object2IntOpenHashMap<String> customDyeColors = new Object2IntOpenHashMap<>(); } public static class TabHudConf { @@ -439,13 +442,13 @@ public class SkyblockerConfig implements ConfigData { public boolean enabled = true; @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) @ConfigEntry.Gui.Tooltip(count = 3) - public Style style = Style.SIMPLE; + public DwarvenHudStyle style = DwarvenHudStyle.SIMPLE; public boolean enableBackground = true; public int x = 10; public int y = 10; } - public enum Style { + public enum DwarvenHudStyle { SIMPLE, FANCY, CLASSIC; @@ -545,7 +548,7 @@ public class SkyblockerConfig implements ConfigData { Gson gson = new GsonBuilder() .setPrettyPrinting() .registerTypeHierarchyAdapter(Text.class, new Text.Serializer()) - .registerTypeHierarchyAdapter(net.minecraft.text.Style.class, new net.minecraft.text.Style.Serializer()) + .registerTypeHierarchyAdapter(Style.class, new Style.Serializer()) .create(); ConfigSerializer.Factory<SkyblockerConfig> serializer = (cfg, cfgClass) -> new GsonConfigSerializer<SkyblockerConfig>(cfg, cfgClass, gson); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java new file mode 100644 index 00000000..4d0b6bae --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java @@ -0,0 +1,31 @@ +package me.xmrvizzy.skyblocker.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.sugar.Local; + +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.minecraft.item.DyeableItem; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; + +@Mixin(DyeableItem.class) +public interface DyeableItemMixin { + + @ModifyReturnValue(method = "getColor", at = @At("RETURN")) + default public int skyblocker$customDyeColor(int originalColor, @Local ItemStack stack) { + NbtCompound nbt = stack.getNbt(); + + if (Utils.isOnSkyblock() && nbt != null && nbt.contains("ExtraAttributes")) { + NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes"); + String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null; + + return SkyblockerConfig.get().general.customDyeColors.getOrDefault(itemUuid, originalColor); + } + + return originalColor; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java index 08e7b5ea..640bce9b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java @@ -1,7 +1,5 @@ package me.xmrvizzy.skyblocker.mixin; -import java.util.Map; - import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -24,11 +22,10 @@ public class ItemStackMixin { @ModifyReturnValue(method = "getName", at = @At("RETURN")) public Text skyblocker$customItemNames(Text original) { if (Utils.isOnSkyblock() && nbt != null && nbt.contains("ExtraAttributes")) { - Map<String, Text> customItemNames = SkyblockerConfig.get().general.customItemNames; NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes"); String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null; - if (itemUuid != null && customItemNames.containsKey(itemUuid)) return customItemNames.get(itemUuid); + return SkyblockerConfig.get().general.customItemNames.getOrDefault(itemUuid, original); } return original; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorDyeColors.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorDyeColors.java new file mode 100644 index 00000000..dd5614d1 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorDyeColors.java @@ -0,0 +1,87 @@ +package me.xmrvizzy.skyblocker.skyblock.item; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; + +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.client.MinecraftClient; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.item.DyeableArmorItem; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.text.Text; + +public class CustomArmorDyeColors { + + public static void init() { + ClientCommandRegistrationCallback.EVENT.register(CustomArmorDyeColors::registerCommands); + } + + private static void registerCommands(CommandDispatcher<FabricClientCommandSource> dispatcher, CommandRegistryAccess registryAccess) { + dispatcher.register(ClientCommandManager.literal("skyblocker") + .then(ClientCommandManager.literal("dyeColor") + .executes(context -> customizeDyeColor(context.getSource(), null)) + .then(ClientCommandManager.argument("hexCode", StringArgumentType.string()) + .executes(context -> customizeDyeColor(context.getSource(), StringArgumentType.getString(context, "hexCode")))))); + } + + private static int customizeDyeColor(FabricClientCommandSource source, String hex) { + MinecraftClient client = source.getClient(); + ItemStack heldItem = client.player.getMainHandStack(); + NbtCompound nbt = (heldItem != null) ? heldItem.getNbt() : null; + + if (hex != null && !isHexadecimalColor(hex)) { + source.sendError(Text.translatable("skyblocker.customDyeColors.invalidHex")); + return Command.SINGLE_SUCCESS; + } + + if (Utils.isOnSkyblock() && heldItem != null && heldItem.getItem() instanceof DyeableArmorItem) { + if (nbt != null && nbt.contains("ExtraAttributes")) { + NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes"); + String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null; + + if (itemUuid != null) { + Object2IntOpenHashMap<String> customDyeColors = SkyblockerConfig.get().general.customDyeColors; + + if (hex == null) { + if (customDyeColors.containsKey(itemUuid)) { + customDyeColors.removeInt(itemUuid); + SkyblockerConfig.save(); + source.sendFeedback(Text.translatable("skyblocker.customDyeColors.removed")); + } else { + source.sendFeedback(Text.translatable("skyblocker.customDyeColors.neverHad")); + } + } else { + customDyeColors.put(itemUuid, Integer.decode("0x" + hex.replace("#", "")).intValue()); + SkyblockerConfig.save(); + source.sendFeedback(Text.translatable("skyblocker.customDyeColors.added")); + } + } else { + source.sendError(Text.translatable("skyblocker.customDyeColors.noItemUuid")); + } + } + } else { + if (!(heldItem.getItem() instanceof DyeableArmorItem)) { + source.sendError(Text.translatable("skyblocker.customDyeColors.notDyeable")); + return Command.SINGLE_SUCCESS; + } else { + source.sendError(Text.translatable("skyblocker.customDyeColors.unableToSetColor")); + } + } + + return Command.SINGLE_SUCCESS; + } + + private static boolean isHexadecimalColor(String s) { + s = s.replace("#", ""); + + return s.chars() + .allMatch(c -> "0123456789ABCDEFabcdef".indexOf(c) >= 0) && s.length() == 6; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRenaming.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java index db672803..4ecff508 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRenaming.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java @@ -1,10 +1,9 @@ package me.xmrvizzy.skyblocker.skyblock.item; -import java.util.Map; - import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; @@ -17,10 +16,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.text.Text; -public class ItemRenaming { +public class CustomItemNames { public static void init() { - ClientCommandRegistrationCallback.EVENT.register(ItemRenaming::registerCommands); + ClientCommandRegistrationCallback.EVENT.register(CustomItemNames::registerCommands); } private static void registerCommands(CommandDispatcher<FabricClientCommandSource> dispatcher, CommandRegistryAccess registryAccess) { @@ -41,13 +40,17 @@ public class ItemRenaming { String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null; if (itemUuid != null) { - Map<String, Text> customItemNames = SkyblockerConfig.get().general.customItemNames; + Object2ObjectOpenHashMap<String, Text> customItemNames = SkyblockerConfig.get().general.customItemNames; if (text == null) { - //Remove custom item name when the text argument isn't passed - customItemNames.remove(itemUuid); - SkyblockerConfig.save(); - source.sendFeedback(Text.translatable("skyblocker.customItemNames.removed")); + if (customItemNames.containsKey(itemUuid)) { + //Remove custom item name when the text argument isn't passed + customItemNames.remove(itemUuid); + SkyblockerConfig.save(); + source.sendFeedback(Text.translatable("skyblocker.customItemNames.removed")); + } else { + source.sendFeedback(Text.translatable("skyblocker.customItemNames.neverHad")); + } } else { //If the text is provided then set the item's custom name to it customItemNames.put(itemUuid, text); diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 4c3ed043..e7f68753 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -295,7 +295,16 @@ "skyblocker.shortcuts.commandSuggestionTooltip": "Due to limitations of Minecraft, command suggestions will only work after a restart of the game.", "skyblocker.customItemNames.removed": "§b[§6Skyblocker§b] §fRemoved this item's custom name.", - "skyblocker.customItemNames.added": "§b[§6Skyblocker§b] §fAdded a custom name for your currently held item!", + "skyblocker.customItemNames.neverHad": "§b[§6Skyblocker§b] §fThis item doesn't have a custom name set, but why not add one? ;)", + "skyblocker.customItemNames.added": "§b[§6Skyblocker§b] §fSet a custom name for your currently held item!", "skyblocker.customItemNames.noItemUuid": "§b[§6Skyblocker§b] §cYou must be holding an item that has a uuid in order to set a custom name!", - "skyblocker.customItemNames.unableToSetName": "§b[§6Skyblocker§b] §cUnable to set custom item name :( (Are you in skyblock?, are you holding an item?)" + "skyblocker.customItemNames.unableToSetName": "§b[§6Skyblocker§b] §cUnable to set a custom item name :( (Are you in skyblock?, are you holding an item?)", + + "skyblocker.customDyeColors.invalidHex": "§b[§6Skyblocker§b] §cInvalid HEX color code!", + "skyblocker.customDyeColors.notDyeable": "§b[§6Skyblocker§b] §cThis item isn't a dyeable armor piece!", + "skyblocker.customDyeColors.removed": "§b[§6Skyblocker§b] §fRemoved this item's custom dye color.", + "skyblocker.customDyeColors.neverHad": "§b[§6Skyblocker§b] §fThis item doesn't have a custom dye color set, but why not add one? ;)", + "skyblocker.customDyeColors.added": "§b[§6Skyblocker§b] §fSet a custom dye color for your currently held item!", + "skyblocker.customDyeColors.noItemUuid": "§b[§6Skyblocker§b] §cYou must be holding an item that has a uuid in order to set a custom dye color!", + "skyblocker.customDyeColors.unableToSetColor": "§b[§6Skyblocker§b] §cUnable to set a custom dye color :( (Are you in skyblock?)" } diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 19ad03bf..522c3af0 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -6,6 +6,7 @@ "ClientPlayerEntityMixin", "ClientPlayNetworkHandlerMixin", "DrawContextMixin", + "DyeableItemMixin", "FarmlandBlockMixin", "GenericContainerScreenHandlerMixin", "HandledScreenMixin", |