diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 6b0a38d0f..15a058b6c 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -1,12 +1,19 @@ package us.myles.ViaVersion.transformers; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.ByteBufOutputStream; + import org.bukkit.entity.EntityType; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.spacehq.mc.protocol.data.game.chunk.Column; import org.spacehq.mc.protocol.util.NetUtil; +import org.spacehq.opennbt.NBTIO; +import org.spacehq.opennbt.tag.builtin.CompoundTag; +import org.spacehq.opennbt.tag.builtin.StringTag; + import us.myles.ViaVersion.CancelException; import us.myles.ViaVersion.ConnectionInfo; import us.myles.ViaVersion.ViaVersionPlugin; @@ -20,6 +27,8 @@ import us.myles.ViaVersion.util.EntityUtil; import us.myles.ViaVersion.util.PacketUtil; import us.myles.ViaVersion.util.ReflectionUtil; +import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.util.*; @@ -554,6 +563,31 @@ public class OutgoingTransformer { output.writeBytes(input); return; } + if (packet == PacketType.PLAY_UPDATE_BLOCK_ENTITY) { + long[] pos = PacketUtil.readBlockPosition(input); + int action = input.readUnsignedByte(); + if(action == 1) { // update spawner + try { + DataInputStream stream = new DataInputStream(new ByteBufInputStream(input)); + CompoundTag tag = (CompoundTag) NBTIO.readTag(stream); + String entity = (String) tag.get("EntityId").getValue(); + CompoundTag spawn = new CompoundTag("SpawnData"); + spawn.put(new StringTag("id", entity)); + tag.put(spawn); + PacketUtil.writeBlockPosition(output, pos[0], pos[1], pos[2]); + output.writeByte(action); + DataOutputStream out = new DataOutputStream(new ByteBufOutputStream(output)); + NBTIO.writeTag(out, tag); + } catch (IOException e) { + e.printStackTrace(); + } + return; + } + PacketUtil.writeBlockPosition(output, pos[0], pos[1], pos[2]); + output.writeByte(action); + output.writeBytes(input, input.readableBytes()); + return; + } if (packet == PacketType.PLAY_CHUNK_DATA) { // We need to catch unloading chunk packets as defined by wiki.vg // To unload chunks, send this packet with Ground-Up Continuous=true and no 16^3 chunks (eg. Primary Bit Mask=0)