From 47762af855ae29bd0742f2beff7c6b81523f9fec Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Tue, 22 Oct 2024 17:25:12 -0400 Subject: Fix Equipment Slot Highlights and Improve Beacon Highlighter --- .../mixins/ClientPlayNetworkHandlerMixin.java | 13 -------- .../hysky/skyblocker/mixins/ClientWorldMixin.java | 26 ++++++++++----- .../mixins/accessors/HandledScreenAccessor.java | 38 ++++++++++++++-------- .../skyblocker/skyblock/end/BeaconHighlighter.java | 6 ++-- .../skyblock/item/SkyblockInventoryScreen.java | 9 +++-- 5 files changed, 51 insertions(+), 41 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java index c03588db..fe35e7d2 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java @@ -14,14 +14,11 @@ import de.hysky.skyblocker.skyblock.dungeon.DungeonScore; import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager; import de.hysky.skyblocker.skyblock.dwarven.WishingCompassSolver; import de.hysky.skyblocker.skyblock.dwarven.CrystalsChestHighlighter; -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.slayers.SlayerEntitiesGlow; 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; @@ -48,16 +45,6 @@ public abstract class ClientPlayNetworkHandlerMixin { @Final private static Logger LOGGER; - @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_64896", 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) { diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientWorldMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientWorldMixin.java index a4bd14b8..28b2c7dc 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ClientWorldMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ClientWorldMixin.java @@ -3,8 +3,11 @@ package de.hysky.skyblocker.mixins; import de.hysky.skyblocker.skyblock.crimson.dojo.DojoManager; import de.hysky.skyblocker.skyblock.dungeon.device.SimonSays; import de.hysky.skyblocker.skyblock.dwarven.CrystalsChestHighlighter; +import de.hysky.skyblocker.skyblock.end.BeaconHighlighter; +import de.hysky.skyblocker.utils.SlayerUtils; import de.hysky.skyblocker.utils.Utils; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.client.world.ClientWorld; import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; @@ -21,14 +24,19 @@ public class ClientWorldMixin { * @implNote The {@code pos} can be mutable when this is called by chunk delta updates, so if you want to copy it into memory * (e.g. store it in a field/list/map) make sure to duplicate it via {@link BlockPos#toImmutable()}. */ - @Inject(method = "handleBlockUpdate", at = @At("RETURN")) - private void skyblocker$handleBlockUpdate(CallbackInfo ci, @Local(argsOnly = true) BlockPos pos, @Local(argsOnly = true) BlockState state) { - if (Utils.isInCrimson()) { - DojoManager.onBlockUpdate(pos.toImmutable(), state); - } else if (Utils.isInCrystalHollows()) { - CrystalsChestHighlighter.onBlockUpdate(pos.toImmutable(), state); - } + //TODO might be worth creating an event for this + @Inject(method = "handleBlockUpdate", at = @At("RETURN")) + private void skyblocker$handleBlockUpdate(CallbackInfo ci, @Local(argsOnly = true) BlockPos pos, @Local(argsOnly = true) BlockState state) { + if (Utils.isInCrimson()) { + DojoManager.onBlockUpdate(pos.toImmutable(), state); + } else if (Utils.isInCrystalHollows()) { + CrystalsChestHighlighter.onBlockUpdate(pos.toImmutable(), state); + } else if (Utils.isInTheEnd() && SlayerUtils.isInSlayer()) { + BeaconHighlighter.beaconPositions.remove(pos); - SimonSays.onBlockUpdate(pos, state); - } + if (state.isOf(Blocks.BEACON)) BeaconHighlighter.beaconPositions.add(pos.toImmutable()); + } + + SimonSays.onBlockUpdate(pos, state); + } } diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java index 9a2a8311..bd933fd6 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java @@ -3,28 +3,40 @@ package de.hysky.skyblocker.mixins.accessors; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; +import net.minecraft.util.Identifier; + 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("x") + int getX(); + + @Accessor("y") + int getY(); + + @Accessor + int getBackgroundWidth(); - @Accessor("y") - int getY(); + @Accessor + int getBackgroundHeight(); - @Accessor - int getBackgroundWidth(); + @Mutable + @Accessor("handler") + void setHandler(ScreenHandler handler); - @Accessor - int getBackgroundHeight(); + @Accessor("focusedSlot") + Slot getFocusedSlot(); - @Mutable - @Accessor("handler") - void setHandler(ScreenHandler handler); + @Accessor + static Identifier getSLOT_HIGHLIGHT_BACK_TEXTURE() { + throw new UnsupportedOperationException(); + } - @Accessor("focusedSlot") - Slot getFocusedSlot(); + @Accessor + static Identifier getSLOT_HIGHLIGHT_FRONT_TEXTURE() { + throw new UnsupportedOperationException(); + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java b/src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java index cc487424..0296f52d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/end/BeaconHighlighter.java @@ -4,6 +4,7 @@ import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.RenderHelper; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; 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.WorldRenderContext; @@ -11,11 +12,8 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; -import java.util.ArrayList; -import java.util.List; - public class BeaconHighlighter { - public static final List beaconPositions = new ArrayList<>(); + public static final ObjectOpenHashSet beaconPositions = new ObjectOpenHashSet<>(); private static final float[] RED_COLOR_COMPONENTS = { 1.0f, 0.0f, 0.0f }; /** diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java index 7892b864..fedb2ce8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/SkyblockInventoryScreen.java @@ -4,6 +4,7 @@ import com.mojang.serialization.Codec; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.events.SkyblockEvents; +import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.mixins.accessors.SlotAccessor; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; @@ -134,9 +135,13 @@ public class SkyblockInventoryScreen extends InventoryScreen { @Override protected void drawForeground(DrawContext context, int mouseX, int mouseY) { for (Slot equipmentSlot : equipmentSlots) { + boolean hovered = isPointWithinBounds(equipmentSlot.x, equipmentSlot.y, 16, 16, mouseX, mouseY); + + if (hovered) context.drawGuiTexture(RenderLayer::getGuiTextured, HandledScreenAccessor.getSLOT_HIGHLIGHT_BACK_TEXTURE(), equipmentSlot.x - 4, equipmentSlot.y - 4, 24, 24);; + drawSlot(context, equipmentSlot); - //FIXME maybe this is not needed? - //if (isPointWithinBounds(equipmentSlot.x, equipmentSlot.y, 16, 16, mouseX, mouseY)) drawSlotHighlight(context, equipmentSlot.x, equipmentSlot.y, 0); + + if (hovered) context.drawGuiTexture(RenderLayer::getGuiTexturedOverlay, HandledScreenAccessor.getSLOT_HIGHLIGHT_FRONT_TEXTURE(), equipmentSlot.x - 4, equipmentSlot.y - 4, 24, 24); } super.drawForeground(context, mouseX, mouseY); -- cgit