Re-add autocrafting

This commit is contained in:
raoulvdberge
2019-10-27 22:51:02 +01:00
parent f60f09a262
commit 2a2d9a1a07
62 changed files with 653 additions and 808 deletions

View File

@@ -5,6 +5,10 @@ import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
import com.raoulvdberge.refinedstorage.api.storage.StorageType;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.ErrorCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.FluidCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.ItemCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactory;
import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkListener;
import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeListener;
import com.raoulvdberge.refinedstorage.apiimpl.network.grid.factory.*;
@@ -143,6 +147,12 @@ public final class RS {
API.instance().addExternalStorageProvider(StorageType.ITEM, new ItemExternalStorageProvider());
API.instance().addExternalStorageProvider(StorageType.FLUID, new FluidExternalStorageProvider());
API.instance().getCraftingPreviewElementRegistry().add(ItemCraftingPreviewElement.ID, ItemCraftingPreviewElement::read);
API.instance().getCraftingPreviewElementRegistry().add(FluidCraftingPreviewElement.ID, FluidCraftingPreviewElement::read);
API.instance().getCraftingPreviewElementRegistry().add(ErrorCraftingPreviewElement.ID, ErrorCraftingPreviewElement::read);
API.instance().getCraftingTaskRegistry().add(CraftingTaskFactory.ID, new CraftingTaskFactory());
LootFunctionManager.registerFunction(new StorageBlockLootFunctionSerializer());
LootFunctionManager.registerFunction(new PortableGridBlockLootFunctionSerializer());
LootFunctionManager.registerFunction(new CrafterLootFunctionSerializer());

View File

@@ -131,14 +131,14 @@ public interface ICraftingManager {
int track(@Nonnull FluidStack stack, int size);
/**
* @return a list of crafting patterns in this network, do NOT modify this list
* @return the crafting patterns in this network
*/
List<ICraftingPattern> getPatterns();
/**
* Rebuilds the pattern list.
*/
void rebuild();
void invalidate();
/**
* Return a crafting pattern from an item stack.

View File

@@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.api.autocrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidStack;
import java.util.List;
@@ -75,7 +76,7 @@ public interface ICraftingPattern {
/**
* @return the id of the factory that creates a crafting task for this pattern, as defined in the {@link com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry}
*/
String getId();
ResourceLocation getId();
/**
* @param other the other pattern

View File

@@ -1,8 +1,8 @@
package com.raoulvdberge.refinedstorage.api.autocrafting.preview;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawers;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@@ -43,12 +43,12 @@ public interface ICraftingPreviewElement<T> {
/**
* @param buf buffer to write to
*/
void writeToByteBuf(PacketBuffer buf);
void write(PacketBuffer buf);
/**
* Returns the id of this element, used for serialization and deserialization over the network.
*
* @return the id
*/
String getId();
ResourceLocation getId();
}

View File

@@ -1,6 +1,7 @@
package com.raoulvdberge.refinedstorage.api.autocrafting.preview;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nullable;
import java.util.function.Function;
@@ -15,7 +16,7 @@ public interface ICraftingPreviewElementRegistry {
* @param id the id, as specified in {@link ICraftingPreviewElement#getId()}
* @param factory the factory
*/
void add(String id, Function<ByteBuf, ICraftingPreviewElement> factory);
void add(ResourceLocation id, Function<PacketBuffer, ICraftingPreviewElement> factory);
/**
* Returns a factory from the registry.
@@ -24,5 +25,5 @@ public interface ICraftingPreviewElementRegistry {
* @return the factory, or null if no factory was found
*/
@Nullable
Function<ByteBuf, ICraftingPreviewElement> get(String id);
Function<PacketBuffer, ICraftingPreviewElement> get(ResourceLocation id);
}

View File

@@ -1,5 +1,7 @@
package com.raoulvdberge.refinedstorage.api.autocrafting.registry;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nullable;
/**
@@ -14,7 +16,7 @@ public interface ICraftingTaskRegistry {
* @param id the id of the factory
* @param factory the factory
*/
void add(String id, ICraftingTaskFactory factory);
void add(ResourceLocation id, ICraftingTaskFactory factory);
/**
* Returns the crafting task factory by factory id.
@@ -23,5 +25,5 @@ public interface ICraftingTaskRegistry {
* @return the factory, or null if there is no factory
*/
@Nullable
ICraftingTaskFactory get(String id);
ICraftingTaskFactory get(ResourceLocation id);
}

View File

@@ -80,6 +80,11 @@ public interface IStorageCache<T> {
*/
IStackList<T> getList();
/**
* @return a list of craftables
*/
IStackList<T> getCraftablesList();
/**
* @return the storages connected to this network
*/

View File

@@ -16,6 +16,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.API;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.IItemHandlerModifiable;
@@ -128,7 +129,7 @@ public class CraftingManager implements ICraftingManager {
for (int i = 0; i < tasksToRead.size(); ++i) {
CompoundNBT taskTag = tasksToRead.getCompound(i);
String taskType = taskTag.getString(NBT_TASK_TYPE);
ResourceLocation taskType = new ResourceLocation(taskTag.getString(NBT_TASK_TYPE));
CompoundNBT taskData = taskTag.getCompound(NBT_TASK_DATA);
ICraftingTaskFactory factory = API.instance().getCraftingTaskRegistry().get(taskType);
@@ -196,7 +197,7 @@ public class CraftingManager implements ICraftingManager {
for (ICraftingTask task : tasks.values()) {
CompoundNBT taskTag = new CompoundNBT();
taskTag.putString(NBT_TASK_TYPE, task.getPattern().getId());
taskTag.putString(NBT_TASK_TYPE, task.getPattern().getId().toString());
taskTag.put(NBT_TASK_DATA, task.writeToNbt(new CompoundNBT()));
list.add(taskTag);
@@ -355,7 +356,10 @@ public class CraftingManager implements ICraftingManager {
}
@Override
public void rebuild() {
public void invalidate() {
this.network.getItemStorageCache().getCraftablesList().clear();
this.network.getFluidStorageCache().getCraftablesList().clear();
this.patterns.clear();
this.containerInventories.clear();
@@ -370,7 +374,17 @@ public class CraftingManager implements ICraftingManager {
containers.sort((a, b) -> b.getPosition().compareTo(a.getPosition()));
for (ICraftingPatternContainer container : containers) {
this.patterns.addAll(container.getPatterns());
for (ICraftingPattern pattern : container.getPatterns()) {
this.patterns.add(pattern);
for (ItemStack output : pattern.getOutputs()) {
network.getItemStorageCache().getCraftablesList().add(output);
}
for (FluidStack output : pattern.getFluidOutputs()) {
network.getFluidStorageCache().getCraftablesList().add(output);
}
}
IItemHandlerModifiable handler = container.getPatternInventory();
if (handler != null) {

View File

@@ -14,6 +14,7 @@ import net.minecraft.item.crafting.ICraftingRecipe;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
@@ -82,14 +83,14 @@ public class CraftingPattern implements ICraftingPattern {
}
FluidStack fluidInput = PatternItem.getFluidInputSlot(stack, i);
if (fluidInput != null) {
if (!fluidInput.isEmpty()) {
this.valid = true;
fluidInputs.add(fluidInput);
}
FluidStack fluidOutput = PatternItem.getFluidOutputSlot(stack, i);
if (fluidOutput != null) {
if (!fluidOutput.isEmpty()) {
this.valid = true;
fluidOutputs.add(fluidOutput);
@@ -241,7 +242,7 @@ public class CraftingPattern implements ICraftingPattern {
}
@Override
public String getId() {
public ResourceLocation getId() {
return CraftingTaskFactory.ID;
}

View File

@@ -4,30 +4,21 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChain;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChainList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CraftingPatternChainList implements ICraftingPatternChainList {
/*private Map<ICraftingPattern, CraftingPatternChain> map = new TCustomHashMap<>(new HashingStrategy<ICraftingPattern>() {
@Override
public int computeHashCode(ICraftingPattern pattern) {
return pattern.getChainHashCode();
}
private final Map<Key, CraftingPatternChain> map = new HashMap<>();
@Override
public boolean equals(ICraftingPattern left, ICraftingPattern right) {
return left.canBeInChainWith(right);
}
});*/
// TODO: broken
private Map<ICraftingPattern, CraftingPatternChain> map = new HashMap<>();
public CraftingPatternChainList(List<ICraftingPattern> patterns) {
public CraftingPatternChainList(Collection<ICraftingPattern> patterns) {
for (ICraftingPattern pattern : patterns) {
CraftingPatternChain chain = map.get(pattern);
Key key = new Key(pattern);
CraftingPatternChain chain = map.get(key);
if (chain == null) {
map.put(pattern, chain = new CraftingPatternChain());
map.put(key, chain = new CraftingPatternChain());
}
chain.addPattern(pattern);
@@ -36,11 +27,30 @@ public class CraftingPatternChainList implements ICraftingPatternChainList {
@Override
public ICraftingPatternChain getChain(ICraftingPattern pattern) {
ICraftingPatternChain chain = map.get(pattern);
ICraftingPatternChain chain = map.get(new Key(pattern));
if (chain == null) {
throw new IllegalStateException("Pattern was not found in pattern chain");
}
return chain;
}
private class Key {
private final ICraftingPattern pattern;
public Key(ICraftingPattern pattern) {
this.pattern = pattern;
}
@Override
public boolean equals(Object other) {
return other instanceof Key && pattern.canBeInChainWith(((Key) other).pattern);
}
@Override
public int hashCode() {
return pattern.getChainHashCode();
}
}
}

View File

@@ -2,7 +2,8 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nullable;
import java.util.HashMap;
@@ -10,16 +11,16 @@ import java.util.Map;
import java.util.function.Function;
public class CraftingPreviewElementRegistry implements ICraftingPreviewElementRegistry {
private Map<String, Function<ByteBuf, ICraftingPreviewElement>> registry = new HashMap<>();
private Map<ResourceLocation, Function<PacketBuffer, ICraftingPreviewElement>> registry = new HashMap<>();
@Override
public void add(String id, Function<ByteBuf, ICraftingPreviewElement> factory) {
public void add(ResourceLocation id, Function<PacketBuffer, ICraftingPreviewElement> factory) {
registry.put(id, factory);
}
@Nullable
@Override
public Function<ByteBuf, ICraftingPreviewElement> get(String id) {
public Function<PacketBuffer, ICraftingPreviewElement> get(ResourceLocation id) {
return registry.get(id);
}
}

View File

@@ -1,20 +1,20 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskErrorType;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawers;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
public class CraftingPreviewElementError implements ICraftingPreviewElement<ItemStack> {
public static final String ID = "error";
public class ErrorCraftingPreviewElement implements ICraftingPreviewElement<ItemStack> {
public static final ResourceLocation ID = new ResourceLocation(RS.ID, "error");
private CraftingTaskErrorType type;
private ItemStack stack;
public CraftingPreviewElementError(CraftingTaskErrorType type, ItemStack stack) {
public ErrorCraftingPreviewElement(CraftingTaskErrorType type, ItemStack stack) {
this.type = type;
this.stack = stack;
}
@@ -44,36 +44,26 @@ public class CraftingPreviewElementError implements ICraftingPreviewElement<Item
return false;
}
// TODO: Rename to writeToBuffer.
@Override
public void writeToByteBuf(PacketBuffer buf) {
public void write(PacketBuffer buf) {
buf.writeInt(type.ordinal());
// TODO can't we use writeItemStack here?
buf.writeInt(Item.getIdFromItem(stack.getItem()));
buf.writeCompoundTag(stack.getTag());
buf.writeItemStack(stack);
}
public CraftingTaskErrorType getType() {
return type;
}
// TODO: Rename to fromBuffer
public static CraftingPreviewElementError fromByteBuf(PacketBuffer buf) {
public static ErrorCraftingPreviewElement read(PacketBuffer buf) {
int errorIdx = buf.readInt();
CraftingTaskErrorType error = errorIdx >= 0 && errorIdx < CraftingTaskErrorType.values().length ? CraftingTaskErrorType.values()[errorIdx] : CraftingTaskErrorType.TOO_COMPLEX;
ItemStack stack = buf.readItemStack();
// TODO can't we use readItemStack here?
Item item = Item.getItemById(buf.readInt());
CompoundNBT tag = buf.readCompoundTag();
ItemStack stack = new ItemStack(item, 1);
stack.setTag(tag);
return new CraftingPreviewElementError(error, stack);
return new ErrorCraftingPreviewElement(error, stack);
}
@Override
public String getId() {
public ResourceLocation getId() {
return ID;
}
}

View File

@@ -1,6 +1,7 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview;
import com.mojang.blaze3d.platform.GlStateManager;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawers;
import com.raoulvdberge.refinedstorage.apiimpl.API;
@@ -8,12 +9,13 @@ import com.raoulvdberge.refinedstorage.util.RenderUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.I18n;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fluids.FluidStack;
public class CraftingPreviewElementFluidStack implements ICraftingPreviewElement<FluidStack> {
public static final String ID = "fluid_renderer";
public class FluidCraftingPreviewElement implements ICraftingPreviewElement<FluidStack> {
public static final ResourceLocation ID = new ResourceLocation(RS.ID, "fluid");
private FluidStack stack;
private int available;
@@ -21,34 +23,32 @@ public class CraftingPreviewElementFluidStack implements ICraftingPreviewElement
// If missing is true then toCraft is the missing amount
private int toCraft;
public CraftingPreviewElementFluidStack(FluidStack stack) {
public FluidCraftingPreviewElement(FluidStack stack) {
this.stack = stack.copy();
}
public CraftingPreviewElementFluidStack(FluidStack stack, int available, boolean missing, int toCraft) {
public FluidCraftingPreviewElement(FluidStack stack, int available, boolean missing, int toCraft) {
this.stack = stack.copy();
this.available = available;
this.missing = missing;
this.toCraft = toCraft;
}
// TODO ren
@Override
public void writeToByteBuf(PacketBuffer buf) {
public void write(PacketBuffer buf) {
stack.writeToPacket(buf);
buf.writeInt(available);
buf.writeBoolean(missing);
buf.writeInt(toCraft);
}
//TODO ren
public static CraftingPreviewElementFluidStack fromByteBuf(PacketBuffer buf) {
public static FluidCraftingPreviewElement read(PacketBuffer buf) {
FluidStack stack = FluidStack.readFromPacket(buf);
int available = buf.readInt();
boolean missing = buf.readBoolean();
int toCraft = buf.readInt();
return new CraftingPreviewElementFluidStack(stack, available, missing, toCraft);
return new FluidCraftingPreviewElement(stack, available, missing, toCraft);
}
@Override
@@ -76,14 +76,14 @@ public class CraftingPreviewElementFluidStack implements ICraftingPreviewElement
GlStateManager.scalef(scale, scale, 1);
if (getToCraft() > 0) {
String format = hasMissing() ? "gui.refinedstorage:crafting_preview.missing" : "gui.refinedstorage:crafting_preview.to_craft";
String format = hasMissing() ? "gui.refinedstorage.crafting_preview.missing" : "gui.refinedstorage.crafting_preview.to_craft";
drawers.getStringDrawer().draw(RenderUtils.getOffsetOnScale(x + 23, scale), RenderUtils.getOffsetOnScale(y, scale), I18n.format(format, API.instance().getQuantityFormatter().formatInBucketForm(getToCraft())));
y += 7;
}
if (getAvailable() > 0) {
drawers.getStringDrawer().draw(RenderUtils.getOffsetOnScale(x + 23, scale), RenderUtils.getOffsetOnScale(y, scale), I18n.format("gui.refinedstorage:crafting_preview.available", API.instance().getQuantityFormatter().formatInBucketForm(getAvailable())));
drawers.getStringDrawer().draw(RenderUtils.getOffsetOnScale(x + 23, scale), RenderUtils.getOffsetOnScale(y, scale), I18n.format("gui.refinedstorage.crafting_preview.available", API.instance().getQuantityFormatter().formatInBucketForm(getAvailable())));
}
GlStateManager.popMatrix();
@@ -117,7 +117,7 @@ public class CraftingPreviewElementFluidStack implements ICraftingPreviewElement
}
@Override
public String getId() {
public ResourceLocation getId() {
return ID;
}
}

View File

@@ -1,21 +1,21 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview;
import com.mojang.blaze3d.platform.GlStateManager;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawers;
import com.raoulvdberge.refinedstorage.util.RenderUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.I18n;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.items.ItemHandlerHelper;
public class CraftingPreviewElementItemStack implements ICraftingPreviewElement<ItemStack> {
public static final String ID = "item_renderer";
public class ItemCraftingPreviewElement implements ICraftingPreviewElement<ItemStack> {
public static final ResourceLocation ID = new ResourceLocation(RS.ID, "item");
private ItemStack stack;
private int available;
@@ -23,42 +23,32 @@ public class CraftingPreviewElementItemStack implements ICraftingPreviewElement<
// If missing is true then toCraft is the missing amount
private int toCraft;
public CraftingPreviewElementItemStack(ItemStack stack) {
public ItemCraftingPreviewElement(ItemStack stack) {
this.stack = ItemHandlerHelper.copyStackWithSize(stack, 1);
}
public CraftingPreviewElementItemStack(ItemStack stack, int available, boolean missing, int toCraft) {
public ItemCraftingPreviewElement(ItemStack stack, int available, boolean missing, int toCraft) {
this.stack = stack;
this.available = available;
this.missing = missing;
this.toCraft = toCraft;
}
// TODO ren
@Override
public void writeToByteBuf(PacketBuffer buf) {
// TODO can't we use writeItemSTack
buf.writeInt(Item.getIdFromItem(stack.getItem()));
buf.writeCompoundTag(stack.getTag());
public void write(PacketBuffer buf) {
buf.writeItemStack(stack);
buf.writeInt(available);
buf.writeBoolean(missing);
buf.writeInt(toCraft);
}
// TODO ren
public static CraftingPreviewElementItemStack fromByteBuf(PacketBuffer buf) {
// TODO readItemStack
Item item = Item.getItemById(buf.readInt());
CompoundNBT tag = buf.readCompoundTag();
public static ItemCraftingPreviewElement read(PacketBuffer buf) {
ItemStack stack = buf.readItemStack();
int available = buf.readInt();
boolean missing = buf.readBoolean();
int toCraft = buf.readInt();
ItemStack stack = new ItemStack(item, 1);
stack.setTag(tag);
return new CraftingPreviewElementItemStack(stack, available, missing, toCraft);
return new ItemCraftingPreviewElement(stack, available, missing, toCraft);
}
@Override
@@ -86,14 +76,14 @@ public class CraftingPreviewElementItemStack implements ICraftingPreviewElement<
GlStateManager.scalef(scale, scale, 1);
if (getToCraft() > 0) {
String format = hasMissing() ? "gui.refinedstorage:crafting_preview.missing" : "gui.refinedstorage:crafting_preview.to_craft";
String format = hasMissing() ? "gui.refinedstorage.crafting_preview.missing" : "gui.refinedstorage.crafting_preview.to_craft";
drawers.getStringDrawer().draw(RenderUtils.getOffsetOnScale(x + 23, scale), RenderUtils.getOffsetOnScale(y, scale), I18n.format(format, getToCraft()));
y += 7;
}
if (getAvailable() > 0) {
drawers.getStringDrawer().draw(RenderUtils.getOffsetOnScale(x + 23, scale), RenderUtils.getOffsetOnScale(y, scale), I18n.format("gui.refinedstorage:crafting_preview.available", getAvailable()));
drawers.getStringDrawer().draw(RenderUtils.getOffsetOnScale(x + 23, scale), RenderUtils.getOffsetOnScale(y, scale), I18n.format("gui.refinedstorage.crafting_preview.available", getAvailable()));
}
GlStateManager.popMatrix();
@@ -127,7 +117,7 @@ public class CraftingPreviewElementItemStack implements ICraftingPreviewElement<
}
@Override
public String getId() {
public ResourceLocation getId() {
return ID;
}
}

View File

@@ -1,5 +1,6 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskFactory;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskReadException;
@@ -8,11 +9,12 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.CraftingTask;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nonnull;
public class CraftingTaskFactory implements ICraftingTaskFactory {
public static final String ID = "normal";
public static final ResourceLocation ID = new ResourceLocation(RS.ID, "default");
@Nonnull
@Override

View File

@@ -2,22 +2,23 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry;
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskFactory;
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
public class CraftingTaskRegistry implements ICraftingTaskRegistry {
private Map<String, ICraftingTaskFactory> registry = new HashMap<>();
private Map<ResourceLocation, ICraftingTaskFactory> registry = new HashMap<>();
@Override
public void add(String id, ICraftingTaskFactory factory) {
public void add(ResourceLocation id, ICraftingTaskFactory factory) {
registry.put(id, factory);
}
@Override
@Nullable
public ICraftingTaskFactory get(String id) {
public ICraftingTaskFactory get(ResourceLocation id) {
return registry.get(id);
}
}

View File

@@ -1,7 +1,6 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task;
import com.google.common.collect.Maps;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.autocrafting.*;
import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementList;
@@ -18,8 +17,8 @@ import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementError;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementFluidRender;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementItemRender;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementFluidStack;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.FluidCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.ItemCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.FluidStorageDisk;
import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.ItemStorageDisk;
import com.raoulvdberge.refinedstorage.apiimpl.storage.disk.factory.FluidStorageDiskFactory;
@@ -332,9 +331,10 @@ public class CraftingTask implements ICraftingTask {
ICraftingPattern pattern,
boolean root) {
/* TODO
if (System.currentTimeMillis() - calculationStarted > RS.INSTANCE.config.calculationTimeoutMs) {
return new CraftingTaskError(CraftingTaskErrorType.TOO_COMPLEX);
}
}*/
if (!patternsUsed.add(pattern)) {
return new CraftingTaskError(CraftingTaskErrorType.RECURSIVE, pattern);
@@ -1111,16 +1111,16 @@ public class CraftingTask implements ICraftingTask {
@Override
public List<ICraftingPreviewElement> getPreviewStacks() {
Map<Integer, CraftingPreviewElementItemStack> map = new LinkedHashMap<>();
Map<Integer, CraftingPreviewElementFluidStack> mapFluids = new LinkedHashMap<>();
Map<Integer, ItemCraftingPreviewElement> map = new LinkedHashMap<>();
Map<Integer, FluidCraftingPreviewElement> mapFluids = new LinkedHashMap<>();
for (StackListEntry<ItemStack> stack : toCraft.getStacks()) {
int hash = API.instance().getItemStackHashCode(stack.getStack());
CraftingPreviewElementItemStack previewStack = map.get(hash);
ItemCraftingPreviewElement previewStack = map.get(hash);
if (previewStack == null) {
previewStack = new CraftingPreviewElementItemStack(stack.getStack());
previewStack = new ItemCraftingPreviewElement(stack.getStack());
}
previewStack.addToCraft(stack.getStack().getCount());
@@ -1131,10 +1131,10 @@ public class CraftingTask implements ICraftingTask {
for (StackListEntry<FluidStack> stack : toCraftFluids.getStacks()) {
int hash = API.instance().getFluidStackHashCode(stack.getStack());
CraftingPreviewElementFluidStack previewStack = mapFluids.get(hash);
FluidCraftingPreviewElement previewStack = mapFluids.get(hash);
if (previewStack == null) {
previewStack = new CraftingPreviewElementFluidStack(stack.getStack());
previewStack = new FluidCraftingPreviewElement(stack.getStack());
}
previewStack.addToCraft(stack.getStack().getAmount());
@@ -1145,10 +1145,10 @@ public class CraftingTask implements ICraftingTask {
for (StackListEntry<ItemStack> stack : missing.getStacks()) {
int hash = API.instance().getItemStackHashCode(stack.getStack());
CraftingPreviewElementItemStack previewStack = map.get(hash);
ItemCraftingPreviewElement previewStack = map.get(hash);
if (previewStack == null) {
previewStack = new CraftingPreviewElementItemStack(stack.getStack());
previewStack = new ItemCraftingPreviewElement(stack.getStack());
}
previewStack.setMissing(true);
@@ -1160,10 +1160,10 @@ public class CraftingTask implements ICraftingTask {
for (StackListEntry<FluidStack> stack : missingFluids.getStacks()) {
int hash = API.instance().getFluidStackHashCode(stack.getStack());
CraftingPreviewElementFluidStack previewStack = mapFluids.get(hash);
FluidCraftingPreviewElement previewStack = mapFluids.get(hash);
if (previewStack == null) {
previewStack = new CraftingPreviewElementFluidStack(stack.getStack());
previewStack = new FluidCraftingPreviewElement(stack.getStack());
}
previewStack.setMissing(true);
@@ -1175,10 +1175,10 @@ public class CraftingTask implements ICraftingTask {
for (StackListEntry<ItemStack> stack : toTake.getStacks()) {
int hash = API.instance().getItemStackHashCode(stack.getStack());
CraftingPreviewElementItemStack previewStack = map.get(hash);
ItemCraftingPreviewElement previewStack = map.get(hash);
if (previewStack == null) {
previewStack = new CraftingPreviewElementItemStack(stack.getStack());
previewStack = new ItemCraftingPreviewElement(stack.getStack());
}
previewStack.addAvailable(stack.getStack().getCount());
@@ -1189,10 +1189,10 @@ public class CraftingTask implements ICraftingTask {
for (StackListEntry<FluidStack> stack : toTakeFluids.getStacks()) {
int hash = API.instance().getFluidStackHashCode(stack.getStack());
CraftingPreviewElementFluidStack previewStack = mapFluids.get(hash);
FluidCraftingPreviewElement previewStack = mapFluids.get(hash);
if (previewStack == null) {
previewStack = new CraftingPreviewElementFluidStack(stack.getStack());
previewStack = new FluidCraftingPreviewElement(stack.getStack());
}
previewStack.addAvailable(stack.getStack().getAmount());

View File

@@ -1,15 +1,16 @@
package com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTaskError;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
import com.raoulvdberge.refinedstorage.api.network.security.Permission;
import com.raoulvdberge.refinedstorage.api.util.Action;
import com.raoulvdberge.refinedstorage.api.util.IStackList;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.ErrorCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.network.grid.GridCraftingPreviewResponseMessage;
import com.raoulvdberge.refinedstorage.network.grid.GridCraftingStartResponseMessage;
import com.raoulvdberge.refinedstorage.util.StackUtils;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.InventoryHelper;
@@ -21,6 +22,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler;
import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nonnull;
import java.util.Collections;
import java.util.UUID;
public class FluidGridHandler implements IFluidGridHandler {
@@ -114,15 +116,7 @@ public class FluidGridHandler implements IFluidGridHandler {
return;
}
IStackList<FluidStack> cache = API.instance().createFluidStackList();
for (ICraftingPattern pattern : network.getCraftingManager().getPatterns()) {
for (FluidStack output : pattern.getFluidOutputs()) {
cache.add(output);
}
}
FluidStack stack = cache.get(id);
FluidStack stack = network.getFluidStorageCache().getCraftablesList().get(id);
if (stack != null) {
Thread calculationThread = new Thread(() -> {
@@ -134,13 +128,29 @@ public class FluidGridHandler implements IFluidGridHandler {
ICraftingTaskError error = task.calculate();
if (error != null) {
// TODO: Networking RS.INSTANCE.network.sendTo(new MessageGridCraftingPreviewResponse(Collections.singletonList(new CraftingPreviewElementError(error.getType(), error.getRecursedPattern() == null ? ItemStack.EMPTY : error.getRecursedPattern().getStack())), hash, quantity, true), player);
RS.NETWORK_HANDLER.sendTo(
player,
new GridCraftingPreviewResponseMessage(
Collections.singletonList(new ErrorCraftingPreviewElement(error.getType(), error.getRecursedPattern() == null ? ItemStack.EMPTY : error.getRecursedPattern().getStack())),
id,
quantity,
false
)
);
} else if (noPreview && !task.hasMissing()) {
network.getCraftingManager().add(task);
// TODO: Networking RS.INSTANCE.network.sendTo(new MessageGridCraftingStartResponse(), player);
RS.NETWORK_HANDLER.sendTo(player, new GridCraftingStartResponseMessage());
} else {
// TODO: Networking RS.INSTANCE.network.sendTo(new MessageGridCraftingPreviewResponse(task.getPreviewStacks(), hash, quantity, true), player);
RS.NETWORK_HANDLER.sendTo(
player,
new GridCraftingPreviewResponseMessage(
task.getPreviewStacks(),
id,
quantity,
false
)
);
}
}, "RS crafting preview calculation");
@@ -154,21 +164,7 @@ public class FluidGridHandler implements IFluidGridHandler {
return;
}
FluidStack stack = null;
for (ICraftingPattern pattern : network.getCraftingManager().getPatterns()) {
for (FluidStack output : pattern.getFluidOutputs()) {
if (/* TODO API.instance().getFluidStackHashCode(output) == hash*/false) {
stack = output;
break;
}
}
if (stack != null) {
break;
}
}
FluidStack stack = network.getFluidStorageCache().getCraftablesList().get(id);
if (stack != null) {
ICraftingTask task = network.getCraftingManager().create(stack, quantity);

View File

@@ -1,15 +1,16 @@
package com.raoulvdberge.refinedstorage.apiimpl.network.grid.handler;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTaskError;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
import com.raoulvdberge.refinedstorage.api.network.security.Permission;
import com.raoulvdberge.refinedstorage.api.util.Action;
import com.raoulvdberge.refinedstorage.api.util.IStackList;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.ErrorCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.network.grid.GridCraftingPreviewResponseMessage;
import com.raoulvdberge.refinedstorage.network.grid.GridCraftingStartResponseMessage;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
@@ -19,6 +20,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.UUID;
public class ItemGridHandler implements IItemGridHandler {
@@ -152,15 +154,7 @@ public class ItemGridHandler implements IItemGridHandler {
return;
}
IStackList<ItemStack> cache = API.instance().createItemStackList();
for (ICraftingPattern pattern : network.getCraftingManager().getPatterns()) {
for (ItemStack output : pattern.getOutputs()) {
cache.add(output);
}
}
ItemStack stack = cache.get(id);
ItemStack stack = network.getItemStorageCache().getCraftablesList().get(id);
if (stack != null) {
Thread calculationThread = new Thread(() -> {
@@ -172,13 +166,29 @@ public class ItemGridHandler implements IItemGridHandler {
ICraftingTaskError error = task.calculate();
if (error != null) {
// TODO RS.INSTANCE.network.sendTo(new MessageGridCraftingPreviewResponse(Collections.singletonList(new CraftingPreviewElementError(error.getType(), error.getRecursedPattern() == null ? ItemStack.EMPTY : error.getRecursedPattern().getStack())), hash, quantity, false), player);
RS.NETWORK_HANDLER.sendTo(
player,
new GridCraftingPreviewResponseMessage(
Collections.singletonList(new ErrorCraftingPreviewElement(error.getType(), error.getRecursedPattern() == null ? ItemStack.EMPTY : error.getRecursedPattern().getStack())),
id,
quantity,
false
)
);
} else if (noPreview && !task.hasMissing()) {
network.getCraftingManager().add(task);
// TODO RS.INSTANCE.network.sendTo(new MessageGridCraftingStartResponse(), player);
RS.NETWORK_HANDLER.sendTo(player, new GridCraftingStartResponseMessage());
} else {
// TODO RS.INSTANCE.network.sendTo(new MessageGridCraftingPreviewResponse(task.getPreviewStacks(), hash, quantity, false), player);
RS.NETWORK_HANDLER.sendTo(
player,
new GridCraftingPreviewResponseMessage(
task.getPreviewStacks(),
id,
quantity,
false
)
);
}
}, "RS crafting preview calculation");
@@ -192,21 +202,7 @@ public class ItemGridHandler implements IItemGridHandler {
return;
}
ItemStack stack = null;
for (ICraftingPattern pattern : network.getCraftingManager().getPatterns()) {
for (ItemStack output : pattern.getOutputs()) {
if (/* TODO API.instance().getItemStackHashCode(output) == hash*/false) {
stack = output;
break;
}
}
if (stack != null) {
break;
}
}
ItemStack stack = network.getItemStorageCache().getCraftablesList().get(id);
if (stack != null) {
ICraftingTask task = network.getCraftingManager().create(stack, quantity);

View File

@@ -77,7 +77,7 @@ public class CrafterNetworkNode extends NetworkNode implements ICraftingPatternC
}
if (network != null) {
network.getCraftingManager().rebuild();
network.getCraftingManager().invalidate();
}
}
});
@@ -151,7 +151,7 @@ public class CrafterNetworkNode extends NetworkNode implements ICraftingPatternC
protected void onConnectedStateChange(INetwork network, boolean state) {
super.onConnectedStateChange(network, state);
network.getCraftingManager().rebuild();
network.getCraftingManager().invalidate();
}
@Override
@@ -168,7 +168,7 @@ public class CrafterNetworkNode extends NetworkNode implements ICraftingPatternC
super.onDirectionChanged(direction);
if (network != null) {
network.getCraftingManager().rebuild();
network.getCraftingManager().invalidate();
}
}

View File

@@ -22,8 +22,8 @@ public class CraftingMonitorElementDrawers extends ElementDrawers {
GlStateManager.color4f(1, 1, 1, 1);
GlStateManager.disableLighting();
gui.bindTexture(RS.ID, "gui/crafting_preview.png");
gui.blit(x + itemWidth - 12 - 2, y + itemHeight - 12 - 2, 0, 244, 12, 12);
screen.bindTexture(RS.ID, "gui/crafting_preview.png");
screen.blit(x + itemWidth - 12 - 2, y + itemHeight - 12 - 2, 0, 244, 12, 12);
};
public CraftingMonitorElementDrawers(BaseScreen gui, FontRenderer fontRenderer, int itemWidth, int itemHeight) {

View File

@@ -2,22 +2,22 @@ package com.raoulvdberge.refinedstorage.apiimpl.render;
import com.mojang.blaze3d.platform.GlStateManager;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawer;
import com.raoulvdberge.refinedstorage.screen.GuiCraftingPreview;
import com.raoulvdberge.refinedstorage.screen.grid.CraftingPreviewScreen;
import net.minecraft.client.gui.FontRenderer;
public class CraftingPreviewElementDrawers extends ElementDrawers {
private GuiCraftingPreview gui;
private CraftingPreviewScreen screen;
private IElementDrawer<Integer> overlayDrawer = (x, y, colour) -> {
GlStateManager.color4f(1, 1, 1, 1);
GlStateManager.disableLighting();
gui.fill(x, y, x + 73, y + 29, colour);
screen.fill(x, y, x + 73, y + 29, colour);
};
public CraftingPreviewElementDrawers(GuiCraftingPreview gui, FontRenderer fontRenderer) {
super(gui, fontRenderer);
public CraftingPreviewElementDrawers(CraftingPreviewScreen screen, FontRenderer fontRenderer) {
super(screen, fontRenderer);
this.gui = gui;
this.screen = screen;
}
@Override

View File

@@ -9,17 +9,17 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
public class ElementDrawers implements IElementDrawers {
protected BaseScreen gui;
protected BaseScreen screen;
private FontRenderer fontRenderer;
public ElementDrawers(BaseScreen gui, FontRenderer fontRenderer) {
this.gui = gui;
public ElementDrawers(BaseScreen screen, FontRenderer fontRenderer) {
this.screen = screen;
this.fontRenderer = fontRenderer;
}
@Override
public IElementDrawer<ItemStack> getItemDrawer() {
return gui::renderItem;
return screen::renderItem;
}
@Override
@@ -29,7 +29,7 @@ public class ElementDrawers implements IElementDrawers {
@Override
public IElementDrawer<String> getStringDrawer() {
return gui::renderString;
return screen::renderString;
}
@Override

View File

@@ -21,11 +21,12 @@ import java.util.function.Consumer;
public class FluidStorageCache implements IStorageCache<FluidStack> {
public static final Consumer<INetwork> INVALIDATE = n -> n.getFluidStorageCache().invalidate();
private INetwork network;
private CopyOnWriteArrayList<IStorage<FluidStack>> storages = new CopyOnWriteArrayList<>();
private IStackList<FluidStack> list = API.instance().createFluidStackList();
private List<IStorageCacheListener<FluidStack>> listeners = new LinkedList<>();
private List<StackListResult<FluidStack>> batchedChanges = new ArrayList<>();
private final INetwork network;
private final CopyOnWriteArrayList<IStorage<FluidStack>> storages = new CopyOnWriteArrayList<>();
private final IStackList<FluidStack> list = API.instance().createFluidStackList();
private final IStackList<FluidStack> craftables = API.instance().createFluidStackList();
private final List<IStorageCacheListener<FluidStack>> listeners = new LinkedList<>();
private final List<StackListResult<FluidStack>> batchedChanges = new ArrayList<>();
public FluidStorageCache(INetwork network) {
this.network = network;
@@ -117,6 +118,11 @@ public class FluidStorageCache implements IStorageCache<FluidStack> {
return list;
}
@Override
public IStackList<FluidStack> getCraftablesList() {
return craftables;
}
@Override
public List<IStorage<FluidStack>> getStorages() {
return storages;

View File

@@ -21,11 +21,12 @@ import java.util.function.Consumer;
public class ItemStorageCache implements IStorageCache<ItemStack> {
public static final Consumer<INetwork> INVALIDATE = network -> network.getItemStorageCache().invalidate();
private INetwork network;
private CopyOnWriteArrayList<IStorage<ItemStack>> storages = new CopyOnWriteArrayList<>();
private IStackList<ItemStack> list = API.instance().createItemStackList();
private List<IStorageCacheListener<ItemStack>> listeners = new LinkedList<>();
private List<StackListResult<ItemStack>> batchedChanges = new ArrayList<>();
private final INetwork network;
private final CopyOnWriteArrayList<IStorage<ItemStack>> storages = new CopyOnWriteArrayList<>();
private final IStackList<ItemStack> list = API.instance().createItemStackList();
private final IStackList<ItemStack> craftables = API.instance().createItemStackList();
private final List<IStorageCacheListener<ItemStack>> listeners = new LinkedList<>();
private final List<StackListResult<ItemStack>> batchedChanges = new ArrayList<>();
public ItemStorageCache(INetwork network) {
this.network = network;
@@ -119,6 +120,11 @@ public class ItemStorageCache implements IStorageCache<ItemStack> {
return list;
}
@Override
public IStackList<ItemStack> getCraftablesList() {
return craftables;
}
@Override
public List<IStorage<ItemStack>> getStorages() {
return storages;

View File

@@ -79,6 +79,11 @@ public class PortableFluidStorageCache implements IStorageCache<FluidStack> {
return list;
}
@Override
public IStackList<FluidStack> getCraftablesList() {
throw new RuntimeException("Unsupported");
}
@Override
public List<IStorage<FluidStack>> getStorages() {
return Collections.emptyList();

View File

@@ -79,6 +79,11 @@ public class PortableItemStorageCache implements IStorageCache<ItemStack> {
return list;
}
@Override
public IStackList<ItemStack> getCraftablesList() {
throw new RuntimeException("Unsupported");
}
@Override
public List<IStorage<ItemStack>> getStorages() {
return Collections.emptyList();

View File

@@ -27,6 +27,7 @@ public class FluidStorageDisk implements IStorageDisk<FluidStack> {
public static final String NBT_FLUIDS = "Fluids";
public static final int VERSION = 1;
@Nullable
private ServerWorld world;
private int capacity;
private Multimap<Fluid, FluidStack> stacks = ArrayListMultimap.create();
@@ -35,11 +36,7 @@ public class FluidStorageDisk implements IStorageDisk<FluidStack> {
private IStorageDiskListener listener;
private IStorageDiskContainerContext context;
public FluidStorageDisk(ServerWorld world, int capacity) {
if (world == null) {
throw new IllegalArgumentException("World cannot be null");
}
public FluidStorageDisk(@Nullable ServerWorld world, int capacity) {
this.world = world;
this.capacity = capacity;
}
@@ -205,6 +202,8 @@ public class FluidStorageDisk implements IStorageDisk<FluidStack> {
listener.onChanged();
}
if (world != null) {
API.instance().getStorageDiskManager(world).markForSaving();
}
}
}

View File

@@ -28,6 +28,7 @@ public class ItemStorageDisk implements IStorageDisk<ItemStack> {
public static final String NBT_ITEMS = "Items";
public static final int VERSION = 1;
@Nullable
private ServerWorld world;
private int capacity;
private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create();
@@ -36,11 +37,7 @@ public class ItemStorageDisk implements IStorageDisk<ItemStack> {
private IStorageDiskListener listener;
private IStorageDiskContainerContext context;
public ItemStorageDisk(ServerWorld world, int capacity) {
if (world == null) {
throw new IllegalArgumentException("World cannot be null");
}
public ItemStorageDisk(@Nullable ServerWorld world, int capacity) {
this.world = world;
this.capacity = capacity;
}
@@ -206,6 +203,8 @@ public class ItemStorageDisk implements IStorageDisk<ItemStack> {
listener.onChanged();
}
if (world != null) {
API.instance().getStorageDiskManager(world).markForSaving();
}
}
}

View File

@@ -21,7 +21,7 @@ public class FluidStackList implements IStackList<FluidStack> {
@Override
public StackListResult<FluidStack> add(@Nonnull FluidStack stack, int size) {
if (size < 0) {
if (stack.isEmpty() || size <= 0) {
throw new IllegalArgumentException("Cannot accept empty stack");
}

View File

@@ -1,60 +0,0 @@
package com.raoulvdberge.refinedstorage.network;
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
import com.raoulvdberge.refinedstorage.container.GridContainer;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.Container;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
public class MessageGridCraftingPreview extends MessageHandlerPlayerToServer<MessageGridCraftingPreview> implements IMessage {
private int hash;
private int quantity;
private boolean noPreview;
private boolean fluids;
public MessageGridCraftingPreview() {
}
public MessageGridCraftingPreview(int hash, int quantity, boolean noPreview, boolean fluids) {
this.hash = hash;
this.quantity = quantity;
this.noPreview = noPreview;
this.fluids = fluids;
}
@Override
public void fromBytes(ByteBuf buf) {
hash = buf.readInt();
quantity = buf.readInt();
noPreview = buf.readBoolean();
fluids = buf.readBoolean();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(hash);
buf.writeInt(quantity);
buf.writeBoolean(noPreview);
buf.writeBoolean(fluids);
}
@Override
public void handle(MessageGridCraftingPreview message, ServerPlayerEntity player) {
Container container = player.openContainer;
if (container instanceof ContainerGrid) {
IGrid grid = ((ContainerGrid) container).getGrid();
if (message.fluids) {
if (grid.getFluidHandler() != null) {
grid.getFluidHandler().onCraftingPreviewRequested(player, message.hash, message.quantity, message.noPreview);
}
} else {
if (grid.getItemHandler() != null) {
grid.getItemHandler().onCraftingPreviewRequested(player, message.hash, message.quantity, message.noPreview);
}
}
}
}
}

View File

@@ -1,81 +0,0 @@
package com.raoulvdberge.refinedstorage.network;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.gui.GuiCraftingPreview;
import com.raoulvdberge.refinedstorage.gui.grid.GuiGridCraftingSettings;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.LinkedList;
import java.util.List;
public class MessageGridCraftingPreviewResponse implements IMessage, IMessageHandler<MessageGridCraftingPreviewResponse, IMessage> {
private List<ICraftingPreviewElement> stacks;
private int hash;
private int quantity;
private boolean fluids;
public MessageGridCraftingPreviewResponse() {
}
public MessageGridCraftingPreviewResponse(List<ICraftingPreviewElement> stacks, int hash, int quantity, boolean fluids) {
this.stacks = stacks;
this.hash = hash;
this.quantity = quantity;
this.fluids = fluids;
}
@Override
public void fromBytes(ByteBuf buf) {
this.hash = buf.readInt();
this.quantity = buf.readInt();
this.fluids = buf.readBoolean();
this.stacks = new LinkedList<>();
int size = buf.readInt();
for (int i = 0; i < size; i++) {
this.stacks.add(API.instance().getCraftingPreviewElementRegistry().get(ByteBufUtils.readUTF8String(buf)).apply(buf));
}
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(hash);
buf.writeInt(quantity);
buf.writeBoolean(fluids);
buf.writeInt(stacks.size());
for (ICraftingPreviewElement stack : stacks) {
ByteBufUtils.writeUTF8String(buf, stack.getId());
stack.writeToByteBuf(buf);
}
}
@Override
@SideOnly(Side.CLIENT)
public IMessage onMessage(MessageGridCraftingPreviewResponse message, MessageContext ctx) {
Minecraft.getMinecraft().addScheduledTask(() -> {
GuiScreen screen = Minecraft.getMinecraft().currentScreen;
if (screen instanceof GuiGridCraftingSettings) {
screen = ((GuiGridCraftingSettings) screen).getParent();
}
FMLCommonHandler.instance().showGuiScreen(new GuiCraftingPreview(screen, message.stacks, message.hash, message.quantity, message.fluids));
});
return null;
}
}

View File

@@ -1,56 +0,0 @@
package com.raoulvdberge.refinedstorage.network;
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
import com.raoulvdberge.refinedstorage.container.GridContainer;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.Container;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
public class MessageGridCraftingStart extends MessageHandlerPlayerToServer<MessageGridCraftingStart> implements IMessage {
private int hash;
private int quantity;
private boolean fluids;
public MessageGridCraftingStart() {
}
public MessageGridCraftingStart(int hash, int quantity, boolean fluids) {
this.hash = hash;
this.quantity = quantity;
this.fluids = fluids;
}
@Override
public void fromBytes(ByteBuf buf) {
hash = buf.readInt();
quantity = buf.readInt();
fluids = buf.readBoolean();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(hash);
buf.writeInt(quantity);
buf.writeBoolean(fluids);
}
@Override
public void handle(MessageGridCraftingStart message, ServerPlayerEntity player) {
Container container = player.openContainer;
if (container instanceof ContainerGrid) {
IGrid grid = ((ContainerGrid) container).getGrid();
if (message.fluids) {
if (grid.getFluidHandler() != null) {
grid.getFluidHandler().onCraftingRequested(player, message.hash, message.quantity);
}
} else {
if (grid.getItemHandler() != null) {
grid.getItemHandler().onCraftingRequested(player, message.hash, message.quantity);
}
}
}
}
}

View File

@@ -1,40 +0,0 @@
package com.raoulvdberge.refinedstorage.network;
import com.raoulvdberge.refinedstorage.gui.grid.GuiGridCraftingSettings;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class MessageGridCraftingStartResponse implements IMessage, IMessageHandler<MessageGridCraftingStartResponse, IMessage> {
public MessageGridCraftingStartResponse() {
}
@Override
public void fromBytes(ByteBuf buf) {
// NO OP
}
@Override
public void toBytes(ByteBuf buf) {
// NO OP
}
@Override
@SideOnly(Side.CLIENT)
public IMessage onMessage(MessageGridCraftingStartResponse message, MessageContext ctx) {
Minecraft.getMinecraft().addScheduledTask(() -> {
GuiScreen screen = Minecraft.getMinecraft().currentScreen;
if (screen instanceof GuiGridCraftingSettings) {
((GuiGridCraftingSettings) screen).close();
}
});
return null;
}
}

View File

@@ -54,6 +54,10 @@ public class NetworkHandler {
handler.registerMessage(id++, PortableGridItemDeltaMessage.class, PortableGridItemDeltaMessage::encode, PortableGridItemDeltaMessage::decode, PortableGridItemDeltaMessage::handle);
handler.registerMessage(id++, PortableGridFluidUpdateMessage.class, PortableGridFluidUpdateMessage::encode, PortableGridFluidUpdateMessage::decode, PortableGridFluidUpdateMessage::handle);
handler.registerMessage(id++, PortableGridFluidDeltaMessage.class, PortableGridFluidDeltaMessage::encode, PortableGridFluidDeltaMessage::decode, PortableGridFluidDeltaMessage::handle);
handler.registerMessage(id++, GridCraftingPreviewRequestMessage.class, GridCraftingPreviewRequestMessage::encode, GridCraftingPreviewRequestMessage::decode, GridCraftingPreviewRequestMessage::handle);
handler.registerMessage(id++, GridCraftingPreviewResponseMessage.class, GridCraftingPreviewResponseMessage::encode, GridCraftingPreviewResponseMessage::decode, GridCraftingPreviewResponseMessage::handle);
handler.registerMessage(id++, GridCraftingStartRequestMessage.class, GridCraftingStartRequestMessage::encode, GridCraftingStartRequestMessage::decode, GridCraftingStartRequestMessage::handle);
handler.registerMessage(id++, GridCraftingStartResponseMessage.class, GridCraftingStartResponseMessage::encode, GridCraftingStartResponseMessage::decode, GridCraftingStartResponseMessage::handle);
}
public void sendToServer(Object message) {

View File

@@ -0,0 +1,67 @@
package com.raoulvdberge.refinedstorage.network.grid;
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
import com.raoulvdberge.refinedstorage.container.GridContainer;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.container.Container;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.fml.network.NetworkEvent;
import java.util.UUID;
import java.util.function.Supplier;
public class GridCraftingPreviewRequestMessage {
private UUID id;
private int quantity;
private boolean noPreview;
private boolean fluids;
public GridCraftingPreviewRequestMessage(UUID id, int quantity, boolean noPreview, boolean fluids) {
this.id = id;
this.quantity = quantity;
this.noPreview = noPreview;
this.fluids = fluids;
}
public static GridCraftingPreviewRequestMessage decode(PacketBuffer buf) {
return new GridCraftingPreviewRequestMessage(
buf.readUniqueId(),
buf.readInt(),
buf.readBoolean(),
buf.readBoolean()
);
}
public static void encode(GridCraftingPreviewRequestMessage message, PacketBuffer buf) {
buf.writeUniqueId(message.id);
buf.writeInt(message.quantity);
buf.writeBoolean(message.noPreview);
buf.writeBoolean(message.fluids);
}
public static void handle(GridCraftingPreviewRequestMessage message, Supplier<NetworkEvent.Context> ctx) {
ServerPlayerEntity player = ctx.get().getSender();
if (player != null) {
ctx.get().enqueueWork(() -> {
Container container = player.openContainer;
if (container instanceof GridContainer) {
IGrid grid = ((GridContainer) container).getGrid();
if (message.fluids) {
if (grid.getFluidHandler() != null) {
grid.getFluidHandler().onCraftingPreviewRequested(player, message.id, message.quantity, message.noPreview);
}
} else {
if (grid.getItemHandler() != null) {
grid.getItemHandler().onCraftingPreviewRequested(player, message.id, message.quantity, message.noPreview);
}
}
}
});
}
ctx.get().setPacketHandled(true);
}
}

View File

@@ -0,0 +1,74 @@
package com.raoulvdberge.refinedstorage.network.grid;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.screen.grid.CraftingPreviewScreen;
import com.raoulvdberge.refinedstorage.screen.grid.CraftingSettingsScreen;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraftforge.fml.network.NetworkEvent;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import java.util.function.Supplier;
public class GridCraftingPreviewResponseMessage {
private List<ICraftingPreviewElement> stacks;
private UUID id;
private int quantity;
private boolean fluids;
public GridCraftingPreviewResponseMessage(List<ICraftingPreviewElement> stacks, UUID id, int quantity, boolean fluids) {
this.stacks = stacks;
this.id = id;
this.quantity = quantity;
this.fluids = fluids;
}
public static GridCraftingPreviewResponseMessage decode(PacketBuffer buf) {
UUID id = buf.readUniqueId();
int quantity = buf.readInt();
boolean fluids = buf.readBoolean();
List<ICraftingPreviewElement> stacks = new LinkedList<>();
int size = buf.readInt();
for (int i = 0; i < size; i++) {
ResourceLocation type = buf.readResourceLocation();
stacks.add(API.instance().getCraftingPreviewElementRegistry().get(type).apply(buf));
}
return new GridCraftingPreviewResponseMessage(stacks, id, quantity, fluids);
}
public static void encode(GridCraftingPreviewResponseMessage message, PacketBuffer buf) {
buf.writeUniqueId(message.id);
buf.writeInt(message.quantity);
buf.writeBoolean(message.fluids);
buf.writeInt(message.stacks.size());
for (ICraftingPreviewElement stack : message.stacks) {
buf.writeResourceLocation(stack.getId());
stack.write(buf);
}
}
public static void handle(GridCraftingPreviewResponseMessage message, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> {
Screen screen = Minecraft.getInstance().currentScreen;
if (screen instanceof CraftingSettingsScreen) {
screen = ((CraftingSettingsScreen) screen).getParent();
}
Minecraft.getInstance().displayGuiScreen(new CraftingPreviewScreen(screen, message.stacks, message.id, message.quantity, message.fluids, new TranslationTextComponent("gui.refinedstorage.crafting_preview")));
});
ctx.get().setPacketHandled(true);
}
}

View File

@@ -0,0 +1,63 @@
package com.raoulvdberge.refinedstorage.network.grid;
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
import com.raoulvdberge.refinedstorage.container.GridContainer;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.container.Container;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.fml.network.NetworkEvent;
import java.util.UUID;
import java.util.function.Supplier;
public class GridCraftingStartRequestMessage {
private UUID id;
private int quantity;
private boolean fluids;
public GridCraftingStartRequestMessage(UUID id, int quantity, boolean fluids) {
this.id = id;
this.quantity = quantity;
this.fluids = fluids;
}
public static GridCraftingStartRequestMessage decode(PacketBuffer buf) {
return new GridCraftingStartRequestMessage(
buf.readUniqueId(),
buf.readInt(),
buf.readBoolean()
);
}
public static void encode(GridCraftingStartRequestMessage message, PacketBuffer buf) {
buf.writeUniqueId(message.id);
buf.writeInt(message.quantity);
buf.writeBoolean(message.fluids);
}
public static void handle(GridCraftingStartRequestMessage message, Supplier<NetworkEvent.Context> ctx) {
ServerPlayerEntity player = ctx.get().getSender();
if (player != null) {
ctx.get().enqueueWork(() -> {
Container container = player.openContainer;
if (container instanceof GridContainer) {
IGrid grid = ((GridContainer) container).getGrid();
if (message.fluids) {
if (grid.getFluidHandler() != null) {
grid.getFluidHandler().onCraftingRequested(player, message.id, message.quantity);
}
} else {
if (grid.getItemHandler() != null) {
grid.getItemHandler().onCraftingRequested(player, message.id, message.quantity);
}
}
}
});
}
ctx.get().setPacketHandled(true);
}
}

View File

@@ -0,0 +1,30 @@
package com.raoulvdberge.refinedstorage.network.grid;
import com.raoulvdberge.refinedstorage.screen.grid.CraftingSettingsScreen;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.fml.network.NetworkEvent;
import java.util.function.Supplier;
public class GridCraftingStartResponseMessage {
public static GridCraftingStartResponseMessage decode(PacketBuffer buf) {
return new GridCraftingStartResponseMessage();
}
public static void encode(GridCraftingStartResponseMessage message, PacketBuffer buf) {
}
public static void handle(GridCraftingStartResponseMessage message, Supplier<NetworkEvent.Context> ctx) {
ctx.get().enqueueWork(() -> {
Screen screen = Minecraft.getInstance().currentScreen;
if (screen instanceof CraftingSettingsScreen) {
((CraftingSettingsScreen) screen).close();
}
});
ctx.get().setPacketHandled(true);
}
}

View File

@@ -52,7 +52,7 @@ public class GridFluidDeltaMessage {
for (StackListResult<FluidStack> delta : message.deltas) {
buf.writeInt(delta.getChange());
StackUtils.writeFluidGridStack(buf, delta.getStack(), delta.getId(), message.network, false, message.network.getFluidStorageTracker().get(delta.getStack()));
StackUtils.writeFluidGridStack(buf, delta.getStack(), delta.getId(), false, message.network, message.network.getFluidStorageTracker().get(delta.getStack()));
}
}

View File

@@ -1,6 +1,5 @@
package com.raoulvdberge.refinedstorage.network.grid;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import com.raoulvdberge.refinedstorage.api.util.StackListEntry;
import com.raoulvdberge.refinedstorage.screen.BaseScreen;
@@ -49,22 +48,16 @@ public class GridFluidUpdateMessage {
public static void encode(GridFluidUpdateMessage message, PacketBuffer buf) {
buf.writeBoolean(message.canCraft);
int size = message.network.getFluidStorageCache().getList().getStacks().size();
for (ICraftingPattern pattern : message.network.getCraftingManager().getPatterns()) {
size += pattern.getFluidOutputs().size();
}
int size = message.network.getFluidStorageCache().getList().getStacks().size() + message.network.getFluidStorageCache().getCraftablesList().getStacks().size();
buf.writeInt(size);
for (StackListEntry<FluidStack> stack : message.network.getFluidStorageCache().getList().getStacks()) {
StackUtils.writeFluidGridStack(buf, stack.getStack(), stack.getId(), message.network, false, message.network.getFluidStorageTracker().get(stack.getStack()));
StackUtils.writeFluidGridStack(buf, stack.getStack(), stack.getId(), false, message.network, message.network.getFluidStorageTracker().get(stack.getStack()));
}
for (ICraftingPattern pattern : message.network.getCraftingManager().getPatterns()) {
for (FluidStack output : pattern.getFluidOutputs()) {
// TODO
}
for (StackListEntry<FluidStack> stack : message.network.getFluidStorageCache().getCraftablesList().getStacks()) {
StackUtils.writeFluidGridStack(buf, stack.getStack(), stack.getId(), true, message.network, message.network.getFluidStorageTracker().get(stack.getStack()));
}
}

View File

@@ -52,7 +52,7 @@ public class GridItemDeltaMessage {
for (StackListResult<ItemStack> delta : message.deltas) {
buf.writeInt(delta.getChange());
StackUtils.writeItemGridStack(buf, delta.getStack(), delta.getId(), message.network, false, message.network.getItemStorageTracker().get(delta.getStack()));
StackUtils.writeItemGridStack(buf, delta.getStack(), delta.getId(), false, message.network, message.network.getItemStorageTracker().get(delta.getStack()));
}
}

View File

@@ -1,6 +1,5 @@
package com.raoulvdberge.refinedstorage.network.grid;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import com.raoulvdberge.refinedstorage.api.util.StackListEntry;
import com.raoulvdberge.refinedstorage.screen.BaseScreen;
@@ -49,22 +48,16 @@ public class GridItemUpdateMessage {
public static void encode(GridItemUpdateMessage message, PacketBuffer buf) {
buf.writeBoolean(message.canCraft);
int size = message.network.getItemStorageCache().getList().getStacks().size();
for (ICraftingPattern pattern : message.network.getCraftingManager().getPatterns()) {
size += pattern.getOutputs().size();
}
int size = message.network.getItemStorageCache().getList().getStacks().size() + message.network.getItemStorageCache().getCraftablesList().getStacks().size();
buf.writeInt(size);
for (StackListEntry<ItemStack> stack : message.network.getItemStorageCache().getList().getStacks()) {
StackUtils.writeItemGridStack(buf, stack.getStack(), stack.getId(), message.network, false, message.network.getItemStorageTracker().get(stack.getStack()));
StackUtils.writeItemGridStack(buf, stack.getStack(), stack.getId(), false, message.network, message.network.getItemStorageTracker().get(stack.getStack()));
}
for (ICraftingPattern pattern : message.network.getCraftingManager().getPatterns()) {
for (ItemStack output : pattern.getOutputs()) {
// TODO StackUtils.writeItemGridStack(buf, output, message.network, true, message.network.getItemStorageTracker().get(output));
}
for (StackListEntry<ItemStack> stack : message.network.getItemStorageCache().getCraftablesList().getStacks()) {
StackUtils.writeItemGridStack(buf, stack.getStack(), stack.getId(), true, message.network, message.network.getItemStorageTracker().get(stack.getStack()));
}
}

View File

@@ -50,7 +50,7 @@ public class PortableGridFluidDeltaMessage {
for (StackListResult<FluidStack> delta : message.deltas) {
buf.writeInt(delta.getChange());
StackUtils.writeFluidGridStack(buf, delta.getStack(), delta.getId(), null, false, message.portableGrid.getFluidStorageTracker().get(delta.getStack()));
StackUtils.writeFluidGridStack(buf, delta.getStack(), delta.getId(), false, null, message.portableGrid.getFluidStorageTracker().get(delta.getStack()));
}
}

View File

@@ -46,7 +46,7 @@ public class PortableGridFluidUpdateMessage {
buf.writeInt(size);
for (StackListEntry<FluidStack> stack : message.portableGrid.getFluidCache().getList().getStacks()) {
StackUtils.writeFluidGridStack(buf, stack.getStack(), stack.getId(), null, false, message.portableGrid.getFluidStorageTracker().get(stack.getStack()));
StackUtils.writeFluidGridStack(buf, stack.getStack(), stack.getId(), false, null, message.portableGrid.getFluidStorageTracker().get(stack.getStack()));
}
}

View File

@@ -52,7 +52,7 @@ public class PortableGridItemDeltaMessage {
for (StackListResult<ItemStack> delta : message.deltas) {
buf.writeInt(delta.getChange());
StackUtils.writeItemGridStack(buf, delta.getStack(), delta.getId(), null, false, message.portableGrid.getItemStorageTracker().get(delta.getStack()));
StackUtils.writeItemGridStack(buf, delta.getStack(), delta.getId(), false, null, message.portableGrid.getItemStorageTracker().get(delta.getStack()));
}
}

View File

@@ -46,7 +46,7 @@ public class PortableGridItemUpdateMessage {
buf.writeInt(size);
for (StackListEntry<ItemStack> stack : message.portableGrid.getItemCache().getList().getStacks()) {
StackUtils.writeItemGridStack(buf, stack.getStack(), stack.getId(), null, false, message.portableGrid.getItemStorageTracker().get(stack.getStack()));
StackUtils.writeItemGridStack(buf, stack.getStack(), stack.getId(), false, null, message.portableGrid.getItemStorageTracker().get(stack.getStack()));
}
}

View File

@@ -7,8 +7,6 @@ public class ProxyCommon {
API.deliver(e.getAsmData());
API.instance().getCraftingTaskRegistry().add(CraftingTaskFactory.ID, new CraftingTaskFactory());
API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementItemRender.ID, buf -> new CraftingMonitorElementItemRender(StackUtils.readItemStack(buf), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt()));
API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementFluidRender.ID, buf -> new CraftingMonitorElementFluidRender(StackUtils.readFluidStack(buf), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt()));
API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementError.ID, buf -> {
@@ -18,10 +16,6 @@ public class ProxyCommon {
return new CraftingMonitorElementError(API.instance().getCraftingMonitorElementRegistry().get(id).apply(buf), message);
});
API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementItemStack.ID, CraftingPreviewElementItemStack::fromByteBuf);
API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementFluidStack.ID, CraftingPreviewElementFluidStack::fromByteBuf);
API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementError.ID, CraftingPreviewElementError::fromByteBuf);
IntegrationInventorySorter.register();
}

View File

@@ -3,7 +3,7 @@ package com.raoulvdberge.refinedstorage.screen;
import com.raoulvdberge.refinedstorage.screen.widget.sidebutton.CrafterModeSideButton;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameterClientListener;
public class TileDataParameterClientListenerCrafter implements TileDataParameterClientListener<Boolean> {
public class CrafterTileDataParameterClientListener implements TileDataParameterClientListener<Boolean> {
@Override
public void onChanged(boolean initial, Boolean hasRoot) {
if (!hasRoot) {

View File

@@ -1,132 +0,0 @@
package com.raoulvdberge.refinedstorage.screen;
public class GuiHandler {
/*private Object getContainer(int ID, PlayerEntity player, TileEntity tile) {
switch (ID) {
case RSGui.IMPORTER:
return new ContainerImporter((TileImporter) tile, player);
case RSGui.EXPORTER:
return new ContainerExporter((TileExporter) tile, player);
case RSGui.DETECTOR:
return new ContainerDetector((TileDetector) tile, player);
case RSGui.DESTRUCTOR:
return new ContainerDestructor((TileDestructor) tile, player);
case RSGui.CONSTRUCTOR:
return new ContainerConstructor((TileConstructor) tile, player);
case RSGui.STORAGE:
return new ContainerStorage((TileStorage) tile, player);
case RSGui.EXTERNAL_STORAGE:
return new ContainerExternalStorage((TileExternalStorage) tile, player);
case RSGui.RELAY:
return new ContainerRelay((TileRelay) tile, player);
case RSGui.INTERFACE:
return new ContainerInterface((TileInterface) tile, player);
case RSGui.CRAFTING_MONITOR:
return new ContainerCraftingMonitor(((TileCraftingMonitor) tile).getNode(), (TileCraftingMonitor) tile, player);
case RSGui.WIRELESS_TRANSMITTER:
return new ContainerWirelessTransmitter((TileWirelessTransmitter) tile, player);
case RSGui.CRAFTER:
return new ContainerCrafter((TileCrafter) tile, player);
case RSGui.NETWORK_TRANSMITTER:
return new ContainerNetworkTransmitter((TileNetworkTransmitter) tile, player);
case RSGui.FLUID_INTERFACE:
return new ContainerFluidInterface((TileFluidInterface) tile, player);
case RSGui.FLUID_STORAGE:
return new ContainerFluidStorage((TileFluidStorage) tile, player);
case RSGui.DISK_MANIPULATOR:
return new ContainerDiskManipulator((TileDiskManipulator) tile, player);
case RSGui.READER_WRITER:
return new ContainerReaderWriter((IGuiReaderWriter) ((TileNode) tile).getNode(), (TileBase) tile, player);
case RSGui.SECURITY_MANAGER:
return new ContainerSecurityManager((TileSecurityManager) tile, player);
case RSGui.STORAGE_MONITOR:
return new ContainerStorageMonitor((TileStorageMonitor) tile, player);
case RSGui.CRAFTER_MANAGER:
return new ContainerCrafterManager((TileCrafterManager) tile, player, new ResizableDisplayDummy());
default:
return null;
}
}
@Override
public Object getServerGuiElement(int ID, PlayerEntity player, World world, int x, int y, int z) {
if (ID == RSGui.WIRELESS_CRAFTING_MONITOR) {
return getCraftingMonitorContainer(player, x);
}
return getContainer(ID, player, world.getTileEntity(new BlockPos(x, y, z)));
}
@Override
public Object getClientGuiElement(int ID, PlayerEntity player, World world, int x, int y, int z) {
TileEntity tile = world.getTileEntity(new BlockPos(x, y, z));
switch (ID) {
case RSGui.IMPORTER:
return new GuiImporter((ContainerImporter) getContainer(ID, player, tile), player.inventory);
case RSGui.EXPORTER:
return new GuiExporter((ContainerExporter) getContainer(ID, player, tile), player.inventory);
case RSGui.DETECTOR:
return new GuiDetector((ContainerDetector) getContainer(ID, player, tile), player.inventory);
case RSGui.DESTRUCTOR:
return new GuiDestructor((ContainerDestructor) getContainer(ID, player, tile), player.inventory);
case RSGui.CONSTRUCTOR:
return new GuiConstructor((ContainerConstructor) getContainer(ID, player, tile), player.inventory);
case RSGui.STORAGE:
return new GuiStorage((ContainerStorage) getContainer(ID, player, tile), ((TileStorage) tile).getNode(), player.inventory);
case RSGui.EXTERNAL_STORAGE:
return new GuiStorage((ContainerExternalStorage) getContainer(ID, player, tile), ((TileExternalStorage) tile).getNode(), player.inventory);
case RSGui.RELAY:
return new GuiRelay((ContainerRelay) getContainer(ID, player, tile), player.inventory);
case RSGui.INTERFACE:
return new GuiInterface((ContainerInterface) getContainer(ID, player, tile), player.inventory);
case RSGui.CRAFTING_MONITOR: {
NetworkNodeCraftingMonitor node = ((TileCraftingMonitor) tile).getNode();
return new GuiCraftingMonitor(new ContainerCraftingMonitor(node, (TileCraftingMonitor) tile, player), node, player.inventory);
}
case RSGui.WIRELESS_TRANSMITTER:
return new GuiWirelessTransmitter((ContainerWirelessTransmitter) getContainer(ID, player, tile), player.inventory);
case RSGui.CRAFTER:
return new GuiCrafter((ContainerCrafter) getContainer(ID, player, tile), player.inventory);
case RSGui.NETWORK_TRANSMITTER:
return new GuiNetworkTransmitter((ContainerNetworkTransmitter) getContainer(ID, player, tile), (TileNetworkTransmitter) tile, player.inventory);
case RSGui.FLUID_INTERFACE:
return new GuiFluidInterface((ContainerFluidInterface) getContainer(ID, player, tile), player.inventory);
case RSGui.FLUID_STORAGE:
return new GuiStorage((ContainerFluidStorage) getContainer(ID, player, tile), ((TileFluidStorage) tile).getNode(), player.inventory);
case RSGui.DISK_MANIPULATOR:
return new GuiDiskManipulator((ContainerDiskManipulator) getContainer(ID, player, tile), player.inventory);
case RSGui.WIRELESS_CRAFTING_MONITOR:
return getWirelessCraftingMonitorGui(player, x);
case RSGui.READER_WRITER:
return new GuiReaderWriter((ContainerReaderWriter) getContainer(ID, player, tile), (IGuiReaderWriter) ((TileNode) tile).getNode(), player.inventory);
case RSGui.SECURITY_MANAGER:
return new GuiSecurityManager((ContainerSecurityManager) getContainer(ID, player, tile), (TileSecurityManager) tile, player.inventory);
case RSGui.STORAGE_MONITOR:
return new GuiStorageMonitor((ContainerStorageMonitor) getContainer(ID, player, tile), player.inventory);
case RSGui.CRAFTER_MANAGER:
GuiCrafterManager crafterManagerGui = new GuiCrafterManager(((TileCrafterManager) tile).getNode(), player.inventory);
crafterManagerGui.setContainer(new ContainerCrafterManager((TileCrafterManager) tile, player, crafterManagerGui));
return crafterManagerGui;
default:
return null;
}
}
private WirelessCraftingMonitor getWirelessCraftingMonitor(PlayerEntity player, int invIndex) {
return new WirelessCraftingMonitor(player.inventory.getStackInSlot(invIndex));
}
private GuiCraftingMonitor getWirelessCraftingMonitorGui(PlayerEntity player, int invIndex) {
WirelessCraftingMonitor craftingMonitor = getWirelessCraftingMonitor(player, invIndex);
return new GuiCraftingMonitor(new ContainerCraftingMonitor(craftingMonitor, null, player), craftingMonitor, player.inventory);
}
private ContainerCraftingMonitor getCraftingMonitorContainer(PlayerEntity player, int invIndex) {
return new ContainerCraftingMonitor(getWirelessCraftingMonitor(player, invIndex), null, player);
}*/
}

View File

@@ -1,4 +1,4 @@
package com.raoulvdberge.refinedstorage.screen;
package com.raoulvdberge.refinedstorage.screen.grid;
import com.mojang.blaze3d.platform.GlStateManager;
import com.raoulvdberge.refinedstorage.RS;
@@ -6,10 +6,13 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElement;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskErrorType;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawers;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementError;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementFluidStack;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.ErrorCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.FluidCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.ItemCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.render.CraftingPreviewElementDrawers;
import com.raoulvdberge.refinedstorage.item.PatternItem;
import com.raoulvdberge.refinedstorage.network.grid.GridCraftingStartRequestMessage;
import com.raoulvdberge.refinedstorage.screen.BaseScreen;
import com.raoulvdberge.refinedstorage.screen.widget.ScrollbarWidget;
import com.raoulvdberge.refinedstorage.util.RenderUtils;
import net.minecraft.client.Minecraft;
@@ -21,45 +24,45 @@ import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.container.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.fluids.FluidStack;
import org.lwjgl.glfw.GLFW;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
public class GuiCraftingPreview extends BaseScreen {
public class CraftingPreviewScreen extends BaseScreen {
private static final int VISIBLE_ROWS = 5;
private List<ICraftingPreviewElement> stacks;
private Screen parent;
private final List<ICraftingPreviewElement> stacks;
private final Screen parent;
private ScrollbarWidget scrollbar;
private final ScrollbarWidget scrollbar;
private int hash;
private int quantity;
private Button startButton;
private Button cancelButton;
private final UUID id;
private final int quantity;
private final boolean fluids;
private ItemStack hoveringStack;
private FluidStack hoveringFluid;
private IElementDrawers drawers = new CraftingPreviewElementDrawers(this, font);
private boolean fluids;
public GuiCraftingPreview(Screen parent, List<ICraftingPreviewElement> stacks, int hash, int quantity, boolean fluids) {
public CraftingPreviewScreen(Screen parent, List<ICraftingPreviewElement> stacks, UUID id, int quantity, boolean fluids, ITextComponent title) {
super(new Container(null, 0) {
@Override
public boolean canInteractWith(PlayerEntity playerIn) {
public boolean canInteractWith(PlayerEntity player) {
return false;
}
}, 254, 201, null, null);
}, 254, 201, null, title);
this.stacks = new ArrayList<>(stacks);
this.parent = parent;
this.hash = hash;
this.id = id;
this.quantity = quantity;
this.fluids = fluids;
@@ -68,27 +71,22 @@ public class GuiCraftingPreview extends BaseScreen {
@Override
public void onPostInit(int x, int y) {
cancelButton = addButton(x + 55, y + 201 - 20 - 7, 50, 20, I18n.format("gui.cancel"), true, true, btn -> {
});
startButton = addButton(x + 129, y + 201 - 20 - 7, 50, 20, I18n.format("misc.refinedstorage:start"), true, true, btn -> {
});
addButton(x + 55, y + 201 - 20 - 7, 50, 20, I18n.format("gui.cancel"), true, true, btn -> close());
Button startButton = addButton(x + 129, y + 201 - 20 - 7, 50, 20, I18n.format("misc.refinedstorage.start"), true, true, btn -> startRequest());
startButton.active = stacks.stream().noneMatch(ICraftingPreviewElement::hasMissing) && getErrorType() == null;
}
@Override
public void tick(int x, int y) {
if (scrollbar != null) {
scrollbar.setEnabled(getRows() > VISIBLE_ROWS);
scrollbar.setMaxOffset(getRows() - VISIBLE_ROWS);
}
}
@Nullable
private CraftingTaskErrorType getErrorType() {
if (stacks.size() == 1 && stacks.get(0) instanceof CraftingPreviewElementError) {
return ((CraftingPreviewElementError) stacks.get(0)).getType();
if (stacks.size() == 1 && stacks.get(0) instanceof ErrorCraftingPreviewElement) {
return ((ErrorCraftingPreviewElement) stacks.get(0)).getType();
}
return null;
@@ -103,11 +101,13 @@ public class GuiCraftingPreview extends BaseScreen {
if (getErrorType() != null) {
fill(x + 7, y + 20, x + 228, y + 169, 0xFFDBDBDB);
}
scrollbar.render();
}
@Override
public void renderForeground(int mouseX, int mouseY) {
renderString(7, 7, I18n.format("gui.refinedstorage:crafting_preview"));
renderString(7, 7, title.getFormattedText());
int x = 7;
int y = 15;
@@ -118,27 +118,27 @@ public class GuiCraftingPreview extends BaseScreen {
GlStateManager.pushMatrix();
GlStateManager.scalef(scale, scale, 1);
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 11, scale), I18n.format("gui.refinedstorage:crafting_preview.error"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 11, scale), I18n.format("gui.refinedstorage.crafting_preview.error"));
switch (getErrorType()) {
case RECURSIVE: {
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 21, scale), I18n.format("gui.refinedstorage:crafting_preview.error.recursive.0"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 31, scale), I18n.format("gui.refinedstorage:crafting_preview.error.recursive.1"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 41, scale), I18n.format("gui.refinedstorage:crafting_preview.error.recursive.2"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 51, scale), I18n.format("gui.refinedstorage:crafting_preview.error.recursive.3"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 21, scale), I18n.format("gui.refinedstorage.crafting_preview.error.recursive.0"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 31, scale), I18n.format("gui.refinedstorage.crafting_preview.error.recursive.1"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 41, scale), I18n.format("gui.refinedstorage.crafting_preview.error.recursive.2"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 51, scale), I18n.format("gui.refinedstorage.crafting_preview.error.recursive.3"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 61, scale), I18n.format("gui.refinedstorage:crafting_preview.error.recursive.4"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 61, scale), I18n.format("gui.refinedstorage.crafting_preview.error.recursive.4"));
GlStateManager.popMatrix();
ICraftingPattern pattern = /* TODO ItemPattern.getPatternFromCache(parent.getMinecraft().world, (ItemStack) stacks.get(0).getElement())*/null;
ICraftingPattern pattern = PatternItem.fromCache(parent.getMinecraft().world, (ItemStack) stacks.get(0).getElement());
int yy = 83;
for (ItemStack output : pattern.getOutputs()) {
if (output != null) {
GlStateManager.pushMatrix();
GlStateManager.scalef(scale, scale, 1);
renderString(RenderUtils.getOffsetOnScale(x + 25, scale), RenderUtils.getOffsetOnScale(yy + 6, scale), output.getDisplayName().getFormattedText()); // TODO getFOrmattedText
renderString(RenderUtils.getOffsetOnScale(x + 25, scale), RenderUtils.getOffsetOnScale(yy + 6, scale), output.getDisplayName().getFormattedText());
GlStateManager.popMatrix();
RenderHelper.enableGUIStandardItemLighting();
@@ -153,8 +153,8 @@ public class GuiCraftingPreview extends BaseScreen {
break;
}
case TOO_COMPLEX: {
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 21, scale), I18n.format("gui.refinedstorage:crafting_preview.error.too_complex.0"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 31, scale), I18n.format("gui.refinedstorage:crafting_preview.error.too_complex.1"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 21, scale), I18n.format("gui.refinedstorage.crafting_preview.error.too_complex.0"));
renderString(RenderUtils.getOffsetOnScale(x + 5, scale), RenderUtils.getOffsetOnScale(y + 31, scale), I18n.format("gui.refinedstorage.crafting_preview.error.too_complex.1"));
GlStateManager.popMatrix();
@@ -177,10 +177,10 @@ public class GuiCraftingPreview extends BaseScreen {
stack.draw(x, y + 5, drawers);
if (RenderUtils.inBounds(x + 5, y + 7, 16, 16, mouseX, mouseY)) {
this.hoveringStack = stack.getId().equals(CraftingPreviewElementItemStack.ID) ? (ItemStack) stack.getElement() : null;
this.hoveringStack = stack.getId().equals(ItemCraftingPreviewElement.ID) ? (ItemStack) stack.getElement() : null;
if (this.hoveringStack == null) {
this.hoveringFluid = stack.getId().equals(CraftingPreviewElementFluidStack.ID) ? (FluidStack) stack.getElement() : null;
this.hoveringFluid = stack.getId().equals(FluidCraftingPreviewElement.ID) ? (FluidStack) stack.getElement() : null;
}
}
}
@@ -202,37 +202,61 @@ public class GuiCraftingPreview extends BaseScreen {
super.render(mouseX, mouseY, partialTicks);
if (hoveringStack != null) {
renderTooltip(hoveringStack, mouseX, mouseY, hoveringStack.getTooltip(Minecraft.getInstance().player, Minecraft.getInstance().gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL));
renderTooltip(
hoveringStack,
mouseX,
mouseY,
hoveringStack.getTooltip(
Minecraft.getInstance().player,
Minecraft.getInstance().gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
).stream().map(ITextComponent::getFormattedText).collect(Collectors.toList())
);
} else if (hoveringFluid != null) {
renderTooltip(mouseX, mouseY, hoveringFluid.getDisplayName().getFormattedText()); // TODO gft
}
}
/* TODO
@Override
protected void keyTyped(char character, int keyCode) throws IOException {
if (keyCode == Keyboard.KEY_RETURN && startButton.enabled) {
startRequest();
} else if (keyCode == Keyboard.KEY_ESCAPE) {
close();
} else {
super.keyTyped(character, keyCode);
renderTooltip(mouseX, mouseY, hoveringFluid.getDisplayName().getFormattedText());
}
}
@Override
protected void actionPerformed(GuiButton button) throws IOException {
super.actionPerformed(button);
public void mouseMoved(double mx, double my) {
scrollbar.mouseMoved(mx, my);
if (button.id == startButton.id) {
startRequest();
} else if (button.id == cancelButton.id) {
close();
super.mouseMoved(mx, my);
}
@Override
public boolean mouseClicked(double mx, double my, int button) {
return scrollbar.mouseClicked(mx, my, button) || super.mouseClicked(mx, my, button);
}
@Override
public boolean mouseReleased(double mx, double my, int button) {
return scrollbar.mouseReleased(mx, my, button) || super.mouseReleased(mx, my, button);
}
@Override
public boolean mouseScrolled(double x, double y, double delta) {
return this.scrollbar.mouseScrolled(x, y, delta) || super.mouseScrolled(x, y, delta);
}
@Override
public boolean keyPressed(int key, int scanCode, int modifiers) {
if (key == GLFW.GLFW_KEY_ENTER || key == GLFW.GLFW_KEY_KP_ENTER) {
startRequest();
return true;
}
if (key == GLFW.GLFW_KEY_ESCAPE) {
close();
return true;
}
return super.keyPressed(key, scanCode, modifiers);
}
}*/
private void startRequest() {
// TODO RS.INSTANCE.network.sendToServer(new MessageGridCraftingStart(hash, quantity, fluids));
RS.NETWORK_HANDLER.sendToServer(new GridCraftingStartRequestMessage(id, quantity, fluids));
close();
}
@@ -242,6 +266,6 @@ public class GuiCraftingPreview extends BaseScreen {
}
private void close() {
// TODO FMLClientHandler.instance().showGuiScreen(parent);
minecraft.displayGuiScreen(parent);
}
}

View File

@@ -1,7 +1,8 @@
package com.raoulvdberge.refinedstorage.screen.grid;
import com.google.common.primitives.Ints;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.container.CraftingSettingsContainer;
import com.raoulvdberge.refinedstorage.network.grid.GridCraftingPreviewRequestMessage;
import com.raoulvdberge.refinedstorage.screen.AmountSpecifyingScreen;
import com.raoulvdberge.refinedstorage.screen.BaseScreen;
import com.raoulvdberge.refinedstorage.screen.grid.stack.FluidGridStack;
@@ -11,10 +12,10 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraftforge.fluids.FluidAttributes;
public class GuiGridCraftingSettings extends AmountSpecifyingScreen<CraftingSettingsContainer> {
public class CraftingSettingsScreen extends AmountSpecifyingScreen<CraftingSettingsContainer> {
private IGridStack stack;
public GuiGridCraftingSettings(BaseScreen parent, PlayerEntity player, IGridStack stack) {
public CraftingSettingsScreen(BaseScreen parent, PlayerEntity player, IGridStack stack) {
super(parent, new CraftingSettingsContainer(player, stack), 172, 99, player.inventory, new TranslationTextComponent("container.crafting"));
this.stack = stack;
@@ -22,7 +23,7 @@ public class GuiGridCraftingSettings extends AmountSpecifyingScreen<CraftingSett
@Override
protected String getOkButtonText() {
return I18n.format("misc.refinedstorage:start");
return I18n.format("misc.refinedstorage.start");
}
@Override
@@ -61,12 +62,14 @@ public class GuiGridCraftingSettings extends AmountSpecifyingScreen<CraftingSett
}
protected void onOkButtonPressed(boolean shiftDown) {
Integer quantity = Ints.tryParse(amountField.getText());
try {
int quantity = Integer.parseInt(amountField.getText());
if (quantity != null && quantity > 0) {
// TODO RS.INSTANCE.network.sendToServer(new MessageGridCraftingPreview(stack.getHash(), quantity, shiftDown, stack instanceof GridStackFluid));
RS.NETWORK_HANDLER.sendToServer(new GridCraftingPreviewRequestMessage(stack.getId(), quantity, shiftDown, stack instanceof FluidGridStack));
okButton.active = false;
} catch (NumberFormatException e) {
// NO OP
}
}
}

View File

@@ -405,7 +405,7 @@ public class GridScreen extends BaseScreen<GridContainer> implements IScreenInfo
List<String> textLines = Lists.newArrayList(gridStack.getTooltip().split("\n"));
List<String> smallTextLines = Lists.newArrayList();
if (!gridStack.doesDisplayCraftText()) {
if (!gridStack.isCraftable()) {
smallTextLines.add(I18n.format("misc.refinedstorage.total", gridStack.getFormattedFullQuantity()));
}
@@ -465,8 +465,8 @@ public class GridScreen extends BaseScreen<GridContainer> implements IScreenInfo
IGridStack stack = view.getStacks().get(slotNumber);
if (isPulling) {
if (stack.isCraftable() && view.canCraft() && (stack.doesDisplayCraftText() || (hasShiftDown() && hasControlDown()))) {
// @TODO FMLCommonHandler.instance().showGuiScreen(new GuiGridCraftingSettings(this, ((ContainerGrid) this.inventorySlots).getPlayer(), stack));
if (stack.isCraftable() && view.canCraft()) {
minecraft.displayGuiScreen(new CraftingSettingsScreen(this, playerInventory.player, stack));
} else if (grid.getGridType() == GridType.FLUID && held.isEmpty()) {
RS.NETWORK_HANDLER.sendToServer(new GridFluidPullMessage(view.getStacks().get(slotNumber).getId(), hasShiftDown()));
} else if (grid.getGridType() != GridType.FLUID) {

View File

@@ -17,16 +17,14 @@ public class FluidGridStack implements IGridStack {
@Nullable
private StorageTrackerEntry entry;
private boolean craftable;
private boolean displayCraftText;
private String modId;
private String modName;
public FluidGridStack(UUID id, FluidStack stack, @Nullable StorageTrackerEntry entry, boolean craftable, boolean displayCraftText) {
public FluidGridStack(UUID id, FluidStack stack, @Nullable StorageTrackerEntry entry, boolean craftable) {
this.id = id;
this.stack = stack;
this.entry = entry;
this.craftable = craftable;
this.displayCraftText = displayCraftText;
}
public FluidStack getStack() {
@@ -38,16 +36,6 @@ public class FluidGridStack implements IGridStack {
return craftable;
}
@Override
public boolean doesDisplayCraftText() {
return displayCraftText;
}
@Override
public void setDisplayCraftText(boolean displayCraftText) {
this.displayCraftText = displayCraftText;
}
@Override
public UUID getId() {
return id;
@@ -99,7 +87,8 @@ public class FluidGridStack implements IGridStack {
@Override
public int getQuantity() {
return stack.getAmount();
// The isCraftable check is needed so sorting is applied correctly
return isCraftable() ? 0 : stack.getAmount();
}
@Override
@@ -113,7 +102,7 @@ public class FluidGridStack implements IGridStack {
String text;
if (displayCraftText) {
if (isCraftable()) {
text = I18n.format("gui.refinedstorage.grid.craft");
} else {
text = API.instance().getQuantityFormatter().formatInBucketFormWithOnlyTrailingDigitsIfZero(getQuantity());

View File

@@ -33,8 +33,4 @@ public interface IGridStack {
void setTrackerEntry(@Nullable StorageTrackerEntry entry);
boolean isCraftable();
boolean doesDisplayCraftText();
void setDisplayCraftText(boolean displayCraftText);
}

View File

@@ -19,7 +19,6 @@ public class ItemGridStack implements IGridStack {
private ItemStack stack;
private String cachedName;
private boolean craftable;
private boolean displayCraftText;
private String[] oreIds = null;
@Nullable
private StorageTrackerEntry entry;
@@ -31,11 +30,10 @@ public class ItemGridStack implements IGridStack {
this.stack = stack;
}
public ItemGridStack(UUID id, ItemStack stack, boolean craftable, boolean displayCraftText, StorageTrackerEntry entry) {
public ItemGridStack(UUID id, ItemStack stack, boolean craftable, StorageTrackerEntry entry) {
this.id = id;
this.stack = stack;
this.craftable = craftable;
this.displayCraftText = displayCraftText;
this.entry = entry;
}
@@ -55,20 +53,6 @@ public class ItemGridStack implements IGridStack {
return craftable;
}
@Override
public boolean doesDisplayCraftText() {
return displayCraftText;
}
@Override
public void setDisplayCraftText(boolean displayCraftText) {
this.displayCraftText = displayCraftText;
if (displayCraftText) {
this.stack.setCount(1);
}
}
@Override
public UUID getId() {
return id;
@@ -142,7 +126,8 @@ public class ItemGridStack implements IGridStack {
@Override
public int getQuantity() {
return doesDisplayCraftText() ? 0 : stack.getCount();
// The isCraftable check is needed so sorting is applied correctly
return isCraftable() ? 0 : stack.getCount();
}
@Override
@@ -154,7 +139,7 @@ public class ItemGridStack implements IGridStack {
public void draw(BaseScreen gui, int x, int y) {
String text = null;
if (displayCraftText) {
if (craftable) {
text = I18n.format("gui.refinedstorage.grid.craft");
} else if (stack.getCount() > 1) {
text = API.instance().getQuantityFormatter().formatWithUnits(getQuantity());

View File

@@ -17,11 +17,6 @@ public class FluidGridView extends BaseGridView {
map.clear();
for (IGridStack stack : stacks) {
// Don't let a craftable stack override a normal stack
if (stack.doesDisplayCraftText() && map.containsKey(stack.getId())) {
continue;
}
map.put(stack.getId(), stack);
}
}
@@ -40,20 +35,12 @@ public class FluidGridView extends BaseGridView {
map.put(stack.getId(), stack);
} else {
if (existing.getStack().getAmount() + delta <= 0) {
if (existing.isCraftable()) {
existing.setDisplayCraftText(true);
} else {
map.remove(existing.getId());
}
} else {
if (existing.doesDisplayCraftText()) {
existing.setDisplayCraftText(false);
existing.getStack().grow(delta);
existing.getStack().setAmount(delta);
map.remove(existing.getId());
} else {
existing.getStack().grow(delta);
}
}
existing.setTrackerEntry(stack.getTrackerEntry());
}

View File

@@ -17,11 +17,6 @@ public class ItemGridView extends BaseGridView {
map.clear();
for (IGridStack stack : stacks) {
// Don't let a craftable stack override a normal stack
if (stack.doesDisplayCraftText() && map.containsKey(stack.getId())) {
continue;
}
map.put(stack.getId(), stack);
}
}
@@ -40,20 +35,12 @@ public class ItemGridView extends BaseGridView {
map.put(stack.getId(), stack);
} else {
if (existing.getStack().getCount() + delta <= 0) {
if (existing.isCraftable()) {
existing.setDisplayCraftText(true);
} else {
map.remove(existing.getId());
}
} else {
if (existing.doesDisplayCraftText()) {
existing.setDisplayCraftText(false);
existing.getStack().grow(delta);
existing.getStack().setCount(delta);
map.remove(existing.getId());
} else {
existing.getStack().grow(delta);
}
}
existing.setTrackerEntry(stack.getTrackerEntry());
}

View File

@@ -2,7 +2,7 @@ package com.raoulvdberge.refinedstorage.tile;
import com.raoulvdberge.refinedstorage.RSTiles;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.CrafterNetworkNode;
import com.raoulvdberge.refinedstorage.screen.TileDataParameterClientListenerCrafter;
import com.raoulvdberge.refinedstorage.screen.CrafterTileDataParameterClientListener;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.util.Direction;
@@ -18,7 +18,7 @@ import javax.annotation.Nullable;
public class CrafterTile extends NetworkNodeTile<CrafterNetworkNode> {
public static final TileDataParameter<Integer, CrafterTile> MODE = new TileDataParameter<>(DataSerializers.VARINT, CrafterNetworkNode.CrafterMode.IGNORE.ordinal(), t -> t.getNode().getMode().ordinal(), (t, v) -> t.getNode().setMode(CrafterNetworkNode.CrafterMode.getById(v)));
private static final TileDataParameter<Boolean, CrafterTile> HAS_ROOT = new TileDataParameter<>(DataSerializers.BOOLEAN, false, t -> t.getNode().getRootContainerNotSelf().isPresent(), null, (t, v) -> new TileDataParameterClientListenerCrafter().onChanged(t, v));
private static final TileDataParameter<Boolean, CrafterTile> HAS_ROOT = new TileDataParameter<>(DataSerializers.BOOLEAN, false, t -> t.getNode().getRootContainerNotSelf().isPresent(), null, (t, v) -> new CrafterTileDataParameterClientListener().onChanged(t, v));
private LazyOptional<IItemHandler> patternsCapability = LazyOptional.of(() -> getNode().getPatternItems());

View File

@@ -76,19 +76,12 @@ public final class StackUtils {
}
}
public static void writeItemGridStack(PacketBuffer buf, ItemStack stack, UUID id, @Nullable INetwork network, boolean displayCraftText, @Nullable StorageTrackerEntry entry) {
public static void writeItemGridStack(PacketBuffer buf, ItemStack stack, UUID id, boolean craftable, @Nullable INetwork network, @Nullable StorageTrackerEntry entry) {
writeItemStack(buf, stack);
buf.writeBoolean(craftable);
buf.writeUniqueId(id);
if (network != null) {
buf.writeBoolean(network.getCraftingManager().getPattern(stack) != null);
buf.writeBoolean(displayCraftText);
} else {
buf.writeBoolean(false);
buf.writeBoolean(false);
}
if (entry == null) {
buf.writeBoolean(false);
} else {
@@ -101,31 +94,24 @@ public final class StackUtils {
public static ItemGridStack readItemGridStack(PacketBuffer buf) {
ItemStack stack = readItemStack(buf);
UUID id = buf.readUniqueId();
boolean craftable = buf.readBoolean();
boolean displayCraftText = buf.readBoolean();
UUID id = buf.readUniqueId();
StorageTrackerEntry entry = null;
if (buf.readBoolean()) {
entry = new StorageTrackerEntry(buf.readLong(), buf.readString());
}
return new ItemGridStack(id, stack, craftable, displayCraftText, entry);
return new ItemGridStack(id, stack, craftable, entry);
}
public static void writeFluidGridStack(PacketBuffer buf, FluidStack stack, UUID id, @Nullable INetwork network, boolean displayCraftText, @Nullable StorageTrackerEntry entry) {
public static void writeFluidGridStack(PacketBuffer buf, FluidStack stack, UUID id, boolean craftable, @Nullable INetwork network, @Nullable StorageTrackerEntry entry) {
stack.writeToPacket(buf);
buf.writeBoolean(craftable);
buf.writeUniqueId(id);
if (network != null) {
buf.writeBoolean(network.getCraftingManager().getPattern(stack) != null);
buf.writeBoolean(displayCraftText);
} else {
buf.writeBoolean(false);
buf.writeBoolean(false);
}
if (entry == null) {
buf.writeBoolean(false);
} else {
@@ -138,16 +124,15 @@ public final class StackUtils {
public static FluidGridStack readFluidGridStack(PacketBuffer buf) {
FluidStack stack = FluidStack.readFromPacket(buf);
UUID id = buf.readUniqueId();
boolean craftable = buf.readBoolean();
boolean displayCraftText = buf.readBoolean();
UUID id = buf.readUniqueId();
StorageTrackerEntry entry = null;
if (buf.readBoolean()) {
entry = new StorageTrackerEntry(buf.readLong(), buf.readString());
}
return new FluidGridStack(id, stack, entry, craftable, displayCraftText);
return new FluidGridStack(id, stack, entry, craftable);
}
@SuppressWarnings("unchecked")

View File

@@ -77,7 +77,7 @@ public final class WorldUtils {
}
public static void sendNoPermissionMessage(PlayerEntity player) {
player.sendMessage(new TranslationTextComponent("misc.refinedstorage:security.no_permission").setStyle(new Style().setColor(TextFormatting.RED)));
player.sendMessage(new TranslationTextComponent("misc.refinedstorage.security.no_permission").setStyle(new Style().setColor(TextFormatting.RED)));
}
public static RayTraceResult rayTracePlayer(World world, PlayerEntity player) {

View File

@@ -56,18 +56,18 @@
"gui.refinedstorage.fluid_interface": "Fluid Interface",
"gui.refinedstorage.fluid_interface.in": "In",
"gui.refinedstorage.fluid_interface.out": "Out",
"gui.refinedstorage:crafting_preview": "Crafting Preview",
"gui.refinedstorage:crafting_preview.to_craft": "To craft: %d",
"gui.refinedstorage:crafting_preview.available": "Available: %d",
"gui.refinedstorage:crafting_preview.missing": "Missing: %d",
"gui.refinedstorage:crafting_preview.error": "Request failed",
"gui.refinedstorage:crafting_preview.error.recursive.0": "One of the crafting ingredients ended up needing",
"gui.refinedstorage:crafting_preview.error.recursive.1": "itself.",
"gui.refinedstorage:crafting_preview.error.recursive.2": "You need to remove the pattern or make sure",
"gui.refinedstorage:crafting_preview.error.recursive.3": "the pattern is not used during crafting.",
"gui.refinedstorage:crafting_preview.error.recursive.4": "Offending pattern:",
"gui.refinedstorage:crafting_preview.error.too_complex.0": "The crafting task calculation was too complex",
"gui.refinedstorage:crafting_preview.error.too_complex.1": "and was stopped to avoid server strain.",
"gui.refinedstorage.crafting_preview": "Crafting Preview",
"gui.refinedstorage.crafting_preview.to_craft": "To craft: %d",
"gui.refinedstorage.crafting_preview.available": "Available: %d",
"gui.refinedstorage.crafting_preview.missing": "Missing: %d",
"gui.refinedstorage.crafting_preview.error": "Request failed",
"gui.refinedstorage.crafting_preview.error.recursive.0": "One of the crafting ingredients ended up needing",
"gui.refinedstorage.crafting_preview.error.recursive.1": "itself.",
"gui.refinedstorage.crafting_preview.error.recursive.2": "You need to remove the pattern or make sure",
"gui.refinedstorage.crafting_preview.error.recursive.3": "the pattern is not used during crafting.",
"gui.refinedstorage.crafting_preview.error.recursive.4": "Offending pattern:",
"gui.refinedstorage.crafting_preview.error.too_complex.0": "The crafting task calculation was too complex",
"gui.refinedstorage.crafting_preview.error.too_complex.1": "and was stopped to avoid server strain.",
"gui.refinedstorage.security_manager": "Security Manager",
"gui.refinedstorage.security_manager.configure": "Configure",
"gui.refinedstorage.security_manager.permission.0": "Insert",
@@ -103,8 +103,8 @@
"misc.refinedstorage.pattern.outputs": "Outputs",
"misc.refinedstorage.pattern.invalid": "Invalid pattern",
"misc.refinedstorage.pattern.oredict": "Uses ore dictionary",
"misc.refinedstorage:security.no_permission": "You have no permission to perform that action.",
"misc.refinedstorage:start": "Start",
"misc.refinedstorage.security.no_permission": "You have no permission to perform that action.",
"misc.refinedstorage.start": "Start",
"misc.refinedstorage.clear": "Clear",
"misc.refinedstorage.set": "Set",
"misc.refinedstorage:cancel_all": "Cancel All",