Render improvements for CraftingMonitorElements and CraftingPreviewElements (#477)

* add fluids to the preview and tons of fixes regarding the rendering of CraftingMonitorElements and CraftingPreviewElements

* name changes to please @raoulvdberge
This commit is contained in:
way2muchnoise
2016-10-16 22:09:37 +02:00
committed by Raoul
parent da14791814
commit a6fcf79917
40 changed files with 541 additions and 209 deletions

View File

@@ -3,6 +3,7 @@ package refinedstorage.api;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry;
import refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; import refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry;
import refinedstorage.api.solderer.ISoldererRegistry; import refinedstorage.api.solderer.ISoldererRegistry;
import refinedstorage.api.util.IComparer; import refinedstorage.api.util.IComparer;
@@ -40,6 +41,12 @@ public interface IRSAPI {
@Nonnull @Nonnull
ICraftingMonitorElementRegistry getCraftingMonitorElementRegistry(); ICraftingMonitorElementRegistry getCraftingMonitorElementRegistry();
/**
* @return the crafting preview element registry
*/
@Nonnull
ICraftingPreviewElementRegistry getCraftingPreviewElementRegistry();
/** /**
* @return an empty item stack list * @return an empty item stack list
*/ */

View File

@@ -38,6 +38,12 @@ public interface ICraftingPattern {
*/ */
List<ItemStack> getInputs(); List<ItemStack> getInputs();
/**
* @param took the items took
* @return the outputs based on the items took
*/
List<ItemStack> getOutputs(ItemStack[] took);
/** /**
* @return the outputs * @return the outputs
*/ */

View File

@@ -1,17 +1,25 @@
package refinedstorage.api.autocrafting.craftingmonitor; package refinedstorage.api.autocrafting.craftingmonitor;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import refinedstorage.api.render.IElementDrawer;
/** /**
* Represents a crafting monitor element. * Represents a crafting monitor element.
*/ */
public interface ICraftingMonitorElement<T> { public interface ICraftingMonitorElement<T> {
/** /**
* @param gui the gui
* @param x position on the x axis to render * @param x position on the x axis to render
* @param y position on the y axis to render * @param y position on the y axis to render
* @param itemDrawer a drawer for {@link ItemStack}s
* @param fluidDrawer a drawer for {@link FluidStack}s
* @param stringDrawer a drawer for {@link String}s
*/ */
void draw(T gui, int x, int y); @SideOnly(Side.CLIENT)
void draw(int x, int y, IElementDrawer<ItemStack> itemDrawer, IElementDrawer<FluidStack> fluidDrawer, IElementDrawer<String> stringDrawer);
/** /**
* Returns the position where the corresponding task is in the crafting task list. * Returns the position where the corresponding task is in the crafting task list.

View File

@@ -12,7 +12,7 @@ public interface ICraftingMonitorElementRegistry {
/** /**
* Adds a factory to the registry. * Adds a factory to the registry.
* *
* @param id the id, as specified in {@link ICraftingMonitorElement#getTaskId()} * @param id the id, as specified in {@link ICraftingMonitorElement#getId()}
* @param factory the factory * @param factory the factory
*/ */
void add(String id, Function<ByteBuf, ICraftingMonitorElement> factory); void add(String id, Function<ByteBuf, ICraftingMonitorElement> factory);

View File

@@ -0,0 +1,54 @@
package refinedstorage.api.autocrafting.preview;
import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import refinedstorage.api.render.IElementDrawer;
public interface ICraftingPreviewElement<T> {
/**
* @return the underlying element to display
*/
T getElement();
/**
* @param x position on the x axis to render
* @param y position on the y axis to render
* @param itemDrawer a drawer for {@link ItemStack}s
* @param fluidDrawer a drawer for {@link FluidStack}s
* @param stringDrawer a drawer for {@link String}s
*/
@SideOnly(Side.CLIENT)
void draw(int x, int y, IElementDrawer<ItemStack> itemDrawer, IElementDrawer<FluidStack> fluidDrawer, IElementDrawer<String> stringDrawer);
/**
* @return available amount of the {@link #getElement()}
*/
int getAvailable();
/**
* @return toCraft or missing (depends on {@link #hasMissing()} amount of the {@link #getElement()}
*/
int getToCraft();
/**
* When this is true {@link #getToCraft()} will be the missing items
*
* @return true when items are missing
*/
boolean hasMissing();
/**
* @param buf byte buf to write to
*/
void writeToByteBuf(ByteBuf buf);
/**
* Returns the id of this element, used for serialization and deserialization over the network.
*
* @return the id
*/
String getId();
}

View File

@@ -0,0 +1,28 @@
package refinedstorage.api.autocrafting.preview;
import io.netty.buffer.ByteBuf;
import javax.annotation.Nullable;
import java.util.function.Function;
/**
* This registry holds factories for crafting preview elements (for deserialization from the network).
*/
public interface ICraftingPreviewElementRegistry {
/**
* Adds a factory to the registry.
*
* @param id the id, as specified in {@link ICraftingPreviewElement#getId()}
* @param factory the factory
*/
void add(String id, Function<ByteBuf, ICraftingPreviewElement> factory);
/**
* Returns a factory from the registry.
*
* @param id the id, as specified in {@link ICraftingPreviewElement#getId()}
* @return the factory, or null if no factory was found
*/
@Nullable
Function<ByteBuf, ICraftingPreviewElement> getFactory(String id);
}

View File

@@ -1,33 +0,0 @@
package refinedstorage.api.autocrafting.preview;
import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack;
public interface ICraftingPreviewStack {
/**
* @return the stack to display
*/
ItemStack getStack();
/**
* @return available amount of the {@link #getStack()}
*/
int getAvailable();
/**
* @return toCraft or missing (depends on {@link #hasMissing()} amount of the {@link #getStack()}
*/
int getToCraft();
/**
* When this is true {@link #getToCraft()} will be the missing items
*
* @return true when items are missing
*/
boolean hasMissing();
/**
* @param buf byte buf to write to
*/
void writeToByteBuf(ByteBuf buf);
}

View File

@@ -3,7 +3,7 @@ package refinedstorage.api.autocrafting.task;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewStack; import refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import java.util.List; import java.util.List;
@@ -78,7 +78,7 @@ public interface ICraftingTask {
/** /**
* {@link ICraftingTask#calculate()} must be run before this * {@link ICraftingTask#calculate()} must be run before this
* *
* @return get a list of {@link ICraftingPreviewStack}s * @return get a list of {@link ICraftingPreviewElement}s
*/ */
List<ICraftingPreviewStack> getPreviewStacks(); List<ICraftingPreviewElement> getPreviewStacks();
} }

View File

@@ -0,0 +1,16 @@
package refinedstorage.api.render;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
/**
* This {@link FunctionalInterface} is used to define a draw/render function
* This function use x and y coords and the element to be draw
* Used in {@link ICraftingPreviewElement#draw(int, int, IElementDrawer, IElementDrawer, IElementDrawer)} and
* {@link refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement#draw(int, int, IElementDrawer, IElementDrawer, IElementDrawer)}
*
* @param <T> The element to draw, usually {@link String}, {@link net.minecraft.item.ItemStack} or {@link net.minecraftforge.fluids.FluidStack}
*/
@FunctionalInterface
public interface IElementDrawer<T> {
void draw(int x, int y, T element);
}

View File

@@ -6,12 +6,14 @@ import net.minecraftforge.fml.common.discovery.ASMDataTable;
import refinedstorage.api.IRSAPI; import refinedstorage.api.IRSAPI;
import refinedstorage.api.RSAPIInject; import refinedstorage.api.RSAPIInject;
import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry;
import refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; import refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry;
import refinedstorage.api.solderer.ISoldererRegistry; import refinedstorage.api.solderer.ISoldererRegistry;
import refinedstorage.api.util.IComparer; import refinedstorage.api.util.IComparer;
import refinedstorage.api.util.IFluidStackList; import refinedstorage.api.util.IFluidStackList;
import refinedstorage.api.util.IItemStackList; import refinedstorage.api.util.IItemStackList;
import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementRegistry; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementRegistry;
import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementRegistry;
import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskRegistry; import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskRegistry;
import refinedstorage.apiimpl.solderer.SoldererRegistry; import refinedstorage.apiimpl.solderer.SoldererRegistry;
import refinedstorage.apiimpl.util.Comparer; import refinedstorage.apiimpl.util.Comparer;
@@ -29,6 +31,7 @@ public class API implements IRSAPI {
private ISoldererRegistry soldererRegistry = new SoldererRegistry(); private ISoldererRegistry soldererRegistry = new SoldererRegistry();
private ICraftingTaskRegistry craftingTaskRegistry = new CraftingTaskRegistry(); private ICraftingTaskRegistry craftingTaskRegistry = new CraftingTaskRegistry();
private ICraftingMonitorElementRegistry craftingMonitorElementRegistry = new CraftingMonitorElementRegistry(); private ICraftingMonitorElementRegistry craftingMonitorElementRegistry = new CraftingMonitorElementRegistry();
private ICraftingPreviewElementRegistry craftingPreviewElementRegistry = new CraftingPreviewElementRegistry();
@Nonnull @Nonnull
@Override @Override
@@ -54,6 +57,12 @@ public class API implements IRSAPI {
return craftingMonitorElementRegistry; return craftingMonitorElementRegistry;
} }
@Nonnull
@Override
public ICraftingPreviewElementRegistry getCraftingPreviewElementRegistry() {
return craftingPreviewElementRegistry;
}
@Nonnull @Nonnull
@Override @Override
public IItemStackList createItemStackList() { public IItemStackList createItemStackList() {

View File

@@ -90,6 +90,26 @@ public class CraftingPattern implements ICraftingPattern {
return inputs; return inputs;
} }
@Override
public List<ItemStack> getOutputs(ItemStack[] took) {
List<ItemStack> outputs = new ArrayList<>();
InventoryCrafting inv = new InventoryCrafting(new Container() {
@Override
public boolean canInteractWith(EntityPlayer player) {
return false;
}
}, 3, 3);
for (int i = 0; i < 9; ++i) {
inv.setInventorySlotContents(i, took[i]);
}
outputs.add(CraftingManager.getInstance().findMatchingRecipe(inv, world));
return outputs;
}
@Override @Override
public List<ItemStack> getOutputs() { public List<ItemStack> getOutputs() {
return outputs; return outputs;

View File

@@ -2,12 +2,16 @@ package refinedstorage.apiimpl.autocrafting.craftingmonitor;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import refinedstorage.RSUtils; import refinedstorage.RSUtils;
import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import refinedstorage.api.render.IElementDrawer;
import refinedstorage.gui.GuiBase; import refinedstorage.gui.GuiBase;
public class CraftingMonitorElementFluidRender implements ICraftingMonitorElement<GuiBase> { public class CraftingMonitorElementFluidRender implements ICraftingMonitorElement<FluidStack> {
public static final String ID = "fluid_render"; public static final String ID = "fluid_render";
private int taskId; private int taskId;
@@ -21,15 +25,16 @@ public class CraftingMonitorElementFluidRender implements ICraftingMonitorElemen
} }
@Override @Override
public void draw(GuiBase gui, int x, int y) { @SideOnly(Side.CLIENT)
GuiBase.FLUID_RENDERER.draw(gui.mc, x + 2 + offset, y + 1, stack); public void draw(int x, int y, IElementDrawer<ItemStack> itemDrawer, IElementDrawer<FluidStack> fluidDrawer, IElementDrawer<String> stringDrawer) {
fluidDrawer.draw(x + 2 + offset, y + 1, stack);
float scale = 0.5f; float scale = 0.5f;
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
GlStateManager.scale(scale, scale, 1); GlStateManager.scale(scale, scale, 1);
gui.drawString(gui.calculateOffsetOnScale(x + 21 + offset, scale), gui.calculateOffsetOnScale(y + 7, scale), RSUtils.formatFluidStackQuantity(stack) + " " + stack.getLocalizedName()); stringDrawer.draw(GuiBase.calculateOffsetOnScale(x + 21 + offset, scale), GuiBase.calculateOffsetOnScale(y + 7, scale), RSUtils.formatFluidStackQuantity(stack) + " " + stack.getLocalizedName());
GlStateManager.popMatrix(); GlStateManager.popMatrix();
} }

View File

@@ -3,11 +3,15 @@ package refinedstorage.apiimpl.autocrafting.craftingmonitor;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import refinedstorage.api.render.IElementDrawer;
import refinedstorage.gui.GuiBase; import refinedstorage.gui.GuiBase;
public class CraftingMonitorElementItemRender implements ICraftingMonitorElement<GuiBase> { public class CraftingMonitorElementItemRender implements ICraftingMonitorElement<ItemStack> {
public static final String ID = "item_render"; public static final String ID = "item_render";
private int taskId; private int taskId;
@@ -23,15 +27,16 @@ public class CraftingMonitorElementItemRender implements ICraftingMonitorElement
} }
@Override @Override
public void draw(GuiBase gui, int x, int y) { @SideOnly(Side.CLIENT)
gui.drawItem(x + 2 + offset, y + 1, stack); public void draw(int x, int y, IElementDrawer<ItemStack> itemDrawer, IElementDrawer<FluidStack> fluidDrawer, IElementDrawer<String> stringDrawer) {
itemDrawer.draw(x + 2 + offset, y + 1, stack);
float scale = 0.5f; float scale = 0.5f;
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
GlStateManager.scale(scale, scale, 1); GlStateManager.scale(scale, scale, 1);
gui.drawString(gui.calculateOffsetOnScale(x + 21 + offset, scale), gui.calculateOffsetOnScale(y + 7, scale), quantity + " " + stack.getDisplayName()); stringDrawer.draw(GuiBase.calculateOffsetOnScale(x + 21 + offset, scale), GuiBase.calculateOffsetOnScale(y + 7, scale), quantity + " " + stack.getDisplayName());
GlStateManager.popMatrix(); GlStateManager.popMatrix();
} }

View File

@@ -3,11 +3,16 @@ package refinedstorage.apiimpl.autocrafting.craftingmonitor;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import refinedstorage.api.render.IElementDrawer;
import refinedstorage.gui.GuiBase; import refinedstorage.gui.GuiBase;
public class CraftingMonitorElementText implements ICraftingMonitorElement<GuiBase> { public class CraftingMonitorElementText implements ICraftingMonitorElement<String> {
public static final String ID = "text"; public static final String ID = "text";
private String text; private String text;
@@ -27,13 +32,14 @@ public class CraftingMonitorElementText implements ICraftingMonitorElement<GuiBa
} }
@Override @Override
public void draw(GuiBase gui, int x, int y) { @SideOnly(Side.CLIENT)
public void draw(int x, int y, IElementDrawer<ItemStack> itemDrawer, IElementDrawer<FluidStack> fluidDrawer, IElementDrawer<String> stringDrawer) {
float scale = 0.5f; float scale = 0.5f;
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
GlStateManager.scale(scale, scale, 1); GlStateManager.scale(scale, scale, 1);
gui.drawString(gui.calculateOffsetOnScale(x + offset, scale), gui.calculateOffsetOnScale(y + 7, scale), I18n.format(text)); stringDrawer.draw(GuiBase.calculateOffsetOnScale(x + offset, scale), GuiBase.calculateOffsetOnScale(y + 7, scale), I18n.format(text));
GlStateManager.popMatrix(); GlStateManager.popMatrix();
} }

View File

@@ -0,0 +1,109 @@
package refinedstorage.apiimpl.autocrafting.preview;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import refinedstorage.api.render.IElementDrawer;
import refinedstorage.gui.GuiBase;
public class CraftingPreviewElementFluidStack implements ICraftingPreviewElement<FluidStack> {
public static final String ID = "fluid_renderer";
private FluidStack stack;
private int available;
private boolean missing;
private int toCraft;
// if missing is true then toCraft is the missing amount
public CraftingPreviewElementFluidStack(FluidStack stack) {
this.stack = stack.copy();
this.available = stack.amount;
}
public CraftingPreviewElementFluidStack(FluidStack stack, int available, boolean missing, int toCraft) {
this.stack = stack.copy();
this.available = available;
this.missing = missing;
this.toCraft = toCraft;
}
@Override
public void writeToByteBuf(ByteBuf buf) {
ByteBufUtils.writeUTF8String(buf, FluidRegistry.getFluidName(stack));
ByteBufUtils.writeTag(buf, stack.tag);
buf.writeInt(available);
buf.writeBoolean(missing);
buf.writeInt(toCraft);
}
public static CraftingPreviewElementFluidStack fromByteBuf(ByteBuf buf) {
Fluid fluid = FluidRegistry.getFluid(ByteBufUtils.readUTF8String(buf));
NBTTagCompound tag = ByteBufUtils.readTag(buf);
int available = buf.readInt();
boolean missing = buf.readBoolean();
int toCraft = buf.readInt();
return new CraftingPreviewElementFluidStack(new FluidStack(fluid, 1, tag), available, missing, toCraft);
}
@Override
public FluidStack getElement() {
return stack;
}
@Override
@SideOnly(Side.CLIENT)
public void draw(int x, int y, IElementDrawer<ItemStack> itemDrawer, IElementDrawer<FluidStack> fluidDrawer, IElementDrawer<String> stringDrawer) {
fluidDrawer.draw(x, y, getElement());
float scale = 0.5f;
GlStateManager.pushMatrix();
GlStateManager.scale(scale, scale, 1);
stringDrawer.draw(GuiBase.calculateOffsetOnScale(x + 23, scale), GuiBase.calculateOffsetOnScale(y + 3, scale), GuiBase.t("gui.refinedstorage:crafting_preview.available", ""));
stringDrawer.draw(GuiBase.calculateOffsetOnScale(x + 23, scale), GuiBase.calculateOffsetOnScale(y + 9, scale), getAvailable() + " mB");
GlStateManager.popMatrix();
}
public void addAvailable(int amount) {
this.available += amount;
}
@Override
public int getAvailable() {
return available;
}
public void addToCraft(int amount) {
this.toCraft += amount;
}
@Override
public int getToCraft() {
return this.toCraft;
}
public void setMissing(boolean missing) {
this.missing = missing;
}
@Override
public boolean hasMissing() {
return missing;
}
@Override
public String getId() {
return ID;
}
}

View File

@@ -0,0 +1,121 @@
package refinedstorage.apiimpl.autocrafting.preview;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import refinedstorage.api.render.IElementDrawer;
import refinedstorage.gui.GuiBase;
public class CraftingPreviewElementItemStack implements ICraftingPreviewElement<ItemStack> {
public static final String ID = "item_renderer";
private ItemStack stack;
private int available;
private boolean missing;
private int toCraft;
// if missing is true then toCraft is the missing amount
public CraftingPreviewElementItemStack(ItemStack stack) {
this.stack = ItemHandlerHelper.copyStackWithSize(stack, 1);
}
public CraftingPreviewElementItemStack(ItemStack stack, int available, boolean missing, int toCraft) {
this.stack = stack;
this.available = available;
this.missing = missing;
this.toCraft = toCraft;
}
@Override
public void writeToByteBuf(ByteBuf buf) {
buf.writeInt(Item.getIdFromItem(stack.getItem()));
buf.writeInt(stack.getMetadata());
ByteBufUtils.writeTag(buf, stack.getTagCompound());
buf.writeInt(available);
buf.writeBoolean(missing);
buf.writeInt(toCraft);
}
public static CraftingPreviewElementItemStack fromByteBuf(ByteBuf buf) {
Item item = Item.getItemById(buf.readInt());
int meta = buf.readInt();
NBTTagCompound tag = ByteBufUtils.readTag(buf);
int available = buf.readInt();
boolean missing = buf.readBoolean();
int toCraft = buf.readInt();
ItemStack stack = new ItemStack(item, 1, meta);
stack.setTagCompound(tag);
return new CraftingPreviewElementItemStack(stack, available, missing, toCraft);
}
@Override
public ItemStack getElement() {
return stack;
}
@Override
@SideOnly(Side.CLIENT)
public void draw(int x, int y, IElementDrawer<ItemStack> itemDrawer, IElementDrawer<FluidStack> fluidDrawer, IElementDrawer<String> stringDrawer) {
itemDrawer.draw(x, y, getElement());
float scale = 0.5f;
y += 2;
GlStateManager.pushMatrix();
GlStateManager.scale(scale, scale, 1);
if (getToCraft() > 0) {
String format = hasMissing() ? "gui.refinedstorage:crafting_preview.missing" : "gui.refinedstorage:crafting_preview.to_craft";
stringDrawer.draw(GuiBase.calculateOffsetOnScale(x + 23, scale), GuiBase.calculateOffsetOnScale(y, scale), GuiBase.t(format, getToCraft()));
y += 7;
}
if (getAvailable() > 0) {
stringDrawer.draw(GuiBase.calculateOffsetOnScale(x + 23, scale), GuiBase.calculateOffsetOnScale(y, scale), GuiBase.t("gui.refinedstorage:crafting_preview.available", getAvailable()));
}
GlStateManager.popMatrix();
}
public void addAvailable(int amount) {
this.available += amount;
}
@Override
public int getAvailable() {
return available;
}
public void addToCraft(int amount) {
this.toCraft += amount;
}
@Override
public int getToCraft() {
return this.toCraft;
}
public void setMissing(boolean missing) {
this.missing = missing;
}
@Override
public boolean hasMissing() {
return missing;
}
@Override
public String getId() {
return ID;
}
}

View File

@@ -0,0 +1,25 @@
package refinedstorage.apiimpl.autocrafting.preview;
import io.netty.buffer.ByteBuf;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
public class CraftingPreviewElementRegistry implements ICraftingPreviewElementRegistry {
private Map<String, Function<ByteBuf, ICraftingPreviewElement>> registry = new HashMap<>();
@Override
public void add(String id, Function<ByteBuf, ICraftingPreviewElement> factory) {
registry.put(id, factory);
}
@Nullable
@Override
public Function<ByteBuf, ICraftingPreviewElement> getFactory(String id) {
return registry.get(id);
}
}

View File

@@ -1,77 +0,0 @@
package refinedstorage.apiimpl.autocrafting.preview;
import io.netty.buffer.ByteBuf;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewStack;
public class CraftingPreviewStack implements ICraftingPreviewStack {
private ItemStack stack;
private int available;
private boolean missing;
private int toCraft;
// if missing is true then toCraft is the missing amount
public CraftingPreviewStack(ItemStack stack) {
this.stack = ItemHandlerHelper.copyStackWithSize(stack, 1);
}
public CraftingPreviewStack(ItemStack stack, int available, boolean missing, int toCraft) {
this.stack = stack;
this.available = available;
this.missing = missing;
this.toCraft = toCraft;
}
@Override
public void writeToByteBuf(ByteBuf buf) {
buf.writeInt(Item.getIdFromItem(stack.getItem()));
buf.writeInt(stack.getMetadata());
buf.writeInt(available);
buf.writeBoolean(missing);
buf.writeInt(toCraft);
}
public static CraftingPreviewStack fromByteBuf(ByteBuf buf) {
Item item = Item.getItemById(buf.readInt());
int meta = buf.readInt();
int available = buf.readInt();
boolean missing = buf.readBoolean();
int toCraft = buf.readInt();
return new CraftingPreviewStack(new ItemStack(item, 1, meta), available, missing, toCraft);
}
@Override
public ItemStack getStack() {
return stack;
}
public void addAvailable(int amount) {
this.available += amount;
}
@Override
public int getAvailable() {
return available;
}
public void addToCraft(int amount) {
this.toCraft += amount;
}
@Override
public int getToCraft() {
return this.toCraft;
}
public void setMissing(boolean missing) {
this.missing = missing;
}
@Override
public boolean hasMissing() {
return missing;
}
}

View File

@@ -8,7 +8,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RSUtils; import refinedstorage.RSUtils;
import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewStack; import refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import refinedstorage.api.autocrafting.task.ICraftingTask; import refinedstorage.api.autocrafting.task.ICraftingTask;
import refinedstorage.api.autocrafting.task.IProcessable; import refinedstorage.api.autocrafting.task.IProcessable;
import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkMaster;
@@ -19,7 +19,8 @@ import refinedstorage.apiimpl.API;
import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementFluidRender; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementFluidRender;
import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementItemRender; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementItemRender;
import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementText; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementText;
import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewStack; import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementFluidStack;
import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -48,7 +49,7 @@ public class CraftingTask implements ICraftingTask {
this.quantity = quantity; this.quantity = quantity;
if (pattern.isOredict()) { if (pattern.isOredict()) {
this.compare = IComparer.COMPARE_OREDICT; this.compare |= IComparer.COMPARE_OREDICT;
} }
} }
@@ -67,6 +68,7 @@ public class CraftingTask implements ICraftingTask {
if (!recurseFound) { if (!recurseFound) {
this.toInsert.addAll(toInsert.getStacks()); this.toInsert.addAll(toInsert.getStacks());
} }
usedPatterns.clear(); usedPatterns.clear();
} }
@@ -120,7 +122,10 @@ public class CraftingTask implements ICraftingTask {
// Calculate added all the crafted outputs toInsert // Calculate added all the crafted outputs toInsert
// So we remove the ones we use from toInsert // So we remove the ones we use from toInsert
toInsert.remove(inputCrafted, true); toInsert.remove(inputCrafted, true);
} else if (!doFluidCalculation(networkList, input, toInsert)) { } else if (doFluidCalculation(networkList, input, toInsert)) {
actualInputs.add(ItemHandlerHelper.copyStackWithSize(input, 1));
input.stackSize -= 1;
} else {
missing.add(input.copy()); missing.add(input.copy());
input.stackSize = 0; input.stackSize = 0;
} }
@@ -138,15 +143,16 @@ public class CraftingTask implements ICraftingTask {
actualInputs.remove(taken, true); actualInputs.remove(taken, true);
} }
} }
for (ItemStack byproduct : (pattern.isOredict() ? pattern.getByproducts(took) : pattern.getByproducts())) {
toInsert.add(byproduct.copy());
}
for (ItemStack output : pattern.getOutputs()) {
toInsert.add(output.copy());
}
} }
for (ItemStack byproduct : (pattern.isOredict() && missing.isEmpty() ? pattern.getByproducts(took) : pattern.getByproducts())) {
toInsert.add(byproduct.copy());
}
for (ItemStack output : (pattern.isOredict() && missing.isEmpty() ? pattern.getOutputs(took) : pattern.getOutputs())) {
toInsert.add(output.copy());
}
usedPatterns.remove(pattern); usedPatterns.remove(pattern);
} }
@@ -358,45 +364,49 @@ public class CraftingTask implements ICraftingTask {
} }
@Override @Override
public List<ICraftingPreviewStack> getPreviewStacks() { public List<ICraftingPreviewElement> getPreviewStacks() {
if (!isValid()) { if (!isValid()) {
return Collections.emptyList(); return Collections.emptyList();
} }
Map<Integer, CraftingPreviewStack> map = new LinkedHashMap<>(); Map<Integer, CraftingPreviewElementItemStack> map = new LinkedHashMap<>();
for (ItemStack stack : toCraft.getStacks()) { for (ItemStack stack : toCraft.getStacks()) {
int hash = API.instance().getItemStackHashCode(stack); int hash = API.instance().getItemStackHashCode(stack);
CraftingPreviewStack previewStack = map.get(hash); CraftingPreviewElementItemStack previewStack = map.get(hash);
if (previewStack == null) { if (previewStack == null) {
previewStack = new CraftingPreviewStack(stack); previewStack = new CraftingPreviewElementItemStack(stack);
} }
previewStack.addToCraft(stack.stackSize); previewStack.addToCraft(stack.stackSize);
map.put(hash, previewStack); map.put(hash, previewStack);
} }
for (ItemStack stack : toTake.getStacks()) {
int hash = API.instance().getItemStackHashCode(stack);
CraftingPreviewStack previewStack = map.get(hash);
if (previewStack == null) {
previewStack = new CraftingPreviewStack(stack);
}
previewStack.addAvailable(stack.stackSize);
map.put(hash, previewStack);
}
for (ItemStack stack : missing.getStacks()) { for (ItemStack stack : missing.getStacks()) {
int hash = API.instance().getItemStackHashCode(stack); int hash = API.instance().getItemStackHashCode(stack);
CraftingPreviewStack previewStack = map.get(hash); CraftingPreviewElementItemStack previewStack = map.get(hash);
if (previewStack == null) { if (previewStack == null) {
previewStack = new CraftingPreviewStack(stack); previewStack = new CraftingPreviewElementItemStack(stack);
} }
previewStack.setMissing(true); previewStack.setMissing(true);
previewStack.addToCraft(stack.stackSize); previewStack.addToCraft(stack.stackSize);
map.put(hash, previewStack); map.put(hash, previewStack);
} }
return new ArrayList<>(map.values()); for (ItemStack stack : toTake.getStacks()) {
int hash = API.instance().getItemStackHashCode(stack);
CraftingPreviewElementItemStack previewStack = map.get(hash);
if (previewStack == null) {
previewStack = new CraftingPreviewElementItemStack(stack);
}
previewStack.addAvailable(stack.stackSize);
map.put(hash, previewStack);
}
List<ICraftingPreviewElement> elements = new ArrayList<>(map.values());
toTakeFluids.getStacks().stream().map(CraftingPreviewElementFluidStack::new).forEach(elements::add);
return elements;
} }
private boolean isFinished() { private boolean isFinished() {

View File

@@ -18,7 +18,9 @@ public class Comparer implements IComparer {
} }
if ((flags & COMPARE_OREDICT) == COMPARE_OREDICT) { if ((flags & COMPARE_OREDICT) == COMPARE_OREDICT) {
return isEqualOredict(left, right); if (isEqualOredict(left, right)) {
return true;
}
} }
if (left.getItem() != right.getItem()) { if (left.getItem() != right.getItem()) {

View File

@@ -265,7 +265,7 @@ public abstract class GuiBase extends GuiContainer {
drawTexturedModalRect(x, y, textureX, textureY, width, height); drawTexturedModalRect(x, y, textureX, textureY, width, height);
} }
public String t(String name, Object... format) { public static String t(String name, Object... format) {
return I18n.format(name, format); return I18n.format(name, format);
} }
@@ -285,7 +285,7 @@ public abstract class GuiBase extends GuiContainer {
return guiTop; return guiTop;
} }
public int calculateOffsetOnScale(int pos, float scale) { public static int calculateOffsetOnScale(int pos, float scale) {
float multiplier = (pos / scale); float multiplier = (pos / scale);
return (int) multiplier; return (int) multiplier;

View File

@@ -2,8 +2,11 @@ package refinedstorage.gui;
import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import refinedstorage.RS; import refinedstorage.RS;
import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import refinedstorage.api.render.IElementDrawer;
import refinedstorage.container.ContainerCraftingMonitor; import refinedstorage.container.ContainerCraftingMonitor;
import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
import refinedstorage.network.MessageCraftingMonitorCancel; import refinedstorage.network.MessageCraftingMonitorCancel;
@@ -28,6 +31,10 @@ public class GuiCraftingMonitor extends GuiBase {
private int itemSelectedX = -1; private int itemSelectedX = -1;
private int itemSelectedY = -1; private int itemSelectedY = -1;
private IElementDrawer<String> stringDrawer = this::drawString;
private IElementDrawer<ItemStack> itemDrawer = this::drawItem;
private IElementDrawer<FluidStack> fluidDrawer = (x, y, element) -> FLUID_RENDERER.draw(mc, x, y, element);
public GuiCraftingMonitor(ContainerCraftingMonitor container, TileCraftingMonitor craftingMonitor) { public GuiCraftingMonitor(ContainerCraftingMonitor container, TileCraftingMonitor craftingMonitor) {
super(container, 176, 230); super(container, 176, 230);
@@ -99,7 +106,7 @@ public class GuiCraftingMonitor extends GuiBase {
itemSelectedY = y; itemSelectedY = y;
} }
element.draw(this, x, y); element.draw(x, y, itemDrawer, fluidDrawer, stringDrawer);
x = ox; x = ox;
y += ITEM_HEIGHT; y += ITEM_HEIGHT;

View File

@@ -8,10 +8,14 @@ import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container; import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.client.FMLClientHandler;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
import refinedstorage.RS; import refinedstorage.RS;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewStack; import refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import refinedstorage.api.render.IElementDrawer;
import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementFluidStack;
import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack;
import refinedstorage.network.MessageGridCraftingStart; import refinedstorage.network.MessageGridCraftingStart;
import java.io.IOException; import java.io.IOException;
@@ -21,7 +25,7 @@ import java.util.List;
public class GuiCraftingPreview extends GuiBase { public class GuiCraftingPreview extends GuiBase {
private static final int VISIBLE_ROWS = 4; private static final int VISIBLE_ROWS = 4;
private List<ICraftingPreviewStack> stacks; private List<ICraftingPreviewElement> stacks;
private GuiScreen parent; private GuiScreen parent;
private int hash; private int hash;
@@ -30,7 +34,11 @@ public class GuiCraftingPreview extends GuiBase {
private GuiButton startButton; private GuiButton startButton;
private GuiButton cancelButton; private GuiButton cancelButton;
public GuiCraftingPreview(GuiScreen parent, List<ICraftingPreviewStack> stacks, int hash, int quantity) { private IElementDrawer<String> stringDrawer = this::drawString;
private IElementDrawer<ItemStack> itemDrawer = this::drawItem;
private IElementDrawer<FluidStack> fluidDrawer = (x, y, element) -> FLUID_RENDERER.draw(mc, x, y, element);
public GuiCraftingPreview(GuiScreen parent, List<ICraftingPreviewElement> stacks, int hash, int quantity) {
super(new Container() { super(new Container() {
@Override @Override
public boolean canInteractWith(EntityPlayer player) { public boolean canInteractWith(EntityPlayer player) {
@@ -51,7 +59,7 @@ public class GuiCraftingPreview extends GuiBase {
public void init(int x, int y) { public void init(int x, int y) {
cancelButton = addButton(x + 16, y + 144, 50, 20, t("gui.cancel")); cancelButton = addButton(x + 16, y + 144, 50, 20, t("gui.cancel"));
startButton = addButton(x + 85, y + 144, 50, 20, t("misc.refinedstorage:start")); startButton = addButton(x + 85, y + 144, 50, 20, t("misc.refinedstorage:start"));
startButton.enabled = !stacks.isEmpty(); startButton.enabled = stacks.stream().filter(ICraftingPreviewElement::hasMissing).count() == 0;
} }
@Override @Override
@@ -77,7 +85,7 @@ public class GuiCraftingPreview extends GuiBase {
for (int i = 0; i < 8; ++i) { for (int i = 0; i < 8; ++i) {
if (slot < stacks.size()) { if (slot < stacks.size()) {
ICraftingPreviewStack stack = stacks.get(slot); ICraftingPreviewElement stack = stacks.get(slot);
if (stack.hasMissing()) { if (stack.hasMissing()) {
drawTexture(x, y, 189, 0, 67, 29); drawTexture(x, y, 189, 0, 67, 29);
@@ -119,33 +127,19 @@ public class GuiCraftingPreview extends GuiBase {
RenderHelper.enableGUIStandardItemLighting(); RenderHelper.enableGUIStandardItemLighting();
ItemStack hoveringStack = null; ItemStack hoveringStack = null;
FluidStack hoveringFluid = null;
for (int i = 0; i < 8; ++i) { for (int i = 0; i < 8; ++i) {
if (slot < stacks.size()) { if (slot < stacks.size()) {
ICraftingPreviewStack stack = stacks.get(slot); ICraftingPreviewElement stack = stacks.get(slot);
drawItem(x, y + 5, stack.getStack()); stack.draw(x, y + 5, itemDrawer, fluidDrawer, stringDrawer);
GlStateManager.pushMatrix();
GlStateManager.scale(scale, scale, 1);
int yy = y + 8;
if (stack.getToCraft() > 0) {
String format = stack.hasMissing() ? "gui.refinedstorage:crafting_preview.missing" : "gui.refinedstorage:crafting_preview.to_craft";
drawString(calculateOffsetOnScale(x + 23, scale), calculateOffsetOnScale(yy, scale), t(format, stack.getToCraft()));
yy += 7;
}
if (stack.getAvailable() > 0) {
drawString(calculateOffsetOnScale(x + 23, scale), calculateOffsetOnScale(yy, scale), t("gui.refinedstorage:crafting_preview.available", stack.getAvailable()));
}
GlStateManager.popMatrix();
if (inBounds(x, y, 16, 16, mouseX, mouseY)) { if (inBounds(x, y, 16, 16, mouseX, mouseY)) {
hoveringStack = stack.getStack(); hoveringStack = stack.getId().equals(CraftingPreviewElementItemStack.ID) ? (ItemStack) stack.getElement() : null;
if (hoveringStack == null) {
hoveringFluid = stack.getId().equals(CraftingPreviewElementFluidStack.ID) ? (FluidStack) stack.getElement() : null;
}
} }
} }
@@ -161,6 +155,8 @@ public class GuiCraftingPreview extends GuiBase {
if (hoveringStack != null) { if (hoveringStack != null) {
drawTooltip(mouseX, mouseY, hoveringStack.getTooltip(Minecraft.getMinecraft().thePlayer, false)); drawTooltip(mouseX, mouseY, hoveringStack.getTooltip(Minecraft.getMinecraft().thePlayer, false));
} else if (hoveringFluid != null) {
drawTooltip(mouseX, mouseY, hoveringFluid.getLocalizedName());
} }
} }
} }

View File

@@ -23,7 +23,7 @@ public class SideButtonAccessType extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.RED + gui.t("sidebutton.refinedstorage:access_type") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:access_type." + parameter.getValue().getId()); return TextFormatting.RED + GuiBase.t("sidebutton.refinedstorage:access_type") + TextFormatting.RESET + "\n" + GuiBase.t("sidebutton.refinedstorage:access_type." + parameter.getValue().getId());
} }
@Override @Override

View File

@@ -19,12 +19,12 @@ public class SideButtonCompare extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
String tooltip = TextFormatting.YELLOW + gui.t("sidebutton.refinedstorage:compare." + mask) + TextFormatting.RESET + "\n"; String tooltip = TextFormatting.YELLOW + GuiBase.t("sidebutton.refinedstorage:compare." + mask) + TextFormatting.RESET + "\n";
if ((parameter.getValue() & mask) == mask) { if ((parameter.getValue() & mask) == mask) {
tooltip += gui.t("gui.yes"); tooltip += GuiBase.t("gui.yes");
} else { } else {
tooltip += gui.t("gui.no"); tooltip += GuiBase.t("gui.no");
} }
return tooltip; return tooltip;

View File

@@ -17,7 +17,7 @@ public class SideButtonConstuctorDrop extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:constructor.drop") + TextFormatting.RESET + "\n" + gui.t(TileConstructor.DROP.getValue() ? "gui.yes" : "gui.no"); return TextFormatting.GREEN + GuiBase.t("sidebutton.refinedstorage:constructor.drop") + TextFormatting.RESET + "\n" + GuiBase.t(TileConstructor.DROP.getValue() ? "gui.yes" : "gui.no");
} }
@Override @Override

View File

@@ -12,7 +12,7 @@ public class SideButtonCrafterTriggeredAutocrafting extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:crafter.triggered_autocrafting") + TextFormatting.RESET + "\n" + gui.t("gui." + (TileCrafter.TRIGGERED_AUTOCRAFTING.getValue() ? "yes" : "no")); return TextFormatting.GREEN + GuiBase.t("sidebutton.refinedstorage:crafter.triggered_autocrafting") + TextFormatting.RESET + "\n" + GuiBase.t("gui." + (TileCrafter.TRIGGERED_AUTOCRAFTING.getValue() ? "yes" : "no"));
} }
@Override @Override

View File

@@ -12,7 +12,7 @@ public class SideButtonDetectorMode extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:detector.mode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:detector.mode." + TileDetector.MODE.getValue()); return TextFormatting.GREEN + GuiBase.t("sidebutton.refinedstorage:detector.mode") + TextFormatting.RESET + "\n" + GuiBase.t("sidebutton.refinedstorage:detector.mode." + TileDetector.MODE.getValue());
} }
@Override @Override

View File

@@ -1,6 +1,7 @@
package refinedstorage.gui.sidebutton; package refinedstorage.gui.sidebutton;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
import refinedstorage.gui.GuiBase;
import refinedstorage.gui.grid.GuiGrid; import refinedstorage.gui.grid.GuiGrid;
import refinedstorage.integration.jei.IntegrationJEI; import refinedstorage.integration.jei.IntegrationJEI;
import refinedstorage.tile.grid.TileGrid; import refinedstorage.tile.grid.TileGrid;
@@ -12,7 +13,7 @@ public class SideButtonGridSearchBoxMode extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.YELLOW + gui.t("sidebutton.refinedstorage:grid.search_box_mode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:grid.search_box_mode." + ((GuiGrid) gui).getGrid().getSearchBoxMode()); return TextFormatting.YELLOW + GuiBase.t("sidebutton.refinedstorage:grid.search_box_mode") + TextFormatting.RESET + "\n" + GuiBase.t("sidebutton.refinedstorage:grid.search_box_mode." + ((GuiGrid) gui).getGrid().getSearchBoxMode());
} }
@Override @Override

View File

@@ -16,7 +16,7 @@ public class SideButtonGridSortingDirection extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.YELLOW + gui.t("sidebutton.refinedstorage:grid.sorting.direction") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:grid.sorting.direction." + grid.getSortingDirection()); return TextFormatting.YELLOW + GuiBase.t("sidebutton.refinedstorage:grid.sorting.direction") + TextFormatting.RESET + "\n" + GuiBase.t("sidebutton.refinedstorage:grid.sorting.direction." + grid.getSortingDirection());
} }
@Override @Override

View File

@@ -16,7 +16,7 @@ public class SideButtonGridSortingType extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.YELLOW + gui.t("sidebutton.refinedstorage:grid.sorting.type") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:grid.sorting.type." + grid.getSortingType()); return TextFormatting.YELLOW + GuiBase.t("sidebutton.refinedstorage:grid.sorting.type") + TextFormatting.RESET + "\n" + GuiBase.t("sidebutton.refinedstorage:grid.sorting.type." + grid.getSortingType());
} }
@Override @Override

View File

@@ -16,7 +16,7 @@ public class SideButtonGridViewType extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.YELLOW + gui.t("sidebutton.refinedstorage:grid.view_type") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:grid.view_type." + grid.getViewType()); return TextFormatting.YELLOW + GuiBase.t("sidebutton.refinedstorage:grid.view_type") + TextFormatting.RESET + "\n" + GuiBase.t("sidebutton.refinedstorage:grid.view_type." + grid.getViewType());
} }
@Override @Override

View File

@@ -17,7 +17,7 @@ public class SideButtonIOMode extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:iomode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:iomode." + (parameter.getValue() == TileDiskManipulator.IO_MODE_INSERT ? "insert" : "extract")); return TextFormatting.GREEN + GuiBase.t("sidebutton.refinedstorage:iomode") + TextFormatting.RESET + "\n" + GuiBase.t("sidebutton.refinedstorage:iomode." + (parameter.getValue() == TileDiskManipulator.IO_MODE_INSERT ? "insert" : "extract"));
} }
@Override @Override

View File

@@ -17,7 +17,7 @@ public class SideButtonMode extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:mode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:mode." + (parameter.getValue() == IFilterable.WHITELIST ? "whitelist" : "blacklist")); return TextFormatting.GREEN + GuiBase.t("sidebutton.refinedstorage:mode") + TextFormatting.RESET + "\n" + GuiBase.t("sidebutton.refinedstorage:mode." + (parameter.getValue() == IFilterable.WHITELIST ? "whitelist" : "blacklist"));
} }
@Override @Override

View File

@@ -17,7 +17,7 @@ public class SideButtonPickup extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:destructor.pickup") + TextFormatting.RESET + "\n" + gui.t(TileDestructor.PICKUP.getValue() ? "gui.yes" : "gui.no"); return TextFormatting.GREEN + GuiBase.t("sidebutton.refinedstorage:destructor.pickup") + TextFormatting.RESET + "\n" + GuiBase.t(TileDestructor.PICKUP.getValue() ? "gui.yes" : "gui.no");
} }
@Override @Override

View File

@@ -16,7 +16,7 @@ public class SideButtonRedstoneMode extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.RED + gui.t("sidebutton.refinedstorage:redstone_mode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:redstone_mode." + parameter.getValue()); return TextFormatting.RED + GuiBase.t("sidebutton.refinedstorage:redstone_mode") + TextFormatting.RESET + "\n" + GuiBase.t("sidebutton.refinedstorage:redstone_mode." + parameter.getValue());
} }
@Override @Override

