Initial 1.11.2 update
This commit is contained in:
@@ -8,6 +8,7 @@ import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ITickable;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
@@ -22,152 +23,158 @@ public class TileEntityStatue extends TileEntity implements ITickable {
|
||||
public boolean isIce;
|
||||
private int timer;
|
||||
private int lifetime = 600;
|
||||
/** <b>[Client-side]</b> Keeps track of the destroy stage for the block associated with this tile entity
|
||||
* for rendering purposes. Will be 0 if position is not 1. */
|
||||
/**
|
||||
* <b>[Client-side]</b> Keeps track of the destroy stage for the block associated with this tile entity for
|
||||
* rendering purposes. Will be 0 if position is not 1.
|
||||
*/
|
||||
public int destroyStage;
|
||||
|
||||
|
||||
public TileEntityStatue(){
|
||||
|
||||
}
|
||||
|
||||
|
||||
public TileEntityStatue(boolean isIce){
|
||||
this.isIce = isIce;
|
||||
this.timer = 0;
|
||||
}
|
||||
|
||||
/** The number of stone blocks that this petrified creature is made of.*/
|
||||
|
||||
/** The number of stone blocks that this petrified creature is made of. */
|
||||
public int parts;
|
||||
|
||||
/** The position within the petrified creature this particular tileentity holds.
|
||||
* 1 is at the bottom.*/
|
||||
|
||||
/**
|
||||
* The position within the petrified creature this particular tileentity holds. 1 is at the bottom.
|
||||
*/
|
||||
public int position = 1;
|
||||
|
||||
|
||||
public void setCreatureAndPart(EntityLiving entity, int position, int parts){
|
||||
this.creature = entity;
|
||||
this.position = position;
|
||||
this.parts = parts;
|
||||
// Aligns the entity with the block so the render bounding box works correctly, and also for visual effect when
|
||||
// broken out.
|
||||
if(position == 1) creature.setPosition(this.getPos().getX() + 0.5, this.getPos().getY(), this.getPos().getZ() + 0.5);
|
||||
if(position == 1)
|
||||
creature.setPosition(this.getPos().getX() + 0.5, this.getPos().getY(), this.getPos().getZ() + 0.5);
|
||||
}
|
||||
|
||||
|
||||
public void setLifetime(int lifetime){
|
||||
this.lifetime = lifetime;
|
||||
}
|
||||
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public AxisAlignedBB getRenderBoundingBox(){
|
||||
|
||||
AxisAlignedBB bb = INFINITE_EXTENT_AABB;
|
||||
Block type = getBlockType();
|
||||
// Allows the renderer to render the entity even when the bottom block is not visible.
|
||||
// Was only done for position 1, now done for all positions so the breaking animation works properly.
|
||||
if(this.creature != null){
|
||||
// Now uses the entity's bounding box
|
||||
bb = this.creature.getRenderBoundingBox();
|
||||
//bb = new AxisAlignedBB(xCoord, yCoord, zCoord, xCoord + 1, yCoord + this.parts, zCoord + 1);
|
||||
|
||||
}else if(type != null){
|
||||
|
||||
AxisAlignedBB cbb = this.getWorld().getBlockState(pos).getBoundingBox(worldObj, pos);
|
||||
if (cbb != null)
|
||||
{
|
||||
bb = cbb;
|
||||
}
|
||||
}
|
||||
return bb;
|
||||
}
|
||||
|
||||
public AxisAlignedBB getRenderBoundingBox(){
|
||||
|
||||
AxisAlignedBB bb = INFINITE_EXTENT_AABB;
|
||||
Block type = getBlockType();
|
||||
// Allows the renderer to render the entity even when the bottom block is not visible.
|
||||
// Was only done for position 1, now done for all positions so the breaking animation works properly.
|
||||
if(this.creature != null){
|
||||
// Now uses the entity's bounding box
|
||||
bb = this.creature.getRenderBoundingBox();
|
||||
// bb = new AxisAlignedBB(xCoord, yCoord, zCoord, xCoord + 1, yCoord + this.parts, zCoord + 1);
|
||||
|
||||
}else if(type != null){
|
||||
|
||||
AxisAlignedBB cbb = this.getWorld().getBlockState(pos).getBoundingBox(world, pos);
|
||||
if(cbb != null){
|
||||
bb = cbb;
|
||||
}
|
||||
}
|
||||
return bb;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canRenderBreaking(){
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void update(){
|
||||
|
||||
|
||||
this.timer++;
|
||||
|
||||
//System.out.println(entityName);
|
||||
|
||||
// System.out.println(entityName);
|
||||
if(this.creature == null && entityName != null){
|
||||
this.creature = (EntityLiving) EntityList.createEntityByName(this.entityName, this.worldObj);
|
||||
this.creature = (EntityLiving)EntityList.createEntityByIDFromName(new ResourceLocation(this.entityName),
|
||||
this.world);
|
||||
if(this.creature != null){
|
||||
this.creature.readFromNBT(entityCompound);
|
||||
this.creature.rotationYawHead = this.entityYawHead;
|
||||
this.creature.renderYawOffset = this.entityYawOffset;
|
||||
}
|
||||
}
|
||||
|
||||
//System.out.println("Coords: " + this.xCoord + ", " + this.yCoord + ", " + this.zCoord);
|
||||
|
||||
// System.out.println("Coords: " + this.xCoord + ", " + this.yCoord + ", " + this.zCoord);
|
||||
// Breaks the block at light levels of 7 or below, with a higher chance the lower the light level.
|
||||
// The chance is (8 - light level)/12, so at light 0 the chance is 3/4 and at light 7 the chance is 1/12.
|
||||
if(!this.worldObj.isRemote && this.timer % 200 == 0 && this.timer > lifetime && !this.isIce && this.position == 1){
|
||||
if(!this.world.isRemote && this.timer % 200 == 0 && this.timer > lifetime && !this.isIce && this.position == 1){
|
||||
// TESTME: There are about 10 different light-related methods in world now... is this the right one?
|
||||
if(this.worldObj.getLight(pos) < this.worldObj.rand.nextInt(12) - 3){
|
||||
// This is all that is needed because destroyBlock invokes the breakBlock function in BlockPetrifiedStone
|
||||
if(this.world.getLight(pos) < this.world.rand.nextInt(12) - 3){
|
||||
// This is all that is needed because destroyBlock invokes the breakBlock function in
|
||||
// BlockPetrifiedStone
|
||||
// and that function handles all the spawning and stuff.
|
||||
this.worldObj.destroyBlock(pos, false);
|
||||
this.world.destroyBlock(pos, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Breaks the block after 30 secs
|
||||
if(!this.worldObj.isRemote && this.timer > lifetime && this.isIce){
|
||||
if(!this.world.isRemote && this.timer > lifetime && this.isIce){
|
||||
if(this.position == 1){
|
||||
// This is all that is needed because destroyBlock invokes the breakBlock function in BlockPetrifiedStone
|
||||
// This is all that is needed because destroyBlock invokes the breakBlock function in
|
||||
// BlockPetrifiedStone
|
||||
// and that function handles all the spawning and stuff.
|
||||
this.worldObj.destroyBlock(pos, false);
|
||||
this.world.destroyBlock(pos, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound tagCompound) {
|
||||
super.readFromNBT(tagCompound);
|
||||
position = tagCompound.getInteger("position");
|
||||
parts = tagCompound.getInteger("parts");
|
||||
entityCompound = tagCompound.getCompoundTag("entity");
|
||||
entityName = tagCompound.getString("entityName");
|
||||
timer = tagCompound.getInteger("timer");
|
||||
lifetime = tagCompound.getInteger("lifetime");
|
||||
isIce = tagCompound.getBoolean("isIce");
|
||||
entityYawHead = tagCompound.getFloat("entityYawHead");
|
||||
entityYawOffset = tagCompound.getFloat("entityYawOffset");
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) {
|
||||
super.writeToNBT(tagCompound);
|
||||
tagCompound.setInteger("position", position);
|
||||
tagCompound.setInteger("parts", parts);
|
||||
entityCompound = new NBTTagCompound();
|
||||
if(creature != null){
|
||||
creature.writeToNBT(entityCompound);
|
||||
tagCompound.setString("entityName", EntityList.getEntityString(creature));
|
||||
tagCompound.setFloat("entityYawHead", creature.rotationYawHead);
|
||||
tagCompound.setFloat("entityYawOffset", creature.renderYawOffset);
|
||||
}
|
||||
tagCompound.setTag("entity", entityCompound);
|
||||
tagCompound.setInteger("timer", timer);
|
||||
tagCompound.setInteger("lifetime", lifetime);
|
||||
tagCompound.setBoolean("isIce", isIce);
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound tagCompound){
|
||||
super.readFromNBT(tagCompound);
|
||||
position = tagCompound.getInteger("position");
|
||||
parts = tagCompound.getInteger("parts");
|
||||
entityCompound = tagCompound.getCompoundTag("entity");
|
||||
entityName = tagCompound.getString("entityName");
|
||||
timer = tagCompound.getInteger("timer");
|
||||
lifetime = tagCompound.getInteger("lifetime");
|
||||
isIce = tagCompound.getBoolean("isIce");
|
||||
entityYawHead = tagCompound.getFloat("entityYawHead");
|
||||
entityYawOffset = tagCompound.getFloat("entityYawOffset");
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound writeToNBT(NBTTagCompound tagCompound){
|
||||
super.writeToNBT(tagCompound);
|
||||
tagCompound.setInteger("position", position);
|
||||
tagCompound.setInteger("parts", parts);
|
||||
entityCompound = new NBTTagCompound();
|
||||
if(creature != null){
|
||||
creature.writeToNBT(entityCompound);
|
||||
tagCompound.setString("entityName", EntityList.getEntityString(creature));
|
||||
tagCompound.setFloat("entityYawHead", creature.rotationYawHead);
|
||||
tagCompound.setFloat("entityYawOffset", creature.renderYawOffset);
|
||||
}
|
||||
tagCompound.setTag("entity", entityCompound);
|
||||
tagCompound.setInteger("timer", timer);
|
||||
tagCompound.setInteger("lifetime", lifetime);
|
||||
tagCompound.setBoolean("isIce", isIce);
|
||||
|
||||
return tagCompound;
|
||||
}
|
||||
|
||||
@Override
|
||||
}
|
||||
|
||||
@Override
|
||||
public final NBTTagCompound getUpdateTag(){
|
||||
return this.writeToNBT(new NBTTagCompound());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@Override
|
||||
public SPacketUpdateTileEntity getUpdatePacket(){
|
||||
NBTTagCompound tag = new NBTTagCompound();
|
||||
writeToNBT(tag);
|
||||
return new SPacketUpdateTileEntity(pos, 1, tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
|
||||
@Override
|
||||
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt){
|
||||
NBTTagCompound tag = pkt.getNbtCompound();
|
||||
readFromNBT(tag);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user