diff --git a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 0b13248..2abf8d3 100644 --- a/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -11,7 +11,7 @@ import net.minecraft.network.packet.Packet1Login; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.server.MinecraftServer; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; +import StevenDimDoors.mod_pocketDim.messages.IDataMessage; import cpw.mods.fml.common.network.IConnectionHandler; import cpw.mods.fml.common.network.Player; @@ -41,7 +41,7 @@ public class ConnectionHandler implements IConnectionHandler //Send information about all the registered dimensions and links to the client try { - IOpaqueMessage message = PocketManager.getState(); + IDataMessage message = PocketManager.getState(); Packet250CustomPayload packet = new Packet250CustomPayload(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); DataOutputStream writer = new DataOutputStream(buffer); diff --git a/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java b/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java index 310b84a..d33c613 100644 --- a/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java +++ b/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java @@ -7,8 +7,8 @@ import java.io.IOException; import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet250CustomPayload; import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; -import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; +import StevenDimDoors.mod_pocketDim.messages.IDataMessage; +import StevenDimDoors.mod_pocketDim.messages.IUpdateWatcher; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.common.network.Player; @@ -30,19 +30,19 @@ public class ServerPacketHandler implements IPacketHandler private class DimWatcher implements IUpdateWatcher { @Override - public void onCreated(IOpaqueMessage message) + public void onCreated(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.CREATE_DIM_PACKET_ID, message); } @Override - public void onUpdated(IOpaqueMessage message) + public void onUpdated(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.UPDATE_DIM_PACKET_ID, message); } @Override - public void onDeleted(IOpaqueMessage message) + public void onDeleted(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.DELETE_DIM_PACKET_ID, message); } @@ -51,25 +51,25 @@ public class ServerPacketHandler implements IPacketHandler private class LinkWatcher implements IUpdateWatcher { @Override - public void onCreated(IOpaqueMessage message) + public void onCreated(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.CREATE_LINK_PACKET_ID, message); } @Override - public void onUpdated(IOpaqueMessage message) + public void onUpdated(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.UPDATE_LINK_PACKET_ID, message); } @Override - public void onDeleted(IOpaqueMessage message) + public void onDeleted(IDataMessage message) { sendMessageToAllPlayers(PacketConstants.DELETE_LINK_PACKET_ID, message); } } - private static void sendMessageToAllPlayers(byte id, IOpaqueMessage message) + private static void sendMessageToAllPlayers(byte id, IDataMessage message) { try { diff --git a/StevenDimDoors/mod_pocketDim/core/DimLink.java b/StevenDimDoors/mod_pocketDim/core/DimLink.java index c0cf6de..a8c296b 100644 --- a/StevenDimDoors/mod_pocketDim/core/DimLink.java +++ b/StevenDimDoors/mod_pocketDim/core/DimLink.java @@ -13,7 +13,7 @@ public abstract class DimLink protected LinkTail tail; protected ArrayList children; - public DimLink(Point4D source, DimLink parent) + protected DimLink(Point4D source, DimLink parent) { this.parent = parent; this.source = source; @@ -22,7 +22,7 @@ public abstract class DimLink parent.children.add(this); } - public DimLink(Point4D source, int linkType) + protected DimLink(Point4D source, int linkType) { if (linkType < LinkTypes.ENUM_MIN || linkType > LinkTypes.ENUM_MAX) { diff --git a/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/StevenDimDoors/mod_pocketDim/core/NewDimData.java index 02ba5c4..7ff3160 100644 --- a/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -10,9 +10,10 @@ import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; import StevenDimDoors.mod_pocketDim.dungeon.pack.DungeonPack; +import StevenDimDoors.mod_pocketDim.messages.IDataMessage; +import StevenDimDoors.mod_pocketDim.messages.IUpdateWatcher; +import StevenDimDoors.mod_pocketDim.messages.LinkMessageBuilder; import StevenDimDoors.mod_pocketDim.util.Point4D; -import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; -import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; public abstract class NewDimData { @@ -106,17 +107,18 @@ public abstract class NewDimData tail = new LinkTail(linkType, null); } - public IOpaqueMessage toMessage() + public IDataMessage toMessage() { - return null; + return linkMessageBuilder.createMessage(this); } - public IOpaqueMessage toKey() + public IDataMessage toKey() { - return null; + return linkMessageBuilder.createKey(this); } } + private static LinkMessageBuilder linkMessageBuilder = new LinkMessageBuilder(); private static Random random = new Random(); private final int id; @@ -177,8 +179,8 @@ public abstract class NewDimData } } - protected abstract IOpaqueMessage toMessage(); - protected abstract IOpaqueMessage toKey(); + protected abstract IDataMessage toMessage(); + protected abstract IDataMessage toKey(); public DimLink findNearestRift(World world, int range, int x, int y, int z) { diff --git a/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 92ff1e2..91f90ca 100644 --- a/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -14,18 +14,19 @@ import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.DDProperties; import StevenDimDoors.mod_pocketDim.helpers.DeleteFolder; +import StevenDimDoors.mod_pocketDim.messages.DimMessageBuilder; +import StevenDimDoors.mod_pocketDim.messages.IDataMessage; +import StevenDimDoors.mod_pocketDim.messages.IUpdateWatcher; +import StevenDimDoors.mod_pocketDim.messages.UpdateWatcherProxy; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.util.Point4D; -import StevenDimDoors.mod_pocketDim.watcher.IOpaqueMessage; -import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; -import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy; /** * This class regulates all the operations involving the storage and manipulation of dimensions. It handles saving dim data, teleporting the player, and * creating/registering new dimensions as well as loading old dimensions on startup */ public class PocketManager -{ +{ private static class InnerDimData extends NewDimData { //This inner class allows us to instantiate NewDimData indirectly without exposing @@ -40,22 +41,21 @@ public class PocketManager } @Override - protected IOpaqueMessage toMessage() + protected IDataMessage toMessage() { - // TODO Auto-generated method stub - return null; + return dimMessageBuilder.createMessage(this); } @Override - protected IOpaqueMessage toKey() + protected IDataMessage toKey() { - // TODO Auto-generated method stub - return null; + return dimMessageBuilder.createKey(this); } } - + + private static DimMessageBuilder dimMessageBuilder = new DimMessageBuilder(); private static int OVERWORLD_DIMENSION_ID = 0; - + private static volatile boolean isLoading = false; private static volatile boolean isLoaded = false; private static volatile boolean isSaving = false; @@ -198,7 +198,7 @@ public class PocketManager System.out.println("Loading Dimensional Doors save data..."); File saveFile = new File(DimensionManager.getCurrentSaveRootDirectory() + "/dimdoors.dat"); //Missing code for converting the binary data in the file into an IOpaqueMessage - IOpaqueMessage saveData; + IDataMessage saveData; setState(saveData); System.out.println("Loaded successfully!"); } @@ -377,12 +377,12 @@ public class PocketManager return linkWatcher.unregisterReceiver(watcher); } - public static IOpaqueMessage getState() + public static IDataMessage getState() { } - public static void setState(IOpaqueMessage state) + public static void setState(IDataMessage state) { if (isLoaded) { diff --git a/StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java b/StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java new file mode 100644 index 0000000..cb46451 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java @@ -0,0 +1,116 @@ +package StevenDimDoors.mod_pocketDim.messages; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.core.NewDimData; +import StevenDimDoors.mod_pocketDim.core.NewDimData.InnerDimLink; +import StevenDimDoors.mod_pocketDim.dungeon.DungeonData; +import StevenDimDoors.mod_pocketDim.util.Point4D; + +import com.google.common.collect.ImmutableList; + +public class DimMessageBuilder implements IMessageBuilder +{ + public static class DimMessage implements IDataMessage + { + //We'll use public fields here since this is a data container object and all the fields are immutable + //We will not transfer dungeon, link data, or any data on child dimensions + //As far as I can tell, the children will handle updating their parents anyway + + public final int ID; + public final boolean IsDungeon; + public final boolean IsFilled; + public final int Depth; + public final int PackDepth; + public final Integer ParentID; + public final int RootID; + public final Point4D Origin; + public final int Orientation; + + private DimMessage(NewDimData dimension) + { + ID = dimension.id(); + IsDungeon = dimension.isDungeon(); + IsFilled = dimension.isFilled(); + Depth = dimension.depth(); + PackDepth = dimension.packDepth(); + ParentID = (dimension.parent() != null) ? dimension.parent().id() : null; + RootID = dimension.root().id(); + Origin = dimension.origin(); + Orientation = dimension.orientation(); + } + + private DimMessage(DataInputStream stream) throws IOException + { + ID = stream.readInt(); + IsDungeon = stream.readBoolean(); + IsFilled = stream.readBoolean(); + Depth = stream.readInt(); + PackDepth = stream.readInt(); + ParentID = stream. + } + + @Override + public void writeToStream(DataOutputStream stream) throws IOException + { + //Write a flag indicating that this is a full message and not a key + stream.writeBoolean(true); + + } + } + + public static class DimKeyMessage implements IDataMessage + { + //We'll use public fields here since this is a data container object and all the fields are immutable + public final int ID; + + private DimKeyMessage(NewDimData dimension) + { + ID = dimension.id(); + } + + private DimKeyMessage(DataInputStream stream) throws IOException + { + ID = stream.readInt(); + } + + @Override + public void writeToStream(DataOutputStream stream) throws IOException + { + //Write a flag indicating that this is a key + stream.writeBoolean(false); + stream.writeInt(ID); + } + } + + @Override + public IDataMessage createKey(NewDimData target) + { + return new DimKeyMessage(target); + } + + @Override + public IDataMessage createMessage(NewDimData target) + { + return new DimMessage(target); + } + + @Override + public IDataMessage read(DataInputStream source) throws IOException + { + //Check whether the message is a full message or just a key + if (source.readBoolean()) + { + return new DimMessage(source); + } + else + { + return new DimKeyMessage(source); + } + } +} diff --git a/StevenDimDoors/mod_pocketDim/messages/IDataMessage.java b/StevenDimDoors/mod_pocketDim/messages/IDataMessage.java new file mode 100644 index 0000000..8ee841d --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/messages/IDataMessage.java @@ -0,0 +1,9 @@ +package StevenDimDoors.mod_pocketDim.messages; + +import java.io.DataOutputStream; +import java.io.IOException; + +public interface IDataMessage +{ + public void writeToStream(DataOutputStream stream) throws IOException; +} diff --git a/StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java b/StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java new file mode 100644 index 0000000..297f8e5 --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java @@ -0,0 +1,11 @@ +package StevenDimDoors.mod_pocketDim.messages; + +import java.io.DataInputStream; +import java.io.IOException; + +public interface IMessageBuilder +{ + public IDataMessage createKey(T target); + public IDataMessage createMessage(T target); + public IDataMessage read(DataInputStream source) throws IOException; +} diff --git a/StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java b/StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java new file mode 100644 index 0000000..3bc24fd --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java @@ -0,0 +1,8 @@ +package StevenDimDoors.mod_pocketDim.messages; + +public interface IUpdateWatcher +{ + public void onCreated(IDataMessage message); + public void onUpdated(IDataMessage message); + public void onDeleted(IDataMessage message); +} diff --git a/StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java b/StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java new file mode 100644 index 0000000..d9d21bc --- /dev/null +++ b/StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java @@ -0,0 +1,134 @@ +package StevenDimDoors.mod_pocketDim.messages; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import StevenDimDoors.mod_pocketDim.core.DimLink; +import StevenDimDoors.mod_pocketDim.util.Point4D; + +import com.google.common.collect.ImmutableList; + +public class LinkMessageBuilder implements IMessageBuilder +{ + public static class LinkMessage implements IDataMessage + { + //We'll use public fields here since this is a data container object and all the fields are immutable + public final Point4D Source; + public final Point4D Destination; + public final int LinkType; + public final Point4D Parent; + public final ImmutableList Children; + + private LinkMessage(DimLink link) + { + // TODO: In the case that a child's parent has been removed but the rest of the group still exists, + // this group bond will be lost to this link on the client side. Currently, that's not a problem since + // destination data and groups don't matter to the client, but it's something to think about later. + + Source = link.source(); + Destination = link.destination(); + LinkType = link.linkType(); + Parent = link.parent().source(); + ImmutableList.Builder builder = new ImmutableList.Builder(); + for (DimLink child : link.children()) + { + builder.add(child.source()); + } + Children = builder.build(); + } + + private LinkMessage(DataInputStream stream) throws IOException + { + Source = Point4D.read(stream); + Parent = Point4D.read(stream); + if (Parent == null) + { + Destination = Point4D.read(stream); + LinkType = stream.readInt(); + } + else + { + Destination = null; + LinkType = -1; + } + int childCount = stream.readInt(); + ImmutableList.Builder builder = new ImmutableList.Builder(); + for (int k = 0; k < childCount; k++) + { + builder.add(Point4D.read(stream)); + } + Children = builder.build(); + } + + @Override + public void writeToStream(DataOutputStream stream) throws IOException + { + //Write a flag indicating that this is a full message and not a key + stream.writeBoolean(true); + Point4D.write(Source, stream); + Point4D.write(Parent, stream); + //A link only has its own destination information if it has no parent to provide it + if (Parent == null) + { + Point4D.write(Destination, stream); + stream.writeInt(LinkType); + } + stream.writeInt(Children.size()); + for (Point4D child : Children) + { + Point4D.write(child, stream); + } + } + } + + public static class LinkKeyMessage implements IDataMessage + { + //We'll use public fields here since this is a data container object and all the fields are immutable + public final Point4D Source; + + private LinkKeyMessage(DimLink link) + { + Source = link.source(); + } + + private LinkKeyMessage(DataInputStream stream) throws IOException + { + Source = Point4D.read(stream); + } + + @Override + public void writeToStream(DataOutputStream stream) throws IOException + { + //Write a flag indicating that this is a key + stream.writeBoolean(false); + Point4D.write(Source, stream); + } + } + + @Override + public IDataMessage createKey(DimLink target) + { + return new LinkKeyMessage(target); + } + + @Override + public IDataMessage createMessage(DimLink target) + { + return new LinkMessage(target); + } + + @Override + public IDataMessage read(DataInputStream source) throws IOException + { + //Check whether the message is a full message or just a key + if (source.readBoolean()) + { + return new LinkMessage(source); + } + else + { + return new LinkKeyMessage(source); + } + } +} diff --git a/StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java b/StevenDimDoors/mod_pocketDim/messages/UpdateWatcherProxy.java similarity index 79% rename from StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java rename to StevenDimDoors/mod_pocketDim/messages/UpdateWatcherProxy.java index 49874f2..1326151 100644 --- a/StevenDimDoors/mod_pocketDim/watcher/UpdateWatcherProxy.java +++ b/StevenDimDoors/mod_pocketDim/messages/UpdateWatcherProxy.java @@ -1,4 +1,4 @@ -package StevenDimDoors.mod_pocketDim.watcher; +package StevenDimDoors.mod_pocketDim.messages; import java.util.ArrayList; import java.util.List; @@ -13,7 +13,7 @@ public class UpdateWatcherProxy implements IUpdateWatcher } @Override - public void onCreated(IOpaqueMessage message) + public void onCreated(IDataMessage message) { for (IUpdateWatcher receiver : watchers) { @@ -22,7 +22,7 @@ public class UpdateWatcherProxy implements IUpdateWatcher } @Override - public void onUpdated(IOpaqueMessage message) + public void onUpdated(IDataMessage message) { for (IUpdateWatcher receiver : watchers) { @@ -31,7 +31,7 @@ public class UpdateWatcherProxy implements IUpdateWatcher } @Override - public void onDeleted(IOpaqueMessage message) + public void onDeleted(IDataMessage message) { for (IUpdateWatcher receiver : watchers) { diff --git a/StevenDimDoors/mod_pocketDim/util/Point4D.java b/StevenDimDoors/mod_pocketDim/util/Point4D.java index e8c6214..08164a8 100644 --- a/StevenDimDoors/mod_pocketDim/util/Point4D.java +++ b/StevenDimDoors/mod_pocketDim/util/Point4D.java @@ -1,5 +1,9 @@ package StevenDimDoors.mod_pocketDim.util; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + public final class Point4D implements Comparable { @@ -155,4 +159,28 @@ public final class Point4D implements Comparable { return "(" + x + ", " + y + ", " + z + ", " + dimension + ")"; } + + public static void write(Point4D point, DataOutputStream stream) throws IOException + { + stream.writeBoolean(point != null); + if (point != null) + { + stream.writeInt(point.x); + stream.writeInt(point.y); + stream.writeInt(point.z); + stream.writeInt(point.dimension); + } + } + + public static Point4D read(DataInputStream stream) throws IOException + { + if (stream.readBoolean()) + { + return new Point4D( stream.readInt(), stream.readInt(), stream.readInt(), stream.readInt() ); + } + else + { + return null; + } + } } diff --git a/StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java b/StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java deleted file mode 100644 index a3add2e..0000000 --- a/StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java +++ /dev/null @@ -1,8 +0,0 @@ -package StevenDimDoors.mod_pocketDim.watcher; - -import java.io.DataOutputStream; - -public interface IOpaqueMessage -{ - void writeToStream(DataOutputStream stream); -} diff --git a/StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java b/StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java deleted file mode 100644 index 8250094..0000000 --- a/StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java +++ /dev/null @@ -1,8 +0,0 @@ -package StevenDimDoors.mod_pocketDim.watcher; - -import com.google.common.io.ByteArrayDataInput; - -public interface IOpaqueReader -{ - IOpaqueMessage read(ByteArrayDataInput source); -} diff --git a/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java b/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java deleted file mode 100644 index 31f5a85..0000000 --- a/StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java +++ /dev/null @@ -1,8 +0,0 @@ -package StevenDimDoors.mod_pocketDim.watcher; - -public interface IUpdateWatcher -{ - public void onCreated(IOpaqueMessage message); - public void onUpdated(IOpaqueMessage message); - public void onDeleted(IOpaqueMessage message); -}