Move ICraftingMonitorElement to the API, so any api consumer can choose how their tasks look like in the crafting monitor!

This commit is contained in:
Raoul Van den Berge
2016-10-06 14:56:54 +02:00
parent 6d39cca5ad
commit 9eb1ecbcf1
15 changed files with 166 additions and 51 deletions

View File

@@ -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();
}

View File

@@ -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);
}

View File

@@ -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<ByteBuf, ICraftingMonitorElement> factory);
@Nullable
Function<ByteBuf, ICraftingMonitorElement> getFactory(String id);
}

View File

@@ -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<ICraftingMonitorElement> getCraftingMonitorElements();
ICraftingPattern getPattern();
Deque<ItemStack> getToTake();

View File

@@ -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;
}
}

View File

@@ -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<String, Function<ByteBuf, ICraftingMonitorElement>> registry = new HashMap<>();
@Override
public void add(String id, Function<ByteBuf, ICraftingMonitorElement> factory) {
registry.put(id, factory);
}
@Nullable
@Override
public Function<ByteBuf, ICraftingMonitorElement> getFactory(String id) {
return registry.get(id);
}
}

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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<ICraftingMonitorElement> getCraftingMonitorElements() {
List<ICraftingMonitorElement> elements = new ArrayList<>();
elements.add(new CraftingMonitorElementRoot(
network.getCraftingTasks().indexOf(this),
pattern.getOutputs().get(0),
quantity
));
return elements;
}
@Override
public ICraftingPattern getPattern() {
return pattern;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<Integer, Function<ByteBuf, ICraftingMonitorElement>> REGISTRY = new HashMap<>();
void draw(GuiBase gui, int x, int y);
int getTaskId();
int getType();
void write(ByteBuf buf);
}

View File

@@ -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);

View File

@@ -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<List<ICraftingMonitorElement>> ELEMENTS = new TileDataParameter<>(RefinedStorageSerializers.CLIENT_CRAFTING_TASK_SERIALIZER, Collections.emptyList(), new ITileDataProducer<List<ICraftingMonitorElement>, TileCraftingMonitor>() {
public static final TileDataParameter<List<ICraftingMonitorElement>> ELEMENTS = new TileDataParameter<>(RefinedStorageSerializers.CRAFTING_MONITOR_ELEMENT_SERIALIZER, Collections.emptyList(), new ITileDataProducer<List<ICraftingMonitorElement>, TileCraftingMonitor>() {
@Override
public List<ICraftingMonitorElement> getValue(TileCraftingMonitor tile) {
if (tile.connected) {
List<ICraftingMonitorElement> 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();
}

View File

@@ -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<List<ClientNode>> CLIENT_NODE_SERIALIZER = new DataSerializer<List<ClientNode>>() {
@@ -45,13 +48,13 @@ public final class RefinedStorageSerializers {
}
};
public static final DataSerializer<List<ICraftingMonitorElement>> CLIENT_CRAFTING_TASK_SERIALIZER = new DataSerializer<List<ICraftingMonitorElement>>() {
public static final DataSerializer<List<ICraftingMonitorElement>> CRAFTING_MONITOR_ELEMENT_SERIALIZER = new DataSerializer<List<ICraftingMonitorElement>>() {
@Override
public void write(PacketBuffer buf, List<ICraftingMonitorElement> tasks) {
buf.writeInt(tasks.size());
public void write(PacketBuffer buf, List<ICraftingMonitorElement> 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<ICraftingMonitorElement> read(PacketBuffer buf) {
List<ICraftingMonitorElement> tasks = new ArrayList<>();
List<ICraftingMonitorElement> elements = new ArrayList<>();
int size = buf.readInt();
for (int i = 0; i < size; ++i) {
int type = buf.readInt();
Function<ByteBuf, ICraftingMonitorElement> 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