blob: c9f7ffee247d7ff5cab146fc87e53ad07d854ad1 [file] [log] [blame] [raw]
package com.legacy.aether.entities.block;
import io.netty.buffer.ByteBuf;
import java.util.List;
import com.legacy.aether.AetherConfig;
import com.legacy.aether.blocks.util.BlockFloating;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityFallingBlock;
import net.minecraft.init.Blocks;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData;
public class EntityFloatingBlock extends Entity implements IEntityAdditionalSpawnData {
private Block block = Blocks.air;
private int meta = 0;
private int timeFloated = 0;
public EntityFloatingBlock(World worldIn) {
super(worldIn);
this.setSize(0.98F, 0.98F);
}
public EntityFloatingBlock(World world, int x, int y, int z, Block block, int meta) {
super(world);
this.meta = meta;
this.block = block;
this.preventEntitySpawning = true;
this.motionX = this.motionY = this.motionZ = 0;
this.setSize(0.98F, 0.98F);
this.setPosition(x + 0.5D, y, z + 0.5D);
}
@Override
protected void entityInit() {
}
@Override
public void onUpdate() {
if (this.getBlock() == null || this.getBlock() == Blocks.air) {
this.setDead();
return;
}
this.prevPosX = this.posX;
this.prevPosY = this.posY;
this.prevPosZ = this.posZ;
++this.timeFloated;
this.motionY += 0.04D;
this.moveEntity(this.motionX, this.motionY, this.motionZ);
this.motionX *= 0.9800000190734863D;
this.motionY *= 0.9800000190734863D;
this.motionZ *= 0.9800000190734863D;
Block block = this.getBlock();
int i = MathHelper.floor_double(this.posX);
int j = MathHelper.floor_double(this.posY);
int k = MathHelper.floor_double(this.posZ);
List<?> list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(0.0D, 1.0D, 0.0D));
for (int stack = 0; stack < list.size(); ++stack) {
Entity entity = (Entity) list.get(stack);
if (entity instanceof EntityFallingBlock && block.canPlaceBlockAt(this.worldObj, i, j, k)) {
this.worldObj.setBlock(i, j + 1, k, this.getBlock(), this.getMetadata(), 2);
this.setDead();
} else if (AetherConfig.shouldFloatWithBlock()) {
entity.setPosition(entity.posX, this.posY + 2.6D, entity.posZ);
entity.motionY = 0.0D;
entity.onGround = true;
entity.fallDistance = 0.0F;
}
}
if (this.isCollidedVertically && !this.onGround) {
this.motionX *= 0.699999988079071D;
this.motionZ *= 0.699999988079071D;
this.motionY *= -0.5D;
this.setDead();
if (!block.canPlaceBlockAt(this.worldObj, i, j, k) || BlockFloating.canContinue(this.worldObj, i, j + 1, k) || !this.worldObj.setBlock(i, j, k, this.getBlock(), this.getMetadata(), 2)) {
block.dropBlockAsItem(this.worldObj, i, j, k, this.getMetadata(), 0);
}
} else if (this.timeFloated > 100) {
block.dropBlockAsItem(this.worldObj, i, j, k, this.getMetadata(), 0);
this.setDead();
}
}
public void setBlock(Block block) {
this.block = block;
}
public Block getBlock() {
return this.block;
}
public void setMetadata(int meta) {
this.meta = meta;
}
public int getMetadata() {
return this.meta;
}
@Override
protected boolean canTriggerWalking() {
return false;
}
@Override
public void setDead() {
super.setDead();
}
@Override
public boolean canBeCollidedWith() {
return !this.isDead;
}
@Override
protected void readEntityFromNBT(NBTTagCompound compound) {
this.setBlock(Block.getBlockById(compound.getInteger("blockId")));
this.setMetadata(compound.getInteger("metadata"));
}
@Override
protected void writeEntityToNBT(NBTTagCompound compound) {
compound.setInteger("blockId", Block.getIdFromBlock(this.getBlock()));
compound.setInteger("metadata", this.getMetadata());
}
@Override
public void writeSpawnData(ByteBuf buffer) {
buffer.writeInt(Block.getIdFromBlock(this.getBlock()));
buffer.writeInt(this.meta);
}
@Override
public void readSpawnData(ByteBuf buffer) {
this.setBlock(Block.getBlockById(buffer.readInt()));
this.setMetadata(buffer.readInt());
}
}