package mods.eln.sixnode.electricalswitch; import mods.eln.Eln; import mods.eln.cable.CableRenderDescriptor; import mods.eln.misc.*; import mods.eln.misc.Obj3D.Obj3DPart; import mods.eln.node.NodeBase; import mods.eln.node.six.SixNodeDescriptor; import mods.eln.sim.ElectricalLoad; import mods.eln.sim.ThermalLoadInitializer; import mods.eln.sim.mna.component.Resistor; import mods.eln.wiki.Data; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import org.lwjgl.opengl.GL11; import java.util.Collections; import java.util.List; import static mods.eln.i18n.I18N.tr; public class ElectricalSwitchDescriptor extends SixNodeDescriptor { public float speed = 1f; float alphaOn, alphaOff; float leverTx; enum ObjType {Lever, Button} ObjType objType; boolean signalSwitch; double electricalRs; ThermalLoadInitializer thermal; Obj3D obj; Obj3DPart main, lever, led, halo; CableRenderDescriptor cableRender; double nominalVoltage, nominalPower; double maximalVoltage, maximalPower; public float[] pinDistance; public ElectricalSwitchDescriptor( String name, CableRenderDescriptor cableRender, Obj3D obj, double nominalVoltage, double nominalPower, double rs, double maximalVoltage, double maximalPower, ThermalLoadInitializer thermal, boolean signalSwitch) { super(name, ElectricalSwitchElement.class, ElectricalSwitchRender.class); if (!Eln.noSymbols) { setDefaultIcon("switch"); } this.nominalVoltage = nominalVoltage; this.nominalPower = nominalPower; this.maximalPower = maximalPower; this.maximalVoltage = maximalVoltage; this.cableRender = cableRender; electricalRs = rs / 2; this.obj = obj; if (obj != null) { if (main == null) main = obj.getPart("case"); if (main == null) main = obj.getPart("main"); if (lever == null) lever = obj.getPart("lever"); if (lever == null) lever = obj.getPart("button"); led = obj.getPart("led"); halo = obj.getPart("halo"); if (obj.getString("type").equals("lever")) { objType = ObjType.Lever; if (lever != null) { speed = lever.getFloat("speed"); alphaOff = lever.getFloat("alphaOff"); alphaOn = lever.getFloat("alphaOn"); } } else if (obj.getString("type").equals("button")) { objType = ObjType.Button; if (lever != null) { speed = lever.getFloat("speed"); leverTx = lever.getFloat("tx"); } } } this.thermal = thermal; double I = maximalPower / nominalVoltage; thermal.setMaximalPower(I * I * electricalRs); this.signalSwitch = signalSwitch; pinDistance = Utils.getSixNodePinDistance(main); if (signalSwitch) { voltageLevelColor = VoltageLevelColor.SignalVoltage; } else { voltageLevelColor = VoltageLevelColor.fromVoltage(nominalVoltage); } } @Override public void setParent(Item item, int damage) { super.setParent(item, damage); Data.addWiring(newItemStack()); } public void applyTo(ElectricalLoad load) { load.setRs(electricalRs); } public void applyTo(Resistor resistor, boolean state) { if (state) { resistor.setR(electricalRs); } else { resistor.highImpedance(); } } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { return true; } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return type != ItemRenderType.INVENTORY; } @Override public boolean shouldUseRenderHelperEln(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return type != ItemRenderType.INVENTORY; } @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { //if (type == ItemRenderType.INVENTORY) GL11.glScalef(1.8f, 1.8f, 1.8f); if (type != ItemRenderType.INVENTORY) { draw(0f, 0f, null); } else { super.renderItem(type, item, data); } } public void draw(float on, float distance, TileEntity e) { switch (objType) { case Button: if (main != null) main.draw(); GL11.glTranslatef(leverTx * on, 0f, 0f); if (lever != null) lever.draw(); if (on < 0.5f) { GL11.glColor3f(234f / 255f, 80 / 255f, 0f); UtilsClient.disableLight(); if (led != null) led.draw(); UtilsClient.enableBlend(); if (halo != null) { if (e == null) UtilsClient.drawLight(halo); else UtilsClient.drawHaloNoLightSetup(halo, 234f / 255f, 80 / 255f, 0f, e, false); } UtilsClient.disableBlend(); UtilsClient.enableLight(); } else { if (led != null) led.draw(); } break; case Lever: GL11.glPushMatrix(); if (nominalVoltage <= Eln.MVU) { GL11.glScaled(0.5f, 0.5f, 0.5f); } if (main != null) main.draw(); if (lever != null) lever.draw(on * (alphaOn - alphaOff) + alphaOff, 0, 1, 0); GL11.glPopMatrix(); break; default: break; } } public int getNodeMask() { if (signalSwitch) return NodeBase.maskElectricalGate; else return NodeBase.maskElectricalPower; } @Override public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List list, boolean par4) { super.addInformation(itemStack, entityPlayer, list, par4); Collections.addAll(list, tr("Can break an electrical circuit\ninterrupting the current.").split("\n")); } @Override public LRDU getFrontFromPlace(Direction side, EntityPlayer player) { if (signalSwitch) { return super.getFrontFromPlace(side, player); } else { return super.getFrontFromPlace(side, player).inverse(); } } }