summaryrefslogtreecommitdiff
path: root/src/main/java/net/cshift/transit
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/cshift/transit')
-rw-r--r--src/main/java/net/cshift/transit/Transit.java13
-rw-r--r--src/main/java/net/cshift/transit/basic/AbstractAcceptorNode.java51
-rw-r--r--src/main/java/net/cshift/transit/basic/AbstractNode.java45
-rw-r--r--src/main/java/net/cshift/transit/basic/AbstractProviderNode.java47
-rw-r--r--src/main/java/net/cshift/transit/basic/AbstractTwoWayNode.java47
-rw-r--r--src/main/java/net/cshift/transit/basic/system/AbstractSystem.java13
-rw-r--r--src/main/java/net/cshift/transit/basic/system/AbstractSystemNode.java12
-rw-r--r--src/main/java/net/cshift/transit/network/packet/IStaticPacket.java23
-rw-r--r--src/main/java/net/cshift/transit/network/packet/MetaPacket.java35
-rw-r--r--src/main/java/net/cshift/transit/network/packet/StaticPacket.java36
-rw-r--r--src/main/java/net/cshift/transit/network/packet/dynamic/DynamicPacket.java43
-rw-r--r--src/main/java/net/cshift/transit/network/packet/dynamic/IDynamicPacket.java16
-rw-r--r--src/main/java/net/cshift/transit/network/packet/dynamic/MetaDynamicPacket.java44
-rw-r--r--src/main/java/net/cshift/transit/network/system/Connection.java49
-rw-r--r--src/main/java/net/cshift/transit/network/system/INode.java53
-rw-r--r--src/main/java/net/cshift/transit/network/system/ISystem.java15
-rw-r--r--src/main/java/net/cshift/transit/network/system/swap/IAcceptorNode.java37
-rw-r--r--src/main/java/net/cshift/transit/network/system/swap/IProviderNode.java27
-rw-r--r--src/main/java/net/cshift/transit/type/TFluid.java33
-rw-r--r--src/main/java/net/cshift/transit/type/TMana.java31
-rw-r--r--src/main/java/net/cshift/transit/type/Type.java66
-rw-r--r--src/main/java/net/cshift/transit/type/group/GroupRegistry.java56
-rw-r--r--src/main/java/net/cshift/transit/type/group/TypeGroup.java267
-rw-r--r--src/main/java/net/cshift/transit/type/group/simple/SimpleGroups.java32
-rw-r--r--src/main/java/net/cshift/transit/type/simple/SimpleTypes.java22
25 files changed, 1113 insertions, 0 deletions
diff --git a/src/main/java/net/cshift/transit/Transit.java b/src/main/java/net/cshift/transit/Transit.java
new file mode 100644
index 0000000..ef440c5
--- /dev/null
+++ b/src/main/java/net/cshift/transit/Transit.java
@@ -0,0 +1,13 @@
+package net.cshift.transit;
+
+import net.fabricmc.api.ModInitializer;
+import net.cshift.transit.type.group.simple.SimpleGroups;
+
+public class Transit implements ModInitializer {
+
+ @Override
+ public void onInitialize() {
+ SimpleGroups.init();
+ }
+
+}
diff --git a/src/main/java/net/cshift/transit/basic/AbstractAcceptorNode.java b/src/main/java/net/cshift/transit/basic/AbstractAcceptorNode.java
new file mode 100644
index 0000000..e2e6711
--- /dev/null
+++ b/src/main/java/net/cshift/transit/basic/AbstractAcceptorNode.java
@@ -0,0 +1,51 @@
+package net.cshift.transit.basic;
+
+import net.cshift.transit.network.packet.*;
+import net.cshift.transit.network.system.*;
+import net.cshift.transit.network.system.swap.*;
+import net.minecraft.block.entity.*;
+
+public abstract class AbstractAcceptorNode extends AbstractNode implements IAcceptorNode {
+
+ public AbstractAcceptorNode(BlockEntityType<?> type) {
+ super(type);
+ }
+
+ @Override
+ public abstract <T> boolean accept(IStaticPacket<T> packet, String group);
+
+ @Override
+ public boolean linkProvider(IProviderNode requestor, String group) {
+ if(this.hasGroup(group))
+ {
+ for (Connection c : connections) {
+ if(c.getNode() == requestor)
+ return false;
+ }
+
+ connections.add(new Connection(requestor, (short) 2));
+
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean unlinkProvider(IProviderNode requestor) {
+ for (Connection c : connections) {
+ if(c.getNode() == requestor)
+ {
+ if(c.isAccepting())
+ c.setProviding(false);
+ else
+ connections.remove(c);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/src/main/java/net/cshift/transit/basic/AbstractNode.java b/src/main/java/net/cshift/transit/basic/AbstractNode.java
new file mode 100644
index 0000000..a87fba4
--- /dev/null
+++ b/src/main/java/net/cshift/transit/basic/AbstractNode.java
@@ -0,0 +1,45 @@
+package net.cshift.transit.basic;
+
+import java.util.*;
+
+import net.cshift.transit.network.system.*;
+import net.minecraft.block.entity.*;
+
+public abstract class AbstractNode extends BlockEntity implements INode {
+
+ public AbstractNode(BlockEntityType<?> type) {
+ super(type);
+ }
+
+ HashMap<String, Object> data = new HashMap<String, Object>();
+ ArrayList<Connection> connections = new ArrayList<Connection>(0);
+
+ @Override
+ public abstract boolean hasGroup(String groupID);
+
+ @Override
+ public ISystem getSystem() {
+ return null;
+ }
+
+ @Override
+ public Object getData(String groupID) {
+ return data.get(groupID);
+ }
+
+ @Override
+ public void setData(Object dat, String groupID) {
+ data.put(groupID, dat);
+ }
+
+ @Override
+ public Connection[] getConnections() {
+ return (Connection[]) connections.toArray();
+ }
+
+ @Override
+ public int connectionCount() {
+ return connections.size();
+ }
+
+}
diff --git a/src/main/java/net/cshift/transit/basic/AbstractProviderNode.java b/src/main/java/net/cshift/transit/basic/AbstractProviderNode.java
new file mode 100644
index 0000000..cc81544
--- /dev/null
+++ b/src/main/java/net/cshift/transit/basic/AbstractProviderNode.java
@@ -0,0 +1,47 @@
+package net.cshift.transit.basic;
+
+import net.cshift.transit.network.system.*;
+import net.cshift.transit.network.system.swap.*;
+import net.minecraft.block.entity.*;
+
+public abstract class AbstractProviderNode extends AbstractNode implements IProviderNode {
+
+ public AbstractProviderNode(BlockEntityType<?> type) {
+ super(type);
+ }
+
+ @Override
+ public boolean linkAcceptor(IAcceptorNode requestor, String group) {
+ if(this.hasGroup(group))
+ {
+ for (Connection c : connections) {
+ if(c.getNode() == requestor)
+ return false;
+ }
+
+ connections.add(new Connection(requestor, (short) 1));
+
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean unlinkAcceptor(IAcceptorNode requestor) {
+ for (Connection c : connections) {
+ if(c.getNode() == requestor)
+ {
+ if(c.isProviding())
+ c.setAccepting(false);
+ else
+ connections.remove(c);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/src/main/java/net/cshift/transit/basic/AbstractTwoWayNode.java b/src/main/java/net/cshift/transit/basic/AbstractTwoWayNode.java
new file mode 100644
index 0000000..cc06eeb
--- /dev/null
+++ b/src/main/java/net/cshift/transit/basic/AbstractTwoWayNode.java
@@ -0,0 +1,47 @@
+package net.cshift.transit.basic;
+
+import net.cshift.transit.network.system.*;
+import net.cshift.transit.network.system.swap.*;
+import net.minecraft.block.entity.*;
+
+public abstract class AbstractTwoWayNode extends AbstractAcceptorNode implements IProviderNode {
+
+ public AbstractTwoWayNode(BlockEntityType<?> type) {
+ super(type);
+ }
+
+ @Override
+ public boolean linkAcceptor(IAcceptorNode requestor, String group) {
+ if(this.hasGroup(group))
+ {
+ for (Connection c : connections) {
+ if(c.getNode() == requestor)
+ return false;
+ }
+
+ connections.add(new Connection(requestor, (short) 1));
+
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean unlinkAcceptor(IAcceptorNode requestor) {
+ for (Connection c : connections) {
+ if(c.getNode() == requestor)
+ {
+ if(c.isProviding())
+ c.setAccepting(false);
+ else
+ connections.remove(c);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/src/main/java/net/cshift/transit/basic/system/AbstractSystem.java b/src/main/java/net/cshift/transit/basic/system/AbstractSystem.java
new file mode 100644
index 0000000..ef6254c
--- /dev/null
+++ b/src/main/java/net/cshift/transit/basic/system/AbstractSystem.java
@@ -0,0 +1,13 @@
+package net.cshift.transit.basic.system;
+
+import net.cshift.transit.network.system.*;
+
+public abstract class AbstractSystem implements ISystem {
+
+ @Override
+ public INode[] getNodes() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/src/main/java/net/cshift/transit/basic/system/AbstractSystemNode.java b/src/main/java/net/cshift/transit/basic/system/AbstractSystemNode.java
new file mode 100644
index 0000000..a246588
--- /dev/null
+++ b/src/main/java/net/cshift/transit/basic/system/AbstractSystemNode.java
@@ -0,0 +1,12 @@
+package net.cshift.transit.basic.system;
+
+import net.cshift.transit.basic.*;
+import net.minecraft.block.entity.*;
+
+public abstract class AbstractSystemNode extends AbstractNode {
+
+ public AbstractSystemNode(BlockEntityType<?> type) {
+ super(type);
+ }
+
+}
diff --git a/src/main/java/net/cshift/transit/network/packet/IStaticPacket.java b/src/main/java/net/cshift/transit/network/packet/IStaticPacket.java
new file mode 100644
index 0000000..bac8745
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/packet/IStaticPacket.java
@@ -0,0 +1,23 @@
+package net.cshift.transit.network.packet;
+
+import net.cshift.transit.type.*;
+
+/** Interface describing an unchanging packet.
+ * @author Kyle Gunger
+ *
+ * @param <D> The data type (Object) that the packet transfers.
+ */
+public interface IStaticPacket<D>
+{
+ /**Get the packet's data.
+ *
+ * @return <D> The packet's data
+ */
+ public D getData();
+
+ /**Get the packet's type.
+ *
+ * @return IType<<D>> The type of the packet
+ */
+ public Type<D> getType();
+}
diff --git a/src/main/java/net/cshift/transit/network/packet/MetaPacket.java b/src/main/java/net/cshift/transit/network/packet/MetaPacket.java
new file mode 100644
index 0000000..99be83c
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/packet/MetaPacket.java
@@ -0,0 +1,35 @@
+package net.cshift.transit.network.packet;
+
+import net.cshift.transit.type.*;
+
+/** Static packet with extra data attached.
+ * @author Kyle Gunger
+ *
+ * @param <D> The data type (Object) that the packet transfers
+ * @param <M> The type of metadata
+*/
+public class MetaPacket<D, M> extends StaticPacket<D>
+{
+ private M metaData;
+
+ /** Constructor
+ *
+ * @param dat The data to store
+ * @param t The Type of the data
+ * @param meta The metadata to store
+ */
+ public MetaPacket(D dat, Type<D> t, M meta)
+ {
+ super(dat, t);
+ metaData = meta;
+ }
+
+ /** Get the metadata of the packet.
+ *
+ * @return The packet's metadata
+ */
+ public M getMetaData()
+ {
+ return metaData;
+ }
+}
diff --git a/src/main/java/net/cshift/transit/network/packet/StaticPacket.java b/src/main/java/net/cshift/transit/network/packet/StaticPacket.java
new file mode 100644
index 0000000..7c95108
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/packet/StaticPacket.java
@@ -0,0 +1,36 @@
+package net.cshift.transit.network.packet;
+
+import net.cshift.transit.type.*;
+
+/** Simple packet which stores an unchanging value.
+ * @author Kyle Gunger
+ *
+ * @param <D> The data type (Object) that the packet transfers.
+ */
+public class StaticPacket<D> implements IStaticPacket<D>
+{
+ private D data;
+ private Type<D> type;
+
+ /** Constructor. Stores the given data and uses the given type.
+ *
+ * @param dat The packet's data
+ * @param t The packet's type
+ */
+ public StaticPacket(D dat, Type<D> t)
+ {
+ data = dat;
+ type = t;
+ }
+
+ @Override
+ public D getData()
+ {
+ return data;
+ }
+
+ @Override
+ public Type<D> getType() {
+ return type;
+ }
+}
diff --git a/src/main/java/net/cshift/transit/network/packet/dynamic/DynamicPacket.java b/src/main/java/net/cshift/transit/network/packet/dynamic/DynamicPacket.java
new file mode 100644
index 0000000..d5feb92
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/packet/dynamic/DynamicPacket.java
@@ -0,0 +1,43 @@
+package net.cshift.transit.network.packet.dynamic;
+
+import net.cshift.transit.type.Type;
+
+/**
+ * Simple packet which stores a fluid value.
+ *
+ * @author Kyle Gunger
+ *
+ * @param <D> The data type (Object) that the packet transfers
+ */
+public class DynamicPacket<D> implements IDynamicPacket<D> {
+ private D data;
+ private Type<D> type;
+
+ /** Constructor. Stores the given data and uses the given type.
+ *
+ * @param dat The packet's data
+ * @param t The packet's type
+ */
+ public DynamicPacket(D dat, Type<D> t)
+ {
+ data = dat;
+ type = t;
+ }
+
+ @Override
+ public D getData()
+ {
+ return data;
+ }
+
+ @Override
+ public void setData(D dat)
+ {
+ data = dat;
+ }
+
+ @Override
+ public Type<D> getType() {
+ return type;
+ }
+}
diff --git a/src/main/java/net/cshift/transit/network/packet/dynamic/IDynamicPacket.java b/src/main/java/net/cshift/transit/network/packet/dynamic/IDynamicPacket.java
new file mode 100644
index 0000000..ffb68a3
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/packet/dynamic/IDynamicPacket.java
@@ -0,0 +1,16 @@
+package net.cshift.transit.network.packet.dynamic;
+
+import net.cshift.transit.network.packet.IStaticPacket;
+
+/** Interface describing a fluid packet.
+ * @author Kyle Gunger
+ *
+ * @param <D> The data type (Object) that the packet transfers
+ */
+public interface IDynamicPacket<D> extends IStaticPacket<D>{
+ /**Set the packet's data.
+ *
+ * @return <D> The packet's data
+ */
+ public void setData(D dat);
+}
diff --git a/src/main/java/net/cshift/transit/network/packet/dynamic/MetaDynamicPacket.java b/src/main/java/net/cshift/transit/network/packet/dynamic/MetaDynamicPacket.java
new file mode 100644
index 0000000..9e7d293
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/packet/dynamic/MetaDynamicPacket.java
@@ -0,0 +1,44 @@
+package net.cshift.transit.network.packet.dynamic;
+
+import net.cshift.transit.type.Type;
+
+/** Static packet with extra data attached.
+ * @author Kyle Gunger
+ *
+ * @param <D> The data type (Object) that the packet transfers
+ * @param <M> The type of metadata
+*/
+public class MetaDynamicPacket<D, M> extends DynamicPacket<D>
+{
+ private M metaData;
+
+ /** Constructor
+ *
+ * @param dat The data to store
+ * @param t The Type of the data
+ * @param meta The metadata to store
+ */
+ public MetaDynamicPacket(D dat, Type<D> t, M meta)
+ {
+ super(dat, t);
+ metaData = meta;
+ }
+
+ /** Get the metadata of the packet.
+ *
+ * @return The packet's metadata
+ */
+ public M getMetaData()
+ {
+ return metaData;
+ }
+
+ /** Set the metadata of the packet.
+ *
+ * @param meta The packet's new metadata
+ */
+ public void setMetaData(M meta)
+ {
+ metaData = meta;
+ }
+}
diff --git a/src/main/java/net/cshift/transit/network/system/Connection.java b/src/main/java/net/cshift/transit/network/system/Connection.java
new file mode 100644
index 0000000..a111795
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/system/Connection.java
@@ -0,0 +1,49 @@
+package net.cshift.transit.network.system;
+
+public class Connection {
+ INode node;
+ short mask;
+
+ public Connection(INode n)
+ {
+ node = n;
+ mask = 0;
+ }
+
+ public Connection(INode n, short m)
+ {
+ node = n;
+ mask = m;
+ }
+
+ public INode getNode()
+ {
+ return node;
+ }
+
+ public boolean isAccepting()
+ {
+ return (mask & 1) == 1;
+ }
+
+ public void setAccepting(boolean value)
+ {
+ if(isAccepting() && value == false)
+ mask -= 1;
+ else if(!isAccepting() && value == true)
+ mask += 1;
+ }
+
+ public boolean isProviding()
+ {
+ return (mask & 2) == 2;
+ }
+
+ public void setProviding(boolean value)
+ {
+ if(isProviding() && value == false)
+ mask -= 2;
+ else if(!isProviding() && value == true)
+ mask += 2;
+ }
+}
diff --git a/src/main/java/net/cshift/transit/network/system/INode.java b/src/main/java/net/cshift/transit/network/system/INode.java
new file mode 100644
index 0000000..5c901a9
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/system/INode.java
@@ -0,0 +1,53 @@
+package net.cshift.transit.network.system;
+
+/**
+ * @author Kyle Gunger
+ * @apiNote A node inside or outside a system.
+ */
+public interface INode
+{
+
+ /**Returns true if the group given is used by the node
+ *
+ * @param groupID the group to querry
+ * @return bool
+ */
+ public boolean hasGroup(String groupID);
+
+
+ /**Get the system managing the node or {@code null} if there isn't one
+ *
+ * @return System
+ */
+ public ISystem getSystem();
+
+
+ /** Get the data of one of the TypeGroups the Node supports
+ *
+ * @param groupID
+ * @return
+ */
+ public Object getData(String groupID);
+
+
+ /** Set the group data for the node
+ *
+ * @param dat
+ * @param groupID
+ */
+ public void setData(Object dat, String groupID);
+
+
+ /** Get the nodes that this node is connected to
+ *
+ * @return Node[]
+ */
+ public Connection[] getConnections();
+
+
+ /** Get the number of nodes that this node is connected to
+ *
+ * @return int
+ */
+ public int connectionCount();
+}
diff --git a/src/main/java/net/cshift/transit/network/system/ISystem.java b/src/main/java/net/cshift/transit/network/system/ISystem.java
new file mode 100644
index 0000000..9e01645
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/system/ISystem.java
@@ -0,0 +1,15 @@
+package net.cshift.transit.network.system;
+
+
+/**
+ * @author Kyle Gunger
+ * @apiNote An ISystem represents a system of nodes which has been optimized for performance. A node can exist on its own, but an ISystem can't exist without a node.
+ */
+public interface ISystem
+{
+ /**The nodes stored by the system
+ *
+ * @return INode[]
+ */
+ public INode[] getNodes();
+}
diff --git a/src/main/java/net/cshift/transit/network/system/swap/IAcceptorNode.java b/src/main/java/net/cshift/transit/network/system/swap/IAcceptorNode.java
new file mode 100644
index 0000000..b64d4cc
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/system/swap/IAcceptorNode.java
@@ -0,0 +1,37 @@
+package net.cshift.transit.network.system.swap;
+
+import net.cshift.transit.network.packet.IStaticPacket;
+import net.cshift.transit.network.system.INode;
+
+/**
+ * @author Kyle Gunger
+ * @apiNote A node which can accept packets of specific types
+ */
+public interface IAcceptorNode extends INode
+{
+
+ /** Link another node as a provider
+ *
+ * @param requester The object to be a provider
+ * @param group
+ * @return
+ */
+ public boolean linkProvider(IProviderNode requestor, String group);
+
+
+ /** Unlink a provider from the acceptor
+ *
+ * @param requestor
+ * @return
+ */
+ public boolean unlinkProvider(IProviderNode requestor);
+
+
+ /** Accept a packet from a provider
+ *
+ * @param packet
+ * @param group
+ * @return
+ */
+ public <T> boolean accept(IStaticPacket<T> packet, String group);
+}
diff --git a/src/main/java/net/cshift/transit/network/system/swap/IProviderNode.java b/src/main/java/net/cshift/transit/network/system/swap/IProviderNode.java
new file mode 100644
index 0000000..5a3bd80
--- /dev/null
+++ b/src/main/java/net/cshift/transit/network/system/swap/IProviderNode.java
@@ -0,0 +1,27 @@
+package net.cshift.transit.network.system.swap;
+
+import net.cshift.transit.network.system.INode;
+
+/**
+ * @author Kyle Gunger
+ * @apiNote A node which can provide packets of specific types
+ */
+public interface IProviderNode extends INode{
+
+ /** Link another node as an acceptor
+ *
+ * @param requester The object requesting the Acceptor
+ * @param group
+ * @return boolean
+ */
+ public boolean linkAcceptor(IAcceptorNode requestor, String group);
+
+
+ /** Unlink a provider from the acceptor
+ *
+ * @param requestor
+ * @return
+ */
+ public boolean unlinkAcceptor(IAcceptorNode requestor);
+
+}
diff --git a/src/main/java/net/cshift/transit/type/TFluid.java b/src/main/java/net/cshift/transit/type/TFluid.java
new file mode 100644
index 0000000..4f6b70f
--- /dev/null
+++ b/src/main/java/net/cshift/transit/type/TFluid.java
@@ -0,0 +1,33 @@
+package net.cshift.transit.type;
+
+import net.minecraft.fluid.Fluid;
+
+/** Units of fluid.
+ * @author Kyle Gunger
+ */
+public class TFluid {
+ private Fluid fluid;
+ private Number millibuckets;
+
+ /** Constructor
+ *
+ * @param f Fluid stored (Water/Lava/etc.)
+ * @param mb Count of fluid (mB)
+ */
+ public TFluid(Fluid f, Number mb) {
+ fluid = f;
+ millibuckets = mb;
+ }
+
+ /** Get the fluid stored.
+ */
+ public Fluid getFluid() {
+ return fluid;
+ }
+
+ /** Get the millibuckets stored.
+ */
+ public Number getMilliBuckets() {
+ return millibuckets;
+ }
+}
diff --git a/src/main/java/net/cshift/transit/type/TMana.java b/src/main/java/net/cshift/transit/type/TMana.java
new file mode 100644
index 0000000..468b04f
--- /dev/null
+++ b/src/main/java/net/cshift/transit/type/TMana.java
@@ -0,0 +1,31 @@
+package net.cshift.transit.type;
+
+/** Units of mana.
+ * @author Kyle Gunger
+ */
+public class TMana {
+ private String type;
+ private Number count;
+
+ /** Constructor
+ *
+ * @param t Type of mana (Fire/Water/Dark/Light/etc.) leave empty string for an untyped mana system.
+ * @param ct Count of mana
+ */
+ public TMana(String t, Number ct) {
+ type = t;
+ count = ct;
+ }
+
+ /** Get the mana type.
+ */
+ public String getType() {
+ return type;
+ }
+
+ /** Get the mana stored.
+ */
+ public Number getCount() {
+ return count;
+ }
+}
diff --git a/src/main/java/net/cshift/transit/type/Type.java b/src/main/java/net/cshift/transit/type/Type.java
new file mode 100644
index 0000000..46e2ace
--- /dev/null
+++ b/src/main/java/net/cshift/transit/type/Type.java
@@ -0,0 +1,66 @@
+package net.cshift.transit.type;
+
+import net.cshift.transit.network.packet.*;
+
+/**@author Kyle Gunger
+ *
+ * @param T The type of object transfered by packets of this type
+ */
+public class Type<T>
+{
+ protected final String typeID;
+ protected final String groupID;
+
+ public Type(String tID, String gID)
+ {
+ typeID = tID;
+ groupID = gID;
+ }
+
+ /** Return the packet's data formatted in the group's base type.
+ * If creating a new type, extend this class and override this function.
+ *
+ * @param packet The packet (of this type)
+ * @param group The group asking for the conversion
+ * @return The packet's data in the default type
+ */
+ public T toBase(IStaticPacket<T> packet, String group)
+ {
+ return packet.getData();
+ }
+
+ /** Create a packet which has the current type from the data in the base type.
+ * If creating a new type, extend this class and override this function.
+ *
+ * @param base The base data
+ * @param group The group that the data comes from
+ * @return IStaticPacket The packet
+ */
+ public IStaticPacket<T> fromBase(T base, String group)
+ {
+ return new StaticPacket<T>(base, this);
+ }
+
+ /** The type identifier. Gives the normal type identity of the type.
+ *
+ * @return String
+ */
+ public final String getType()
+ {
+ return typeID;
+ }
+
+ /** The group identifier. Gives the normal group identity of the type.
+ *
+ * @return String
+ */
+ public final String getGroup()
+ {
+ return groupID;
+ }
+
+ @Override
+ public final String toString() {
+ return groupID + ":" + typeID;
+ }
+}
diff --git a/src/main/java/net/cshift/transit/type/group/GroupRegistry.java b/src/main/java/net/cshift/transit/type/group/GroupRegistry.java
new file mode 100644
index 0000000..f16f31a
--- /dev/null
+++ b/src/main/java/net/cshift/transit/type/group/GroupRegistry.java
@@ -0,0 +1,56 @@
+package net.cshift.transit.type.group;
+
+import java.util.ArrayList;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import net.cshift.transit.type.Type;
+
+public final class GroupRegistry {
+ private static final ArrayList<TypeGroup<?>> GROUPS = new ArrayList<TypeGroup<?>>(0);
+
+ private static final Logger LOG = LogManager.getFormatterLogger("Transit|GroupRegistry");
+
+ private GroupRegistry() {}
+
+ public static final boolean addGroup(TypeGroup<?> group)
+ {
+ for(TypeGroup<?> g : GROUPS)
+ {
+ if(g.getGroup().equals(group.getGroup()))
+ {
+ LOG.warn("Failed to add group " + group + " to the registry. Did another mod add a group with the same name?");
+ return false;
+ }
+ }
+
+ GROUPS.add(group);
+ LOG.info("Successfully added group " + group + " to the registry.");
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ public static final <T> TypeGroup<T> groupByID(String groupID)
+ {
+ for(TypeGroup<?> g : GROUPS)
+ {
+ if(g.getGroup().equals(groupID)){
+ try{
+ return (TypeGroup<T>) g;
+ }catch(ClassCastException e) {
+ return null;
+ }
+ }
+ }
+
+ return null;
+
+ }
+
+ public static final <T> Type<T> typeByIdentity(String groupID, String typeID)
+ {
+ return GroupRegistry.<T>groupByID(groupID).getType(typeID);
+ }
+
+}
diff --git a/src/main/java/net/cshift/transit/type/group/TypeGroup.java b/src/main/java/net/cshift/transit/type/group/TypeGroup.java
new file mode 100644
index 0000000..5b8f061
--- /dev/null
+++ b/src/main/java/net/cshift/transit/type/group/TypeGroup.java
@@ -0,0 +1,267 @@
+package net.cshift.transit.type.group;
+
+import java.util.ArrayList;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import net.cshift.transit.network.packet.*;
+import net.cshift.transit.type.Type;
+
+/**
+ * @author Kyle Gunger
+ * @param <B> The base object which all grouped Types should convert between.
+ */
+public class TypeGroup<B>
+{
+ // The base Type (provides the group's identifier)
+ private Type<B> baseType;
+
+ // The list of types.
+ private final ArrayList<Type<B>> TYPES = new ArrayList<Type<B>>(0);
+
+ // Logger for events in the TypeGroup.
+ private static final Logger LOG = LogManager.getFormatterLogger("Transit|Group");
+
+
+ public TypeGroup(Type<B> base)
+ {
+ baseType = base;
+ addType(base);
+ }
+
+
+ // Type management
+
+ /** Add a Type to the TypeGroup.
+ * The Type must have a group-type combo not already found in this TypeGroup.
+ * Returns {@code true} if the group was added.
+ *
+ * @param type The Type to add
+ * @return
+ */
+ public boolean addType(Type<B> type)
+ {
+ if(!isInGroup(type))
+ {
+ TYPES.add(type);
+ LOG.info("Added type " + type + " to group " + getGroup());
+ return true;
+ }
+
+ LOG.info("Failed to add type " + type + " to group " + getGroup() + ". Was the type already added?");
+ return false;
+ }
+
+ /** Remove a Type from the TypeGroup.
+ *
+ * @param type The Type to remove
+ * @return
+ */
+ public boolean removeType(Type<B> type)
+ {
+ if(type.equals(baseType)) {
+ LOG.warn("[WARN] Failed to remove type " + type + " from group " + getGroup() + ". This is the base type and can not be removed.");
+ return false;
+ }
+
+ if(TYPES.indexOf(type) != -1)
+ {
+ LOG.info("Removed type " + TYPES.remove(TYPES.indexOf(type)) + " from group " + getGroup());
+ return true;
+ }
+
+ LOG.warn("[WARN] Failed to remove type " + type + " from group " + getGroup() + ". Are we sure that the type was added to the group first?");
+ return false;
+ }
+
+ /** Remove a type from the group based on it's group-type identifier.
+ *
+ * @param type
+ * @return
+ */
+ public boolean removeType(String groupID, String typeID)
+ {
+ if(baseType.toString() == groupID + ":" + typeID) {
+ LOG.warn("[WARN] Failed to remove type " + baseType + " from group " + getGroup() + ". This is the base type and can not be removed.");
+ return false;
+ }
+
+ for(Type<?> type : TYPES)
+ {
+ if(type.toString() == groupID + ":" + typeID)
+ {
+ LOG.info("Removed type " + TYPES.remove(TYPES.indexOf(type)) + " from group " + getGroup());
+ return true;
+ }
+ }
+
+ LOG.warn("[WARN] Failed to remove type " + groupID + ":" + typeID + " from group " + getGroup() + ". Are we sure that the type was added to the group first?");
+ return false;
+ }
+
+ /** Remove a type from the group based on it's group-type identifier.
+ *
+ * @param type
+ * @return
+ */
+ public boolean removeType(String typeID)
+ {
+ return removeType(getGroup(), typeID);
+ }
+
+
+ // Check if a type is in the group
+
+ /**Check if the type is in the group
+ *
+ * @param type
+ * @return boolean
+ */
+ public boolean isInGroup(Type<B> type)
+ {
+ for(Type<B> t : TYPES)
+ {
+ if(t.equals(type)) return true;
+ }
+ return false;
+ }
+
+ /**Check if the type is in the group
+ *
+ * @param groupID
+ * @param typeID
+ * @return boolean
+ */
+ public boolean isInGroup(String groupID, String typeID)
+ {
+ for(Type<B> t : TYPES)
+ {
+ if(t.toString() == groupID + ":" + typeID) return true;
+ }
+ return false;
+ }
+
+ /**Check if the type is in the group
+ *
+ * @param typeID
+ * @return boolean
+ */
+ public boolean isInGroup(String typeID)
+ {
+ return isInGroup(getGroup(), typeID);
+ }
+
+ // Get a type in the group
+
+ /**Get the type from the group
+ *
+ * @param groupID The ID of the group the type is originally from
+ * @param typeID The ID of the type
+ * @return Type
+ */
+ public Type<B> getType(String groupID, String typeID)
+ {
+ for(Type<B> t : TYPES)
+ {
+ if(t.toString() == groupID + ":" + typeID) return t;
+ }
+
+ return null;
+ }
+
+ /**Get the type from the group
+ *
+ * @param typeID The ID of the type
+ * @return Type
+ */
+ public Type<B> getType(String typeID)
+ {
+ return getType(getGroup(), typeID);
+ }
+
+
+ // Type conversion
+
+ /** Actually convert the packet
+ *
+ * @param packet
+ * @param type
+ * @return
+ */
+ protected IStaticPacket<B> convertPacketRaw(IStaticPacket<B> packet, Type<B> type)
+ {
+ return type.fromBase(packet.getType().toBase(packet, getGroup()), getGroup());
+ }
+
+ /**Convert a packet to a new type Returns null if the type isn't in the group.
+ *
+ * @param packet The packet to convert
+ * @param type The type to convert to
+ * @return Packet
+ */
+ public IStaticPacket<B> convertPacket(IStaticPacket<B> packet, Type<B> type)
+ {
+ if(isInGroup(packet.getType()) && isInGroup(type))
+ {
+ return convertPacketRaw(packet, type);
+ }
+
+ return null;
+ }
+
+ /**Convert a packet to a new type Returns null if the type isn't found.
+ *
+ * @param packet The packet to convert
+ * @param groupID The groupID of the Type to convert to
+ * @param typeID The typeID of the Type to convert to
+ * @return Packet
+ */
+ public IStaticPacket<B> convertPacket(IStaticPacket<B> packet, String groupID, String typeID)
+ {
+ Type<B> toType = getType(groupID, typeID);
+ if(toType != null)
+ {
+ return convertPacketRaw(packet, toType);
+ }
+
+ return null;
+ }
+
+ /**Convert a packet to a new type. Returns null if the type isn't found.
+ *
+ * @param packet The packet to convert
+ * @param typeID The typeID of the Type to convert to
+ * @return Packet
+ */
+ public IStaticPacket<B> convertPacket(IStaticPacket<B> packet, String typeID)
+ {
+ Type<B> toType = getType(typeID);
+ if(toType != null)
+ {
+ return convertPacketRaw(packet, toType);
+ }
+
+ return null;
+ }
+
+ /** The group identifier. Given by the Base Group
+ * @return String
+ */
+ public final String getGroup()
+ {
+ return baseType.getGroup();
+ }
+
+ /** The base group type
+ * @return Type
+ */
+ public final Type<B> getBase() {
+ return baseType;
+ }
+
+ @Override
+ public final String toString() {
+ return this.getGroup();
+ }
+}
diff --git a/src/main/java/net/cshift/transit/type/group/simple/SimpleGroups.java b/src/main/java/net/cshift/transit/type/group/simple/SimpleGroups.java
new file mode 100644
index 0000000..24868e1
--- /dev/null
+++ b/src/main/java/net/cshift/transit/type/group/simple/SimpleGroups.java
@@ -0,0 +1,32 @@
+package net.cshift.transit.type.group.simple;
+
+import net.minecraft.item.ItemStack;
+import net.cshift.transit.type.group.*;
+import net.cshift.transit.type.simple.SimpleTypes;
+import net.cshift.transit.type.*;
+
+public final class SimpleGroups {
+ /** Transfers energy. Basic unit is TJoule (Transit Joule).
+ */
+ public static final TypeGroup<Number> ENERGY_GROUP = new TypeGroup<Number>(SimpleTypes.TransitJoule);
+
+ /** Transfers mana. Basic unit is TMana (Transit Mana).
+ */
+ public static final TypeGroup<TMana> MANA_GROUP = new TypeGroup<TMana>(SimpleTypes.TransitMana);
+
+ /** Transfers items. Basic type is ItemStack.
+ */
+ public static final TypeGroup<ItemStack> ITEM_GROUP = new TypeGroup<ItemStack>(SimpleTypes.Item);
+
+ /** Transfers fluids. Basic unit is TFluid.
+ */
+ public static final TypeGroup<TFluid> FLUID_GROUP = new TypeGroup<TFluid>(SimpleTypes.Fluid);
+
+ public static final void init()
+ {
+ GroupRegistry.addGroup(ENERGY_GROUP);
+ GroupRegistry.addGroup(MANA_GROUP);
+ GroupRegistry.addGroup(ITEM_GROUP);
+ GroupRegistry.addGroup(FLUID_GROUP);
+ }
+}
diff --git a/src/main/java/net/cshift/transit/type/simple/SimpleTypes.java b/src/main/java/net/cshift/transit/type/simple/SimpleTypes.java
new file mode 100644
index 0000000..4b231f3
--- /dev/null
+++ b/src/main/java/net/cshift/transit/type/simple/SimpleTypes.java
@@ -0,0 +1,22 @@
+package net.cshift.transit.type.simple;
+
+import net.minecraft.item.ItemStack;
+import net.cshift.transit.type.*;
+
+public final class SimpleTypes {
+ /** Transfers energy. Energy is stored as a numeric, base value is TJoule (TransitJoule)
+ */
+ public static final Type<Number> TransitJoule = new Type<Number>("TJoule", "ENERGY");
+
+ /** Transfers mana. TMana stores mana count and type.
+ */
+ public static final Type<TMana> TransitMana = new Type<TMana>("TMana", "MANA");
+
+ /** Transfers items in a itemstack.
+ */
+ public static final Type<ItemStack> Item = new Type<ItemStack>("Item", "ITEM");
+
+ /** Transfers fluid. TFluid stores fluid and mB.
+ */
+ public static final Type<TFluid> Fluid = new Type<TFluid>("Fluid", "FLUID");
+}