package mods.eln.sixnode.lampsocket; import mods.eln.Eln; import mods.eln.generic.GenericItemUsingDamageDescriptor; import mods.eln.i18n.I18N; import mods.eln.item.BrushDescriptor; import mods.eln.item.LampDescriptor; import mods.eln.misc.Direction; import mods.eln.misc.LRDU; import mods.eln.misc.Utils; import mods.eln.node.AutoAcceptInventoryProxy; import mods.eln.node.NodeBase; import mods.eln.node.six.SixNode; import mods.eln.node.six.SixNodeDescriptor; import mods.eln.node.six.SixNodeElement; import mods.eln.node.six.SixNodeElementInventory; import mods.eln.sim.ElectricalLoad; import mods.eln.sim.MonsterPopFreeProcess; import mods.eln.sim.ThermalLoad; import mods.eln.sim.mna.component.Resistor; import mods.eln.sim.nbt.NbtElectricalLoad; import mods.eln.sixnode.electricalcable.ElectricalCableDescriptor; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class LampSocketElement extends SixNodeElement { LampSocketDescriptor socketDescriptor = null; public MonsterPopFreeProcess monsterPopFreeProcess = new MonsterPopFreeProcess(sixNode.coordonate, Eln.instance.killMonstersAroundLampsRange); public NbtElectricalLoad positiveLoad = new NbtElectricalLoad("positiveLoad"); public LampSocketProcess lampProcess = new LampSocketProcess(this); public Resistor lampResistor = new Resistor(positiveLoad, null); boolean poweredByLampSupply = true; boolean grounded = true; private AutoAcceptInventoryProxy acceptingInventory = (new AutoAcceptInventoryProxy(new SixNodeElementInventory(2, 64, this))) .acceptIfEmpty(0, LampDescriptor.class) .acceptIfEmpty(1, ElectricalCableDescriptor.class); LampDescriptor lampDescriptor = null; public String channel = lastSocketName; public static String lastSocketName = "Default channel"; static final int setGroundedId = 1; static final int setAlphaZId = 2; static final int tooglePowerSupplyType = 3, setChannel = 4; boolean isConnectedToLampSupply = false; public int paintColor = 15; public LampSocketElement(SixNode sixNode, Direction side, SixNodeDescriptor descriptor) { super(sixNode, side, descriptor); this.socketDescriptor = (LampSocketDescriptor) descriptor; lampProcess.alphaZ = this.socketDescriptor.alphaZBoot; slowProcessList.add(lampProcess); slowProcessList.add(monsterPopFreeProcess); } @Override public IInventory getInventory() { if (acceptingInventory != null) return acceptingInventory.getInventory(); else return null; } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); byte value = nbt.getByte("front"); front = LRDU.fromInt((value >> 0) & 0x3); grounded = (value & 4) != 0; setPoweredByLampSupply(nbt.getBoolean("poweredByLampSupply")); channel = nbt.getString("channel"); byte b = nbt.getByte("color"); if (socketDescriptor.paintable) paintColor = b & 0xF; else { //For avoid existing lamps just set paintable to be drawn black (0) by default. //Of course, maps need to be loaded with this code before set an already existing lamp paintable. paintColor = 0x0F; } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setByte("front", (byte) ((front.toInt() << 0) + (grounded ? 4 : 0))); nbt.setBoolean("poweredByLampSupply", poweredByLampSupply); nbt.setString("channel", channel); nbt.setByte("color", (byte) (paintColor)); } public void networkUnserialize(DataInputStream stream) { try { switch (stream.readByte()) { case setGroundedId: grounded = stream.readByte() != 0; computeElectricalLoad(); reconnect(); break; case setAlphaZId: lampProcess.alphaZ = stream.readFloat(); needPublish(); break; case tooglePowerSupplyType: setPoweredByLampSupply(!poweredByLampSupply); reconnect(); break; case setChannel: channel = stream.readUTF(); lastSocketName = channel; needPublish(); break; } } catch (IOException e) { e.printStackTrace(); } } private void setPoweredByLampSupply(boolean b) { poweredByLampSupply = b; } @Override public void disconnectJob() { super.disconnectJob(); electricalLoadList.remove(positiveLoad); electricalComponentList.remove(lampResistor); positiveLoad.state = 0; } @Override public void connectJob() { if (!poweredByLampSupply) { electricalLoadList.add(positiveLoad); electricalComponentList.add(lampResistor); } super.connectJob(); } @Override protected void inventoryChanged() { computeElectricalLoad(); reconnect(); } @Override public boolean hasGui() { return true; } @Override public Container newContainer(Direction side, EntityPlayer player) { return new LampSocketContainer(player, acceptingInventory.getInventory(), socketDescriptor); } public static boolean canBePlacedOnSide(Direction side, int type) { return true; } @Override public ElectricalLoad getElectricalLoad(LRDU lrdu) { if (acceptingInventory.getInventory().getStackInSlot(LampSocketContainer.cableSlotId) == null) return null; if (poweredByLampSupply) return null; if (grounded) return positiveLoad; return null; } @Override public ThermalLoad getThermalLoad(LRDU lrdu) { return null; } @Override public int getConnectionMask(LRDU lrdu) { if (acceptingInventory.getInventory().getStackInSlot(LampSocketContainer.cableSlotId) == null) return 0; if (poweredByLampSupply) return 0; if (grounded) return NodeBase.maskElectricalPower; if (front == lrdu) return NodeBase.maskElectricalPower; if (front == lrdu.inverse()) return NodeBase.maskElectricalPower; return 0; } @Override public String multiMeterString() { return Utils.plotVolt("U:", positiveLoad.getU()) + Utils.plotAmpere("I:", lampResistor.getCurrent()); } @Override public Map<String, String> getWaila() { Map<String, String> info = new HashMap<String, String>(); info.put(I18N.tr("Power consumption"), Utils.plotPower("", lampResistor.getI() * lampResistor.getU())); if (lampDescriptor != null) { info.put(I18N.tr("Bulb"), lampDescriptor.name); } else { info.put(I18N.tr("Bulb"), I18N.tr("None")); } if (Eln.wailaEasyMode) { if (poweredByLampSupply) { info.put(I18N.tr("Channel"), channel); } info.put(I18N.tr("Voltage"), Utils.plotVolt("", positiveLoad.getU())); ItemStack lampStack = acceptingInventory.getInventory().getStackInSlot(0); if (lampStack != null && lampDescriptor != null) { info.put(I18N.tr("Life"), Utils.plotValue(lampDescriptor.getLifeInTag(lampStack))); } } return info; } @Override public String thermoMeterString() { return null; } @Override public void networkSerialize(DataOutputStream stream) { super.networkSerialize(stream); try { stream.writeByte((grounded ? (1 << 6) : 0)); Utils.serialiseItemStack(stream, acceptingInventory.getInventory().getStackInSlot(LampSocketContainer.lampSlotId)); stream.writeFloat((float) lampProcess.alphaZ); Utils.serialiseItemStack(stream, acceptingInventory.getInventory().getStackInSlot(LampSocketContainer.cableSlotId)); stream.writeBoolean(poweredByLampSupply); stream.writeUTF(channel); stream.writeBoolean(isConnectedToLampSupply); stream.writeByte(lampProcess.light); stream.writeByte(paintColor); } catch (IOException e) { e.printStackTrace(); } } @Override public void initialize() { computeElectricalLoad(); } public void computeElectricalLoad() { ItemStack lamp = acceptingInventory.getInventory().getStackInSlot(LampSocketContainer.lampSlotId); ItemStack cable = acceptingInventory.getInventory().getStackInSlot(LampSocketContainer.cableSlotId); ElectricalCableDescriptor cableDescriptor = (ElectricalCableDescriptor) Eln.sixNodeItem.getDescriptor(cable); if (cableDescriptor == null) { positiveLoad.highImpedance(); //negativeLoad.highImpedance(); } else { cableDescriptor.applyTo(positiveLoad); //cableDescriptor.applyTo(negativeLoad, grounded,5); } lampDescriptor = (LampDescriptor) Utils.getItemObject(lamp); if (lampDescriptor == null) { lampResistor.setR(Double.POSITIVE_INFINITY); } else { lampDescriptor.applyTo(lampResistor); } } @Override public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) { if (Utils.isPlayerUsingWrench(entityPlayer)) { front = front.getNextClockwise(); if (socketDescriptor.rotateOnlyBy180Deg) front = front.getNextClockwise(); reconnect(); return true; } ItemStack currentItemStack = entityPlayer.getCurrentEquippedItem(); if (currentItemStack != null) { GenericItemUsingDamageDescriptor itemDescriptor = GenericItemUsingDamageDescriptor.getDescriptor(currentItemStack); if (itemDescriptor != null) { if (itemDescriptor instanceof BrushDescriptor) { BrushDescriptor brush = (BrushDescriptor) itemDescriptor; int brushColor = brush.getColor(currentItemStack); if (brushColor != paintColor && brush.use(currentItemStack, entityPlayer)) { paintColor = brushColor; needPublish(); //Sync } return true; } } } return acceptingInventory.take(entityPlayer.getCurrentEquippedItem()); } public int getLightValue() { return lampProcess.getBlockLight(); } @Override public void destroy(EntityPlayerMP entityPlayer) { super.destroy(entityPlayer); lampProcess.destructor(); } void setIsConnectedToLampSupply(boolean value) { if (isConnectedToLampSupply != value) { isConnectedToLampSupply = value; needPublish(); } } }