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; } }