2023-08-28 16:45:17 +02:00

105 lines
3.1 KiB
Java

package com.hbm.tileentity.network;
import com.hbm.tileentity.TileEntityMachineBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
public abstract class TileEntityCraneBase extends TileEntityMachineBase {
public TileEntityCraneBase(int scount) {
super(scount);
}
// extension to the meta system
// for compatibility purposes, normal meta values are still used by default
private ForgeDirection outputOverride = ForgeDirection.UNKNOWN;
// for extra stability in case the screwdriver action doesn't get synced to
// other clients
private ForgeDirection cachedOutputOverride = ForgeDirection.UNKNOWN;
@Override
public void updateEntity() {
if(hasWorldObj() && worldObj.isRemote) {
if(cachedOutputOverride != outputOverride) {
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
cachedOutputOverride = outputOverride;
}
}
}
public ForgeDirection getInputSide() {
return ForgeDirection.getOrientation(getBlockMetadata());
}
public ForgeDirection getOutputSide() {
ForgeDirection override = getOutputOverride();
return override != ForgeDirection.UNKNOWN ? override : ForgeDirection.getOrientation(getBlockMetadata()).getOpposite();
}
public ForgeDirection getOutputOverride() {
return outputOverride;
}
public void setOutputOverride(ForgeDirection direction) {
ForgeDirection oldSide = getOutputSide();
if(oldSide == direction) direction = direction.getOpposite();
outputOverride = direction;
if(direction == getInputSide())
setInput(oldSide);
else
onBlockChanged();
}
public void setInput(ForgeDirection direction) {
outputOverride = getOutputSide(); // save the current output, if it isn't saved yet
ForgeDirection oldSide = getInputSide();
if(oldSide == direction) direction = direction.getOpposite();
boolean needSwapOutput = direction == getOutputSide();
worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, direction.ordinal(), needSwapOutput ? 4 : 3);
if(needSwapOutput)
setOutputOverride(oldSide);
}
protected void onBlockChanged() {
if(!hasWorldObj()) return;
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
worldObj.notifyBlockChange(xCoord, yCoord, zCoord, getBlockType());
markDirty();
}
@Override
public Packet getDescriptionPacket() {
NBTTagCompound nbt = new NBTTagCompound();
writeToNBT(nbt);
return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
}
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
readFromNBT(pkt.func_148857_g());
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
if(nbt.hasKey("CraneOutputOverride", Constants.NBT.TAG_BYTE))
outputOverride = ForgeDirection.getOrientation(nbt.getByte("CraneOutputOverride"));
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setByte("CraneOutputOverride", (byte) outputOverride.ordinal());
}
}