From 79ba1ed6fc133bacf64ee8e3a5d1454d1eadde2f Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Tue, 8 Aug 2023 20:28:24 -0400
Subject: Add Item Renaming

---
 .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java |  2 +
 .../skyblocker/config/SkyblockerConfig.java        | 25 +++++++-
 .../xmrvizzy/skyblocker/mixin/ItemStackMixin.java  | 36 ++++++++++++
 .../skyblocker/skyblock/item/ItemRenaming.java     | 66 ++++++++++++++++++++++
 4 files changed, 127 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java
 create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRenaming.java

(limited to 'src/main/java/me/xmrvizzy')

diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
index 1fd42f37..63b4adbf 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
@@ -11,6 +11,7 @@ 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.PriceInfoTooltip;
 import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup;
 import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry;
@@ -88,6 +89,7 @@ public class SkyblockerMod implements ClientModInitializer {
         TitleContainer.init();
         OcclusionCulling.init();
         TeleportOverlay.init();
+        ItemRenaming.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 8d633563..fac8055d 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
@@ -1,10 +1,15 @@
 package me.xmrvizzy.skyblocker.config;
 
+import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 import com.mojang.brigadier.builder.LiteralArgumentBuilder;
 import me.shedaniel.autoconfig.AutoConfig;
 import me.shedaniel.autoconfig.ConfigData;
 import me.shedaniel.autoconfig.annotation.Config;
 import me.shedaniel.autoconfig.annotation.ConfigEntry;
+import me.shedaniel.autoconfig.serializer.ConfigSerializer;
 import me.shedaniel.autoconfig.serializer.GsonConfigSerializer;
 import me.xmrvizzy.skyblocker.SkyblockerMod;
 import me.xmrvizzy.skyblocker.chat.ChatFilterResult;
@@ -12,9 +17,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.Text;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
 
@@ -188,6 +195,8 @@ public class SkyblockerConfig implements ConfigData {
 
         @ConfigEntry.Gui.Excluded
         public List<Integer> lockedSlots = new ArrayList<>();
+        
+        public Map<String, Text> customItemNames = new Object2ObjectLinkedOpenHashMap<>();
     }
 
     public static class TabHudConf {
@@ -530,10 +539,18 @@ public class SkyblockerConfig implements ConfigData {
     }
 
     /**
-     * Registers the config to AutoConfig and register commands to open the config screen.
+     * Registers the config to AutoConfig and registers commands to open the config screen.
      */
     public static void init() {
-        AutoConfig.register(SkyblockerConfig.class, GsonConfigSerializer::new);
+        Gson gson = new GsonBuilder()
+                .setPrettyPrinting()
+                .registerTypeHierarchyAdapter(Text.class, new Text.Serializer())
+                .registerTypeHierarchyAdapter(net.minecraft.text.Style.class, new net.minecraft.text.Style.Serializer())
+                .create();
+        
+        ConfigSerializer.Factory<SkyblockerConfig> serializer = (cfg, cfgClass) -> new GsonConfigSerializer<SkyblockerConfig>(cfg, cfgClass, gson);
+        
+        AutoConfig.register(SkyblockerConfig.class, serializer);
         ClientCommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(optionsLiteral("config")).then(optionsLiteral("options")))));
     }
 
@@ -551,4 +568,8 @@ public class SkyblockerConfig implements ConfigData {
     public static SkyblockerConfig get() {
         return AutoConfig.getConfigHolder(SkyblockerConfig.class).getConfig();
     }
+    
+    public static void save() {
+        AutoConfig.getConfigHolder(SkyblockerConfig.class).save();
+    }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java
new file mode 100644
index 00000000..08e7b5ea
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java
@@ -0,0 +1,36 @@
+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;
+import org.spongepowered.asm.mixin.injection.At;
+
+import com.llamalad7.mixinextras.injector.ModifyReturnValue;
+
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.utils.Utils;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.text.Text;
+
+@Mixin(ItemStack.class)
+public class ItemStackMixin {
+	@Shadow
+	@Nullable
+	private NbtCompound nbt;
+
+	@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 original;
+	}
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRenaming.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRenaming.java
new file mode 100644
index 00000000..db672803
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRenaming.java
@@ -0,0 +1,66 @@
+package me.xmrvizzy.skyblocker.skyblock.item;
+
+import java.util.Map;
+
+import com.mojang.brigadier.Command;
+import com.mojang.brigadier.CommandDispatcher;
+
+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.command.argument.TextArgumentType;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.text.Text;
+
+public class ItemRenaming {
+
+	public static void init() {
+		ClientCommandRegistrationCallback.EVENT.register(ItemRenaming::registerCommands);
+	}
+	
+	private static void registerCommands(CommandDispatcher<FabricClientCommandSource> dispatcher, CommandRegistryAccess registryAccess) {
+		dispatcher.register(ClientCommandManager.literal("skyblocker")
+				.then(ClientCommandManager.literal("renameItem")
+						.executes(context -> renameItem(context.getSource(), null))
+						.then(ClientCommandManager.argument("textComponent", TextArgumentType.text())
+								.executes(context -> renameItem(context.getSource(), context.getArgument("textComponent", Text.class))))));
+	}
+	
+	private static int renameItem(FabricClientCommandSource source, Text text) {
+		MinecraftClient client = source.getClient();
+		ItemStack heldItem = client.player.getMainHandStack();
+		NbtCompound nbt = (heldItem != null) ? heldItem.getNbt() : null;
+		
+		if (Utils.isOnSkyblock() && nbt != null && nbt.contains("ExtraAttributes")) {
+			NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes");
+			String itemUuid =  extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null;
+			
+			if (itemUuid != null) {
+				Map<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"));
+				} else {
+					//If the text is provided then set the item's custom name to it
+					customItemNames.put(itemUuid, text);
+					SkyblockerConfig.save();
+					source.sendFeedback(Text.translatable("skyblocker.customItemNames.added"));
+				}
+			} else {
+				source.sendError(Text.translatable("skyblocker.customItemNames.noItemUuid"));
+			}
+		} else {
+			source.sendError(Text.translatable("skyblocker.customItemNames.unableToSetName"));
+		}
+		
+		return Command.SINGLE_SUCCESS;
+	}
+}
-- 
cgit