aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin <92656833+kevinthegreat1@users.noreply.github.com>2023-08-10 12:40:33 +0800
committerGitHub <noreply@github.com>2023-08-10 12:40:33 +0800
commit50ec28e8c6c11d73019afc12b07eb3656c1107ed (patch)
tree0e4e1e3e1d8723c7ef91b5225bf8027fd8195976
parentf46f40de3a3b1adeccc192134eb445f5294850f5 (diff)
parent16c6debb1cc90be5815cd188264b16ddf8b76f16 (diff)
downloadSkyblocker-50ec28e8c6c11d73019afc12b07eb3656c1107ed.tar.gz
Skyblocker-50ec28e8c6c11d73019afc12b07eb3656c1107ed.tar.bz2
Skyblocker-50ec28e8c6c11d73019afc12b07eb3656c1107ed.zip
Merge pull request #234 from AzureAaron/item-renaming
Add Item Renaming & Custom Armour Dye Colours
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java32
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java27
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java33
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorDyeColors.java81
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java66
-rw-r--r--src/main/resources/assets/skyblocker/lang/en_us.json16
-rw-r--r--src/main/resources/skyblocker.mixins.json2
8 files changed, 256 insertions, 5 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
index 1fd42f37..ada86624 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
@@ -11,6 +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.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;
@@ -88,6 +90,8 @@ public class SkyblockerMod implements ClientModInitializer {
TitleContainer.init();
OcclusionCulling.init();
TeleportOverlay.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 8d633563..75e6fdc5 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
@@ -1,10 +1,16 @@
package me.xmrvizzy.skyblocker.config;
+import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
+
+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,6 +18,8 @@ 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;
@@ -188,6 +196,10 @@ public class SkyblockerConfig implements ConfigData {
@ConfigEntry.Gui.Excluded
public List<Integer> lockedSlots = new ArrayList<>();
+
+ public Object2ObjectOpenHashMap<String, Text> customItemNames = new Object2ObjectOpenHashMap<>();
+
+ public Object2IntOpenHashMap<String> customDyeColors = new Object2IntOpenHashMap<>();
}
public static class TabHudConf {
@@ -430,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;
@@ -530,10 +542,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(Style.class, new Style.Serializer())
+ .create();
+
+ ConfigSerializer.Factory<SkyblockerConfig> serializer = (cfg, cfgClass) -> new GsonConfigSerializer<>(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 +571,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/DyeableItemMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java
new file mode 100644
index 00000000..f04c4cdd
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java
@@ -0,0 +1,27 @@
+package me.xmrvizzy.skyblocker.mixin;
+
+import com.llamalad7.mixinextras.injector.ModifyReturnValue;
+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;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(DyeableItem.class)
+public interface DyeableItemMixin {
+ @ModifyReturnValue(method = "getColor", at = @At("RETURN"))
+ private int skyblocker$customDyeColor(int originalColor, 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
new file mode 100644
index 00000000..63dc6624
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java
@@ -0,0 +1,33 @@
+package me.xmrvizzy.skyblocker.mixin;
+
+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 abstract class ItemStackMixin {
+ @Shadow
+ @Nullable
+ private NbtCompound nbt;
+
+ @ModifyReturnValue(method = "getName", at = @At("RETURN"))
+ private Text skyblocker$customItemNames(Text original) {
+ 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.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..9385b4a1
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorDyeColors.java
@@ -0,0 +1,81 @@
+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.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"))))));
+ }
+
+ @SuppressWarnings("SameReturnValue")
+ private static int customizeDyeColor(FabricClientCommandSource source, String hex) {
+ ItemStack heldItem = source.getPlayer().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) {
+ if (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 {
+ 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) {
+ return s.replace("#", "").chars().allMatch(c -> "0123456789ABCDEFabcdef".indexOf(c) >= 0) && s.replace("#", "").length() == 6;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java
new file mode 100644
index 00000000..5d410947
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java
@@ -0,0 +1,66 @@
+package me.xmrvizzy.skyblocker.skyblock.item;
+
+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;
+import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
+import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
+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 CustomItemNames {
+ public static void init() {
+ ClientCommandRegistrationCallback.EVENT.register(CustomItemNames::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))))));
+ }
+
+ @SuppressWarnings("SameReturnValue")
+ private static int renameItem(FabricClientCommandSource source, Text text) {
+ ItemStack heldItem = source.getPlayer().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) {
+ Object2ObjectOpenHashMap<String, Text> customItemNames = SkyblockerConfig.get().general.customItemNames;
+
+ if (text == null) {
+ 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);
+ 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;
+ }
+}
diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index 8e8de38a..e7f68753 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -292,5 +292,19 @@
"skyblocker.shortcuts.deleteQuestion": "Are you sure you want to remove this shortcut?",
"skyblocker.shortcuts.deleteWarning": "Shortcut '%s' will be lost forever! (A long time!)",
"skyblocker.shortcuts.new": "New Shortcut",
- "skyblocker.shortcuts.commandSuggestionTooltip": "Due to limitations of Minecraft, command suggestions will only work after a restart of the game."
+ "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.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 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 360a966a..522c3af0 100644
--- a/src/main/resources/skyblocker.mixins.json
+++ b/src/main/resources/skyblocker.mixins.json
@@ -6,11 +6,13 @@
"ClientPlayerEntityMixin",
"ClientPlayNetworkHandlerMixin",
"DrawContextMixin",
+ "DyeableItemMixin",
"FarmlandBlockMixin",
"GenericContainerScreenHandlerMixin",
"HandledScreenMixin",
"InGameHudMixin",
"InventoryScreenMixin",
+ "ItemStackMixin",
"LeverBlockMixin",
"MinecraftClientMixin",
"PlayerListHudMixin",