Created a prefab for tiles with several nodes
This commit is contained in:
parent
f238238aaf
commit
b06a5ea283
1 changed files with 173 additions and 0 deletions
173
src/main/scala/resonantinduction/core/prefab/tile/TileNode.java
Normal file
173
src/main/scala/resonantinduction/core/prefab/tile/TileNode.java
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
package resonantinduction.core.prefab.tile;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.block.material.Material;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
|
import resonant.api.IRotatable;
|
||||||
|
import resonant.api.grid.INode;
|
||||||
|
import resonant.api.grid.INodeProvider;
|
||||||
|
import resonant.lib.content.module.TileBase;
|
||||||
|
import resonant.lib.utility.nbt.ISaveObj;
|
||||||
|
|
||||||
|
/** Prefab for tiles that support several nodes at a single time
|
||||||
|
*
|
||||||
|
* @author Darkguardsman */
|
||||||
|
public class TileNode extends TileBase implements INodeProvider, IRotatable
|
||||||
|
{
|
||||||
|
/** Set of nodes that this tile contains */
|
||||||
|
int maxNodeId = 0;
|
||||||
|
final HashMap<Integer, NodeWrapper> nodes = new HashMap<Integer, NodeWrapper>();
|
||||||
|
|
||||||
|
public static class NodeWrapper
|
||||||
|
{
|
||||||
|
private int id;
|
||||||
|
private INode node;
|
||||||
|
//TODO move connectionSet to node interface
|
||||||
|
private EnumSet<ForgeDirection> connectionSet;
|
||||||
|
|
||||||
|
public NodeWrapper(int id, INode node)
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
this.node = node;
|
||||||
|
connectionSet = EnumSet.allOf(ForgeDirection.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getID()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public INode getNode()
|
||||||
|
{
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canConnect(ForgeDirection side)
|
||||||
|
{
|
||||||
|
return connectionSet.contains(side);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public TileNode(Material material)
|
||||||
|
{
|
||||||
|
super(material);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TileNode(String name, Material material)
|
||||||
|
{
|
||||||
|
super(name, material);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initiate()
|
||||||
|
{
|
||||||
|
rebuildNodes();
|
||||||
|
super.initiate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addNode(INode node)
|
||||||
|
{
|
||||||
|
NodeWrapper wrapper = new NodeWrapper(maxNodeId, node);
|
||||||
|
nodes.put(maxNodeId, wrapper);
|
||||||
|
maxNodeId++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Called to let the nodes rebuild followed by updating the connection map */
|
||||||
|
public final void rebuildNodes()
|
||||||
|
{
|
||||||
|
for (NodeWrapper wrapper : nodes.values())
|
||||||
|
{
|
||||||
|
rebuildNode(wrapper.getNode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Called to rebuild the exact node */
|
||||||
|
public void rebuildNode(INode node)
|
||||||
|
{
|
||||||
|
node.reconstruct();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public INode getNode(Class<? extends INode> nodeType, ForgeDirection from)
|
||||||
|
{
|
||||||
|
for (NodeWrapper wrapper : nodes.values())
|
||||||
|
{
|
||||||
|
if (nodeType.isAssignableFrom(wrapper.getNode().getClass()))
|
||||||
|
{
|
||||||
|
if (wrapper.canConnect(from))
|
||||||
|
{
|
||||||
|
return wrapper.getNode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDirection(ForgeDirection direction)
|
||||||
|
{
|
||||||
|
ForgeDirection lastDir = getDirection();
|
||||||
|
super.setDirection(direction);
|
||||||
|
if (lastDir != getDirection())
|
||||||
|
{
|
||||||
|
rebuildNodes();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invalidate()
|
||||||
|
{
|
||||||
|
for (NodeWrapper wrapper : nodes.values())
|
||||||
|
{
|
||||||
|
wrapper.getNode().deconstruct();
|
||||||
|
}
|
||||||
|
super.invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readFromNBT(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
super.readFromNBT(nbt);
|
||||||
|
if (nbt.hasKey("NodeSaves"))
|
||||||
|
{
|
||||||
|
List list = nbt.getTagList("NodeSaves").tagList;
|
||||||
|
for (int i = 0; i < list.size(); i++)
|
||||||
|
{
|
||||||
|
Object obj = list.get(i);
|
||||||
|
if (obj instanceof NBTTagCompound)
|
||||||
|
{
|
||||||
|
NBTTagCompound tag = (NBTTagCompound) obj;
|
||||||
|
int nodeID = tag.getInteger("nodeID");
|
||||||
|
NodeWrapper wrapper = nodes.get(nodeID);
|
||||||
|
if (wrapper != null && wrapper.getNode() instanceof ISaveObj)
|
||||||
|
{
|
||||||
|
((ISaveObj) wrapper.getNode()).load(tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToNBT(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
super.writeToNBT(nbt);
|
||||||
|
NBTTagList list = new NBTTagList();
|
||||||
|
for (NodeWrapper wrapper : nodes.values())
|
||||||
|
{
|
||||||
|
if (wrapper.getNode() instanceof ISaveObj)
|
||||||
|
{
|
||||||
|
NBTTagCompound tag = new NBTTagCompound();
|
||||||
|
tag.setInteger("nodeID", wrapper.id);
|
||||||
|
((ISaveObj) wrapper.getNode()).save(tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nbt.setTag("NodeSaves", list);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue