aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/moe/nea
diff options
context:
space:
mode:
authornea <nea@nea.moe>2023-05-18 03:20:22 +0200
committernea <nea@nea.moe>2023-05-18 03:20:22 +0200
commit1dd603ab1cc42a602f1d82595dd15789ef63d2a3 (patch)
tree1658e1d32849d69102ff1e1b4c856da8428ab82b /src/main/java/moe/nea
parent3ebe3e80b929b03ad0bcb0c76cec6b3285fe08bd (diff)
downloadfirmament-1dd603ab1cc42a602f1d82595dd15789ef63d2a3.tar.gz
firmament-1dd603ab1cc42a602f1d82595dd15789ef63d2a3.tar.bz2
firmament-1dd603ab1cc42a602f1d82595dd15789ef63d2a3.zip
Add slot locking
Diffstat (limited to 'src/main/java/moe/nea')
-rw-r--r--src/main/java/moe/nea/firmament/mixins/MixinClientPlayerEntity.java25
-rw-r--r--src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java50
-rw-r--r--src/main/java/moe/nea/firmament/mixins/MixinPlayerInventory.java11
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 {
+
+
+
+}