From 3589206746964313d374510aa17d29972387e8d4 Mon Sep 17 00:00:00 2001 From: CammiePone Date: Sat, 2 Nov 2024 03:01:21 -0700 Subject: [PATCH] added ItemMenuInteractionEvent --- .../api/event/ItemMenuInteractionEvent.java | 32 +++++++++++++++++++ .../mixin/AbstractContainerMenuMixin.java | 8 +++++ .../sparkweave/testmod/SparkweaveTestmod.java | 17 ++++++++++ .../mixin/AbstractContainerMenuMixin.java | 27 ++++++++++++++++ .../resources/sparkweave.fabric.mixins.json | 1 + .../mixin/AbstractContainerMenuMixin.java | 29 +++++++++++++++++ .../resources/sparkweave.neoforge.mixins.json | 3 +- 7 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 Common/src/main/java/dev/upcraft/sparkweave/api/event/ItemMenuInteractionEvent.java create mode 100644 Common/src/main/java/dev/upcraft/sparkweave/mixin/AbstractContainerMenuMixin.java create mode 100644 Fabric/src/main/java/dev/upcraft/sparkweave/fabric/mixin/AbstractContainerMenuMixin.java create mode 100644 NeoForge/src/main/java/dev/upcraft/sparkweave/neoforge/mixin/AbstractContainerMenuMixin.java diff --git a/Common/src/main/java/dev/upcraft/sparkweave/api/event/ItemMenuInteractionEvent.java b/Common/src/main/java/dev/upcraft/sparkweave/api/event/ItemMenuInteractionEvent.java new file mode 100644 index 0000000..d6a8d4d --- /dev/null +++ b/Common/src/main/java/dev/upcraft/sparkweave/api/event/ItemMenuInteractionEvent.java @@ -0,0 +1,32 @@ +package dev.upcraft.sparkweave.api.event; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public interface ItemMenuInteractionEvent { + Event EVENT = Event.create(ItemMenuInteractionEvent.class, listeners -> (menu, player, level, clickAction, slot, slotStack, cursorStack) -> { + for(ItemMenuInteractionEvent listener : listeners) { + boolean cancel = listener.interactWithItemInMenu(menu, player, level, clickAction, slot, slotStack, cursorStack); + + if(cancel) + return true; + } + + return false; + }); + + /** + * @param menu The menu the player is in + * @param player The player doing the interaction + * @param clickAction The mouse button being clicked + * @param slot The slot the item being interacted with is in + * @param slotStack The {@link ItemStack} in the menu that's being interacted with + * @param cursorStack The {@link ItemStack} currently being held by the user's cursor + * @return Whether to cancel the normal interaction that would happen + */ + boolean interactWithItemInMenu(AbstractContainerMenu menu, Player player, Level level, ClickAction clickAction, Slot slot, ItemStack slotStack, ItemStack cursorStack); +} diff --git a/Common/src/main/java/dev/upcraft/sparkweave/mixin/AbstractContainerMenuMixin.java b/Common/src/main/java/dev/upcraft/sparkweave/mixin/AbstractContainerMenuMixin.java new file mode 100644 index 0000000..246ebe1 --- /dev/null +++ b/Common/src/main/java/dev/upcraft/sparkweave/mixin/AbstractContainerMenuMixin.java @@ -0,0 +1,8 @@ +package dev.upcraft.sparkweave.mixin; + +import net.minecraft.world.inventory.AbstractContainerMenu; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(AbstractContainerMenu.class) +public class AbstractContainerMenuMixin { +} diff --git a/Common/src/testmod/java/dev/upcraft/sparkweave/testmod/SparkweaveTestmod.java b/Common/src/testmod/java/dev/upcraft/sparkweave/testmod/SparkweaveTestmod.java index 6788cb4..94a7fef 100644 --- a/Common/src/testmod/java/dev/upcraft/sparkweave/testmod/SparkweaveTestmod.java +++ b/Common/src/testmod/java/dev/upcraft/sparkweave/testmod/SparkweaveTestmod.java @@ -1,12 +1,19 @@ package dev.upcraft.sparkweave.testmod; import dev.upcraft.sparkweave.api.entrypoint.MainEntryPoint; +import dev.upcraft.sparkweave.api.event.ItemMenuInteractionEvent; import dev.upcraft.sparkweave.api.platform.ModContainer; import dev.upcraft.sparkweave.api.platform.services.RegistryService; import dev.upcraft.sparkweave.testmod.init.TestCreativeTabs; import dev.upcraft.sparkweave.testmod.init.TestItems; import dev.upcraft.sparkweave.testmod.init.TestStatusEffects; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.inventory.ChestMenu; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.item.Items; public class SparkweaveTestmod implements MainEntryPoint { @@ -19,6 +26,16 @@ public void onInitialize(ModContainer mod) { TestItems.ITEMS.accept(registryService); TestCreativeTabs.TABS.accept(registryService); TestStatusEffects.STATUS_EFFECTS.accept(registryService); + + ItemMenuInteractionEvent.EVENT.register((menu, player, level, clickAction, slot, slotStack, cursorStack) -> { + if(level.isClientSide() && menu instanceof ChestMenu && clickAction == ClickAction.SECONDARY && slotStack.is(Items.DEEPSLATE_COAL_ORE) && cursorStack.is(Items.DEEPSLATE_EMERALD_ORE) && player.isCrouching()) { + player.displayClientMessage(Component.literal("Uh oh stinky"), false); + level.playSound(null, player.blockPosition(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS); + return true; + } + + return false; + }); } public static ResourceLocation id(String path) { diff --git a/Fabric/src/main/java/dev/upcraft/sparkweave/fabric/mixin/AbstractContainerMenuMixin.java b/Fabric/src/main/java/dev/upcraft/sparkweave/fabric/mixin/AbstractContainerMenuMixin.java new file mode 100644 index 0000000..6b85bc6 --- /dev/null +++ b/Fabric/src/main/java/dev/upcraft/sparkweave/fabric/mixin/AbstractContainerMenuMixin.java @@ -0,0 +1,27 @@ +package dev.upcraft.sparkweave.fabric.mixin; + +import dev.upcraft.sparkweave.api.event.ItemMenuInteractionEvent; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +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 org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(AbstractContainerMenu.class) +public class AbstractContainerMenuMixin { + @Inject( + method = "doClick", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;updateTutorialInventoryAction(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/inventory/ClickAction;)V"), + locals = LocalCapture.CAPTURE_FAILSOFT, cancellable = true + ) + private void handleItemClickEvent(int slotId, int button, ClickType clickType, Player player, CallbackInfo info, ClickAction clickAction, Slot slot, ItemStack slotStack, ItemStack cursorStack) { + if(ItemMenuInteractionEvent.EVENT.invoker().interactWithItemInMenu((AbstractContainerMenu) (Object) this, player, player.level(), clickAction, slot, slotStack, cursorStack)) + info.cancel(); + } +} diff --git a/Fabric/src/main/resources/sparkweave.fabric.mixins.json b/Fabric/src/main/resources/sparkweave.fabric.mixins.json index f1e718c..869710e 100644 --- a/Fabric/src/main/resources/sparkweave.fabric.mixins.json +++ b/Fabric/src/main/resources/sparkweave.fabric.mixins.json @@ -6,6 +6,7 @@ "refmap": "${mod_id}.refmap.json", "compatibilityLevel": "JAVA_21", "mixins": [ + "AbstractContainerMenuMixin", "impl.ArgumentTypeInfosAccessor", "impl.registry.MappedRegistryMixin" ], diff --git a/NeoForge/src/main/java/dev/upcraft/sparkweave/neoforge/mixin/AbstractContainerMenuMixin.java b/NeoForge/src/main/java/dev/upcraft/sparkweave/neoforge/mixin/AbstractContainerMenuMixin.java new file mode 100644 index 0000000..b857ee1 --- /dev/null +++ b/NeoForge/src/main/java/dev/upcraft/sparkweave/neoforge/mixin/AbstractContainerMenuMixin.java @@ -0,0 +1,29 @@ +package dev.upcraft.sparkweave.neoforge.mixin; + +import dev.upcraft.sparkweave.api.event.ItemMenuInteractionEvent; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +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 org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@SuppressWarnings("InvalidInjectorMethodSignature") +@Mixin(AbstractContainerMenu.class) +public class AbstractContainerMenuMixin { + @Inject( + method = "doClick", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;updateTutorialInventoryAction(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/inventory/ClickAction;)V"), + locals = LocalCapture.CAPTURE_FAILSOFT, cancellable = true + ) + private void handleItemClickEvent(int slotId, int button, ClickType clickType, Player player, CallbackInfo info, Inventory inventory, ClickAction clickAction, Slot slot, ItemStack slotStack, ItemStack cursorStack) { + if(ItemMenuInteractionEvent.EVENT.invoker().interactWithItemInMenu((AbstractContainerMenu) (Object) this, player, player.level(), clickAction, slot, slotStack, cursorStack)) + info.cancel(); + } +} diff --git a/NeoForge/src/main/resources/sparkweave.neoforge.mixins.json b/NeoForge/src/main/resources/sparkweave.neoforge.mixins.json index 9a17d23..4988c9d 100644 --- a/NeoForge/src/main/resources/sparkweave.neoforge.mixins.json +++ b/NeoForge/src/main/resources/sparkweave.neoforge.mixins.json @@ -5,6 +5,7 @@ "plugin": "dev.upcraft.sparkweave.SparkweaveMixinConfigPlugin", "compatibilityLevel": "JAVA_21", "mixins": [ + "AbstractContainerMenuMixin", "internal.DeferredHolderMixin", "internal.DeferredRegisterMixin", "internal.RegisterMenuScreensEventMixin" @@ -14,5 +15,5 @@ ], "injectors": { "defaultRequire": 1 - } + } }