From 307d2258d14f4ca2f51e28db403ec9a7fac6db8b Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Mon, 2 Sep 2013 16:51:20 -0400 Subject: [PATCH] Progress on Rewriting Packet Handling Continued building a system for transferring the complete internal states of our dimensions from the server to the client. However, Steven suggested that clients only need minimal data to operate properly, as opposed to the server. My motivation for this more complicated system was the concern that minimal information wouldn't be enough. I'm going to commit my progress, then tear it down and write a much simpler version. --- .../mod_pocketDim/ConnectionHandler.java | 4 +- .../mod_pocketDim/ServerPacketHandler.java | 18 +-- .../mod_pocketDim/core/DimLink.java | 4 +- .../mod_pocketDim/core/NewDimData.java | 18 +-- .../mod_pocketDim/core/PocketManager.java | 30 ++-- .../messages/DimMessageBuilder.java | 116 +++++++++++++++ .../mod_pocketDim/messages/IDataMessage.java | 9 ++ .../messages/IMessageBuilder.java | 11 ++ .../messages/IUpdateWatcher.java | 8 ++ .../messages/LinkMessageBuilder.java | 134 ++++++++++++++++++ .../UpdateWatcherProxy.java | 8 +- .../mod_pocketDim/util/Point4D.java | 28 ++++ .../mod_pocketDim/watcher/IOpaqueMessage.java | 8 -- .../mod_pocketDim/watcher/IOpaqueReader.java | 8 -- .../mod_pocketDim/watcher/IUpdateWatcher.java | 8 -- 15 files changed, 348 insertions(+), 64 deletions(-) create mode 100644 StevenDimDoors/mod_pocketDim/messages/DimMessageBuilder.java create mode 100644 StevenDimDoors/mod_pocketDim/messages/IDataMessage.java create mode 100644 StevenDimDoors/mod_pocketDim/messages/IMessageBuilder.java create mode 100644 StevenDimDoors/mod_pocketDim/messages/IUpdateWatcher.java create mode 100644 StevenDimDoors/mod_pocketDim/messages/LinkMessageBuilder.java rename StevenDimDoors/mod_pocketDim/{watcher => messages}/UpdateWatcherProxy.java (79%) delete mode 100644 StevenDimDoors/mod_pocketDim/watcher/IOpaqueMessage.java delete mode 100644 StevenDimDoors/mod_pocketDim/watcher/IOpaqueReader.java delete mode 100644 StevenDimDoors/mod_pocketDim/watcher/IUpdateWatcher.java 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); -}