From feac01af4a637a1513fa73ff4874a91f178c2313 Mon Sep 17 00:00:00 2001 From: Calclavia Date: Tue, 30 Sep 2014 09:49:57 +0800 Subject: [PATCH] Converted some multimeter classes to Scala --- .../multimeter/ContainerMultimeter.java | 54 ---- .../multimeter/ContainerMultimeter.scala | 32 +++ .../electrical/multimeter/GuiMultimeter.java | 106 -------- .../electrical/multimeter/GuiMultimeter.scala | 86 ++++++ .../electrical/multimeter/ItemMultimeter.java | 101 -------- .../multimeter/ItemMultimeter.scala | 80 ++++++ .../multimeter/ModelMultimeter.java | 75 ------ .../electrical/multimeter/MultimeterGrid.java | 244 ------------------ .../multimeter/MultimeterGrid.scala | 180 +++++++++++++ .../electrical/multimeter/graph/Graph.java | 2 +- 10 files changed, 379 insertions(+), 581 deletions(-) delete mode 100644 src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.java create mode 100644 src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.scala delete mode 100644 src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.java create mode 100644 src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.scala delete mode 100644 src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.java create mode 100644 src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.scala delete mode 100644 src/main/scala/resonantinduction/electrical/multimeter/ModelMultimeter.java delete mode 100644 src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.java create mode 100644 src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.scala diff --git a/src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.java b/src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.java deleted file mode 100644 index 97d72f8c4..000000000 --- a/src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * - */ -package resonantinduction.electrical.multimeter; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.Slot; - -/** - * @author Calclavia - * - */ -public class ContainerMultimeter extends Container -{ - private final int yDisplacement = 51; - private PartMultimeter tileEntity; - - public ContainerMultimeter(InventoryPlayer inventoryPlayer, PartMultimeter tileEntity) - { - this.tileEntity = tileEntity; - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18 + yDisplacement)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142 + yDisplacement)); - } - - this.tileEntity.playersUsing.add(inventoryPlayer.player); - } - - @Override - public void onContainerClosed(EntityPlayer entityPlayer) - { - this.tileEntity.playersUsing.remove(entityPlayer); - super.onContainerClosed(entityPlayer); - } - - @Override - public boolean canInteractWith(EntityPlayer entityplayer) - { - return true; - } - -} diff --git a/src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.scala b/src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.scala new file mode 100644 index 000000000..6ba851bf6 --- /dev/null +++ b/src/main/scala/resonantinduction/electrical/multimeter/ContainerMultimeter.scala @@ -0,0 +1,32 @@ +/** + * + */ +package resonantinduction.electrical.multimeter + +import net.minecraft.entity.player.{EntityPlayer, InventoryPlayer} +import net.minecraft.inventory.{Container, Slot} + +/** + * @author Calclavia + * + */ +class ContainerMultimeter(inventoryPlayer: InventoryPlayer, tileEntity: PartMultimeter) extends Container +{ + private final val yDisplacement: Int = 51 + + for (i <- 0 until 3; j <- 0 until 9) + addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18 + yDisplacement)) + + for (i <- 0 until 9) + this.addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142 + yDisplacement)) + + tileEntity.playersUsing.add(inventoryPlayer.player) + + override def onContainerClosed(entityPlayer: EntityPlayer) + { + this.tileEntity.playersUsing.remove(entityPlayer) + super.onContainerClosed(entityPlayer) + } + + def canInteractWith(entityplayer: EntityPlayer): Boolean = true; +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.java b/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.java deleted file mode 100644 index 0fbd61a63..000000000 --- a/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * - */ -package resonantinduction.electrical.multimeter; - -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiTextField; -import net.minecraft.entity.player.InventoryPlayer; -import resonant.lib.gui.GuiContainerBase; -import resonant.lib.render.EnumColor; -import resonant.lib.utility.LanguageUtility; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -/** - * Multimeter GUI - * - * @author Calclavia - * - */ -@SideOnly(Side.CLIENT) -public class GuiMultimeter extends GuiContainerBase -{ - PartMultimeter multimeter; - private GuiTextField textFieldLimit; - - public GuiMultimeter(InventoryPlayer inventoryPlayer, PartMultimeter tileEntity) - { - super(new ContainerMultimeter(inventoryPlayer, tileEntity)); - this.multimeter = tileEntity; - this.ySize = 217; - } - - @Override - public void initGui() - { - super.initGui(); - this.buttonList.add(new GuiButton(0, this.width / 2 + 20, this.height / 2 - 23, 50, 20, LanguageUtility.getLocal("gui.resonantinduction.multimeter.toggle"))); - this.buttonList.add(new GuiButton(1, this.width / 2 - 80, this.height / 2 - 75, 100, 20, LanguageUtility.getLocal("gui.resonantinduction.multimeter.toggleDetection"))); - this.buttonList.add(new GuiButton(2, this.width / 2 - 80, this.height / 2 + 0, 80, 20, LanguageUtility.getLocal("gui.resonantinduction.multimeter.toggleGraph"))); - this.textFieldLimit = new GuiTextField(fontRendererObj, 9, 90, 90, 12); - this.textFieldLimit.setMaxStringLength(8); - this.textFieldLimit.setText("" + this.multimeter.redstoneTriggerLimit); - } - - @Override - protected void keyTyped(char par1, int par2) - { - super.keyTyped(par1, par2); - this.textFieldLimit.textboxKeyTyped(par1, par2); - - try - { - multimeter.redstoneTriggerLimit = Double.parseDouble(textFieldLimit.getText()); - multimeter.updateServer(); - } - catch (Exception e) - { - } - } - - @Override - protected void mouseClicked(int par1, int par2, int par3) - { - super.mouseClicked(par1, par2, par3); - this.textFieldLimit.mouseClicked(par1 - this.containerWidth, par2 - this.containerHeight, par3); - } - - @Override - protected void actionPerformed(GuiButton button) - { - switch (button.id) - { - case 0: - multimeter.toggleMode(); - break; - case 1: - multimeter.toggleDetectionValue(); - break; - case 2: - multimeter.toggleGraphType(); - break; - } - } - - @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) - { - String graphName = multimeter.getNetwork().getLocalized(multimeter.getNetwork().graphs.get(multimeter.graphType)); - super.drawGuiContainerForegroundLayer(mouseX, mouseY); - String s = LanguageUtility.getLocal("item.resonantinduction:multimeter.name"); - this.fontRendererObj.drawString(s, this.xSize / 2 - this.fontRendererObj.getStringWidth(s) / 2, 6, 4210752); - this.fontRendererObj.drawString(EnumColor.INDIGO + "Detection Type", 9, 20, 4210752); - this.fontRendererObj.drawString(multimeter.getNetwork().getDisplay(multimeter.detectType), 9, 60, 4210752); - this.fontRendererObj.drawString(LanguageUtility.getLocal("gui.resonantinduction.multimeter.logic")+" " + EnumColor.RED + LanguageUtility.getLocal("gui.resonantinduction.multimeter." + this.multimeter.getMode().display), 9, 75, 4210752); - this.fontRendererObj.drawString(graphName, 95, 115, 4210752); - this.textFieldLimit.drawTextBox(); - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int x, int y) - { - super.drawGuiContainerBackgroundLayer(f, x, y); - } - -} diff --git a/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.scala b/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.scala new file mode 100644 index 000000000..d288db12b --- /dev/null +++ b/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.scala @@ -0,0 +1,86 @@ +/** + * + */ +package resonantinduction.electrical.multimeter + +import cpw.mods.fml.relauncher.{Side, SideOnly} +import net.minecraft.client.gui.{GuiButton, GuiTextField} +import net.minecraft.entity.player.InventoryPlayer +import resonant.lib.gui.GuiContainerBase +import resonant.lib.render.EnumColor +import resonant.lib.utility.LanguageUtility +import resonant.lib.wrapper.WrapList._ + +/** + * Multimeter GUI + * + * @author Calclavia + * + */ +@SideOnly(Side.CLIENT) +class GuiMultimeter(inventoryPlayer: InventoryPlayer, multimeter: PartMultimeter) extends GuiContainerBase(new ContainerMultimeter(inventoryPlayer, multimeter)) +{ + private var textFieldLimit: GuiTextField = null + this.ySize = 217 + + override def initGui + { + super.initGui + this.buttonList.add(new GuiButton(0, this.width / 2 + 20, this.height / 2 - 23, 50, 20, LanguageUtility.getLocal("gui.resonantinduction.multimeter.toggle"))) + this.buttonList.add(new GuiButton(1, this.width / 2 - 80, this.height / 2 - 75, 100, 20, LanguageUtility.getLocal("gui.resonantinduction.multimeter.toggleDetection"))) + this.buttonList.add(new GuiButton(2, this.width / 2 - 80, this.height / 2 + 0, 80, 20, LanguageUtility.getLocal("gui.resonantinduction.multimeter.toggleGraph"))) + this.textFieldLimit = new GuiTextField(fontRendererObj, 9, 90, 90, 12) + this.textFieldLimit.setMaxStringLength(8) + this.textFieldLimit.setText("" + this.multimeter.redstoneTriggerLimit) + } + + protected override def keyTyped(par1: Char, par2: Int) + { + super.keyTyped(par1, par2) + this.textFieldLimit.textboxKeyTyped(par1, par2) + + try + { + multimeter.redstoneTriggerLimit = textFieldLimit.getText.toDouble + multimeter.updateServer() + } + catch + { + case e: Exception => + { + } + } + } + + protected override def mouseClicked(par1: Int, par2: Int, par3: Int) + { + super.mouseClicked(par1, par2, par3) + this.textFieldLimit.mouseClicked(par1 - this.containerWidth, par2 - this.containerHeight, par3) + } + + protected override def actionPerformed(button: GuiButton) + { + button.id match + { + case 0 => + multimeter.toggleMode() + case 1 => + multimeter.toggleDetectionValue() + case 2 => + multimeter.toggleGraphType() + } + } + + protected override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) + { + val graphName: String = multimeter.getNetwork.getLocalized(multimeter.getNetwork.graphs(multimeter.graphType)) + super.drawGuiContainerForegroundLayer(mouseX, mouseY) + val s: String = LanguageUtility.getLocal("item.resonantinduction:multimeter.name") + this.fontRendererObj.drawString(s, this.xSize / 2 - this.fontRendererObj.getStringWidth(s) / 2, 6, 4210752) + this.fontRendererObj.drawString(EnumColor.INDIGO + "Detection Type", 9, 20, 4210752) + this.fontRendererObj.drawString(multimeter.getNetwork.getDisplay(multimeter.detectType), 9, 60, 4210752) + this.fontRendererObj.drawString(LanguageUtility.getLocal("gui.resonantinduction.multimeter.logic") + " " + EnumColor.RED + LanguageUtility.getLocal("gui.resonantinduction.multimeter." + this.multimeter.getMode.display), 9, 75, 4210752) + this.fontRendererObj.drawString(graphName, 95, 115, 4210752) + this.textFieldLimit.drawTextBox() + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.java b/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.java deleted file mode 100644 index 706721cc2..000000000 --- a/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.java +++ /dev/null @@ -1,101 +0,0 @@ -package resonantinduction.electrical.multimeter; - -import java.util.List; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -import org.lwjgl.input.Keyboard; - -import resonant.lib.render.EnumColor; -import resonant.lib.utility.LanguageUtility; -import resonantinduction.core.ResonantPartFactory; -import resonantinduction.core.ResonantPartFactory$; -import resonantinduction.core.prefab.part.IHighlight; -import resonantinduction.electrical.wire.base.WireMaterial; -import codechicken.lib.vec.BlockCoord; -import codechicken.lib.vec.Vector3; -import codechicken.microblock.FacePlacementGrid$; -import codechicken.multipart.JItemMultiPart; -import codechicken.multipart.MultiPartRegistry; -import codechicken.multipart.PartMap; -import codechicken.multipart.TMultiPart; -import codechicken.multipart.TileMultipart; - -public class ItemMultimeter extends JItemMultiPart implements IHighlight -{ - private IIcon[] icons = new IIcon[WireMaterial.values().length]; - - @Override - public TMultiPart newPart(ItemStack itemStack, EntityPlayer player, World world, BlockCoord pos, int side, Vector3 hit) - { - side = FacePlacementGrid$.MODULE$.getHitSlot(hit, side); - - TileEntity tile = world.getTileEntity(pos.x, pos.y, pos.z); - - if (tile instanceof TileMultipart) - { - TMultiPart centerPart = ((TileMultipart) tile).partMap(PartMap.CENTER.ordinal()); - - if (centerPart != null && !player.isSneaking()) - { - pos.offset(side ^ 1); - } - } - - PartMultimeter part = ResonantPartFactory$.MODULE$.create(PartMultimeter.class); - - if (part != null) - { - int l = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - int facing = l == 0 ? 2 : (l == 1 ? 5 : (l == 2 ? 3 : (l == 3 ? 4 : 0))); - part.preparePlacement(side, facing); - } - - return part; - } - - @Override - public void addInformation(ItemStack itemStack, EntityPlayer par2EntityPlayer, List list, boolean par4) - { - if (!Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) - { - list.add(LanguageUtility.getLocal("tooltip.noShift").replace("%0", EnumColor.AQUA.toString()).replace("%1", EnumColor.GREY.toString())); - } - else - { - list.addAll(LanguageUtility.splitStringPerWord(LanguageUtility.getLocal("item.resonantinduction:multimeter.tooltip"), 5)); - } - } - - public float getDetection(ItemStack itemStack) - { - if (itemStack.stackTagCompound == null || !itemStack.getTagCompound().hasKey("detection")) - { - return -1; - } - - return itemStack.stackTagCompound.getFloat("detection"); - } - - public void setDetection(ItemStack itemStack, float detection) - { - if (itemStack.stackTagCompound == null) - { - itemStack.setTagCompound(new NBTTagCompound()); - } - - itemStack.stackTagCompound.setFloat("detection", detection); - } - - @Override - public int getHighlightType() - { - return 0; - } -} diff --git a/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.scala b/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.scala new file mode 100644 index 000000000..c1acea712 --- /dev/null +++ b/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.scala @@ -0,0 +1,80 @@ +package resonantinduction.electrical.multimeter + +import java.util.List + +import codechicken.lib.vec.{BlockCoord, Vector3} +import codechicken.microblock.FacePlacementGrid +import codechicken.multipart.{JItemMultiPart, PartMap, TMultiPart, TileMultipart} +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.MathHelper +import net.minecraft.world.World +import org.lwjgl.input.Keyboard +import resonant.lib.render.EnumColor +import resonant.lib.utility.LanguageUtility +import resonant.lib.wrapper.WrapList._ +import resonantinduction.core.ResonantPartFactory +import resonantinduction.core.prefab.part.IHighlight + +class ItemMultimeter extends JItemMultiPart with IHighlight +{ + def newPart(itemStack: ItemStack, player: EntityPlayer, world: World, pos: BlockCoord, vSide: Int, hit: Vector3): TMultiPart = + { + val side = FacePlacementGrid.getHitSlot(hit, vSide) + val tile: TileEntity = world.getTileEntity(pos.x, pos.y, pos.z) + + if (tile.isInstanceOf[TileMultipart]) + { + val centerPart: TMultiPart = tile.asInstanceOf[TileMultipart].partMap(PartMap.CENTER.ordinal) + if (centerPart != null && !player.isSneaking) + { + pos.offset(side ^ 1) + } + } + + val part = ResonantPartFactory.create(classOf[PartMultimeter]) + + if (part != null) + { + val l = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3 + val facing = if (l == 0) 2 else (if (l == 1) 5 else (if (l == 2) 3 else (if (l == 3) 4 else 0))) + part.preparePlacement(side, facing) + } + + return part + } + + override def addInformation(itemStack: ItemStack, par2EntityPlayer: EntityPlayer, list: List[_], par4: Boolean) + { + if (!Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + list.add(LanguageUtility.getLocal("tooltip.noShift").replace("%0", EnumColor.AQUA.toString).replace("%1", EnumColor.GREY.toString)) + } + else + { + list.addAll(LanguageUtility.splitStringPerWord(LanguageUtility.getLocal("item.resonantinduction:multimeter.tooltip"), 5)) + } + } + + def getDetection(itemStack: ItemStack): Float = + { + if (itemStack.stackTagCompound == null || !itemStack.getTagCompound.hasKey("detection")) + { + return -1 + } + return itemStack.stackTagCompound.getFloat("detection") + } + + def setDetection(itemStack: ItemStack, detection: Float) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound) + } + itemStack.stackTagCompound.setFloat("detection", detection) + } + + def getHighlightType: Int = 0 +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/multimeter/ModelMultimeter.java b/src/main/scala/resonantinduction/electrical/multimeter/ModelMultimeter.java deleted file mode 100644 index 7073097d1..000000000 --- a/src/main/scala/resonantinduction/electrical/multimeter/ModelMultimeter.java +++ /dev/null @@ -1,75 +0,0 @@ -package resonantinduction.electrical.multimeter; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; - -public class ModelMultimeter extends ModelBase -{ - // fields - ModelRenderer Base; - ModelRenderer secPanel; - ModelRenderer arm; - ModelRenderer button; - ModelRenderer arm2; - ModelRenderer infopanel; - - public ModelMultimeter() - { - textureWidth = 128; - textureHeight = 128; - - Base = new ModelRenderer(this, 0, 0); - Base.addBox(0F, 0F, 0F, 14, 14, 1); - Base.setRotationPoint(-7F, 9F, 7F); - Base.setTextureSize(128, 128); - Base.mirror = true; - setRotation(Base, 0F, 0F, 0F); - secPanel = new ModelRenderer(this, 0, 18); - secPanel.addBox(0F, 0F, 0F, 4, 8, 1); - secPanel.setRotationPoint(-6F, 10F, 6F); - secPanel.setTextureSize(128, 128); - secPanel.mirror = true; - setRotation(secPanel, 0F, 0F, 0F); - arm = new ModelRenderer(this, 0, 29); - arm.addBox(0F, 0F, 0F, 1, 9, 2); - arm.setRotationPoint(-3.5F, 13F, 5.5F); - arm.setTextureSize(128, 128); - arm.mirror = true; - setRotation(arm, 0F, 0F, 0F); - button = new ModelRenderer(this, 0, 43); - button.addBox(0F, 0F, 0F, 2, 1, 1); - button.setRotationPoint(-5F, 11F, 5.5F); - button.setTextureSize(128, 128); - button.mirror = true; - setRotation(button, 0F, 0F, 0F); - arm2 = new ModelRenderer(this, 10, 29); - arm2.addBox(0F, 0F, 0F, 1, 9, 2); - arm2.setRotationPoint(-5.5F, 13F, 5.5F); - arm2.setTextureSize(128, 128); - arm2.mirror = true; - setRotation(arm2, 0F, 0F, 0F); - infopanel = new ModelRenderer(this, 33, 0); - infopanel.addBox(0F, 0F, 0F, 7, 12, 1); - infopanel.setRotationPoint(-1F, 10F, 6.5F); - infopanel.setTextureSize(128, 128); - infopanel.mirror = true; - setRotation(infopanel, 0F, 0F, 0F); - } - - public void render(float f5) - { - Base.render(f5); - secPanel.render(f5); - arm.render(f5); - button.render(f5); - arm2.render(f5); - infopanel.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } -} diff --git a/src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.java b/src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.java deleted file mode 100644 index 2327e36b9..000000000 --- a/src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.java +++ /dev/null @@ -1,244 +0,0 @@ -package resonantinduction.electrical.multimeter; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import resonant.lib.utility.LanguageUtility; -import resonantinduction.electrical.multimeter.graph.*; -import universalelectricity.api.UnitDisplay; -import universalelectricity.api.core.grid.IUpdate; -import universalelectricity.core.grid.Grid; -import universalelectricity.core.grid.UpdateTicker; -import universalelectricity.core.transform.vector.Vector3; - -public class MultimeterGrid extends Grid implements IUpdate -{ - public final List displayInformation = new ArrayList(); - - /** - * Maximum data points a graph can store. - */ - private int maxData = 1; - /** - * The available graphs to be handled. - */ - public final List graphs = new ArrayList(); - - public final GraphL energyGraph = new GraphL("energy", maxData); - public final GraphL powerGraph = new GraphL("power", maxData); - public final GraphL energyCapacityGraph = new GraphL("capacity", 1); - public final GraphL voltageGraph = new GraphL("voltage", maxData); - public final GraphD torqueGraph = new GraphD("torque", maxData); - public final GraphD angularVelocityGraph = new GraphD("speed", maxData); - public final GraphI fluidGraph = new GraphI("fluid", maxData); - public final GraphF thermalGraph = new GraphF("temperature", maxData); - public final GraphI pressureGraph = new GraphI("pressure", maxData); - - /** - * The absolute center of the multimeter screens. - */ - public Vector3 center = new Vector3(); - - /** - * The relative bound sizes. - */ - public Vector3 upperBound = new Vector3(); - public Vector3 lowerBound = new Vector3(); - - /** - * The overall size of the multimeter - */ - public Vector3 size = new Vector3(); - - private long queueGraphValue = 0; - private long queueGraphCapacity = 0; - private boolean doUpdate = false; - - /** - * If the screen is not a perfect rectangle, don't render. - */ - public boolean isEnabled = true; - public PartMultimeter primaryMultimeter = null; - - public MultimeterGrid() - { - super(PartMultimeter.class); - graphs.add(energyGraph); - graphs.add(powerGraph); - graphs.add(energyCapacityGraph); - graphs.add(voltageGraph); - graphs.add(torqueGraph); - graphs.add(angularVelocityGraph); - graphs.add(fluidGraph); - graphs.add(thermalGraph); - graphs.add(pressureGraph); - } - - public String getDisplay(int graphID) - { - Graph graph = graphs.get(graphID); - - String graphValue = ""; - - if (graph == energyGraph) - graphValue = new UnitDisplay(UnitDisplay.Unit.JOULES, energyGraph.get()).toString(); - - if (graph == powerGraph) - graphValue = new UnitDisplay(UnitDisplay.Unit.WATT, powerGraph.get()).toString(); - - if (graph == energyCapacityGraph) - graphValue = new UnitDisplay(UnitDisplay.Unit.JOULES, energyCapacityGraph.get()).toString(); - - if (graph == voltageGraph) - graphValue = new UnitDisplay(UnitDisplay.Unit.VOLTAGE, voltageGraph.get()).toString(); - - if (graph == torqueGraph) - graphValue = new UnitDisplay(UnitDisplay.Unit.NEWTON_METER, torqueGraph.get(), true).toString(); - - if (graph == angularVelocityGraph) - graphValue = UnitDisplay.roundDecimals(angularVelocityGraph.get()) + " rad/s"; - - if (graph == fluidGraph) - graphValue = new UnitDisplay(UnitDisplay.Unit.LITER, fluidGraph.get()).toString(); - - if (graph == thermalGraph) - graphValue = UnitDisplay.roundDecimals(thermalGraph.get()) + " K"; - - if (graph == pressureGraph) - graphValue = UnitDisplay.roundDecimals(pressureGraph.get()) + " Pa"; - - return getLocalized(graph) + ": " + graphValue; - - } - - public String getLocalized(Graph graph) - { - return LanguageUtility.getLocal("tooltip.graph." + graph.name); - } - - public boolean isPrimary(PartMultimeter check) - { - return primaryMultimeter == check; - } - - @Override - public void update(double delta) - { - for (Graph graph : graphs) - { - graph.doneQueue(); - } - - doUpdate = false; - } - - public void markUpdate() - { - doUpdate = true; - } - - @Override - public boolean canUpdate() - { - return doUpdate && continueUpdate(); - } - - @Override - public boolean continueUpdate() - { - return getNodes().size() > 0; - } - - @Override - public boolean isValidNode(Object node) - { - return node instanceof PartMultimeter && ((PartMultimeter) node).world() != null && ((PartMultimeter) node).tile() != null; - } - - @Override - public void reconstruct() - { - if (getNodes().size() > 0) - { - primaryMultimeter = null; - upperBound = null; - lowerBound = null; - super.reconstruct(); - center = upperBound.midPoint(lowerBound); - - /** - * Make bounds relative. - */ - upperBound.subtract(center); - lowerBound.subtract(center); - size = new Vector3(Math.abs(upperBound.x()) + Math.abs(lowerBound.x()), Math.abs(upperBound.y()) + Math.abs(lowerBound.y()), Math.abs(upperBound.z()) + Math.abs(lowerBound.z())); - - double area = (size.x() != 0 ? size.x() : 1) * (size.y() != 0 ? size.y() : 1) * (size.z() != 0 ? size.z() : 1); - isEnabled = area == getNodes().size(); - - UpdateTicker.addUpdater(this); - - Iterator it = this.getNodes().iterator(); - - while (it.hasNext()) - { - PartMultimeter connector = it.next(); - connector.updateDesc(); - connector.updateGraph(); - } - - doUpdate = true; - } - } - - @Override - protected void reconstructNode(PartMultimeter node) - { - node.setNetwork(this); - - if (primaryMultimeter == null) - primaryMultimeter = node; - - if (upperBound == null) - { - upperBound = node.getPosition().add(1); - } - - if (lowerBound == null) - { - lowerBound = node.getPosition(); - } - - upperBound = upperBound.max(node.getPosition().add(1)); - lowerBound = lowerBound.min(node.getPosition()); - } - - public void load(NBTTagCompound nbt) - { - NBTTagList nbtList = nbt.getTagList("graphs", 0); - - for (int i = 0; i < nbtList.tagCount(); ++i) - { - NBTTagCompound nbtCompound = (NBTTagCompound) nbtList.getCompoundTagAt(i); - graphs.get(i).load(nbtCompound); - } - } - - public NBTTagCompound save() - { - NBTTagCompound nbt = new NBTTagCompound(); - NBTTagList data = new NBTTagList(); - - for (Graph graph : graphs) - { - data.appendTag(graph.save()); - } - - nbt.setTag("graphs", data); - - return nbt; - } -} diff --git a/src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.scala b/src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.scala new file mode 100644 index 000000000..e8a209ec3 --- /dev/null +++ b/src/main/scala/resonantinduction/electrical/multimeter/MultimeterGrid.scala @@ -0,0 +1,180 @@ +package resonantinduction.electrical.multimeter + +import net.minecraft.nbt.{NBTTagCompound, NBTTagList} +import resonant.lib.utility.LanguageUtility +import resonantinduction.electrical.multimeter.graph._ +import universalelectricity.api.UnitDisplay +import universalelectricity.api.core.grid.IUpdate +import universalelectricity.core.grid.{Grid, UpdateTicker} +import universalelectricity.core.transform.vector.Vector3 + +import scala.collection.convert.wrapAll._ +import scala.collection.mutable.ArrayBuffer + +class MultimeterGrid extends Grid[PartMultimeter](classOf[PartMultimeter]) with IUpdate +{ + final val displayInformation = new ArrayBuffer[String] + + /** + * Maximum data points a graph can store. + */ + private val maxData: Int = 1 + + /** + * The available graphs to be handled. + */ + final val graphs = new ArrayBuffer[Graph[_]] + final val energyGraph: GraphL = new GraphL("energy", maxData) + final val powerGraph: GraphL = new GraphL("power", maxData) + final val energyCapacityGraph: GraphL = new GraphL("capacity", 1) + final val voltageGraph: GraphL = new GraphL("voltage", maxData) + final val torqueGraph: GraphD = new GraphD("torque", maxData) + final val angularVelocityGraph: GraphD = new GraphD("speed", maxData) + final val fluidGraph: GraphI = new GraphI("fluid", maxData) + final val thermalGraph: GraphF = new GraphF("temperature", maxData) + final val pressureGraph: GraphI = new GraphI("pressure", maxData) + /** + * The absolute center of the multimeter screens. + */ + var center: Vector3 = new Vector3 + /** + * The relative bound sizes. + */ + var upperBound: Vector3 = new Vector3 + var lowerBound: Vector3 = new Vector3 + /** + * The overall size of the multimeter + */ + var size: Vector3 = new Vector3 + private var doUpdate: Boolean = false + /** + * If the screen is not a perfect rectangle, don't render. + */ + var isEnabled: Boolean = true + var primaryMultimeter: PartMultimeter = null + + graphs += energyGraph + graphs += powerGraph + graphs += energyCapacityGraph + graphs += voltageGraph + graphs += torqueGraph + graphs += angularVelocityGraph + graphs += fluidGraph + graphs += thermalGraph + graphs += pressureGraph + + def getDisplay(graphID: Int): String = + { + val graph = graphs(graphID) + var graphValue: String = "" + if (graph == energyGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.JOULES, energyGraph.get).toString + if (graph == powerGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.WATT, powerGraph.get).toString + if (graph == energyCapacityGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.JOULES, energyCapacityGraph.get).toString + if (graph == voltageGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.VOLTAGE, voltageGraph.get).toString + if (graph == torqueGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.NEWTON_METER, torqueGraph.get, true).toString + if (graph == angularVelocityGraph) graphValue = UnitDisplay.roundDecimals(angularVelocityGraph.get) + " rad/s" + if (graph == fluidGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.LITER, fluidGraph.get.toInt).toString + if (graph == thermalGraph) graphValue = UnitDisplay.roundDecimals(thermalGraph.get.toFloat) + " K" + if (graph == pressureGraph) graphValue = UnitDisplay.roundDecimals(pressureGraph.get.toInt) + " Pa" + return getLocalized(graph) + ": " + graphValue + } + + def getLocalized(graph: Graph[_]): String = + { + return LanguageUtility.getLocal("tooltip.graph." + graph.name) + } + + def isPrimary(check: PartMultimeter): Boolean = + { + return primaryMultimeter == check + } + + def update(delta: Double) + { + graphs.foreach(_.doneQueue()) + doUpdate = false + } + + def markUpdate + { + doUpdate = true + } + + def canUpdate: Boolean = + { + return doUpdate && continueUpdate + } + + def continueUpdate: Boolean = + { + return getNodes.size > 0 + } + + override def isValidNode(node: AnyRef): Boolean = + { + return node.isInstanceOf[PartMultimeter] && node.asInstanceOf[PartMultimeter].world != null && node.asInstanceOf[PartMultimeter].tile != null + } + + override def reconstruct + { + if (getNodes.size > 0) + { + primaryMultimeter = null + upperBound = null + lowerBound = null + super.reconstruct + center = upperBound.midPoint(lowerBound) + upperBound.subtract(center) + lowerBound.subtract(center) + size = new Vector3(Math.abs(upperBound.x) + Math.abs(lowerBound.x), Math.abs(upperBound.y) + Math.abs(lowerBound.y), Math.abs(upperBound.z) + Math.abs(lowerBound.z)) + val area: Double = (if (size.x != 0) size.x else 1) * (if (size.y != 0) size.y else 1) * (if (size.z != 0) size.z else 1) + isEnabled = area == getNodes.size + UpdateTicker.addUpdater(this) + + getNodes foreach (c => + { + c.updateDesc() + c.updateGraph() + }) + + doUpdate = true + } + } + + protected override def reconstructNode(node: PartMultimeter) + { + node.setNetwork(this) + if (primaryMultimeter == null) primaryMultimeter = node + if (upperBound == null) + { + upperBound = node.getPosition.add(1) + } + if (lowerBound == null) + { + lowerBound = node.getPosition + } + upperBound = upperBound.max(node.getPosition.add(1)) + lowerBound = lowerBound.min(node.getPosition) + } + + def load(nbt: NBTTagCompound) + { + val nbtList: NBTTagList = nbt.getTagList("graphs", 0) + + for (i <- 0 until nbtList.tagCount) + { + val nbtCompound: NBTTagCompound = nbtList.getCompoundTagAt(i) + graphs.get(i).load(nbtCompound) + } + } + + def save: NBTTagCompound = + { + val nbt: NBTTagCompound = new NBTTagCompound + val data: NBTTagList = new NBTTagList + graphs.foreach(g => data.appendTag(g.save())) + nbt.setTag("graphs", data) + return nbt + } + +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/electrical/multimeter/graph/Graph.java b/src/main/scala/resonantinduction/electrical/multimeter/graph/Graph.java index 8422a96f2..ee01fe532 100644 --- a/src/main/scala/resonantinduction/electrical/multimeter/graph/Graph.java +++ b/src/main/scala/resonantinduction/electrical/multimeter/graph/Graph.java @@ -66,7 +66,7 @@ public abstract class Graph> add(queue); } - protected abstract V getDefault(); + public abstract V getDefault(); public void load(NBTTagCompound nbt) {