package mods.eln.sixnode.TreeResinCollector;
import mods.eln.Eln;
import mods.eln.misc.Coordonate;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDU;
import mods.eln.misc.Utils;
import mods.eln.node.NodeBase;
import mods.eln.node.NodeManager;
import mods.eln.node.NodePeriodicPublishProcess;
import mods.eln.node.six.SixNode;
import mods.eln.node.six.SixNodeDescriptor;
import mods.eln.node.six.SixNodeElement;
import mods.eln.sim.ElectricalLoad;
import mods.eln.sim.IProcess;
import mods.eln.sim.ThermalLoad;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import java.io.DataOutputStream;
import java.io.IOException;
public class TreeResinCollectorElement extends SixNodeElement {
TreeResinCollectorSlowProcess slowProcess = new TreeResinCollectorSlowProcess(this);
final float occupancyMax = 2f;
final float occupancyProductPerSecondPerTreeBlock = 3f / 5f / (60f * 24f); // 3 par jour, pour 5 tronc de haut
double timeFromLastActivated = 0;
public TreeResinCollectorElement(SixNode sixNode, Direction side, SixNodeDescriptor descriptor) {
super(sixNode, side, descriptor);
slowProcessList.add(slowProcess);
slowProcessList.add(new NodePeriodicPublishProcess(sixNode, 10f, 10f));
}
@Override
public ElectricalLoad getElectricalLoad(LRDU lrdu) {
return null;
}
@Override
public ThermalLoad getThermalLoad(LRDU lrdu) {
return null;
}
@Override
public int getConnectionMask(LRDU lrdu) {
return 0;
}
@Override
public String multiMeterString() {
return null;
}
@Override
public String thermoMeterString() {
return null;
}
@Override
public void initialize() {
}
double getProductPerSecond() {
Coordonate coord = sixNode.coordonate;
World worldObj = coord.world();
int[] posWood = new int[3];
int[] posCollector = new int[3];
Direction woodDirection = side;
posWood[0] = coord.x;
posWood[1] = coord.y;
posWood[2] = coord.z;
posCollector[0] = coord.x;
posCollector[1] = coord.y;
posCollector[2] = coord.z;
woodDirection.applyTo(posWood, 1);
int leafCount = 0;
int yStart, yEnd;
while (TreeResinCollectorDescriptor.isWood(worldObj.getBlock(posWood[0], posWood[1] - 1, posWood[2]))) {
posWood[1]--;
}
yStart = posWood[1];
posWood[1] = coord.y;
// timeCounter-= timeTarget;
while (TreeResinCollectorDescriptor.isWood(worldObj.getBlock(posWood[0], posWood[1] + 1, posWood[2]))) {
if (TreeResinCollectorDescriptor.isLeaf(worldObj.getBlock(posCollector[0], posWood[1] + 1, posCollector[2])))
leafCount++;
posWood[1]++;
}
yEnd = posWood[1];
int collectiorCount = 0;
Coordonate coordTemp = new Coordonate(posCollector[0], 0, posCollector[2], worldObj);
posCollector[1] = yStart;
for (posCollector[1] = yStart; posCollector[1] <= yEnd; posCollector[1]++) {
coordTemp.y = posCollector[1];
// if(worldObj.getBlockId(posCollector[0],posCollector[1]+1,posCollector[2]) == Eln.treeResinCollectorBlock.blockID)
NodeBase node = NodeManager.instance.getNodeFromCoordonate(coordTemp);
if (node instanceof SixNode) {
SixNode six = (SixNode) node;
if (six.getElement(side) != null && six.getElement(side) instanceof TreeResinCollectorElement) {
collectiorCount++;
}
}
}
if (collectiorCount == 0) {
collectiorCount++;
Utils.println("ASSERT collectiorCount == 0");
}
double leaf = leafCount >= 1 ? 1 : 0.000000001;
double productPerSeconde = Math.min(0.05, occupancyProductPerSecondPerTreeBlock * (yEnd - yStart + 1) / collectiorCount) * leaf;
return productPerSeconde;
}
double getProduct(double productPerSecond) {
double product = productPerSecond * timeFromLastActivated;
return product;
}
@Override
public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side,
float vx, float vy, float vz) {
double productPerSeconde = getProductPerSecond();
double product = getProduct(productPerSeconde);
int productI;
if (product > occupancyMax) {
productI = (int) occupancyMax;
timeFromLastActivated = 0;
} else {
productI = (int) product;
timeFromLastActivated -= (productI) / productPerSeconde;
}
for (int idx = 0; idx < productI; idx++) {
sixNode.dropItem(Eln.treeResin.newItemStack(1));
}
Utils.addChatMessage(entityPlayer, "Tree Resin in pot : " + String.format("%1.2f", productPerSeconde * timeFromLastActivated));
needPublish();
return true;
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
timeFromLastActivated = nbt.getDouble("timeFromLastActivated");
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setDouble("timeFromLastActivated", timeFromLastActivated);
}
class TreeResinCollectorSlowProcess implements IProcess {
TreeResinCollectorElement element;
public TreeResinCollectorSlowProcess(TreeResinCollectorElement element) {
this.element = element;
}
@Override
public void process(double time) {
element.timeFromLastActivated += time;
}
}
@Override
public void networkSerialize(DataOutputStream stream) {
super.networkSerialize(stream);
try {
if (getCoordonate().getBlockExist())
stream.writeFloat((float) getProduct(getProductPerSecond()));
else
stream.writeFloat(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}