package mods.eln.transparentnode.turret;
import mods.eln.Eln;
import mods.eln.misc.Obj3D;
import mods.eln.misc.Obj3D.Obj3DPart;
import mods.eln.misc.Utils;
import mods.eln.misc.UtilsClient;
import mods.eln.misc.VoltageLevelColor;
import mods.eln.node.transparent.TransparentNodeDescriptor;
import mods.eln.wiki.Data;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
import java.util.Collections;
import java.util.List;
import static mods.eln.i18n.I18N.tr;
public class TurretDescriptor extends TransparentNodeDescriptor {
class Properties {
public final float actionAngle;
public final float detectionDistance;
public final float aimDistance;
public final float impulseEnergy;
public final float gunMinElevation;
public final float gunMaxElevation;
public final float turretSeekAnimationSpeed;
public final float turretAimAnimationSpeed;
public final float gunArmAnimationSpeed;
public final float gunDisarmAnimationSpeed;
public final float gunAimAnimationSpeed;
public final double minimalVoltage;
public final double minimalVoltageHysteresisFactor;
public final double maximalVoltage;
public final double basePower;
public final double chargePower;
public final double entityDetectionInterval;
public Properties() {
actionAngle = 70;
detectionDistance = 12;
aimDistance = 15;
impulseEnergy = 1000;
gunMinElevation = -40;
gunMaxElevation = 70;
turretSeekAnimationSpeed = 40;
turretAimAnimationSpeed = 70;
gunArmAnimationSpeed = 3;
gunDisarmAnimationSpeed = 0.5f;
gunAimAnimationSpeed = 100;
minimalVoltage = 600;
minimalVoltageHysteresisFactor = 0.1;
maximalVoltage = 1050;
basePower = 25;
chargePower = 1000;
entityDetectionInterval = 0.25;
}
}
private final Obj3DPart turret, holder, joint, leftGun, rightGun, sensor, fire;
private final Properties properties;
public TurretDescriptor(String name, String modelName) {
super(name, TurretElement.class, TurretRender.class);
final Obj3D obj = Eln.obj.getObj(modelName);
turret = obj.getPart("Turret");
holder = obj.getPart("Holder");
joint = obj.getPart("Joint");
leftGun = obj.getPart("LeftGun");
rightGun = obj.getPart("RightGun");
sensor = obj.getPart("Sensor");
fire = obj.getPart("Fire");
properties = new Properties();
voltageLevelColor = VoltageLevelColor.HighVoltage;
}
public Properties getProperties() {
return properties;
}
@Override
public void setParent(Item item, int damage) {
super.setParent(item, damage);
Data.addMachine(newItemStack());
}
@Override
public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List list, boolean par4) {
super.addInformation(itemStack, entityPlayer, list, par4);
Collections.addAll(list, tr("Scans for entities and shoots if the\nentity matches the configurable filter criteria.").split("\n"));
list.add(tr("Nominal voltage: %1$V", 800));
list.add(tr("Standby power: %1$W", Utils.plotValue(getProperties().basePower)));
list.add(tr("Laser charge power: %1$W...%2$kW", 100, 10));
list.add(tr("CAUTION: Cables can get quite hot!"));
}
@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)
super.renderItem(type, item, data);
else
draw(null);
}
public void draw(TurretRender render) {
float turretAngle = render != null ? render.getTurretAngle() : 0;
float gunPosition = render != null ? render.getGunPosition() : 0;
float gunAngle = render != null ? -render.getGunElevation() : 0;
boolean shooting = render != null && render.isShooting();
boolean enabled = render == null || render.isEnabled();
if (holder != null) holder.draw();
if (joint != null) joint.draw();
GL11.glPushMatrix();
GL11.glRotatef(turretAngle, 0f, 1f, 0f);
if (turret != null) turret.draw();
if (sensor != null) {
if (enabled) {
if (render != null && render.filter != null)
if (render.filterIsSpare)
render.filter.glInverseColor(0.5f + 0.5f * gunPosition);
else
render.filter.glColor(0.5f + 0.5f * gunPosition);
else
GL11.glColor3f(0.5f, 0.5f, 0.5f);
UtilsClient.drawLight(sensor);
GL11.glColor3f(1f, 1f, 1f);
} else {
GL11.glColor3f(0.5f, 0.5f, 0.5f);
sensor.draw();
}
}
GL11.glRotatef(gunAngle, 0f, 0f, 1f);
GL11.glColor4f(.6f, .8f, 1f, .4f);
if (shooting && fire != null) UtilsClient.drawLight(fire);
GL11.glColor4f(1f, 1f, 1f, 1f);
GL11.glTranslatef(0f, 0f, gunPosition / 4f);
if (leftGun != null) leftGun.draw();
GL11.glTranslatef(0f, 0f, -gunPosition / 2f);
if (rightGun != null) rightGun.draw();
GL11.glPopMatrix();
}
}