package openblocks.common.tileentity;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityXPOrb;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.Vec3;
import net.minecraftforge.fluids.FluidContainerRegistry;
import openblocks.OpenBlocks;
import openblocks.common.LiquidXpUtils;
import openblocks.common.entity.EntityXPOrbNoFly;
import openmods.OpenMods;
import openmods.api.IAddAwareTile;
import openmods.api.INeighbourAwareTile;
import openmods.liquids.GenericTank;
import openmods.sync.SyncableBoolean;
import openmods.tileentity.SyncedTileEntity;
public class TileEntityXPShower extends SyncedTileEntity implements INeighbourAwareTile, IAddAwareTile {
private static final int DRAIN_PER_CYCLE = 50;
private GenericTank bufferTank = new GenericTank(FluidContainerRegistry.BUCKET_VOLUME, OpenBlocks.Fluids.xpJuice);
private SyncableBoolean isOn;
private SyncableBoolean particleSpawnerActive;
private int particleSpawnTimer = 0;
@Override
protected void createSyncedFields() {
isOn = new SyncableBoolean();
particleSpawnerActive = new SyncableBoolean();
}
@Override
public void updateEntity() {
super.updateEntity();
if (!worldObj.isRemote) {
trySpawnXpOrbs();
} else {
trySpawnParticles();
}
}
private void trySpawnXpOrbs() {
boolean hasSpawnedParticle = false;
if (isOn.get() && OpenMods.proxy.getTicks(worldObj) % 3 == 0) {
bufferTank.fillFromSide(DRAIN_PER_CYCLE, worldObj, getPosition(), getOrientation().north());
int amountInTank = bufferTank.getFluidAmount();
if (amountInTank > 0) {
int xpInTank = LiquidXpUtils.liquidToXpRatio(amountInTank);
int drainable = LiquidXpUtils.xpToLiquidRatio(xpInTank);
if (drainable > 0) {
bufferTank.drain(drainable, true);
while (xpInTank > 0) {
hasSpawnedParticle = true;
int xpAmount = EntityXPOrb.getXPSplit(xpInTank);
xpInTank -= xpAmount;
worldObj.spawnEntityInWorld(new EntityXPOrbNoFly(worldObj, xCoord + 0.5D, yCoord, zCoord + 0.5D, xpAmount));
}
}
}
}
particleSpawnerActive.set(hasSpawnedParticle);
sync();
}
private void trySpawnParticles() {
final int particleLevel = OpenBlocks.proxy.getParticleSettings();
if (particleLevel == 0 || (particleLevel == 1 && worldObj.rand.nextInt(3) == 0)) {
particleSpawnTimer = particleSpawnerActive.get()? 10 : particleSpawnTimer - 1;
if (particleSpawnTimer > 0) {
Vec3 vec = Vec3.createVectorHelper(
(worldObj.rand.nextDouble() - 0.5) * 0.05,
0,
(worldObj.rand.nextDouble() - 0.5) * 0.05);
OpenBlocks.proxy.spawnLiquidSpray(worldObj, OpenBlocks.Fluids.xpJuice, xCoord + 0.5d, yCoord + 0.4d, zCoord + 0.5d, 0.4f, 0.7f, vec);
}
}
}
@Override
public void onAdded() {
if (!worldObj.isRemote) updateState();
}
@Override
public void onNeighbourChanged(Block block) {
if (!worldObj.isRemote) updateState();
}
public void updateState() {
final boolean isPowered = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord);
isOn.set(!isPowered);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
bufferTank.readFromNBT(nbt);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
bufferTank.writeToNBT(nbt);
}
}