From ce7fd22553e0e3ca8fd23a373654d5954bae5582 Mon Sep 17 00:00:00 2001 From: nea Date: Thu, 13 Jul 2023 18:23:46 +0200 Subject: Add screen rendering events for buttons --- .../moe/nea/firmament/mixins/MixinHandledScreen.java | 17 +++++++++++++---- .../firmament/events/HandledScreenForegroundEvent.kt | 10 ++++++++++ .../nea/firmament/events/HandledScreenPushREIEvent.kt | 16 ++++++++++++++++ .../kotlin/moe/nea/firmament/events/ScreenClickEvent.kt | 8 ++++++++ .../kotlin/moe/nea/firmament/rei/FirmamentReiPlugin.kt | 7 +++++++ 5 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/moe/nea/firmament/events/HandledScreenForegroundEvent.kt create mode 100644 src/main/kotlin/moe/nea/firmament/events/HandledScreenPushREIEvent.kt create mode 100644 src/main/kotlin/moe/nea/firmament/events/ScreenClickEvent.kt (limited to 'src') diff --git a/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java b/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java index ac09569..5a06c47 100644 --- a/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java +++ b/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java @@ -18,12 +18,9 @@ package moe.nea.firmament.mixins; -import moe.nea.firmament.events.HandledScreenKeyPressedEvent; -import moe.nea.firmament.events.IsSlotProtectedEvent; -import moe.nea.firmament.events.SlotRenderEvents; +import moe.nea.firmament.events.*; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.SlotActionType; import org.spongepowered.asm.mixin.Mixin; @@ -43,6 +40,18 @@ public class MixinHandledScreen { } } + @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) + public void onMouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { + if (ScreenClickEvent.Companion.publish(new ScreenClickEvent((HandledScreen) (Object) this, mouseX, mouseY, button)).getCancelled()) { + cir.setReturnValue(true); + } + } + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawForeground(Lnet/minecraft/client/gui/DrawContext;II)V", shift = At.Shift.AFTER)) + public void onAfterRenderForeground(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { + HandledScreenForegroundEvent.Companion.publish(new HandledScreenForegroundEvent((HandledScreen) (Object) this, mouseX, mouseY, delta)); + } + @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At("HEAD"), cancellable = true) public void onMouseClickedSlot(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { if (IsSlotProtectedEvent.shouldBlockInteraction(slot)) { diff --git a/src/main/kotlin/moe/nea/firmament/events/HandledScreenForegroundEvent.kt b/src/main/kotlin/moe/nea/firmament/events/HandledScreenForegroundEvent.kt new file mode 100644 index 0000000..2d4b652 --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/events/HandledScreenForegroundEvent.kt @@ -0,0 +1,10 @@ +package moe.nea.firmament.events + +import net.minecraft.client.gui.screen.ingame.HandledScreen + +data class HandledScreenForegroundEvent( + val screen: HandledScreen<*>, + val mouseX: Int, val mouseY: Int, val delta: Float +) : FirmamentEvent() { + companion object : FirmamentEventBus() +} diff --git a/src/main/kotlin/moe/nea/firmament/events/HandledScreenPushREIEvent.kt b/src/main/kotlin/moe/nea/firmament/events/HandledScreenPushREIEvent.kt new file mode 100644 index 0000000..b809513 --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/events/HandledScreenPushREIEvent.kt @@ -0,0 +1,16 @@ +package moe.nea.firmament.events + +import me.shedaniel.math.Rectangle +import net.minecraft.client.gui.screen.ingame.HandledScreen + +data class HandledScreenPushREIEvent( + val screen: HandledScreen<*>, + val rectangles: MutableList = mutableListOf() +) : FirmamentEvent() { + + fun block(rectangle: Rectangle) { + rectangles.add(rectangle) + } + + companion object : FirmamentEventBus() +} diff --git a/src/main/kotlin/moe/nea/firmament/events/ScreenClickEvent.kt b/src/main/kotlin/moe/nea/firmament/events/ScreenClickEvent.kt new file mode 100644 index 0000000..cd25991 --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/events/ScreenClickEvent.kt @@ -0,0 +1,8 @@ +package moe.nea.firmament.events + +import net.minecraft.client.gui.screen.ingame.HandledScreen + +data class ScreenClickEvent(val screen: HandledScreen<*>, val mouseX: Double, val mouseY: Double, val button: Int) : + FirmamentEvent.Cancellable() { + companion object : FirmamentEventBus() +} diff --git a/src/main/kotlin/moe/nea/firmament/rei/FirmamentReiPlugin.kt b/src/main/kotlin/moe/nea/firmament/rei/FirmamentReiPlugin.kt index 5016d96..223ee7d 100644 --- a/src/main/kotlin/moe/nea/firmament/rei/FirmamentReiPlugin.kt +++ b/src/main/kotlin/moe/nea/firmament/rei/FirmamentReiPlugin.kt @@ -23,6 +23,7 @@ import me.shedaniel.rei.api.client.registry.category.CategoryRegistry import me.shedaniel.rei.api.client.registry.display.DisplayRegistry import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry import me.shedaniel.rei.api.client.registry.entry.EntryRegistry +import me.shedaniel.rei.api.client.registry.screen.ExclusionZones import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry import me.shedaniel.rei.api.client.registry.transfer.TransferHandler import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry @@ -30,9 +31,11 @@ import me.shedaniel.rei.api.common.entry.EntryStack import me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes import net.minecraft.client.gui.screen.ingame.GenericContainerScreen +import net.minecraft.client.gui.screen.ingame.HandledScreen import net.minecraft.item.ItemStack import net.minecraft.text.Text import net.minecraft.util.Identifier +import moe.nea.firmament.events.HandledScreenPushREIEvent import moe.nea.firmament.features.inventory.CraftingOverlay import moe.nea.firmament.recipes.SBCraftingRecipe import moe.nea.firmament.recipes.SBForgeRecipe @@ -74,6 +77,10 @@ class FirmamentReiPlugin : REIClientPlugin { registry.add(SBForgeRecipe.Category) } + override fun registerExclusionZones(zones: ExclusionZones) { + zones.register(HandledScreen::class.java) { HandledScreenPushREIEvent(it).rectangles } + } + override fun registerDisplays(registry: DisplayRegistry) { registry.registerDisplayGenerator( SBCraftingRecipe.Category.catIdentifier, -- cgit