View File

@@ -17,7 +17,7 @@ public class SideButtonType extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:type") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:type." + type.getValue()); return TextFormatting.GREEN + GuiBase.t("sidebutton.refinedstorage:type") + TextFormatting.RESET + "\n" + GuiBase.t("sidebutton.refinedstorage:type." + type.getValue());
} }
@Override @Override

View File

@@ -18,7 +18,7 @@ public class SideButtonVoidExcess extends SideButton {
@Override @Override
public String getTooltip() { public String getTooltip() {
return TextFormatting.LIGHT_PURPLE + gui.t("sidebutton.refinedstorage:void_excess." + type) + TextFormatting.RESET + "\n" + gui.t(parameter.getValue() ? "gui.yes" : "gui.no"); return TextFormatting.LIGHT_PURPLE + GuiBase.t("sidebutton.refinedstorage:void_excess." + type) + TextFormatting.RESET + "\n" + GuiBase.t(parameter.getValue() ? "gui.yes" : "gui.no");
} }
@Override @Override

View File

@@ -1,25 +1,26 @@
package refinedstorage.network; package refinedstorage.network;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import refinedstorage.api.autocrafting.preview.ICraftingPreviewStack; import refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewStack; import refinedstorage.apiimpl.API;
import refinedstorage.proxy.ProxyClient; import refinedstorage.proxy.ProxyClient;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
public class MessageGridCraftingPreviewResponse implements IMessage, IMessageHandler<MessageGridCraftingPreviewResponse, IMessage> { public class MessageGridCraftingPreviewResponse implements IMessage, IMessageHandler<MessageGridCraftingPreviewResponse, IMessage> {
public List<ICraftingPreviewStack> stacks; public List<ICraftingPreviewElement> stacks;
public int hash; public int hash;
public int quantity; public int quantity;
public MessageGridCraftingPreviewResponse() { public MessageGridCraftingPreviewResponse() {
} }
public MessageGridCraftingPreviewResponse(List<ICraftingPreviewStack> stacks, int hash, int quantity) { public MessageGridCraftingPreviewResponse(List<ICraftingPreviewElement> stacks, int hash, int quantity) {
this.stacks = stacks; this.stacks = stacks;
this.hash = hash; this.hash = hash;
this.quantity = quantity; this.quantity = quantity;
@@ -35,7 +36,7 @@ public class MessageGridCraftingPreviewResponse implements IMessage, IMessageHan
int size = buf.readInt(); int size = buf.readInt();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
this.stacks.add(CraftingPreviewStack.fromByteBuf(buf)); this.stacks.add(API.instance().getCraftingPreviewElementRegistry().getFactory(ByteBufUtils.readUTF8String(buf)).apply(buf));
} }
} }
@@ -46,7 +47,8 @@ public class MessageGridCraftingPreviewResponse implements IMessage, IMessageHan
buf.writeInt(stacks.size()); buf.writeInt(stacks.size());
for (ICraftingPreviewStack stack : stacks) { for (ICraftingPreviewElement stack : stacks) {
ByteBufUtils.writeUTF8String(buf, stack.getId());
stack.writeToByteBuf(buf); stack.writeToByteBuf(buf);
} }
} }

