diff --git a/src/main/java/refinedstorage/api/IAPI.java b/src/main/java/refinedstorage/api/IAPI.java index 41a7d72aa..bd7a98f83 100755 --- a/src/main/java/refinedstorage/api/IAPI.java +++ b/src/main/java/refinedstorage/api/IAPI.java @@ -1,5 +1,6 @@ package refinedstorage.api; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; import refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; import refinedstorage.api.solderer.ISoldererRegistry; @@ -20,4 +21,10 @@ public interface IAPI { */ @Nonnull ICraftingTaskRegistry getCraftingTaskRegistry(); + + /** + * @return the crafting monitor element registry + */ + @Nonnull + ICraftingMonitorElementRegistry getCraftingMonitorElementRegistry(); } diff --git a/src/main/java/refinedstorage/api/autocrafting/craftingmonitor/ICraftingMonitorElement.java b/src/main/java/refinedstorage/api/autocrafting/craftingmonitor/ICraftingMonitorElement.java new file mode 100755 index 000000000..86f66c709 --- /dev/null +++ b/src/main/java/refinedstorage/api/autocrafting/craftingmonitor/ICraftingMonitorElement.java @@ -0,0 +1,14 @@ +package refinedstorage.api.autocrafting.craftingmonitor; + +import io.netty.buffer.ByteBuf; +import refinedstorage.gui.GuiBase; + +public interface ICraftingMonitorElement { + void draw(GuiBase gui, int x, int y); + + int getTaskId(); + + String getId(); + + void write(ByteBuf buf); +} diff --git a/src/main/java/refinedstorage/api/autocrafting/craftingmonitor/ICraftingMonitorElementRegistry.java b/src/main/java/refinedstorage/api/autocrafting/craftingmonitor/ICraftingMonitorElementRegistry.java new file mode 100755 index 000000000..d2e239107 --- /dev/null +++ b/src/main/java/refinedstorage/api/autocrafting/craftingmonitor/ICraftingMonitorElementRegistry.java @@ -0,0 +1,13 @@ +package refinedstorage.api.autocrafting.craftingmonitor; + +import io.netty.buffer.ByteBuf; + +import javax.annotation.Nullable; +import java.util.function.Function; + +public interface ICraftingMonitorElementRegistry { + void add(String id, Function factory); + + @Nullable + Function getFactory(String id); +} diff --git a/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java b/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java index 9f3285b99..3099f484e 100755 --- a/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java +++ b/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java @@ -5,6 +5,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import refinedstorage.api.autocrafting.ICraftingPattern; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import java.util.Deque; import java.util.List; @@ -25,6 +26,8 @@ public interface ICraftingTask { NBTTagCompound writeToNBT(NBTTagCompound tag); + List getCraftingMonitorElements(); + ICraftingPattern getPattern(); Deque getToTake(); diff --git a/src/main/java/refinedstorage/apiimpl/API.java b/src/main/java/refinedstorage/apiimpl/API.java index 4f79d9a73..88ec325b7 100755 --- a/src/main/java/refinedstorage/apiimpl/API.java +++ b/src/main/java/refinedstorage/apiimpl/API.java @@ -1,8 +1,10 @@ package refinedstorage.apiimpl; import refinedstorage.api.IAPI; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; import refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; import refinedstorage.api.solderer.ISoldererRegistry; +import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementRegistry; import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskRegistry; import refinedstorage.apiimpl.solderer.SoldererRegistry; @@ -13,6 +15,7 @@ public class API implements IAPI { private ISoldererRegistry soldererRegistry = new SoldererRegistry(); private ICraftingTaskRegistry craftingTaskRegistry = new CraftingTaskRegistry(); + private ICraftingMonitorElementRegistry craftingMonitorElementRegistry = new CraftingMonitorElementRegistry(); @Override @Nonnull @@ -25,4 +28,10 @@ public class API implements IAPI { public ICraftingTaskRegistry getCraftingTaskRegistry() { return craftingTaskRegistry; } + + @Nonnull + @Override + public ICraftingMonitorElementRegistry getCraftingMonitorElementRegistry() { + return craftingMonitorElementRegistry; + } } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementRegistry.java b/src/main/java/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementRegistry.java new file mode 100755 index 000000000..7204678ab --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementRegistry.java @@ -0,0 +1,25 @@ +package refinedstorage.apiimpl.autocrafting.craftingmonitor; + +import io.netty.buffer.ByteBuf; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public class CraftingMonitorElementRegistry implements ICraftingMonitorElementRegistry { + private Map> registry = new HashMap<>(); + + @Override + public void add(String id, Function factory) { + registry.put(id, factory); + } + + @Nullable + @Override + public Function getFactory(String id) { + return registry.get(id); + } +} diff --git a/src/main/java/refinedstorage/gui/craftingmonitor/CraftingMonitorElementRoot.java b/src/main/java/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementRoot.java similarity index 83% rename from src/main/java/refinedstorage/gui/craftingmonitor/CraftingMonitorElementRoot.java rename to src/main/java/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementRoot.java index a780456fa..577568b5f 100755 --- a/src/main/java/refinedstorage/gui/craftingmonitor/CraftingMonitorElementRoot.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementRoot.java @@ -1,15 +1,14 @@ -package refinedstorage.gui.craftingmonitor; +package refinedstorage.apiimpl.autocrafting.craftingmonitor; import io.netty.buffer.ByteBuf; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.network.ByteBufUtils; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.gui.GuiBase; public class CraftingMonitorElementRoot implements ICraftingMonitorElement { - static { - REGISTRY.put(0, buf -> new CraftingMonitorElementRoot(buf.readInt(), ByteBufUtils.readItemStack(buf), buf.readInt())); - } + public static final String ID = "root"; private int id; private ItemStack output; @@ -41,8 +40,8 @@ public class CraftingMonitorElementRoot implements ICraftingMonitorElement { } @Override - public int getType() { - return 0; + public String getId() { + return ID; } @Override diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementToTake.java b/src/main/java/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementToTake.java new file mode 100755 index 000000000..bd6d49000 --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementToTake.java @@ -0,0 +1,50 @@ +package refinedstorage.apiimpl.autocrafting.craftingmonitor; + +import io.netty.buffer.ByteBuf; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; +import refinedstorage.gui.GuiBase; + +public class CraftingMonitorElementToTake implements ICraftingMonitorElement { + public static final String ID = "to_take"; + + private ItemStack toTake; + private int remaining; + + public CraftingMonitorElementToTake(ItemStack toTake, int remaining) { + this.toTake = toTake; + this.remaining = remaining; + } + + @Override + public void draw(GuiBase gui, int x, int y) { + gui.drawItem(x + 2, y + 1, toTake); + + float scale = 0.5f; + + GlStateManager.pushMatrix(); + GlStateManager.scale(scale, scale, 1); + + gui.drawString(gui.calculateOffsetOnScale(x + 21, scale), gui.calculateOffsetOnScale(y + 7, scale), remaining + " " + toTake.getDisplayName()); + + GlStateManager.popMatrix(); + } + + @Override + public int getTaskId() { + return -1; + } + + @Override + public String getId() { + return ID; + } + + @Override + public void write(ByteBuf buf) { + ByteBufUtils.writeItemStack(buf, toTake); + buf.writeInt(remaining); + } +} diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java index e56c92a9f..0409ab098 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java @@ -7,12 +7,14 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.api.autocrafting.ICraftingPattern; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.api.autocrafting.task.ICraftingTask; import refinedstorage.api.autocrafting.task.IProcessable; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.NetworkUtils; import refinedstorage.api.storage.CompareUtils; import refinedstorage.api.storage.item.IGroupedItemStorage; +import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementRoot; import java.util.ArrayDeque; import java.util.ArrayList; @@ -141,6 +143,19 @@ public class CraftingTaskNormal implements ICraftingTask { return tag; } + @Override + public List getCraftingMonitorElements() { + List elements = new ArrayList<>(); + + elements.add(new CraftingMonitorElementRoot( + network.getCraftingTasks().indexOf(this), + pattern.getOutputs().get(0), + quantity + )); + + return elements; + } + @Override public ICraftingPattern getPattern() { return pattern; diff --git a/src/main/java/refinedstorage/gui/craftingmonitor/GuiCraftingMonitor.java b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java similarity index 97% rename from src/main/java/refinedstorage/gui/craftingmonitor/GuiCraftingMonitor.java rename to src/main/java/refinedstorage/gui/GuiCraftingMonitor.java index 0f8cfc72a..b5c1d88d2 100755 --- a/src/main/java/refinedstorage/gui/craftingmonitor/GuiCraftingMonitor.java +++ b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java @@ -1,11 +1,10 @@ -package refinedstorage.gui.craftingmonitor; +package refinedstorage.gui; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.renderer.RenderHelper; import refinedstorage.RefinedStorage; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.container.ContainerCraftingMonitor; -import refinedstorage.gui.GuiBase; -import refinedstorage.gui.Scrollbar; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.network.MessageCraftingMonitorCancel; import refinedstorage.tile.TileCraftingMonitor; diff --git a/src/main/java/refinedstorage/gui/GuiHandler.java b/src/main/java/refinedstorage/gui/GuiHandler.java index a0d329982..4bafad742 100755 --- a/src/main/java/refinedstorage/gui/GuiHandler.java +++ b/src/main/java/refinedstorage/gui/GuiHandler.java @@ -9,7 +9,6 @@ import net.minecraft.world.World; import net.minecraftforge.fml.common.network.IGuiHandler; import refinedstorage.RefinedStorageGui; import refinedstorage.container.*; -import refinedstorage.gui.craftingmonitor.GuiCraftingMonitor; import refinedstorage.gui.grid.GuiGrid; import refinedstorage.tile.*; import refinedstorage.tile.externalstorage.TileExternalStorage; diff --git a/src/main/java/refinedstorage/gui/craftingmonitor/ICraftingMonitorElement.java b/src/main/java/refinedstorage/gui/craftingmonitor/ICraftingMonitorElement.java deleted file mode 100755 index f3c89c201..000000000 --- a/src/main/java/refinedstorage/gui/craftingmonitor/ICraftingMonitorElement.java +++ /dev/null @@ -1,20 +0,0 @@ -package refinedstorage.gui.craftingmonitor; - -import io.netty.buffer.ByteBuf; -import refinedstorage.gui.GuiBase; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -public interface ICraftingMonitorElement { - Map> REGISTRY = new HashMap<>(); - - void draw(GuiBase gui, int x, int y); - - int getTaskId(); - - int getType(); - - void write(ByteBuf buf); -} diff --git a/src/main/java/refinedstorage/proxy/CommonProxy.java b/src/main/java/refinedstorage/proxy/CommonProxy.java index 08cb76b9b..b2901bdfd 100755 --- a/src/main/java/refinedstorage/proxy/CommonProxy.java +++ b/src/main/java/refinedstorage/proxy/CommonProxy.java @@ -9,6 +9,7 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; @@ -19,6 +20,8 @@ import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageItems; import refinedstorage.api.RefinedStorageAPI; import refinedstorage.api.solderer.SoldererRecipe; +import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementRoot; +import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementToTake; import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactoryNormal; import refinedstorage.apiimpl.solderer.*; import refinedstorage.apiimpl.storage.fluid.FluidStorageNBT; @@ -47,6 +50,9 @@ public class CommonProxy { RefinedStorageAPI.instance().getCraftingTaskRegistry().addFactory(CraftingTaskFactoryNormal.ID, new CraftingTaskFactoryNormal()); + RefinedStorageAPI.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementRoot.ID, buf -> new CraftingMonitorElementRoot(buf.readInt(), ByteBufUtils.readItemStack(buf), buf.readInt())); + RefinedStorageAPI.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementToTake.ID, buf -> new CraftingMonitorElementToTake(ByteBufUtils.readItemStack(buf), buf.readInt())); + int id = 0; RefinedStorage.INSTANCE.network.registerMessage(MessageTileDataParameter.class, MessageTileDataParameter.class, id++, Side.CLIENT); diff --git a/src/main/java/refinedstorage/tile/TileCraftingMonitor.java b/src/main/java/refinedstorage/tile/TileCraftingMonitor.java index e19ce1e75..dfb1bb0f9 100755 --- a/src/main/java/refinedstorage/tile/TileCraftingMonitor.java +++ b/src/main/java/refinedstorage/tile/TileCraftingMonitor.java @@ -1,8 +1,7 @@ package refinedstorage.tile; import refinedstorage.RefinedStorage; -import refinedstorage.gui.craftingmonitor.CraftingMonitorElementRoot; -import refinedstorage.gui.craftingmonitor.ICraftingMonitorElement; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.tile.data.ITileDataProducer; import refinedstorage.tile.data.RefinedStorageSerializers; import refinedstorage.tile.data.TileDataParameter; @@ -12,17 +11,11 @@ import java.util.List; import java.util.stream.Collectors; public class TileCraftingMonitor extends TileNode { - public static final TileDataParameter> ELEMENTS = new TileDataParameter<>(RefinedStorageSerializers.CLIENT_CRAFTING_TASK_SERIALIZER, Collections.emptyList(), new ITileDataProducer, TileCraftingMonitor>() { + public static final TileDataParameter> ELEMENTS = new TileDataParameter<>(RefinedStorageSerializers.CRAFTING_MONITOR_ELEMENT_SERIALIZER, Collections.emptyList(), new ITileDataProducer, TileCraftingMonitor>() { @Override public List getValue(TileCraftingMonitor tile) { if (tile.connected) { - List tasks = tile.network.getCraftingTasks().stream().map(t -> new CraftingMonitorElementRoot( - tile.network.getCraftingTasks().indexOf(t), - t.getPattern().getOutputs().get(0), - t.getQuantity() - )).collect(Collectors.toList()); - - return tasks; + return tile.network.getCraftingTasks().stream().flatMap(t -> t.getCraftingMonitorElements().stream()).collect(Collectors.toList()); } else { return Collections.emptyList(); } diff --git a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java index f67be244c..d6fe5b173 100755 --- a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java +++ b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java @@ -1,17 +1,20 @@ package refinedstorage.tile.data; +import io.netty.buffer.ByteBuf; import net.minecraft.network.PacketBuffer; import net.minecraft.network.datasync.DataParameter; import net.minecraft.network.datasync.DataSerializer; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.network.ByteBufUtils; -import refinedstorage.gui.craftingmonitor.ICraftingMonitorElement; +import refinedstorage.api.RefinedStorageAPI; +import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.tile.ClientNode; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.function.Function; public final class RefinedStorageSerializers { public static final DataSerializer> CLIENT_NODE_SERIALIZER = new DataSerializer>() { @@ -45,13 +48,13 @@ public final class RefinedStorageSerializers { } }; - public static final DataSerializer> CLIENT_CRAFTING_TASK_SERIALIZER = new DataSerializer>() { + public static final DataSerializer> CRAFTING_MONITOR_ELEMENT_SERIALIZER = new DataSerializer>() { @Override - public void write(PacketBuffer buf, List tasks) { - buf.writeInt(tasks.size()); + public void write(PacketBuffer buf, List elements) { + buf.writeInt(elements.size()); - for (ICraftingMonitorElement task : tasks) { - buf.writeInt(task.getType()); + for (ICraftingMonitorElement task : elements) { + ByteBufUtils.writeUTF8String(buf, task.getId()); task.write(buf); } @@ -59,19 +62,19 @@ public final class RefinedStorageSerializers { @Override public List read(PacketBuffer buf) { - List tasks = new ArrayList<>(); + List elements = new ArrayList<>(); int size = buf.readInt(); for (int i = 0; i < size; ++i) { - int type = buf.readInt(); + Function factory = RefinedStorageAPI.instance().getCraftingMonitorElementRegistry().getFactory(ByteBufUtils.readUTF8String(buf)); - if (ICraftingMonitorElement.REGISTRY.containsKey(type)) { - tasks.add(ICraftingMonitorElement.REGISTRY.get(type).apply(buf)); + if (factory != null) { + elements.add(factory.apply(buf)); } } - return tasks; + return elements; } @Override