diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index 2ac1b6b8d..5e69e7abd 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -12,9 +12,9 @@ import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.content.schematics.client.tools.Tools; import com.simibubi.create.content.schematics.item.SchematicItem; import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; +import com.simibubi.create.content.schematics.packet.SchematicSyncPacket; import com.simibubi.create.foundation.gui.ToolSelectionScreen; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.networking.NbtPacket; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.outliner.AABBOutline; @@ -272,17 +272,7 @@ public class SchematicHandler { public void sync() { if (activeSchematicItem == null) return; - - PlacementSettings settings = transformation.toSettings(); - CompoundNBT tag = activeSchematicItem.getTag(); - tag.putBoolean("Deployed", deployed); - tag.put("Anchor", NBTUtil.writeBlockPos(transformation.getAnchor())); - tag.putString("Rotation", settings.getRotation() - .name()); - tag.putString("Mirror", settings.getMirror() - .name()); - - AllPackets.channel.sendToServer(new NbtPacket(activeSchematicItem, activeHotbarSlot)); + AllPackets.channel.sendToServer(new SchematicSyncPacket(activeHotbarSlot, transformation.toSettings(), transformation.getAnchor(), deployed)); } public void equip(Tools tool) { diff --git a/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java new file mode 100644 index 000000000..1e7c6f861 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/schematics/packet/SchematicSyncPacket.java @@ -0,0 +1,77 @@ +package com.simibubi.create.content.schematics.packet; + +import java.util.function.Supplier; + +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class SchematicSyncPacket extends SimplePacketBase { + + public int slot; + public boolean deployed; + public BlockPos anchor; + public Rotation rotation; + public Mirror mirror; + + public SchematicSyncPacket(int slot, PlacementSettings settings, + BlockPos anchor, boolean deployed) { + this.slot = slot; + this.deployed = deployed; + this.anchor = anchor; + this.rotation = settings.getRotation(); + this.mirror = settings.getMirror(); + } + + public SchematicSyncPacket(PacketBuffer buffer) { + slot = buffer.readVarInt(); + deployed = buffer.readBoolean(); + anchor = buffer.readBlockPos(); + rotation = buffer.readEnumValue(Rotation.class); + mirror = buffer.readEnumValue(Mirror.class); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeVarInt(slot); + buffer.writeBoolean(deployed); + buffer.writeBlockPos(anchor); + buffer.writeEnumValue(rotation); + buffer.writeEnumValue(mirror); + } + + @Override + public void handle(Supplier context) { + context.get().enqueueWork(() -> { + ServerPlayerEntity player = context.get().getSender(); + if (player == null) + return; + ItemStack stack = ItemStack.EMPTY; + if (slot == -1) { + stack = player.getHeldItemMainhand(); + } else { + stack = player.inventory.getStackInSlot(slot); + } + if (!AllItems.SCHEMATIC.isIn(stack)) { + return; + } + CompoundNBT tag = stack.getOrCreateTag(); + tag.putBoolean("Deployed", deployed); + tag.put("Anchor", NBTUtil.writeBlockPos(anchor)); + tag.putString("Rotation", rotation.name()); + tag.putString("Mirror", mirror.name()); + }); + context.get().setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index f1dad8e0e..8feb79656 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -26,6 +26,7 @@ import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPack import com.simibubi.create.content.schematics.packet.InstantSchematicPacket; import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; import com.simibubi.create.content.schematics.packet.SchematicUploadPacket; +import com.simibubi.create.content.schematics.packet.SchematicSyncPacket; import com.simibubi.create.foundation.command.ConfigureConfigPacket; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringCountUpdatePacket; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueUpdatePacket; @@ -60,6 +61,7 @@ public enum AllPackets { PLACE_ARM(ArmPlacementPacket.class, ArmPlacementPacket::new), MINECART_COUPLING_CREATION(CouplingCreationPacket.class, CouplingCreationPacket::new), INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new), + SYNC_SCHEMATIC(SchematicSyncPacket.class, SchematicSyncPacket::new), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new), diff --git a/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java b/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java index 2ea47f60a..27e60d111 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java +++ b/src/main/java/com/simibubi/create/foundation/networking/NbtPacket.java @@ -2,12 +2,16 @@ package com.simibubi.create.foundation.networking; import java.util.function.Supplier; +import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem; +import com.simibubi.create.content.curiosities.zapper.ZapperItem; + import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.util.Hand; import net.minecraftforge.fml.network.NetworkEvent.Context; +@Deprecated public class NbtPacket extends SimplePacketBase { public ItemStack stack; @@ -42,7 +46,10 @@ public class NbtPacket extends SimplePacketBase { ServerPlayerEntity player = context.get().getSender(); if (player == null) return; - + if (!(stack.getItem() instanceof SymmetryWandItem || stack.getItem() instanceof ZapperItem)) { + return; + } + stack.removeChildTag("AttributeModifiers"); if (slot == -1) { ItemStack heldItem = player.getHeldItem(hand); if (heldItem.getItem() == stack.getItem()) {