View File

@@ -23,6 +23,8 @@ import refinedstorage.apiimpl.API;
import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementFluidRender; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementFluidRender;
import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementItemRender; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementItemRender;
import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementText; import refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementText;
import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementFluidStack;
import refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack;
import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactory; import refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactory;
import refinedstorage.apiimpl.solderer.*; import refinedstorage.apiimpl.solderer.*;
import refinedstorage.apiimpl.storage.fluid.FluidStorageNBT; import refinedstorage.apiimpl.storage.fluid.FluidStorageNBT;
@@ -57,6 +59,9 @@ public class ProxyCommon {
API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementFluidRender.ID, buf -> new CraftingMonitorElementFluidRender(buf.readInt(), RSUtils.readFluidStack(buf).getRight(), buf.readInt())); API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementFluidRender.ID, buf -> new CraftingMonitorElementFluidRender(buf.readInt(), RSUtils.readFluidStack(buf).getRight(), buf.readInt()));
API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementText.ID, buf -> new CraftingMonitorElementText(ByteBufUtils.readUTF8String(buf), buf.readInt())); API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementText.ID, buf -> new CraftingMonitorElementText(ByteBufUtils.readUTF8String(buf), buf.readInt()));
API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementItemStack.ID, CraftingPreviewElementItemStack::fromByteBuf);
API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementFluidStack.ID, CraftingPreviewElementFluidStack::fromByteBuf);
int id = 0; int id = 0;
RS.INSTANCE.network.registerMessage(MessageTileDataParameter.class, MessageTileDataParameter.class, id++, Side.CLIENT); RS.INSTANCE.network.registerMessage(MessageTileDataParameter.class, MessageTileDataParameter.class, id++, Side.CLIENT);