package openblocks.common.tileentity;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import openblocks.rpc.IGuideAnimationTrigger;
import openmods.shapes.IShapeable;
import openmods.utils.BlockNotifyFlags;
import openmods.utils.Coord;
import openmods.utils.render.GeometryUtils;
public class TileEntityBuilderGuide extends TileEntityGuide implements IGuideAnimationTrigger {
private static final Random RANDOM = new Random();
@Override
public boolean shouldRenderInPass(int pass) {
return pass == 0 || (pass == 1 && shouldRender());
}
private int ticks;
@Override
public boolean onItemUse(EntityPlayerMP player, ItemStack heldStack, int side, float hitX, float hitY, float hitZ) {
if (active.get()) {
final Item heldItem = heldStack.getItem();
if (heldItem instanceof ItemBlock) {
final ItemBlock itemBlock = (ItemBlock)heldItem;
final Block block = itemBlock.field_150939_a;
final int blockMeta = itemBlock.getMetadata(heldStack.getItemDamage());
if (player.capabilities.isCreativeMode && isInFillMode()) {
creativeReplaceBlocks(block, blockMeta);
return true;
} else {
return survivalPlaceBlocks(player, heldStack, block, blockMeta, side, hitX, hitY, hitZ);
}
}
}
return super.onItemUse(player, heldStack, side, hitX, hitY, hitZ);
}
@Override
public void updateEntity() {
super.updateEntity();
if (worldObj.isRemote) ticks++;
}
private void creativeReplaceBlocks(Block block, int blockMeta) {
for (Coord coord : getShapeSafe().getCoords())
worldObj.setBlock(xCoord + coord.x, yCoord + coord.y, zCoord + coord.z, block, blockMeta, BlockNotifyFlags.ALL);
}
@Override
protected boolean canAddCoord(int x, int y, int z) {
// create safe space around builder, so it's always accesible
return Math.abs(x) > 1 || Math.abs(y) > 1 || Math.abs(z) > 1;
}
private boolean survivalPlaceBlocks(EntityPlayerMP player, ItemStack heldItem, Block block, int blockMeta, int side, float hitX, float hitY, float hitZ) {
for (Coord relCoord : getShapeSafe().getCoords()) {
final int absX = relCoord.x + xCoord;
final int absY = relCoord.y + yCoord;
final int absZ = relCoord.z + zCoord;
if (worldObj.blockExists(absX, absY, absZ) && worldObj.isAirBlock(absX, absY, absZ)) {
boolean hasPlaced = player.theItemInWorldManager.activateBlockOrUseItem(player, worldObj, heldItem, absX, absY, absZ, side, hitX, hitY, hitZ);
if (hasPlaced) {
final String particle = "blockdust_" + Block.getIdFromBlock(block) + "_" + blockMeta;
createServerRpcProxy(IGuideAnimationTrigger.class).trigger(absX, absY, absZ, particle);
return true;
}
}
}
return false;
}
private boolean isInFillMode() {
return worldObj.getBlock(xCoord, yCoord + 1, zCoord) == Blocks.obsidian;
}
public float getTicks() {
return ticks;
}
@Override
public void trigger(int x, int y, int z, final String particle) {
GeometryUtils.line3D(xCoord, yCoord, zCoord, x, y, z, new IShapeable() {
@Override
public void setBlock(int x, int y, int z) {
final double dx = x + 0.5;
final double dy = y + 0.5;
final double dz = z + 0.5;
for (int i = 0; i < 5; i++) {
double px = dx + 0.3 * RANDOM.nextFloat();
double py = dy + 0.3 * RANDOM.nextFloat();
double pz = dz + 0.3 * RANDOM.nextFloat();
worldObj.spawnParticle("portal", px, py, pz, 0, 0, 0);
worldObj.spawnParticle(particle, px, py, pz, 0, 0, 0);
}
}
});
}
}