diff options
author | nea <nea@nea.moe> | 2023-05-18 03:20:22 +0200 |
---|---|---|
committer | nea <nea@nea.moe> | 2023-05-18 03:20:22 +0200 |
commit | 1dd603ab1cc42a602f1d82595dd15789ef63d2a3 (patch) | |
tree | 1658e1d32849d69102ff1e1b4c856da8428ab82b /src/main/java/moe/nea/firmament | |
parent | 3ebe3e80b929b03ad0bcb0c76cec6b3285fe08bd (diff) | |
download | Firmament-1dd603ab1cc42a602f1d82595dd15789ef63d2a3.tar.gz Firmament-1dd603ab1cc42a602f1d82595dd15789ef63d2a3.tar.bz2 Firmament-1dd603ab1cc42a602f1d82595dd15789ef63d2a3.zip |
Add slot locking
Diffstat (limited to 'src/main/java/moe/nea/firmament')
3 files changed, 86 insertions, 0 deletions
diff --git a/src/main/java/moe/nea/firmament/mixins/MixinClientPlayerEntity.java b/src/main/java/moe/nea/firmament/mixins/MixinClientPlayerEntity.java new file mode 100644 index 0000000..dc19786 --- /dev/null +++ b/src/main/java/moe/nea/firmament/mixins/MixinClientPlayerEntity.java @@ -0,0 +1,25 @@ +package moe.nea.firmament.mixins; + +import moe.nea.firmament.events.IsSlotProtectedEvent; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.screen.slot.Slot; +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.CallbackInfoReturnable; + +@Mixin(ClientPlayerEntity.class) +public abstract class MixinClientPlayerEntity extends PlayerEntity { + public MixinClientPlayerEntity() { + super(null, null, 0, null); + } + + @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) + public void onDropSelectedItem(boolean entireStack, CallbackInfoReturnable<Boolean> cir) { + Slot fakeSlot = new Slot(getInventory(), getInventory().selectedSlot, 0, 0); + if (IsSlotProtectedEvent.shouldBlockInteraction(fakeSlot)) { + cir.setReturnValue(false); + } + } +} diff --git a/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java b/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java new file mode 100644 index 0000000..00a4176 --- /dev/null +++ b/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java @@ -0,0 +1,50 @@ +package moe.nea.firmament.mixins; + +import moe.nea.firmament.events.HandledScreenKeyPressedEvent; +import moe.nea.firmament.events.IsSlotProtectedEvent; +import moe.nea.firmament.events.SlotRenderEvents; +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; +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.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(HandledScreen.class) +public class MixinHandledScreen { + + @Inject(method = "keyPressed", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;handleHotbarKeyPressed(II)Z", shift = At.Shift.BEFORE), cancellable = true) + public void onKeyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) { + if (HandledScreenKeyPressedEvent.Companion.publish(new HandledScreenKeyPressedEvent(keyCode, scanCode, modifiers)).getCancelled()) { + cir.setReturnValue(true); + } + } + + @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)) { + ci.cancel(); + } + } + + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawSlot(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/screen/slot/Slot;)V", shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD) + public void onAfterDrawSlot( + MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci, + int i, int j, int k, Slot slot) { + SlotRenderEvents.After event = new SlotRenderEvents.After(matrices, slot, mouseX, mouseY, delta); + SlotRenderEvents.After.Companion.publish(event); + } + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawSlot(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/screen/slot/Slot;)V", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) + public void onBeforeDrawSlot( + MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci, + int i, int j, int k, Slot slot) { + SlotRenderEvents.Before event = new SlotRenderEvents.Before(matrices, slot, mouseX, mouseY, delta); + SlotRenderEvents.Before.Companion.publish(event); + } +} diff --git a/src/main/java/moe/nea/firmament/mixins/MixinPlayerInventory.java b/src/main/java/moe/nea/firmament/mixins/MixinPlayerInventory.java new file mode 100644 index 0000000..dcccf08 --- /dev/null +++ b/src/main/java/moe/nea/firmament/mixins/MixinPlayerInventory.java @@ -0,0 +1,11 @@ +package moe.nea.firmament.mixins; + +import net.minecraft.entity.player.PlayerInventory; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(PlayerInventory.class) +public class MixinPlayerInventory { + + + +} |