diff --git a/src/main/java/net/ramixin/visibletraders/ducks/ClientMerchantMenuDuck.java b/src/main/java/net/ramixin/visibletraders/ducks/ClientMerchantMenuDuck.java index f4e4517..dea515f 100644 --- a/src/main/java/net/ramixin/visibletraders/ducks/ClientMerchantMenuDuck.java +++ b/src/main/java/net/ramixin/visibletraders/ducks/ClientMerchantMenuDuck.java @@ -11,6 +11,10 @@ public interface ClientMerchantMenuDuck { void visibleTraders$enableCombinedOffers(); + void visibleTraders$beginCombinedOffersScope(); + + void visibleTraders$endCombinedOffersScope(); + static ClientMerchantMenuDuck of(MerchantMenu screen) { return (ClientMerchantMenuDuck) screen; } diff --git a/src/main/java/net/ramixin/visibletraders/mixins/client/MerchantMenuMixin.java b/src/main/java/net/ramixin/visibletraders/mixins/client/MerchantMenuMixin.java index 4911291..5b643c1 100644 --- a/src/main/java/net/ramixin/visibletraders/mixins/client/MerchantMenuMixin.java +++ b/src/main/java/net/ramixin/visibletraders/mixins/client/MerchantMenuMixin.java @@ -1,6 +1,7 @@ package net.ramixin.visibletraders.mixins.client; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import net.minecraft.world.inventory.MerchantMenu; import net.minecraft.world.item.trading.Merchant; import net.minecraft.world.item.trading.MerchantOffers; @@ -11,7 +12,6 @@ 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.Optional; @@ -28,6 +28,9 @@ public abstract class MerchantMenuMixin implements ClientMerchantMenuDuck { @Unique private boolean useCombinedOffers = false; + @Unique + private int combinedOffersScopeDepth = 0; + @Override public void visibleTraders$setLockedTradeOffers(Optional maybeOffers) { MerchantOffers combined = new MerchantOffers(); @@ -41,12 +44,25 @@ public abstract class MerchantMenuMixin implements ClientMerchantMenuDuck { useCombinedOffers = true; } - @ModifyReturnValue(method = "getOffers", at = @At("RETURN")) - private MerchantOffers useCombinedOffersIfEnabled(MerchantOffers original) { + @Override + public void visibleTraders$beginCombinedOffersScope() { + combinedOffersScopeDepth++; + } + + @Override + public void visibleTraders$endCombinedOffersScope() { + combinedOffersScopeDepth = Math.max(0, combinedOffersScopeDepth - 1); + } + + @WrapMethod(method = "getOffers") + private MerchantOffers useCombinedOffersIfEnabled(Operation original) { + if(combinedOffersScopeDepth > 0 && combinedOffers.get() != null) { + return combinedOffers.get(); + } if(useCombinedOffers && combinedOffers.get() != null) { useCombinedOffers = false; return combinedOffers.get(); } - return original; + return original.call(); } } diff --git a/src/main/java/net/ramixin/visibletraders/mixins/client/TradeOfferButtonMixin.java b/src/main/java/net/ramixin/visibletraders/mixins/client/TradeOfferButtonMixin.java index 5a9d9d2..62dfc8c 100644 --- a/src/main/java/net/ramixin/visibletraders/mixins/client/TradeOfferButtonMixin.java +++ b/src/main/java/net/ramixin/visibletraders/mixins/client/TradeOfferButtonMixin.java @@ -1,22 +1,30 @@ package net.ramixin.visibletraders.mixins.client; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.inventory.MerchantScreen; -import net.minecraft.world.inventory.MerchantMenu; -import net.minecraft.world.item.trading.MerchantOffers; import net.ramixin.visibletraders.ducks.ClientMerchantMenuDuck; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.Shadow; @Mixin(MerchantScreen.TradeOfferButton.class) public class TradeOfferButtonMixin { - @WrapOperation(method = "extractToolTip", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/MerchantMenu;getOffers()Lnet/minecraft/world/item/trading/MerchantOffers;")) - private MerchantOffers enabledCombinedOffersForMouseDragged(MerchantMenu instance, Operation original) { - ClientMerchantMenuDuck duck = (ClientMerchantMenuDuck) instance; - duck.visibleTraders$enableCombinedOffers(); - return original.call(instance); + @Shadow + @Final + private MerchantScreen this$0; + + @WrapMethod(method = "extractToolTip") + private void useCombinedOffersWhileExtractingTooltip(GuiGraphicsExtractor graphics, int mouseX, int mouseY, Operation original) { + ClientMerchantMenuDuck duck = (ClientMerchantMenuDuck) this.this$0.getMenu(); + duck.visibleTraders$beginCombinedOffersScope(); + try { + original.call(graphics, mouseX, mouseY); + } finally { + duck.visibleTraders$endCombinedOffersScope(); + } }