/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.blocks.machine;
import buildcraft.api.statements.IActionExternal;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import mods.railcraft.common.plugins.buildcraft.actions.Actions;
import mods.railcraft.common.plugins.buildcraft.triggers.IHasWork;
import mods.railcraft.common.plugins.buildcraft.triggers.INeedsFuel;
import mods.railcraft.common.util.misc.Game;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.EnumSkyBlock;
public abstract class TileMultiBlockOven extends TileMultiBlockInventory implements INeedsFuel, IHasWork {
protected int cookTime;
protected boolean cooking;
private boolean wasBurning;
protected boolean paused = false;
private final Set<IActionExternal> actions = new HashSet<IActionExternal>();
public TileMultiBlockOven(String name, int invNum, List<? extends MultiBlockPattern> patterns) {
super(name, invNum, patterns);
}
@Override
public void updateEntity() {
super.updateEntity();
if (getPatternMarker() == 'W') {
if (clock % 4 == 0) {
updateLighting();
}
}
if (Game.isHost(worldObj)) {
if (isMaster) {
if (clock % 16 == 0) {
processActions();
}
}
}
}
protected void updateLighting() {
boolean b = isBurning();
if (wasBurning != b) {
wasBurning = b;
worldObj.updateLightByType(EnumSkyBlock.Block, xCoord, yCoord, zCoord);
markBlockForUpdate();
}
}
@Override
@SideOnly(Side.CLIENT)
public void randomDisplayTick(Random random) {
updateLighting();
if (getPatternMarker() == 'W' && isStructureValid() && random.nextInt(100) < 20 && isBurning()) {
float f = (float) xCoord + 0.5F;
float f1 = (float) yCoord + 0.4375F + (random.nextFloat() * 3F / 16F);
float f2 = (float) zCoord + 0.5F;
float f3 = 0.52F;
float f4 = random.nextFloat() * 0.6F - 0.3F;
worldObj.spawnParticle("flame", f - f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D);
worldObj.spawnParticle("flame", f + f3, f1, f2 + f4, 0.0D, 0.0D, 0.0D);
worldObj.spawnParticle("flame", f + f4, f1, f2 - f3, 0.0D, 0.0D, 0.0D);
worldObj.spawnParticle("flame", f + f4, f1, f2 + f3, 0.0D, 0.0D, 0.0D);
}
}
@Override
public void writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
data.setInteger("cookTime", cookTime);
data.setBoolean("cooking", cooking);
}
@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
cookTime = data.getInteger("cookTime");
cooking = data.getBoolean("cooking");
}
@Override
public void writePacketData(DataOutputStream data) throws IOException {
super.writePacketData(data);
data.writeInt(cookTime);
data.writeBoolean(cooking);
}
@Override
public void readPacketData(DataInputStream data) throws IOException {
super.readPacketData(data);
cookTime = data.readInt();
cooking = data.readBoolean();
}
public int getCookTime() {
TileMultiBlockOven masterOven = (TileMultiBlockOven) getMasterBlock();
if (masterOven != null) {
return masterOven.cookTime;
}
return -1;
}
public boolean isCooking() {
TileMultiBlockOven masterOven = (TileMultiBlockOven) getMasterBlock();
if (masterOven != null) {
return masterOven.cooking;
}
return false;
}
public boolean isBurning() {
return isCooking();
}
public void setCooking(boolean c) {
if (cooking != c) {
cooking = c;
sendUpdateToClient();
}
}
public void setCookTime(int i) {
cookTime = i;
}
public abstract int getTotalCookTime();
public int getCookProgressScaled(int i) {
if (cookTime == 0 || getTotalCookTime() == 0) {
return 0;
}
int scale = (cookTime * i) / getTotalCookTime();
scale = Math.min(scale, i);
scale = Math.max(scale, 0);
return scale;
}
public abstract int getBurnProgressScaled(int i);
@Override
public int getLightValue() {
if (getPatternMarker() == 'W' && isStructureValid() && isBurning()) {
return 13;
}
return 0;
}
private void processActions() {
paused = false;
for (IActionExternal action : actions) {
if (action == Actions.PAUSE) {
paused = true;
}
}
actions.clear();
}
@Override
public boolean hasWork() {
return isCooking();
}
@Override
public void actionActivated(IActionExternal action) {
TileMultiBlockOven mBlock = (TileMultiBlockOven) getMasterBlock();
if (mBlock != null) {
mBlock.actions.add(action);
}
}
}