Created a GUI window to debug gears outside of MC GUI

This commit is contained in:
Robert S 2014-06-05 02:47:54 -04:00
parent 055bbf4b82
commit 5572a27736
6 changed files with 249 additions and 21 deletions

View file

@ -37,7 +37,7 @@ public class MechanicalNode implements IMechanicalNode, ISaveObj
private double power = 0; private double power = 0;
private INodeProvider parent; private INodeProvider parent;
protected final AbstractMap<MechanicalNode, ForgeDirection> connections = new WeakHashMap<MechanicalNode, ForgeDirection>(); private final AbstractMap<MechanicalNode, ForgeDirection> connections = new WeakHashMap<MechanicalNode, ForgeDirection>();
public MechanicalNode(INodeProvider parent) public MechanicalNode(INodeProvider parent)
{ {
@ -132,9 +132,9 @@ public class MechanicalNode implements IMechanicalNode, ISaveObj
power = getEnergy() / deltaTime; power = getEnergy() / deltaTime;
debug("Node->Connections"); debug("Node->Connections");
synchronized (connections) synchronized (getConnections())
{ {
Iterator<Entry<MechanicalNode, ForgeDirection>> it = connections.entrySet().iterator(); Iterator<Entry<MechanicalNode, ForgeDirection>> it = getConnections().entrySet().iterator();
while (it.hasNext()) while (it.hasNext())
{ {
@ -280,26 +280,30 @@ public class MechanicalNode implements IMechanicalNode, ISaveObj
@Override @Override
public void reconstruct() public void reconstruct()
{ {
debug("reconstruct");
recache(); recache();
} }
@Override @Override
public void deconstruct() public void deconstruct()
{ {
for (Entry<MechanicalNode, ForgeDirection> entry : connections.entrySet()) debug("deconstruct");
for (Entry<MechanicalNode, ForgeDirection> entry : getConnections().entrySet())
{ {
entry.getKey().recache(); entry.getKey().recache();
} }
connections.clear(); getConnections().clear();
} }
@Override @Override
public void recache() public void recache()
{ {
connections.clear(); debug("Node->Recahce");
getConnections().clear();
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
{ {
debug("\tDir: " + dir);
TileEntity tile = position().translate(dir).getTileEntity(world()); TileEntity tile = position().translate(dir).getTileEntity(world());
if (tile instanceof INodeProvider) if (tile instanceof INodeProvider)
@ -308,17 +312,19 @@ public class MechanicalNode implements IMechanicalNode, ISaveObj
if (check != null && canConnect(dir, check) && check.canConnect(dir.getOpposite(), this)) if (check != null && canConnect(dir, check) && check.canConnect(dir.getOpposite(), this))
{ {
connections.put(check, dir); getConnections().put(check, dir);
} }
} }
} }
} }
/** Gets the node provider for this node */
public INodeProvider getParent() public INodeProvider getParent()
{ {
return parent; return parent;
} }
/** Sets the node provider for the node */
public void setParent(INodeProvider parent) public void setParent(INodeProvider parent)
{ {
this.parent = parent; this.parent = parent;
@ -329,4 +335,9 @@ public class MechanicalNode implements IMechanicalNode, ISaveObj
{ {
return this.getClass().getName() + this.hashCode(); return this.getClass().getName() + this.hashCode();
} }
public AbstractMap<MechanicalNode, ForgeDirection> getConnections()
{
return connections;
}
} }

View file

@ -12,6 +12,7 @@ import net.minecraftforge.common.ForgeDirection;
import resonant.api.grid.INode; import resonant.api.grid.INode;
import resonant.api.grid.INodeProvider; import resonant.api.grid.INodeProvider;
import resonant.core.ResonantEngine; import resonant.core.ResonantEngine;
import resonantinduction.mechanical.gear.GearDebugFrame;
import codechicken.lib.data.MCDataInput; import codechicken.lib.data.MCDataInput;
import codechicken.lib.data.MCDataOutput; import codechicken.lib.data.MCDataOutput;
import codechicken.multipart.ControlKeyModifer; import codechicken.multipart.ControlKeyModifer;
@ -53,10 +54,15 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
node.debug("Part: " + this + " Node: " + this.node); node.debug("Part: " + this + " Node: " + this.node);
this.node.update(0.05f); this.node.update(0.05f);
} }
if (frame != null)
{
frame.update();
}
super.update(); super.update();
} }
GearDebugFrame frame = null;
@Override @Override
public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack itemStack) public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack itemStack)
{ {
@ -64,10 +70,26 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
{ {
if (itemStack != null && itemStack.getItem().itemID == Item.stick.itemID) if (itemStack != null && itemStack.getItem().itemID == Item.stick.itemID)
{ {
if (!world().isRemote && ControlKeyModifer.isControlDown(player)) if (!world().isRemote)
{ {
this.node.doDebug = !this.node.doDebug; if (!ControlKeyModifer.isControlDown(player))
player.addChatMessage("[Debug] PartMechanical debug mode is now " + (this.node.doDebug ? "on" : "off")); {
this.node.doDebug = !this.node.doDebug;
player.addChatMessage("[Debug] PartMechanical debug mode is now " + (this.node.doDebug ? "on" : "off"));
}
else
{
if (frame == null)
{
frame = new GearDebugFrame(this);
frame.showDebugFrame();
}
else
{
frame.closeDebugFrame();
frame = null;
}
}
} }
} }
} }
@ -107,6 +129,10 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
public void onWorldSeparate() public void onWorldSeparate()
{ {
node.deconstruct(); node.deconstruct();
if (frame != null)
{
frame.closeDebugFrame();
}
} }
/** Packet Code. */ /** Packet Code. */

View file

@ -0,0 +1,12 @@
package resonantinduction.mechanical.gear;
import java.awt.Label;
@SuppressWarnings("serial")
public class DataLabel extends Label
{
public void update()
{
}
}

View file

@ -0,0 +1,179 @@
package resonantinduction.mechanical.gear;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.mechanical.energy.grid.MechanicalNode;
import resonantinduction.mechanical.energy.grid.PartMechanical;
/** Java GUI used to help debug gear information
*
* @author Darkguardsman */
@SuppressWarnings("serial")
public class GearDebugFrame extends Frame implements ActionListener
{
List<DataLabel> dataLabels = new ArrayList<DataLabel>();
Label[] connections = new Label[20];
long tick = 0;
PartMechanical part = null;
public GearDebugFrame(PartMechanical part)
{
this.part = part;
setLayout(new BorderLayout());
setBackground(Color.DARK_GRAY);
//Top bar
Panel topPanel = new Panel(new GridLayout(1, 4, 0, 0));
DataLabel tickLabel = new DataLabel()
{
@Override
public void update()
{
setText("Tick: " + tick);
}
};
topPanel.add(tickLabel);
DataLabel xLabel = new DataLabel()
{
@Override
public void update()
{
setText("X: " + GearDebugFrame.this.part.x());
}
};
topPanel.add(xLabel);
DataLabel yLabel = new DataLabel()
{
@Override
public void update()
{
setText("Y: " + GearDebugFrame.this.part.y());
}
};
topPanel.add(yLabel);
DataLabel zLabel = new DataLabel()
{
@Override
public void update()
{
setText("Z: " + GearDebugFrame.this.part.z());
}
};
topPanel.add(zLabel);
add(topPanel, BorderLayout.NORTH);
//Middle bar
Panel middlePanel = new Panel(new GridLayout(8, 1, 0, 0));
DataLabel velLabel = new DataLabel()
{
@Override
public void update()
{
setText("Vel: " + GearDebugFrame.this.part.node.angularVelocity);
}
};
middlePanel.add(velLabel);
DataLabel angleLabel = new DataLabel()
{
@Override
public void update()
{
setText("Angle: " + GearDebugFrame.this.part.node.renderAngle);
}
};
middlePanel.add(angleLabel);
DataLabel torqueLabel = new DataLabel()
{
@Override
public void update()
{
setText("Torque: " + GearDebugFrame.this.part.node.torque);
}
};
middlePanel.add(torqueLabel);
add(middlePanel, BorderLayout.EAST);
Panel connectionPanel = new Panel(new GridLayout(this.connections.length / 4, 4, 0, 0));
for (int i = 0; i < connections.length; i++)
{
this.connections[i] = new Label("Connection" + i + ": null");
connectionPanel.add(connections[i]);
}
add(connectionPanel, BorderLayout.WEST);
//exit icon handler
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
Frame f = (Frame) e.getSource();
f.setVisible(false);
f.dispose();
}
});
}
/** Called each cpu cycle */
public void update()
{
tick++;
if (this.part != null)
{
for (DataLabel label : dataLabels)
{
label.update();
}
int c = 0;
for (Entry<MechanicalNode, ForgeDirection> entry : part.node.getConnections().entrySet())
{
this.connections[c].setText("Connection" + c + ": " + entry.getKey());
c++;
}
for (int i = c; i < connections.length; i++)
{
this.connections[c].setText("Connection" + c + ": NONE");
}
}
}
/** Shows the frame */
public void showDebugFrame()
{
setTitle("Resonant Engine Debug Window");
setBounds(200, 200, 450, 600);
setVisible(true);
}
/** Hides the frame and tells it to die off */
public void closeDebugFrame()
{
dispose();
}
@Override
public void actionPerformed(ActionEvent arg0)
{
// TODO Auto-generated method stub
}
}

