158 lines
3.6 KiB
Java
158 lines
3.6 KiB
Java
|
package calclavia.lib.multiblock;
|
||
|
|
||
|
import net.minecraft.entity.player.EntityPlayer;
|
||
|
import net.minecraft.nbt.NBTTagCompound;
|
||
|
import net.minecraft.network.INetworkManager;
|
||
|
import net.minecraft.network.packet.Packet;
|
||
|
import net.minecraft.network.packet.Packet250CustomPayload;
|
||
|
import net.minecraft.tileentity.TileEntity;
|
||
|
import net.minecraft.world.World;
|
||
|
import universalelectricity.core.vector.Vector3;
|
||
|
import universalelectricity.prefab.network.IPacketReceiver;
|
||
|
import universalelectricity.prefab.network.PacketManager;
|
||
|
|
||
|
import com.google.common.io.ByteArrayDataInput;
|
||
|
|
||
|
/**
|
||
|
* This is a multiblock to be used for blocks that are bigger than one block.
|
||
|
*
|
||
|
* @author Calclavia
|
||
|
*
|
||
|
*/
|
||
|
public class TileEntityMultiBlockPart extends TileEntity implements IPacketReceiver
|
||
|
{
|
||
|
// The the position of the main block. Relative to this block's position.
|
||
|
private Vector3 mainBlockPosition;
|
||
|
public String channel;
|
||
|
|
||
|
public TileEntityMultiBlockPart()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
public TileEntityMultiBlockPart(String channel)
|
||
|
{
|
||
|
this.channel = channel;
|
||
|
}
|
||
|
|
||
|
public Vector3 getMainBlock()
|
||
|
{
|
||
|
if (this.mainBlockPosition != null)
|
||
|
{
|
||
|
return new Vector3(this).translate(this.mainBlockPosition);
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
public void setMainBlock(Vector3 mainBlock)
|
||
|
{
|
||
|
this.mainBlockPosition = mainBlock.clone().translate(new Vector3(this).invert());
|
||
|
|
||
|
if (!this.worldObj.isRemote)
|
||
|
{
|
||
|
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public Packet getDescriptionPacket()
|
||
|
{
|
||
|
if (this.mainBlockPosition != null)
|
||
|
{
|
||
|
if (this.channel == null || this.channel == "" && this.getBlockType() instanceof BlockMulti)
|
||
|
{
|
||
|
this.channel = ((BlockMulti) this.getBlockType()).channel;
|
||
|
}
|
||
|
|
||
|
return PacketManager.getPacket(this.channel, this, this.mainBlockPosition.intX(), this.mainBlockPosition.intY(), this.mainBlockPosition.intZ());
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void handlePacketData(INetworkManager network, int packetType, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
this.mainBlockPosition = new Vector3(dataStream.readInt(), dataStream.readInt(), dataStream.readInt());
|
||
|
}
|
||
|
catch (Exception e)
|
||
|
{
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void onBlockRemoval(BlockMulti block)
|
||
|
{
|
||
|
if (this.getMainBlock() != null)
|
||
|
{
|
||
|
TileEntity tileEntity = this.getMainBlock().getTileEntity(this.worldObj);
|
||
|
|
||
|
if (tileEntity instanceof IMultiBlock)
|
||
|
{
|
||
|
block.destroyMultiBlockStructure((IMultiBlock) tileEntity);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer entityPlayer)
|
||
|
{
|
||
|
if (this.getMainBlock() != null)
|
||
|
{
|
||
|
TileEntity tileEntity = this.getMainBlock().getTileEntity(this.worldObj);
|
||
|
|
||
|
if (tileEntity instanceof IBlockActivate)
|
||
|
{
|
||
|
return ((IBlockActivate) tileEntity).onActivated(entityPlayer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Reads a tile entity from NBT.
|
||
|
*/
|
||
|
@Override
|
||
|
public void readFromNBT(NBTTagCompound nbt)
|
||
|
{
|
||
|
super.readFromNBT(nbt);
|
||
|
|
||
|
if (nbt.hasKey("mainBlockPosition"))
|
||
|
{
|
||
|
this.mainBlockPosition = new Vector3(nbt.getCompoundTag("mainBlockPosition"));
|
||
|
}
|
||
|
|
||
|
this.channel = nbt.getString("channel");
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Writes a tile entity to NBT.
|
||
|
*/
|
||
|
@Override
|
||
|
public void writeToNBT(NBTTagCompound nbt)
|
||
|
{
|
||
|
super.writeToNBT(nbt);
|
||
|
|
||
|
if (this.mainBlockPosition != null)
|
||
|
{
|
||
|
nbt.setCompoundTag("mainBlockPosition", this.mainBlockPosition.writeToNBT(new NBTTagCompound()));
|
||
|
}
|
||
|
|
||
|
nbt.setString("channel", this.channel);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Determines if this TileEntity requires update calls.
|
||
|
*
|
||
|
* @return True if you want updateEntity() to be called, false if not
|
||
|
*/
|
||
|
@Override
|
||
|
public boolean canUpdate()
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|