package com.xcompwiz.lookingglass.network.packet;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import com.xcompwiz.lookingglass.client.proxyworld.ProxyWorldManager;
import cpw.mods.fml.common.network.ByteBufUtils;
import cpw.mods.fml.common.network.internal.FMLProxyPacket;
/**
* Based on code from Ken Butler/shadowking97
*/
public class PacketTileEntityNBT extends PacketHandlerBase {
public static FMLProxyPacket createPacket(int xPos, int yPos, int zPos, NBTTagCompound nbt, int dim) {
// This line may look like black magic (and, well, it is), but it's actually just returning a class reference for this class. Copy-paste safe.
ByteBuf data = PacketHandlerBase.createDataBuffer((Class<? extends PacketHandlerBase>) new Object() {}.getClass().getEnclosingClass());
data.writeInt(dim);
data.writeInt(xPos);
data.writeInt(yPos);
data.writeInt(zPos);
ByteBufUtils.writeTag(data, nbt);
return buildPacket(data);
}
@Override
public void handle(ByteBuf data, EntityPlayer player) {
int dimension = data.readInt();
int xPos = data.readInt();
int yPos = data.readInt();
int zPos = data.readInt();
NBTTagCompound nbt = ByteBufUtils.readTag(data);
WorldClient proxyworld = ProxyWorldManager.getProxyworld(dimension);
if (proxyworld == null) return;
if (proxyworld.provider.dimensionId != dimension) return;
if (proxyworld.blockExists(xPos, yPos, zPos)) {
TileEntity tileentity = proxyworld.getTileEntity(xPos, yPos, zPos);
if (tileentity != null) {
tileentity.readFromNBT(nbt);
} else {
//Create tile entity from data
tileentity = TileEntity.createAndLoadEntity(nbt);
if (tileentity != null) {
proxyworld.addTileEntity(tileentity);
}
}
proxyworld.markTileEntityChunkModified(xPos, yPos, zPos, tileentity);
proxyworld.setTileEntity(xPos, yPos, zPos, tileentity);
proxyworld.markBlockForUpdate(xPos, yPos, zPos);
}
}
}