View file

@ -82,7 +82,7 @@ public class GearNode extends MechanicalNode
public void recache() public void recache()
{ {
debug("doRecache: " + this); debug("doRecache: " + this);
connections.clear(); getConnections().clear();
/** Only call refresh if this is the main block of a multiblock gear or a single gear block. */ /** Only call refresh if this is the main block of a multiblock gear or a single gear block. */
if (!gear().getMultiBlock().isPrimary() || world() == null) if (!gear().getMultiBlock().isPrimary() || world() == null)
@ -99,7 +99,7 @@ public class GearNode extends MechanicalNode
if (instance != null && instance != this && !(instance.getParent() instanceof PartGearShaft) && instance.canConnect(gear().placementSide.getOpposite(), this)) if (instance != null && instance != this && !(instance.getParent() instanceof PartGearShaft) && instance.canConnect(gear().placementSide.getOpposite(), this))
{ {
connections.put(instance, gear().placementSide); getConnections().put(instance, gear().placementSide);
} }
} }
@ -122,9 +122,9 @@ public class GearNode extends MechanicalNode
* (the center), then we try to look for a gear shaft in the center. */ * (the center), then we try to look for a gear shaft in the center. */
MechanicalNode instance = (MechanicalNode) ((INodeProvider) tile).getNode(MechanicalNode.class, checkDir == gear().placementSide.getOpposite() ? ForgeDirection.UNKNOWN : checkDir); MechanicalNode instance = (MechanicalNode) ((INodeProvider) tile).getNode(MechanicalNode.class, checkDir == gear().placementSide.getOpposite() ? ForgeDirection.UNKNOWN : checkDir);
if (!connections.containsValue(checkDir) && instance != this && checkDir != gear().placementSide && instance != null && instance.canConnect(checkDir.getOpposite(), this)) if (!getConnections().containsValue(checkDir) && instance != this && checkDir != gear().placementSide && instance != null && instance.canConnect(checkDir.getOpposite(), this))
{ {
connections.put(instance, checkDir); getConnections().put(instance, checkDir);
} }
} }
} }
@ -142,13 +142,13 @@ public class GearNode extends MechanicalNode
ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(gear().placementSide.ordinal(), i)); ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(gear().placementSide.ordinal(), i));
TileEntity checkTile = new universalelectricity.api.vector.Vector3(gear().tile()).translate(checkDir, displaceCheck).getTileEntity(world()); TileEntity checkTile = new universalelectricity.api.vector.Vector3(gear().tile()).translate(checkDir, displaceCheck).getTileEntity(world());
if (!connections.containsValue(checkDir) && checkTile instanceof INodeProvider) if (!getConnections().containsValue(checkDir) && checkTile instanceof INodeProvider)
{ {
MechanicalNode instance = (MechanicalNode) ((INodeProvider) checkTile).getNode(MechanicalNode.class, gear().placementSide); MechanicalNode instance = (MechanicalNode) ((INodeProvider) checkTile).getNode(MechanicalNode.class, gear().placementSide);
if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this) && !(instance.getParent() instanceof PartGearShaft)) if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this) && !(instance.getParent() instanceof PartGearShaft))
{ {
connections.put(instance, checkDir); getConnections().put(instance, checkDir);
} }
} }
} }

