package mods.eln.transparentnode.solarpanel;
import mods.eln.cable.CableRenderDescriptor;
import mods.eln.ghost.GhostGroup;
import mods.eln.misc.*;
import mods.eln.misc.Obj3D.Obj3DPart;
import mods.eln.node.transparent.TransparentNodeDescriptor;
import mods.eln.sim.ElectricalLoad;
import mods.eln.wiki.Data;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
import java.util.List;
import static mods.eln.i18n.I18N.tr;
public class SolarPanelDescriptor extends TransparentNodeDescriptor {
final Coordonate groundCoordinate;
boolean basicModel;
private Obj3D obj;
private Obj3DPart main;
private Obj3DPart panel;
public SolarPanelDescriptor(
String name,
Obj3D obj, CableRenderDescriptor cableRender,
GhostGroup ghostGroup, int solarOffsetX, int solarOffsetY, int solarOffsetZ,
Coordonate groundCoordinate, double electricalUmax, double electricalPmax,
double electricalDropFactor,
double alphaMin, double alphaMax
) {
super(name, SolarPanelElement.class, SolarPanelRender.class);
this.groundCoordinate = groundCoordinate;
this.ghostGroup = ghostGroup;
electricalRs = electricalUmax * electricalUmax * electricalDropFactor
/ electricalPmax / 2.0;
this.electricalPmax = electricalPmax;
this.solarOffsetX = solarOffsetX;
this.solarOffsetY = solarOffsetY;
this.solarOffsetZ = solarOffsetZ;
this.alphaMax = alphaMax;
this.alphaMin = alphaMin;
basicModel = true;
this.electricalUmax = electricalUmax;
this.obj = obj;
if (obj != null) {
main = obj.getPart("main");
panel = obj.getPart("panel");
}
this.cableRender = cableRender;
canRotate = alphaMax != alphaMin;
voltageLevelColor = VoltageLevelColor.fromVoltage(electricalUmax);
}
public void setParent(net.minecraft.item.Item item, int damage) {
super.setParent(item, damage);
Data.addEnergy(newItemStack());
}
CableRenderDescriptor cableRender;
double electricalUmax;
double electricalPmax;
int solarOffsetX, solarOffsetY, solarOffsetZ;
double alphaMin, alphaMax;
//double efficiency;
double electricalRs;
boolean canRotate;
public void applyTo(ElectricalLoad load) {
load.setRs(electricalRs);
}
public double alphaTrunk(double alpha) {
if (alpha > alphaMax) return alphaMax;
if (alpha < alphaMin) return alphaMin;
return alpha;
}
@Override
public Direction getFrontFromPlace(Direction side, EntityLivingBase entityLiving) {
if (canRotate && groundCoordinate != null) {
// That is, if this isn't a 1x1 panel.
return Direction.ZN;
} else {
return super.getFrontFromPlace(side, entityLiving);
}
}
void draw(float alpha, Direction front) {
front.glRotateZnRef();
GL11.glTranslatef(0, 0, main.getFloat("offZ"));
if (main != null) main.draw();
if (panel != null) {
front.glRotateZnRefInv();
panel.draw(alpha, 0f, 0f, 1f);
}
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item,
ItemRendererHelper helper) {
return type != ItemRenderType.INVENTORY;
}
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
return true;
}
@Override
public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
if (type == ItemRenderType.INVENTORY) {
super.renderItem(type, item, data);
} else {
draw((float) alphaMin, Direction.XN);
}
}
@Override
public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List list, boolean par4) {
super.addInformation(itemStack, entityPlayer, list, par4);
list.add(tr("Produces power from solar radiation."));
list.add(" " + tr("Max. voltage: %1$V", Utils.plotValue(electricalUmax)));
list.add(" " + tr("Max. power: %1$W", Utils.plotValue(electricalPmax)));
if (canRotate) list.add(tr("Can be geared towards the sun."));
}
@Override
public void addCollisionBoxesToList(AxisAlignedBB par5AxisAlignedBB, List list, World world, int x, int y, int z) {
if (canRotate) {
super.addCollisionBoxesToList(par5AxisAlignedBB, list, world, x, y, z);
return;
}
AxisAlignedBB bb = Blocks.stone.getCollisionBoundingBoxFromPool(world, x, y, z);
bb.maxY -= 0.5;
if (par5AxisAlignedBB.intersectsWith(bb)) list.add(bb);
}
}