package mods.eln.transparentnode.turret; import mods.eln.Eln; import mods.eln.generic.GenericItemUsingDamageDescriptor; import mods.eln.i18n.I18N; import mods.eln.item.EntitySensorFilterDescriptor; import mods.eln.misc.Coordonate; 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.transparent.TransparentNode; import mods.eln.node.transparent.TransparentNodeDescriptor; import mods.eln.node.transparent.TransparentNodeElement; import mods.eln.node.transparent.TransparentNodeElementInventory; import mods.eln.sim.ElectricalLoad; import mods.eln.sim.ThermalLoad; import mods.eln.sim.nbt.NbtElectricalLoad; import mods.eln.sim.nbt.NbtResistor; import mods.eln.sixnode.lampsocket.LightBlockEntity; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; 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 TurretElement extends TransparentNodeElement { public static final byte ToggleFilterMeaning = 1; public static final byte UnserializeChargePower = 2; private final TurretDescriptor descriptor; private final TurretMechanicsSimulation simulation; public double chargePower; public boolean filterIsSpare = false; public double energyBuffer = 0; final NbtElectricalLoad load = new NbtElectricalLoad("load"); final NbtResistor powerResistor = new NbtResistor("powerResistor", load, null); final AutoAcceptInventoryProxy acceptingInventory = (new AutoAcceptInventoryProxy(new TransparentNodeElementInventory(1, 64, this))) .acceptAlways(0, 1, new AutoAcceptInventoryProxy.SimpleItemDropper(node), EntitySensorFilterDescriptor.class); public TurretElement(TransparentNode transparentNode, TransparentNodeDescriptor descriptor) { super(transparentNode, descriptor); this.descriptor = (TurretDescriptor) descriptor; chargePower = ((TurretDescriptor) descriptor).getProperties().chargePower; slowProcessList.add(new TurretSlowProcess(this)); simulation = new TurretMechanicsSimulation((TurretDescriptor) descriptor); slowProcessList.add(simulation); Eln.instance.highVoltageCableDescriptor.applyTo(load); electricalLoadList.add(load); electricalComponentList.add(powerResistor); } public TurretDescriptor getDescriptor() { return descriptor; } public float getTurretAngle() { return simulation.getTurretAngle(); } public void setTurretAngle(float angle) { if (simulation.setTurretAngle(angle)) needPublish(); } public float getGunPosition() { return simulation.getGunPosition(); } public void setGunPosition(float position) { if (simulation.setGunPosition(position)) needPublish(); } public void setGunElevation(float elevation) { if (simulation.setGunElevation(elevation)) needPublish(); } public void setSeekMode(boolean seekModeEnabled) { if (seekModeEnabled != simulation.inSeekMode()) needPublish(); simulation.setSeekMode(seekModeEnabled); } public void shoot() { Coordonate lightSourceCoordinate = new Coordonate(); lightSourceCoordinate.copyFrom(coordonate()); lightSourceCoordinate.move(front); LightBlockEntity.addLight(lightSourceCoordinate, 25, 2); if (simulation.shoot()) needPublish(); } public boolean isTargetReached() { return simulation.isTargetReached(); } public void setEnabled(boolean armed) { if (simulation.setEnabled(armed)) needPublish(); } public boolean isEnabled() { return simulation.isEnabled(); } @Override public ElectricalLoad getElectricalLoad(Direction side, LRDU lrdu) { if (side == front.back() && lrdu == LRDU.Down) return load; return null; } @Override public ThermalLoad getThermalLoad(Direction side, LRDU lrdu) { return null; } @Override public int getConnectionMask(Direction side, LRDU lrdu) { if (side == front.back() && lrdu == LRDU.Down) return NodeBase.maskElectricalPower; return 0; } @Override public String multiMeterString(Direction side) { return Utils.plotUIP(load.getU(), load.getI()); } @Override public String thermoMeterString(Direction side) { return null; } @Override public void initialize() { connect(); } @Override public boolean onBlockActivated(EntityPlayer entityPlayer, Direction side, float vx, float vy, float vz) { return acceptingInventory.take(entityPlayer.getCurrentEquippedItem()); } @Override public void networkSerialize(DataOutputStream stream) { super.networkSerialize(stream); try { stream.writeFloat(simulation.getTurretTargetAngle()); stream.writeFloat(simulation.getGunTargetPosition()); stream.writeFloat(simulation.getGunTargetElevation()); stream.writeBoolean(simulation.inSeekMode()); stream.writeBoolean(simulation.isShooting()); stream.writeBoolean(simulation.isEnabled()); Utils.serialiseItemStack(stream, acceptingInventory.getInventory().getStackInSlot(TurretContainer.filterId)); stream.writeBoolean(filterIsSpare); stream.writeFloat((float) chargePower); } catch (IOException e) { e.printStackTrace(); } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setDouble("chargePower", chargePower); nbt.setBoolean("filterIsSpare", filterIsSpare); nbt.setDouble("energyBuffer", energyBuffer); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); chargePower = nbt.getDouble("chargePower"); filterIsSpare = nbt.getBoolean("filterIsSpare"); energyBuffer = nbt.getDouble("energyBuffer"); } @Override public boolean hasGui() { return true; } @Override public IInventory getInventory() { return acceptingInventory.getInventory(); } @Override public Container newContainer(Direction side, EntityPlayer player) { return new TurretContainer(player, acceptingInventory.getInventory()); } @Override public void inventoryChange(IInventory inventory) { super.inventoryChange(inventory); needPublish(); } @Override public byte networkUnserialize(DataInputStream stream) { byte packetType = super.networkUnserialize(stream); try { switch (packetType) { case ToggleFilterMeaning: filterIsSpare = !filterIsSpare; needPublish(); break; case UnserializeChargePower: chargePower = stream.readFloat(); needPublish(); break; } } catch (IOException e) { e.printStackTrace(); } return unserializeNulldId; } @Override public Map<String, String> getWaila() { Map<String, String> info = new HashMap<String, String>(); info.put(I18N.tr("Charge power"), Utils.plotPower("", chargePower)); ItemStack filterStack = acceptingInventory.getInventory().getStackInSlot(TurretContainer.filterId); if (filterStack != null) { GenericItemUsingDamageDescriptor gen = EntitySensorFilterDescriptor.getDescriptor(filterStack); if (gen != null && gen instanceof EntitySensorFilterDescriptor) { EntitySensorFilterDescriptor filter = (EntitySensorFilterDescriptor) gen; String target = I18N.tr("Shoot "); if (filterIsSpare) { target += "not "; } if (filter.entityClass == EntityPlayer.class) { target += I18N.tr("players"); } else if (filter.entityClass == IMob.class) { target += I18N.tr("monsters"); } else if (filter.entityClass == EntityAnimal.class) { target += I18N.tr("animals"); } else { target += I18N.tr("??"); } info.put(I18N.tr("Target"), target); } } else { if (filterIsSpare) { info.put(I18N.tr("Target"), I18N.tr("Shoot everything")); } else { info.put(I18N.tr("Target"), I18N.tr("Shoot nothing")); } } if (Eln.wailaEasyMode) { info.put(I18N.tr("Charge level"), Utils.plotPercent("", energyBuffer / descriptor.getProperties().impulseEnergy)); } return info; } }