From a0588bc0fce38990f06e66b5be9c89417217408f Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Mon, 5 Feb 2024 22:09:46 -0500 Subject: 24w05a/b --- src/main/resources/fabric.mod.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/main/resources') diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index dd6c2cd4..f45a6a91 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -33,10 +33,10 @@ ], "accessWidener": "skyblocker.accesswidener", "depends": { - "fabricloader": ">=0.15.0", - "fabric-api": ">=0.92.0+1.20.4", + "fabricloader": ">=0.15.6", + "fabric-api": ">=0.95.5+1.20.5", "yet_another_config_lib_v3": ">=3.3.2+1.20.4", - "minecraft": "~1.20.3" + "minecraft": "~1.20.5-alpha.24.5.a" }, "conflicts": { "immediatelyfast": "<=1.2.11+1.20.4" -- cgit From 3c967b384500d117c23fa5d1cb23bc415a5d6324 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Thu, 15 Feb 2024 23:31:04 -0500 Subject: 24w07a & Mixin Extras update --- gradle.properties | 8 ++++---- .../de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java | 2 +- src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java | 1 - .../java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java | 2 +- .../java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java | 2 +- src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java | 2 +- .../skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java | 2 +- .../de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java | 2 +- src/main/resources/fabric.mod.json | 6 +++--- 9 files changed, 13 insertions(+), 14 deletions(-) (limited to 'src/main/resources') diff --git a/gradle.properties b/gradle.properties index a9c66d48..9543d5cc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,13 @@ org.gradle.parallel=true # Fabric Properties (https://fabricmc.net/versions.html) ## 1.20 -minecraft_version=24w05b -yarn_mappings=24w05b+build.2 -loader_version=0.15.6 +minecraft_version=24w07a +yarn_mappings=24w07a+build.4 +loader_version=0.15.7 #Fabric api ## 1.20 -fabric_api_version=0.95.5+1.20.5 +fabric_api_version=0.96.2+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java index 743f949f..b3471972 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java @@ -1,7 +1,7 @@ package de.hysky.skyblocker.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.llamalad7.mixinextras.sugar.Local; import de.hysky.skyblocker.skyblock.FishingHelper; import de.hysky.skyblocker.skyblock.dungeon.DungeonScore; diff --git a/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java index dfa886c4..84467c9b 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java @@ -30,7 +30,6 @@ public abstract class FarmlandBlockMixin extends Block { return Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hitbox.oldFarmlandHitbox ? VoxelShapes.fullCube() : original; } - @SuppressWarnings("deprecation") @Override public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) { return SHAPE; diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java index dd38e15a..b6c44072 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java @@ -4,7 +4,7 @@ import org.slf4j.Logger; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import de.hysky.skyblocker.utils.Utils; diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java index 50f478b8..44f39d21 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.PlayerHeadHashCache; diff --git a/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java index 2cfb658a..40b6995a 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java @@ -1,6 +1,6 @@ package de.hysky.skyblocker.mixin; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import de.hysky.skyblocker.utils.Utils; import net.minecraft.scoreboard.Scoreboard; import org.slf4j.Logger; diff --git a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java index 47c8780f..d6863b18 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java @@ -4,7 +4,7 @@ import org.slf4j.Logger; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; import de.hysky.skyblocker.utils.Utils; diff --git a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java index 78c4bac1..5df018e4 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java @@ -1,6 +1,6 @@ package de.hysky.skyblocker.mixin; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index f45a6a91..451cd684 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -33,10 +33,10 @@ ], "accessWidener": "skyblocker.accesswidener", "depends": { - "fabricloader": ">=0.15.6", - "fabric-api": ">=0.95.5+1.20.5", + "fabricloader": ">=0.15.7", + "fabric-api": ">=0.96.2+1.20.5", "yet_another_config_lib_v3": ">=3.3.2+1.20.4", - "minecraft": "~1.20.5-alpha.24.5.a" + "minecraft": "~1.20.5-alpha.24.7.a" }, "conflicts": { "immediatelyfast": "<=1.2.11+1.20.4" -- cgit From 4f4d3f480d75293a2f19f799423a282a4f03b421 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sun, 18 Feb 2024 02:15:26 -0500 Subject: Hud Render Events --- .../hysky/skyblocker/events/HudRenderEvents.java | 50 ++++++++++++++++++++++ .../de/hysky/skyblocker/mixin/InGameHudMixin.java | 42 ++++++++++++++++++ .../mixin/accessor/LayeredDrawerAccessor.java | 15 +++++++ src/main/resources/skyblocker.mixins.json | 1 + 4 files changed, 108 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/events/HudRenderEvents.java create mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/events/HudRenderEvents.java b/src/main/java/de/hysky/skyblocker/events/HudRenderEvents.java new file mode 100644 index 00000000..13e70498 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/events/HudRenderEvents.java @@ -0,0 +1,50 @@ +package de.hysky.skyblocker.events; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.client.gui.DrawContext; + +/** + * HUD render events that allow for proper layering between different HUD elements. + * This should always be preferred over Fabric's {@link net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback}. + * + * Perhaps in the future this system could be PR'd to Fabric. + */ +public class HudRenderEvents { + /** + * Called after the hotbar, status bars, and experience bar have been rendered. + */ + public static final Event AFTER_MAIN_HUD = createEventForStage(); + + /** + * Called before the {@link net.minecraft.client.gui.hud.ChatHud} is rendered. + */ + public static final Event BEFORE_CHAT = createEventForStage(); + + /** + * Called after the entire HUD is rendered. + */ + public static final Event LAST = createEventForStage(); + + private static Event createEventForStage() { + return EventFactory.createArrayBacked(HudRenderStage.class, listeners -> (context, tickDelta) -> { + for (HudRenderStage listener : listeners) { + listener.onRender(context, tickDelta); + } + }); + } + + /** + * @implNote Similar to Fabric's {@link net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback} + */ + @FunctionalInterface + public interface HudRenderStage { + /** + * Called sometime during a specific HUD render stage. + * + * @param drawContext The {@link DrawContext} instance + * @param tickDelta Progress for linearly interpolating between the previous and current game state + */ + void onRender(DrawContext context, float tickDelta); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java index fc0d58b7..3dff4d6f 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java @@ -6,6 +6,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars; +import de.hysky.skyblocker.events.HudRenderEvents; +import de.hysky.skyblocker.mixin.accessor.LayeredDrawerAccessor; import de.hysky.skyblocker.skyblock.dungeon.DungeonMap; import de.hysky.skyblocker.skyblock.dungeon.DungeonScore; import de.hysky.skyblocker.skyblock.dungeon.DungeonScoreHUD; @@ -19,15 +21,18 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.LayeredDrawer; import net.minecraft.client.gui.hud.InGameHud; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import java.util.List; import java.util.function.Supplier; import java.util.regex.Pattern; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -54,6 +59,10 @@ public abstract class InGameHudMixin { @Final private MinecraftClient client; + @Shadow + @Final + private LayeredDrawer layeredDrawer; + @Inject(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IIFLnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V", ordinal = 0)) public void skyblocker$renderHotbarItemLockOrRarityBg(CallbackInfo ci, @Local(argsOnly = true) DrawContext context, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y, @Local PlayerEntity player) { if (Utils.isOnSkyblock()) { @@ -121,4 +130,37 @@ public abstract class InGameHudMixin { ci.cancel(); } } + + /** + * Hopefully other mods don't add stages into these two drawers... + * + * @implNote Check this every update to see if the indexes of each layer have changed. + */ + @Inject(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/InGameHud;layeredDrawer:Lnet/minecraft/client/gui/LayeredDrawer;", opcode = Opcodes.GETFIELD)) + private void skyblocker$beforeDrawersInitialized(CallbackInfo ci, @Local(ordinal = 0) LayeredDrawer persistentDrawer, @Local(ordinal = 1) LayeredDrawer intermittentDrawer) { + List persistentLayers = ((LayeredDrawerAccessor) persistentDrawer).getLayers(); + + //After Main HUD - stage index is 2 + LayeredDrawer.Layer mainHudLayer = persistentLayers.get(2); + + persistentLayers.set(2, (context, tickDelta) -> { + mainHudLayer.render(context, tickDelta); + HudRenderEvents.AFTER_MAIN_HUD.invoker().onRender(context, tickDelta); + }); + + List intermittentLayers = ((LayeredDrawerAccessor) intermittentDrawer).getLayers(); + + //Before Chat - stage index is 5 + LayeredDrawer.Layer chatLayer = intermittentLayers.get(5); + + intermittentLayers.set(5, (context, tickDelta) -> { + HudRenderEvents.BEFORE_CHAT.invoker().onRender(context, tickDelta); + chatLayer.render(context, tickDelta); + }); + } + + @Inject(method = "", at = @At("TAIL")) + private void skyblocker$afterDrawersInitialized(CallbackInfo ci) { + this.layeredDrawer.addLayer(HudRenderEvents.LAST.invoker()::onRender); + } } diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java new file mode 100644 index 00000000..26110ca9 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java @@ -0,0 +1,15 @@ +package de.hysky.skyblocker.mixin.accessor; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.gui.LayeredDrawer; + +@Mixin(LayeredDrawer.class) +public interface LayeredDrawerAccessor { + + @Accessor + List getLayers(); +} diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 8169c0c4..07168300 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -44,6 +44,7 @@ "accessor.FrustumInvoker", "accessor.HandledScreenAccessor", "accessor.ItemStackAccessor", + "accessor.LayeredDrawerAccessor", "accessor.MessageHandlerAccessor", "accessor.PlayerListHudAccessor", "accessor.RecipeBookWidgetAccessor", -- cgit From 4e2924407645b04c30d4a2823a1d9d0983c2c790 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sat, 2 Mar 2024 15:16:27 -0500 Subject: 24w09a --- build.gradle | 7 +- gradle.properties | 10 +-- src/main/java/de/hysky/skyblocker/debug/Debug.java | 2 +- .../de/hysky/skyblocker/mixin/ArmorTrimMixin.java | 34 --------- .../skyblocker/mixin/ComponentHolderMixin.java | 39 ++++++++++ .../hysky/skyblocker/mixin/DyeableItemMixin.java | 29 -------- .../skyblocker/mixin/DyedColorComponentMixin.java | 34 +++++++++ .../hysky/skyblocker/mixin/HandledScreenMixin.java | 2 +- .../mixin/accessor/ItemStackAccessor.java | 14 ---- .../skyblocker/skyblock/dungeon/CroesusHelper.java | 8 ++- .../skyblocker/skyblock/dungeon/CroesusProfit.java | 7 +- .../skyblocker/skyblock/dungeon/DungeonMap.java | 25 +++---- .../dungeon/partyfinder/OptionDropdownWidget.java | 1 - .../skyblock/dungeon/partyfinder/PartyEntry.java | 20 +++--- .../dungeon/partyfinder/PartyFinderScreen.java | 12 ++-- .../skyblock/dungeon/secrets/DungeonManager.java | 5 +- .../skyblocker/skyblock/end/EndHudWidget.java | 7 +- .../hysky/skyblocker/skyblock/entity/MobGlow.java | 22 +++--- .../skyblocker/skyblock/garden/FarmingHud.java | 2 +- .../skyblocker/skyblock/garden/VisitorHelper.java | 28 ++++---- .../skyblock/item/CustomArmorDyeColors.java | 4 +- .../skyblocker/skyblock/item/CustomArmorTrims.java | 6 +- .../skyblock/item/tooltip/BackpackPreview.java | 69 ++++++++++-------- .../skyblock/item/tooltip/ItemTooltip.java | 14 ++-- .../skyblock/itemlist/ItemStackBuilder.java | 83 +++++++++++----------- .../skyblock/itemlist/SearchResultsWidget.java | 10 +-- .../skyblocker/skyblock/quicknav/QuickNav.java | 7 +- .../skyblock/special/SpecialEffects.java | 58 ++++++--------- .../java/de/hysky/skyblocker/utils/ItemUtils.java | 64 +++++++++++------ .../datafixer/ItemStackComponentizationFixer.java | 26 +++++++ src/main/resources/fabric.mod.json | 6 +- src/main/resources/skyblocker.mixins.json | 5 +- .../de/hysky/skyblocker/utils/ItemUtilsTest.java | 12 ++-- .../ItemStackComponentizationFixerTest.java | 47 ++++++++++++ 34 files changed, 410 insertions(+), 309 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DyeableItemMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/ItemStackAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java create mode 100644 src/test/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixerTest.java (limited to 'src/main/resources') diff --git a/build.gradle b/build.gradle index d7b37bfe..d5bb8008 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,12 @@ dependencies { testImplementation "net.fabricmc:fabric-loader-junit:${project.loader_version}" // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + //Layered Yarn & Mojmap - used to fill in intermediary names + mappings loom.layered { + //Using Mojmap breaks runClient, so uncomment only for snapshots when temp mappings are needed + //officialMojangMappings() + mappings("net.fabricmc:yarn:${project.yarn_mappings}:v2") + } modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" // Fabric API diff --git a/gradle.properties b/gradle.properties index 9543d5cc..66191411 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,19 +3,19 @@ org.gradle.parallel=true # Fabric Properties (https://fabricmc.net/versions.html) ## 1.20 -minecraft_version=24w07a -yarn_mappings=24w07a+build.4 +minecraft_version=24w09a +yarn_mappings=24w09a+build.5 loader_version=0.15.7 #Fabric api ## 1.20 -fabric_api_version=0.96.2+1.20.5 +fabric_api_version=0.96.5+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) -yacl_version=3.3.2+1.20.4 +yacl_version=3.3.3+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT ## Mod Menu (https://modrinth.com/mod/modmenu/versions) -mod_menu_version = 9.0.0-alpha.3 +mod_menu_version = 10.0.0-alpha.1 ## REI (https://modrinth.com/mod/rei/versions?l=fabric) rei_version = 13.0.666 ## EMI (https://modrinth.com/mod/emi/versions) diff --git a/src/main/java/de/hysky/skyblocker/debug/Debug.java b/src/main/java/de/hysky/skyblocker/debug/Debug.java index 5a9d221b..31823ab0 100644 --- a/src/main/java/de/hysky/skyblocker/debug/Debug.java +++ b/src/main/java/de/hysky/skyblocker/debug/Debug.java @@ -23,7 +23,7 @@ public class Debug { SnapshotDebug.init(); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("debug") .then(dumpPlayersCommand()) - .then(ItemUtils.dumpHeldItemNbtCommand()) + .then(ItemUtils.dumpHeldItemCommand()) ))); } } diff --git a/src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java deleted file mode 100644 index e13c41ee..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/ArmorTrimMixin.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import com.llamalad7.mixinextras.sugar.Local; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.CustomArmorTrims; -import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.Utils; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.item.ItemStack; -import net.minecraft.item.trim.ArmorTrim; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import java.util.Optional; - -@Mixin(ArmorTrim.class) -public class ArmorTrimMixin { - - @ModifyReturnValue(method = "getTrim", at = @At("RETURN")) - private static Optional skyblocker$customArmorTrims(@SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional original, @Local(argsOnly = true) ItemStack stack) { - if (Utils.isOnSkyblock()) { - Object2ObjectOpenHashMap customTrims = SkyblockerConfigManager.get().general.customArmorTrims; - String itemUuid = ItemUtils.getItemUuid(stack); - - if (customTrims.containsKey(itemUuid)) { - CustomArmorTrims.ArmorTrimId trimKey = customTrims.get(itemUuid); - return CustomArmorTrims.TRIMS_CACHE.getOrDefault(trimKey, original); - } - } - - return original; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java new file mode 100644 index 00000000..c8c57d6d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java @@ -0,0 +1,39 @@ +package de.hysky.skyblocker.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.CustomArmorTrims; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.Utils; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.component.ComponentHolder; +import net.minecraft.component.DataComponentType; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.item.ItemStack; +import net.minecraft.item.trim.ArmorTrim; + +@Mixin(ComponentHolder.class) +public interface ComponentHolderMixin { + + @SuppressWarnings("unchecked") + @ModifyReturnValue(method = "get", at = @At("RETURN")) + private T skyblocker$customArmorTrims(T original, DataComponentType dataComponentType) { + if (Utils.isOnSkyblock() && ((Object) this) instanceof ItemStack stack) { + if (dataComponentType == DataComponentTypes.TRIM) { + Object2ObjectOpenHashMap customTrims = SkyblockerConfigManager.get().general.customArmorTrims; + String itemUuid = ItemUtils.getItemUuid(stack); + + if (customTrims.containsKey(itemUuid)) { + CustomArmorTrims.ArmorTrimId trimKey = customTrims.get(itemUuid); + return (T) CustomArmorTrims.TRIMS_CACHE.getOrDefault(trimKey, (ArmorTrim) original); + } + } + } + + return original; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixin/DyeableItemMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DyeableItemMixin.java deleted file mode 100644 index b20b58b5..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/DyeableItemMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.CustomArmorAnimatedDyes; -import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.item.DyeableItem; -import net.minecraft.item.ItemStack; -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 static int skyblocker$customDyeColor(int originalColor, ItemStack stack) { - if (Utils.isOnSkyblock()) { - String itemUuid = ItemUtils.getItemUuid(stack); - - if (SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(itemUuid)) { - return CustomArmorAnimatedDyes.animateColorTransition(SkyblockerConfigManager.get().general.customAnimatedDyes.get(itemUuid)); - } - - return SkyblockerConfigManager.get().general.customDyeColors.getOrDefault(itemUuid, originalColor); - } - - return originalColor; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java new file mode 100644 index 00000000..2682fc6d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java @@ -0,0 +1,34 @@ +package de.hysky.skyblocker.mixin; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.sugar.Local; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.CustomArmorAnimatedDyes; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.component.type.DyedColorComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.ColorHelper; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(DyedColorComponent.class) +public record DyedColorComponentMixin() { + + @ModifyReturnValue(method = "getColor", at = @At("RETURN")) + private static int skyblocker$customDyeColor(int originalColor, @Local(argsOnly = true) ItemStack stack) { + if (Utils.isOnSkyblock()) { + String itemUuid = ItemUtils.getItemUuid(stack); + + if (SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(itemUuid)) { + return ColorHelper.Argb.fullAlpha(CustomArmorAnimatedDyes.animateColorTransition(SkyblockerConfigManager.get().general.customAnimatedDyes.get(itemUuid))); + } + + return ColorHelper.Argb.fullAlpha(SkyblockerConfigManager.get().general.customDyeColors.getOrDefault(itemUuid, originalColor)); + } + + return originalColor; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java index 7d2f849e..73a0bfdb 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java @@ -205,7 +205,7 @@ public abstract class HandledScreenMixin extends Screen // Prevent selling to NPC shops ItemStack sellStack = this.handler.slots.get(49).getStack(); - if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getNbtTooltip(sellStack, text -> text.contains("buyback")) != null) { + if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getLoreLineIf(sellStack, text -> text.contains("buyback")) != null) { if (slotId != 49 && ItemProtection.isItemProtected(stack)) { ci.cancel(); return; diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/ItemStackAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/ItemStackAccessor.java deleted file mode 100644 index e3bd69aa..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/ItemStackAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.item.ItemStack; -import net.minecraft.text.Style; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ItemStack.class) -public interface ItemStackAccessor { - @Accessor - static Style getLORE_STYLE() { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java index 01422770..5bd44707 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusHelper.java @@ -1,8 +1,10 @@ package de.hysky.skyblocker.skyblock.dungeon; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.render.gui.ColorHighlight; import de.hysky.skyblocker.utils.render.gui.ContainerSolver; +import net.minecraft.component.DataComponentTypes; import net.minecraft.item.ItemStack; import java.util.ArrayList; @@ -25,10 +27,10 @@ public class CroesusHelper extends ContainerSolver { List highlights = new ArrayList<>(); for (Map.Entry entry : slots.entrySet()) { ItemStack stack = entry.getValue(); - if (stack != null && stack.getNbt() != null) { - if (stack.getNbt().toString().contains("Opened Chest:")) { + if (stack != null && stack.contains(DataComponentTypes.LORE)) { + if (ItemUtils.getLoreLineIf(stack, s -> s.contains("Opened Chest:")) != null) { highlights.add(ColorHighlight.gray(entry.getKey())); - } else if (stack.getNbt().toString().contains("No more Chests to open!")) { + } else if (ItemUtils.getLoreLineIf(stack, s -> s.contains("No more Chests to open!")) != null) { highlights.add(ColorHighlight.red(entry.getKey())); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java index ca166915..8933a447 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/CroesusProfit.java @@ -6,6 +6,7 @@ import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.render.gui.ColorHighlight; import de.hysky.skyblocker.utils.render.gui.ContainerSolver; +import net.minecraft.component.DataComponentTypes; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import org.jetbrains.annotations.NotNull; @@ -37,7 +38,7 @@ public class CroesusProfit extends ContainerSolver { for (Map.Entry entry : slots.entrySet()) { ItemStack stack = entry.getValue(); - if (stack != null && stack.getNbt() != null && stack.getName().toString().contains("Chest")) { + if (stack != null && stack.contains(DataComponentTypes.LORE) && ItemUtils.getLoreLineIf(stack, s -> s.contains("Chest")) != null) { long value = valueChest(stack); if (value > bestValue) { secondBestChest = bestChest; @@ -53,7 +54,7 @@ public class CroesusProfit extends ContainerSolver { for (Map.Entry entry : slots.entrySet()) { ItemStack stack = entry.getValue(); - if (stack != null && stack.getNbt() != null) { + if (stack != null && stack.contains(DataComponentTypes.LORE)) { if (stack.equals(bestChest)) { highlights.add(ColorHighlight.green(entry.getKey())); } else if (stack.equals(secondBestChest) && secondBestValue > dungeonKeyPriceData) { @@ -71,7 +72,7 @@ public class CroesusProfit extends ContainerSolver { List chestItems = new ArrayList<>(); boolean processingContents = false; - for (Text line : ItemUtils.getNbtTooltips(chest)) { + for (Text line : ItemUtils.getLore(chest)) { String lineString = line.getString(); if (lineString.contains("Contents")) { processingContents = true; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java index 878b7a35..7a6cdcd0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java @@ -14,14 +14,16 @@ import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.MapRenderer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.MapIdComponent; import net.minecraft.item.FilledMapItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.map.MapState; public class DungeonMap { - private static final int DEFAULT_MAP_ID = 1024; - private static Integer cachedMapId = null; + private static final MapIdComponent DEFAULT_MAP_ID_COMPONENT = new MapIdComponent(1024); + private static MapIdComponent cachedMapIdComponent = null; public static void init() { HudRenderEvents.AFTER_MAIN_HUD.register((context, tickDelta) -> render(context)); @@ -35,11 +37,11 @@ public class DungeonMap { ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> reset()); } - private static void render(MatrixStack matrices) { + public static void render(MatrixStack matrices) { MinecraftClient client = MinecraftClient.getInstance(); if (client.player == null || client.world == null) return; - int mapId = getMapId(client.player.getInventory().main.get(8)); + MapIdComponent mapId = getMapIdComponent(client.player.getInventory().main.get(8)); MapState state = FilledMapItem.getMapState(mapId, client.world); if (state == null) return; @@ -58,13 +60,12 @@ public class DungeonMap { matrices.pop(); } - public static int getMapId(ItemStack stack) { - if (stack.isOf(Items.FILLED_MAP)) { - @SuppressWarnings("DataFlowIssue") - int mapId = FilledMapItem.getMapId(stack); - cachedMapId = mapId; - return mapId; - } else return cachedMapId != null ? cachedMapId : DEFAULT_MAP_ID; + public static MapIdComponent getMapIdComponent(ItemStack stack) { + if (stack.isOf(Items.FILLED_MAP) && stack.contains(DataComponentTypes.MAP_ID)) { + MapIdComponent mapIdComponent = stack.get(DataComponentTypes.MAP_ID); + cachedMapIdComponent = mapIdComponent; + return mapIdComponent; + } else return cachedMapIdComponent != null ? cachedMapIdComponent : DEFAULT_MAP_ID_COMPONENT; } private static void render(DrawContext context) { @@ -74,6 +75,6 @@ public class DungeonMap { } private static void reset() { - cachedMapId = null; + cachedMapIdComponent = null; } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/OptionDropdownWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/OptionDropdownWidget.java index 64e45283..19241d58 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/OptionDropdownWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/OptionDropdownWidget.java @@ -29,7 +29,6 @@ public class OptionDropdownWidget extends ElementListWidget { String floor = "???"; String dungeon = "???"; String note = ""; - NbtCompound floorSkullNBT = new NbtCompound(); + PropertyMap floorSkullProperties = new PropertyMap(); Identifier partyLeaderSkin = DefaultSkinHelper.getTexture(); Player[] partyMembers = new Player[4]; @@ -87,14 +89,14 @@ public class PartyEntry extends ElementListWidget.Entry { if (PartyFinderScreen.floorIconsMaster == null || PartyFinderScreen.floorIconsNormal == null) continue; if (dungeon.contains("Master Mode")) { try { - floorSkullNBT = StringNbtReader.parse(PartyEntryListWidget.BASE_SKULL_NBT.replace("%TEXTURE%", PartyFinderScreen.floorIconsMaster.getOrDefault(floor.toLowerCase(), ""))); - } catch (CommandSyntaxException e) { + floorSkullProperties = PartyFinderScreen.floorIconsMaster.getOrDefault(floor.toLowerCase(), new PropertyMap()); + } catch (Exception e) { throw new RuntimeException(e); } } else { try { - floorSkullNBT = StringNbtReader.parse(PartyEntryListWidget.BASE_SKULL_NBT.replace("%TEXTURE%", PartyFinderScreen.floorIconsNormal.getOrDefault(floor.toLowerCase(), ""))); - } catch (CommandSyntaxException e) { + floorSkullProperties = PartyFinderScreen.floorIconsNormal.getOrDefault(floor.toLowerCase(), new PropertyMap()); + } catch (Exception e) { throw new RuntimeException(e); } } @@ -226,7 +228,7 @@ public class PartyEntry extends ElementListWidget.Entry { } } ItemStack stack = new ItemStack(Items.PLAYER_HEAD); - stack.setNbt(floorSkullNBT); + stack.set(DataComponentTypes.PROFILE, new ProfileComponent("SkyblockerCustomPF", Optional.of(UUID.randomUUID()), floorSkullProperties)); context.drawItem(stack, 317, 3); int textWidth = textRenderer.getWidth(floor); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java index 16be2b67..98ab88c0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java @@ -1,7 +1,10 @@ package de.hysky.skyblocker.skyblock.dungeon.partyfinder; import com.google.gson.JsonObject; +import com.mojang.authlib.properties.PropertyMap; + import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.utils.ItemUtils; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.client.MinecraftClient; @@ -99,8 +102,8 @@ public class PartyFinderScreen extends Screen { private boolean waitingForServer = false; - public static Map floorIconsNormal = null; - public static Map floorIconsMaster = null; + public static Map floorIconsNormal = null; + public static Map floorIconsMaster = null; public static void initClass() { ClientLifecycleEvents.CLIENT_STARTED.register(client -> { @@ -110,8 +113,8 @@ public class PartyFinderScreen extends Screen { floorIconsMaster = new HashMap<>(); try (BufferedReader skullTextureReader = client.getResourceManager().openAsReader(new Identifier(SkyblockerMod.NAMESPACE, "dungeons/catacombs/floorskulls.json"))) { JsonObject json = SkyblockerMod.GSON.fromJson(skullTextureReader, JsonObject.class); - json.getAsJsonObject("normal").asMap().forEach((s, jsonElement) -> floorIconsNormal.put(s, jsonElement.getAsString())); - json.getAsJsonObject("master").asMap().forEach((s, jsonElement) -> floorIconsMaster.put(s, jsonElement.getAsString())); + json.getAsJsonObject("normal").asMap().forEach((s, tex) -> floorIconsNormal.put(s, ItemUtils.propertyMapWithTexture(tex.getAsString()))); + json.getAsJsonObject("master").asMap().forEach((s, tex) -> floorIconsMaster.put(s, ItemUtils.propertyMapWithTexture(tex.getAsString()))); LOGGER.debug("[Skyblocker] Dungeons floor skull textures json loaded"); } catch (Exception e) { LOGGER.error("[Skyblocker] Failed to load dungeons floor skull textures json", e); @@ -136,7 +139,6 @@ public class PartyFinderScreen extends Screen { int widget_height = (int) (this.height * 0.8); int entryListTopY = Math.max(43, (int) (height * 0.1)); this.partyEntryListWidget = new PartyEntryListWidget(client, width, widget_height, entryListTopY, 68); - partyEntryListWidget.setRenderBackground(false); // Search field this.searchField = new TextFieldWidget(textRenderer, partyEntryListWidget.getRowLeft() + 12, entryListTopY - 12, partyEntryListWidget.getRowWidth() - 12 * 3 - 6, 12, Text.literal("Search...")); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java index c90f1134..8bb22e7e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java @@ -40,6 +40,7 @@ import net.minecraft.command.CommandSource; import net.minecraft.command.argument.BlockPosArgumentType; import net.minecraft.command.argument.PosArgument; import net.minecraft.command.argument.TextArgumentType; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.LivingEntity; @@ -462,7 +463,7 @@ public class DungeonManager { context.getSource().sendError(Constants.PREFIX.get().append("§cFailed to get dungeon map.")); return Command.SINGLE_SUCCESS; } - MapState map = FilledMapItem.getMapState(FilledMapItem.getMapId(stack), client.world); + MapState map = FilledMapItem.getMapState(stack.get(DataComponentTypes.MAP_ID), client.world); if (map == null) { context.getSource().sendError(Constants.PREFIX.get().append("§cFailed to get dungeon map state.")); return Command.SINGLE_SUCCESS; @@ -539,7 +540,7 @@ public class DungeonManager { physicalEntrancePos = DungeonMapUtils.getPhysicalRoomPos(playerPos); currentRoom = newRoom(Room.Type.ENTRANCE, physicalEntrancePos); } - MapState map = FilledMapItem.getMapState(DungeonMap.getMapId(client.player.getInventory().main.get(8)), client.world); + MapState map = FilledMapItem.getMapState(DungeonMap.getMapIdComponent(client.player.getInventory().main.get(8)), client.world); if (map == null) { return; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java index 30de9a48..10dc2b5c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java @@ -4,6 +4,8 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent; import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ProfileComponent; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -12,6 +14,9 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; import java.text.NumberFormat; +import java.util.Optional; + +import com.mojang.authlib.properties.PropertyMap; public class EndHudWidget extends Widget { private static final MutableText TITLE = Text.literal("The End").formatted(Formatting.LIGHT_PURPLE, Formatting.BOLD); @@ -29,7 +34,7 @@ public class EndHudWidget extends Widget { private static final ItemStack POPPY = new ItemStack(Items.POPPY); static { - ENDERMAN_HEAD.getOrCreateNbt().putString("SkullOwner", "MHF_Enderman"); + ENDERMAN_HEAD.set(DataComponentTypes.PROFILE, new ProfileComponent("MHF_Enderman", Optional.empty(), new PropertyMap())); POPPY.addEnchantment(Enchantments.INFINITY, 1); INSTANCE.setX(SkyblockerConfigManager.get().locations.end.x); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java index 12ae468f..9650e39b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java @@ -6,14 +6,15 @@ import de.hysky.skyblocker.skyblock.dungeon.LividColor; import de.hysky.skyblocker.utils.SlayerUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.culling.OcclusionCulling; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ProfileComponent; import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.entity.mob.EndermanEntity; import net.minecraft.entity.passive.BatEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; +import net.minecraft.item.Items; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.util.Formatting; import net.minecraft.util.math.Box; @@ -21,6 +22,8 @@ import net.minecraft.world.World; import java.util.List; +import com.mojang.authlib.properties.Property; + public class MobGlow { public static boolean shouldMobGlow(Entity entity) { @@ -114,19 +117,18 @@ public class MobGlow { for (ItemStack armorItem : entity.getArmorItems()) { // hacky way to check if an item is a player head w/o // some shenanigans - if (!armorItem.toString().startsWith("1 player_head")) + if (!armorItem.isOf(Items.PLAYER_HEAD)) continue; // eb07594e2df273921a77c101d0bfdfa1115abed5b9b2029eb496ceba9bdbb4b3 is texture id for the nukekubi head, // compare against it to exclusively find armorstands that are nukekubi heads - NbtCompound skullOwner = armorItem.getSubNbt("SkullOwner"); - if (skullOwner != null) { + ProfileComponent profile = armorItem.get(DataComponentTypes.PROFILE); + if (profile != null) { // get the texture of the nukekubi head item itself and compare it - String texture = skullOwner - .getCompound("Properties") - .getList("textures", NbtElement.COMPOUND_TYPE) - .getCompound(0) - .getString("Value"); + String texture = profile.properties().get("textures").stream() + .map(Property::value) + .findFirst() + .orElse("None"); return texture.contains("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0="); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java index 95c72241..374e9e12 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java @@ -54,7 +54,7 @@ public class FarmingHud { } ItemStack stack = MinecraftClient.getInstance().player.getMainHandStack(); - Matcher matcher = ItemUtils.getNbtTooltip(stack, FarmingHud.COUNTER); + Matcher matcher = ItemUtils.getLoreLineIfMatch(stack, FarmingHud.COUNTER); if (matcher != null) { try { int count = NUMBER_FORMAT.parse(matcher.group("count")).intValue(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java index 6640d413..2805cb0e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java @@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.garden; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; +import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.NEURepoManager; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; @@ -12,14 +13,11 @@ import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.component.DataComponentTypes; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; -import net.minecraft.text.Text.Serialization; import net.minecraft.util.Formatting; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -27,6 +25,7 @@ import org.slf4j.LoggerFactory; import java.text.NumberFormat; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; @@ -85,30 +84,27 @@ public class VisitorHelper { private static void processVisitorItem(String visitorName, ScreenHandler handler) { ItemStack visitorItem = handler.getSlot(13).getStack(); - if (visitorItem == null || !visitorItem.hasNbt() || !visitorItem.getNbt().asString().contains("Times Visited")) return; + if (visitorItem == null || !visitorItem.contains(DataComponentTypes.LORE) || ItemUtils.getLoreLineIf(visitorItem, t -> t.contains("Times Visited")) == null) return; ItemStack acceptButton = handler.getSlot(29).getStack(); if (acceptButton == null) return; - NbtCompound acceptButtonNbt = acceptButton.getSubNbt("display"); - if (acceptButtonNbt == null || !acceptButtonNbt.contains("Lore", NbtElement.LIST_TYPE)) return; - processLore(visitorName, acceptButtonNbt.getList("Lore", NbtElement.STRING_TYPE)); + processLore(visitorName, ItemUtils.getLore(acceptButton)); } - private static void processLore(String visitorName, NbtList loreList) { + private static void processLore(String visitorName, List loreList) { boolean saveRequiredItems = false; for (int i = 0; i < loreList.size(); i++) { - String lore = loreList.getString(i); + String lore = loreList.get(i).getString(); if (lore.contains("Items Required")) saveRequiredItems = true; else if (lore.contains("Rewards")) break; else if (saveRequiredItems) - updateItemMap(visitorName, lore); + updateItemMap(visitorName, loreList.get(i)); } } - private static void updateItemMap(String visitorName, String lore) { - Text itemText = Serialization.fromJson(lore); - String[] splitItemText = itemText.getString().split(" x"); + private static void updateItemMap(String visitorName, Text lore) { + String[] splitItemText = lore.getString().split(" x"); String itemName = splitItemText[0].trim(); if (itemName.isEmpty()) return; try { @@ -117,7 +113,7 @@ public class VisitorHelper { visitorMap.putIfAbsent(itemName, amount); itemMap.putIfAbsent(visitorName, visitorMap); } catch (Exception e) { - LOGGER.error("[Skyblocker Visitor Helper] Failed to parse item: " + itemText.getString(), e); + LOGGER.error("[Skyblocker Visitor Helper] Failed to parse item: " + lore.getString(), e); } } @@ -163,7 +159,7 @@ public class VisitorHelper { } private static void drawItemEntryWithHover(DrawContext context, TextRenderer textRenderer, @Nullable ItemStack stack, String itemName, int amount, int index, int mouseX, int mousseY) { - Text text = stack != null ? Serialization.fromJson(stack.getSubNbt("display").getString("Name")).append(" x" + amount) : Text.literal(itemName + " x" + amount); + Text text = stack != null ? stack.getName().copy().append(" x" + amount) : Text.literal(itemName + " x" + amount); drawTextWithOptionalUnderline(context, textRenderer, text, TEXT_START_X + TEXT_INDENT, TEXT_START_Y + (index * (LINE_SPACING + textRenderer.fontHeight)), mouseX, mousseY); // drawItem adds 150 to the z, which puts our z at 350, above the item in the slot (250) and their text (300) and below the cursor stack (382) and their text (432) if (stack != null) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorDyeColors.java b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorDyeColors.java index 639e98ed..97311220 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorDyeColors.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorDyeColors.java @@ -12,8 +12,8 @@ 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.DyeableItem; import net.minecraft.item.ItemStack; +import net.minecraft.registry.tag.ItemTags; import net.minecraft.text.Text; public class CustomArmorDyeColors { @@ -40,7 +40,7 @@ public class CustomArmorDyeColors { } if (Utils.isOnSkyblock() && heldItem != null) { - if (heldItem.getItem() instanceof DyeableItem) { + if (heldItem.isIn(ItemTags.DYEABLE)) { String itemUuid = ItemUtils.getItemUuid(heldItem); if (!itemUuid.isEmpty()) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorTrims.java b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorTrims.java index 3434f026..270622ff 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorTrims.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorTrims.java @@ -34,11 +34,9 @@ import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Optional; - public class CustomArmorTrims { private static final Logger LOGGER = LoggerFactory.getLogger(CustomArmorTrims.class); - public static final Object2ObjectOpenHashMap> TRIMS_CACHE = new Object2ObjectOpenHashMap<>(); + public static final Object2ObjectOpenHashMap TRIMS_CACHE = new Object2ObjectOpenHashMap<>(); private static boolean trimsInitialized = false; public static void init() { @@ -65,7 +63,7 @@ public class CustomArmorTrims { // Something went terribly wrong if (trim == null) throw new IllegalStateException("Trim shouldn't be null! [" + "\"" + material + "\",\"" + pattern + "\"]"); - TRIMS_CACHE.put(new ArmorTrimId(material, pattern), Optional.of(trim)); + TRIMS_CACHE.put(new ArmorTrimId(material, pattern), trim); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java index 37de58e6..77cbc953 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/BackpackPreview.java @@ -1,6 +1,11 @@ package de.hysky.skyblocker.skyblock.item.tooltip; +import com.google.gson.JsonParser; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; +import com.mojang.serialization.codecs.RecordCodecBuilder; + import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds; @@ -15,18 +20,16 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.inventory.Inventory; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtInt; -import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.NbtList; import net.minecraft.util.Identifier; -import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.BufferedReader; +import java.io.BufferedWriter; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Objects; +import java.util.ArrayList; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -61,8 +64,13 @@ public class BackpackPreview { String id = MinecraftClient.getInstance().getSession().getUuidOrNull().toString().replaceAll("-", "") + "/" + Utils.getProfileId(); if (!id.equals(loaded)) { saveDir = SkyblockerMod.CONFIG_DIR.resolve("backpack-preview/" + id); - //noinspection ResultOfMethodCallIgnored - saveDir.toFile().mkdirs(); + + try { + Files.createDirectories(saveDir); + } catch (Exception e) { + LOGGER.error("[Skyblocker] Failed to create the backpack preview save directory! Path: {}", saveDir, e); + } + // load storage again because profile id changed loaded = id; loadStorages(); @@ -73,10 +81,10 @@ public class BackpackPreview { private static void loadStorages() { for (int index = 0; index < STORAGE_SIZE; ++index) { storages[index] = null; - Path storageFile = saveDir.resolve(index + ".nbt"); + Path storageFile = saveDir.resolve(index + ".json"); if (Files.isRegularFile(storageFile)) { - try { - storages[index] = Storage.fromNbt(Objects.requireNonNull(NbtIo.read(storageFile))); + try (BufferedReader reader = Files.newBufferedReader(storageFile)) { + storages[index] = Storage.CODEC.parse(JsonOps.INSTANCE, JsonParser.parseReader(reader)).result().orElseThrow(); } catch (Exception e) { LOGGER.error("Failed to load backpack preview file: " + storageFile.getFileName().toString(), e); } @@ -93,11 +101,12 @@ public class BackpackPreview { } private static void saveStorage(int index) { - try { - NbtIo.write(storages[index].toNbt(), saveDir.resolve(index + ".nbt")); + Path storageFile = saveDir.resolve(index + ".json"); + try (BufferedWriter writer = Files.newBufferedWriter(storageFile)) { + SkyblockerMod.GSON.toJson(Storage.CODEC.encodeStart(JsonOps.INSTANCE, storages[index]).result().orElseThrow(), writer); storages[index].markClean(); } catch (Exception e) { - LOGGER.error("Failed to save backpack preview file: " + index + ".nbt", e); + LOGGER.error("Failed to save backpack preview file: " + index + ".json", e); } } @@ -129,7 +138,7 @@ public class BackpackPreview { context.drawTexture(TEXTURE, x, y + rows * 18 + 17, 0, 215, 176, 7); TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; - context.drawText(textRenderer, storages[index].name, x + 8, y + 6, 0x404040, false); + context.drawText(textRenderer, storages[index].name(), x + 8, y + 6, 0x404040, false); matrices.translate(0f, 0f, 200f); for (int i = 9; i < storages[index].size(); ++i) { @@ -159,6 +168,10 @@ public class BackpackPreview { } static class Storage { + private static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.STRING.fieldOf("name").forGetter(Storage::name), + ItemStack.CODEC.listOf().fieldOf("items").forGetter(Storage::getItemList)) + .apply(instance, (name, items) -> Storage.create(name, items))); private final Inventory inventory; private final String name; private boolean dirty; @@ -168,6 +181,10 @@ public class BackpackPreview { this.name = name; this.dirty = dirty; } + + private String name() { + return name; + } private int size() { return inventory.size(); @@ -181,23 +198,19 @@ public class BackpackPreview { dirty = false; } - @NotNull - private static Storage fromNbt(NbtCompound root) { - SimpleInventory inventory = new SimpleInventory(root.getList("list", NbtCompound.COMPOUND_TYPE).stream().map(NbtCompound.class::cast).map(ItemStack::fromNbt).toArray(ItemStack[]::new)); - return new Storage(inventory, root.getString("name"), false); + private static Storage create(String name, List items) { + SimpleInventory inventory = new SimpleInventory(items.toArray(ItemStack[]::new)); + return new Storage(inventory, name, false); } - @NotNull - private NbtCompound toNbt() { - NbtCompound root = new NbtCompound(); - NbtList list = new NbtList(); + private List getItemList() { + List items = new ArrayList<>(); + for (int i = 0; i < size(); ++i) { - list.add(getStack(i).writeNbt(new NbtCompound())); + items.add(getStack(i)); } - root.put("list", list); - root.put("size", NbtInt.of(size())); - root.putString("name", name); - return root; + + return items; } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index 562c244c..855a4760 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -13,13 +13,14 @@ import de.hysky.skyblocker.utils.scheduler.Scheduler; import it.unimi.dsi.fastutil.Pair; import net.minecraft.client.MinecraftClient; import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.DyeableItem; +import net.minecraft.component.type.DyedColorComponent; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; + import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -198,12 +199,13 @@ public class ItemTooltip { } } - if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && stack.getNbt() != null) { + if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID)) { String uuid = ItemUtils.getItemUuid(stack); boolean hasCustomDye = SkyblockerConfigManager.get().general.customDyeColors.containsKey(uuid) || SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(uuid); + int dyeColor = DyedColorComponent.getColor(stack, -1); - if (!hasCustomDye && DyeableItem.hasColor(stack)) { - String colorHex = String.format("%06X", DyeableItem.getColor(stack)); + if (!hasCustomDye && dyeColor != -1) { + String colorHex = String.format("%06X", dyeColor); String expectedHex = ExoticTooltip.getExpectedHex(internalID); boolean correctLine = false; @@ -212,13 +214,13 @@ public class ItemTooltip { if (existingTooltip.startsWith("Color: ")) { correctLine = true; - addExoticTooltip(lines, internalID, stack.getNbt(), colorHex, expectedHex, existingTooltip); + addExoticTooltip(lines, internalID, ItemUtils.getCustomData(stack).copyNbt(), colorHex, expectedHex, existingTooltip); break; } } if (!correctLine) { - addExoticTooltip(lines, internalID, stack.getNbt(), colorHex, expectedHex, ""); + addExoticTooltip(lines, internalID, ItemUtils.getCustomData(stack).copyNbt(), colorHex, expectedHex, ""); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java index c1eea23a..11c3687e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java @@ -5,15 +5,25 @@ import de.hysky.skyblocker.utils.NEURepoManager; import io.github.moulberry.repo.constants.PetNumbers; import io.github.moulberry.repo.data.NEUItem; import io.github.moulberry.repo.data.Rarity; -import net.minecraft.item.FireworkRocketItem; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.AttributeModifiersComponent; +import net.minecraft.component.type.DyedColorComponent; +import net.minecraft.component.type.FireworkExplosionComponent; +import net.minecraft.component.type.LoreComponent; +import net.minecraft.component.type.NbtComponent; +import net.minecraft.component.type.ProfileComponent; import net.minecraft.item.ItemStack; import net.minecraft.nbt.*; +import net.minecraft.registry.Registries; import net.minecraft.text.Text; +import net.minecraft.util.Identifier; import net.minecraft.util.Pair; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; public class ItemStackBuilder { private static Map> petNums; @@ -31,73 +41,62 @@ public class ItemStackBuilder { List> injectors = new ArrayList<>(petData(internalName)); - NbtCompound root = new NbtCompound(); - root.put("Count", NbtByte.of((byte) 1)); + String legacyId = item.getMinecraftItemId(); + Identifier itemId = new Identifier(ItemFixerUpper.convertItemId(legacyId, item.getDamage())); + + ItemStack stack = new ItemStack(Registries.ITEM.get(itemId)); - String id = item.getMinecraftItemId(); - int damage = item.getDamage(); - root.put("id", NbtString.of(ItemFixerUpper.convertItemId(id, damage))); + // Create & Attach ExtraAttributes tag + NbtCompound customData = new NbtCompound(); + NbtCompound extraAttributes = new NbtCompound(); + customData.put(ItemUtils.EXTRA_ATTRIBUTES, extraAttributes); - NbtCompound tag = new NbtCompound(); - root.put("tag", tag); - - NbtCompound extra = new NbtCompound(); - tag.put(ItemUtils.EXTRA_ATTRIBUTES, extra); - extra.put(ItemUtils.ID, NbtString.of(internalName)); - - NbtCompound display = new NbtCompound(); - tag.put("display", display); + // Add Skyblock Item Id + extraAttributes.put(ItemUtils.ID, NbtString.of(internalName)); + // Item Name String name = injectData(item.getDisplayName(), injectors); - display.put("Name", NbtString.of(Text.Serialization.toJsonString(Text.of(name)))); + stack.set(DataComponentTypes.CUSTOM_NAME, Text.of(name)); - NbtList lore = new NbtList(); - display.put("Lore", lore); - item.getLore().forEach(el -> lore.add(NbtString.of(Text.Serialization.toJsonString(Text.of(injectData(el, injectors)))))); + // Lore + stack.set(DataComponentTypes.LORE, new LoreComponent(item.getLore().stream().map(line -> Text.of(injectData(line, injectors))).collect(Collectors.toCollection(() -> new ArrayList<>())))); String nbttag = item.getNbttag(); // add skull texture Matcher skullUuid = Pattern.compile("(?<=SkullOwner:\\{)Id:\"(.{36})\"").matcher(nbttag); Matcher skullTexture = Pattern.compile("(?<=Properties:\\{textures:\\[0:\\{Value:)\"(.+?)\"").matcher(nbttag); if (skullUuid.find() && skullTexture.find()) { - NbtCompound skullOwner = new NbtCompound(); - tag.put("SkullOwner", skullOwner); UUID uuid = UUID.fromString(skullUuid.group(1)); - skullOwner.put("Id", NbtHelper.fromUuid(uuid)); - skullOwner.put("Name", NbtString.of(internalName)); - - NbtCompound properties = new NbtCompound(); - skullOwner.put("Properties", properties); - NbtList textures = new NbtList(); - properties.put("textures", textures); - NbtCompound texture = new NbtCompound(); - textures.add(texture); - texture.put("Value", NbtString.of(skullTexture.group(1))); + String textureValue = skullTexture.group(1); + + stack.set(DataComponentTypes.PROFILE, new ProfileComponent(internalName, Optional.of(uuid), ItemUtils.propertyMapWithTexture(textureValue))); } + // add leather armor dye color Matcher colorMatcher = Pattern.compile("color:(\\d+)").matcher(nbttag); if (colorMatcher.find()) { - NbtInt color = NbtInt.of(Integer.parseInt(colorMatcher.group(1))); - display.put("color", color); + int color = Integer.parseInt(colorMatcher.group(1)); + stack.set(DataComponentTypes.DYED_COLOR, new DyedColorComponent(color, false)); } // add enchantment glint if (nbttag.contains("ench:")) { - NbtList enchantments = new NbtList(); - enchantments.add(new NbtCompound()); - tag.put("Enchantments", enchantments); + stack.set(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, true); } + + //Hide weapon damage and other useless info + stack.set(DataComponentTypes.ATTRIBUTE_MODIFIERS, new AttributeModifiersComponent(List.of(), false)); // Add firework star color Matcher explosionColorMatcher = Pattern.compile("\\{Explosion:\\{(?:Type:[0-9a-z]+,)?Colors:\\[(?[0-9]+)]\\}").matcher(nbttag); if (explosionColorMatcher.find()) { - NbtCompound explosion = new NbtCompound(); - - explosion.putInt("Type", FireworkRocketItem.Type.SMALL_BALL.getId()); //Forget about the actual ball type because it probably doesn't matter - explosion.putIntArray("Colors", new int[]{Integer.parseInt(explosionColorMatcher.group("color"))}); - tag.put("Explosion", explosion); + //Forget about the actual ball type because it probably doesn't matter + stack.set(DataComponentTypes.FIREWORK_EXPLOSION, new FireworkExplosionComponent(FireworkExplosionComponent.Type.SMALL_BALL, new IntArrayList(Integer.parseInt(explosionColorMatcher.group("color"))), new IntArrayList(), false, false)); } + + // Attach custom nbt data + stack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(customData)); - return ItemStack.fromNbt(root); + return stack; } private static List> petData(String internalName) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java index 44e336d9..961a2cc2 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/SearchResultsWidget.java @@ -8,10 +8,13 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.screen.ButtonTextures; import net.minecraft.client.gui.widget.ToggleButtonWidget; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.LoreComponent; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; + import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -74,11 +77,8 @@ public class SearchResultsWidget implements Drawable { this.searchResults.clear(); for (ItemStack entry : ItemRepository.getItems()) { String name = entry.getName().toString().toLowerCase(Locale.ENGLISH); - if (entry.getNbt() == null) { - continue; - } - String disp = entry.getNbt().getCompound("display").toString().toLowerCase(Locale.ENGLISH); - if (name.contains(this.searchText) || disp.contains(this.searchText)) + LoreComponent lore = entry.getOrDefault(DataComponentTypes.LORE, LoreComponent.DEFAULT); + if (name.contains(this.searchText) || lore.lines().stream().map(Text::getString).anyMatch(s -> s.contains(this.searchText))) this.searchResults.add(entry); } this.currentPage = 0; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java index 51a3d409..8e203b84 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNav.java @@ -5,12 +5,12 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.datafixer.ItemStackComponentizationFixer; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.fabricmc.fabric.api.client.screen.v1.Screens; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.StringNbtReader; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -21,8 +21,6 @@ import java.util.Locale; import java.util.regex.PatternSyntaxException; public class QuickNav { - private static final String skyblockHubIconNbt = "{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}}"; - private static final String dungeonHubIconNbt = "{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}}"; public static void init() { ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { @@ -74,7 +72,6 @@ public class QuickNav { return new QuickNavButton(id, uiTitleMatches, buttonInfo.clickEvent, - ItemStack.fromNbt(StringNbtReader.parse(nbtString)) - ); + ItemStackComponentizationFixer.fixUpItem(StringNbtReader.parse(nbtString))); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java b/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java index bc4f98c2..8e10086f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/special/SpecialEffects.java @@ -1,42 +1,24 @@ package de.hysky.skyblocker.skyblock.special; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.RenderHelper; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.minecraft.client.MinecraftClient; -import net.minecraft.enchantment.Enchantments; import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.StringNbtReader; import net.minecraft.particle.ParticleTypes; import net.minecraft.text.Text; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; public class SpecialEffects { private static final Logger LOGGER = LoggerFactory.getLogger(SpecialEffects.class); private static final Pattern DROP_PATTERN = Pattern.compile("(?:\\[[A-Z+]+] )?(?[A-Za-z0-9_]+) unlocked (?.+)!"); - private static final ItemStack NECRON_HANDLE = new ItemStack(Items.STICK); - private static final ItemStack SCROLL = new ItemStack(Items.WRITABLE_BOOK); - private static ItemStack TIER_5_SKULL; - private static ItemStack FIFTH_STAR; - - static { - NECRON_HANDLE.addEnchantment(Enchantments.PROTECTION, 1); - SCROLL.addEnchantment(Enchantments.PROTECTION, 1); - try { - TIER_5_SKULL = ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-1613868903,-527154034,-1445577520,748807544],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTEwZjlmMTA4NWQ0MDcxNDFlYjc3NjE3YTRhYmRhYWEwOGQ4YWYzM2I5NjAyMDBmZThjMTI2YzFkMTQ0NTY4MiJ9fX0=\"}]}}}}")); - FIFTH_STAR = ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;1904417095,756174249,-1302927470,1407004198],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzFjODA0MjUyN2Y4MWM4ZTI5M2UyODEwMTEzNDg5ZjQzOTRjYzZlZmUxNWQxYWZhYzQzMTU3MWM3M2I2MmRjNCJ9fX0=\"}]}}}}")); - } catch (Exception e) { - TIER_5_SKULL = ItemStack.EMPTY; - FIFTH_STAR = ItemStack.EMPTY; - LOGGER.error("[Skyblocker Special Effects] Failed to parse NBT for a player head!", e); - } - } public static void init() { ClientReceiveMessageEvents.GAME.register(SpecialEffects::displayRareDropEffect); @@ -45,7 +27,7 @@ public class SpecialEffects { private static void displayRareDropEffect(Text message, boolean overlay) { //We don't check if we're in dungeons because that check doesn't work in m7 which defeats the point of this //It might also allow it to work with Croesus - if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.specialEffects.rareDungeonDropEffects) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.specialEffects.rareDungeonDropEffects && !overlay) { try { String stringForm = message.getString(); Matcher matcher = DROP_PATTERN.matcher(stringForm); @@ -57,7 +39,7 @@ public class SpecialEffects { if (player.equals(client.getSession().getUsername())) { ItemStack stack = getStackFromName(matcher.group("item")); - if (!stack.isEmpty()) { + if (stack != null && !stack.isEmpty()) { RenderHelper.runOnRenderThread(() -> { client.particleManager.addEmitter(client.player, ParticleTypes.PORTAL, 30); client.gameRenderer.showFloatingItem(stack); @@ -72,20 +54,22 @@ public class SpecialEffects { } private static ItemStack getStackFromName(String itemName) { - return switch (itemName) { + String itemId = switch (itemName) { //M7 - case "Necron Dye" -> new ItemStack(Items.ORANGE_DYE); - case "Dark Claymore" -> new ItemStack(Items.STONE_SWORD); - case "Necron's Handle", "Shiny Necron's Handle" -> NECRON_HANDLE; - case "Enchanted Book (Thunderlord VII)" -> new ItemStack(Items.ENCHANTED_BOOK); - case "Master Skull - Tier 5" -> TIER_5_SKULL; - case "Shadow Warp", "Wither Shield", "Implosion" -> SCROLL; - case "Fifth Master Star" -> FIFTH_STAR; + case "Necron Dye" -> "NECRON_DYE"; + case "Dark Claymore" -> "DARK_CLAYMORE"; + case "Necron's Handle", "Shiny Necron's Handle" -> "NECRON_HANDLE"; + case "Enchanted Book (Thunderlord VII)" -> "ENCHANTED_BOOK"; + case "Master Skull - Tier 5" -> "MASTER_SKULL_TIER_5"; + case "Shadow Warp", "Wither Shield", "Implosion" -> "IMPLOSION_SCROLL"; + case "Fifth Master Star" -> "FIFTH_MASTER_STAR"; //M6 - case "Giant's Sword" -> new ItemStack(Items.IRON_SWORD); + case "Giant's Sword" -> "GIANTS_SWORD"; - default -> ItemStack.EMPTY; + default -> "NONE"; }; + + return ItemRepository.getItemStack(itemId); } } diff --git a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java index 70a8c241..9768ff11 100644 --- a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java @@ -1,18 +1,26 @@ package de.hysky.skyblocker.utils; +import com.google.gson.Gson; +import com.google.gson.JsonParser; +import com.mojang.authlib.properties.PropertyMap; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import de.hysky.skyblocker.mixin.accessor.ItemStackAccessor; +import com.mojang.serialization.JsonOps; + import it.unimi.dsi.fastutil.ints.IntIntPair; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.LoreComponent; +import net.minecraft.component.type.NbtComponent; +import net.minecraft.component.type.ProfileComponent; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.StringNbtReader; import net.minecraft.text.Text; -import net.minecraft.text.Texts; import net.minecraft.util.Formatting; +import net.minecraft.util.dynamic.Codecs; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -39,13 +47,18 @@ public class ItemUtils { private static final SimpleDateFormat OLD_OBTAINED_DATE_FORMAT = new SimpleDateFormat("MM/dd/yy"); public static final Pattern NOT_DURABILITY = Pattern.compile("[^0-9 /]"); public static final Predicate FUEL_PREDICATE = line -> line.contains("Fuel: "); + private static final Gson GSON = new Gson(); //GSON Instance with no config - public static LiteralArgumentBuilder dumpHeldItemNbtCommand() { - return literal("dumpHeldItemNbt").executes(context -> { - context.getSource().sendFeedback(Text.literal("[Skyblocker Debug] Held Item Nbt: " + context.getSource().getPlayer().getMainHandStack().writeNbt(new NbtCompound()))); + public static LiteralArgumentBuilder dumpHeldItemCommand() { + return literal("dumpHeldItem").executes(context -> { + context.getSource().sendFeedback(Text.literal("[Skyblocker Debug] Held Item: " + GSON.toJson(ItemStack.CODEC.encodeStart(JsonOps.INSTANCE, context.getSource().getPlayer().getMainHandStack()).result().orElseThrow()))); return Command.SINGLE_SUCCESS; }); } + + public static NbtComponent getCustomData(@NotNull ItemStack stack) { + return stack.getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT); + } /** * Gets the {@code ExtraAttributes} NBT tag from the item stack. @@ -54,7 +67,7 @@ public class ItemUtils { * @return an optional containing the {@code ExtraAttributes} NBT tag of the item stack */ public static Optional getExtraAttributesOptional(@NotNull ItemStack stack) { - return Optional.ofNullable(stack.getSubNbt(EXTRA_ATTRIBUTES)); + return Optional.ofNullable(getExtraAttributes(stack)); } /** @@ -65,7 +78,9 @@ public class ItemUtils { */ @Nullable public static NbtCompound getExtraAttributes(@NotNull ItemStack stack) { - return stack.getSubNbt(EXTRA_ATTRIBUTES); + NbtComponent customData = getCustomData(stack); + NbtCompound customNbt = customData.copyNbt(); + return customNbt.contains(EXTRA_ATTRIBUTES) ? customNbt.getCompound(EXTRA_ATTRIBUTES) : null; } /** @@ -166,7 +181,7 @@ public class ItemUtils { return IntIntPair.of(pickonimbusDurability, 5000); } - String drillFuel = Formatting.strip(getNbtTooltip(stack, FUEL_PREDICATE)); + String drillFuel = Formatting.strip(getLoreLineIf(stack, FUEL_PREDICATE)); if (drillFuel != null) { String[] drillFuelStrings = NOT_DURABILITY.matcher(drillFuel).replaceAll("").trim().split("/"); return IntIntPair.of(Integer.parseInt(drillFuelStrings[0]), Integer.parseInt(drillFuelStrings[1]) * 1000); @@ -176,8 +191,8 @@ public class ItemUtils { } @Nullable - public static String getNbtTooltip(ItemStack item, Predicate predicate) { - for (Text line : getNbtTooltips(item)) { + public static String getLoreLineIf(ItemStack item, Predicate predicate) { + for (Text line : getLore(item)) { String string = line.getString(); if (predicate.test(string)) { return string; @@ -188,8 +203,8 @@ public class ItemUtils { } @Nullable - public static Matcher getNbtTooltip(ItemStack item, Pattern pattern) { - for (Text line : getNbtTooltips(item)) { + public static Matcher getLoreLineIfMatch(ItemStack item, Pattern pattern) { + for (Text line : getLore(item)) { String string = line.getString(); Matcher matcher = pattern.matcher(string); if (matcher.matches()) { @@ -200,19 +215,24 @@ public class ItemUtils { return null; } - public static List getNbtTooltips(ItemStack item) { - NbtCompound displayNbt = item.getSubNbt("display"); - if (displayNbt == null || !displayNbt.contains("Lore", NbtElement.LIST_TYPE)) { - return Collections.emptyList(); - } + public static List getLore(ItemStack item) { + LoreComponent lore = item.getOrDefault(DataComponentTypes.LORE, LoreComponent.DEFAULT); - return displayNbt.getList("Lore", NbtElement.STRING_TYPE).stream().map(NbtElement::asString).map(Text.Serialization::fromJson).filter(Objects::nonNull).map(text -> Texts.setStyleIfAbsent(text, ItemStackAccessor.getLORE_STYLE())).map(Text.class::cast).toList(); + return lore.styledLines(); + } + + public static PropertyMap propertyMapWithTexture(String textureValue) { + return Codecs.GAME_PROFILE_PROPERTY_MAP.parse(JsonOps.INSTANCE, JsonParser.parseString("[{\"name\":\"textures\",\"value\":\"" + textureValue + "\"}]")).result().orElseThrow(); } public static ItemStack getSkyblockerStack() { try { - return ItemStack.fromNbt(StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}}")); - } catch (CommandSyntaxException e) { + ItemStack stack = new ItemStack(Items.PLAYER_HEAD); + stack.set(DataComponentTypes.PROFILE, new ProfileComponent("SkyblockerStack", Optional.of(java.util.UUID.randomUUID()), propertyMapWithTexture("e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0="))); + + return stack; + //return ItemStack.parseOptional(MinecraftClient.getInstance().player.getRegistryManager(), StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}}")); + } catch (Exception e) { throw new RuntimeException(e); } } diff --git a/src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java b/src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java new file mode 100644 index 00000000..f1306ad5 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java @@ -0,0 +1,26 @@ +package de.hysky.skyblocker.utils.datafixer; + +import com.mojang.serialization.Dynamic; + +import net.minecraft.datafixer.Schemas; +import net.minecraft.datafixer.TypeReferences; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtOps; + +/** + * Contains a data fixer to convert legacy item NBT to the new components system. + * + * @see {@link net.minecraft.datafixer.fix.ItemStackComponentizationFix} + */ +public class ItemStackComponentizationFixer { + private static final int ITEM_NBT_DATA_VERSION = 3817; + private static final int ITEM_COMPONENTS_DATA_VERSION = 3818; + + public static ItemStack fixUpItem(NbtCompound nbt) { + Dynamic dynamic = Schemas.getFixer().update(TypeReferences.ITEM_STACK, new Dynamic(NbtOps.INSTANCE, nbt), ITEM_NBT_DATA_VERSION, ITEM_COMPONENTS_DATA_VERSION); + + return ItemStack.CODEC.parse(dynamic).result().orElseThrow(); + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 451cd684..e5ed5db4 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,9 +34,9 @@ "accessWidener": "skyblocker.accesswidener", "depends": { "fabricloader": ">=0.15.7", - "fabric-api": ">=0.96.2+1.20.5", - "yet_another_config_lib_v3": ">=3.3.2+1.20.4", - "minecraft": "~1.20.5-alpha.24.7.a" + "fabric-api": ">=0.96.5+1.20.5", + "yet_another_config_lib_v3": ">=3.3.3+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT", + "minecraft": "~1.20.5-alpha.24.9.a" }, "conflicts": { "immediatelyfast": "<=1.2.11+1.20.4" diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 07168300..8a2205d4 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -5,14 +5,14 @@ "compatibilityLevel": "JAVA_17", "client": [ "AbstractInventoryScreenMixin", - "ArmorTrimMixin", "BatEntityMixin", "ClientPlayerEntityMixin", "ClientPlayNetworkHandlerMixin", "CommandTreeS2CPacketMixin", + "ComponentHolderMixin", "DataTrackerMixin", "DrawContextMixin", - "DyeableItemMixin", + "DyedColorComponentMixin", "EntityRenderDispatcherMixin", "FarmlandBlockMixin", "GenericContainerScreenHandlerMixin", @@ -43,7 +43,6 @@ "accessor.EndermanEntityAccessor", "accessor.FrustumInvoker", "accessor.HandledScreenAccessor", - "accessor.ItemStackAccessor", "accessor.LayeredDrawerAccessor", "accessor.MessageHandlerAccessor", "accessor.PlayerListHudAccessor", diff --git a/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java b/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java index 71ff29ef..e5025d7a 100644 --- a/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java +++ b/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java @@ -1,20 +1,23 @@ package de.hysky.skyblocker.utils; import com.mojang.brigadier.exceptions.CommandSyntaxException; + +import de.hysky.skyblocker.utils.datafixer.ItemStackComponentizationFixer; import it.unimi.dsi.fastutil.ints.IntIntPair; import net.minecraft.Bootstrap; import net.minecraft.SharedConstants; import net.minecraft.item.ItemStack; import net.minecraft.nbt.StringNbtReader; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; public class ItemUtilsTest { - private final ItemStack JUJU_SHORTBOW_OLD = ItemStack.fromNbt(StringNbtReader.parse("{Count:1b,id:\"minecraft:bow\",tag:{Damage:0,Enchantments:[{id:\"minecraft:protection\",lvl:0s}],ExtraAttributes:{art_of_war_count:1,dungeon_item_level:5,enchantments:{aiming:5,chance:4,cubism:5,impaling:3,infinite_quiver:10,overload:5,piercing:1,power:6,snipe:3,telekinesis:1,ultimate_soul_eater:5},hot_potato_count:15,id:\"JUJU_SHORTBOW\",modifier:\"spiritual\",originTag:\"QUICK_CRAFTING\",rarity_upgrades:1,runes:{DRAGON:3},stats_book:54778,timestamp:\"6/5/21 4:41 AM\",uuid:\"b06b8fe2-470a-43f3-b844-658472f20996\"},HideFlags:255,Unbreakable:1b,display:{Lore:['{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Gear Score: \"},{\"color\":\"light_purple\",\"text\":\"724 \"},{\"color\":\"dark_gray\",\"text\":\"(2297)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Damage: \"},{\"color\":\"red\",\"text\":\"+371 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"dark_gray\",\"text\":\"(+1,275)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Strength: \"},{\"color\":\"red\",\"text\":\"+107 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"gold\",\"text\":\"[+5] \"},{\"color\":\"blue\",\"text\":\"(+28) \"},{\"color\":\"dark_gray\",\"text\":\"(+386.25)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Chance: \"},{\"color\":\"red\",\"text\":\"+28% \"},{\"color\":\"blue\",\"text\":\"(+12%) \"},{\"color\":\"dark_gray\",\"text\":\"(+40.5%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Damage: \"},{\"color\":\"red\",\"text\":\"+181% \"},{\"color\":\"blue\",\"text\":\"(+55%) \"},{\"color\":\"dark_gray\",\"text\":\"(+637.5%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Shot Cooldown: \"},{\"color\":\"green\",\"text\":\"0.5s\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"color\":\"light_purple\",\"text\":\"\"},{\"bold\":true,\"color\":\"light_purple\",\"text\":\"Soul Eater V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Chance IV\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Cubism V\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Dragon Tracer V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Impaling III\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Infinite Quiver X\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Overload V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Piercing I\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Power VI\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Snipe III\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_purple\",\"text\":\"◆ End Rune III\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Hits \"},{\"color\":\"red\",\"text\":\"3 \"},{\"color\":\"gray\",\"text\":\"mobs on impact.\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Can damage endermen.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"white\",\"text\":\"Kills: \"},{\"color\":\"gold\",\"text\":\"54,778\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Spiritual Bonus\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants a \"},{\"color\":\"green\",\"text\":\"10% \"},{\"color\":\"gray\",\"text\":\"chance to spawn\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"a Spirit Decoy when you kill an\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"enemy in a dungeon.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Shortbow: Instantly shoots!\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"dark_red\",\"text\":\"☠ \"},{\"color\":\"red\",\"text\":\"Requires \"},{\"color\":\"dark_purple\",\"text\":\"Enderman Slayer\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_purple\",\"text\":\"5\"},{\"color\":\"red\",\"text\":\".\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"obfuscated\":true,\"color\":\"gold\",\"text\":\"a\"},{\"text\":\"\"},{\"bold\":false,\"italic\":false,\"underlined\":false,\"obfuscated\":false,\"strikethrough\":false,\"extra\":[{\"text\":\" \"}],\"text\":\"\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"LEGENDARY DUNGEON BOW \"},{\"bold\":true,\"obfuscated\":true,\"color\":\"gold\",\"text\":\"a\"}],\"text\":\"\"}'],Name:'{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Spiritual Juju Shortbow \"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"}],\"text\":\"\"}'}}}")); - private final ItemStack JUJU_SHORTBOW = ItemStack.fromNbt(StringNbtReader.parse("{Count:1b,id:\"minecraft:bow\",tag:{Damage:0,Enchantments:[{id:\"minecraft:protection\",lvl:0s}],ExtraAttributes:{art_of_war_count:1,dungeon_item_level:5,enchantments:{aiming:5,chance:4,cubism:5,impaling:3,infinite_quiver:10,overload:5,piercing:1,power:6,snipe:3,telekinesis:1,ultimate_soul_eater:5},hot_potato_count:15,id:\"JUJU_SHORTBOW\",modifier:\"spiritual\",originTag:\"QUICK_CRAFTING\",rarity_upgrades:1,runes:{DRAGON:3},stats_book:54778,timestamp:1622882460000L,uuid:\"b06b8fe2-470a-43f3-b844-658472f20996\"},HideFlags:255,Unbreakable:1b,display:{Lore:['{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Gear Score: \"},{\"color\":\"light_purple\",\"text\":\"724 \"},{\"color\":\"dark_gray\",\"text\":\"(2297)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Damage: \"},{\"color\":\"red\",\"text\":\"+371 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"dark_gray\",\"text\":\"(+1,275)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Strength: \"},{\"color\":\"red\",\"text\":\"+107 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"gold\",\"text\":\"[+5] \"},{\"color\":\"blue\",\"text\":\"(+28) \"},{\"color\":\"dark_gray\",\"text\":\"(+386.25)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Chance: \"},{\"color\":\"red\",\"text\":\"+28% \"},{\"color\":\"blue\",\"text\":\"(+12%) \"},{\"color\":\"dark_gray\",\"text\":\"(+40.5%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Damage: \"},{\"color\":\"red\",\"text\":\"+181% \"},{\"color\":\"blue\",\"text\":\"(+55%) \"},{\"color\":\"dark_gray\",\"text\":\"(+637.5%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Shot Cooldown: \"},{\"color\":\"green\",\"text\":\"0.5s\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"color\":\"light_purple\",\"text\":\"\"},{\"bold\":true,\"color\":\"light_purple\",\"text\":\"Soul Eater V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Chance IV\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Cubism V\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Dragon Tracer V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Impaling III\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Infinite Quiver X\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Overload V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Piercing I\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Power VI\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Snipe III\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_purple\",\"text\":\"◆ End Rune III\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Hits \"},{\"color\":\"red\",\"text\":\"3 \"},{\"color\":\"gray\",\"text\":\"mobs on impact.\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Can damage endermen.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Shortbow: Instantly shoots!\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"white\",\"text\":\"Kills: \"},{\"color\":\"gold\",\"text\":\"54,778\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Spiritual Bonus\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants a \"},{\"color\":\"green\",\"text\":\"10% \"},{\"color\":\"gray\",\"text\":\"chance to spawn a\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Spirit Decoy when you kill an enemy\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"in a dungeon.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"dark_red\",\"text\":\"☠ \"},{\"color\":\"red\",\"text\":\"Requires \"},{\"color\":\"dark_purple\",\"text\":\"Enderman Slayer 5\"},{\"color\":\"red\",\"text\":\".\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"obfuscated\":true,\"color\":\"gold\",\"text\":\"a\"},{\"text\":\"\"},{\"bold\":false,\"italic\":false,\"underlined\":false,\"obfuscated\":false,\"strikethrough\":false,\"extra\":[{\"text\":\" \"}],\"text\":\"\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"LEGENDARY DUNGEON BOW \"},{\"bold\":true,\"obfuscated\":true,\"color\":\"gold\",\"text\":\"a\"}],\"text\":\"\"}'],Name:'{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Spiritual Juju Shortbow \"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"}],\"text\":\"\"}'}}}")); - private final ItemStack LIVID_DAGGER = ItemStack.fromNbt(StringNbtReader.parse("{Count:1b,id:\"minecraft:iron_sword\",tag:{Damage:0,Enchantments:[{id:\"minecraft:protection\",lvl:0s}],ExtraAttributes:{dungeon_item_level:5,enchantments:{telekinesis:1,ultimate_one_for_all:1},gems:{JASPER_0:\"FLAWLESS\"},hot_potato_count:15,id:\"LIVID_DAGGER\",modifier:\"fabled\",originTag:\"UNKNOWN\",rarity_upgrades:1,timestamp:\"2/20/21 3:09 PM\",uuid:\"214333db-d71c-4080-8487-00b4666bb9a4\"},HideFlags:255,Unbreakable:1b,display:{Lore:['{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Gear Score: \"},{\"color\":\"light_purple\",\"text\":\"933 \"},{\"color\":\"dark_gray\",\"text\":\"(2389)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Damage: \"},{\"color\":\"red\",\"text\":\"+261 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"dark_gray\",\"text\":\"(+900)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Strength: \"},{\"color\":\"red\",\"text\":\"+183 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"blue\",\"text\":\"(+75) \"},{\"color\":\"light_purple\",\"text\":\"(+12) \"},{\"color\":\"dark_gray\",\"text\":\"(+663.75)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Chance: \"},{\"color\":\"red\",\"text\":\"+100% \"},{\"color\":\"dark_gray\",\"text\":\"(+150%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Damage: \"},{\"color\":\"red\",\"text\":\"+105% \"},{\"color\":\"blue\",\"text\":\"(+50%) \"},{\"color\":\"dark_gray\",\"text\":\"(+375%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Bonus Attack Speed: \"},{\"color\":\"red\",\"text\":\"+55% \"},{\"color\":\"dark_gray\",\"text\":\"(+75%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"text\":\" \"},{\"color\":\"dark_purple\",\"text\":\"[\"},{\"color\":\"light_purple\",\"text\":\"❁\"},{\"color\":\"dark_purple\",\"text\":\"]\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"color\":\"light_purple\",\"text\":\"\"},{\"bold\":true,\"color\":\"light_purple\",\"text\":\"One For All I\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Ability: Throw \"},{\"bold\":true,\"color\":\"yellow\",\"text\":\"RIGHT CLICK\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Throw your dagger at your\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"enemies!\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_gray\",\"text\":\"Mana Cost: \"},{\"color\":\"dark_aqua\",\"text\":\"150\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_gray\",\"text\":\"Cooldown: \"},{\"color\":\"green\",\"text\":\"5s\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Your Critical Hits deal \"},{\"color\":\"blue\",\"text\":\"100%\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"\"},{\"color\":\"gray\",\"text\":\"more damage if you are behind\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"your target.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Fabled Bonus\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Critical hits have a chance to\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"deal up to \"},{\"color\":\"green\",\"text\":\"15% \"},{\"color\":\"gray\",\"text\":\"extra damage.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"obfuscated\":true,\"color\":\"light_purple\",\"text\":\"a\"},{\"text\":\"\"},{\"bold\":false,\"italic\":false,\"underlined\":false,\"obfuscated\":false,\"strikethrough\":false,\"extra\":[{\"text\":\" \"}],\"text\":\"\"},{\"bold\":true,\"color\":\"light_purple\",\"text\":\"\"},{\"bold\":true,\"color\":\"light_purple\",\"text\":\"MYTHIC DUNGEON SWORD \"},{\"bold\":true,\"obfuscated\":true,\"color\":\"light_purple\",\"text\":\"a\"}],\"text\":\"\"}'],Name:'{\"italic\":false,\"extra\":[{\"color\":\"light_purple\",\"text\":\"Fabled Livid Dagger \"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"}],\"text\":\"\"}'}}}")); - private final ItemStack MITHRIL_DRILL_1 = ItemStack.fromNbt(StringNbtReader.parse("{Count:1b,id:\"minecraft:prismarine_shard\",tag:{Damage:21,Enchantments:[{id:\"minecraft:protection\",lvl:0s}],ExtraAttributes:{compact_blocks:97683,drill_fuel:2979,enchantments:{compact:7,efficiency:5,experience:3,fortune:3,telekinesis:1},id:\"MITHRIL_DRILL_1\",modifier:\"fleet\",originTag:\"UNKNOWN\",timestamp:\"1/30/21 5:52 AM\",uuid:\"575ce2c9-251e-4435-9020-de1a2e24b1d0\"},HideFlags:255,display:{Lore:['{\"italic\":false,\"extra\":[{\"color\":\"dark_gray\",\"text\":\"Breaking Power 5\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Damage: \"},{\"color\":\"red\",\"text\":\"+65\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Mining Speed: \"},{\"color\":\"green\",\"text\":\"+585 \"},{\"color\":\"blue\",\"text\":\"(+25)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Mining Fortune: \"},{\"color\":\"green\",\"text\":\"+30\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Mining Wisdom: \"},{\"color\":\"green\",\"text\":\"+7\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Compact VII \"},{\"color\":\"dark_gray\",\"text\":\"97,683\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Gain \"},{\"color\":\"dark_aqua\",\"text\":\"+7☯ Mining Wisdom \"},{\"color\":\"gray\",\"text\":\"and a \"},{\"color\":\"green\",\"text\":\"0.4%\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"green\",\"text\":\"\"},{\"color\":\"gray\",\"text\":\"chance to drop an enchanted item.\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_gray\",\"text\":\"150k blocks to tier up!\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Efficiency V\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants \"},{\"color\":\"green\",\"text\":\"+110 \"},{\"color\":\"gold\",\"text\":\"⸕ Mining Speed\"},{\"color\":\"gray\",\"text\":\".\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Experience III\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants a \"},{\"color\":\"green\",\"text\":\"37.5% \"},{\"color\":\"gray\",\"text\":\"chance for mobs and\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"ores to drop double experience.\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Fortune III\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants \"},{\"color\":\"gold\",\"text\":\"+30☘ Mining Fortune\"},{\"color\":\"gray\",\"text\":\", which\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"increases your chance for multiple\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"drops.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Gain \"},{\"color\":\"green\",\"text\":\"+15% \"},{\"color\":\"dark_green\",\"text\":\"Mithril Powder\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"when using this Drill!\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Fuel Tank: \"},{\"color\":\"red\",\"text\":\"Not Installed\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"gray\",\"text\":\"Increases fuel capacity with part\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"installed.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Drill Engine: \"},{\"color\":\"red\",\"text\":\"Not Installed\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"gray\",\"text\":\"Increases \"},{\"color\":\"gold\",\"text\":\"⸕ Mining Speed \"},{\"color\":\"gray\",\"text\":\"with part\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"installed.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Upgrade Module: \"},{\"color\":\"red\",\"text\":\"Not Installed\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"gray\",\"text\":\"Applies a passive upgrade with part\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"installed.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Apply Drill Parts to this Drill by\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"talking to a \"},{\"color\":\"dark_green\",\"text\":\"Drill Mechanic\"},{\"color\":\"gray\",\"text\":\"!\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Fuel: \"},{\"color\":\"dark_green\",\"text\":\"2,979\"},{\"color\":\"dark_gray\",\"text\":\"/3k\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Ability: Mining Speed Boost \"},{\"bold\":true,\"color\":\"yellow\",\"text\":\"RIGHT CLICK\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants \"},{\"color\":\"green\",\"text\":\"+\"},{\"color\":\"green\",\"text\":\"200% \"},{\"color\":\"gold\",\"text\":\"⸕ Mining Speed \"},{\"color\":\"gray\",\"text\":\"for\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"green\",\"text\":\"15s\"},{\"color\":\"gray\",\"text\":\".\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_gray\",\"text\":\"Cooldown: \"},{\"color\":\"green\",\"text\":\"120s\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"color\":\"blue\",\"text\":\"RARE DRILL\"}],\"text\":\"\"}'],Name:'{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Fleet Mithril Drill SX-R226\"}],\"text\":\"\"}'}}}")); + private final ItemStack JUJU_SHORTBOW_OLD = ItemStackComponentizationFixer.fixUpItem(StringNbtReader.parse("{Count:1b,id:\"minecraft:bow\",tag:{Damage:0,Enchantments:[{id:\"minecraft:protection\",lvl:0s}],ExtraAttributes:{art_of_war_count:1,dungeon_item_level:5,enchantments:{aiming:5,chance:4,cubism:5,impaling:3,infinite_quiver:10,overload:5,piercing:1,power:6,snipe:3,telekinesis:1,ultimate_soul_eater:5},hot_potato_count:15,id:\"JUJU_SHORTBOW\",modifier:\"spiritual\",originTag:\"QUICK_CRAFTING\",rarity_upgrades:1,runes:{DRAGON:3},stats_book:54778,timestamp:\"6/5/21 4:41 AM\",uuid:\"b06b8fe2-470a-43f3-b844-658472f20996\"},HideFlags:255,Unbreakable:1b,display:{Lore:['{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Gear Score: \"},{\"color\":\"light_purple\",\"text\":\"724 \"},{\"color\":\"dark_gray\",\"text\":\"(2297)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Damage: \"},{\"color\":\"red\",\"text\":\"+371 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"dark_gray\",\"text\":\"(+1,275)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Strength: \"},{\"color\":\"red\",\"text\":\"+107 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"gold\",\"text\":\"[+5] \"},{\"color\":\"blue\",\"text\":\"(+28) \"},{\"color\":\"dark_gray\",\"text\":\"(+386.25)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Chance: \"},{\"color\":\"red\",\"text\":\"+28% \"},{\"color\":\"blue\",\"text\":\"(+12%) \"},{\"color\":\"dark_gray\",\"text\":\"(+40.5%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Damage: \"},{\"color\":\"red\",\"text\":\"+181% \"},{\"color\":\"blue\",\"text\":\"(+55%) \"},{\"color\":\"dark_gray\",\"text\":\"(+637.5%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Shot Cooldown: \"},{\"color\":\"green\",\"text\":\"0.5s\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"color\":\"light_purple\",\"text\":\"\"},{\"bold\":true,\"color\":\"light_purple\",\"text\":\"Soul Eater V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Chance IV\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Cubism V\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Dragon Tracer V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Impaling III\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Infinite Quiver X\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Overload V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Piercing I\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Power VI\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Snipe III\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_purple\",\"text\":\"◆ End Rune III\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Hits \"},{\"color\":\"red\",\"text\":\"3 \"},{\"color\":\"gray\",\"text\":\"mobs on impact.\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Can damage endermen.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"white\",\"text\":\"Kills: \"},{\"color\":\"gold\",\"text\":\"54,778\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Spiritual Bonus\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants a \"},{\"color\":\"green\",\"text\":\"10% \"},{\"color\":\"gray\",\"text\":\"chance to spawn\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"a Spirit Decoy when you kill an\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"enemy in a dungeon.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Shortbow: Instantly shoots!\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"dark_red\",\"text\":\"☠ \"},{\"color\":\"red\",\"text\":\"Requires \"},{\"color\":\"dark_purple\",\"text\":\"Enderman Slayer\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_purple\",\"text\":\"5\"},{\"color\":\"red\",\"text\":\".\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"obfuscated\":true,\"color\":\"gold\",\"text\":\"a\"},{\"text\":\"\"},{\"bold\":false,\"italic\":false,\"underlined\":false,\"obfuscated\":false,\"strikethrough\":false,\"extra\":[{\"text\":\" \"}],\"text\":\"\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"LEGENDARY DUNGEON BOW \"},{\"bold\":true,\"obfuscated\":true,\"color\":\"gold\",\"text\":\"a\"}],\"text\":\"\"}'],Name:'{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Spiritual Juju Shortbow \"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"}],\"text\":\"\"}'}}}")); + private final ItemStack JUJU_SHORTBOW = ItemStackComponentizationFixer.fixUpItem(StringNbtReader.parse("{Count:1b,id:\"minecraft:bow\",tag:{Damage:0,Enchantments:[{id:\"minecraft:protection\",lvl:0s}],ExtraAttributes:{art_of_war_count:1,dungeon_item_level:5,enchantments:{aiming:5,chance:4,cubism:5,impaling:3,infinite_quiver:10,overload:5,piercing:1,power:6,snipe:3,telekinesis:1,ultimate_soul_eater:5},hot_potato_count:15,id:\"JUJU_SHORTBOW\",modifier:\"spiritual\",originTag:\"QUICK_CRAFTING\",rarity_upgrades:1,runes:{DRAGON:3},stats_book:54778,timestamp:1622882460000L,uuid:\"b06b8fe2-470a-43f3-b844-658472f20996\"},HideFlags:255,Unbreakable:1b,display:{Lore:['{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Gear Score: \"},{\"color\":\"light_purple\",\"text\":\"724 \"},{\"color\":\"dark_gray\",\"text\":\"(2297)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Damage: \"},{\"color\":\"red\",\"text\":\"+371 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"dark_gray\",\"text\":\"(+1,275)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Strength: \"},{\"color\":\"red\",\"text\":\"+107 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"gold\",\"text\":\"[+5] \"},{\"color\":\"blue\",\"text\":\"(+28) \"},{\"color\":\"dark_gray\",\"text\":\"(+386.25)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Chance: \"},{\"color\":\"red\",\"text\":\"+28% \"},{\"color\":\"blue\",\"text\":\"(+12%) \"},{\"color\":\"dark_gray\",\"text\":\"(+40.5%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Damage: \"},{\"color\":\"red\",\"text\":\"+181% \"},{\"color\":\"blue\",\"text\":\"(+55%) \"},{\"color\":\"dark_gray\",\"text\":\"(+637.5%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Shot Cooldown: \"},{\"color\":\"green\",\"text\":\"0.5s\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"color\":\"light_purple\",\"text\":\"\"},{\"bold\":true,\"color\":\"light_purple\",\"text\":\"Soul Eater V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Chance IV\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Cubism V\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Dragon Tracer V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Impaling III\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Infinite Quiver X\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Overload V\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Piercing I\"},{\"color\":\"blue\",\"text\":\", \"},{\"color\":\"blue\",\"text\":\"Power VI\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Snipe III\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_purple\",\"text\":\"◆ End Rune III\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Hits \"},{\"color\":\"red\",\"text\":\"3 \"},{\"color\":\"gray\",\"text\":\"mobs on impact.\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Can damage endermen.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Shortbow: Instantly shoots!\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"white\",\"text\":\"Kills: \"},{\"color\":\"gold\",\"text\":\"54,778\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Spiritual Bonus\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants a \"},{\"color\":\"green\",\"text\":\"10% \"},{\"color\":\"gray\",\"text\":\"chance to spawn a\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Spirit Decoy when you kill an enemy\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"in a dungeon.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"dark_red\",\"text\":\"☠ \"},{\"color\":\"red\",\"text\":\"Requires \"},{\"color\":\"dark_purple\",\"text\":\"Enderman Slayer 5\"},{\"color\":\"red\",\"text\":\".\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"obfuscated\":true,\"color\":\"gold\",\"text\":\"a\"},{\"text\":\"\"},{\"bold\":false,\"italic\":false,\"underlined\":false,\"obfuscated\":false,\"strikethrough\":false,\"extra\":[{\"text\":\" \"}],\"text\":\"\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"\"},{\"bold\":true,\"color\":\"gold\",\"text\":\"LEGENDARY DUNGEON BOW \"},{\"bold\":true,\"obfuscated\":true,\"color\":\"gold\",\"text\":\"a\"}],\"text\":\"\"}'],Name:'{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Spiritual Juju Shortbow \"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"}],\"text\":\"\"}'}}}")); + private final ItemStack LIVID_DAGGER = ItemStackComponentizationFixer.fixUpItem(StringNbtReader.parse("{Count:1b,id:\"minecraft:iron_sword\",tag:{Damage:0,Enchantments:[{id:\"minecraft:protection\",lvl:0s}],ExtraAttributes:{dungeon_item_level:5,enchantments:{telekinesis:1,ultimate_one_for_all:1},gems:{JASPER_0:\"FLAWLESS\"},hot_potato_count:15,id:\"LIVID_DAGGER\",modifier:\"fabled\",originTag:\"UNKNOWN\",rarity_upgrades:1,timestamp:\"2/20/21 3:09 PM\",uuid:\"214333db-d71c-4080-8487-00b4666bb9a4\"},HideFlags:255,Unbreakable:1b,display:{Lore:['{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Gear Score: \"},{\"color\":\"light_purple\",\"text\":\"933 \"},{\"color\":\"dark_gray\",\"text\":\"(2389)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Damage: \"},{\"color\":\"red\",\"text\":\"+261 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"dark_gray\",\"text\":\"(+900)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Strength: \"},{\"color\":\"red\",\"text\":\"+183 \"},{\"color\":\"yellow\",\"text\":\"(+30) \"},{\"color\":\"blue\",\"text\":\"(+75) \"},{\"color\":\"light_purple\",\"text\":\"(+12) \"},{\"color\":\"dark_gray\",\"text\":\"(+663.75)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Chance: \"},{\"color\":\"red\",\"text\":\"+100% \"},{\"color\":\"dark_gray\",\"text\":\"(+150%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Crit Damage: \"},{\"color\":\"red\",\"text\":\"+105% \"},{\"color\":\"blue\",\"text\":\"(+50%) \"},{\"color\":\"dark_gray\",\"text\":\"(+375%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Bonus Attack Speed: \"},{\"color\":\"red\",\"text\":\"+55% \"},{\"color\":\"dark_gray\",\"text\":\"(+75%)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"text\":\" \"},{\"color\":\"dark_purple\",\"text\":\"[\"},{\"color\":\"light_purple\",\"text\":\"❁\"},{\"color\":\"dark_purple\",\"text\":\"]\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"color\":\"light_purple\",\"text\":\"\"},{\"bold\":true,\"color\":\"light_purple\",\"text\":\"One For All I\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Ability: Throw \"},{\"bold\":true,\"color\":\"yellow\",\"text\":\"RIGHT CLICK\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Throw your dagger at your\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"enemies!\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_gray\",\"text\":\"Mana Cost: \"},{\"color\":\"dark_aqua\",\"text\":\"150\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_gray\",\"text\":\"Cooldown: \"},{\"color\":\"green\",\"text\":\"5s\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Your Critical Hits deal \"},{\"color\":\"blue\",\"text\":\"100%\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"\"},{\"color\":\"gray\",\"text\":\"more damage if you are behind\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"your target.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Fabled Bonus\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Critical hits have a chance to\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"deal up to \"},{\"color\":\"green\",\"text\":\"15% \"},{\"color\":\"gray\",\"text\":\"extra damage.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"obfuscated\":true,\"color\":\"light_purple\",\"text\":\"a\"},{\"text\":\"\"},{\"bold\":false,\"italic\":false,\"underlined\":false,\"obfuscated\":false,\"strikethrough\":false,\"extra\":[{\"text\":\" \"}],\"text\":\"\"},{\"bold\":true,\"color\":\"light_purple\",\"text\":\"\"},{\"bold\":true,\"color\":\"light_purple\",\"text\":\"MYTHIC DUNGEON SWORD \"},{\"bold\":true,\"obfuscated\":true,\"color\":\"light_purple\",\"text\":\"a\"}],\"text\":\"\"}'],Name:'{\"italic\":false,\"extra\":[{\"color\":\"light_purple\",\"text\":\"Fabled Livid Dagger \"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"},{\"color\":\"gold\",\"text\":\"✪\"}],\"text\":\"\"}'}}}")); + private final ItemStack MITHRIL_DRILL_1 = ItemStackComponentizationFixer.fixUpItem(StringNbtReader.parse("{Count:1b,id:\"minecraft:prismarine_shard\",tag:{Damage:21,Enchantments:[{id:\"minecraft:protection\",lvl:0s}],ExtraAttributes:{compact_blocks:97683,drill_fuel:2979,enchantments:{compact:7,efficiency:5,experience:3,fortune:3,telekinesis:1},id:\"MITHRIL_DRILL_1\",modifier:\"fleet\",originTag:\"UNKNOWN\",timestamp:\"1/30/21 5:52 AM\",uuid:\"575ce2c9-251e-4435-9020-de1a2e24b1d0\"},HideFlags:255,display:{Lore:['{\"italic\":false,\"extra\":[{\"color\":\"dark_gray\",\"text\":\"Breaking Power 5\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Damage: \"},{\"color\":\"red\",\"text\":\"+65\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Mining Speed: \"},{\"color\":\"green\",\"text\":\"+585 \"},{\"color\":\"blue\",\"text\":\"(+25)\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Mining Fortune: \"},{\"color\":\"green\",\"text\":\"+30\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Mining Wisdom: \"},{\"color\":\"green\",\"text\":\"+7\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Compact VII \"},{\"color\":\"dark_gray\",\"text\":\"97,683\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Gain \"},{\"color\":\"dark_aqua\",\"text\":\"+7☯ Mining Wisdom \"},{\"color\":\"gray\",\"text\":\"and a \"},{\"color\":\"green\",\"text\":\"0.4%\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"green\",\"text\":\"\"},{\"color\":\"gray\",\"text\":\"chance to drop an enchanted item.\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_gray\",\"text\":\"150k blocks to tier up!\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Efficiency V\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants \"},{\"color\":\"green\",\"text\":\"+110 \"},{\"color\":\"gold\",\"text\":\"⸕ Mining Speed\"},{\"color\":\"gray\",\"text\":\".\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Experience III\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants a \"},{\"color\":\"green\",\"text\":\"37.5% \"},{\"color\":\"gray\",\"text\":\"chance for mobs and\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"ores to drop double experience.\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Fortune III\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants \"},{\"color\":\"gold\",\"text\":\"+30☘ Mining Fortune\"},{\"color\":\"gray\",\"text\":\", which\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"increases your chance for multiple\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"drops.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Gain \"},{\"color\":\"green\",\"text\":\"+15% \"},{\"color\":\"dark_green\",\"text\":\"Mithril Powder\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"when using this Drill!\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Fuel Tank: \"},{\"color\":\"red\",\"text\":\"Not Installed\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"gray\",\"text\":\"Increases fuel capacity with part\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"installed.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Drill Engine: \"},{\"color\":\"red\",\"text\":\"Not Installed\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"gray\",\"text\":\"Increases \"},{\"color\":\"gold\",\"text\":\"⸕ Mining Speed \"},{\"color\":\"gray\",\"text\":\"with part\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"installed.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Upgrade Module: \"},{\"color\":\"red\",\"text\":\"Not Installed\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"gray\",\"text\":\"Applies a passive upgrade with part\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"installed.\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Apply Drill Parts to this Drill by\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"talking to a \"},{\"color\":\"dark_green\",\"text\":\"Drill Mechanic\"},{\"color\":\"gray\",\"text\":\"!\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Fuel: \"},{\"color\":\"dark_green\",\"text\":\"2,979\"},{\"color\":\"dark_gray\",\"text\":\"/3k\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gold\",\"text\":\"Ability: Mining Speed Boost \"},{\"bold\":true,\"color\":\"yellow\",\"text\":\"RIGHT CLICK\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"Grants \"},{\"color\":\"green\",\"text\":\"+\"},{\"color\":\"green\",\"text\":\"200% \"},{\"color\":\"gold\",\"text\":\"⸕ Mining Speed \"},{\"color\":\"gray\",\"text\":\"for\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"gray\",\"text\":\"\"},{\"color\":\"green\",\"text\":\"15s\"},{\"color\":\"gray\",\"text\":\".\"}],\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"color\":\"dark_gray\",\"text\":\"Cooldown: \"},{\"color\":\"green\",\"text\":\"120s\"}],\"text\":\"\"}','{\"italic\":false,\"text\":\"\"}','{\"italic\":false,\"extra\":[{\"bold\":true,\"color\":\"blue\",\"text\":\"RARE DRILL\"}],\"text\":\"\"}'],Name:'{\"italic\":false,\"extra\":[{\"color\":\"blue\",\"text\":\"Fleet Mithril Drill SX-R226\"}],\"text\":\"\"}'}}}")); public ItemUtilsTest() throws CommandSyntaxException { } @@ -25,6 +28,7 @@ public class ItemUtilsTest { Bootstrap.initialize(); } + //TODO fix this @Test void testGetExtraAttributes() { Assertions.assertEquals("{art_of_war_count:1,dungeon_item_level:5,enchantments:{aiming:5,chance:4,cubism:5,impaling:3,infinite_quiver:10,overload:5,piercing:1,power:6,snipe:3,telekinesis:1,ultimate_soul_eater:5},hot_potato_count:15,id:\"JUJU_SHORTBOW\",modifier:\"spiritual\",originTag:\"QUICK_CRAFTING\",rarity_upgrades:1,runes:{DRAGON:3},stats_book:54778,timestamp:1622882460000L,uuid:\"b06b8fe2-470a-43f3-b844-658472f20996\"}", ItemUtils.getExtraAttributes(JUJU_SHORTBOW).toString()); diff --git a/src/test/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixerTest.java b/src/test/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixerTest.java new file mode 100644 index 00000000..11951c44 --- /dev/null +++ b/src/test/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixerTest.java @@ -0,0 +1,47 @@ +package de.hysky.skyblocker.utils.datafixer; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.mojang.serialization.JsonOps; + +import net.minecraft.Bootstrap; +import net.minecraft.SharedConstants; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.StringNbtReader; + +public class ItemStackComponentizationFixerTest { + private final NbtCompound NBT = convertToNbt("{id:\"minecraft:diamond_sword\",Count:1,tag:{ExtraAttributes:{id:\"TEST\"}}}"); + private final Gson GSON = new Gson(); + + @BeforeAll + public static void setup() { + SharedConstants.createGameVersion(); + Bootstrap.initialize(); + } + + @Test + void testNbtConversion() { + Assertions.assertNotEquals(NBT, new NbtCompound()); + } + + @Test + void testDataFixer() { + ItemStack fixedStack = ItemStackComponentizationFixer.fixUpItem(NBT); + JsonElement stackJson = ItemStack.CODEC.encodeStart(JsonOps.INSTANCE, fixedStack).result().orElseThrow(); + + Assertions.assertEquals("{\"id\":\"minecraft:diamond_sword\",\"components\":{\"minecraft:custom_data\":{\"ExtraAttributes\":{\"id\":\"TEST\"}}}}", GSON.toJson(stackJson)); + } + + private static NbtCompound convertToNbt(String nbt) { + try { + return StringNbtReader.parse(nbt); + } catch (Exception e) { + return new NbtCompound(); + } + } +} -- cgit From 02ed1d456c7924753f4b1447818ae9986539a950 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:20:33 -0400 Subject: 24w12a --- gradle.properties | 6 +++--- .../de/hysky/skyblocker/mixin/DataTrackerMixin.java | 5 +++-- .../java/de/hysky/skyblocker/mixin/ItemMixin.java | 19 ------------------- .../skyblock/chat/ChatRulesConfigListWidget.java | 4 ++-- .../dungeon/partyfinder/OptionDropdownWidget.java | 2 +- .../skyblock/dungeon/partyfinder/PartyEntry.java | 2 +- .../dungeon/partyfinder/PartyEntryListWidget.java | 2 +- .../skyblock/dungeon/secrets/DungeonMapUtils.java | 3 ++- .../skyblocker/skyblock/dwarven/CrystalsHud.java | 5 +++-- .../hysky/skyblocker/skyblock/end/EndHudWidget.java | 2 +- .../skyblock/itemlist/ItemStackBuilder.java | 2 +- .../skyblock/shortcut/ShortcutsConfigListWidget.java | 4 ++-- .../java/de/hysky/skyblocker/utils/ItemUtils.java | 2 +- src/main/resources/fabric.mod.json | 4 ++-- src/main/resources/skyblocker.mixins.json | 1 - .../datafixer/ItemStackComponentizationFixerTest.java | 2 +- 16 files changed, 24 insertions(+), 41 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ItemMixin.java (limited to 'src/main/resources') diff --git a/gradle.properties b/gradle.properties index 66191411..e1ebba36 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,13 @@ org.gradle.parallel=true # Fabric Properties (https://fabricmc.net/versions.html) ## 1.20 -minecraft_version=24w09a -yarn_mappings=24w09a+build.5 +minecraft_version=24w12a +yarn_mappings=24w12a+build.3 loader_version=0.15.7 #Fabric api ## 1.20 -fabric_api_version=0.96.5+1.20.5 +fabric_api_version=0.96.12+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) diff --git a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java index d9db5dae..a0b5de84 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java @@ -9,6 +9,7 @@ import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; +import net.minecraft.entity.data.DataTracked; import net.minecraft.entity.data.DataTracker; import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; @@ -26,14 +27,14 @@ import java.util.Optional; public abstract class DataTrackerMixin { @Shadow @Final - private Entity trackedEntity; + private DataTracked trackedEntity; @SuppressWarnings("ConstantValue") @Inject(method = "writeUpdatedEntries", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/data/DataTracker;copyToFrom(Lnet/minecraft/entity/data/DataTracker$Entry;Lnet/minecraft/entity/data/DataTracker$SerializedEntry;)V")) private void skyblocker$onWriteUpdatedEntries(CallbackInfo ci, @Local DataTracker.Entry entry, @Local DataTracker.SerializedEntry serializedEntry) { if (Utils.isInTheEnd() && SkyblockerConfigManager.get().slayer.endermanSlayer.enableYangGlyphsNotification && entry.getData() == EndermanEntityAccessor.getCARRIED_BLOCK() && entry.get() instanceof Optional value && value.isPresent() && value.get() instanceof BlockState state && state.isOf(Blocks.BEACON) && ((Optional) serializedEntry.value()).isEmpty()) { MinecraftClient client = MinecraftClient.getInstance(); - if (MobGlow.getArmorStands(trackedEntity).stream().anyMatch(armorStand -> armorStand.getName().getString().contains(client.getSession().getUsername()))) { + if (trackedEntity instanceof Entity entity && MobGlow.getArmorStands(entity).stream().anyMatch(armorStand -> armorStand.getName().getString().contains(client.getSession().getUsername()))) { client.inGameHud.setTitleTicks(5, 20, 10); client.inGameHud.setTitle(Text.literal("Yang Glyph!").formatted(Formatting.RED)); client.player.playSound(SoundEvents.BLOCK_NOTE_BLOCK_PLING.value(), 100f, 0.1f); diff --git a/src/main/java/de/hysky/skyblocker/mixin/ItemMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ItemMixin.java deleted file mode 100644 index 6b49220b..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/ItemMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(Item.class) -public abstract class ItemMixin { - @Redirect( - method = {"getItemBarColor", "getItemBarStep"}, - at = @At(value = "FIELD", target = "Lnet/minecraft/item/Item;maxDamage:I", opcode = Opcodes.GETFIELD) - ) - private int skyblocker$handlePickoDrillBar(Item item, ItemStack stack) { - return stack.getMaxDamage(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java index a1b9317a..747e826b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java @@ -39,8 +39,8 @@ public class ChatRulesConfigListWidget extends ElementListWidget { } } ItemStack stack = new ItemStack(Items.PLAYER_HEAD); - stack.set(DataComponentTypes.PROFILE, new ProfileComponent("SkyblockerCustomPF", Optional.of(UUID.randomUUID()), floorSkullProperties)); + stack.set(DataComponentTypes.PROFILE, new ProfileComponent(Optional.of("SkyblockerCustomPFSkull" + floor), Optional.of(UUID.randomUUID()), floorSkullProperties)); context.drawItem(stack, 317, 3); int textWidth = textRenderer.getWidth(floor); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntryListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntryListWidget.java index 640f71bd..a3d4566f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntryListWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntryListWidget.java @@ -68,7 +68,7 @@ public class PartyEntryListWidget extends ElementListWidget { } @Override - protected int getScrollbarPositionX() { + protected int getScrollbarX() { return this.width / 2 + getRowWidth() / 2 + 2; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java index 8e0073f7..716f5eb9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java @@ -7,6 +7,7 @@ import net.minecraft.block.Blocks; import net.minecraft.block.MapColor; import net.minecraft.item.map.MapIcon; import net.minecraft.item.map.MapState; +import net.minecraft.item.map.Type; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; @@ -46,7 +47,7 @@ public class DungeonMapUtils { @Nullable private static Vector2i getMapPlayerPos(MapState map) { for (MapIcon icon : map.getIcons()) { - if (icon.type() == MapIcon.Type.FRAME) { + if (icon.type() == Type.FRAME) { return new Vector2i((icon.x() >> 1) + 64, (icon.z() >> 1) + 64); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java index 8d5a6313..ae6e1ea6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java @@ -23,9 +23,10 @@ import java.util.Map; public class CrystalsHud { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); protected static final Identifier MAP_TEXTURE = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/crystals_map.png"); - private static final Identifier MAP_ICON = new Identifier("textures/map/map_icons.png"); + private static final Identifier MAP_ICON = new Identifier("textures/map/decorations/player.png"); private static final List SMALL_LOCATIONS = List.of("Fairy Grotto", "King Yolkar", "Corleone", "Odawa", "Key Guardian"); + public static boolean visible = false; public static void init() { @@ -109,7 +110,7 @@ public class CrystalsHud { matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(yaw2Cardinal(playerRotation)), 2.5f, 3.5f, 0); //draw marker on map - context.drawTexture(MAP_ICON, 0, 0, 2, 0, 5, 7, 128, 128); + context.drawTexture(MAP_ICON, 0, 0, 2, 0, 5, 7, 8, 8); //todo add direction (can not work out how to rotate) matrices.pop(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java index 10dc2b5c..ca3c8cd8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java @@ -34,7 +34,7 @@ public class EndHudWidget extends Widget { private static final ItemStack POPPY = new ItemStack(Items.POPPY); static { - ENDERMAN_HEAD.set(DataComponentTypes.PROFILE, new ProfileComponent("MHF_Enderman", Optional.empty(), new PropertyMap())); + ENDERMAN_HEAD.set(DataComponentTypes.PROFILE, new ProfileComponent(Optional.of("MHF_Enderman"), Optional.empty(), new PropertyMap())); POPPY.addEnchantment(Enchantments.INFINITY, 1); INSTANCE.setX(SkyblockerConfigManager.get().locations.end.x); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java index 11c3687e..19f89d3c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemStackBuilder.java @@ -69,7 +69,7 @@ public class ItemStackBuilder { UUID uuid = UUID.fromString(skullUuid.group(1)); String textureValue = skullTexture.group(1); - stack.set(DataComponentTypes.PROFILE, new ProfileComponent(internalName, Optional.of(uuid), ItemUtils.propertyMapWithTexture(textureValue))); + stack.set(DataComponentTypes.PROFILE, new ProfileComponent(Optional.of(internalName), Optional.of(uuid), ItemUtils.propertyMapWithTexture(textureValue))); } // add leather armor dye color diff --git a/src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java index aa3b976e..0c35eb2a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/shortcut/ShortcutsConfigListWidget.java @@ -47,8 +47,8 @@ public class ShortcutsConfigListWidget extends ElementListWidget getCategory() { diff --git a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java index 9768ff11..d9bfa6fc 100644 --- a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java @@ -228,7 +228,7 @@ public class ItemUtils { public static ItemStack getSkyblockerStack() { try { ItemStack stack = new ItemStack(Items.PLAYER_HEAD); - stack.set(DataComponentTypes.PROFILE, new ProfileComponent("SkyblockerStack", Optional.of(java.util.UUID.randomUUID()), propertyMapWithTexture("e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0="))); + stack.set(DataComponentTypes.PROFILE, new ProfileComponent(Optional.of("SkyblockerStack"), Optional.of(java.util.UUID.randomUUID()), propertyMapWithTexture("e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0="))); return stack; //return ItemStack.parseOptional(MinecraftClient.getInstance().player.getRegistryManager(), StringNbtReader.parse("{id:\"minecraft:player_head\",Count:1,tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}}")); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index e5ed5db4..17217bd3 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,9 +34,9 @@ "accessWidener": "skyblocker.accesswidener", "depends": { "fabricloader": ">=0.15.7", - "fabric-api": ">=0.96.5+1.20.5", + "fabric-api": ">=0.96.12+1.20.5", "yet_another_config_lib_v3": ">=3.3.3+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT", - "minecraft": "~1.20.5-alpha.24.9.a" + "minecraft": "~1.20.5-alpha.24.12.a" }, "conflicts": { "immediatelyfast": "<=1.2.11+1.20.4" diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 8a2205d4..dac3a201 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -21,7 +21,6 @@ "InGameHudMixin", "InGameOverlayRendererMixin", "InventoryScreenMixin", - "ItemMixin", "ItemStackMixin", "LeverBlockMixin", "LivingEntityRendererMixin", diff --git a/src/test/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixerTest.java b/src/test/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixerTest.java index 11951c44..82f33e6d 100644 --- a/src/test/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixerTest.java +++ b/src/test/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixerTest.java @@ -34,7 +34,7 @@ public class ItemStackComponentizationFixerTest { ItemStack fixedStack = ItemStackComponentizationFixer.fixUpItem(NBT); JsonElement stackJson = ItemStack.CODEC.encodeStart(JsonOps.INSTANCE, fixedStack).result().orElseThrow(); - Assertions.assertEquals("{\"id\":\"minecraft:diamond_sword\",\"components\":{\"minecraft:custom_data\":{\"ExtraAttributes\":{\"id\":\"TEST\"}}}}", GSON.toJson(stackJson)); + Assertions.assertEquals("{\"id\":\"minecraft:diamond_sword\",\"count\":1,\"components\":{\"minecraft:custom_data\":{\"ExtraAttributes\":{\"id\":\"TEST\"}}}}", GSON.toJson(stackJson)); } private static NbtCompound convertToNbt(String nbt) { -- cgit From 9305b5cb8bc483e4d4585fed46ef697cda76e033 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:53:17 -0400 Subject: 24w13a --- gradle.properties | 6 +++--- .../skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java | 10 +++++----- src/main/resources/fabric.mod.json | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) (limited to 'src/main/resources') diff --git a/gradle.properties b/gradle.properties index e1ebba36..4be3c383 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,13 @@ org.gradle.parallel=true # Fabric Properties (https://fabricmc.net/versions.html) ## 1.20 -minecraft_version=24w12a -yarn_mappings=24w12a+build.3 +minecraft_version=24w13a +yarn_mappings=24w13a+build.7 loader_version=0.15.7 #Fabric api ## 1.20 -fabric_api_version=0.96.12+1.20.5 +fabric_api_version=0.96.13+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java index 716f5eb9..5474224a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonMapUtils.java @@ -5,9 +5,9 @@ import it.unimi.dsi.fastutil.ints.IntSortedSet; import it.unimi.dsi.fastutil.objects.ObjectIntPair; import net.minecraft.block.Blocks; import net.minecraft.block.MapColor; -import net.minecraft.item.map.MapIcon; +import net.minecraft.item.map.MapDecoration; +import net.minecraft.item.map.MapDecorationTypes; import net.minecraft.item.map.MapState; -import net.minecraft.item.map.Type; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; @@ -46,9 +46,9 @@ public class DungeonMapUtils { @Nullable private static Vector2i getMapPlayerPos(MapState map) { - for (MapIcon icon : map.getIcons()) { - if (icon.type() == Type.FRAME) { - return new Vector2i((icon.x() >> 1) + 64, (icon.z() >> 1) + 64); + for (MapDecoration decoration : map.getDecorations()) { + if (decoration.type().value().equals(MapDecorationTypes.FRAME.value())) { + return new Vector2i((decoration.x() >> 1) + 64, (decoration.z() >> 1) + 64); } } return null; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 17217bd3..3638a9d5 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,9 +34,9 @@ "accessWidener": "skyblocker.accesswidener", "depends": { "fabricloader": ">=0.15.7", - "fabric-api": ">=0.96.12+1.20.5", + "fabric-api": ">=0.96.13+1.20.5", "yet_another_config_lib_v3": ">=3.3.3+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT", - "minecraft": "~1.20.5-alpha.24.12.a" + "minecraft": "~1.20.5-alpha.24.13.a" }, "conflicts": { "immediatelyfast": "<=1.2.11+1.20.4" -- cgit From 87fec063614292700954ce5fa3c73de075b56b58 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Wed, 3 Apr 2024 16:51:10 -0400 Subject: 24w14a & Java 21 --- build.gradle | 11 +++-------- gradle.properties | 8 ++++---- .../mixin/accessor/MinecraftClientAccessor.java | 15 +++++++++++++++ .../mixin/accessor/SkullBlockEntityAccessor.java | 4 +++- .../java/de/hysky/skyblocker/skyblock/ChestValue.java | 4 ++-- .../dungeon/partyfinder/FinderSettingsContainer.java | 7 ++++--- .../skyblock/dungeon/partyfinder/PartyEntry.java | 5 +++-- .../skyblock/dungeon/partyfinder/PartyFinderScreen.java | 5 ++--- .../skyblocker/skyblock/item/PlayerHeadHashCache.java | 7 +++---- .../skyblocker/skyblock/item/tooltip/ItemTooltip.java | 4 ++-- src/main/java/de/hysky/skyblocker/utils/Utils.java | 16 +++++++++++++++- src/main/resources/fabric.mod.json | 7 ++++--- src/main/resources/skyblocker.mixins.json | 1 + 13 files changed, 61 insertions(+), 33 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/MinecraftClientAccessor.java (limited to 'src/main/resources') diff --git a/build.gradle b/build.gradle index 4958c16f..f6c0d984 100644 --- a/build.gradle +++ b/build.gradle @@ -97,17 +97,12 @@ processResources { } tasks.withType(JavaCompile).configureEach { - it.options.release = 17 + it.options.release = 21 } java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() - - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } jar { diff --git a/gradle.properties b/gradle.properties index 4be3c383..858605a8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,13 @@ org.gradle.parallel=true # Fabric Properties (https://fabricmc.net/versions.html) ## 1.20 -minecraft_version=24w13a -yarn_mappings=24w13a+build.7 -loader_version=0.15.7 +minecraft_version=24w14a +yarn_mappings=24w14a+build.5 +loader_version=0.15.9 #Fabric api ## 1.20 -fabric_api_version=0.96.13+1.20.5 +fabric_api_version=0.96.14+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/MinecraftClientAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/MinecraftClientAccessor.java new file mode 100644 index 00000000..f48037df --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/MinecraftClientAccessor.java @@ -0,0 +1,15 @@ +package de.hysky.skyblocker.mixin.accessor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; + +import net.minecraft.client.MinecraftClient; + +@Mixin(MinecraftClient.class) +public interface MinecraftClientAccessor { + + @Accessor + public YggdrasilAuthenticationService getAuthenticationService(); +} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java index dfe544bc..875d24d3 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java +++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java @@ -2,6 +2,8 @@ package de.hysky.skyblocker.mixin.accessor; import com.mojang.authlib.GameProfile; import net.minecraft.block.entity.SkullBlockEntity; +import net.minecraft.util.ApiServices; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @@ -11,7 +13,7 @@ import java.util.concurrent.CompletableFuture; @Mixin(SkullBlockEntity.class) public interface SkullBlockEntityAccessor { @Invoker - static CompletableFuture> invokeFetchProfile(String name) { + static CompletableFuture> invokeFetchProfileByName(String name, ApiServices apiServices) { throw new UnsupportedOperationException(); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index 5cdca216..c34c853b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -7,6 +7,7 @@ import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor; import de.hysky.skyblocker.mixin.accessor.ScreenAccessor; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import it.unimi.dsi.fastutil.longs.LongBooleanPair; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; @@ -15,7 +16,6 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.item.TooltipContext; import net.minecraft.item.ItemStack; import net.minecraft.screen.GenericContainerScreenHandler; import net.minecraft.screen.slot.Slot; @@ -206,7 +206,7 @@ public class ChestValue { * Searches for a specific string of characters in the name and lore of an item */ private static String searchLoreFor(ItemStack stack, MinecraftClient client, String searchString) { - return stack.getTooltip(client.player, TooltipContext.BASIC).stream().map(Text::getString).filter(line -> line.contains(searchString)).findAny().orElse(null); + return ItemUtils.getLoreLineIf(stack, line -> line.contains(searchString)); } static Text getProfitText(long profit, boolean hasIncompleteData) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/FinderSettingsContainer.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/FinderSettingsContainer.java index 0a048775..70902a17 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/FinderSettingsContainer.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/FinderSettingsContainer.java @@ -5,7 +5,6 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.widget.ContainerWidget; -import net.minecraft.client.item.TooltipContext; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.screen.GenericContainerScreenHandler; @@ -15,6 +14,8 @@ import net.minecraft.text.Text; import java.util.ArrayList; import java.util.List; +import de.hysky.skyblocker.utils.ItemUtils; + public class FinderSettingsContainer extends ContainerWidget { private boolean isInitialized = false; private OptionDropdownWidget floorSelector; @@ -161,7 +162,7 @@ public class FinderSettingsContainer extends ContainerWidget { * @return true if all goes well */ private boolean setRangeFromTooltip(ItemStack stack, RangedValueWidget widget) { - for (Text text : stack.getTooltip(null, TooltipContext.BASIC)) { + for (Text text : ItemUtils.getLore(stack)) { String textLowerCase = text.getString().toLowerCase(); if (textLowerCase.contains("selected:")) { String[] split = text.getString().split(":"); @@ -186,7 +187,7 @@ public class FinderSettingsContainer extends ContainerWidget { * @return true if all goes well */ private boolean setSelectedElementFromTooltip(Slot slot, ItemStack stack, OptionDropdownWidget dropdownWidget) { - for (Text text : stack.getTooltip(null, TooltipContext.BASIC)) { + for (Text text : ItemUtils.getLore(stack)) { String textLowerCase = text.getString().toLowerCase(); if (textLowerCase.contains("selected:")) { String[] split = text.getString().split(":"); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java index 3dc8cfd6..dd550b4f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java @@ -3,6 +3,7 @@ package de.hysky.skyblocker.skyblock.dungeon.partyfinder; import com.mojang.authlib.properties.PropertyMap; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.mixin.accessor.SkullBlockEntityAccessor; +import de.hysky.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; @@ -145,7 +146,7 @@ public class PartyEntry extends ElementListWidget.Entry { if (matcher.find()) classLevel = Integer.parseInt(matcher.group(1)); Player player = new Player(playerName, className, classLevel); - SkullBlockEntityAccessor.invokeFetchProfile(playerNameTrim).thenAccept( + SkullBlockEntityAccessor.invokeFetchProfileByName(playerNameTrim, Utils.getApiServices()).thenAccept( gameProfile -> gameProfile.ifPresent(profile -> player.skinTexture = (client.getSkinProvider().getSkinTextures(profile).texture()))); if (playerNameTrim.equals(partyHost)) { @@ -170,7 +171,7 @@ public class PartyEntry extends ElementListWidget.Entry { partyLeader = new Player(Text.literal("Error"), "Error", -1); } - SkullBlockEntityAccessor.invokeFetchProfile(partyLeader.name.getString()).thenAccept( + SkullBlockEntityAccessor.invokeFetchProfileByName(partyLeader.name.getString(), Utils.getApiServices()).thenAccept( gameProfile -> gameProfile.ifPresent(profile -> partyLeaderSkin = client.getSkinProvider().getSkinTextures(profile).texture())); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java index 98ab88c0..4ba68256 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java @@ -13,7 +13,6 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.item.TooltipContext; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.toast.SystemToast; import net.minecraft.entity.player.PlayerInventory; @@ -372,7 +371,7 @@ public class PartyFinderScreen extends Screen { if (slot.id > (handler.getRows() - 1) * 9 - 1 || !slot.hasStack()) continue; if (slot.getStack().isOf(Items.PLAYER_HEAD)) { assert this.client != null; - parties.add(new PartyEntry(slot.getStack().getTooltip(this.client.player, TooltipContext.BASIC), this, slot.id)); + parties.add(new PartyEntry(ItemUtils.getLore(slot.getStack()), this, slot.id)); } else if (slot.getStack().isOf(Items.ARROW) && slot.getStack().getName().getString().toLowerCase().contains("previous")) { prevPageSlotId = slot.id; previousPageButton.active = true; @@ -401,7 +400,7 @@ public class PartyFinderScreen extends Screen { deListSlotId = slot.id; } else if (slot.getStack().isOf(Items.PLAYER_HEAD)) { assert this.client != null; - tooltips = slot.getStack().getTooltip(this.client.player, TooltipContext.BASIC); + tooltips = ItemUtils.getLore(slot.getStack()); } } if (tooltips != null) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java b/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java index 2a1688fc..da832164 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java @@ -1,7 +1,6 @@ package de.hysky.skyblocker.skyblock.item; -import java.net.MalformedURLException; -import java.net.URL; +import java.net.URI; import java.util.Base64; import java.util.concurrent.CompletableFuture; @@ -50,8 +49,8 @@ public class PlayerHeadHashCache { //From MinecraftProfileTexture#getHash public static String getSkinHash(String url) { try { - return FilenameUtils.getBaseName(new URL(url).getPath()); - } catch (MalformedURLException e) { + return FilenameUtils.getBaseName(new URI(url).getPath()); + } catch (Exception e) { LOGGER.error("[Skyblocker Player Head Hash Cache] Malformed Skin URL! URL: {}", url, e); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index 855a4760..94153c01 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -12,7 +12,7 @@ import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.scheduler.Scheduler; import it.unimi.dsi.fastutil.Pair; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.item.TooltipContext; +import net.minecraft.client.item.TooltipType; import net.minecraft.component.type.DyedColorComponent; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; @@ -34,7 +34,7 @@ public class ItemTooltip { protected static final SkyblockerConfig.ItemTooltip config = SkyblockerConfigManager.get().general.itemTooltip; private static volatile boolean sentNullWarning = false; - public static void getTooltip(ItemStack stack, TooltipContext context, List lines) { + public static void getTooltip(ItemStack stack, TooltipType context, List lines) { if (!Utils.isOnSkyblock() || client.player == null) return; String name = getInternalNameFromNBT(stack, false); diff --git a/src/main/java/de/hysky/skyblocker/utils/Utils.java b/src/main/java/de/hysky/skyblocker/utils/Utils.java index bbee3ce1..dcd39de7 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Utils.java +++ b/src/main/java/de/hysky/skyblocker/utils/Utils.java @@ -3,6 +3,7 @@ package de.hysky.skyblocker.utils; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import de.hysky.skyblocker.events.SkyblockEvents; +import de.hysky.skyblocker.mixin.accessor.MinecraftClientAccessor; import de.hysky.skyblocker.skyblock.item.MuseumItemCache; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; @@ -19,6 +20,7 @@ import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.scoreboard.*; import net.minecraft.text.Text; +import net.minecraft.util.ApiServices; import net.minecraft.util.Formatting; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -74,6 +76,7 @@ public class Utils { private static boolean canSendLocRaw = false; private static String mayor = ""; + private static ApiServices apiServices; /** * @implNote The parent text will always be empty, the actual text content is inside the text's siblings. @@ -217,7 +220,6 @@ public class Utils { } if (sidebar.isEmpty() && !fabricLoader.isDevelopmentEnvironment()) return; - String string = sidebar.toString(); if (fabricLoader.isDevelopmentEnvironment() || isConnectedToHypixel(client)) { if (!isOnHypixel) { @@ -466,4 +468,16 @@ public class Utils { }); } + + public static ApiServices getApiServices() { + if (apiServices == null) { + MinecraftClient client = MinecraftClient.getInstance(); + ApiServices apiServicesInstance = ApiServices.create(((MinecraftClientAccessor) client).getAuthenticationService(), client.runDirectory); + apiServices = apiServicesInstance; + + return apiServicesInstance; + } else { + return apiServices; + } + } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 3638a9d5..684fd66d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -33,10 +33,11 @@ ], "accessWidener": "skyblocker.accesswidener", "depends": { - "fabricloader": ">=0.15.7", - "fabric-api": ">=0.96.13+1.20.5", + "fabricloader": ">=0.15.9", + "fabric-api": ">=0.96.14+1.20.5", "yet_another_config_lib_v3": ">=3.3.3+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT", - "minecraft": "~1.20.5-alpha.24.13.a" + "minecraft": "~1.20.5-alpha.24.14.a", + "java": ">=21" }, "conflicts": { "immediatelyfast": "<=1.2.11+1.20.4" diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index dac3a201..f728f64f 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -44,6 +44,7 @@ "accessor.HandledScreenAccessor", "accessor.LayeredDrawerAccessor", "accessor.MessageHandlerAccessor", + "accessor.MinecraftClientAccessor", "accessor.PlayerListHudAccessor", "accessor.RecipeBookWidgetAccessor", "accessor.ScreenAccessor", -- cgit From 784ef6128b1963c696a13d2c81983fe372dd1424 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Fri, 12 Apr 2024 17:40:08 -0400 Subject: 1.20.5-pre1 --- gradle.properties | 8 ++++---- .../de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java | 3 ++- src/main/resources/fabric.mod.json | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) (limited to 'src/main/resources') diff --git a/gradle.properties b/gradle.properties index 858605a8..600fa31a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,13 @@ org.gradle.parallel=true # Fabric Properties (https://fabricmc.net/versions.html) ## 1.20 -minecraft_version=24w14a -yarn_mappings=24w14a+build.5 -loader_version=0.15.9 +minecraft_version=1.20.5-pre1 +yarn_mappings=1.20.5-pre1+build.5 +loader_version=0.15.10 #Fabric api ## 1.20 -fabric_api_version=0.96.14+1.20.5 +fabric_api_version=0.96.15+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index 94153c01..b776d1ed 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -14,6 +14,7 @@ import it.unimi.dsi.fastutil.Pair; import net.minecraft.client.MinecraftClient; import net.minecraft.client.item.TooltipType; import net.minecraft.component.type.DyedColorComponent; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; @@ -34,7 +35,7 @@ public class ItemTooltip { protected static final SkyblockerConfig.ItemTooltip config = SkyblockerConfigManager.get().general.itemTooltip; private static volatile boolean sentNullWarning = false; - public static void getTooltip(ItemStack stack, TooltipType context, List lines) { + public static void getTooltip(ItemStack stack, Item.TooltipContext tooltipContext, TooltipType tooltipType, List lines) { if (!Utils.isOnSkyblock() || client.player == null) return; String name = getInternalNameFromNBT(stack, false); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 684fd66d..87de1f97 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -33,10 +33,10 @@ ], "accessWidener": "skyblocker.accesswidener", "depends": { - "fabricloader": ">=0.15.9", - "fabric-api": ">=0.96.14+1.20.5", + "fabricloader": ">=0.15.10", + "fabric-api": ">=0.96.15+1.20.5", "yet_another_config_lib_v3": ">=3.3.3+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT", - "minecraft": "~1.20.5-alpha.24.14.a", + "minecraft": "~1.20.5-beta.1", "java": ">=21" }, "conflicts": { -- cgit From fab5b777ea00311a5382779620706d3494afab03 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Fri, 12 Apr 2024 17:57:07 -0400 Subject: Set Mixin compatibility level to Java 21 --- src/main/resources/skyblocker.mixins.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/resources') diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index f728f64f..87f1ea78 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -2,7 +2,7 @@ "required": true, "package": "de.hysky.skyblocker.mixin", "plugin": "de.hysky.skyblocker.compatibility.MixinPlugin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "client": [ "AbstractInventoryScreenMixin", "BatEntityMixin", -- cgit From b71e7575963eae5c36b3a9b7773ccd3997e09ec2 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Fri, 19 Apr 2024 16:32:23 -0400 Subject: 1.20.5-rc2 & use correct YACL version --- gradle.properties | 8 ++++---- src/main/resources/fabric.mod.json | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) (limited to 'src/main/resources') diff --git a/gradle.properties b/gradle.properties index 600fa31a..f60d527e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,17 +3,17 @@ org.gradle.parallel=true # Fabric Properties (https://fabricmc.net/versions.html) ## 1.20 -minecraft_version=1.20.5-pre1 -yarn_mappings=1.20.5-pre1+build.5 +minecraft_version=1.20.5-rc2 +yarn_mappings=1.20.5-rc2+build.1 loader_version=0.15.10 #Fabric api ## 1.20 -fabric_api_version=0.96.15+1.20.5 +fabric_api_version=0.97.3+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) -yacl_version=3.3.3+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT +yacl_version=3.3.2+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT ## Mod Menu (https://modrinth.com/mod/modmenu/versions) mod_menu_version = 10.0.0-alpha.1 ## REI (https://modrinth.com/mod/rei/versions?l=fabric) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 87de1f97..ee49991f 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,9 +34,9 @@ "accessWidener": "skyblocker.accesswidener", "depends": { "fabricloader": ">=0.15.10", - "fabric-api": ">=0.96.15+1.20.5", - "yet_another_config_lib_v3": ">=3.3.3+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT", - "minecraft": "~1.20.5-beta.1", + "fabric-api": ">=0.97.3+1.20.5", + "yet_another_config_lib_v3": ">=3.3.2+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT", + "minecraft": "~1.20.5-rc.2", "java": ">=21" }, "conflicts": { -- cgit From 80acfdaa9b77a95a1e5763203b3a8d72100bdea4 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Mon, 22 Apr 2024 11:07:42 -0400 Subject: 1.20.5-rc3 --- gradle.properties | 6 +++--- src/main/resources/fabric.mod.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'src/main/resources') diff --git a/gradle.properties b/gradle.properties index f60d527e..360bf944 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,13 @@ org.gradle.parallel=true # Fabric Properties (https://fabricmc.net/versions.html) ## 1.20 -minecraft_version=1.20.5-rc2 -yarn_mappings=1.20.5-rc2+build.1 +minecraft_version=1.20.5-rc3 +yarn_mappings=1.20.5-rc3+build.1 loader_version=0.15.10 #Fabric api ## 1.20 -fabric_api_version=0.97.3+1.20.5 +fabric_api_version=0.97.5+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index ee49991f..e350b8a4 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,9 +34,9 @@ "accessWidener": "skyblocker.accesswidener", "depends": { "fabricloader": ">=0.15.10", - "fabric-api": ">=0.97.3+1.20.5", + "fabric-api": ">=0.97.5+1.20.5", "yet_another_config_lib_v3": ">=3.3.2+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT", - "minecraft": "~1.20.5-rc.2", + "minecraft": "~1.20.5-rc.3", "java": ">=21" }, "conflicts": { -- cgit From 07f6469fffac314ac529794e159b266bc49fc6af Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Tue, 23 Apr 2024 11:15:05 -0400 Subject: 1.20.5 --- gradle.properties | 4 ++-- src/main/resources/fabric.mod.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/main/resources') diff --git a/gradle.properties b/gradle.properties index 360bf944..48a45dc1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.parallel=true # Fabric Properties (https://fabricmc.net/versions.html) ## 1.20 -minecraft_version=1.20.5-rc3 -yarn_mappings=1.20.5-rc3+build.1 +minecraft_version=1.20.5 +yarn_mappings=1.20.5+build.1 loader_version=0.15.10 #Fabric api diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index e350b8a4..4972377e 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -36,7 +36,7 @@ "fabricloader": ">=0.15.10", "fabric-api": ">=0.97.5+1.20.5", "yet_another_config_lib_v3": ">=3.3.2+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT", - "minecraft": "~1.20.5-rc.3", + "minecraft": "~1.20.5", "java": ">=21" }, "conflicts": { -- cgit From fad294b43f7386afc08915ea2f2accf0523b588a Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Tue, 23 Apr 2024 13:58:52 -0400 Subject: Update to YACL 3.4.0 --- build.gradle | 2 +- gradle.properties | 2 +- src/main/resources/fabric.mod.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/main/resources') diff --git a/build.gradle b/build.gradle index f6c0d984..fd21ebd5 100644 --- a/build.gradle +++ b/build.gradle @@ -48,7 +48,7 @@ dependencies { modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" // YACL - include modImplementation("dev.isxander.yacl:yet-another-config-lib-fabric:${project.yacl_version}") + include modImplementation("dev.isxander:yet-another-config-lib:${project.yacl_version}-fabric") // Mod Menu modImplementation "com.terraformersmc:modmenu:${project.mod_menu_version}" diff --git a/gradle.properties b/gradle.properties index 48a45dc1..f335d2b2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ fabric_api_version=0.97.5+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) -yacl_version=3.3.2+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT +yacl_version=3.4.0+1.20.5 ## Mod Menu (https://modrinth.com/mod/modmenu/versions) mod_menu_version = 10.0.0-alpha.1 ## REI (https://modrinth.com/mod/rei/versions?l=fabric) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 4972377e..650b82af 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -35,7 +35,7 @@ "depends": { "fabricloader": ">=0.15.10", "fabric-api": ">=0.97.5+1.20.5", - "yet_another_config_lib_v3": ">=3.3.2+1.20.4+update.1.20.5-SNAPSHOT+update.1.20.5-SNAPSHOT", + "yet_another_config_lib_v3": ">=3.4.0+1.20.5", "minecraft": "~1.20.5", "java": ">=21" }, -- cgit From 243edeabe16d2739b56e78d081d1e1570bf85fef Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Tue, 23 Apr 2024 14:06:15 -0400 Subject: Fix Fancy PF crash --- .../mixin/accessor/MinecraftClientAccessor.java | 15 --------------- .../mixin/accessor/SkullBlockEntityAccessor.java | 3 +-- .../skyblock/dungeon/partyfinder/PartyEntry.java | 4 ++-- src/main/java/de/hysky/skyblocker/utils/Utils.java | 15 --------------- src/main/resources/skyblocker.mixins.json | 1 - 5 files changed, 3 insertions(+), 35 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/MinecraftClientAccessor.java (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/MinecraftClientAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/MinecraftClientAccessor.java deleted file mode 100644 index f48037df..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/MinecraftClientAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; - -import net.minecraft.client.MinecraftClient; - -@Mixin(MinecraftClient.class) -public interface MinecraftClientAccessor { - - @Accessor - public YggdrasilAuthenticationService getAuthenticationService(); -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java index 875d24d3..c445104e 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java +++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java @@ -2,7 +2,6 @@ package de.hysky.skyblocker.mixin.accessor; import com.mojang.authlib.GameProfile; import net.minecraft.block.entity.SkullBlockEntity; -import net.minecraft.util.ApiServices; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @@ -13,7 +12,7 @@ import java.util.concurrent.CompletableFuture; @Mixin(SkullBlockEntity.class) public interface SkullBlockEntityAccessor { @Invoker - static CompletableFuture> invokeFetchProfileByName(String name, ApiServices apiServices) { + static CompletableFuture> invokeFetchProfileByName(String name) { throw new UnsupportedOperationException(); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java index dd550b4f..f86d3057 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java @@ -146,7 +146,7 @@ public class PartyEntry extends ElementListWidget.Entry { if (matcher.find()) classLevel = Integer.parseInt(matcher.group(1)); Player player = new Player(playerName, className, classLevel); - SkullBlockEntityAccessor.invokeFetchProfileByName(playerNameTrim, Utils.getApiServices()).thenAccept( + SkullBlockEntityAccessor.invokeFetchProfileByName(playerNameTrim).thenAccept( gameProfile -> gameProfile.ifPresent(profile -> player.skinTexture = (client.getSkinProvider().getSkinTextures(profile).texture()))); if (playerNameTrim.equals(partyHost)) { @@ -171,7 +171,7 @@ public class PartyEntry extends ElementListWidget.Entry { partyLeader = new Player(Text.literal("Error"), "Error", -1); } - SkullBlockEntityAccessor.invokeFetchProfileByName(partyLeader.name.getString(), Utils.getApiServices()).thenAccept( + SkullBlockEntityAccessor.invokeFetchProfileByName(partyLeader.name.getString()).thenAccept( gameProfile -> gameProfile.ifPresent(profile -> partyLeaderSkin = client.getSkinProvider().getSkinTextures(profile).texture())); } diff --git a/src/main/java/de/hysky/skyblocker/utils/Utils.java b/src/main/java/de/hysky/skyblocker/utils/Utils.java index dcd39de7..89495fcb 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Utils.java +++ b/src/main/java/de/hysky/skyblocker/utils/Utils.java @@ -3,7 +3,6 @@ package de.hysky.skyblocker.utils; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import de.hysky.skyblocker.events.SkyblockEvents; -import de.hysky.skyblocker.mixin.accessor.MinecraftClientAccessor; import de.hysky.skyblocker.skyblock.item.MuseumItemCache; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; @@ -20,7 +19,6 @@ import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.scoreboard.*; import net.minecraft.text.Text; -import net.minecraft.util.ApiServices; import net.minecraft.util.Formatting; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -76,7 +74,6 @@ public class Utils { private static boolean canSendLocRaw = false; private static String mayor = ""; - private static ApiServices apiServices; /** * @implNote The parent text will always be empty, the actual text content is inside the text's siblings. @@ -468,16 +465,4 @@ public class Utils { }); } - - public static ApiServices getApiServices() { - if (apiServices == null) { - MinecraftClient client = MinecraftClient.getInstance(); - ApiServices apiServicesInstance = ApiServices.create(((MinecraftClientAccessor) client).getAuthenticationService(), client.runDirectory); - apiServices = apiServicesInstance; - - return apiServicesInstance; - } else { - return apiServices; - } - } } diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 87f1ea78..f06dc974 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -44,7 +44,6 @@ "accessor.HandledScreenAccessor", "accessor.LayeredDrawerAccessor", "accessor.MessageHandlerAccessor", - "accessor.MinecraftClientAccessor", "accessor.PlayerListHudAccessor", "accessor.RecipeBookWidgetAccessor", "accessor.ScreenAccessor", -- cgit From 271dec3f0e47cdd2a8950ff183984698412233a6 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Tue, 23 Apr 2024 15:59:41 -0400 Subject: Fix HUD Layering finally! Also improves the HudRenderEvents implementation to be less fragile --- .../de/hysky/skyblocker/mixin/InGameHudMixin.java | 43 ++++++++-------------- .../mixin/accessor/LayeredDrawerAccessor.java | 15 -------- .../skyblock/chat/ChatRuleAnnouncementScreen.java | 4 +- .../skyblocker/skyblock/dwarven/DwarvenHud.java | 4 +- .../de/hysky/skyblocker/skyblock/end/TheEnd.java | 4 +- src/main/resources/skyblocker.mixins.json | 1 - 6 files changed, 21 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java index d7b15f9d..908e51e2 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java @@ -7,7 +7,6 @@ import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars; import de.hysky.skyblocker.events.HudRenderEvents; -import de.hysky.skyblocker.mixin.accessor.LayeredDrawerAccessor; import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; import de.hysky.skyblocker.skyblock.item.ItemCooldowns; import de.hysky.skyblocker.skyblock.item.ItemProtection; @@ -24,17 +23,17 @@ import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Identifier; -import java.util.List; import java.util.function.Supplier; import java.util.regex.Pattern; -import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Environment(EnvType.CLIENT) @@ -122,32 +121,20 @@ public abstract class InGameHudMixin { } } - /** - * Hopefully other mods don't add stages into these two drawers... - * - * @implNote Check this every update to see if the indexes of each layer have changed. - */ - @Inject(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/InGameHud;layeredDrawer:Lnet/minecraft/client/gui/LayeredDrawer;", opcode = Opcodes.GETFIELD)) - private void skyblocker$beforeDrawersInitialized(CallbackInfo ci, @Local(ordinal = 0) LayeredDrawer persistentDrawer, @Local(ordinal = 1) LayeredDrawer intermittentDrawer) { - List persistentLayers = ((LayeredDrawerAccessor) persistentDrawer).getLayers(); - - //After Main HUD - stage index is 2 - LayeredDrawer.Layer mainHudLayer = persistentLayers.get(2); - - persistentLayers.set(2, (context, tickDelta) -> { - mainHudLayer.render(context, tickDelta); - HudRenderEvents.AFTER_MAIN_HUD.invoker().onRender(context, tickDelta); - }); - - List intermittentLayers = ((LayeredDrawerAccessor) intermittentDrawer).getLayers(); - - //Before Chat - stage index is 5 - LayeredDrawer.Layer chatLayer = intermittentLayers.get(5); + @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 2)) + private LayeredDrawer.Layer skyblocker$afterMainHud(LayeredDrawer.Layer mainHudLayer) { + return (context, tickDelta) -> { + mainHudLayer.render(context, tickDelta); + HudRenderEvents.AFTER_MAIN_HUD.invoker().onRender(context, tickDelta); + }; + } - intermittentLayers.set(5, (context, tickDelta) -> { - HudRenderEvents.BEFORE_CHAT.invoker().onRender(context, tickDelta); - chatLayer.render(context, tickDelta); - }); + @ModifyArg(method = "", slice = @Slice(from = @At(value = "NEW", target = "Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 1)), at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 5)) + private LayeredDrawer.Layer skyblocker$beforeChat(LayeredDrawer.Layer beforeChatLayer) { + return (context, tickDelta) -> { + HudRenderEvents.BEFORE_CHAT.invoker().onRender(context, tickDelta); + beforeChatLayer.render(context, tickDelta); + }; } @Inject(method = "", at = @At("TAIL")) diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java deleted file mode 100644 index 26110ca9..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/LayeredDrawerAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import java.util.List; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.client.gui.LayeredDrawer; - -@Mixin(LayeredDrawer.class) -public interface LayeredDrawerAccessor { - - @Accessor - List getLayers(); -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleAnnouncementScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleAnnouncementScreen.java index bafada27..d61a0b59 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleAnnouncementScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleAnnouncementScreen.java @@ -1,7 +1,7 @@ package de.hysky.skyblocker.skyblock.chat; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; +import de.hysky.skyblocker.events.HudRenderEvents; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; @@ -13,7 +13,7 @@ public class ChatRuleAnnouncementScreen { private static Text text = null; public static void init() { - HudRenderCallback.EVENT.register((context, tickDelta) -> { + HudRenderEvents.BEFORE_CHAT.register((context, tickDelta) -> { if (timer <= 0 || text == null) { return; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java index 86a8e685..bec98e99 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.dwarven; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.events.HudRenderEvents; import de.hysky.skyblocker.skyblock.tabhud.util.Colors; import de.hysky.skyblocker.skyblock.tabhud.widget.hud.HudCommsWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.hud.HudPowderWidget; @@ -8,7 +9,6 @@ import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; -import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.network.PlayerListEntry; @@ -60,7 +60,7 @@ public class DwarvenHud { ) )); - HudRenderCallback.EVENT.register((context, tickDelta) -> { + HudRenderEvents.AFTER_MAIN_HUD.register((context, tickDelta) -> { if (!SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledCommissions && !SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabledPowder || CLIENT.options.playerListKey.isPressed() || CLIENT.player == null diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/TheEnd.java b/src/main/java/de/hysky/skyblocker/skyblock/end/TheEnd.java index a093f598..6f2a0e40 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/end/TheEnd.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/end/TheEnd.java @@ -4,13 +4,13 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.events.HudRenderEvents; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.waypoint.Waypoint; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; -import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.fabricmc.fabric.api.event.player.AttackEntityCallback; @@ -73,7 +73,7 @@ public class TheEnd { }); - HudRenderCallback.EVENT.register((drawContext, tickDelta) -> { + HudRenderEvents.AFTER_MAIN_HUD.register((drawContext, tickDelta) -> { if (!Utils.isInTheEnd()) return; if (!SkyblockerConfigManager.get().locations.end.hudEnabled) return; diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index f06dc974..2d91eb0d 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -42,7 +42,6 @@ "accessor.EndermanEntityAccessor", "accessor.FrustumInvoker", "accessor.HandledScreenAccessor", - "accessor.LayeredDrawerAccessor", "accessor.MessageHandlerAccessor", "accessor.PlayerListHudAccessor", "accessor.RecipeBookWidgetAccessor", -- cgit From 4b06954d6db941e9bf663b1da5e8d65c5209e8f7 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Fri, 26 Apr 2024 07:38:08 -0400 Subject: YACL 3.4.1 and Fabric API 0.97.6 --- gradle.properties | 4 ++-- src/main/resources/fabric.mod.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/main/resources') diff --git a/gradle.properties b/gradle.properties index f335d2b2..a7e11b81 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,11 +9,11 @@ loader_version=0.15.10 #Fabric api ## 1.20 -fabric_api_version=0.97.5+1.20.5 +fabric_api_version=0.97.6+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) -yacl_version=3.4.0+1.20.5 +yacl_version=3.4.1+1.20.5 ## Mod Menu (https://modrinth.com/mod/modmenu/versions) mod_menu_version = 10.0.0-alpha.1 ## REI (https://modrinth.com/mod/rei/versions?l=fabric) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 650b82af..f877592d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,8 +34,8 @@ "accessWidener": "skyblocker.accesswidener", "depends": { "fabricloader": ">=0.15.10", - "fabric-api": ">=0.97.5+1.20.5", - "yet_another_config_lib_v3": ">=3.4.0+1.20.5", + "fabric-api": ">=0.97.6+1.20.5", + "yet_another_config_lib_v3": ">=3.4.1+1.20.5", "minecraft": "~1.20.5", "java": ">=21" }, -- cgit From 74f40f7704cd935552a27d9ebc2ae6a3c76e3566 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Fri, 26 Apr 2024 19:55:17 -0400 Subject: Update various dependencies --- gradle.properties | 8 ++++---- src/main/resources/fabric.mod.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'src/main/resources') diff --git a/gradle.properties b/gradle.properties index a7e11b81..e9374596 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,13 +9,13 @@ loader_version=0.15.10 #Fabric api ## 1.20 -fabric_api_version=0.97.6+1.20.5 +fabric_api_version=0.97.7+1.20.5 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) yacl_version=3.4.1+1.20.5 ## Mod Menu (https://modrinth.com/mod/modmenu/versions) -mod_menu_version = 10.0.0-alpha.1 +mod_menu_version = 10.0.0-beta.1 ## REI (https://modrinth.com/mod/rei/versions?l=fabric) rei_version = 13.0.666 ## EMI (https://modrinth.com/mod/emi/versions) @@ -25,11 +25,11 @@ emi_version = 1.0.22+1.20.2 ## Occlusion Culling (https://github.com/LogisticsCraft/OcclusionCulling) occlusionculling_version = 0.0.8-SNAPSHOT ## neu repoparser (https://repo.nea.moe/#/releases/moe/nea/neurepoparser/) -repoparser_version = 1.4.0 +repoparser_version = 1.5.0 # Other Libraries ## JGit (https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit) -jgit_version = 6.8.0.202311291450-r +jgit_version = 6.9.0.202403050737-r ## Apache Commons Math (https://mvnrepository.com/artifact/org.apache.commons/commons-math3) commons_math_version = 3.6.1 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index f877592d..81a6373d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,13 +34,13 @@ "accessWidener": "skyblocker.accesswidener", "depends": { "fabricloader": ">=0.15.10", - "fabric-api": ">=0.97.6+1.20.5", + "fabric-api": ">=0.97.7+1.20.5", "yet_another_config_lib_v3": ">=3.4.1+1.20.5", "minecraft": "~1.20.5", "java": ">=21" }, "conflicts": { - "immediatelyfast": "<=1.2.11+1.20.4" + "immediatelyfast": "<=1.2.12+1.20.5" }, "breaks": { "forcecloseworldloadingscreen": "<=2.2.0" -- cgit From d24bac4d728d8ea9264e08934fb863771bcca5e2 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Fri, 26 Apr 2024 20:00:18 -0400 Subject: Pluralize the mixin and accessor packages --- .../skyblocker/config/SkyblockerConfigManager.java | 2 +- .../mixin/AbstractInventoryScreenMixin.java | 19 -- .../de/hysky/skyblocker/mixin/BatEntityMixin.java | 21 -- .../mixin/ClientPlayNetworkHandlerMixin.java | 106 --------- .../skyblocker/mixin/ClientPlayerEntityMixin.java | 82 ------- .../mixin/CommandTreeS2CPacketMixin.java | 21 -- .../skyblocker/mixin/ComponentHolderMixin.java | 39 ---- .../hysky/skyblocker/mixin/DataTrackerMixin.java | 51 ---- .../hysky/skyblocker/mixin/DrawContextMixin.java | 71 ------ .../skyblocker/mixin/DyedColorComponentMixin.java | 34 --- .../mixin/EntityRenderDispatcherMixin.java | 18 -- .../hysky/skyblocker/mixin/FarmlandBlockMixin.java | 37 --- .../mixin/GenericContainerScreenHandlerMixin.java | 38 --- .../hysky/skyblocker/mixin/HandledScreenMixin.java | 258 --------------------- .../mixin/HandledScreenProviderMixin.java | 101 -------- .../de/hysky/skyblocker/mixin/InGameHudMixin.java | 144 ------------ .../mixin/InGameOverlayRendererMixin.java | 22 -- .../skyblocker/mixin/InventoryScreenMixin.java | 18 -- .../de/hysky/skyblocker/mixin/ItemStackMixin.java | 98 -------- .../de/hysky/skyblocker/mixin/LeverBlockMixin.java | 29 --- .../mixin/LivingEntityRendererMixin.java | 18 -- .../skyblocker/mixin/MinecraftClientMixin.java | 60 ----- .../java/de/hysky/skyblocker/mixin/MouseMixin.java | 19 -- .../skyblocker/mixin/PlayerInventoryMixin.java | 21 -- .../hysky/skyblocker/mixin/PlayerListHudMixin.java | 57 ----- .../skyblocker/mixin/PlayerSkinProviderMixin.java | 18 -- .../skyblocker/mixin/PlayerSkinTextureMixin.java | 40 ---- .../de/hysky/skyblocker/mixin/RenderFishMixin.java | 26 --- .../de/hysky/skyblocker/mixin/ScoreboardMixin.java | 16 -- .../SocialInteractionsPlayerListWidgetMixin.java | 24 -- .../de/hysky/skyblocker/mixin/WindowMixin.java | 16 -- .../hysky/skyblocker/mixin/WorldRendererMixin.java | 48 ---- .../YggdrasilMinecraftSessionServiceMixin.java | 20 -- .../mixin/YggdrasilServicesKeyInfoMixin.java | 60 ----- .../accessor/BeaconBlockEntityRendererInvoker.java | 16 -- .../mixin/accessor/DrawContextInvoker.java | 21 -- .../mixin/accessor/EndermanEntityAccessor.java | 17 -- .../skyblocker/mixin/accessor/FrustumInvoker.java | 14 -- .../mixin/accessor/HandledScreenAccessor.java | 26 --- .../mixin/accessor/MessageHandlerAccessor.java | 14 -- .../mixin/accessor/PlayerListHudAccessor.java | 16 -- .../mixin/accessor/RecipeBookWidgetAccessor.java | 15 -- .../skyblocker/mixin/accessor/ScreenAccessor.java | 14 -- .../mixin/accessor/SkullBlockEntityAccessor.java | 18 -- .../skyblocker/mixin/accessor/SlotAccessor.java | 17 -- .../mixin/accessor/WorldRendererAccessor.java | 13 -- .../mixin/discordipc/ConnectionMixin.java | 20 -- .../mixins/AbstractInventoryScreenMixin.java | 19 ++ .../de/hysky/skyblocker/mixins/BatEntityMixin.java | 21 ++ .../mixins/ClientPlayNetworkHandlerMixin.java | 106 +++++++++ .../skyblocker/mixins/ClientPlayerEntityMixin.java | 82 +++++++ .../mixins/CommandTreeS2CPacketMixin.java | 21 ++ .../skyblocker/mixins/ComponentHolderMixin.java | 39 ++++ .../hysky/skyblocker/mixins/DataTrackerMixin.java | 51 ++++ .../hysky/skyblocker/mixins/DrawContextMixin.java | 71 ++++++ .../skyblocker/mixins/DyedColorComponentMixin.java | 34 +++ .../mixins/EntityRenderDispatcherMixin.java | 18 ++ .../skyblocker/mixins/FarmlandBlockMixin.java | 37 +++ .../mixins/GenericContainerScreenHandlerMixin.java | 38 +++ .../skyblocker/mixins/HandledScreenMixin.java | 258 +++++++++++++++++++++ .../mixins/HandledScreenProviderMixin.java | 101 ++++++++ .../de/hysky/skyblocker/mixins/InGameHudMixin.java | 144 ++++++++++++ .../mixins/InGameOverlayRendererMixin.java | 22 ++ .../skyblocker/mixins/InventoryScreenMixin.java | 18 ++ .../de/hysky/skyblocker/mixins/ItemStackMixin.java | 98 ++++++++ .../hysky/skyblocker/mixins/LeverBlockMixin.java | 29 +++ .../mixins/LivingEntityRendererMixin.java | 18 ++ .../skyblocker/mixins/MinecraftClientMixin.java | 60 +++++ .../de/hysky/skyblocker/mixins/MouseMixin.java | 19 ++ .../skyblocker/mixins/PlayerInventoryMixin.java | 21 ++ .../skyblocker/mixins/PlayerListHudMixin.java | 57 +++++ .../skyblocker/mixins/PlayerSkinProviderMixin.java | 18 ++ .../skyblocker/mixins/PlayerSkinTextureMixin.java | 40 ++++ .../hysky/skyblocker/mixins/RenderFishMixin.java | 26 +++ .../hysky/skyblocker/mixins/ScoreboardMixin.java | 16 ++ .../SocialInteractionsPlayerListWidgetMixin.java | 24 ++ .../de/hysky/skyblocker/mixins/WindowMixin.java | 16 ++ .../skyblocker/mixins/WorldRendererMixin.java | 48 ++++ .../YggdrasilMinecraftSessionServiceMixin.java | 20 ++ .../mixins/YggdrasilServicesKeyInfoMixin.java | 60 +++++ .../BeaconBlockEntityRendererInvoker.java | 16 ++ .../mixins/accessors/DrawContextInvoker.java | 21 ++ .../mixins/accessors/EndermanEntityAccessor.java | 17 ++ .../mixins/accessors/FrustumInvoker.java | 14 ++ .../mixins/accessors/HandledScreenAccessor.java | 26 +++ .../mixins/accessors/MessageHandlerAccessor.java | 14 ++ .../mixins/accessors/PlayerListHudAccessor.java | 16 ++ .../mixins/accessors/RecipeBookWidgetAccessor.java | 15 ++ .../mixins/accessors/ScreenAccessor.java | 14 ++ .../mixins/accessors/SkullBlockEntityAccessor.java | 18 ++ .../skyblocker/mixins/accessors/SlotAccessor.java | 17 ++ .../mixins/accessors/WorldRendererAccessor.java | 13 ++ .../mixins/discordipc/ConnectionMixin.java | 20 ++ .../de/hysky/skyblocker/skyblock/ChestValue.java | 4 +- .../skyblocker/skyblock/WarpAutocomplete.java | 2 +- .../auction/AuctionHouseScreenHandler.java | 2 +- .../skyblocker/skyblock/chat/ChatRulesHandler.java | 2 +- .../skyblock/dungeon/partyfinder/PartyEntry.java | 2 +- .../item/tooltip/CompactorDeletorPreview.java | 2 +- .../skyblock/itemlist/ItemListWidget.java | 3 +- .../skyblock/quicknav/QuickNavButton.java | 2 +- .../skyblock/tabhud/util/PlayerListMgr.java | 2 +- .../skyblocker/utils/render/FrustumUtils.java | 4 +- .../skyblocker/utils/render/RenderHelper.java | 4 +- .../utils/render/gui/AbstractCustomHypixelGUI.java | 2 +- .../utils/render/gui/ContainerSolverManager.java | 3 +- src/main/resources/skyblocker.mixins.json | 26 +-- 107 files changed, 1903 insertions(+), 1901 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/WindowMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/EndermanEntityAccessor.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/FrustumInvoker.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/HandledScreenAccessor.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/ScreenAccessor.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/WorldRendererAccessor.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/discordipc/ConnectionMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/AbstractInventoryScreenMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ComponentHolderMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/DataTrackerMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/DyedColorComponentMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/FarmlandBlockMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/InGameOverlayRendererMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/LeverBlockMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/MinecraftClientMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/MouseMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerInventoryMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerSkinProviderMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerSkinTextureMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/RenderFishMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ScoreboardMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/SocialInteractionsPlayerListWidgetMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/YggdrasilMinecraftSessionServiceMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/YggdrasilServicesKeyInfoMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/EndermanEntityAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/FrustumInvoker.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/MessageHandlerAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/PlayerListHudAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/RecipeBookWidgetAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/ScreenAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/SkullBlockEntityAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/SlotAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/WorldRendererAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/discordipc/ConnectionMixin.java (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java index 70578822..31f1357d 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java @@ -4,7 +4,7 @@ import com.google.gson.FieldNamingPolicy; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.categories.*; -import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor; +import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.utils.scheduler.Scheduler; import dev.isxander.yacl3.api.YetAnotherConfigLib; import dev.isxander.yacl3.config.v2.api.ConfigClassHandler; diff --git a/src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java deleted file mode 100644 index d0d4b9f7..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen; - -@Mixin(AbstractInventoryScreen.class) -public class AbstractInventoryScreenMixin { - - @Inject(method = "drawStatusEffects", at = @At("HEAD"), cancellable = true) - private void skyblocker$dontDrawStatusEffects(CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java deleted file mode 100644 index fa97e546..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.mob.AmbientEntity; -import net.minecraft.entity.passive.BatEntity; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; - -@Mixin(BatEntity.class) -public abstract class BatEntityMixin extends AmbientEntity { - protected BatEntityMixin(EntityType entityType, World world) { - super(entityType, world); - } - - @Override - public void onRemoved() { - super.onRemoved(); - DungeonManager.onBatRemoved(this); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java deleted file mode 100644 index b3471972..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java +++ /dev/null @@ -1,106 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; -import com.llamalad7.mixinextras.sugar.Local; -import de.hysky.skyblocker.skyblock.FishingHelper; -import de.hysky.skyblocker.skyblock.dungeon.DungeonScore; -import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager; -import de.hysky.skyblocker.skyblock.end.BeaconHighlighter; -import de.hysky.skyblocker.skyblock.end.EnderNodes; -import de.hysky.skyblocker.skyblock.end.TheEnd; -import de.hysky.skyblocker.skyblock.waypoint.MythologicalRitual; -import de.hysky.skyblocker.utils.SlayerUtils; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.block.Blocks; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityStatuses; -import net.minecraft.entity.ItemEntity; -import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket; -import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; -import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; -import net.minecraft.util.Identifier; -import org.slf4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(ClientPlayNetworkHandler.class) -public abstract class ClientPlayNetworkHandlerMixin { - @Shadow - private ClientWorld world; - - @Inject(method = "onBlockUpdate", at = @At("RETURN")) - private void skyblocker$onBlockUpdate(BlockUpdateS2CPacket packet, CallbackInfo ci) { - if (Utils.isInTheEnd() && SlayerUtils.isInSlayer()) { - BeaconHighlighter.beaconPositions.remove(packet.getPos()); - if (packet.getState().isOf(Blocks.BEACON)) { - BeaconHighlighter.beaconPositions.add(packet.getPos()); - } - } - } - - @Inject(method = "method_37472", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;removeEntity(ILnet/minecraft/entity/Entity$RemovalReason;)V")) - private void skyblocker$onItemDestroy(int entityId, CallbackInfo ci) { - if (world.getEntityById(entityId) instanceof ItemEntity itemEntity) { - DungeonManager.onItemPickup(itemEntity); - } - } - - @ModifyVariable(method = "onItemPickupAnimation", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;removeEntity(ILnet/minecraft/entity/Entity$RemovalReason;)V", ordinal = 0)) - private ItemEntity skyblocker$onItemPickup(ItemEntity itemEntity) { - DungeonManager.onItemPickup(itemEntity); - return itemEntity; - } - - @WrapWithCondition(method = "onEntityPassengersSet", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;)V", remap = false)) - private boolean skyblocker$cancelEntityPassengersWarning(Logger instance, String msg) { - return !Utils.isOnHypixel(); - } - - @WrapWithCondition(method = "onPlayerList", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false)) - private boolean skyblocker$cancelPlayerListWarning(Logger instance, String format, Object arg1, Object arg2) { - return !Utils.isOnHypixel(); - } - - @Inject(method = "onPlaySound", at = @At("RETURN")) - private void skyblocker$onPlaySound(PlaySoundS2CPacket packet, CallbackInfo ci) { - FishingHelper.onSound(packet); - } - - @WrapWithCondition(method = "warnOnUnknownPayload", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false)) - private boolean skyblocker$dropBadlionPacketWarnings(Logger instance, String message, Object identifier) { - return !(Utils.isOnHypixel() && ((Identifier) identifier).getNamespace().equals("badlion")); - } - - @WrapWithCondition(method = { "onScoreboardScoreUpdate", "onScoreboardScoreReset" }, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false)) - private boolean skyblocker$cancelUnknownScoreboardObjectiveWarnings(Logger instance, String message, Object objectiveName) { - return !Utils.isOnHypixel(); - } - - @WrapWithCondition(method = "onTeam", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;[Ljava/lang/Object;)V", remap = false)) - private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object... arg) { - return !Utils.isOnHypixel(); - } - - @Inject(method = "onParticle", at = @At("RETURN")) - private void skyblocker$onParticle(ParticleS2CPacket packet, CallbackInfo ci) { - MythologicalRitual.onParticle(packet); - EnderNodes.onParticle(packet); - } - - @ModifyExpressionValue(method = "onEntityStatus", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/EntityStatusS2CPacket;getEntity(Lnet/minecraft/world/World;)Lnet/minecraft/entity/Entity;")) - private Entity skyblocker$onEntityDeath(Entity entity, @Local(argsOnly = true) EntityStatusS2CPacket packet) { - if (packet.getStatus() == EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES) { - DungeonScore.handleEntityDeath(entity); - TheEnd.onEntityDeath(entity); - } - return entity; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java deleted file mode 100644 index 8fb2fda4..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java +++ /dev/null @@ -1,82 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.mojang.authlib.GameProfile; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.auction.AuctionViewScreen; -import de.hysky.skyblocker.skyblock.auction.EditBidPopup; -import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; -import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; -import de.hysky.skyblocker.skyblock.item.ItemProtection; -import de.hysky.skyblocker.skyblock.rift.HealingMelonIndicator; -import de.hysky.skyblocker.skyblock.searchoverlay.OverlayScreen; -import de.hysky.skyblocker.skyblock.searchoverlay.SearchOverManager; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(ClientPlayerEntity.class) -public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { - @Shadow - @Final - protected MinecraftClient client; - - public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { - super(world, profile); - } - - @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) - public void skyblocker$dropSelectedItem(CallbackInfoReturnable cir) { - if (Utils.isOnSkyblock() && (ItemProtection.isItemProtected(this.getInventory().getMainHandStack()) || HotbarSlotLock.isLocked(this.getInventory().selectedSlot)) - && (!SkyblockerConfigManager.get().locations.dungeons.allowDroppingProtectedItems || !Utils.isInDungeons())) { - cir.setReturnValue(false); - } - } - - @Inject(method = "updateHealth", at = @At("RETURN")) - public void skyblocker$updateHealth(CallbackInfo ci) { - HealingMelonIndicator.updateHealth(); - } - - @Inject(method = "openEditSignScreen", at = @At("HEAD"), cancellable = true) - public void skyblocker$redirectEditSignScreen(SignBlockEntity sign, boolean front, CallbackInfo callbackInfo) { - // Fancy Party Finder - if (!PartyFinderScreen.isInKuudraPartyFinder && client.currentScreen instanceof PartyFinderScreen partyFinderScreen && !partyFinderScreen.isAborted() && sign.getText(front).getMessage(3, false).getString().toLowerCase().contains("level")) { - partyFinderScreen.updateSign(sign, front); - callbackInfo.cancel(); - return; - } - - if (client.currentScreen instanceof AuctionViewScreen auctionViewScreen) { - this.client.setScreen(new EditBidPopup(auctionViewScreen, sign, front, auctionViewScreen.minBid)); - callbackInfo.cancel(); - } - - // Search Overlay - if (client.currentScreen != null) { - if (SkyblockerConfigManager.get().general.searchOverlay.enableAuctionHouse && client.currentScreen.getTitle().getString().toLowerCase().contains("auction")) { - if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) { - SearchOverManager.updateSign(sign, front, true); - client.setScreen(new OverlayScreen(Text.of(""))); - callbackInfo.cancel(); - } - } else if (SkyblockerConfigManager.get().general.searchOverlay.enableBazaar && client.currentScreen.getTitle().getString().toLowerCase().contains("bazaar")) { - if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) { - SearchOverManager.updateSign(sign, front, false); - client.setScreen(new OverlayScreen(Text.of(""))); - callbackInfo.cancel(); - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java b/src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java deleted file mode 100644 index 1cc1b8de..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.mojang.brigadier.tree.CommandNode; -import com.mojang.brigadier.tree.LiteralCommandNode; -import de.hysky.skyblocker.skyblock.WarpAutocomplete; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.command.CommandSource; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(targets = "net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket$CommandTree") -public class CommandTreeS2CPacketMixin { - @ModifyExpressionValue(method = "getNode", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/CommandTreeS2CPacket$CommandTree;getNode(I)Lcom/mojang/brigadier/tree/CommandNode;", ordinal = 1)) - public CommandNode modifyCommandSuggestions(CommandNode original) { - if (Utils.isOnHypixel() && WarpAutocomplete.commandNode != null && original instanceof LiteralCommandNode literalCommandNode && literalCommandNode.getLiteral().equals("warp")) { - return WarpAutocomplete.commandNode; - } - return original; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java deleted file mode 100644 index c8c57d6d..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java +++ /dev/null @@ -1,39 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.CustomArmorTrims; -import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.Utils; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.component.ComponentHolder; -import net.minecraft.component.DataComponentType; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.item.ItemStack; -import net.minecraft.item.trim.ArmorTrim; - -@Mixin(ComponentHolder.class) -public interface ComponentHolderMixin { - - @SuppressWarnings("unchecked") - @ModifyReturnValue(method = "get", at = @At("RETURN")) - private T skyblocker$customArmorTrims(T original, DataComponentType dataComponentType) { - if (Utils.isOnSkyblock() && ((Object) this) instanceof ItemStack stack) { - if (dataComponentType == DataComponentTypes.TRIM) { - Object2ObjectOpenHashMap customTrims = SkyblockerConfigManager.get().general.customArmorTrims; - String itemUuid = ItemUtils.getItemUuid(stack); - - if (customTrims.containsKey(itemUuid)) { - CustomArmorTrims.ArmorTrimId trimKey = customTrims.get(itemUuid); - return (T) CustomArmorTrims.TRIMS_CACHE.getOrDefault(trimKey, (ArmorTrim) original); - } - } - } - - return original; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java deleted file mode 100644 index a0b5de84..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java +++ /dev/null @@ -1,51 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.sugar.Local; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.mixin.accessor.EndermanEntityAccessor; -import de.hysky.skyblocker.skyblock.entity.MobGlow; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.Entity; -import net.minecraft.entity.data.DataTracked; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.sound.SoundEvents; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Optional; - -@Mixin(DataTracker.class) -public abstract class DataTrackerMixin { - @Shadow - @Final - private DataTracked trackedEntity; - - @SuppressWarnings("ConstantValue") - @Inject(method = "writeUpdatedEntries", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/data/DataTracker;copyToFrom(Lnet/minecraft/entity/data/DataTracker$Entry;Lnet/minecraft/entity/data/DataTracker$SerializedEntry;)V")) - private void skyblocker$onWriteUpdatedEntries(CallbackInfo ci, @Local DataTracker.Entry entry, @Local DataTracker.SerializedEntry serializedEntry) { - if (Utils.isInTheEnd() && SkyblockerConfigManager.get().slayer.endermanSlayer.enableYangGlyphsNotification && entry.getData() == EndermanEntityAccessor.getCARRIED_BLOCK() && entry.get() instanceof Optional value && value.isPresent() && value.get() instanceof BlockState state && state.isOf(Blocks.BEACON) && ((Optional) serializedEntry.value()).isEmpty()) { - MinecraftClient client = MinecraftClient.getInstance(); - if (trackedEntity instanceof Entity entity && MobGlow.getArmorStands(entity).stream().anyMatch(armorStand -> armorStand.getName().getString().contains(client.getSession().getUsername()))) { - client.inGameHud.setTitleTicks(5, 20, 10); - client.inGameHud.setTitle(Text.literal("Yang Glyph!").formatted(Formatting.RED)); - client.player.playSound(SoundEvents.BLOCK_NOTE_BLOCK_PLING.value(), 100f, 0.1f); - } - } - } - - @SuppressWarnings({"MixinAnnotationTarget", "UnresolvedMixinReference"}) - @Inject(method = "copyToFrom", at = @At(value = "NEW", target = "Ljava/lang/IllegalStateException;"), cancellable = true) - public void skyblocker$ignoreInvalidDataExceptions(CallbackInfo ci) { - //These exceptions cause annoying small lag spikes for some reason - if (Utils.isOnHypixel()) ci.cancel(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java deleted file mode 100644 index 6654bae6..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.sugar.Local; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.AttributeShards; -import de.hysky.skyblocker.skyblock.item.ItemCooldowns; -import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.Formatting; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(DrawContext.class) -public abstract class DrawContextMixin { - @Shadow - @Final - private MatrixStack matrices; - - @Shadow - public abstract int drawText(TextRenderer textRenderer, @Nullable String text, int x, int y, int color, boolean shadow); - - @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) - private void skyblocker$renderAttributeShardDisplay(CallbackInfo ci, @Local(argsOnly = true) TextRenderer textRenderer, @Local(argsOnly = true) ItemStack stack, @Local(argsOnly = true, ordinal = 0) int x, @Local(argsOnly = true, ordinal = 1) int y, @Local(argsOnly = true) LocalRef countOverride) { - if (!SkyblockerConfigManager.get().general.itemInfoDisplay.attributeShardInfo) return; - - if (Utils.isOnSkyblock()) { - NbtCompound customData = ItemUtils.getCustomData(stack); - - if (ItemUtils.getItemId(stack).equals("ATTRIBUTE_SHARD")) { - NbtCompound attributesTag = customData.getCompound("attributes"); - String[] attributes = attributesTag.getKeys().toArray(String[]::new); - - if (attributes.length != 0) { - String attributeId = attributes[0]; - int attributeLevel = attributesTag.getInt(attributeId); - - //Set item count - countOverride.set(Integer.toString(attributeLevel)); - - //Draw the attribute name - this.matrices.push(); - this.matrices.translate(0f, 0f, 200f); - - String attributeInitials = AttributeShards.getShortName(attributeId); - - this.drawText(textRenderer, attributeInitials, x, y, Formatting.AQUA.getColorValue(), true); - - this.matrices.pop(); - } - } - } - } - - @ModifyExpressionValue(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/ItemCooldownManager;getCooldownProgress(Lnet/minecraft/item/Item;F)F")) - private float skyblocker$modifyItemCooldown(float cooldownProgress, @Local(argsOnly = true) ItemStack stack) { - return Utils.isOnSkyblock() && ItemCooldowns.isOnCooldown(stack) ? ItemCooldowns.getItemCooldownEntry(stack).getRemainingCooldownPercent() : cooldownProgress; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java deleted file mode 100644 index 2682fc6d..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import com.llamalad7.mixinextras.sugar.Local; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.CustomArmorAnimatedDyes; -import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.component.type.DyedColorComponent; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.ColorHelper; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(DyedColorComponent.class) -public record DyedColorComponentMixin() { - - @ModifyReturnValue(method = "getColor", at = @At("RETURN")) - private static int skyblocker$customDyeColor(int originalColor, @Local(argsOnly = true) ItemStack stack) { - if (Utils.isOnSkyblock()) { - String itemUuid = ItemUtils.getItemUuid(stack); - - if (SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(itemUuid)) { - return ColorHelper.Argb.fullAlpha(CustomArmorAnimatedDyes.animateColorTransition(SkyblockerConfigManager.get().general.customAnimatedDyes.get(itemUuid))); - } - - return ColorHelper.Argb.fullAlpha(SkyblockerConfigManager.get().general.customDyeColors.getOrDefault(itemUuid, originalColor)); - } - - return originalColor; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java b/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java deleted file mode 100644 index 5cf88588..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import de.hysky.skyblocker.debug.Debug; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.entity.Entity; -import net.minecraft.entity.decoration.ArmorStandEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(EntityRenderDispatcher.class) -public class EntityRenderDispatcherMixin { - @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isInvisible()Z", ordinal = 1)) - private boolean skyblocker$armorStandHitboxVisible(boolean invisible, E entity) { - return (!(entity instanceof ArmorStandEntity) || !Utils.isOnHypixel() || !Debug.debugEnabled()) && invisible; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java deleted file mode 100644 index 84467c9b..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FarmlandBlock; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(FarmlandBlock.class) -public abstract class FarmlandBlockMixin extends Block { - @Shadow - @Final - protected static VoxelShape SHAPE; - - protected FarmlandBlockMixin(Settings settings) { - super(settings); - } - - @ModifyReturnValue(method = "getOutlineShape", at = @At("RETURN")) - private VoxelShape skyblocker$replaceOutlineShape(VoxelShape original) { - return Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hitbox.oldFarmlandHitbox ? VoxelShapes.fullCube() : original; - } - - @Override - public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) { - return SHAPE; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java deleted file mode 100644 index a7843ba2..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import de.hysky.skyblocker.SkyblockerMod; -import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; -import net.minecraft.client.MinecraftClient; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.GenericContainerScreenHandler; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerType; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; - -import java.util.List; - -@Mixin(GenericContainerScreenHandler.class) -public abstract class GenericContainerScreenHandlerMixin extends ScreenHandler { - protected GenericContainerScreenHandlerMixin(@Nullable ScreenHandlerType type, int syncId) { - super(type, syncId); - } - - @Override - public void setStackInSlot(int slot, int revision, ItemStack stack) { - super.setStackInSlot(slot, revision, stack); - SkyblockerMod.getInstance().containerSolverManager.markDirty(); - if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) { - screen.markDirty(); - } - } - - @Override - public void updateSlotStacks(int revision, List stacks, ItemStack cursorStack) { - super.updateSlotStacks(revision, stacks, cursorStack); - SkyblockerMod.getInstance().containerSolverManager.markDirty(); - if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) { - screen.markDirty(); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java deleted file mode 100644 index 4d4dae83..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java +++ /dev/null @@ -1,258 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.systems.RenderSystem; -import de.hysky.skyblocker.SkyblockerMod; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver; -import de.hysky.skyblocker.skyblock.experiment.ExperimentSolver; -import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver; -import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver; -import de.hysky.skyblocker.skyblock.garden.VisitorHelper; -import de.hysky.skyblocker.skyblock.item.ItemProtection; -import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds; -import de.hysky.skyblocker.skyblock.item.WikiLookup; -import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview; -import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview; -import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.Utils; -import de.hysky.skyblocker.utils.render.gui.ContainerSolver; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.inventory.SimpleInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.GenericContainerScreenHandler; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.slot.Slot; -import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; - -@Mixin(HandledScreen.class) -public abstract class HandledScreenMixin extends Screen { - /** - * This is the slot id returned for when a click is outside the screen's bounds - */ - @Unique - private static final int OUT_OF_BOUNDS_SLOT = -999; - - @Unique - private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png"); - - @Unique - private static final Set FILLER_ITEMS = Set.of( - " ", // Empty menu item - "Locked Page", - "Quick Crafting Slot", - "Locked Backpack Slot 2", //Regular expressions won't be utilized here since the search by contains is based on plain text rather than regex syntax - "Locked Backpack Slot 3", - "Locked Backpack Slot 4", - "Locked Backpack Slot 5", - "Locked Backpack Slot 6", - "Locked Backpack Slot 7", - "Locked Backpack Slot 8", - "Locked Backpack Slot 9", - "Locked Backpack Slot 10", - "Locked Backpack Slot 11", - "Locked Backpack Slot 12", - "Locked Backpack Slot 13", - "Locked Backpack Slot 14", - "Locked Backpack Slot 15", - "Locked Backpack Slot 16", - "Locked Backpack Slot 17", - "Locked Backpack Slot 18", - "Preparing" - ); - - @Shadow - @Nullable - protected Slot focusedSlot; - - @Shadow - @Final - protected T handler; - - protected HandledScreenMixin(Text title) { - super(title); - } - - @Inject(at = @At("HEAD"), method = "keyPressed") - public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { - if (this.client != null && this.focusedSlot != null && keyCode != 256) { - //wiki lookup - if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) { - WikiLookup.openWiki(this.focusedSlot, client.player); - } - //item protection - if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && ItemProtection.itemProtection.matchesKey(keyCode, scanCode)) { - ItemProtection.handleKeyPressed(this.focusedSlot.getStack()); - } - } - } - - @Inject(at = @At("HEAD"), method = "mouseClicked") - public void skyblocker$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { - if (SkyblockerConfigManager.get().locations.garden.visitorHelper && (Utils.getLocationRaw().equals("garden") && !getTitle().getString().contains("Logbook") || getTitle().getString().startsWith("Bazaar"))) - VisitorHelper.onMouseClicked(mouseX, mouseY, button, this.textRenderer); - } - - @SuppressWarnings("DataFlowIssue") - // makes intellij be quiet about this.focusedSlot maybe being null. It's already null checked in mixined method. - @Inject(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V"), cancellable = true) - public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci, @Local(ordinal = 0) ItemStack stack) { - if (!Utils.isOnSkyblock()) return; - - // Hide Empty Tooltips - if (SkyblockerConfigManager.get().general.hideEmptyTooltips && stack.getName().getString().equals(" ")) { - ci.cancel(); - } - - // Backpack Preview - boolean shiftDown = SkyblockerConfigManager.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); - if (shiftDown && getTitle().getString().equals("Storage") && focusedSlot.inventory != client.player.getInventory() && BackpackPreview.renderPreview(context, this, focusedSlot.getIndex(), x, y)) { - ci.cancel(); - } - - // Compactor Preview - if (SkyblockerConfigManager.get().general.compactorDeletorPreview) { - Matcher matcher = CompactorDeletorPreview.NAME.matcher(ItemUtils.getItemId(stack)); - if (matcher.matches() && CompactorDeletorPreview.drawPreview(context, stack, matcher.group("type"), matcher.group("size"), x, y)) { - ci.cancel(); - } - } - } - - @ModifyVariable(method = "drawMouseoverTooltip", at = @At(value = "LOAD", ordinal = 0)) - private ItemStack skyblocker$experimentSolvers$replaceTooltipDisplayStack(ItemStack stack) { - return skyblocker$experimentSolvers$getStack(focusedSlot, stack); - } - - @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 3), ordinal = 0) - private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, DrawContext context, Slot slot) { - return skyblocker$experimentSolvers$getStack(slot, stack); - } - - /** - * Redirects getStack calls to account for different stacks in experiment solvers. - */ - @Unique - private ItemStack skyblocker$experimentSolvers$getStack(Slot slot, @NotNull ItemStack stack) { - ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); - if ((currentSolver instanceof SuperpairsSolver || currentSolver instanceof UltrasequencerSolver) && ((ExperimentSolver) currentSolver).getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { - ItemStack itemStack = ((ExperimentSolver) currentSolver).getSlots().get(slot.getIndex()); - return itemStack == null ? stack : itemStack; - } - return stack; - } - - /** - * The naming of this method in yarn is half true, its mostly to handle slot/item interactions (which are mouse or keyboard clicks) - * For example, using the drop key bind while hovering over an item will invoke this method to drop the players item - * - * @implNote This runs before {@link ScreenHandler#onSlotClick(int, int, SlotActionType, net.minecraft.entity.player.PlayerEntity)} - */ - @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V"), cancellable = true) - private void skyblocker$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { - if (!Utils.isOnSkyblock()) return; - - // Item Protection - // When you try and drop the item by picking it up then clicking outside the screen - if (slotId == OUT_OF_BOUNDS_SLOT && ItemProtection.isItemProtected(this.handler.getCursorStack())) { - ci.cancel(); - return; - } - - if (slot == null) return; - String title = getTitle().getString(); - ItemStack stack = skyblocker$experimentSolvers$getStack(slot, slot.getStack()); - ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); - - // Prevent clicks on filler items - if (SkyblockerConfigManager.get().general.hideEmptyTooltips && FILLER_ITEMS.contains(stack.getName().getString()) && - // Allow clicks in Ultrasequencer and Superpairs - (!UltrasequencerSolver.INSTANCE.getName().matcher(title).matches() || SkyblockerConfigManager.get().general.experiments.enableUltrasequencerSolver)) { - ci.cancel(); - return; - } - // Item Protection - // When you click your drop key while hovering over an item - if (actionType == SlotActionType.THROW && ItemProtection.isItemProtected(stack)) { - ci.cancel(); - return; - } - // Prevent salvaging - if (title.equals("Salvage Items") && ItemProtection.isItemProtected(stack)) { - ci.cancel(); - return; - } - if (this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) { - VisitorHelper.onSlotClick(slot, slotId, title); - - // Prevent selling to NPC shops - ItemStack sellStack = this.handler.slots.get(49).getStack(); - if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getLoreLineIf(sellStack, text -> text.contains("buyback")) != null) { - if (slotId != 49 && ItemProtection.isItemProtected(stack)) { - ci.cancel(); - return; - } - } - } - - if (currentSolver != null) { - SkyblockerMod.getInstance().containerSolverManager.onSlotClick(slotId, stack); - } - - // Experiment Solvers - if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { - switch (experimentSolver) { - case ChronomatronSolver chronomatronSolver -> { - Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal()); - if ((stack.isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) && chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) { - chronomatronSolver.setState(ExperimentSolver.State.END); - } - } - - case SuperpairsSolver superpairsSolver -> { - superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex()); - superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY); - } - - case UltrasequencerSolver ultrasequencerSolver when slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot() -> { - int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1; - ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().map(Map.Entry::getKey).ifPresentOrElse(ultrasequencerSolver::setUltrasequencerNextSlot, () -> ultrasequencerSolver.setState(ExperimentSolver.State.END)); - } - - default -> { /*Do Nothing*/ } - } - } - } - - @Inject(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawItem(Lnet/minecraft/item/ItemStack;III)V")) - private void skyblocker$drawItemRarityBackground(DrawContext context, Slot slot, CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) - ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y); - // Item protection - if (ItemProtection.isItemProtected(slot.getStack())) { - RenderSystem.enableBlend(); - context.drawTexture(ITEM_PROTECTION, slot.x, slot.y, 0, 0, 16, 16, 16, 16); - RenderSystem.disableBlend(); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java deleted file mode 100644 index 40534a43..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java +++ /dev/null @@ -1,101 +0,0 @@ -package de.hysky.skyblocker.mixin; - - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.auction.AuctionBrowserScreen; -import de.hysky.skyblocker.skyblock.auction.AuctionHouseScreenHandler; -import de.hysky.skyblocker.skyblock.auction.AuctionViewScreen; -import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; -import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreenHandler; -import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreen; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.HandledScreens; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.screen.GenericContainerScreenHandler; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(HandledScreens.Provider.class) -public interface HandledScreenProviderMixin { - - @Inject(method = "open", at = @At("HEAD"), cancellable = true) - default void skyblocker$open(Text name, ScreenHandlerType type, MinecraftClient client, int id, CallbackInfo ci) { - ClientPlayerEntity player = client.player; - if (player == null) return; - if (!Utils.isOnSkyblock()) return; - T screenHandler = type.create(id, player.getInventory()); - String nameLowercase = name.getString().toLowerCase(); - - switch (screenHandler) { - // Better party finder - case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.betterPartyFinder && PartyFinderScreen.possibleInventoryNames.contains(nameLowercase) -> { - if (client.currentScreen != null) { - String lowerCase = client.currentScreen.getTitle().getString().toLowerCase(); - if (lowerCase.contains("group builder")) return; - if (lowerCase.contains("select tier")) { - PartyFinderScreen.isInKuudraPartyFinder = true; - } else if (lowerCase.contains("catacombs")) { - PartyFinderScreen.isInKuudraPartyFinder = false; - } - } - - if (PartyFinderScreen.isInKuudraPartyFinder) return; - client.player.currentScreenHandler = containerScreenHandler; - - switch (client.currentScreen) { - case PartyFinderScreen screen -> screen.updateHandler(containerScreenHandler, name); - case null, default -> client.setScreen(new PartyFinderScreen(containerScreenHandler, player.getInventory(), name)); - } - - ci.cancel(); - } - - // Fancy AH - case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && (nameLowercase.contains("auctions browser") || nameLowercase.contains("auctions: ")) -> { - AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, false); - client.player.currentScreenHandler = auctionHouseScreenHandler; - - switch (client.currentScreen) { - case AuctionBrowserScreen auctionBrowserScreen -> auctionBrowserScreen.changeHandler(auctionHouseScreenHandler); - case null, default -> client.setScreen(new AuctionBrowserScreen(auctionHouseScreenHandler, client.player.getInventory())); - } - - ci.cancel(); - } - - case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && nameLowercase.contains("auction view") -> { - AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, true); - client.player.currentScreenHandler = auctionHouseScreenHandler; - - switch (client.currentScreen) { - case AuctionViewScreen auctionViewScreen -> auctionViewScreen.changeHandler(auctionHouseScreenHandler); - case null, default -> client.setScreen(new AuctionViewScreen(auctionHouseScreenHandler, client.player.getInventory(), name)); - } - - ci.cancel(); - } - - case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && (nameLowercase.contains("confirm purchase") || nameLowercase.contains("confirm bid")) && client.currentScreen instanceof AuctionViewScreen auctionViewScreen -> { - client.setScreen(auctionViewScreen.getConfirmPurchasePopup(name)); - client.player.currentScreenHandler = containerScreenHandler; - ci.cancel(); - } - - // Fancy crafting table - case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyCraftingTable && name.getString().toLowerCase().contains("craft item") -> { - SkyblockCraftingTableScreenHandler skyblockCraftingTableScreenHandler = new SkyblockCraftingTableScreenHandler(containerScreenHandler, player.getInventory()); - client.player.currentScreenHandler = skyblockCraftingTableScreenHandler; - client.setScreen(new SkyblockCraftingTableScreen(skyblockCraftingTableScreenHandler, player.getInventory(), Text.literal("Craft Item"))); - ci.cancel(); - } - - case null, default -> {} - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java deleted file mode 100644 index 3b419cc5..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java +++ /dev/null @@ -1,144 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.systems.RenderSystem; -import de.hysky.skyblocker.SkyblockerMod; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars; -import de.hysky.skyblocker.events.HudRenderEvents; -import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; -import de.hysky.skyblocker.skyblock.item.ItemCooldowns; -import de.hysky.skyblocker.skyblock.item.ItemProtection; -import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds; -import de.hysky.skyblocker.utils.Utils; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.LayeredDrawer; -import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import java.util.function.Supplier; -import java.util.regex.Pattern; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Environment(EnvType.CLIENT) -@Mixin(InGameHud.class) -public abstract class InGameHudMixin { - @Unique - private static final Supplier SLOT_LOCK_ICON = () -> SkyblockerConfigManager.get().general.itemProtection.slotLockStyle.tex; - - @Unique - private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png"); - @Unique - private static final Pattern DICER_TITLE_BLACKLIST = Pattern.compile(".+? DROP!"); - - @Unique - private final FancyStatusBars statusBars = new FancyStatusBars(); - - @Shadow - @Final - private MinecraftClient client; - - @Shadow - @Final - private LayeredDrawer layeredDrawer; - - @Inject(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IIFLnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V", ordinal = 0)) - public void skyblocker$renderHotbarItemLockOrRarityBg(CallbackInfo ci, @Local(argsOnly = true) DrawContext context, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y, @Local PlayerEntity player) { - if (Utils.isOnSkyblock()) { - // slot lock - if (SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) ItemRarityBackgrounds.tryDraw(player.getInventory().main.get(index), context, x, y); - if (HotbarSlotLock.isLocked(index)) { - RenderSystem.enableBlend(); - context.drawTexture(SLOT_LOCK_ICON.get(), x, y, 0, 0, 16, 16, 16, 16); - RenderSystem.disableBlend(); - } - //item protection - if (ItemProtection.isItemProtected(player.getInventory().main.get(index))) { - RenderSystem.enableBlend(); - context.drawTexture(ITEM_PROTECTION, x, y, 0, 0, 16, 16, 16, 16); - RenderSystem.disableBlend(); - } - } - } - - @Inject(method = { "renderExperienceBar", "renderExperienceLevel" }, at = @At("HEAD"), cancellable = true) - private void skyblocker$renderExperienceBar(CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift()) - ci.cancel(); - } - - @Inject(method = "renderStatusBars", at = @At("HEAD"), cancellable = true) - private void skyblocker$renderStatusBars(DrawContext context, CallbackInfo ci) { - if (!Utils.isOnSkyblock()) - return; - if (statusBars.render(context, context.getScaledWindowWidth(), context.getScaledWindowHeight())) - ci.cancel(); - } - - @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true) - private void skyblocker$renderMountHealth(CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift()) - ci.cancel(); - } - - @Inject(method = "renderStatusEffectOverlay", at = @At("HEAD"), cancellable = true) - private void skyblocker$dontRenderStatusEffects(CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel(); - } - - @ModifyExpressionValue(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getAttackCooldownProgress(F)F")) - private float skyblocker$modifyAttackIndicatorCooldown(float cooldownProgress) { - if (Utils.isOnSkyblock() && client.player != null) { - ItemStack stack = client.player.getMainHandStack(); - if (ItemCooldowns.isOnCooldown(stack)) { - return ItemCooldowns.getItemCooldownEntry(stack).getRemainingCooldownPercent(); - } - } - - return cooldownProgress; - } - - @Inject(method = "setTitle", at = @At("HEAD"), cancellable = true) - private void skyblocker$dicerTitlePrevent(Text title, CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.garden.dicerTitlePrevent && title != null && DICER_TITLE_BLACKLIST.matcher(title.getString()).matches()) { - ci.cancel(); - } - } - - @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 2)) - private LayeredDrawer.Layer skyblocker$afterMainHud(LayeredDrawer.Layer mainHudLayer) { - return (context, tickDelta) -> { - mainHudLayer.render(context, tickDelta); - HudRenderEvents.AFTER_MAIN_HUD.invoker().onRender(context, tickDelta); - }; - } - - @ModifyArg(method = "", slice = @Slice(from = @At(value = "NEW", target = "Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 1)), at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 5)) - private LayeredDrawer.Layer skyblocker$beforeChat(LayeredDrawer.Layer beforeChatLayer) { - return (context, tickDelta) -> { - HudRenderEvents.BEFORE_CHAT.invoker().onRender(context, tickDelta); - beforeChatLayer.render(context, tickDelta); - }; - } - - @Inject(method = "", at = @At("TAIL")) - private void skyblocker$afterDrawersInitialized(CallbackInfo ci) { - this.layeredDrawer.addLayer(HudRenderEvents.LAST.invoker()::onRender); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java deleted file mode 100644 index 4775ce2d..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import net.minecraft.client.gui.hud.InGameOverlayRenderer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - -@Mixin(InGameOverlayRenderer.class) -public class InGameOverlayRendererMixin { - - @ModifyArg(method = "renderFireOverlay", index = 2, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/BufferBuilder;vertex(Lorg/joml/Matrix4f;FFF)Lnet/minecraft/client/render/VertexConsumer;")) - private static float configureFlameHeight(float y) { - return y - (0.5f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameHeight / 200.0f)); - } - - @ModifyArg(method = "renderFireOverlay", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/VertexConsumer;color(FFFF)Lnet/minecraft/client/render/VertexConsumer;")) - private static float configureFlameOpacity(float opacity) { - return opacity - (0.8f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameOpacity / 125.0f)); - } - -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java deleted file mode 100644 index 8e6b9230..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.itemlist.ItemListWidget; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(InventoryScreen.class) -public abstract class InventoryScreenMixin { - @ModifyExpressionValue(method = "", at = @At(value = "NEW", target = "net/minecraft/client/gui/screen/recipebook/RecipeBookWidget")) - private RecipeBookWidget skyblocker$replaceRecipeBook(RecipeBookWidget original) { - return SkyblockerConfigManager.get().general.itemList.enableItemList && Utils.isOnSkyblock() ? new ItemListWidget() : original; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java deleted file mode 100644 index 39184852..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java +++ /dev/null @@ -1,98 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.Utils; -import it.unimi.dsi.fastutil.ints.IntIntPair; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(ItemStack.class) -public abstract class ItemStackMixin { - - @Shadow - public abstract int getDamage(); - - @Shadow - public abstract void setDamage(int damage); - - @Unique - private int maxDamage; - - @ModifyReturnValue(method = "getName", at = @At("RETURN")) - private Text skyblocker$customItemNames(Text original) { - if (Utils.isOnSkyblock()) { - return SkyblockerConfigManager.get().general.customItemNames.getOrDefault(ItemUtils.getItemUuid((ItemStack) (Object) this), original); - } - - return original; - } - - /** - * Updates the durability of this item stack every tick when in the inventory. - */ - @Inject(method = "inventoryTick", at = @At("TAIL")) - private void skyblocker$updateDamage(CallbackInfo ci) { - if (!skyblocker$shouldProcess()) { - return; - } - skyblocker$getAndCacheDurability(); - } - - @ModifyReturnValue(method = "getDamage", at = @At("RETURN")) - private int skyblocker$handleDamage(int original) { - // If the durability is already calculated, the original value should be the damage - if (!skyblocker$shouldProcess() || maxDamage != 0) { - return original; - } - return skyblocker$getAndCacheDurability() ? getDamage() : original; - } - - @ModifyReturnValue(method = "getMaxDamage", at = @At("RETURN")) - private int skyblocker$handleMaxDamage(int original) { - if (!skyblocker$shouldProcess()) { - return original; - } - // If the max damage is already calculated, return it - if (maxDamage != 0) { - return maxDamage; - } - return skyblocker$getAndCacheDurability() ? maxDamage : original; - } - - @ModifyReturnValue(method = "isDamageable", at = @At("RETURN")) - private boolean skyblocker$handleDamageable(boolean original) { - return skyblocker$shouldProcess() || original; - } - - @ModifyReturnValue(method = "isDamaged", at = @At("RETURN")) - private boolean skyblocker$handleDamaged(boolean original) { - return skyblocker$shouldProcess() || original; - } - - @Unique - private boolean skyblocker$shouldProcess() { - return Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.dwarvenMines.enableDrillFuel && ItemUtils.hasCustomDurability((ItemStack) (Object) this); - } - - @Unique - private boolean skyblocker$getAndCacheDurability() { - // Calculate the durability - IntIntPair durability = ItemUtils.getDurability((ItemStack) (Object) this); - // Return if calculating the durability failed - if (durability == null) { - return false; - } - // Saves the calculated durability - maxDamage = durability.rightInt(); - setDamage(durability.rightInt() - durability.leftInt()); - return true; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java deleted file mode 100644 index a1cfe44b..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import de.hysky.skyblocker.skyblock.dungeon.OldLever; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.block.BlockState; -import net.minecraft.block.LeverBlock; -import net.minecraft.block.WallMountedBlock; -import net.minecraft.util.shape.VoxelShape; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import com.llamalad7.mixinextras.sugar.Local; - -@Mixin(LeverBlock.class) -public abstract class LeverBlockMixin extends WallMountedBlock { - protected LeverBlockMixin(Settings settings) { - super(settings); - } - - @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true) - public void skyblocker$onGetOutlineShape(CallbackInfoReturnable cir, @Local(argsOnly = true) BlockState state) { - if (Utils.isOnSkyblock()) { - VoxelShape shape = OldLever.getShape(state.get(FACE), state.get(FACING)); - if (shape != null) cir.setReturnValue(shape); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java deleted file mode 100644 index cf927f0c..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import de.hysky.skyblocker.debug.Debug; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.decoration.ArmorStandEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(LivingEntityRenderer.class) -public class LivingEntityRendererMixin { - @ModifyExpressionValue(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;isVisible(Lnet/minecraft/entity/LivingEntity;)Z")) - private boolean skyblocker$armorStandVisible(boolean visible, T entity) { - return entity instanceof ArmorStandEntity && Utils.isOnHypixel() && Debug.debugEnabled() || visible; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java deleted file mode 100644 index a9f2ae5e..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java +++ /dev/null @@ -1,60 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; -import de.hysky.skyblocker.skyblock.item.ItemProtection; -import de.hysky.skyblocker.utils.JoinWorldPlaceholderScreen; -import de.hysky.skyblocker.utils.ReconfiguringPlaceholderScreen; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.DownloadingTerrainScreen; -import net.minecraft.client.gui.screen.ReconfiguringScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.network.ClientPlayerEntity; -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 org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(MinecraftClient.class) -public abstract class MinecraftClientMixin { - - @Shadow - @Nullable - public abstract ClientPlayNetworkHandler getNetworkHandler(); - - @Shadow - @Nullable - public ClientPlayerEntity player; - - @Inject(method = "handleInputEvents", at = @At("HEAD")) - public void skyblocker$handleInputEvents(CallbackInfo ci) { - if (Utils.isOnSkyblock()) { - HotbarSlotLock.handleInputEvents(player); - ItemProtection.handleHotbarKeyPressed(player); - } - } - - //Remove Downloading Terrain Screen and Reconfiguring Screen - @ModifyVariable(at = @At("HEAD"), method = "setScreen", ordinal = 0, argsOnly = true) - public Screen modifySetScreen(Screen screen) { - if (Utils.isOnHypixel()) { - return switch (screen) { - case DownloadingTerrainScreen _s -> null; - case ReconfiguringScreen _s when this.getNetworkHandler() != null -> new ReconfiguringPlaceholderScreen(this.getNetworkHandler().getConnection()); - - case null, default -> screen; - }; - } - return screen; - } - - @ModifyArg(method = "joinWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;reset(Lnet/minecraft/client/gui/screen/Screen;)V"), index = 0) - private Screen modifyJoinWorld(Screen screen) { - return Utils.isOnSkyblock() ? new JoinWorldPlaceholderScreen() : screen; - } -} \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java b/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java deleted file mode 100644 index 33c3f487..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import de.hysky.skyblocker.skyblock.garden.LowerSensitivity; -import net.minecraft.client.Mouse; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(Mouse.class) -public class MouseMixin { - - @ModifyExpressionValue(method = "updateMouse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/SimpleOption;getValue()Ljava/lang/Object;", ordinal = 0)) - public Object skyblocker$gardenMouseLock(Object original) { - if (LowerSensitivity.isSensitivityLowered()) - return -1 / 3d; - else return original; - - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java deleted file mode 100644 index 4795a28b..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import de.hysky.skyblocker.skyblock.crimson.kuudra.ArrowPoisonWarning; -import net.minecraft.entity.player.PlayerInventory; - -@Mixin(PlayerInventory.class) -public class PlayerInventoryMixin { - @Shadow - public int selectedSlot; - - @Inject(method = "scrollInHotbar", at = @At("TAIL")) - private void skyblocker$onHotbarScroll(CallbackInfo ci) { - ArrowPoisonWarning.tryWarn(selectedSlot); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java deleted file mode 100644 index 88ca7c67..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java +++ /dev/null @@ -1,57 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.tabhud.TabHud; -import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; -import de.hysky.skyblocker.utils.Utils; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.hud.PlayerListHud; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.llamalad7.mixinextras.sugar.Local; - -@Environment(EnvType.CLIENT) -@Mixin(PlayerListHud.class) -public class PlayerListHudMixin { - @Shadow - private Text footer; - - @Inject(at = @At("HEAD"), method = "render", cancellable = true) - public void skyblocker$renderTabHud(CallbackInfo info, @Local(argsOnly = true) DrawContext context, @Local(argsOnly = true) int w) { - if (!Utils.isInDungeons() || !SkyblockerConfigManager.get().general.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) { - return; - } - - ClientPlayNetworkHandler nwH = MinecraftClient.getInstance().getNetworkHandler(); - if (nwH == null) { - return; - } - - int h = MinecraftClient.getInstance().getWindow().getScaledHeight(); - float scale = SkyblockerConfigManager.get().general.tabHud.tabHudScale / 100f; - w = (int) (w / scale); - h = (int) (h / scale); - - PlayerListMgr.updateFooter(footer); - - try { - ScreenMaster.render(context, w,h); - // Screen screen = Screen.getCorrect(w, h, footer); - // screen.render(context); - info.cancel(); - } catch (Exception e) { - TabHud.LOGGER.error("[Skyblocker] Encountered unknown exception while drawing default hud", e); - } - } - -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java deleted file mode 100644 index b6c44072..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import org.slf4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; - -import de.hysky.skyblocker.utils.Utils; - -@Mixin(targets = "net.minecraft.client.texture.PlayerSkinProvider$1") -public class PlayerSkinProviderMixin { - - @WrapWithCondition(method = "method_54647", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false)) - private static boolean skyblocker$dontLogInvalidSignatureWarnings(Logger logger, String message, Object profileId) { - return !Utils.isOnHypixel(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java deleted file mode 100644 index 44f39d21..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.PlayerHeadHashCache; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.texture.PlayerSkinTexture; - -@Mixin(PlayerSkinTexture.class) -public class PlayerSkinTextureMixin { - @Shadow - @Final - private String url; - - @Unique - private boolean isSkyblockSkinTexture; - - @Inject(method = "remapTexture", at = @At("HEAD")) - private void skyblocker$determineSkinSource(CallbackInfoReturnable cir) { - if (Utils.isOnSkyblock()) { - int skinHash = PlayerHeadHashCache.getSkinHash(this.url).hashCode(); - this.isSkyblockSkinTexture = PlayerHeadHashCache.contains(skinHash); - } - } - - @WrapWithCondition(method = "remapTexture", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/PlayerSkinTexture;stripAlpha(Lnet/minecraft/client/texture/NativeImage;IIII)V")) - private boolean skyblocker$dontStripAlphaValues(NativeImage image, int x1, int y1, int x2, int y2) { - return !(SkyblockerConfigManager.get().general.dontStripSkinAlphaValues && this.isSkyblockSkinTexture); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java b/src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java deleted file mode 100644 index e74bbaea..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.hysky.skyblocker.mixin; - - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.FishingBobberEntityRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.projectile.FishingBobberEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(FishingBobberEntityRenderer.class) -public abstract class RenderFishMixin { - - @Inject(method = "render", at = @At("HEAD"), cancellable = true) - private void skyblocker$render(FishingBobberEntity fishingBobberEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) { - //if rendered bobber is not the players and option to hide others is enabled do not render the bobber - if (Utils.isOnSkyblock() && fishingBobberEntity.getPlayerOwner() != MinecraftClient.getInstance().player && SkyblockerConfigManager.get().general.fishing.hideOtherPlayersRods) { - ci.cancel(); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java deleted file mode 100644 index 40b6995a..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.scoreboard.Scoreboard; -import org.slf4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(Scoreboard.class) -public abstract class ScoreboardMixin { - @WrapWithCondition(method = "addTeam", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false)) - private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object arg) { - return !Utils.isOnHypixel(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java b/src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java deleted file mode 100644 index cad7cf38..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java +++ /dev/null @@ -1,24 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; - -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.gui.screen.multiplayer.SocialInteractionsPlayerListEntry; -import net.minecraft.client.gui.screen.multiplayer.SocialInteractionsPlayerListWidget; - -@Mixin(SocialInteractionsPlayerListWidget.class) -public class SocialInteractionsPlayerListWidgetMixin { - - @WrapOperation(method = "setPlayers", at = @At(value = "INVOKE", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", remap = false)) - private Object skyblocker$hideInvalidPlayers(Map map, Object uuid, Object entry, Operation operation) { - if (Utils.isOnSkyblock() && !((SocialInteractionsPlayerListEntry) entry).getName().matches("[A-Za-z0-9_]+")) return null; - - return operation.call(map, uuid, entry); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/WindowMixin.java b/src/main/java/de/hysky/skyblocker/mixin/WindowMixin.java deleted file mode 100644 index 481a70a6..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/WindowMixin.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars; -import net.minecraft.client.util.Window; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Window.class) -public class WindowMixin { - @Inject(method = "setScaleFactor", at = @At("TAIL")) - public void skyblocker$onScaleFactorChange(double scaleFactor, CallbackInfo ci) { - FancyStatusBars.updatePositions(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java deleted file mode 100644 index a24daa80..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import de.hysky.skyblocker.skyblock.dungeon.LividColor; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.sugar.Local; -import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; - -import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes; -import de.hysky.skyblocker.skyblock.entity.MobGlow; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.entity.Entity; -import org.spongepowered.asm.mixin.injection.Slice; - -@Mixin(WorldRenderer.class) -public class WorldRendererMixin { - - @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z")) - private boolean skyblocker$shouldMobGlow(boolean original, @Local Entity entity, @Share("hasCustomGlow") LocalBooleanRef hasCustomGlow) { - boolean allowGlow = LividColor.allowGlow(); - boolean shouldGlow = MobGlow.shouldMobGlow(entity); - hasCustomGlow.set(shouldGlow); - return allowGlow && original || shouldGlow; - } - - @ModifyVariable(method = "render", - slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z"), to = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/OutlineVertexConsumerProvider;setColor(IIII)V")), - at = @At("STORE"), ordinal = 0 - ) - private int skyblocker$modifyGlowColor(int color, @Local Entity entity, @Share("hasCustomGlow") LocalBooleanRef hasCustomGlow) { - return hasCustomGlow.get() ? MobGlow.getGlowColor(entity) : color; - } - - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderEntity(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;)V")) - private void skyblocker$beforeEntityIsRendered(CallbackInfo ci, @Local Entity entity) { - boolean shouldShowBoundingBox = MobBoundingBoxes.shouldDrawMobBoundingBox(entity); - - if (shouldShowBoundingBox) { - MobBoundingBoxes.submitBox2BeRendered(entity.getBoundingBox(), MobBoundingBoxes.getBoxColor(entity)); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java deleted file mode 100644 index d6863b18..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import org.slf4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; -import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; - -import de.hysky.skyblocker.utils.Utils; - -@Mixin(value = YggdrasilMinecraftSessionService.class, remap = false) -public class YggdrasilMinecraftSessionServiceMixin { - - //TODO perhaps investigate if we could fix this - @WrapWithCondition(method = "unpackTextures", remap = false, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Throwable;)V", ordinal = 0, remap = false)) - private boolean skyblocker$dontLogIncorrectEndingByteExceptions(Logger logger, String message, Throwable throwable) { - return !Utils.isOnHypixel() && throwable instanceof IllegalArgumentException; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java deleted file mode 100644 index 5df018e4..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java +++ /dev/null @@ -1,60 +0,0 @@ -package de.hysky.skyblocker.mixin; - -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo; - -import it.unimi.dsi.fastutil.ints.IntArrayList; -import it.unimi.dsi.fastutil.ints.IntList; -import de.hysky.skyblocker.utils.Utils; -import org.slf4j.Logger; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; - -import java.util.Base64; -import java.util.Map; - -@Mixin(value = YggdrasilServicesKeyInfo.class, remap = false) -public class YggdrasilServicesKeyInfoMixin { - @Shadow - @Final - private static Logger LOGGER; - @Unique - private static final Map REPLACEMENT_MAP = Map.of(); - @Unique - private static final IntList ERRONEUS_SIGNATURE_HASHES = new IntArrayList(); - - @WrapOperation(method = "validateProperty", at = @At(value = "INVOKE", target = "Ljava/util/Base64$Decoder;decode(Ljava/lang/String;)[B", remap = false), remap = false) - private byte[] skyblocker$replaceKnownWrongBase64(Base64.Decoder decoder, String signature, Operation decode) { - try { - return decode.call(decoder, signature); - } catch (IllegalArgumentException e) { - try { - return decode.call(decoder, signature.replaceAll("[^A-Za-z0-9+/=]", "")); - } catch (IllegalArgumentException e2) { - if (Utils.isOnSkyblock()) { - if (REPLACEMENT_MAP.containsKey(signature)) { - return decode.call(decoder, REPLACEMENT_MAP.get(signature)); - } - int signatureHashCode = signature.hashCode(); - if (!ERRONEUS_SIGNATURE_HASHES.contains(signatureHashCode)) { - ERRONEUS_SIGNATURE_HASHES.add(signatureHashCode); - LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode base64 string No.{}: {}", ERRONEUS_SIGNATURE_HASHES.size() - 1, signature); - } else { - LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode the base64 string No.{} again", ERRONEUS_SIGNATURE_HASHES.indexOf(signatureHashCode)); - } - } - } - throw e; - } - } - - @WrapWithCondition(method = "validateProperty", remap = false, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false)) - private boolean skyblocker$dontLogFailedSignatureValidations(Logger logger, String message, Object property, Object exception) { - return !Utils.isOnHypixel(); - } -} \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java deleted file mode 100644 index e470cdae..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; -import net.minecraft.client.util.math.MatrixStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(BeaconBlockEntityRenderer.class) -public interface BeaconBlockEntityRendererInvoker { - @SuppressWarnings("unused") - @Invoker("renderBeam") - static void renderBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, float tickDelta, long worldTime, int yOffset, int maxY, float[] color) { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java deleted file mode 100644 index 9c14fdc6..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.client.gui.tooltip.TooltipPositioner; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.List; - -@Mixin(DrawContext.class) -public interface DrawContextInvoker { - - @Invoker - void invokeDrawTooltip(TextRenderer textRenderer, List components, int x, int y, TooltipPositioner positioner); - - @Invoker - void invokeDrawTexturedQuad(Identifier texture, int x1, int x2, int y1, int y2, int z, float u1, float u2, float v1, float v2, float red, float green, float blue, float alpha); -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/EndermanEntityAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/EndermanEntityAccessor.java deleted file mode 100644 index b7bcd95c..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/EndermanEntityAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.mob.EndermanEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.Optional; - -@Mixin(EndermanEntity.class) -public interface EndermanEntityAccessor { - @Accessor - static TrackedData> getCARRIED_BLOCK() { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/FrustumInvoker.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/FrustumInvoker.java deleted file mode 100644 index dd4f5ef1..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/FrustumInvoker.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.client.render.Frustum; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -/** - * Use {@link de.hysky.skyblocker.utils.render.FrustumUtils#isVisible(double, double, double, double, double, double) FrustumUtils#isVisible} which is shorter. For the purpose of avoiding object allocations! - */ -@Mixin(Frustum.class) -public interface FrustumInvoker { - @Invoker - boolean invokeIsVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ); -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/HandledScreenAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/HandledScreenAccessor.java deleted file mode 100644 index 5b84072d..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/HandledScreenAccessor.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.screen.ScreenHandler; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(HandledScreen.class) -public interface HandledScreenAccessor { - @Accessor("x") - int getX(); - - @Accessor("y") - int getY(); - - @Accessor - int getBackgroundWidth(); - - @Accessor - int getBackgroundHeight(); - - @Mutable - @Accessor("handler") - void setHandler(ScreenHandler handler); -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java deleted file mode 100644 index 6e5793e3..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.client.network.message.MessageHandler; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.time.Instant; - -@Mixin(MessageHandler.class) -public interface MessageHandlerAccessor { - @Invoker - void invokeAddToChatLog(Text message, Instant timestamp); -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java deleted file mode 100644 index c982249a..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.client.gui.hud.PlayerListHud; -import net.minecraft.client.network.PlayerListEntry; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.Comparator; - -@Mixin(PlayerListHud.class) -public interface PlayerListHudAccessor { - @Accessor("ENTRY_ORDERING") - static Comparator getOrdering() { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java deleted file mode 100644 index 30aad00c..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; -import net.minecraft.client.gui.widget.TextFieldWidget; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(RecipeBookWidget.class) -public interface RecipeBookWidgetAccessor { - @Accessor - String getSearchText(); - - @Accessor - TextFieldWidget getSearchField(); -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/ScreenAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/ScreenAccessor.java deleted file mode 100644 index c0196e5f..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/ScreenAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(Screen.class) -public interface ScreenAccessor { - @Accessor - @Mutable - void setTitle(Text title); -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java deleted file mode 100644 index c445104e..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import com.mojang.authlib.GameProfile; -import net.minecraft.block.entity.SkullBlockEntity; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -@Mixin(SkullBlockEntity.class) -public interface SkullBlockEntityAccessor { - @Invoker - static CompletableFuture> invokeFetchProfileByName(String name) { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java deleted file mode 100644 index ef11006c..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import net.minecraft.screen.slot.Slot; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(Slot.class) -public interface SlotAccessor { - @Mutable - @Accessor("x") - void setX(int x); - - @Mutable - @Accessor("y") - void setY(int y); -} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/WorldRendererAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/WorldRendererAccessor.java deleted file mode 100644 index f1b3158d..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/WorldRendererAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.hysky.skyblocker.mixin.accessor; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.client.render.Frustum; -import net.minecraft.client.render.WorldRenderer; - -@Mixin(WorldRenderer.class) -public interface WorldRendererAccessor { - @Accessor - Frustum getFrustum(); -} \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/mixin/discordipc/ConnectionMixin.java b/src/main/java/de/hysky/skyblocker/mixin/discordipc/ConnectionMixin.java deleted file mode 100644 index 47f1cadc..00000000 --- a/src/main/java/de/hysky/skyblocker/mixin/discordipc/ConnectionMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.hysky.skyblocker.mixin.discordipc; - -import de.hysky.skyblocker.utils.discord.DiscordRPCManager; -import meteordevelopment.discordipc.DiscordIPC; -import meteordevelopment.discordipc.connection.UnixConnection; -import meteordevelopment.discordipc.connection.WinConnection; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.io.IOException; - -@Mixin(value = {UnixConnection.class, WinConnection.class}, remap = false) -public class ConnectionMixin { - @Redirect(method = "write", at = @At(value = "INVOKE", target = "Ljava/io/IOException;printStackTrace()V")) - private void write(IOException e) { - DiscordIPC.stop(); - DiscordRPCManager.LOGGER.warn("[Skyblocker] Discord RPC failed to update activity, connection lost", e); - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixins/AbstractInventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/AbstractInventoryScreenMixin.java new file mode 100644 index 00000000..53151826 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/AbstractInventoryScreenMixin.java @@ -0,0 +1,19 @@ +package de.hysky.skyblocker.mixins; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen; + +@Mixin(AbstractInventoryScreen.class) +public class AbstractInventoryScreenMixin { + + @Inject(method = "drawStatusEffects", at = @At("HEAD"), cancellable = true) + private void skyblocker$dontDrawStatusEffects(CallbackInfo ci) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java new file mode 100644 index 00000000..7ee59be1 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java @@ -0,0 +1,21 @@ +package de.hysky.skyblocker.mixins; + +import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.mob.AmbientEntity; +import net.minecraft.entity.passive.BatEntity; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(BatEntity.class) +public abstract class BatEntityMixin extends AmbientEntity { + protected BatEntityMixin(EntityType entityType, World world) { + super(entityType, world); + } + + @Override + public void onRemoved() { + super.onRemoved(); + DungeonManager.onBatRemoved(this); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java new file mode 100644 index 00000000..0a5ebc64 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java @@ -0,0 +1,106 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.sugar.Local; +import de.hysky.skyblocker.skyblock.FishingHelper; +import de.hysky.skyblocker.skyblock.dungeon.DungeonScore; +import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager; +import de.hysky.skyblocker.skyblock.end.BeaconHighlighter; +import de.hysky.skyblocker.skyblock.end.EnderNodes; +import de.hysky.skyblocker.skyblock.end.TheEnd; +import de.hysky.skyblocker.skyblock.waypoint.MythologicalRitual; +import de.hysky.skyblocker.utils.SlayerUtils; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.block.Blocks; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityStatuses; +import net.minecraft.entity.ItemEntity; +import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; +import net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket; +import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; +import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; +import net.minecraft.util.Identifier; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientPlayNetworkHandler.class) +public abstract class ClientPlayNetworkHandlerMixin { + @Shadow + private ClientWorld world; + + @Inject(method = "onBlockUpdate", at = @At("RETURN")) + private void skyblocker$onBlockUpdate(BlockUpdateS2CPacket packet, CallbackInfo ci) { + if (Utils.isInTheEnd() && SlayerUtils.isInSlayer()) { + BeaconHighlighter.beaconPositions.remove(packet.getPos()); + if (packet.getState().isOf(Blocks.BEACON)) { + BeaconHighlighter.beaconPositions.add(packet.getPos()); + } + } + } + + @Inject(method = "method_37472", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;removeEntity(ILnet/minecraft/entity/Entity$RemovalReason;)V")) + private void skyblocker$onItemDestroy(int entityId, CallbackInfo ci) { + if (world.getEntityById(entityId) instanceof ItemEntity itemEntity) { + DungeonManager.onItemPickup(itemEntity); + } + } + + @ModifyVariable(method = "onItemPickupAnimation", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;removeEntity(ILnet/minecraft/entity/Entity$RemovalReason;)V", ordinal = 0)) + private ItemEntity skyblocker$onItemPickup(ItemEntity itemEntity) { + DungeonManager.onItemPickup(itemEntity); + return itemEntity; + } + + @WrapWithCondition(method = "onEntityPassengersSet", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;)V", remap = false)) + private boolean skyblocker$cancelEntityPassengersWarning(Logger instance, String msg) { + return !Utils.isOnHypixel(); + } + + @WrapWithCondition(method = "onPlayerList", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false)) + private boolean skyblocker$cancelPlayerListWarning(Logger instance, String format, Object arg1, Object arg2) { + return !Utils.isOnHypixel(); + } + + @Inject(method = "onPlaySound", at = @At("RETURN")) + private void skyblocker$onPlaySound(PlaySoundS2CPacket packet, CallbackInfo ci) { + FishingHelper.onSound(packet); + } + + @WrapWithCondition(method = "warnOnUnknownPayload", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false)) + private boolean skyblocker$dropBadlionPacketWarnings(Logger instance, String message, Object identifier) { + return !(Utils.isOnHypixel() && ((Identifier) identifier).getNamespace().equals("badlion")); + } + + @WrapWithCondition(method = { "onScoreboardScoreUpdate", "onScoreboardScoreReset" }, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false)) + private boolean skyblocker$cancelUnknownScoreboardObjectiveWarnings(Logger instance, String message, Object objectiveName) { + return !Utils.isOnHypixel(); + } + + @WrapWithCondition(method = "onTeam", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;[Ljava/lang/Object;)V", remap = false)) + private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object... arg) { + return !Utils.isOnHypixel(); + } + + @Inject(method = "onParticle", at = @At("RETURN")) + private void skyblocker$onParticle(ParticleS2CPacket packet, CallbackInfo ci) { + MythologicalRitual.onParticle(packet); + EnderNodes.onParticle(packet); + } + + @ModifyExpressionValue(method = "onEntityStatus", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/EntityStatusS2CPacket;getEntity(Lnet/minecraft/world/World;)Lnet/minecraft/entity/Entity;")) + private Entity skyblocker$onEntityDeath(Entity entity, @Local(argsOnly = true) EntityStatusS2CPacket packet) { + if (packet.getStatus() == EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES) { + DungeonScore.handleEntityDeath(entity); + TheEnd.onEntityDeath(entity); + } + return entity; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java new file mode 100644 index 00000000..d4c930d2 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java @@ -0,0 +1,82 @@ +package de.hysky.skyblocker.mixins; + +import com.mojang.authlib.GameProfile; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.auction.AuctionViewScreen; +import de.hysky.skyblocker.skyblock.auction.EditBidPopup; +import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; +import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; +import de.hysky.skyblocker.skyblock.item.ItemProtection; +import de.hysky.skyblocker.skyblock.rift.HealingMelonIndicator; +import de.hysky.skyblocker.skyblock.searchoverlay.OverlayScreen; +import de.hysky.skyblocker.skyblock.searchoverlay.SearchOverManager; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.AbstractClientPlayerEntity; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ClientPlayerEntity.class) +public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { + @Shadow + @Final + protected MinecraftClient client; + + public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { + super(world, profile); + } + + @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) + public void skyblocker$dropSelectedItem(CallbackInfoReturnable cir) { + if (Utils.isOnSkyblock() && (ItemProtection.isItemProtected(this.getInventory().getMainHandStack()) || HotbarSlotLock.isLocked(this.getInventory().selectedSlot)) + && (!SkyblockerConfigManager.get().locations.dungeons.allowDroppingProtectedItems || !Utils.isInDungeons())) { + cir.setReturnValue(false); + } + } + + @Inject(method = "updateHealth", at = @At("RETURN")) + public void skyblocker$updateHealth(CallbackInfo ci) { + HealingMelonIndicator.updateHealth(); + } + + @Inject(method = "openEditSignScreen", at = @At("HEAD"), cancellable = true) + public void skyblocker$redirectEditSignScreen(SignBlockEntity sign, boolean front, CallbackInfo callbackInfo) { + // Fancy Party Finder + if (!PartyFinderScreen.isInKuudraPartyFinder && client.currentScreen instanceof PartyFinderScreen partyFinderScreen && !partyFinderScreen.isAborted() && sign.getText(front).getMessage(3, false).getString().toLowerCase().contains("level")) { + partyFinderScreen.updateSign(sign, front); + callbackInfo.cancel(); + return; + } + + if (client.currentScreen instanceof AuctionViewScreen auctionViewScreen) { + this.client.setScreen(new EditBidPopup(auctionViewScreen, sign, front, auctionViewScreen.minBid)); + callbackInfo.cancel(); + } + + // Search Overlay + if (client.currentScreen != null) { + if (SkyblockerConfigManager.get().general.searchOverlay.enableAuctionHouse && client.currentScreen.getTitle().getString().toLowerCase().contains("auction")) { + if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) { + SearchOverManager.updateSign(sign, front, true); + client.setScreen(new OverlayScreen(Text.of(""))); + callbackInfo.cancel(); + } + } else if (SkyblockerConfigManager.get().general.searchOverlay.enableBazaar && client.currentScreen.getTitle().getString().toLowerCase().contains("bazaar")) { + if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) { + SearchOverManager.updateSign(sign, front, false); + client.setScreen(new OverlayScreen(Text.of(""))); + callbackInfo.cancel(); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java b/src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java new file mode 100644 index 00000000..289923c8 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java @@ -0,0 +1,21 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.mojang.brigadier.tree.CommandNode; +import com.mojang.brigadier.tree.LiteralCommandNode; +import de.hysky.skyblocker.skyblock.WarpAutocomplete; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.command.CommandSource; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(targets = "net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket$CommandTree") +public class CommandTreeS2CPacketMixin { + @ModifyExpressionValue(method = "getNode", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/CommandTreeS2CPacket$CommandTree;getNode(I)Lcom/mojang/brigadier/tree/CommandNode;", ordinal = 1)) + public CommandNode modifyCommandSuggestions(CommandNode original) { + if (Utils.isOnHypixel() && WarpAutocomplete.commandNode != null && original instanceof LiteralCommandNode literalCommandNode && literalCommandNode.getLiteral().equals("warp")) { + return WarpAutocomplete.commandNode; + } + return original; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/ComponentHolderMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ComponentHolderMixin.java new file mode 100644 index 00000000..8fa03cdc --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/ComponentHolderMixin.java @@ -0,0 +1,39 @@ +package de.hysky.skyblocker.mixins; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.CustomArmorTrims; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.Utils; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.component.ComponentHolder; +import net.minecraft.component.DataComponentType; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.item.ItemStack; +import net.minecraft.item.trim.ArmorTrim; + +@Mixin(ComponentHolder.class) +public interface ComponentHolderMixin { + + @SuppressWarnings("unchecked") + @ModifyReturnValue(method = "get", at = @At("RETURN")) + private T skyblocker$customArmorTrims(T original, DataComponentType dataComponentType) { + if (Utils.isOnSkyblock() && ((Object) this) instanceof ItemStack stack) { + if (dataComponentType == DataComponentTypes.TRIM) { + Object2ObjectOpenHashMap customTrims = SkyblockerConfigManager.get().general.customArmorTrims; + String itemUuid = ItemUtils.getItemUuid(stack); + + if (customTrims.containsKey(itemUuid)) { + CustomArmorTrims.ArmorTrimId trimKey = customTrims.get(itemUuid); + return (T) CustomArmorTrims.TRIMS_CACHE.getOrDefault(trimKey, (ArmorTrim) original); + } + } + } + + return original; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/DataTrackerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/DataTrackerMixin.java new file mode 100644 index 00000000..dfe6ac4c --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/DataTrackerMixin.java @@ -0,0 +1,51 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.sugar.Local; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.mixins.accessors.EndermanEntityAccessor; +import de.hysky.skyblocker.skyblock.entity.MobGlow; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.Entity; +import net.minecraft.entity.data.DataTracked; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.sound.SoundEvents; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Optional; + +@Mixin(DataTracker.class) +public abstract class DataTrackerMixin { + @Shadow + @Final + private DataTracked trackedEntity; + + @SuppressWarnings("ConstantValue") + @Inject(method = "writeUpdatedEntries", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/data/DataTracker;copyToFrom(Lnet/minecraft/entity/data/DataTracker$Entry;Lnet/minecraft/entity/data/DataTracker$SerializedEntry;)V")) + private void skyblocker$onWriteUpdatedEntries(CallbackInfo ci, @Local DataTracker.Entry entry, @Local DataTracker.SerializedEntry serializedEntry) { + if (Utils.isInTheEnd() && SkyblockerConfigManager.get().slayer.endermanSlayer.enableYangGlyphsNotification && entry.getData() == EndermanEntityAccessor.getCARRIED_BLOCK() && entry.get() instanceof Optional value && value.isPresent() && value.get() instanceof BlockState state && state.isOf(Blocks.BEACON) && ((Optional) serializedEntry.value()).isEmpty()) { + MinecraftClient client = MinecraftClient.getInstance(); + if (trackedEntity instanceof Entity entity && MobGlow.getArmorStands(entity).stream().anyMatch(armorStand -> armorStand.getName().getString().contains(client.getSession().getUsername()))) { + client.inGameHud.setTitleTicks(5, 20, 10); + client.inGameHud.setTitle(Text.literal("Yang Glyph!").formatted(Formatting.RED)); + client.player.playSound(SoundEvents.BLOCK_NOTE_BLOCK_PLING.value(), 100f, 0.1f); + } + } + } + + @SuppressWarnings({"MixinAnnotationTarget", "UnresolvedMixinReference"}) + @Inject(method = "copyToFrom", at = @At(value = "NEW", target = "Ljava/lang/IllegalStateException;"), cancellable = true) + public void skyblocker$ignoreInvalidDataExceptions(CallbackInfo ci) { + //These exceptions cause annoying small lag spikes for some reason + if (Utils.isOnHypixel()) ci.cancel(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java b/src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java new file mode 100644 index 00000000..7964b114 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java @@ -0,0 +1,71 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.AttributeShards; +import de.hysky.skyblocker.skyblock.item.ItemCooldowns; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.Formatting; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(DrawContext.class) +public abstract class DrawContextMixin { + @Shadow + @Final + private MatrixStack matrices; + + @Shadow + public abstract int drawText(TextRenderer textRenderer, @Nullable String text, int x, int y, int color, boolean shadow); + + @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) + private void skyblocker$renderAttributeShardDisplay(CallbackInfo ci, @Local(argsOnly = true) TextRenderer textRenderer, @Local(argsOnly = true) ItemStack stack, @Local(argsOnly = true, ordinal = 0) int x, @Local(argsOnly = true, ordinal = 1) int y, @Local(argsOnly = true) LocalRef countOverride) { + if (!SkyblockerConfigManager.get().general.itemInfoDisplay.attributeShardInfo) return; + + if (Utils.isOnSkyblock()) { + NbtCompound customData = ItemUtils.getCustomData(stack); + + if (ItemUtils.getItemId(stack).equals("ATTRIBUTE_SHARD")) { + NbtCompound attributesTag = customData.getCompound("attributes"); + String[] attributes = attributesTag.getKeys().toArray(String[]::new); + + if (attributes.length != 0) { + String attributeId = attributes[0]; + int attributeLevel = attributesTag.getInt(attributeId); + + //Set item count + countOverride.set(Integer.toString(attributeLevel)); + + //Draw the attribute name + this.matrices.push(); + this.matrices.translate(0f, 0f, 200f); + + String attributeInitials = AttributeShards.getShortName(attributeId); + + this.drawText(textRenderer, attributeInitials, x, y, Formatting.AQUA.getColorValue(), true); + + this.matrices.pop(); + } + } + } + } + + @ModifyExpressionValue(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/ItemCooldownManager;getCooldownProgress(Lnet/minecraft/item/Item;F)F")) + private float skyblocker$modifyItemCooldown(float cooldownProgress, @Local(argsOnly = true) ItemStack stack) { + return Utils.isOnSkyblock() && ItemCooldowns.isOnCooldown(stack) ? ItemCooldowns.getItemCooldownEntry(stack).getRemainingCooldownPercent() : cooldownProgress; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/DyedColorComponentMixin.java b/src/main/java/de/hysky/skyblocker/mixins/DyedColorComponentMixin.java new file mode 100644 index 00000000..0fd4f8a0 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/DyedColorComponentMixin.java @@ -0,0 +1,34 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.sugar.Local; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.CustomArmorAnimatedDyes; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.component.type.DyedColorComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.ColorHelper; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(DyedColorComponent.class) +public record DyedColorComponentMixin() { + + @ModifyReturnValue(method = "getColor", at = @At("RETURN")) + private static int skyblocker$customDyeColor(int originalColor, @Local(argsOnly = true) ItemStack stack) { + if (Utils.isOnSkyblock()) { + String itemUuid = ItemUtils.getItemUuid(stack); + + if (SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(itemUuid)) { + return ColorHelper.Argb.fullAlpha(CustomArmorAnimatedDyes.animateColorTransition(SkyblockerConfigManager.get().general.customAnimatedDyes.get(itemUuid))); + } + + return ColorHelper.Argb.fullAlpha(SkyblockerConfigManager.get().general.customDyeColors.getOrDefault(itemUuid, originalColor)); + } + + return originalColor; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java b/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java new file mode 100644 index 00000000..05fe9148 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java @@ -0,0 +1,18 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import de.hysky.skyblocker.debug.Debug; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.entity.Entity; +import net.minecraft.entity.decoration.ArmorStandEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(EntityRenderDispatcher.class) +public class EntityRenderDispatcherMixin { + @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isInvisible()Z", ordinal = 1)) + private boolean skyblocker$armorStandHitboxVisible(boolean invisible, E entity) { + return (!(entity instanceof ArmorStandEntity) || !Utils.isOnHypixel() || !Debug.debugEnabled()) && invisible; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/FarmlandBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixins/FarmlandBlockMixin.java new file mode 100644 index 00000000..4c981d9a --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/FarmlandBlockMixin.java @@ -0,0 +1,37 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.FarmlandBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(FarmlandBlock.class) +public abstract class FarmlandBlockMixin extends Block { + @Shadow + @Final + protected static VoxelShape SHAPE; + + protected FarmlandBlockMixin(Settings settings) { + super(settings); + } + + @ModifyReturnValue(method = "getOutlineShape", at = @At("RETURN")) + private VoxelShape skyblocker$replaceOutlineShape(VoxelShape original) { + return Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hitbox.oldFarmlandHitbox ? VoxelShapes.fullCube() : original; + } + + @Override + public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) { + return SHAPE; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java new file mode 100644 index 00000000..f75af09a --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java @@ -0,0 +1,38 @@ +package de.hysky.skyblocker.mixins; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; +import net.minecraft.client.MinecraftClient; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; + +import java.util.List; + +@Mixin(GenericContainerScreenHandler.class) +public abstract class GenericContainerScreenHandlerMixin extends ScreenHandler { + protected GenericContainerScreenHandlerMixin(@Nullable ScreenHandlerType type, int syncId) { + super(type, syncId); + } + + @Override + public void setStackInSlot(int slot, int revision, ItemStack stack) { + super.setStackInSlot(slot, revision, stack); + SkyblockerMod.getInstance().containerSolverManager.markDirty(); + if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) { + screen.markDirty(); + } + } + + @Override + public void updateSlotStacks(int revision, List stacks, ItemStack cursorStack) { + super.updateSlotStacks(revision, stacks, cursorStack); + SkyblockerMod.getInstance().containerSolverManager.markDirty(); + if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) { + screen.markDirty(); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java new file mode 100644 index 00000000..cbc29974 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -0,0 +1,258 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.systems.RenderSystem; +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver; +import de.hysky.skyblocker.skyblock.experiment.ExperimentSolver; +import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver; +import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver; +import de.hysky.skyblocker.skyblock.garden.VisitorHelper; +import de.hysky.skyblocker.skyblock.item.ItemProtection; +import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds; +import de.hysky.skyblocker.skyblock.item.WikiLookup; +import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview; +import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.render.gui.ContainerSolver; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.slot.Slot; +import net.minecraft.screen.slot.SlotActionType; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; + +@Mixin(HandledScreen.class) +public abstract class HandledScreenMixin extends Screen { + /** + * This is the slot id returned for when a click is outside the screen's bounds + */ + @Unique + private static final int OUT_OF_BOUNDS_SLOT = -999; + + @Unique + private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png"); + + @Unique + private static final Set FILLER_ITEMS = Set.of( + " ", // Empty menu item + "Locked Page", + "Quick Crafting Slot", + "Locked Backpack Slot 2", //Regular expressions won't be utilized here since the search by contains is based on plain text rather than regex syntax + "Locked Backpack Slot 3", + "Locked Backpack Slot 4", + "Locked Backpack Slot 5", + "Locked Backpack Slot 6", + "Locked Backpack Slot 7", + "Locked Backpack Slot 8", + "Locked Backpack Slot 9", + "Locked Backpack Slot 10", + "Locked Backpack Slot 11", + "Locked Backpack Slot 12", + "Locked Backpack Slot 13", + "Locked Backpack Slot 14", + "Locked Backpack Slot 15", + "Locked Backpack Slot 16", + "Locked Backpack Slot 17", + "Locked Backpack Slot 18", + "Preparing" + ); + + @Shadow + @Nullable + protected Slot focusedSlot; + + @Shadow + @Final + protected T handler; + + protected HandledScreenMixin(Text title) { + super(title); + } + + @Inject(at = @At("HEAD"), method = "keyPressed") + public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { + if (this.client != null && this.focusedSlot != null && keyCode != 256) { + //wiki lookup + if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) { + WikiLookup.openWiki(this.focusedSlot, client.player); + } + //item protection + if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && ItemProtection.itemProtection.matchesKey(keyCode, scanCode)) { + ItemProtection.handleKeyPressed(this.focusedSlot.getStack()); + } + } + } + + @Inject(at = @At("HEAD"), method = "mouseClicked") + public void skyblocker$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { + if (SkyblockerConfigManager.get().locations.garden.visitorHelper && (Utils.getLocationRaw().equals("garden") && !getTitle().getString().contains("Logbook") || getTitle().getString().startsWith("Bazaar"))) + VisitorHelper.onMouseClicked(mouseX, mouseY, button, this.textRenderer); + } + + @SuppressWarnings("DataFlowIssue") + // makes intellij be quiet about this.focusedSlot maybe being null. It's already null checked in mixined method. + @Inject(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V"), cancellable = true) + public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci, @Local(ordinal = 0) ItemStack stack) { + if (!Utils.isOnSkyblock()) return; + + // Hide Empty Tooltips + if (SkyblockerConfigManager.get().general.hideEmptyTooltips && stack.getName().getString().equals(" ")) { + ci.cancel(); + } + + // Backpack Preview + boolean shiftDown = SkyblockerConfigManager.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); + if (shiftDown && getTitle().getString().equals("Storage") && focusedSlot.inventory != client.player.getInventory() && BackpackPreview.renderPreview(context, this, focusedSlot.getIndex(), x, y)) { + ci.cancel(); + } + + // Compactor Preview + if (SkyblockerConfigManager.get().general.compactorDeletorPreview) { + Matcher matcher = CompactorDeletorPreview.NAME.matcher(ItemUtils.getItemId(stack)); + if (matcher.matches() && CompactorDeletorPreview.drawPreview(context, stack, matcher.group("type"), matcher.group("size"), x, y)) { + ci.cancel(); + } + } + } + + @ModifyVariable(method = "drawMouseoverTooltip", at = @At(value = "LOAD", ordinal = 0)) + private ItemStack skyblocker$experimentSolvers$replaceTooltipDisplayStack(ItemStack stack) { + return skyblocker$experimentSolvers$getStack(focusedSlot, stack); + } + + @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 3), ordinal = 0) + private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, DrawContext context, Slot slot) { + return skyblocker$experimentSolvers$getStack(slot, stack); + } + + /** + * Redirects getStack calls to account for different stacks in experiment solvers. + */ + @Unique + private ItemStack skyblocker$experimentSolvers$getStack(Slot slot, @NotNull ItemStack stack) { + ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); + if ((currentSolver instanceof SuperpairsSolver || currentSolver instanceof UltrasequencerSolver) && ((ExperimentSolver) currentSolver).getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { + ItemStack itemStack = ((ExperimentSolver) currentSolver).getSlots().get(slot.getIndex()); + return itemStack == null ? stack : itemStack; + } + return stack; + } + + /** + * The naming of this method in yarn is half true, its mostly to handle slot/item interactions (which are mouse or keyboard clicks) + * For example, using the drop key bind while hovering over an item will invoke this method to drop the players item + * + * @implNote This runs before {@link ScreenHandler#onSlotClick(int, int, SlotActionType, net.minecraft.entity.player.PlayerEntity)} + */ + @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V"), cancellable = true) + private void skyblocker$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { + if (!Utils.isOnSkyblock()) return; + + // Item Protection + // When you try and drop the item by picking it up then clicking outside the screen + if (slotId == OUT_OF_BOUNDS_SLOT && ItemProtection.isItemProtected(this.handler.getCursorStack())) { + ci.cancel(); + return; + } + + if (slot == null) return; + String title = getTitle().getString(); + ItemStack stack = skyblocker$experimentSolvers$getStack(slot, slot.getStack()); + ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); + + // Prevent clicks on filler items + if (SkyblockerConfigManager.get().general.hideEmptyTooltips && FILLER_ITEMS.contains(stack.getName().getString()) && + // Allow clicks in Ultrasequencer and Superpairs + (!UltrasequencerSolver.INSTANCE.getName().matcher(title).matches() || SkyblockerConfigManager.get().general.experiments.enableUltrasequencerSolver)) { + ci.cancel(); + return; + } + // Item Protection + // When you click your drop key while hovering over an item + if (actionType == SlotActionType.THROW && ItemProtection.isItemProtected(stack)) { + ci.cancel(); + return; + } + // Prevent salvaging + if (title.equals("Salvage Items") && ItemProtection.isItemProtected(stack)) { + ci.cancel(); + return; + } + if (this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) { + VisitorHelper.onSlotClick(slot, slotId, title); + + // Prevent selling to NPC shops + ItemStack sellStack = this.handler.slots.get(49).getStack(); + if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getLoreLineIf(sellStack, text -> text.contains("buyback")) != null) { + if (slotId != 49 && ItemProtection.isItemProtected(stack)) { + ci.cancel(); + return; + } + } + } + + if (currentSolver != null) { + SkyblockerMod.getInstance().containerSolverManager.onSlotClick(slotId, stack); + } + + // Experiment Solvers + if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { + switch (experimentSolver) { + case ChronomatronSolver chronomatronSolver -> { + Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal()); + if ((stack.isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) && chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) { + chronomatronSolver.setState(ExperimentSolver.State.END); + } + } + + case SuperpairsSolver superpairsSolver -> { + superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex()); + superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY); + } + + case UltrasequencerSolver ultrasequencerSolver when slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot() -> { + int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1; + ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().map(Map.Entry::getKey).ifPresentOrElse(ultrasequencerSolver::setUltrasequencerNextSlot, () -> ultrasequencerSolver.setState(ExperimentSolver.State.END)); + } + + default -> { /*Do Nothing*/ } + } + } + } + + @Inject(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawItem(Lnet/minecraft/item/ItemStack;III)V")) + private void skyblocker$drawItemRarityBackground(DrawContext context, Slot slot, CallbackInfo ci) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) + ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y); + // Item protection + if (ItemProtection.isItemProtected(slot.getStack())) { + RenderSystem.enableBlend(); + context.drawTexture(ITEM_PROTECTION, slot.x, slot.y, 0, 0, 16, 16, 16, 16); + RenderSystem.disableBlend(); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java new file mode 100644 index 00000000..be1fdf8d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java @@ -0,0 +1,101 @@ +package de.hysky.skyblocker.mixins; + + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.auction.AuctionBrowserScreen; +import de.hysky.skyblocker.skyblock.auction.AuctionHouseScreenHandler; +import de.hysky.skyblocker.skyblock.auction.AuctionViewScreen; +import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; +import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreenHandler; +import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreen; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.ingame.HandledScreens; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(HandledScreens.Provider.class) +public interface HandledScreenProviderMixin { + + @Inject(method = "open", at = @At("HEAD"), cancellable = true) + default void skyblocker$open(Text name, ScreenHandlerType type, MinecraftClient client, int id, CallbackInfo ci) { + ClientPlayerEntity player = client.player; + if (player == null) return; + if (!Utils.isOnSkyblock()) return; + T screenHandler = type.create(id, player.getInventory()); + String nameLowercase = name.getString().toLowerCase(); + + switch (screenHandler) { + // Better party finder + case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.betterPartyFinder && PartyFinderScreen.possibleInventoryNames.contains(nameLowercase) -> { + if (client.currentScreen != null) { + String lowerCase = client.currentScreen.getTitle().getString().toLowerCase(); + if (lowerCase.contains("group builder")) return; + if (lowerCase.contains("select tier")) { + PartyFinderScreen.isInKuudraPartyFinder = true; + } else if (lowerCase.contains("catacombs")) { + PartyFinderScreen.isInKuudraPartyFinder = false; + } + } + + if (PartyFinderScreen.isInKuudraPartyFinder) return; + client.player.currentScreenHandler = containerScreenHandler; + + switch (client.currentScreen) { + case PartyFinderScreen screen -> screen.updateHandler(containerScreenHandler, name); + case null, default -> client.setScreen(new PartyFinderScreen(containerScreenHandler, player.getInventory(), name)); + } + + ci.cancel(); + } + + // Fancy AH + case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && (nameLowercase.contains("auctions browser") || nameLowercase.contains("auctions: ")) -> { + AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, false); + client.player.currentScreenHandler = auctionHouseScreenHandler; + + switch (client.currentScreen) { + case AuctionBrowserScreen auctionBrowserScreen -> auctionBrowserScreen.changeHandler(auctionHouseScreenHandler); + case null, default -> client.setScreen(new AuctionBrowserScreen(auctionHouseScreenHandler, client.player.getInventory())); + } + + ci.cancel(); + } + + case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && nameLowercase.contains("auction view") -> { + AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, true); + client.player.currentScreenHandler = auctionHouseScreenHandler; + + switch (client.currentScreen) { + case AuctionViewScreen auctionViewScreen -> auctionViewScreen.changeHandler(auctionHouseScreenHandler); + case null, default -> client.setScreen(new AuctionViewScreen(auctionHouseScreenHandler, client.player.getInventory(), name)); + } + + ci.cancel(); + } + + case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && (nameLowercase.contains("confirm purchase") || nameLowercase.contains("confirm bid")) && client.currentScreen instanceof AuctionViewScreen auctionViewScreen -> { + client.setScreen(auctionViewScreen.getConfirmPurchasePopup(name)); + client.player.currentScreenHandler = containerScreenHandler; + ci.cancel(); + } + + // Fancy crafting table + case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyCraftingTable && name.getString().toLowerCase().contains("craft item") -> { + SkyblockCraftingTableScreenHandler skyblockCraftingTableScreenHandler = new SkyblockCraftingTableScreenHandler(containerScreenHandler, player.getInventory()); + client.player.currentScreenHandler = skyblockCraftingTableScreenHandler; + client.setScreen(new SkyblockCraftingTableScreen(skyblockCraftingTableScreenHandler, player.getInventory(), Text.literal("Craft Item"))); + ci.cancel(); + } + + case null, default -> {} + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java new file mode 100644 index 00000000..897b98b3 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java @@ -0,0 +1,144 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.systems.RenderSystem; +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars; +import de.hysky.skyblocker.events.HudRenderEvents; +import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; +import de.hysky.skyblocker.skyblock.item.ItemCooldowns; +import de.hysky.skyblocker.skyblock.item.ItemProtection; +import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds; +import de.hysky.skyblocker.utils.Utils; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.LayeredDrawer; +import net.minecraft.client.gui.hud.InGameHud; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.function.Supplier; +import java.util.regex.Pattern; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Environment(EnvType.CLIENT) +@Mixin(InGameHud.class) +public abstract class InGameHudMixin { + @Unique + private static final Supplier SLOT_LOCK_ICON = () -> SkyblockerConfigManager.get().general.itemProtection.slotLockStyle.tex; + + @Unique + private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png"); + @Unique + private static final Pattern DICER_TITLE_BLACKLIST = Pattern.compile(".+? DROP!"); + + @Unique + private final FancyStatusBars statusBars = new FancyStatusBars(); + + @Shadow + @Final + private MinecraftClient client; + + @Shadow + @Final + private LayeredDrawer layeredDrawer; + + @Inject(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IIFLnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V", ordinal = 0)) + public void skyblocker$renderHotbarItemLockOrRarityBg(CallbackInfo ci, @Local(argsOnly = true) DrawContext context, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y, @Local PlayerEntity player) { + if (Utils.isOnSkyblock()) { + // slot lock + if (SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) ItemRarityBackgrounds.tryDraw(player.getInventory().main.get(index), context, x, y); + if (HotbarSlotLock.isLocked(index)) { + RenderSystem.enableBlend(); + context.drawTexture(SLOT_LOCK_ICON.get(), x, y, 0, 0, 16, 16, 16, 16); + RenderSystem.disableBlend(); + } + //item protection + if (ItemProtection.isItemProtected(player.getInventory().main.get(index))) { + RenderSystem.enableBlend(); + context.drawTexture(ITEM_PROTECTION, x, y, 0, 0, 16, 16, 16, 16); + RenderSystem.disableBlend(); + } + } + } + + @Inject(method = { "renderExperienceBar", "renderExperienceLevel" }, at = @At("HEAD"), cancellable = true) + private void skyblocker$renderExperienceBar(CallbackInfo ci) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift()) + ci.cancel(); + } + + @Inject(method = "renderStatusBars", at = @At("HEAD"), cancellable = true) + private void skyblocker$renderStatusBars(DrawContext context, CallbackInfo ci) { + if (!Utils.isOnSkyblock()) + return; + if (statusBars.render(context, context.getScaledWindowWidth(), context.getScaledWindowHeight())) + ci.cancel(); + } + + @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true) + private void skyblocker$renderMountHealth(CallbackInfo ci) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift()) + ci.cancel(); + } + + @Inject(method = "renderStatusEffectOverlay", at = @At("HEAD"), cancellable = true) + private void skyblocker$dontRenderStatusEffects(CallbackInfo ci) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel(); + } + + @ModifyExpressionValue(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getAttackCooldownProgress(F)F")) + private float skyblocker$modifyAttackIndicatorCooldown(float cooldownProgress) { + if (Utils.isOnSkyblock() && client.player != null) { + ItemStack stack = client.player.getMainHandStack(); + if (ItemCooldowns.isOnCooldown(stack)) { + return ItemCooldowns.getItemCooldownEntry(stack).getRemainingCooldownPercent(); + } + } + + return cooldownProgress; + } + + @Inject(method = "setTitle", at = @At("HEAD"), cancellable = true) + private void skyblocker$dicerTitlePrevent(Text title, CallbackInfo ci) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.garden.dicerTitlePrevent && title != null && DICER_TITLE_BLACKLIST.matcher(title.getString()).matches()) { + ci.cancel(); + } + } + + @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 2)) + private LayeredDrawer.Layer skyblocker$afterMainHud(LayeredDrawer.Layer mainHudLayer) { + return (context, tickDelta) -> { + mainHudLayer.render(context, tickDelta); + HudRenderEvents.AFTER_MAIN_HUD.invoker().onRender(context, tickDelta); + }; + } + + @ModifyArg(method = "", slice = @Slice(from = @At(value = "NEW", target = "Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 1)), at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 5)) + private LayeredDrawer.Layer skyblocker$beforeChat(LayeredDrawer.Layer beforeChatLayer) { + return (context, tickDelta) -> { + HudRenderEvents.BEFORE_CHAT.invoker().onRender(context, tickDelta); + beforeChatLayer.render(context, tickDelta); + }; + } + + @Inject(method = "", at = @At("TAIL")) + private void skyblocker$afterDrawersInitialized(CallbackInfo ci) { + this.layeredDrawer.addLayer(HudRenderEvents.LAST.invoker()::onRender); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/InGameOverlayRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InGameOverlayRendererMixin.java new file mode 100644 index 00000000..c7704558 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/InGameOverlayRendererMixin.java @@ -0,0 +1,22 @@ +package de.hysky.skyblocker.mixins; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import net.minecraft.client.gui.hud.InGameOverlayRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(InGameOverlayRenderer.class) +public class InGameOverlayRendererMixin { + + @ModifyArg(method = "renderFireOverlay", index = 2, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/BufferBuilder;vertex(Lorg/joml/Matrix4f;FFF)Lnet/minecraft/client/render/VertexConsumer;")) + private static float configureFlameHeight(float y) { + return y - (0.5f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameHeight / 200.0f)); + } + + @ModifyArg(method = "renderFireOverlay", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/VertexConsumer;color(FFFF)Lnet/minecraft/client/render/VertexConsumer;")) + private static float configureFlameOpacity(float opacity) { + return opacity - (0.8f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameOpacity / 125.0f)); + } + +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java new file mode 100644 index 00000000..0d833c22 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java @@ -0,0 +1,18 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.itemlist.ItemListWidget; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.gui.screen.ingame.InventoryScreen; +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(InventoryScreen.class) +public abstract class InventoryScreenMixin { + @ModifyExpressionValue(method = "", at = @At(value = "NEW", target = "net/minecraft/client/gui/screen/recipebook/RecipeBookWidget")) + private RecipeBookWidget skyblocker$replaceRecipeBook(RecipeBookWidget original) { + return SkyblockerConfigManager.get().general.itemList.enableItemList && Utils.isOnSkyblock() ? new ItemListWidget() : original; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java new file mode 100644 index 00000000..c56a0268 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -0,0 +1,98 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.Utils; +import it.unimi.dsi.fastutil.ints.IntIntPair; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ItemStack.class) +public abstract class ItemStackMixin { + + @Shadow + public abstract int getDamage(); + + @Shadow + public abstract void setDamage(int damage); + + @Unique + private int maxDamage; + + @ModifyReturnValue(method = "getName", at = @At("RETURN")) + private Text skyblocker$customItemNames(Text original) { + if (Utils.isOnSkyblock()) { + return SkyblockerConfigManager.get().general.customItemNames.getOrDefault(ItemUtils.getItemUuid((ItemStack) (Object) this), original); + } + + return original; + } + + /** + * Updates the durability of this item stack every tick when in the inventory. + */ + @Inject(method = "inventoryTick", at = @At("TAIL")) + private void skyblocker$updateDamage(CallbackInfo ci) { + if (!skyblocker$shouldProcess()) { + return; + } + skyblocker$getAndCacheDurability(); + } + + @ModifyReturnValue(method = "getDamage", at = @At("RETURN")) + private int skyblocker$handleDamage(int original) { + // If the durability is already calculated, the original value should be the damage + if (!skyblocker$shouldProcess() || maxDamage != 0) { + return original; + } + return skyblocker$getAndCacheDurability() ? getDamage() : original; + } + + @ModifyReturnValue(method = "getMaxDamage", at = @At("RETURN")) + private int skyblocker$handleMaxDamage(int original) { + if (!skyblocker$shouldProcess()) { + return original; + } + // If the max damage is already calculated, return it + if (maxDamage != 0) { + return maxDamage; + } + return skyblocker$getAndCacheDurability() ? maxDamage : original; + } + + @ModifyReturnValue(method = "isDamageable", at = @At("RETURN")) + private boolean skyblocker$handleDamageable(boolean original) { + return skyblocker$shouldProcess() || original; + } + + @ModifyReturnValue(method = "isDamaged", at = @At("RETURN")) + private boolean skyblocker$handleDamaged(boolean original) { + return skyblocker$shouldProcess() || original; + } + + @Unique + private boolean skyblocker$shouldProcess() { + return Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.dwarvenMines.enableDrillFuel && ItemUtils.hasCustomDurability((ItemStack) (Object) this); + } + + @Unique + private boolean skyblocker$getAndCacheDurability() { + // Calculate the durability + IntIntPair durability = ItemUtils.getDurability((ItemStack) (Object) this); + // Return if calculating the durability failed + if (durability == null) { + return false; + } + // Saves the calculated durability + maxDamage = durability.rightInt(); + setDamage(durability.rightInt() - durability.leftInt()); + return true; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/LeverBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixins/LeverBlockMixin.java new file mode 100644 index 00000000..eb8c6bf6 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/LeverBlockMixin.java @@ -0,0 +1,29 @@ +package de.hysky.skyblocker.mixins; + +import de.hysky.skyblocker.skyblock.dungeon.OldLever; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.block.BlockState; +import net.minecraft.block.LeverBlock; +import net.minecraft.block.WallMountedBlock; +import net.minecraft.util.shape.VoxelShape; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.llamalad7.mixinextras.sugar.Local; + +@Mixin(LeverBlock.class) +public abstract class LeverBlockMixin extends WallMountedBlock { + protected LeverBlockMixin(Settings settings) { + super(settings); + } + + @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true) + public void skyblocker$onGetOutlineShape(CallbackInfoReturnable cir, @Local(argsOnly = true) BlockState state) { + if (Utils.isOnSkyblock()) { + VoxelShape shape = OldLever.getShape(state.get(FACE), state.get(FACING)); + if (shape != null) cir.setReturnValue(shape); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java new file mode 100644 index 00000000..ba3e5067 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java @@ -0,0 +1,18 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import de.hysky.skyblocker.debug.Debug; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.decoration.ArmorStandEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(LivingEntityRenderer.class) +public class LivingEntityRendererMixin { + @ModifyExpressionValue(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;isVisible(Lnet/minecraft/entity/LivingEntity;)Z")) + private boolean skyblocker$armorStandVisible(boolean visible, T entity) { + return entity instanceof ArmorStandEntity && Utils.isOnHypixel() && Debug.debugEnabled() || visible; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/MinecraftClientMixin.java b/src/main/java/de/hysky/skyblocker/mixins/MinecraftClientMixin.java new file mode 100644 index 00000000..2495fdbf --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/MinecraftClientMixin.java @@ -0,0 +1,60 @@ +package de.hysky.skyblocker.mixins; + +import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; +import de.hysky.skyblocker.skyblock.item.ItemProtection; +import de.hysky.skyblocker.utils.JoinWorldPlaceholderScreen; +import de.hysky.skyblocker.utils.ReconfiguringPlaceholderScreen; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.DownloadingTerrainScreen; +import net.minecraft.client.gui.screen.ReconfiguringScreen; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.network.ClientPlayerEntity; +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 org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(MinecraftClient.class) +public abstract class MinecraftClientMixin { + + @Shadow + @Nullable + public abstract ClientPlayNetworkHandler getNetworkHandler(); + + @Shadow + @Nullable + public ClientPlayerEntity player; + + @Inject(method = "handleInputEvents", at = @At("HEAD")) + public void skyblocker$handleInputEvents(CallbackInfo ci) { + if (Utils.isOnSkyblock()) { + HotbarSlotLock.handleInputEvents(player); + ItemProtection.handleHotbarKeyPressed(player); + } + } + + //Remove Downloading Terrain Screen and Reconfiguring Screen + @ModifyVariable(at = @At("HEAD"), method = "setScreen", ordinal = 0, argsOnly = true) + public Screen modifySetScreen(Screen screen) { + if (Utils.isOnHypixel()) { + return switch (screen) { + case DownloadingTerrainScreen _s -> null; + case ReconfiguringScreen _s when this.getNetworkHandler() != null -> new ReconfiguringPlaceholderScreen(this.getNetworkHandler().getConnection()); + + case null, default -> screen; + }; + } + return screen; + } + + @ModifyArg(method = "joinWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;reset(Lnet/minecraft/client/gui/screen/Screen;)V"), index = 0) + private Screen modifyJoinWorld(Screen screen) { + return Utils.isOnSkyblock() ? new JoinWorldPlaceholderScreen() : screen; + } +} \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/mixins/MouseMixin.java b/src/main/java/de/hysky/skyblocker/mixins/MouseMixin.java new file mode 100644 index 00000000..fb156af2 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/MouseMixin.java @@ -0,0 +1,19 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import de.hysky.skyblocker.skyblock.garden.LowerSensitivity; +import net.minecraft.client.Mouse; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(Mouse.class) +public class MouseMixin { + + @ModifyExpressionValue(method = "updateMouse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/SimpleOption;getValue()Ljava/lang/Object;", ordinal = 0)) + public Object skyblocker$gardenMouseLock(Object original) { + if (LowerSensitivity.isSensitivityLowered()) + return -1 / 3d; + else return original; + + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerInventoryMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerInventoryMixin.java new file mode 100644 index 00000000..35747267 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerInventoryMixin.java @@ -0,0 +1,21 @@ +package de.hysky.skyblocker.mixins; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import de.hysky.skyblocker.skyblock.crimson.kuudra.ArrowPoisonWarning; +import net.minecraft.entity.player.PlayerInventory; + +@Mixin(PlayerInventory.class) +public class PlayerInventoryMixin { + @Shadow + public int selectedSlot; + + @Inject(method = "scrollInHotbar", at = @At("TAIL")) + private void skyblocker$onHotbarScroll(CallbackInfo ci) { + ArrowPoisonWarning.tryWarn(selectedSlot); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java new file mode 100644 index 00000000..a1a9116c --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java @@ -0,0 +1,57 @@ +package de.hysky.skyblocker.mixins; + +import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.tabhud.TabHud; +import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import de.hysky.skyblocker.utils.Utils; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.hud.PlayerListHud; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +@Environment(EnvType.CLIENT) +@Mixin(PlayerListHud.class) +public class PlayerListHudMixin { + @Shadow + private Text footer; + + @Inject(at = @At("HEAD"), method = "render", cancellable = true) + public void skyblocker$renderTabHud(CallbackInfo info, @Local(argsOnly = true) DrawContext context, @Local(argsOnly = true) int w) { + if (!Utils.isInDungeons() || !SkyblockerConfigManager.get().general.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) { + return; + } + + ClientPlayNetworkHandler nwH = MinecraftClient.getInstance().getNetworkHandler(); + if (nwH == null) { + return; + } + + int h = MinecraftClient.getInstance().getWindow().getScaledHeight(); + float scale = SkyblockerConfigManager.get().general.tabHud.tabHudScale / 100f; + w = (int) (w / scale); + h = (int) (h / scale); + + PlayerListMgr.updateFooter(footer); + + try { + ScreenMaster.render(context, w,h); + // Screen screen = Screen.getCorrect(w, h, footer); + // screen.render(context); + info.cancel(); + } catch (Exception e) { + TabHud.LOGGER.error("[Skyblocker] Encountered unknown exception while drawing default hud", e); + } + } + +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinProviderMixin.java new file mode 100644 index 00000000..9cd2ef14 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinProviderMixin.java @@ -0,0 +1,18 @@ +package de.hysky.skyblocker.mixins; + +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; + +import de.hysky.skyblocker.utils.Utils; + +@Mixin(targets = "net.minecraft.client.texture.PlayerSkinProvider$1") +public class PlayerSkinProviderMixin { + + @WrapWithCondition(method = "method_54647", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false)) + private static boolean skyblocker$dontLogInvalidSignatureWarnings(Logger logger, String message, Object profileId) { + return !Utils.isOnHypixel(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinTextureMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinTextureMixin.java new file mode 100644 index 00000000..f9e2c8cd --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinTextureMixin.java @@ -0,0 +1,40 @@ +package de.hysky.skyblocker.mixins; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.PlayerHeadHashCache; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.texture.NativeImage; +import net.minecraft.client.texture.PlayerSkinTexture; + +@Mixin(PlayerSkinTexture.class) +public class PlayerSkinTextureMixin { + @Shadow + @Final + private String url; + + @Unique + private boolean isSkyblockSkinTexture; + + @Inject(method = "remapTexture", at = @At("HEAD")) + private void skyblocker$determineSkinSource(CallbackInfoReturnable cir) { + if (Utils.isOnSkyblock()) { + int skinHash = PlayerHeadHashCache.getSkinHash(this.url).hashCode(); + this.isSkyblockSkinTexture = PlayerHeadHashCache.contains(skinHash); + } + } + + @WrapWithCondition(method = "remapTexture", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/PlayerSkinTexture;stripAlpha(Lnet/minecraft/client/texture/NativeImage;IIII)V")) + private boolean skyblocker$dontStripAlphaValues(NativeImage image, int x1, int y1, int x2, int y2) { + return !(SkyblockerConfigManager.get().general.dontStripSkinAlphaValues && this.isSkyblockSkinTexture); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/RenderFishMixin.java b/src/main/java/de/hysky/skyblocker/mixins/RenderFishMixin.java new file mode 100644 index 00000000..71e7f56f --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/RenderFishMixin.java @@ -0,0 +1,26 @@ +package de.hysky.skyblocker.mixins; + + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.FishingBobberEntityRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.projectile.FishingBobberEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(FishingBobberEntityRenderer.class) +public abstract class RenderFishMixin { + + @Inject(method = "render", at = @At("HEAD"), cancellable = true) + private void skyblocker$render(FishingBobberEntity fishingBobberEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) { + //if rendered bobber is not the players and option to hide others is enabled do not render the bobber + if (Utils.isOnSkyblock() && fishingBobberEntity.getPlayerOwner() != MinecraftClient.getInstance().player && SkyblockerConfigManager.get().general.fishing.hideOtherPlayersRods) { + ci.cancel(); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/ScoreboardMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ScoreboardMixin.java new file mode 100644 index 00000000..94b39c0c --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/ScoreboardMixin.java @@ -0,0 +1,16 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.scoreboard.Scoreboard; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(Scoreboard.class) +public abstract class ScoreboardMixin { + @WrapWithCondition(method = "addTeam", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false)) + private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object arg) { + return !Utils.isOnHypixel(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/SocialInteractionsPlayerListWidgetMixin.java b/src/main/java/de/hysky/skyblocker/mixins/SocialInteractionsPlayerListWidgetMixin.java new file mode 100644 index 00000000..121e3045 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/SocialInteractionsPlayerListWidgetMixin.java @@ -0,0 +1,24 @@ +package de.hysky.skyblocker.mixins; + +import java.util.Map; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.gui.screen.multiplayer.SocialInteractionsPlayerListEntry; +import net.minecraft.client.gui.screen.multiplayer.SocialInteractionsPlayerListWidget; + +@Mixin(SocialInteractionsPlayerListWidget.class) +public class SocialInteractionsPlayerListWidgetMixin { + + @WrapOperation(method = "setPlayers", at = @At(value = "INVOKE", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", remap = false)) + private Object skyblocker$hideInvalidPlayers(Map map, Object uuid, Object entry, Operation operation) { + if (Utils.isOnSkyblock() && !((SocialInteractionsPlayerListEntry) entry).getName().matches("[A-Za-z0-9_]+")) return null; + + return operation.call(map, uuid, entry); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java b/src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java new file mode 100644 index 00000000..d9df4b74 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java @@ -0,0 +1,16 @@ +package de.hysky.skyblocker.mixins; + +import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars; +import net.minecraft.client.util.Window; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Window.class) +public class WindowMixin { + @Inject(method = "setScaleFactor", at = @At("TAIL")) + public void skyblocker$onScaleFactorChange(double scaleFactor, CallbackInfo ci) { + FancyStatusBars.updatePositions(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java new file mode 100644 index 00000000..2959d4b5 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java @@ -0,0 +1,48 @@ +package de.hysky.skyblocker.mixins; + +import de.hysky.skyblocker.skyblock.dungeon.LividColor; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; + +import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes; +import de.hysky.skyblocker.skyblock.entity.MobGlow; +import net.minecraft.client.render.WorldRenderer; +import net.minecraft.entity.Entity; +import org.spongepowered.asm.mixin.injection.Slice; + +@Mixin(WorldRenderer.class) +public class WorldRendererMixin { + + @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z")) + private boolean skyblocker$shouldMobGlow(boolean original, @Local Entity entity, @Share("hasCustomGlow") LocalBooleanRef hasCustomGlow) { + boolean allowGlow = LividColor.allowGlow(); + boolean shouldGlow = MobGlow.shouldMobGlow(entity); + hasCustomGlow.set(shouldGlow); + return allowGlow && original || shouldGlow; + } + + @ModifyVariable(method = "render", + slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z"), to = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/OutlineVertexConsumerProvider;setColor(IIII)V")), + at = @At("STORE"), ordinal = 0 + ) + private int skyblocker$modifyGlowColor(int color, @Local Entity entity, @Share("hasCustomGlow") LocalBooleanRef hasCustomGlow) { + return hasCustomGlow.get() ? MobGlow.getGlowColor(entity) : color; + } + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderEntity(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;)V")) + private void skyblocker$beforeEntityIsRendered(CallbackInfo ci, @Local Entity entity) { + boolean shouldShowBoundingBox = MobBoundingBoxes.shouldDrawMobBoundingBox(entity); + + if (shouldShowBoundingBox) { + MobBoundingBoxes.submitBox2BeRendered(entity.getBoundingBox(), MobBoundingBoxes.getBoxColor(entity)); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/YggdrasilMinecraftSessionServiceMixin.java b/src/main/java/de/hysky/skyblocker/mixins/YggdrasilMinecraftSessionServiceMixin.java new file mode 100644 index 00000000..17dbbb71 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/YggdrasilMinecraftSessionServiceMixin.java @@ -0,0 +1,20 @@ +package de.hysky.skyblocker.mixins; + +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; + +import de.hysky.skyblocker.utils.Utils; + +@Mixin(value = YggdrasilMinecraftSessionService.class, remap = false) +public class YggdrasilMinecraftSessionServiceMixin { + + //TODO perhaps investigate if we could fix this + @WrapWithCondition(method = "unpackTextures", remap = false, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Throwable;)V", ordinal = 0, remap = false)) + private boolean skyblocker$dontLogIncorrectEndingByteExceptions(Logger logger, String message, Throwable throwable) { + return !Utils.isOnHypixel() && throwable instanceof IllegalArgumentException; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/YggdrasilServicesKeyInfoMixin.java b/src/main/java/de/hysky/skyblocker/mixins/YggdrasilServicesKeyInfoMixin.java new file mode 100644 index 00000000..12621894 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/YggdrasilServicesKeyInfoMixin.java @@ -0,0 +1,60 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo; + +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; +import de.hysky.skyblocker.utils.Utils; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.Base64; +import java.util.Map; + +@Mixin(value = YggdrasilServicesKeyInfo.class, remap = false) +public class YggdrasilServicesKeyInfoMixin { + @Shadow + @Final + private static Logger LOGGER; + @Unique + private static final Map REPLACEMENT_MAP = Map.of(); + @Unique + private static final IntList ERRONEUS_SIGNATURE_HASHES = new IntArrayList(); + + @WrapOperation(method = "validateProperty", at = @At(value = "INVOKE", target = "Ljava/util/Base64$Decoder;decode(Ljava/lang/String;)[B", remap = false), remap = false) + private byte[] skyblocker$replaceKnownWrongBase64(Base64.Decoder decoder, String signature, Operation decode) { + try { + return decode.call(decoder, signature); + } catch (IllegalArgumentException e) { + try { + return decode.call(decoder, signature.replaceAll("[^A-Za-z0-9+/=]", "")); + } catch (IllegalArgumentException e2) { + if (Utils.isOnSkyblock()) { + if (REPLACEMENT_MAP.containsKey(signature)) { + return decode.call(decoder, REPLACEMENT_MAP.get(signature)); + } + int signatureHashCode = signature.hashCode(); + if (!ERRONEUS_SIGNATURE_HASHES.contains(signatureHashCode)) { + ERRONEUS_SIGNATURE_HASHES.add(signatureHashCode); + LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode base64 string No.{}: {}", ERRONEUS_SIGNATURE_HASHES.size() - 1, signature); + } else { + LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode the base64 string No.{} again", ERRONEUS_SIGNATURE_HASHES.indexOf(signatureHashCode)); + } + } + } + throw e; + } + } + + @WrapWithCondition(method = "validateProperty", remap = false, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false)) + private boolean skyblocker$dontLogFailedSignatureValidations(Logger logger, String message, Object property, Object exception) { + return !Utils.isOnHypixel(); + } +} \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java new file mode 100644 index 00000000..833cfc22 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java @@ -0,0 +1,16 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer; +import net.minecraft.client.util.math.MatrixStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BeaconBlockEntityRenderer.class) +public interface BeaconBlockEntityRendererInvoker { + @SuppressWarnings("unused") + @Invoker("renderBeam") + static void renderBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, float tickDelta, long worldTime, int yOffset, int maxY, float[] color) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java new file mode 100644 index 00000000..7a04630d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java @@ -0,0 +1,21 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.tooltip.TooltipComponent; +import net.minecraft.client.gui.tooltip.TooltipPositioner; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.util.List; + +@Mixin(DrawContext.class) +public interface DrawContextInvoker { + + @Invoker + void invokeDrawTooltip(TextRenderer textRenderer, List components, int x, int y, TooltipPositioner positioner); + + @Invoker + void invokeDrawTexturedQuad(Identifier texture, int x1, int x2, int y1, int y2, int z, float u1, float u2, float v1, float v2, float red, float green, float blue, float alpha); +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/EndermanEntityAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/EndermanEntityAccessor.java new file mode 100644 index 00000000..4dfed6dc --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/EndermanEntityAccessor.java @@ -0,0 +1,17 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.mob.EndermanEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Optional; + +@Mixin(EndermanEntity.class) +public interface EndermanEntityAccessor { + @Accessor + static TrackedData> getCARRIED_BLOCK() { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/FrustumInvoker.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/FrustumInvoker.java new file mode 100644 index 00000000..e4d04dde --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/FrustumInvoker.java @@ -0,0 +1,14 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.client.render.Frustum; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +/** + * Use {@link de.hysky.skyblocker.utils.render.FrustumUtils#isVisible(double, double, double, double, double, double) FrustumUtils#isVisible} which is shorter. For the purpose of avoiding object allocations! + */ +@Mixin(Frustum.class) +public interface FrustumInvoker { + @Invoker + boolean invokeIsVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ); +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java new file mode 100644 index 00000000..447031d4 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java @@ -0,0 +1,26 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.screen.ScreenHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(HandledScreen.class) +public interface HandledScreenAccessor { + @Accessor("x") + int getX(); + + @Accessor("y") + int getY(); + + @Accessor + int getBackgroundWidth(); + + @Accessor + int getBackgroundHeight(); + + @Mutable + @Accessor("handler") + void setHandler(ScreenHandler handler); +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/MessageHandlerAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/MessageHandlerAccessor.java new file mode 100644 index 00000000..bf4f9bae --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/MessageHandlerAccessor.java @@ -0,0 +1,14 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.client.network.message.MessageHandler; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.time.Instant; + +@Mixin(MessageHandler.class) +public interface MessageHandlerAccessor { + @Invoker + void invokeAddToChatLog(Text message, Instant timestamp); +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/PlayerListHudAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/PlayerListHudAccessor.java new file mode 100644 index 00000000..d1fd1c46 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/PlayerListHudAccessor.java @@ -0,0 +1,16 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.client.gui.hud.PlayerListHud; +import net.minecraft.client.network.PlayerListEntry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Comparator; + +@Mixin(PlayerListHud.class) +public interface PlayerListHudAccessor { + @Accessor("ENTRY_ORDERING") + static Comparator getOrdering() { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/RecipeBookWidgetAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/RecipeBookWidgetAccessor.java new file mode 100644 index 00000000..555a0d8a --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/RecipeBookWidgetAccessor.java @@ -0,0 +1,15 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; +import net.minecraft.client.gui.widget.TextFieldWidget; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(RecipeBookWidget.class) +public interface RecipeBookWidgetAccessor { + @Accessor + String getSearchText(); + + @Accessor + TextFieldWidget getSearchField(); +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/ScreenAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/ScreenAccessor.java new file mode 100644 index 00000000..c3544302 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/ScreenAccessor.java @@ -0,0 +1,14 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Screen.class) +public interface ScreenAccessor { + @Accessor + @Mutable + void setTitle(Text title); +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/SkullBlockEntityAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/SkullBlockEntityAccessor.java new file mode 100644 index 00000000..34c196b3 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/SkullBlockEntityAccessor.java @@ -0,0 +1,18 @@ +package de.hysky.skyblocker.mixins.accessors; + +import com.mojang.authlib.GameProfile; +import net.minecraft.block.entity.SkullBlockEntity; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +@Mixin(SkullBlockEntity.class) +public interface SkullBlockEntityAccessor { + @Invoker + static CompletableFuture> invokeFetchProfileByName(String name) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/SlotAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/SlotAccessor.java new file mode 100644 index 00000000..7c261458 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/SlotAccessor.java @@ -0,0 +1,17 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.screen.slot.Slot; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Slot.class) +public interface SlotAccessor { + @Mutable + @Accessor("x") + void setX(int x); + + @Mutable + @Accessor("y") + void setY(int y); +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/WorldRendererAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/WorldRendererAccessor.java new file mode 100644 index 00000000..e52b1c85 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/WorldRendererAccessor.java @@ -0,0 +1,13 @@ +package de.hysky.skyblocker.mixins.accessors; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.render.Frustum; +import net.minecraft.client.render.WorldRenderer; + +@Mixin(WorldRenderer.class) +public interface WorldRendererAccessor { + @Accessor + Frustum getFrustum(); +} \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/mixins/discordipc/ConnectionMixin.java b/src/main/java/de/hysky/skyblocker/mixins/discordipc/ConnectionMixin.java new file mode 100644 index 00000000..79a93e69 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/discordipc/ConnectionMixin.java @@ -0,0 +1,20 @@ +package de.hysky.skyblocker.mixins.discordipc; + +import de.hysky.skyblocker.utils.discord.DiscordRPCManager; +import meteordevelopment.discordipc.DiscordIPC; +import meteordevelopment.discordipc.connection.UnixConnection; +import meteordevelopment.discordipc.connection.WinConnection; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.io.IOException; + +@Mixin(value = {UnixConnection.class, WinConnection.class}, remap = false) +public class ConnectionMixin { + @Redirect(method = "write", at = @At(value = "INVOKE", target = "Ljava/io/IOException;printStackTrace()V")) + private void write(IOException e) { + DiscordIPC.stop(); + DiscordRPCManager.LOGGER.warn("[Skyblocker] Discord RPC failed to update activity, connection lost", e); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index c34c853b..e04a30ef 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -3,8 +3,8 @@ package de.hysky.skyblocker.skyblock; import com.google.gson.JsonObject; import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor; -import de.hysky.skyblocker.mixin.accessor.ScreenAccessor; +import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; +import de.hysky.skyblocker.mixins.accessors.ScreenAccessor; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.ItemUtils; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java b/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java index 8862185f..a44a3102 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java @@ -20,7 +20,7 @@ import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.arg import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; /** - * the mixin {@link de.hysky.skyblocker.mixin.CommandTreeS2CPacketMixin} + * the mixin {@link de.hysky.skyblocker.mixins.CommandTreeS2CPacketMixin} */ public class WarpAutocomplete { private static final Logger LOGGER = LoggerFactory.getLogger(WarpAutocomplete.class); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java index 28898cdc..4c4e1c0f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java @@ -1,6 +1,6 @@ package de.hysky.skyblocker.skyblock.auction; -import de.hysky.skyblocker.mixin.accessor.SlotAccessor; +import de.hysky.skyblocker.mixins.accessors.SlotAccessor; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.Inventory; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java index d7de2c75..e4fea9ec 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java @@ -6,7 +6,7 @@ import com.google.gson.JsonParser; import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; import de.hysky.skyblocker.SkyblockerMod; -import de.hysky.skyblocker.mixin.accessor.MessageHandlerAccessor; +import de.hysky.skyblocker.mixins.accessors.MessageHandlerAccessor; import de.hysky.skyblocker.utils.Http; import de.hysky.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java index 157519b5..a9ffafec 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java @@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.dungeon.partyfinder; import com.mojang.authlib.properties.PropertyMap; import de.hysky.skyblocker.SkyblockerMod; -import de.hysky.skyblocker.mixin.accessor.SkullBlockEntityAccessor; +import de.hysky.skyblocker.mixins.accessors.SkullBlockEntityAccessor; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java index 392ee100..c5279c61 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java @@ -1,6 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip; -import de.hysky.skyblocker.mixin.accessor.DrawContextInvoker; +import de.hysky.skyblocker.mixins.accessors.DrawContextInvoker; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; import de.hysky.skyblocker.utils.ItemUtils; import it.unimi.dsi.fastutil.ints.IntIntPair; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java index 5570c4f7..6120528c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -1,7 +1,8 @@ package de.hysky.skyblocker.skyblock.itemlist; import com.mojang.blaze3d.systems.RenderSystem; -import de.hysky.skyblocker.mixin.accessor.RecipeBookWidgetAccessor; + +import de.hysky.skyblocker.mixins.accessors.RecipeBookWidgetAccessor; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java index 28ffc930..7db78590 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java @@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.quicknav; import com.mojang.blaze3d.systems.RenderSystem; -import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor; +import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java index 3ef968a3..472cf700 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import de.hysky.skyblocker.mixin.accessor.PlayerListHudAccessor; +import de.hysky.skyblocker.mixins.accessors.PlayerListHudAccessor; import de.hysky.skyblocker.utils.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/de/hysky/skyblocker/utils/render/FrustumUtils.java b/src/main/java/de/hysky/skyblocker/utils/render/FrustumUtils.java index 3fe79e43..d82b4497 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/FrustumUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/FrustumUtils.java @@ -1,7 +1,7 @@ package de.hysky.skyblocker.utils.render; -import de.hysky.skyblocker.mixin.accessor.FrustumInvoker; -import de.hysky.skyblocker.mixin.accessor.WorldRendererAccessor; +import de.hysky.skyblocker.mixins.accessors.FrustumInvoker; +import de.hysky.skyblocker.mixins.accessors.WorldRendererAccessor; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.Frustum; import net.minecraft.util.math.Box; diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java index 4d97e733..a6772fb2 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java @@ -3,8 +3,8 @@ package de.hysky.skyblocker.utils.render; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.logging.LogUtils; import de.hysky.skyblocker.SkyblockerMod; -import de.hysky.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker; -import de.hysky.skyblocker.mixin.accessor.DrawContextInvoker; +import de.hysky.skyblocker.mixins.accessors.BeaconBlockEntityRendererInvoker; +import de.hysky.skyblocker.mixins.accessors.DrawContextInvoker; import de.hysky.skyblocker.utils.render.culling.OcclusionCulling; import de.hysky.skyblocker.utils.render.title.Title; import de.hysky.skyblocker.utils.render.title.TitleContainer; diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractCustomHypixelGUI.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractCustomHypixelGUI.java index 4f648b8c..ef2e6bf9 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractCustomHypixelGUI.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractCustomHypixelGUI.java @@ -1,6 +1,6 @@ package de.hysky.skyblocker.utils.render.gui; -import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor; +import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.skyblock.auction.AuctionHouseScreenHandler; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.entity.player.PlayerInventory; diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java index 440809d9..b37c57a4 100644 --- a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java @@ -1,7 +1,8 @@ package de.hysky.skyblocker.utils.render.gui; import com.mojang.blaze3d.systems.RenderSystem; -import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor; + +import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakeBagHelper; import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakesHelper; import de.hysky.skyblocker.skyblock.dungeon.CroesusHelper; diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 2d91eb0d..0032a557 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -1,6 +1,6 @@ { "required": true, - "package": "de.hysky.skyblocker.mixin", + "package": "de.hysky.skyblocker.mixins", "plugin": "de.hysky.skyblocker.compatibility.MixinPlugin", "compatibilityLevel": "JAVA_21", "client": [ @@ -37,18 +37,18 @@ "WorldRendererMixin", "YggdrasilMinecraftSessionServiceMixin", "YggdrasilServicesKeyInfoMixin", - "accessor.BeaconBlockEntityRendererInvoker", - "accessor.DrawContextInvoker", - "accessor.EndermanEntityAccessor", - "accessor.FrustumInvoker", - "accessor.HandledScreenAccessor", - "accessor.MessageHandlerAccessor", - "accessor.PlayerListHudAccessor", - "accessor.RecipeBookWidgetAccessor", - "accessor.ScreenAccessor", - "accessor.SkullBlockEntityAccessor", - "accessor.SlotAccessor", - "accessor.WorldRendererAccessor", + "accessors.BeaconBlockEntityRendererInvoker", + "accessors.DrawContextInvoker", + "accessors.EndermanEntityAccessor", + "accessors.FrustumInvoker", + "accessors.HandledScreenAccessor", + "accessors.MessageHandlerAccessor", + "accessors.PlayerListHudAccessor", + "accessors.RecipeBookWidgetAccessor", + "accessors.ScreenAccessor", + "accessors.SkullBlockEntityAccessor", + "accessors.SlotAccessor", + "accessors.WorldRendererAccessor", "discordipc.ConnectionMixin" ], "injectors": { -- cgit From 6368f24b87f8a3d6dbd113d1fdf921e394e5a936 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sat, 27 Apr 2024 12:40:11 -0400 Subject: Enable QuickNav NBT editing & add warning about it --- .../config/categories/QuickNavigationCategory.java | 25 +++++++++++----------- .../resources/assets/skyblocker/lang/en_us.json | 1 + 2 files changed, 14 insertions(+), 12 deletions(-) (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/config/categories/QuickNavigationCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/QuickNavigationCategory.java index 4f3bff36..4b3c0dfd 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/QuickNavigationCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/QuickNavigationCategory.java @@ -4,6 +4,7 @@ import de.hysky.skyblocker.config.ConfigUtils; import de.hysky.skyblocker.config.SkyblockerConfig; import dev.isxander.yacl3.api.ConfigCategory; import dev.isxander.yacl3.api.Option; +import dev.isxander.yacl3.api.OptionDescription; import dev.isxander.yacl3.api.OptionGroup; import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder; import dev.isxander.yacl3.api.controller.StringControllerBuilder; @@ -51,11 +52,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button1.item.nbt, () -> config.quickNav.button1.item.nbt, newValue -> config.quickNav.button1.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -100,11 +101,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button2.item.nbt, () -> config.quickNav.button2.item.nbt, newValue -> config.quickNav.button2.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -149,11 +150,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button3.item.nbt, () -> config.quickNav.button3.item.nbt, newValue -> config.quickNav.button3.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -198,11 +199,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button4.item.nbt, () -> config.quickNav.button4.item.nbt, newValue -> config.quickNav.button4.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -247,11 +248,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button5.item.nbt, () -> config.quickNav.button5.item.nbt, newValue -> config.quickNav.button5.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -296,11 +297,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button6.item.nbt, () -> config.quickNav.button6.item.nbt, newValue -> config.quickNav.button6.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -345,11 +346,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button7.item.nbt, () -> config.quickNav.button7.item.nbt, newValue -> config.quickNav.button7.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -394,11 +395,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button8.item.nbt, () -> config.quickNav.button8.item.nbt, newValue -> config.quickNav.button8.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -443,11 +444,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button9.item.nbt, () -> config.quickNav.button9.item.nbt, newValue -> config.quickNav.button9.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -492,11 +493,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button10.item.nbt, () -> config.quickNav.button10.item.nbt, newValue -> config.quickNav.button10.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -541,11 +542,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button11.item.nbt, () -> config.quickNav.button11.item.nbt, newValue -> config.quickNav.button11.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) @@ -590,11 +591,11 @@ public class QuickNavigationCategory { .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip"))) .binding(defaults.quickNav.button12.item.nbt, () -> config.quickNav.button12.item.nbt, newValue -> config.quickNav.button12.item.nbt = newValue) .controller(StringControllerBuilder::create) - .available(false) .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.quickNav.button.uiTitle")) diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 96d3d6d8..fb2d4b64 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -195,6 +195,7 @@ "text.autoconfig.skyblocker.option.quickNav.button.item.itemName": "Item ID", "text.autoconfig.skyblocker.option.quickNav.button.item.count": "Item Count", "text.autoconfig.skyblocker.option.quickNav.button.item.nbt": "NBT", + "text.autoconfig.skyblocker.option.quickNav.button.item.nbt.@Tooltip": "§c§lWARNING: THIS MUST BE CONFIGURED WITH ITEM NBT NOT ITEM COMPONENTS! \n\n§fIn the future we will automatically migrate your config to use item components!", "text.autoconfig.skyblocker.option.quickNav.button.uiTitle": "UI Title", "text.autoconfig.skyblocker.option.quickNav.button.clickEvent": "Click event", -- cgit From 45bcbe967ac58a2dc5ef606381e1653003ac17e3 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sun, 28 Apr 2024 15:06:24 -0400 Subject: Add invisible armour stand toggle and dumping head textures to debug --- src/main/java/de/hysky/skyblocker/debug/Debug.java | 42 ++++++++++++++++++++++ .../mixins/EntityRenderDispatcherMixin.java | 2 +- .../mixins/LivingEntityRendererMixin.java | 2 +- .../hysky/skyblocker/skyblock/entity/MobGlow.java | 20 +++-------- .../skyblocker/skyblock/garden/VisitorHelper.java | 8 ++--- .../java/de/hysky/skyblocker/utils/ItemUtils.java | 15 +++++++- .../resources/assets/skyblocker/lang/en_ca.json | 3 +- .../resources/assets/skyblocker/lang/en_us.json | 2 ++ 8 files changed, 70 insertions(+), 24 deletions(-) (limited to 'src/main/resources') diff --git a/src/main/java/de/hysky/skyblocker/debug/Debug.java b/src/main/java/de/hysky/skyblocker/debug/Debug.java index 31823ab0..8c883b30 100644 --- a/src/main/java/de/hysky/skyblocker/debug/Debug.java +++ b/src/main/java/de/hysky/skyblocker/debug/Debug.java @@ -3,17 +3,25 @@ package de.hysky.skyblocker.debug; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.utils.Constants; import de.hysky.skyblocker.utils.ItemUtils; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.text.Text; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; +import java.util.List; + public class Debug { private static final boolean DEBUG_ENABLED = Boolean.parseBoolean(System.getProperty("skyblocker.debug", "false")); + private static boolean showInvisibleArmorStands = false; + public static boolean debugEnabled() { return DEBUG_ENABLED || FabricLoader.getInstance().isDevelopmentEnvironment(); } @@ -24,6 +32,8 @@ public class Debug { ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("debug") .then(dumpPlayersCommand()) .then(ItemUtils.dumpHeldItemCommand()) + .then(toggleShowingInvisibleArmorStands()) + .then(dumpArmorStandHeadTextures()) ))); } } @@ -35,4 +45,36 @@ public class Debug { return Command.SINGLE_SUCCESS; }); } + + private static LiteralArgumentBuilder toggleShowingInvisibleArmorStands() { + return literal("toggleShowingInvisibleArmorStands") + .executes(context -> { + showInvisibleArmorStands = !showInvisibleArmorStands; + context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.debug.toggledShowingInvisibleArmorStands", showInvisibleArmorStands))); + return Command.SINGLE_SUCCESS; + }); + } + + private static LiteralArgumentBuilder dumpArmorStandHeadTextures() { + return literal("dumpArmorStandHeadTextures") + .executes(context -> { + List armorStands = context.getSource().getWorld().getEntitiesByClass(ArmorStandEntity.class, context.getSource().getPlayer().getBoundingBox().expand(8d), EntityPredicates.NOT_MOUNTED); + + for (ArmorStandEntity armorStand : armorStands) { + Iterable equippedItems = armorStand.getEquippedItems(); + + for (ItemStack stack : equippedItems) { + String texture = ItemUtils.getHeadTexture(stack); + + if (!texture.isEmpty()) context.getSource().sendFeedback(Text.of(texture)); + } + } + + return Command.SINGLE_SUCCESS; + }); + } + + public static boolean shouldShowInvisibleArmorStands() { + return showInvisibleArmorStands; + } } diff --git a/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java b/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java index 05fe9148..79d13068 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java @@ -13,6 +13,6 @@ import org.spongepowered.asm.mixin.injection.At; public class EntityRenderDispatcherMixin { @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isInvisible()Z", ordinal = 1)) private boolean skyblocker$armorStandHitboxVisible(boolean invisible, E entity) { - return (!(entity instanceof ArmorStandEntity) || !Utils.isOnHypixel() || !Debug.debugEnabled()) && invisible; + return (!(entity instanceof ArmorStandEntity) || !Utils.isOnHypixel() || !Debug.debugEnabled() || !Debug.shouldShowInvisibleArmorStands()) && invisible; } } diff --git a/src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java index ba3e5067..60fa7dec 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java @@ -13,6 +13,6 @@ import org.spongepowered.asm.mixin.injection.At; public class LivingEntityRendererMixin { @ModifyExpressionValue(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;isVisible(Lnet/minecraft/entity/LivingEntity;)Z")) private boolean skyblocker$armorStandVisible(boolean visible, T entity) { - return entity instanceof ArmorStandEntity && Utils.isOnHypixel() && Debug.debugEnabled() || visible; + return entity instanceof ArmorStandEntity && Utils.isOnHypixel() && Debug.debugEnabled() && Debug.shouldShowInvisibleArmorStands() || visible; } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java index 8343c6a5..75ba700e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java @@ -4,6 +4,7 @@ import com.mojang.authlib.properties.Property; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.dungeon.LividColor; import de.hysky.skyblocker.skyblock.end.TheEnd; +import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.SlayerUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.culling.OcclusionCulling; @@ -104,23 +105,12 @@ public class MobGlow { private static boolean isNukekubiHead(ArmorStandEntity entity) { for (ItemStack armorItem : entity.getArmorItems()) { - // hacky way to check if an item is a player head w/o - // some shenanigans - if (!armorItem.isOf(Items.PLAYER_HEAD)) - continue; - // eb07594e2df273921a77c101d0bfdfa1115abed5b9b2029eb496ceba9bdbb4b3 is texture id for the nukekubi head, // compare against it to exclusively find armorstands that are nukekubi heads - ProfileComponent profile = armorItem.get(DataComponentTypes.PROFILE); - if (profile != null) { - // get the texture of the nukekubi head item itself and compare it - String texture = profile.properties().get("textures").stream() - .map(Property::value) - .findFirst() - .orElse("None"); - - return texture.contains("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0="); - } + // get the texture of the nukekubi head item itself and compare it + String texture = ItemUtils.getHeadTexture(armorItem); + + return texture.contains("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0="); } return false; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java index ff6086d3..d6015748 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java @@ -96,11 +96,9 @@ public class VisitorHelper { } private static @Nullable String getTextureOrNull(ItemStack stack) { - if (!stack.isOf(Items.PLAYER_HEAD) || stack.get(DataComponentTypes.PROFILE) == null) return null; - return stack.get(DataComponentTypes.PROFILE).properties().get("textures").stream() - .map(Property::value) - .findFirst() - .orElse(null); + String texture = ItemUtils.getHeadTexture(stack); + + return texture.isEmpty() ? null : texture; } private static void processLore(String visitorName, @Nullable String visitorTexture, List loreList) { diff --git a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java index 32ca36ca..086686a7 100644 --- a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java @@ -2,6 +2,7 @@ package de.hysky.skyblocker.utils; import com.google.gson.Gson; import com.google.gson.JsonParser; +import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.PropertyMap; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; @@ -199,7 +200,19 @@ public class ItemUtils { } public static PropertyMap propertyMapWithTexture(String textureValue) { - return Codecs.GAME_PROFILE_PROPERTY_MAP.parse(JsonOps.INSTANCE, JsonParser.parseString("[{\"name\":\"textures\",\"value\":\"" + textureValue + "\"}]")).getOrThrow(); + return Codecs.GAME_PROFILE_PROPERTY_MAP.parse(JsonOps.INSTANCE, JsonParser.parseString("[{\"name\":\"textures\",\"value\":\"" + textureValue + "\"}]")).getOrThrow(); + } + + public static String getHeadTexture(ItemStack stack) { + if (!stack.isOf(Items.PLAYER_HEAD) || !stack.contains(DataComponentTypes.PROFILE)) return ""; + + ProfileComponent profile = stack.get(DataComponentTypes.PROFILE); + String texture = profile.properties().get("textures").stream() + .map(Property::value) + .findFirst() + .orElse(""); + + return texture; } public static ItemStack getSkyblockerStack() { diff --git a/src/main/resources/assets/skyblocker/lang/en_ca.json b/src/main/resources/assets/skyblocker/lang/en_ca.json index b7a6450f..5d8afbe9 100644 --- a/src/main/resources/assets/skyblocker/lang/en_ca.json +++ b/src/main/resources/assets/skyblocker/lang/en_ca.json @@ -41,5 +41,6 @@ "skyblocker.bars.config.defense": "Defence", "skyblocker.bars.config.mainColor": "Main Colour", "skyblocker.bars.config.overflowColor": "Overflow Colour", - "skyblocker.bars.config.textColor": "Text Colour" + "skyblocker.bars.config.textColor": "Text Colour", + "skyblocker.debug.toggledShowingInvisibleArmorStands": "Toggled showing invisible armour stands to %s" } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index fb2d4b64..53b66257 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -491,6 +491,8 @@ "text.autoconfig.skyblocker.option.general.dontStripSkinAlphaValues": "Correct Transparent Skin Pixels", "text.autoconfig.skyblocker.option.general.dontStripSkinAlphaValues.@Tooltip": "When enabled, the alpha values of pixels in skin textures are no longer stripped while in Skyblock.\n\nThis results in the \"filler\" pixels on items using Player Heads to now be completely transparent, although this may have some side effects in odd cases.", + "skyblocker.debug.toggledShowingInvisibleArmorStands": "Toggled showing invisible armor stands to %s", + "skyblocker.bars.config.health": "Health", "skyblocker.bars.config.defense": "Defense", "skyblocker.bars.config.intelligence": "Intelligence", -- cgit From 7c0cba3ec25975ef51a9ea604ff308ce98270839 Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Mon, 29 Apr 2024 17:05:29 -0400 Subject: 1.20.6 --- gradle.properties | 6 +++--- src/main/resources/fabric.mod.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/main/resources') diff --git a/gradle.properties b/gradle.properties index e9374596..ceb86ac8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,13 @@ org.gradle.parallel=true # Fabric Properties (https://fabricmc.net/versions.html) ## 1.20 -minecraft_version=1.20.5 -yarn_mappings=1.20.5+build.1 +minecraft_version=1.20.6 +yarn_mappings=1.20.6+build.1 loader_version=0.15.10 #Fabric api ## 1.20 -fabric_api_version=0.97.7+1.20.5 +fabric_api_version=0.97.8+1.20.6 # Minecraft Mods ## YACL (https://github.com/isXander/YetAnotherConfigLib) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 81a6373d..645eda34 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,7 +34,7 @@ "accessWidener": "skyblocker.accesswidener", "depends": { "fabricloader": ">=0.15.10", - "fabric-api": ">=0.97.7+1.20.5", + "fabric-api": ">=0.97.8+1.20.6", "yet_another_config_lib_v3": ">=3.4.1+1.20.5", "minecraft": "~1.20.5", "java": ">=21" -- cgit