From bf18fb9b0054177b3dee145d681c8ff1dd60418e Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Fri, 25 Apr 2025 16:25:27 -0400 Subject: 1.21.5 (#1256) * 1.21.5 * Test fixes and clean up * Update test screenshot * Record patterns * Performance optimization * Reset ordered waypoint index on world change (and stop serializing it) * Waypoints clean up and fixes (#1257) * Small waypoints clean up * Fix waypoints test codec field order * Safe config updates Rather than updating the values directly and then calling save, the mod will now handle this behaviour itself to ensure update consistency/visibility with the upcoming thread split. Most usages of the old method were converted but there are some left. --------- Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> --- .../de/hysky/skyblocker/UpdateNotifications.java | 3 +- .../skyblocker/compatibility/MixinPlugin.java | 10 +- .../hysky/skyblocker/config/CodecTypeAdapter.java | 28 +++ .../hysky/skyblocker/config/HudConfigScreen.java | 5 +- .../skyblocker/config/SkyblockerConfigManager.java | 16 +- .../config/configs/QuickNavigationConfig.java | 2 +- .../skyblocker/config/datafixer/ConfigFix1.java | 2 +- .../powdertracker/PowderFilterConfigScreen.java | 3 +- src/main/java/de/hysky/skyblocker/debug/Debug.java | 8 +- .../skyblocker/mixins/ClientPlayerEntityMixin.java | 2 +- .../mixins/EntityRenderDispatcherMixin.java | 8 - .../skyblocker/mixins/EntityRendererMixin.java | 25 ++ .../skyblocker/mixins/GlResourceManagerMixin.java | 25 ++ .../skyblocker/mixins/HandledScreenMixin.java | 3 - .../de/hysky/skyblocker/mixins/InGameHudMixin.java | 9 +- .../de/hysky/skyblocker/mixins/ItemStackMixin.java | 19 +- .../mixins/RenderLayerMultiPhaseMixin.java | 20 -- .../mixins/RenderPhaseDepthTestMixin.java | 45 ---- .../skyblocker/mixins/RenderPipelineMixin.java | 20 ++ .../skyblocker/mixins/WorldRendererMixin.java | 12 +- .../BeaconBlockEntityRendererInvoker.java | 2 +- .../mixins/accessors/DrawContextInvoker.java | 2 +- .../de/hysky/skyblocker/skyblock/HealthBars.java | 2 +- .../skyblocker/skyblock/NightVisionCommand.java | 4 +- .../de/hysky/skyblocker/skyblock/SmoothAOTE.java | 4 +- .../skyblocker/skyblock/StatusBarTracker.java | 3 +- .../hysky/skyblocker/skyblock/TeleportOverlay.java | 6 +- .../java/de/hysky/skyblocker/skyblock/Tips.java | 26 +- .../skyblock/chat/ChatPositionShare.java | 4 +- .../skyblock/chat/ConfirmationPromptHelper.java | 4 +- .../skyblock/chocolatefactory/EggFinder.java | 6 +- .../skyblock/crimson/dojo/ControlTestHelper.java | 2 +- .../skyblock/crimson/dojo/ForceTestHelper.java | 2 +- .../skyblocker/skyblock/dungeon/DungeonMap.java | 2 +- .../skyblock/dungeon/DungeonMapConfigScreen.java | 11 +- .../skyblocker/skyblock/dungeon/DungeonScore.java | 5 +- .../skyblock/dungeon/secrets/DungeonManager.java | 4 +- .../skyblock/dungeon/secrets/SecretsTracker.java | 2 +- .../skyblock/dungeon/terminal/ColorTerminal.java | 4 +- .../skyblocker/skyblock/dwarven/CorpseFinder.java | 4 +- .../skyblock/dwarven/CrystalsLocationsManager.java | 8 +- .../skyblock/dwarven/WishingCompassSolver.java | 2 +- .../profittrackers/corpse/CorpseProfitTracker.java | 4 +- .../hysky/skyblocker/skyblock/entity/MobGlow.java | 7 +- .../events/greatspook/MathTeacherHelper.java | 4 +- .../skyblock/fancybars/FancyStatusBars.java | 2 +- .../skyblocker/skyblock/fancybars/StatusBar.java | 4 +- .../skyblocker/skyblock/garden/FarmingHud.java | 6 +- .../skyblocker/skyblock/item/CustomArmorTrims.java | 4 +- .../skyblocker/skyblock/item/HotbarSlotLock.java | 4 +- .../skyblocker/skyblock/item/ItemCooldowns.java | 2 +- .../skyblocker/skyblock/item/ItemProtection.java | 2 +- .../skyblock/item/ItemRarityBackgrounds.java | 8 - .../skyblocker/skyblock/item/MuseumItemCache.java | 8 +- .../skyblock/item/SkyblockInventoryScreen.java | 16 +- .../item/slottext/adders/AttributeShardAdder.java | 4 +- .../slottext/adders/EnchantmentLevelAdder.java | 7 +- .../item/slottext/adders/NewYearCakeAdder.java | 2 +- .../item/slottext/adders/PotionLevelAdder.java | 5 +- .../item/slottext/adders/PrehistoricEggAdder.java | 5 +- .../skyblock/item/tooltip/BackpackPreview.java | 25 +- .../item/tooltip/CompactorDeletorPreview.java | 4 +- .../item/tooltip/adders/DungeonQualityTooltip.java | 4 +- .../item/tooltip/adders/MuseumTooltip.java | 2 +- .../item/tooltip/adders/ObtainedDateTooltip.java | 11 +- .../adders/StackingEnchantProgressTooltip.java | 9 +- .../profileviewer/inventory/Inventory.java | 3 - .../profileviewer/inventory/PlayerInventory.java | 3 - .../inventory/itemLoaders/ItemLoader.java | 10 +- .../tabhud/widget/ComponentBasedWidget.java | 5 - .../skyblock/tabhud/widget/HudWidget.java | 2 +- .../skyblocker/skyblock/waypoint/Waypoints.java | 6 + .../java/de/hysky/skyblocker/utils/ItemUtils.java | 76 +++--- .../datafixer/ItemStackComponentizationFixer.java | 2 +- .../utils/datafixer/LegacyItemStackFixer.java | 15 +- .../utils/datafixer/LegacyStringNbtReader.java | 272 ++++++++++++++++++++- .../utils/discord/DiscordRPCManager.java | 3 +- .../networth/SkyblockItemMetadataRetriever.java | 10 +- .../skyblocker/utils/render/RenderHelper.java | 27 +- .../utils/render/SkyblockerRenderLayers.java | 55 +---- .../utils/render/SkyblockerRenderPipelines.java | 44 ++++ .../utils/render/gui/AbstractPopupScreen.java | 3 +- .../utils/render/title/TitleContainer.java | 2 +- .../skyblocker/utils/waypoint/WaypointGroup.java | 27 +- 84 files changed, 682 insertions(+), 406 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/config/CodecTypeAdapter.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/EntityRendererMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/GlResourceManagerMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/RenderPipelineMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderPipelines.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/UpdateNotifications.java b/src/main/java/de/hysky/skyblocker/UpdateNotifications.java index 00ae9ac0..4f9deef0 100644 --- a/src/main/java/de/hysky/skyblocker/UpdateNotifications.java +++ b/src/main/java/de/hysky/skyblocker/UpdateNotifications.java @@ -2,6 +2,7 @@ package de.hysky.skyblocker; import java.io.BufferedReader; import java.io.BufferedWriter; +import java.net.URI; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; @@ -104,7 +105,7 @@ public class UpdateNotifications { Text versionText = Text.literal(newVersion.name()).styled(style -> style .withFormatting(Formatting.GRAY) .withUnderline(true) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, downloadLink))); + .withClickEvent(new ClickEvent.OpenUrl(URI.create(downloadLink)))); CLIENT.player.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.updateNotifications.newUpdateMessage", versionText)), false); SystemToast.add(CLIENT.getToastManager(), TOAST_TYPE, Text.translatable("skyblocker.updateNotifications.newUpdateToast.title"), Text.stringifiedTranslatable("skyblocker.updateNotifications.newUpdateToast.description", newVersion.version())); diff --git a/src/main/java/de/hysky/skyblocker/compatibility/MixinPlugin.java b/src/main/java/de/hysky/skyblocker/compatibility/MixinPlugin.java index 7820dfa4..2af8860e 100644 --- a/src/main/java/de/hysky/skyblocker/compatibility/MixinPlugin.java +++ b/src/main/java/de/hysky/skyblocker/compatibility/MixinPlugin.java @@ -1,6 +1,8 @@ package de.hysky.skyblocker.compatibility; import net.fabricmc.loader.api.FabricLoader; + +import org.apache.commons.lang3.SystemUtils; import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; @@ -23,8 +25,12 @@ public class MixinPlugin implements IMixinConfigPlugin { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - //OptiFabric Compatibility - return !mixinClassName.endsWith("WorldRendererMixin") || !OPTIFABRIC_LOADED; + return switch (mixinClassName) { + case String s when s.endsWith("WorldRendererMixin") -> !OPTIFABRIC_LOADED; + case String s when s.endsWith("GlResourceManagerMixin") -> SystemUtils.IS_OS_MAC && "aarch64".equalsIgnoreCase(SystemUtils.OS_ARCH); + + default -> true; + }; } @Override diff --git a/src/main/java/de/hysky/skyblocker/config/CodecTypeAdapter.java b/src/main/java/de/hysky/skyblocker/config/CodecTypeAdapter.java new file mode 100644 index 00000000..27544703 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/config/CodecTypeAdapter.java @@ -0,0 +1,28 @@ +package de.hysky.skyblocker.config; + +import java.lang.reflect.Type; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; + +/** + * Creates a GSON type adapter from a {@link Codec}. + */ +public record CodecTypeAdapter(Codec codec) implements JsonSerializer, JsonDeserializer { + + @Override + public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + return codec.parse(JsonOps.INSTANCE, json).getOrThrow(JsonParseException::new); + } + + @Override + public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { + return codec.encodeStart(JsonOps.INSTANCE, src).getOrThrow(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java index 06bec737..82ac889e 100644 --- a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java @@ -133,10 +133,7 @@ public abstract class HudConfigScreen extends Screen { @Override public final void close() { - SkyblockerConfig skyblockerConfig = SkyblockerConfigManager.get(); - savePos(skyblockerConfig, widgets); - SkyblockerConfigManager.save(); - + SkyblockerConfigManager.update(config -> savePos(config, widgets)); client.setScreen(parent); } diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java index 5288d247..053d89be 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java @@ -25,6 +25,9 @@ import net.minecraft.util.Identifier; import java.lang.StackWalker.Option; import java.nio.file.Path; +import java.util.function.Consumer; + +import org.apache.commons.lang3.function.Consumers; public class SkyblockerConfigManager { public static final int CONFIG_VERSION = 3; @@ -35,7 +38,7 @@ public class SkyblockerConfigManager { .setJson5(false) .appendGsonBuilder(builder -> builder .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) - .registerTypeHierarchyAdapter(Identifier.class, new Identifier.Serializer())) + .registerTypeHierarchyAdapter(Identifier.class, new CodecTypeAdapter<>(Identifier.CODEC))) .build()) .build(); @@ -65,8 +68,17 @@ public class SkyblockerConfigManager { }); } + @Deprecated(since = "1.21.5", forRemoval = true) public static void save() { - HANDLER.save(); + update(Consumers.nop()); + } + + /** + * Executes the given {@code action} to update fields in the config, then saves the changes. + */ + public static void update(Consumer action) { + action.accept(get()); + HANDLER.save(); } public static Screen createGUI(Screen parent) { diff --git a/src/main/java/de/hysky/skyblocker/config/configs/QuickNavigationConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/QuickNavigationConfig.java index 340266fe..03c59251 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/QuickNavigationConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/QuickNavigationConfig.java @@ -27,7 +27,7 @@ public class QuickNavigationConfig { * " \\([12]/2\\)" : match on the page either " (1/2)" or " (2/2)" */ @SerialEntry - public QuickNavItem button4 = new QuickNavItem(new ItemData(Items.LEATHER_CHESTPLATE, "[minecraft:dyed_color={rgb:8991416}]"), "Wardrobe \\([12]/2\\)", "/wardrobe", "Wardrobe"); + public QuickNavItem button4 = new QuickNavItem(new ItemData(Items.LEATHER_CHESTPLATE, "[minecraft:dyed_color=8991416]"), "Wardrobe \\([12]/2\\)", "/wardrobe", "Wardrobe"); @SerialEntry public QuickNavItem button5 = new QuickNavItem(new ItemData(Items.PLAYER_HEAD, "[minecraft:profile={id:[I;-2081424676,-57521078,-2073572414,158072763],name:\"\",properties:[{name:\"textures\",value:\"ewogICJ0aW1lc3RhbXAiIDogMTU5MTMxMDU4NTYwOSwKICAicHJvZmlsZUlkIiA6ICI0MWQzYWJjMmQ3NDk0MDBjOTA5MGQ1NDM0ZDAzODMxYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZWdha2xvb24iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODBhMDc3ZTI0OGQxNDI3NzJlYTgwMDg2NGY4YzU3OGI5ZDM2ODg1YjI5ZGFmODM2YjY0YTcwNjg4MmI2ZWMxMCIKICAgIH0KICB9Cn0=\"}]}]"), "Sack of Sacks", "/sacks", "Sacks"); diff --git a/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigFix1.java b/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigFix1.java index 8eff09e7..c90d4908 100644 --- a/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigFix1.java +++ b/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigFix1.java @@ -193,7 +193,7 @@ public class ConfigFix1 extends ConfigDataFix { if (extraNbt.length() > 2) itemNbt += "," + extraNbt; itemNbt += "}"; - ItemStack fixed = ItemStackComponentizationFixer.fixUpItem(StringNbtReader.parse(itemNbt)); + ItemStack fixed = ItemStackComponentizationFixer.fixUpItem(StringNbtReader.readCompound(itemNbt)); return nbt.createString(ItemStackComponentizationFixer.componentsAsString(fixed)); } catch (Exception e) { diff --git a/src/main/java/de/hysky/skyblocker/config/screens/powdertracker/PowderFilterConfigScreen.java b/src/main/java/de/hysky/skyblocker/config/screens/powdertracker/PowderFilterConfigScreen.java index a5c90a2a..710b8133 100644 --- a/src/main/java/de/hysky/skyblocker/config/screens/powdertracker/PowderFilterConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/config/screens/powdertracker/PowderFilterConfigScreen.java @@ -61,8 +61,7 @@ public class PowderFilterConfigScreen extends Screen { } public void saveFilters() { - SkyblockerConfigManager.get().mining.crystalHollows.powderTrackerFilter = filters; - SkyblockerConfigManager.save(); + SkyblockerConfigManager.update(config -> config.mining.crystalHollows.powderTrackerFilter = filters); PowderMiningTracker.INSTANCE.recalculateAll(); } diff --git a/src/main/java/de/hysky/skyblocker/debug/Debug.java b/src/main/java/de/hysky/skyblocker/debug/Debug.java index 7bbacbb2..bad504f2 100644 --- a/src/main/java/de/hysky/skyblocker/debug/Debug.java +++ b/src/main/java/de/hysky/skyblocker/debug/Debug.java @@ -114,8 +114,7 @@ public class Debug { private static LiteralArgumentBuilder toggleShowingInvisibleArmorStands() { return literal("toggleShowingInvisibleArmorStands") .executes(context -> { - SkyblockerConfigManager.get().debug.showInvisibleArmorStands = !SkyblockerConfigManager.get().debug.showInvisibleArmorStands; - SkyblockerConfigManager.save(); + SkyblockerConfigManager.update(config -> config.debug.showInvisibleArmorStands = !config.debug.showInvisibleArmorStands); context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.debug.toggledShowingInvisibleArmorStands", SkyblockerConfigManager.get().debug.showInvisibleArmorStands))); return Command.SINGLE_SUCCESS; }); @@ -124,8 +123,7 @@ public class Debug { private static LiteralArgumentBuilder toggleWebSocketDebug() { return literal("toggleWebSocketDebug") .executes(context -> { - SkyblockerConfigManager.get().debug.webSocketDebug = !SkyblockerConfigManager.get().debug.webSocketDebug; - SkyblockerConfigManager.save(); + SkyblockerConfigManager.update(config -> config.debug.webSocketDebug = !SkyblockerConfigManager.get().debug.webSocketDebug); context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.debug.toggledWebSocketDebug", SkyblockerConfigManager.get().debug.webSocketDebug))); return Command.SINGLE_SUCCESS; }); @@ -137,7 +135,7 @@ public class Debug { 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(); + Iterable equippedItems = ItemUtils.getArmor(armorStand); for (ItemStack stack : equippedItems) { ItemUtils.getHeadTextureOptional(stack).ifPresent(texture -> context.getSource().sendFeedback(Text.of(texture))); diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java index f3b17000..90879293 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java @@ -37,7 +37,7 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity @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)) + if (Utils.isOnSkyblock() && (ItemProtection.isItemProtected(this.getMainHandStack()) || HotbarSlotLock.isLocked(this.getInventory().getSelectedSlot())) && (!SkyblockerConfigManager.get().dungeons.allowDroppingProtectedItems || !Utils.isInDungeons())) { cir.setReturnValue(false); } diff --git a/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java b/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java index ae5856e2..8cac5a2d 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java @@ -1,10 +1,8 @@ package de.hysky.skyblocker.mixins; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.debug.Debug; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import net.minecraft.client.render.entity.EntityRenderDispatcher; @@ -12,7 +10,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.decoration.ArmorStandEntity; -import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -26,9 +23,4 @@ public class EntityRenderDispatcherMixin { private boolean skyblocker$dontRenderSoulweaverSkulls(boolean original, @Local(argsOnly = true) E entity) { return Utils.isInDungeons() && SkyblockerConfigManager.get().dungeons.hideSoulweaverSkulls && entity instanceof ArmorStandEntity armorStand && entity.isInvisible() && armorStand.hasStackEquipped(EquipmentSlot.HEAD) ? !ItemUtils.getHeadTexture(armorStand.getEquippedStack(EquipmentSlot.HEAD)).equals(SOULWEAVER_SKULL_TEXTURE) : original; } - - @ModifyExpressionValue(method = "render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/entity/state/EntityRenderState;invisible:Z", opcode = Opcodes.GETFIELD, ordinal = 1)) - private boolean skyblocker$armorStandHitboxVisible(boolean invisible, @Local(argsOnly = true) E entity) { - return (!(entity instanceof ArmorStandEntity) || !Utils.isOnHypixel() || !Debug.debugEnabled() || !SkyblockerConfigManager.get().debug.showInvisibleArmorStands) && invisible; - } } diff --git a/src/main/java/de/hysky/skyblocker/mixins/EntityRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/EntityRendererMixin.java new file mode 100644 index 00000000..72d1edbe --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/EntityRendererMixin.java @@ -0,0 +1,25 @@ +package de.hysky.skyblocker.mixins; + +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Slice; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.debug.Debug; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.decoration.ArmorStandEntity; + +@Mixin(EntityRenderer.class) +public class EntityRendererMixin { + + @ModifyExpressionValue(method = "updateRenderState", slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/EntityRenderDispatcher;shouldRenderHitboxes()Z")), at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/entity/state/EntityRenderState;invisible:Z", opcode = Opcodes.GETFIELD)) + private boolean skyblocker$armorStandHitboxVisible(boolean invisible, @Local(argsOnly = true) E entity) { + return (!(entity instanceof ArmorStandEntity) || !Utils.isOnHypixel() || !Debug.debugEnabled() || !SkyblockerConfigManager.get().debug.showInvisibleArmorStands) && invisible; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/GlResourceManagerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GlResourceManagerMixin.java new file mode 100644 index 00000000..582b4087 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/GlResourceManagerMixin.java @@ -0,0 +1,25 @@ +package de.hysky.skyblocker.mixins; + +import java.nio.ByteBuffer; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.buffers.GpuBuffer; +import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlStateManager; + +import net.minecraft.client.gl.GlResourceManager; + +@Mixin(GlResourceManager.class) +public class GlResourceManagerMixin { + + @WrapWithCondition(method = "writeToBuffer", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/opengl/GlStateManager;_glBufferSubData(IILjava/nio/ByteBuffer;)V", ordinal = 0)) + private static boolean skyblocker$replaceBufferData(int target, int offset, ByteBuffer data, @Local(argsOnly = true) GpuBuffer gpuBuffer) { + GlStateManager._glBufferData(target, data, GlConst.toGl(gpuBuffer.usage())); + + return false; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index 639ad677..f3707406 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -2,7 +2,6 @@ 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.config.SkyblockerConfig; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.InventorySearch; @@ -334,9 +333,7 @@ public abstract class HandledScreenMixin extends Screen ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y); // Item Protection if (ItemProtection.isItemProtected(slot.getStack())) { - RenderSystem.enableBlend(); context.drawTexture(RenderLayer::getGuiTextured, ItemProtection.ITEM_PROTECTION_TEX, slot.x, slot.y, 0, 0, 16, 16, 16, 16); - RenderSystem.disableBlend(); } // Search // Darken the slots diff --git a/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java index 1b55ed94..d9520ce4 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java @@ -3,7 +3,6 @@ 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 com.mojang.blaze3d.systems.RenderSystem; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars; import de.hysky.skyblocker.skyblock.item.HotbarSlotLock; @@ -56,17 +55,13 @@ public abstract class InGameHudMixin { 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 (SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) ItemRarityBackgrounds.tryDraw(player.getInventory().getMainStacks().get(index), context, x, y); if (HotbarSlotLock.isLocked(index)) { - RenderSystem.enableBlend(); context.drawTexture(RenderLayer::getGuiTextured, 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(); + if (ItemProtection.isItemProtected(player.getInventory().getMainStacks().get(index))) { context.drawTexture(RenderLayer::getGuiTextured, ItemProtection.ITEM_PROTECTION_TEX, x, y, 0, 0, 16, 16, 16, 16); - RenderSystem.disableBlend(); } } } diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java index 2e3ac4de..47d4cfb5 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.mixins; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; @@ -18,7 +19,7 @@ import net.minecraft.item.tooltip.TooltipAppender; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import java.util.List; +import java.util.function.Consumer; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; @@ -26,10 +27,8 @@ 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.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ItemStack.class) public abstract class ItemStackMixin implements ComponentHolder, SkyblockerStack { @@ -66,21 +65,21 @@ public abstract class ItemStackMixin implements ComponentHolder, SkyblockerStack return original; } - @ModifyVariable(method = "appendTooltip", at = @At("STORE")) - private TooltipAppender skyblocker$hideVanillaEnchants(TooltipAppender original) { - return Utils.isOnSkyblock() && original instanceof ItemEnchantmentsComponent component ? component.withShowInTooltip(false) : original; + @ModifyExpressionValue(method = "appendComponentTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/component/type/TooltipDisplayComponent;shouldDisplay(Lnet/minecraft/component/ComponentType;)Z")) + private boolean skyblocker$hideVanillaEnchants(boolean shouldDisplay, @Local TooltipAppender component) { + return shouldDisplay && !(Utils.isOnSkyblock() && component instanceof ItemEnchantmentsComponent); } - @Inject(method = "getTooltip", + @Inject(method = "appendTooltip", slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/registry/DefaultedRegistry;getId(Ljava/lang/Object;)Lnet/minecraft/util/Identifier;")), - at = @At(value = "INVOKE", target = "Ljava/util/List;add(Ljava/lang/Object;)Z", shift = At.Shift.AFTER, ordinal = 0) + at = @At(value = "INVOKE", target = "Ljava/util/function/Consumer;accept(Ljava/lang/Object;)V", shift = At.Shift.AFTER, ordinal = 0) ) - private void skyblocker$skyblockIdTooltip(CallbackInfoReturnable> cir, @Local List lines) { + private void skyblocker$skyblockIdTooltip(CallbackInfo ci, @Local(argsOnly = true) Consumer textConsumer) { if (Utils.isOnSkyblock()) { String skyblockId = getSkyblockId(); if (!skyblockId.isEmpty()) { - lines.add(Text.literal("skyblock:" + skyblockId).formatted(Formatting.DARK_GRAY)); + textConsumer.accept(Text.literal("skyblock:" + skyblockId).formatted(Formatting.DARK_GRAY)); } } } diff --git a/src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java b/src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java deleted file mode 100644 index 87d591de..00000000 --- a/src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.hysky.skyblocker.mixins; - -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; - -import de.hysky.skyblocker.utils.render.SkyblockerRenderLayers; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderPhase.DepthTest; - -@Mixin(RenderLayer.MultiPhase.class) -public class RenderLayerMultiPhaseMixin { - - @ModifyExpressionValue(method = "method_34844", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/RenderLayer$MultiPhase;ALWAYS_DEPTH_TEST:Lnet/minecraft/client/render/RenderPhase$DepthTest;", opcode = Opcodes.GETSTATIC)) - private static DepthTest skyblocker$modifyDepthTestForOutlineLayer(DepthTest depthTest) { - return SkyblockerRenderLayers.OUTLINE_ALWAYS; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java b/src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java deleted file mode 100644 index 7595d3e2..00000000 --- a/src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.hysky.skyblocker.mixins; - -import org.lwjgl.opengl.GL11; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.systems.RenderSystem; - -import de.hysky.skyblocker.skyblock.entity.MobGlow; - -import net.minecraft.client.render.RenderPhase; - -@Mixin(RenderPhase.DepthTest.class) -public class RenderPhaseDepthTestMixin { - - @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/RenderPhase;(Ljava/lang/String;Ljava/lang/Runnable;Ljava/lang/Runnable;)V"), index = 1) - private static Runnable skyblocker$modifyOutlineAlwaysStartAction(Runnable original, @Local(argsOnly = true) String depthFunctionName) { - if (depthFunctionName.equals("outline_always")) { - return () -> { - if (MobGlow.atLeastOneMobHasCustomGlow()) { - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL11.GL_LEQUAL); - } - }; - } - - return original; - } - - @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/RenderPhase;(Ljava/lang/String;Ljava/lang/Runnable;Ljava/lang/Runnable;)V"), index = 2) - private static Runnable skyblocker$modifyOutlineAlwaysEndAction(Runnable original, @Local(argsOnly = true) String depthFunctionName) { - if (depthFunctionName.equals("outline_always")) { - return () -> { - if (MobGlow.atLeastOneMobHasCustomGlow()) { - RenderSystem.disableDepthTest(); - RenderSystem.depthFunc(GL11.GL_LEQUAL); - } - }; - } - - return original; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixins/RenderPipelineMixin.java b/src/main/java/de/hysky/skyblocker/mixins/RenderPipelineMixin.java new file mode 100644 index 00000000..21251e8d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/RenderPipelineMixin.java @@ -0,0 +1,20 @@ +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 com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.platform.DepthTestFunction; + +import de.hysky.skyblocker.skyblock.entity.MobGlow; +import net.minecraft.client.gl.RenderPipelines; + +@Mixin(RenderPipeline.class) +public class RenderPipelineMixin { + + @ModifyReturnValue(method = "getDepthTestFunction", at = @At("RETURN")) + private DepthTestFunction skyblocker$modifyGlowDepthTest(DepthTestFunction original) { + return ((Object) this == RenderPipelines.OUTLINE_CULL || (Object) this == RenderPipelines.OUTLINE_NO_CULL) && MobGlow.atLeastOneMobHasCustomGlow() ? DepthTestFunction.LEQUAL_DEPTH_TEST : original; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java index 5b3e3aff..289b4876 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java @@ -11,6 +11,8 @@ 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.dungeon.LividColor; import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes; @@ -41,10 +43,14 @@ public class WorldRendererMixin { @Inject(method = "method_62214", slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;canDrawEntityOutlines()Z")), - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;clear()V", ordinal = 0, shift = At.Shift.AFTER) + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/CommandEncoder;clearColorAndDepthTextures(Lcom/mojang/blaze3d/textures/GpuTexture;ILcom/mojang/blaze3d/textures/GpuTexture;D)V", ordinal = 0, shift = At.Shift.AFTER) ) - private void skyblocker$copyFramebufferDepth2AdjustGlowVisibility(CallbackInfo ci) { - if (MobGlow.atLeastOneMobHasCustomGlow()) framebufferSet.entityOutlineFramebuffer.get().copyDepthFrom(client.getFramebuffer()); + private void skyblocker$copyFramebufferDepth2AdjustGlowVisibility(CallbackInfo ci, @Share(namespace = "c", value = "copiedOutlineDepth") LocalBooleanRef copiedOutlineDepth) { + if (MobGlow.atLeastOneMobHasCustomGlow() && !copiedOutlineDepth.get()) { + framebufferSet.entityOutlineFramebuffer.get().copyDepthFrom(client.getFramebuffer()); + //Ensures that the depth isn't copied multiple times with other mods since copying it multiple times just wastes performance + copiedOutlineDepth.set(true); + } } @ModifyVariable(method = "renderEntities", diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java index 2c46b16b..35b89bbe 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(BeaconBlockEntityRenderer.class) public interface BeaconBlockEntityRendererInvoker { @Invoker("renderBeam") - static void renderBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, float tickDelta, long worldTime, int yOffset, int maxY, int color) { + static void renderBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, float tickDelta, float scale, long worldTime, int yOffset, int maxY, int 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 index 5d516be2..33145b47 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java @@ -15,6 +15,6 @@ import java.util.List; @Mixin(DrawContext.class) public interface DrawContextInvoker { - @Invoker + @Invoker void invokeDrawTooltip(TextRenderer textRenderer, List components, int x, int y, TooltipPositioner positioner, @Nullable Identifier texture); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/HealthBars.java b/src/main/java/de/hysky/skyblocker/skyblock/HealthBars.java index 8b73bd8d..cef7a84b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/HealthBars.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/HealthBars.java @@ -209,7 +209,7 @@ public class HealthBars { Color emptyColor = SkyblockerConfigManager.get().uiAndVisuals.healthBars.emptyBarColor; boolean hideFullHealth = SkyblockerConfigManager.get().uiAndVisuals.healthBars.hideFullHealth; float scale = SkyblockerConfigManager.get().uiAndVisuals.healthBars.scale; - float tickDelta = context.tickCounter().getTickDelta(false); + float tickDelta = context.tickCounter().getTickProgress(false); float width = scale; float height = scale * 0.1f; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/NightVisionCommand.java b/src/main/java/de/hysky/skyblocker/skyblock/NightVisionCommand.java index 7fa9d780..c5349555 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/NightVisionCommand.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/NightVisionCommand.java @@ -5,7 +5,6 @@ import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.context.CommandContext; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.annotations.Init; -import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.config.SkyblockerConfigManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; @@ -32,9 +31,8 @@ public class NightVisionCommand { } private static int writeStrength(CommandContext context, int strength) { - SkyblockerConfigManager.get().uiAndVisuals.nightVisionStrength = strength; + SkyblockerConfigManager.update(config -> config.uiAndVisuals.nightVisionStrength = strength); context.getSource().sendFeedback(Text.translatable("skyblocker.nightVision.success", strength)); - SkyblockerConfigManager.save(); return 1; } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/SmoothAOTE.java b/src/main/java/de/hysky/skyblocker/skyblock/SmoothAOTE.java index 73def44c..a98b2705 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/SmoothAOTE.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/SmoothAOTE.java @@ -84,7 +84,7 @@ public class SmoothAOTE { * @return the range with tuner */ private static int extractTunedCustomData(NbtCompound customData, int baseRange) { - return customData != null && customData.contains("tuned_transmission") ? baseRange + customData.getInt("tuned_transmission") : baseRange; + return customData != null && customData.contains("tuned_transmission") ? baseRange + customData.getInt("tuned_transmission", 0) : baseRange; } /** @@ -193,7 +193,7 @@ public class SmoothAOTE { return; } case "ASPECT_OF_THE_END", "ASPECT_OF_THE_VOID" -> { - if (CLIENT.options.sneakKey.isPressed() && customData.getInt("ethermerge") == 1) { + if (CLIENT.options.sneakKey.isPressed() && customData.getInt("ethermerge", 0) == 1) { if (SkyblockerConfigManager.get().uiAndVisuals.smoothAOTE.enableEtherTransmission) { distance = extractTunedCustomData(customData, 57); break; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java b/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java index e6405ae1..d5787d00 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/StatusBarTracker.java @@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.PetInfo; +import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.RegexUtils; import de.hysky.skyblocker.utils.Utils; @@ -128,7 +129,7 @@ public class StatusBarTracker { if (client.player.getMainHandStack().getName().getString().contains("Cactus Knife") && Utils.getLocation() == Location.GARDEN) { max = 500; } - Iterable armor = client.player.getArmorItems(); + Iterable armor = ItemUtils.getArmor(client.player); int youngDragCount = 0; for (ItemStack armorPiece : armor) { if (armorPiece.getName().getString().contains("Racing Helmet")) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java index f1e9840f..416b7c07 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java @@ -46,7 +46,7 @@ public class TeleportOverlay { } } case "ASPECT_OF_THE_END", "ASPECT_OF_THE_VOID" -> { - if (SkyblockerConfigManager.get().uiAndVisuals.teleportOverlay.enableEtherTransmission && client.options.sneakKey.isPressed() && customData.getInt("ethermerge") == 1) { + if (SkyblockerConfigManager.get().uiAndVisuals.teleportOverlay.enableEtherTransmission && client.options.sneakKey.isPressed() && customData.getInt("ethermerge", 0) == 1) { render(wrc, customData, 57); } else if (SkyblockerConfigManager.get().uiAndVisuals.teleportOverlay.enableInstantTransmission) { render(wrc, customData, 8); @@ -75,7 +75,7 @@ public class TeleportOverlay { * Renders the teleport overlay with a given base range and the tuned transmission stat. */ private static void render(WorldRenderContext wrc, NbtCompound customData, int baseRange) { - render(wrc, customData != null && customData.contains("tuned_transmission") ? baseRange + customData.getInt("tuned_transmission") : baseRange); + render(wrc, customData != null && customData.contains("tuned_transmission") ? baseRange + customData.getInt("tuned_transmission", 0) : baseRange); } /** @@ -87,7 +87,7 @@ public class TeleportOverlay { if (client.crosshairTarget != null && client.crosshairTarget.getType() == HitResult.Type.BLOCK && client.crosshairTarget instanceof BlockHitResult blockHitResult && client.crosshairTarget.getPos().isInRange(client.player.getPos(), range)) { render(wrc, blockHitResult); } else if (client.interactionManager != null && range > client.player.getAttributeInstance(EntityAttributes.BLOCK_INTERACTION_RANGE).getValue()) { - HitResult result = client.player.raycast(range, wrc.tickCounter().getTickDelta(true), false); + HitResult result = client.player.raycast(range, wrc.tickCounter().getTickProgress(true), false); if (result.getType() == HitResult.Type.BLOCK && result instanceof BlockHitResult blockHitResult) { render(wrc, blockHitResult); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/Tips.java b/src/main/java/de/hysky/skyblocker/skyblock/Tips.java index b2e328ad..a675ffb3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/Tips.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/Tips.java @@ -16,6 +16,7 @@ import net.minecraft.command.CommandRegistryAccess; import net.minecraft.text.ClickEvent; import net.minecraft.text.Text; +import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -75,7 +76,14 @@ public class Tips { } private static Supplier getTipFactory(@Translatable String key, ClickEvent.Action clickAction, String value) { - return () -> Text.translatable(key).styled(style -> style.withClickEvent(new ClickEvent(clickAction, value))); + ClickEvent event = switch (clickAction) { + case ClickEvent.Action.SUGGEST_COMMAND -> new ClickEvent.SuggestCommand(value); + case ClickEvent.Action.OPEN_URL -> new ClickEvent.OpenUrl(URI.create(value)); + + default -> throw new IllegalArgumentException("Unexpected value: " + clickAction); + }; + + return () -> Text.translatable(key).styled(style -> style.withClickEvent(event)); } @Init @@ -95,16 +103,14 @@ public class Tips { } private static int enableTips(CommandContext context) { - SkyblockerConfigManager.get().general.enableTips = true; - SkyblockerConfigManager.save(); - context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.tips.enabled")).append(" ").append(Text.translatable("skyblocker.tips.clickDisable").styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/skyblocker tips disable"))))); + SkyblockerConfigManager.update(config -> config.general.enableTips = true); + context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.tips.enabled")).append(" ").append(Text.translatable("skyblocker.tips.clickDisable").styled(style -> style.withClickEvent(new ClickEvent.RunCommand("/skyblocker tips disable"))))); return Command.SINGLE_SUCCESS; } private static int disableTips(CommandContext context) { - SkyblockerConfigManager.get().general.enableTips = false; - SkyblockerConfigManager.save(); - context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.tips.disabled")).append(" ").append(Text.translatable("skyblocker.tips.clickEnable").styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/skyblocker tips enable"))))); + SkyblockerConfigManager.update(config -> config.general.enableTips = false); + context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.tips.disabled")).append(" ").append(Text.translatable("skyblocker.tips.clickEnable").styled(style -> style.withClickEvent(new ClickEvent.RunCommand("/skyblocker tips enable"))))); return Command.SINGLE_SUCCESS; } @@ -150,10 +156,10 @@ public class Tips { private static Text tipMessage(Text tip) { return Constants.PREFIX.get().append(tip) .append(" ") - .append(Text.translatable("skyblocker.tips.clickPreviousTip").styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/skyblocker tips previous")))) + .append(Text.translatable("skyblocker.tips.clickPreviousTip").styled(style -> style.withClickEvent(new ClickEvent.RunCommand("/skyblocker tips previous")))) .append(" ") - .append(Text.translatable("skyblocker.tips.clickNextTip").styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/skyblocker tips next")))) + .append(Text.translatable("skyblocker.tips.clickNextTip").styled(style -> style.withClickEvent(new ClickEvent.RunCommand("/skyblocker tips next")))) .append(" ") - .append(Text.translatable("skyblocker.tips.clickDisable").styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/skyblocker tips disable")))); + .append(Text.translatable("skyblocker.tips.clickDisable").styled(style -> style.withClickEvent(new ClickEvent.RunCommand("/skyblocker tips disable")))); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatPositionShare.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatPositionShare.java index 71f34a94..031161a4 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatPositionShare.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatPositionShare.java @@ -73,8 +73,8 @@ public class ChatPositionShare { String command = "/skyblocker waypoints individual " + x + " " + y + " " + z + " " + area; MutableText requestMessage = Constants.PREFIX.get().append(Text.translatable("skyblocker.config.chat.waypoints.display").formatted(Formatting.AQUA) .styled(style -> style - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.translatable("skyblocker.config.chat.waypoints.display"))) - .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, command.trim())) + .withHoverEvent(new HoverEvent.ShowText(Text.translatable("skyblocker.config.chat.waypoints.display"))) + .withClickEvent(new ClickEvent.RunCommand(command.trim())) ) ); if (!area.isEmpty()) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ConfirmationPromptHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ConfirmationPromptHelper.java index 7f4a7f46..43617774 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ConfirmationPromptHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ConfirmationPromptHelper.java @@ -52,8 +52,8 @@ public class ConfirmationPromptHelper { ClickEvent event = style.getClickEvent(); //Check to see if its a yes and has the proper command - if (asString.equals("§a§l[YES]") && event != null && event.getAction() == ClickEvent.Action.RUN_COMMAND && event.getValue().startsWith("/chatprompt")) { - return Optional.of(event.getValue()); + if (asString.equals("§a§l[YES]") && event instanceof ClickEvent.RunCommand(String command) && command.startsWith("/chatprompt")) { + return Optional.of(command); } return Optional.empty(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java index a1d011ad..454b4c16 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java @@ -130,7 +130,7 @@ public class EggFinder { } private static void handleArmorStand(ArmorStandEntity armorStand) { - for (ItemStack itemStack : armorStand.getArmorItems()) { + for (ItemStack itemStack : ItemUtils.getArmor(armorStand)) { ItemUtils.getHeadTextureOptional(itemStack).ifPresent(texture -> { for (EggType type : EggType.entries) { //Compare blockPos rather than entity to avoid incorrect matches when the entity just moves rather than a new one being spawned elsewhere if (texture.equals(type.texture) && (type.egg == null || !type.egg.entity.getBlockPos().equals(armorStand.getBlockPos()))) { @@ -218,8 +218,8 @@ public class EggFinder { .append(Text.literal("Chocolate " + this + " Egg") .withColor(color)) .append(" at " + egg.entity.getBlockPos().up(2).toShortString() + "!") - .styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/skyblocker eggFinder shareLocation " + PosUtils.toSpaceSeparatedString(egg.pos) + " " + this)) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal("Click to share the location in chat!").formatted(Formatting.GREEN)))), false); + .styled(style -> style.withClickEvent(new ClickEvent.RunCommand("/skyblocker eggFinder shareLocation " + PosUtils.toSpaceSeparatedString(egg.pos) + " " + this)) + .withHoverEvent(new HoverEvent.ShowText(Text.literal("Click to share the location in chat!").formatted(Formatting.GREEN)))), false); } @Override diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/ControlTestHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/ControlTestHelper.java index f63d2fa2..4a56cbdc 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/ControlTestHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/ControlTestHelper.java @@ -64,7 +64,7 @@ public class ControlTestHelper { */ protected static void render(WorldRenderContext context) { if (CLIENT.player != null && correctWitherSkeleton != null && pingOffset != null && lastPingOffset != null) { - float tickDelta = context.tickCounter().getTickDelta(false); + float tickDelta = context.tickCounter().getTickProgress(false); //how long until net update double updatePercent = (double) (System.currentTimeMillis() - lastUpdate) / 150; Vec3d aimPos = correctWitherSkeleton.getCameraPosVec(tickDelta).add(pingOffset.multiply(updatePercent)).add(lastPingOffset.multiply(1 - updatePercent)); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/ForceTestHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/ForceTestHelper.java index e521a59e..fd906217 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/ForceTestHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/ForceTestHelper.java @@ -74,7 +74,7 @@ public class ForceTestHelper { text = text.formatted(Formatting.RED); } - Vec3d labelPos = zombie.getKey().getCameraPosVec(context.tickCounter().getTickDelta(false)); + Vec3d labelPos = zombie.getKey().getCameraPosVec(context.tickCounter().getTickProgress(false)); RenderHelper.renderText(context, text, labelPos, 1.5f, 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 471dc753..548ba51b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java @@ -49,7 +49,7 @@ public class DungeonMap { MinecraftClient client = MinecraftClient.getInstance(); if (client.player == null || client.world == null) return; - MapIdComponent mapId = getMapIdComponent(client.player.getInventory().main.get(8)); + MapIdComponent mapId = getMapIdComponent(client.player.getInventory().getMainStacks().get(8)); MapState state = FilledMapItem.getMapState(mapId, client.world); if (state == null) return; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java index ee3f747a..c434ec6a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java @@ -66,11 +66,12 @@ public class DungeonMapConfigScreen extends Screen { @Override public void close() { - SkyblockerConfigManager.get().dungeons.dungeonMap.mapX = mapX; - SkyblockerConfigManager.get().dungeons.dungeonMap.mapY = mapY; - SkyblockerConfigManager.get().dungeons.dungeonScore.scoreX = scoreX; - SkyblockerConfigManager.get().dungeons.dungeonScore.scoreY = scoreY; - SkyblockerConfigManager.save(); + SkyblockerConfigManager.update(config -> { + config.dungeons.dungeonMap.mapX = mapX; + config.dungeons.dungeonMap.mapY = mapY; + config.dungeons.dungeonScore.scoreX = scoreX; + config.dungeons.dungeonScore.scoreY = scoreY; + }); this.client.setScreen(parent); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java index 56ae089d..6ffee41d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java @@ -9,6 +9,7 @@ import de.hysky.skyblocker.events.DungeonEvents; import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager; import de.hysky.skyblocker.utils.Constants; +import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.ProfileUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.mayor.MayorUtils; @@ -21,10 +22,10 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.mob.ZombieEntity; import net.minecraft.item.ItemStack; import net.minecraft.sound.SoundEvents; -import net.minecraft.util.collection.DefaultedList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -204,7 +205,7 @@ public class DungeonScore { public static boolean isEntityMimic(Entity entity) { if (!Utils.isInDungeons() || !floorHasMimics || !(entity instanceof ZombieEntity zombie) || !zombie.isBaby()) return false; try { - DefaultedList armor = (DefaultedList) zombie.getArmorItems(); + List armor = ItemUtils.getArmor(zombie); return armor.stream().allMatch(ItemStack::isEmpty); } catch (Exception e) { LOGGER.error("[Skyblocker] Failed to check if entity is a mimic!", e); 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 63e71abe..ba3d481a 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 @@ -488,7 +488,7 @@ public class DungeonManager { context.getSource().sendError(Constants.PREFIX.get().append("§cFailed to get player or world.")); return Command.SINGLE_SUCCESS; } - ItemStack stack = client.player.getInventory().main.get(8); + ItemStack stack = client.player.getInventory().getMainStacks().get(8); if (!stack.isOf(Items.FILLED_MAP)) { context.getSource().sendError(Constants.PREFIX.get().append("§cFailed to get dungeon map.")); return Command.SINGLE_SUCCESS; @@ -578,7 +578,7 @@ public class DungeonManager { currentRoom = newRoom(Room.Type.ENTRANCE, physicalEntrancePos); } - MapState map = FilledMapItem.getMapState(DungeonMap.getMapIdComponent(client.player.getInventory().main.get(8)), client.world); + MapState map = FilledMapItem.getMapState(DungeonMap.getMapIdComponent(client.player.getInventory().getMainStacks().get(8)), client.world); if (map == null) { return; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java index dcc4a187..ed08e647 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java @@ -115,7 +115,7 @@ public class SecretsTracker { private static Text getCacheText(boolean cached, int cacheAge) { return Text.literal("\u2139").styled(style -> style.withColor(cached ? 0xeac864 : 0x218bff).withHoverEvent( - new HoverEvent(HoverEvent.Action.SHOW_TEXT, cached ? Text.translatable("skyblocker.api.cache.HIT", cacheAge) : Text.translatable("skyblocker.api.cache.MISS")))); + new HoverEvent.ShowText(cached ? Text.translatable("skyblocker.api.cache.HIT", cacheAge) : Text.translatable("skyblocker.api.cache.MISS")))); } private static void onMessage(Text text, boolean overlay) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java index 6cbb86ec..3b3fe2cb 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java @@ -66,14 +66,14 @@ public final class ColorTerminal extends SimpleContainerSolver implements Termin static { colorFromName = new HashMap<>(); for (DyeColor color : DyeColor.values()) - colorFromName.put(color.getName().toUpperCase(Locale.ENGLISH), color); + colorFromName.put(color.getId().toUpperCase(Locale.ENGLISH), color); colorFromName.put("SILVER", DyeColor.LIGHT_GRAY); colorFromName.put("LIGHT BLUE", DyeColor.LIGHT_BLUE); itemColor = new HashMap<>(); for (DyeColor color : DyeColor.values()) for (String item : new String[]{"dye", "wool", "stained_glass", "terracotta"}) - itemColor.put(Registries.ITEM.get(Identifier.ofVanilla(color.getName() + '_' + item)), color); + itemColor.put(Registries.ITEM.get(Identifier.ofVanilla(color.getId() + '_' + item)), color); itemColor.put(Items.BONE_MEAL, DyeColor.WHITE); itemColor.put(Items.LAPIS_LAZULI, DyeColor.BLUE); itemColor.put(Items.COCOA_BEANS, DyeColor.BROWN); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CorpseFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CorpseFinder.java index 3f4ec90a..d491c74f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CorpseFinder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CorpseFinder.java @@ -180,8 +180,8 @@ public class CorpseFinder { .append(Text.literal(WordUtils.capitalizeFully(corpse.corpseType.asString()) + " Corpse") .withColor(corpse.corpseType.color.getColorValue())) .append(" at " + corpse.entity.getBlockPos().up().toShortString() + "!") - .st