From d6087dfb9b82653ba688b70a1d8f049862dbcf1b Mon Sep 17 00:00:00 2001
From: WinDanesz <31292708+windanesz@users.noreply.github.com>
Date: Thu, 25 Jun 2026 21:29:14 +0200
Subject: [PATCH] feat: Implement Arcane Lock synchronization packet handling.
Fixes #900 GeckoLib incompat
---
.../electroblob/wizardry/CommonProxy.java | 2 +
.../wizardry/client/ClientProxy.java | 14 +++++
.../renderer/tileentity/RenderArcaneLock.java | 5 ++
.../wizardry/packet/PacketSyncArcaneLock.java | 57 +++++++++++++++++++
.../packet/WizardryPacketHandler.java | 1 +
.../wizardry/spell/ArcaneLock.java | 4 ++
6 files changed, 83 insertions(+)
create mode 100644 src/main/java/electroblob/wizardry/packet/PacketSyncArcaneLock.java
diff --git a/src/main/java/electroblob/wizardry/CommonProxy.java b/src/main/java/electroblob/wizardry/CommonProxy.java
index f2f8737a..29855ef7 100644
--- a/src/main/java/electroblob/wizardry/CommonProxy.java
+++ b/src/main/java/electroblob/wizardry/CommonProxy.java
@@ -181,6 +181,8 @@ public class CommonProxy {
public void handleBombExplosionPacket(PacketBombExplosion.Message message){}
+ public void handleArcaneLockSyncPacket(PacketSyncArcaneLock.Message message){}
+
// SECTION Misc
// ===============================================================================================================
diff --git a/src/main/java/electroblob/wizardry/client/ClientProxy.java b/src/main/java/electroblob/wizardry/client/ClientProxy.java
index b3004d66..6726c0f2 100644
--- a/src/main/java/electroblob/wizardry/client/ClientProxy.java
+++ b/src/main/java/electroblob/wizardry/client/ClientProxy.java
@@ -717,6 +717,20 @@ public class ClientProxy extends CommonProxy {
}else Wizardry.logger.warn("Received a PacketConquerShrine, but there was no shrine core at the position sent");
}
+ @Override
+ public void handleArcaneLockSyncPacket(PacketSyncArcaneLock.Message message){
+ if(Minecraft.getMinecraft().world != null){
+ TileEntity tileentity = Minecraft.getMinecraft().world.getTileEntity(message.pos);
+ if(tileentity != null){
+ if(message.locked){
+ tileentity.getTileData().setUniqueId(electroblob.wizardry.spell.ArcaneLock.NBT_KEY, message.owner);
+ }else{
+ electroblob.wizardry.util.NBTExtras.removeUniqueId(tileentity.getTileData(), electroblob.wizardry.spell.ArcaneLock.NBT_KEY);
+ }
+ }
+ }
+ }
+
@Override
public void handleBombExplosionPacket(PacketBombExplosion.Message message){
diff --git a/src/main/java/electroblob/wizardry/client/renderer/tileentity/RenderArcaneLock.java b/src/main/java/electroblob/wizardry/client/renderer/tileentity/RenderArcaneLock.java
index e62577cf..83a4c0af 100644
--- a/src/main/java/electroblob/wizardry/client/renderer/tileentity/RenderArcaneLock.java
+++ b/src/main/java/electroblob/wizardry/client/renderer/tileentity/RenderArcaneLock.java
@@ -60,8 +60,12 @@ public class RenderArcaneLock {
GlStateManager.pushMatrix();
GlStateManager.enableBlend();
+ GlStateManager.enableDepth();
+ GlStateManager.depthMask(true);
+ GlStateManager.disableCull();
lighting = GL11.glIsEnabled(GL11.GL_LIGHTING);
GlStateManager.disableLighting();
+ GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit);
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
@@ -90,6 +94,7 @@ public class RenderArcaneLock {
tessellator.draw();
+ GlStateManager.enableCull();
GlStateManager.disableBlend();
GlStateManager.enableTexture2D();
if(lighting){
diff --git a/src/main/java/electroblob/wizardry/packet/PacketSyncArcaneLock.java b/src/main/java/electroblob/wizardry/packet/PacketSyncArcaneLock.java
new file mode 100644
index 00000000..cf7d7c90
--- /dev/null
+++ b/src/main/java/electroblob/wizardry/packet/PacketSyncArcaneLock.java
@@ -0,0 +1,57 @@
+package electroblob.wizardry.packet;
+
+import electroblob.wizardry.Wizardry;
+import io.netty.buffer.ByteBuf;
+import net.minecraft.util.math.BlockPos;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
+import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
+
+import javax.annotation.Nullable;
+import java.util.UUID;
+
+/**
+ * [Server -> Client] This packet is sent when a container is locked or unlocked by Arcane Lock to update clients.
+ */
+public class PacketSyncArcaneLock implements IMessageHandler {
+
+ @Override
+ public IMessage onMessage(Message message, MessageContext ctx){
+
+ if(ctx.side.isClient()){
+ net.minecraft.client.Minecraft.getMinecraft().addScheduledTask(() -> Wizardry.proxy.handleArcaneLockSyncPacket(message));
+ }
+
+ return null;
+ }
+
+ public static class Message implements IMessage {
+
+ public BlockPos pos;
+ public boolean locked;
+ public UUID owner;
+
+ public Message(){}
+
+ public Message(BlockPos pos, boolean locked, @Nullable UUID owner){
+ this.pos = pos;
+ this.locked = locked;
+ this.owner = owner != null ? owner : new UUID(0, 0);
+ }
+
+ @Override
+ public void fromBytes(ByteBuf buf){
+ this.pos = BlockPos.fromLong(buf.readLong());
+ this.locked = buf.readBoolean();
+ this.owner = new UUID(buf.readLong(), buf.readLong());
+ }
+
+ @Override
+ public void toBytes(ByteBuf buf){
+ buf.writeLong(pos.toLong());
+ buf.writeBoolean(locked);
+ buf.writeLong(owner.getMostSignificantBits());
+ buf.writeLong(owner.getLeastSignificantBits());
+ }
+ }
+}
diff --git a/src/main/java/electroblob/wizardry/packet/WizardryPacketHandler.java b/src/main/java/electroblob/wizardry/packet/WizardryPacketHandler.java
index f2cbd363..11420bab 100644
--- a/src/main/java/electroblob/wizardry/packet/WizardryPacketHandler.java
+++ b/src/main/java/electroblob/wizardry/packet/WizardryPacketHandler.java
@@ -36,6 +36,7 @@ public class WizardryPacketHandler {
registerMessage(PacketRequestDonationPerks.class, PacketRequestDonationPerks.Message.class);
registerMessage(PacketSyncDonationPerks.class, PacketSyncDonationPerks.Message.class);
registerMessage(PacketBombExplosion.class, PacketBombExplosion.Message.class);
+ registerMessage(PacketSyncArcaneLock.class, PacketSyncArcaneLock.Message.class);
}
private static int nextPacketId = 0;
diff --git a/src/main/java/electroblob/wizardry/spell/ArcaneLock.java b/src/main/java/electroblob/wizardry/spell/ArcaneLock.java
index 60816844..c0680065 100644
--- a/src/main/java/electroblob/wizardry/spell/ArcaneLock.java
+++ b/src/main/java/electroblob/wizardry/spell/ArcaneLock.java
@@ -2,6 +2,8 @@ package electroblob.wizardry.spell;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.item.SpellActions;
+import electroblob.wizardry.packet.PacketSyncArcaneLock;
+import electroblob.wizardry.packet.WizardryPacketHandler;
import electroblob.wizardry.util.*;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
@@ -74,12 +76,14 @@ public class ArcaneLock extends SpellRay {
if(world.getPlayerEntityByUUID(tileentity.getTileData().getUniqueId(NBT_KEY)) == player){
NBTExtras.removeUniqueId(tileentity.getTileData(), NBT_KEY);
world.markAndNotifyBlock(pos, null, world.getBlockState(pos), world.getBlockState(pos), 3);
+ WizardryPacketHandler.net.sendToDimension(new PacketSyncArcaneLock.Message(pos, false, null), world.provider.getDimension());
return true;
}
}else{
// Locking
tileentity.getTileData().setUniqueId(NBT_KEY, player.getUniqueID());
world.markAndNotifyBlock(pos, null, world.getBlockState(pos), world.getBlockState(pos), 3);
+ WizardryPacketHandler.net.sendToDimension(new PacketSyncArcaneLock.Message(pos, true, player.getUniqueID()), world.provider.getDimension());
return true;
}
}