View file

@ -42,7 +42,7 @@ public class GearShaftNode extends MechanicalNode
@Override @Override
public void recache() public void recache()
{ {
connections.clear(); getConnections().clear();
List<ForgeDirection> dirs = new ArrayList<ForgeDirection>(); List<ForgeDirection> dirs = new ArrayList<ForgeDirection>();
dirs.add(shaft().placementSide); dirs.add(shaft().placementSide);
dirs.add(shaft().placementSide.getOpposite()); dirs.add(shaft().placementSide.getOpposite());
@ -59,7 +59,7 @@ public class GearShaftNode extends MechanicalNode
if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this)) if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this))
{ {
connections.put(instance, checkDir); getConnections().put(instance, checkDir);
it.remove(); it.remove();
} }
} }
@ -70,7 +70,7 @@ public class GearShaftNode extends MechanicalNode
if (!dirs.isEmpty()) if (!dirs.isEmpty())
for (ForgeDirection checkDir : dirs) for (ForgeDirection checkDir : dirs)
{ {
if (!connections.containsValue(checkDir) && (checkDir == shaft().placementSide || checkDir == shaft().placementSide.getOpposite())) if (!getConnections().containsValue(checkDir) && (checkDir == shaft().placementSide || checkDir == shaft().placementSide.getOpposite()))
{ {
TileEntity checkTile = new universalelectricity.api.vector.Vector3(shaft().tile()).translate(checkDir).getTileEntity(world()); TileEntity checkTile = new universalelectricity.api.vector.Vector3(shaft().tile()).translate(checkDir).getTileEntity(world());
@ -81,7 +81,7 @@ public class GearShaftNode extends MechanicalNode
// Only connect to shafts outside of this block space. // Only connect to shafts outside of this block space.
if (instance != null && instance != this && instance.getParent() instanceof PartGearShaft && instance.canConnect(checkDir.getOpposite(), this)) if (instance != null && instance != this && instance.getParent() instanceof PartGearShaft && instance.canConnect(checkDir.getOpposite(), this))
{ {
connections.put(instance, checkDir); getConnections().put(instance, checkDir);
} }
} }
} }