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.network.node.INetworkNode;
import com.raoulvdberge.refinedstorage.api.storage.StorageType; import com.raoulvdberge.refinedstorage.api.storage.StorageType;
import com.raoulvdberge.refinedstorage.apiimpl.API; 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.NetworkListener;
import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeListener; import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkNodeListener;
import com.raoulvdberge.refinedstorage.apiimpl.network.grid.factory.*; 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.ITEM, new ItemExternalStorageProvider());
API.instance().addExternalStorageProvider(StorageType.FLUID, new FluidExternalStorageProvider()); 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 StorageBlockLootFunctionSerializer());
LootFunctionManager.registerFunction(new PortableGridBlockLootFunctionSerializer()); LootFunctionManager.registerFunction(new PortableGridBlockLootFunctionSerializer());
LootFunctionManager.registerFunction(new CrafterLootFunctionSerializer()); LootFunctionManager.registerFunction(new CrafterLootFunctionSerializer());

View File

@@ -131,14 +131,14 @@ public interface ICraftingManager {
int track(@Nonnull FluidStack stack, int size); 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(); List<ICraftingPattern> getPatterns();
/** /**
* Rebuilds the pattern list. * Rebuilds the pattern list.
*/ */
void rebuild(); void invalidate();
/** /**
* Return a crafting pattern from an item stack. * 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.item.ItemStack;
import net.minecraft.util.NonNullList; import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import java.util.List; 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} * @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 * @param other the other pattern

View File

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

View File

@@ -1,6 +1,7 @@
package com.raoulvdberge.refinedstorage.api.autocrafting.preview; 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 javax.annotation.Nullable;
import java.util.function.Function; import java.util.function.Function;
@@ -15,7 +16,7 @@ public interface ICraftingPreviewElementRegistry {
* @param id the id, as specified in {@link ICraftingPreviewElement#getId()} * @param id the id, as specified in {@link ICraftingPreviewElement#getId()}
* @param factory the factory * @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. * Returns a factory from the registry.
@@ -24,5 +25,5 @@ public interface ICraftingPreviewElementRegistry {
* @return the factory, or null if no factory was found * @return the factory, or null if no factory was found
*/ */
@Nullable @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; package com.raoulvdberge.refinedstorage.api.autocrafting.registry;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
@@ -14,7 +16,7 @@ public interface ICraftingTaskRegistry {
* @param id the id of the factory * @param id the id of the factory
* @param factory 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. * 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 * @return the factory, or null if there is no factory
*/ */
@Nullable @Nullable
ICraftingTaskFactory get(String id); ICraftingTaskFactory get(ResourceLocation id);
} }

View File

@@ -80,6 +80,11 @@ public interface IStorageCache<T> {
*/ */
IStackList<T> getList(); IStackList<T> getList();
/**
* @return a list of craftables
*/
IStackList<T> getCraftablesList();
/** /**
* @return the storages connected to this network * @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.item.ItemStack;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT; import net.minecraft.nbt.ListNBT;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
@@ -128,7 +129,7 @@ public class CraftingManager implements ICraftingManager {
for (int i = 0; i < tasksToRead.size(); ++i) { for (int i = 0; i < tasksToRead.size(); ++i) {
CompoundNBT taskTag = tasksToRead.getCompound(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); CompoundNBT taskData = taskTag.getCompound(NBT_TASK_DATA);
ICraftingTaskFactory factory = API.instance().getCraftingTaskRegistry().get(taskType); ICraftingTaskFactory factory = API.instance().getCraftingTaskRegistry().get(taskType);
@@ -196,7 +197,7 @@ public class CraftingManager implements ICraftingManager {
for (ICraftingTask task : tasks.values()) { for (ICraftingTask task : tasks.values()) {
CompoundNBT taskTag = new CompoundNBT(); 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())); taskTag.put(NBT_TASK_DATA, task.writeToNbt(new CompoundNBT()));
list.add(taskTag); list.add(taskTag);
@@ -355,7 +356,10 @@ public class CraftingManager implements ICraftingManager {
} }
@Override @Override
public void rebuild() { public void invalidate() {
this.network.getItemStorageCache().getCraftablesList().clear();
this.network.getFluidStorageCache().getCraftablesList().clear();
this.patterns.clear(); this.patterns.clear();
this.containerInventories.clear(); this.containerInventories.clear();
@@ -370,7 +374,17 @@ public class CraftingManager implements ICraftingManager {
containers.sort((a, b) -> b.getPosition().compareTo(a.getPosition())); containers.sort((a, b) -> b.getPosition().compareTo(a.getPosition()));
for (ICraftingPatternContainer container : containers) { 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(); IItemHandlerModifiable handler = container.getPatternInventory();
if (handler != null) { 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.IRecipeType;
import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.NonNullList; import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
@@ -82,14 +83,14 @@ public class CraftingPattern implements ICraftingPattern {
} }
FluidStack fluidInput = PatternItem.getFluidInputSlot(stack, i); FluidStack fluidInput = PatternItem.getFluidInputSlot(stack, i);
if (fluidInput != null) { if (!fluidInput.isEmpty()) {
this.valid = true; this.valid = true;
fluidInputs.add(fluidInput); fluidInputs.add(fluidInput);
} }
FluidStack fluidOutput = PatternItem.getFluidOutputSlot(stack, i); FluidStack fluidOutput = PatternItem.getFluidOutputSlot(stack, i);
if (fluidOutput != null) { if (!fluidOutput.isEmpty()) {
this.valid = true; this.valid = true;
fluidOutputs.add(fluidOutput); fluidOutputs.add(fluidOutput);
@@ -241,7 +242,7 @@ public class CraftingPattern implements ICraftingPattern {
} }
@Override @Override
public String getId() { public ResourceLocation getId() {
return CraftingTaskFactory.ID; 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.ICraftingPatternChain;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChainList; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChainList;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
public class CraftingPatternChainList implements ICraftingPatternChainList { public class CraftingPatternChainList implements ICraftingPatternChainList {
/*private Map<ICraftingPattern, CraftingPatternChain> map = new TCustomHashMap<>(new HashingStrategy<ICraftingPattern>() { private final Map<Key, CraftingPatternChain> map = new HashMap<>();
@Override
public int computeHashCode(ICraftingPattern pattern) {
return pattern.getChainHashCode();
}
@Override public CraftingPatternChainList(Collection<ICraftingPattern> patterns) {
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) {
for (ICraftingPattern pattern : patterns) { for (ICraftingPattern pattern : patterns) {
CraftingPatternChain chain = map.get(pattern); Key key = new Key(pattern);
CraftingPatternChain chain = map.get(key);
if (chain == null) { if (chain == null) {
map.put(pattern, chain = new CraftingPatternChain()); map.put(key, chain = new CraftingPatternChain());
} }
chain.addPattern(pattern); chain.addPattern(pattern);
@@ -36,11 +27,30 @@ public class CraftingPatternChainList implements ICraftingPatternChainList {
@Override @Override
public ICraftingPatternChain getChain(ICraftingPattern pattern) { public ICraftingPatternChain getChain(ICraftingPattern pattern) {
ICraftingPatternChain chain = map.get(pattern); ICraftingPatternChain chain = map.get(new Key(pattern));
if (chain == null) { if (chain == null) {
throw new IllegalStateException("Pattern was not found in pattern chain"); throw new IllegalStateException("Pattern was not found in pattern chain");
} }
return 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.ICraftingPreviewElement;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry; 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 javax.annotation.Nullable;
import java.util.HashMap; import java.util.HashMap;
@@ -10,16 +11,16 @@ import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
public class CraftingPreviewElementRegistry implements ICraftingPreviewElementRegistry { public class CraftingPreviewElementRegistry implements ICraftingPreviewElementRegistry {
private Map<String, Function<ByteBuf, ICraftingPreviewElement>> registry = new HashMap<>(); private Map<ResourceLocation, Function<PacketBuffer, ICraftingPreviewElement>> registry = new HashMap<>();
@Override @Override
public void add(String id, Function<ByteBuf, ICraftingPreviewElement> factory) { public void add(ResourceLocation id, Function<PacketBuffer, ICraftingPreviewElement> factory) {
registry.put(id, factory); registry.put(id, factory);
} }
@Nullable @Nullable
@Override @Override
public Function<ByteBuf, ICraftingPreviewElement> get(String id) { public Function<PacketBuffer, ICraftingPreviewElement> get(ResourceLocation id) {
return registry.get(id); return registry.get(id);
} }
} }

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,6 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry; 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.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskFactory; import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskFactory;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskReadException; 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.api.network.INetwork;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.CraftingTask; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.CraftingTask;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
public class CraftingTaskFactory implements ICraftingTaskFactory { public class CraftingTaskFactory implements ICraftingTaskFactory {
public static final String ID = "normal"; public static final ResourceLocation ID = new ResourceLocation(RS.ID, "default");
@Nonnull @Nonnull
@Override @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.ICraftingTaskFactory;
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry;
import net.minecraft.util.ResourceLocation;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class CraftingTaskRegistry implements ICraftingTaskRegistry { public class CraftingTaskRegistry implements ICraftingTaskRegistry {
private Map<String, ICraftingTaskFactory> registry = new HashMap<>(); private Map<ResourceLocation, ICraftingTaskFactory> registry = new HashMap<>();
@Override @Override
public void add(String id, ICraftingTaskFactory factory) { public void add(ResourceLocation id, ICraftingTaskFactory factory) {
registry.put(id, factory); registry.put(id, factory);
} }
@Override @Override
@Nullable @Nullable
public ICraftingTaskFactory get(String id) { public ICraftingTaskFactory get(ResourceLocation id) {
return registry.get(id); return registry.get(id);
} }
} }

View File

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

View File

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

View File

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

View File

@@ -77,7 +77,7 @@ public class CrafterNetworkNode extends NetworkNode implements ICraftingPatternC
} }
if (network != null) { 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) { protected void onConnectedStateChange(INetwork network, boolean state) {
super.onConnectedStateChange(network, state); super.onConnectedStateChange(network, state);
network.getCraftingManager().rebuild(); network.getCraftingManager().invalidate();
} }
@Override @Override
@@ -168,7 +168,7 @@ public class CrafterNetworkNode extends NetworkNode implements ICraftingPatternC
super.onDirectionChanged(direction); super.onDirectionChanged(direction);
if (network != null) { 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.color4f(1, 1, 1, 1);
GlStateManager.disableLighting(); GlStateManager.disableLighting();
gui.bindTexture(RS.ID, "gui/crafting_preview.png"); screen.bindTexture(RS.ID, "gui/crafting_preview.png");
gui.blit(x + itemWidth - 12 - 2, y + itemHeight - 12 - 2, 0, 244, 12, 12); screen.blit(x + itemWidth - 12 - 2, y + itemHeight - 12 - 2, 0, 244, 12, 12);
}; };
public CraftingMonitorElementDrawers(BaseScreen gui, FontRenderer fontRenderer, int itemWidth, int itemHeight) { 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.mojang.blaze3d.platform.GlStateManager;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawer; 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; import net.minecraft.client.gui.FontRenderer;
public class CraftingPreviewElementDrawers extends ElementDrawers { public class CraftingPreviewElementDrawers extends ElementDrawers {
private GuiCraftingPreview gui; private CraftingPreviewScreen screen;
private IElementDrawer<Integer> overlayDrawer = (x, y, colour) -> { private IElementDrawer<Integer> overlayDrawer = (x, y, colour) -> {
GlStateManager.color4f(1, 1, 1, 1); GlStateManager.color4f(1, 1, 1, 1);
GlStateManager.disableLighting(); 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) { public CraftingPreviewElementDrawers(CraftingPreviewScreen screen, FontRenderer fontRenderer) {
super(gui, fontRenderer); super(screen, fontRenderer);
this.gui = gui; this.screen = screen;
} }
@Override @Override

View File

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

View File

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

View File

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

View File

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

View File

@@ -79,6 +79,11 @@ public class PortableItemStorageCache implements IStorageCache<ItemStack> {
return list; return list;
} }
@Override
public IStackList<ItemStack> getCraftablesList() {
throw new RuntimeException("Unsupported");
}
@Override @Override
public List<IStorage<ItemStack>> getStorages() { public List<IStorage<ItemStack>> getStorages() {
return Collections.emptyList(); 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 String NBT_FLUIDS = "Fluids";
public static final int VERSION = 1; public static final int VERSION = 1;
@Nullable
private ServerWorld world; private ServerWorld world;
private int capacity; private int capacity;
private Multimap<Fluid, FluidStack> stacks = ArrayListMultimap.create(); private Multimap<Fluid, FluidStack> stacks = ArrayListMultimap.create();
@@ -35,11 +36,7 @@ public class FluidStorageDisk implements IStorageDisk<FluidStack> {
private IStorageDiskListener listener; private IStorageDiskListener listener;
private IStorageDiskContainerContext context; private IStorageDiskContainerContext context;
public FluidStorageDisk(ServerWorld world, int capacity) { public FluidStorageDisk(@Nullable ServerWorld world, int capacity) {
if (world == null) {
throw new IllegalArgumentException("World cannot be null");
}
this.world = world; this.world = world;
this.capacity = capacity; this.capacity = capacity;
} }
@@ -205,6 +202,8 @@ public class FluidStorageDisk implements IStorageDisk<FluidStack> {
listener.onChanged(); listener.onChanged();
} }
if (world != null) {
API.instance().getStorageDiskManager(world).markForSaving(); 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 String NBT_ITEMS = "Items";
public static final int VERSION = 1; public static final int VERSION = 1;
@Nullable
private ServerWorld world; private ServerWorld world;
private int capacity; private int capacity;
private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create(); private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create();
@@ -36,11 +37,7 @@ public class ItemStorageDisk implements IStorageDisk<ItemStack> {
private IStorageDiskListener listener; private IStorageDiskListener listener;
private IStorageDiskContainerContext context; private IStorageDiskContainerContext context;
public ItemStorageDisk(ServerWorld world, int capacity) { public ItemStorageDisk(@Nullable ServerWorld world, int capacity) {
if (world == null) {
throw new IllegalArgumentException("World cannot be null");
}
this.world = world; this.world = world;
this.capacity = capacity; this.capacity = capacity;
} }
@@ -206,6 +203,8 @@ public class ItemStorageDisk implements IStorageDisk<ItemStack> {
listener.onChanged(); listener.onChanged();
} }
if (world != null) {
API.instance().getStorageDiskManager(world).markForSaving(); API.instance().getStorageDiskManager(world).markForSaving();
} }
} }
}

View File

@@ -21,7 +21,7 @@ public class FluidStackList implements IStackList<FluidStack> {
@Override @Override
public StackListResult<FluidStack> add(@Nonnull FluidStack stack, int size) { public StackListResult<FluidStack> add(@Nonnull FluidStack stack, int size) {
if (size < 0) { if (stack.isEmpty() || size <= 0) {
throw new IllegalArgumentException("Cannot accept empty stack"); 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++, PortableGridItemDeltaMessage.class, PortableGridItemDeltaMessage::encode, PortableGridItemDeltaMessage::decode, PortableGridItemDeltaMessage::handle);
handler.registerMessage(id++, PortableGridFluidUpdateMessage.class, PortableGridFluidUpdateMessage::encode, PortableGridFluidUpdateMessage::decode, PortableGridFluidUpdateMessage::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++, 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) { 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) { for (StackListResult<FluidStack> delta : message.deltas) {
buf.writeInt(delta.getChange()); 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; 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.network.INetwork;
import com.raoulvdberge.refinedstorage.api.util.StackListEntry; import com.raoulvdberge.refinedstorage.api.util.StackListEntry;
import com.raoulvdberge.refinedstorage.screen.BaseScreen; import com.raoulvdberge.refinedstorage.screen.BaseScreen;
@@ -49,22 +48,16 @@ public class GridFluidUpdateMessage {
public static void encode(GridFluidUpdateMessage message, PacketBuffer buf) { public static void encode(GridFluidUpdateMessage message, PacketBuffer buf) {
buf.writeBoolean(message.canCraft); buf.writeBoolean(message.canCraft);
int size = message.network.getFluidStorageCache().getList().getStacks().size(); int size = message.network.getFluidStorageCache().getList().getStacks().size() + message.network.getFluidStorageCache().getCraftablesList().getStacks().size();
for (ICraftingPattern pattern : message.network.getCraftingManager().getPatterns()) {
size += pattern.getFluidOutputs().size();
}
buf.writeInt(size); buf.writeInt(size);
for (StackListEntry<FluidStack> stack : message.network.getFluidStorageCache().getList().getStacks()) { 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 (StackListEntry<FluidStack> stack : message.network.getFluidStorageCache().getCraftablesList().getStacks()) {
for (FluidStack output : pattern.getFluidOutputs()) { StackUtils.writeFluidGridStack(buf, stack.getStack(), stack.getId(), true, message.network, message.network.getFluidStorageTracker().get(stack.getStack()));
// TODO
}
} }
} }

View File

@@ -52,7 +52,7 @@ public class GridItemDeltaMessage {
for (StackListResult<ItemStack> delta : message.deltas) { for (StackListResult<ItemStack> delta : message.deltas) {
buf.writeInt(delta.getChange()); 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; 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.network.INetwork;
import com.raoulvdberge.refinedstorage.api.util.StackListEntry; import com.raoulvdberge.refinedstorage.api.util.StackListEntry;
import com.raoulvdberge.refinedstorage.screen.BaseScreen; import com.raoulvdberge.refinedstorage.screen.BaseScreen;
@@ -49,22 +48,16 @@ public class GridItemUpdateMessage {
public static void encode(GridItemUpdateMessage message, PacketBuffer buf) { public static void encode(GridItemUpdateMessage message, PacketBuffer buf) {
buf.writeBoolean(message.canCraft); buf.writeBoolean(message.canCraft);
int size = message.network.getItemStorageCache().getList().getStacks().size(); int size = message.network.getItemStorageCache().getList().getStacks().size() + message.network.getItemStorageCache().getCraftablesList().getStacks().size();
for (ICraftingPattern pattern : message.network.getCraftingManager().getPatterns()) {
size += pattern.getOutputs().size();
}
buf.writeInt(size); buf.writeInt(size);
for (StackListEntry<ItemStack> stack : message.network.getItemStorageCache().getList().getStacks()) { 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 (StackListEntry<ItemStack> stack : message.network.getItemStorageCache().getCraftablesList().getStacks()) {
for (ItemStack output : pattern.getOutputs()) { StackUtils.writeItemGridStack(buf, stack.getStack(), stack.getId(), true, message.network, message.network.getItemStorageTracker().get(stack.getStack()));
// TODO StackUtils.writeItemGridStack(buf, output, message.network, true, message.network.getItemStorageTracker().get(output));
}
} }
} }

View File

@@ -50,7 +50,7 @@ public class PortableGridFluidDeltaMessage {
for (StackListResult<FluidStack> delta : message.deltas) { for (StackListResult<FluidStack> delta : message.deltas) {
buf.writeInt(delta.getChange()); 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); buf.writeInt(size);
for (StackListEntry<FluidStack> stack : message.portableGrid.getFluidCache().getList().getStacks()) { 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) { for (StackListResult<ItemStack> delta : message.deltas) {
buf.writeInt(delta.getChange()); 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); buf.writeInt(size);
for (StackListEntry<ItemStack> stack : message.portableGrid.getItemCache().getList().getStacks()) { 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.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(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(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 -> { 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); 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(); 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.screen.widget.sidebutton.CrafterModeSideButton;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameterClientListener; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameterClientListener;
public class TileDataParameterClientListenerCrafter implements TileDataParameterClientListener<Boolean> { public class CrafterTileDataParameterClientListener implements TileDataParameterClientListener<Boolean> {
@Override @Override
public void onChanged(boolean initial, Boolean hasRoot) { public void onChanged(boolean initial, Boolean hasRoot) {
if (!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.mojang.blaze3d.platform.GlStateManager;
import com.raoulvdberge.refinedstorage.RS; 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.preview.ICraftingPreviewElement;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskErrorType; import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskErrorType;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawers; import com.raoulvdberge.refinedstorage.api.render.IElementDrawers;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementError; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.ErrorCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementFluidStack; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.FluidCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.ItemCraftingPreviewElement;
import com.raoulvdberge.refinedstorage.apiimpl.render.CraftingPreviewElementDrawers; 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.screen.widget.ScrollbarWidget;
import com.raoulvdberge.refinedstorage.util.RenderUtils; import com.raoulvdberge.refinedstorage.util.RenderUtils;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -21,45 +24,45 @@ import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Container;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import org.lwjgl.glfw.GLFW;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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 static final int VISIBLE_ROWS = 5;
private List<ICraftingPreviewElement> stacks; private final List<ICraftingPreviewElement> stacks;
private Screen parent; private final Screen parent;
private ScrollbarWidget scrollbar; private final ScrollbarWidget scrollbar;
private int hash; private final UUID id;
private int quantity; private final int quantity;
private final boolean fluids;
private Button startButton;
private Button cancelButton;
private ItemStack hoveringStack; private ItemStack hoveringStack;
private FluidStack hoveringFluid; private FluidStack hoveringFluid;
private IElementDrawers drawers = new CraftingPreviewElementDrawers(this, font); private IElementDrawers drawers = new CraftingPreviewElementDrawers(this, font);
private boolean fluids; public CraftingPreviewScreen(Screen parent, List<ICraftingPreviewElement> stacks, UUID id, int quantity, boolean fluids, ITextComponent title) {
public GuiCraftingPreview(Screen parent, List<ICraftingPreviewElement> stacks, int hash, int quantity, boolean fluids) {
super(new Container(null, 0) { super(new Container(null, 0) {
@Override @Override
public boolean canInteractWith(PlayerEntity playerIn) { public boolean canInteractWith(PlayerEntity player) {
return false; return false;
} }
}, 254, 201, null, null); }, 254, 201, null, title);
this.stacks = new ArrayList<>(stacks); this.stacks = new ArrayList<>(stacks);
this.parent = parent; this.parent = parent;
this.hash = hash; this.id = id;
this.quantity = quantity; this.quantity = quantity;
this.fluids = fluids; this.fluids = fluids;
@@ -68,27 +71,22 @@ public class GuiCraftingPreview extends BaseScreen {
@Override @Override
public void onPostInit(int x, int y) { public void onPostInit(int x, int y) {
cancelButton = addButton(x + 55, y + 201 - 20 - 7, 50, 20, I18n.format("gui.cancel"), true, true, btn -> { addButton(x + 55, y + 201 - 20 - 7, 50, 20, I18n.format("gui.cancel"), true, true, btn -> close());
});
startButton = addButton(x + 129, y + 201 - 20 - 7, 50, 20, I18n.format("misc.refinedstorage:start"), true, true, btn -> {
});
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; startButton.active = stacks.stream().noneMatch(ICraftingPreviewElement::hasMissing) && getErrorType() == null;
} }
@Override @Override
public void tick(int x, int y) { public void tick(int x, int y) {
if (scrollbar != null) {
scrollbar.setEnabled(getRows() > VISIBLE_ROWS); scrollbar.setEnabled(getRows() > VISIBLE_ROWS);
scrollbar.setMaxOffset(getRows() - VISIBLE_ROWS); scrollbar.setMaxOffset(getRows() - VISIBLE_ROWS);
} }
}
@Nullable @Nullable
private CraftingTaskErrorType getErrorType() { private CraftingTaskErrorType getErrorType() {
if (stacks.size() == 1 && stacks.get(0) instanceof CraftingPreviewElementError) { if (stacks.size() == 1 && stacks.get(0) instanceof ErrorCraftingPreviewElement) {
return ((CraftingPreviewElementError) stacks.get(0)).getType(); return ((ErrorCraftingPreviewElement) stacks.get(0)).getType();
} }
return null; return null;
@@ -103,11 +101,13 @@ public class GuiCraftingPreview extends BaseScreen {
if (getErrorType() != null) { if (getErrorType() != null) {
fill(x + 7, y + 20, x + 228, y + 169, 0xFFDBDBDB); fill(x + 7, y + 20, x + 228, y + 169, 0xFFDBDBDB);
} }
scrollbar.render();
} }
@Override @Override
public void renderForeground(int mouseX, int mouseY) { 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 x = 7;
int y = 15; int y = 15;
@@ -118,27 +118,27 @@ public class GuiCraftingPreview extends BaseScreen {
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
GlStateManager.scalef(scale, scale, 1); 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()) { switch (getErrorType()) {
case RECURSIVE: { 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 + 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 + 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 + 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 + 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(); 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; int yy = 83;
for (ItemStack output : pattern.getOutputs()) { for (ItemStack output : pattern.getOutputs()) {
if (output != null) { if (output != null) {
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
GlStateManager.scalef(scale, scale, 1); 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(); GlStateManager.popMatrix();
RenderHelper.enableGUIStandardItemLighting(); RenderHelper.enableGUIStandardItemLighting();
@@ -153,8 +153,8 @@ public class GuiCraftingPreview extends BaseScreen {
break; break;
} }
case TOO_COMPLEX: { 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 + 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 + 31, scale), I18n.format("gui.refinedstorage.crafting_preview.error.too_complex.1"));
GlStateManager.popMatrix(); GlStateManager.popMatrix();
@@ -177,10 +177,10 @@ public class GuiCraftingPreview extends BaseScreen {
stack.draw(x, y + 5, drawers); stack.draw(x, y + 5, drawers);
if (RenderUtils.inBounds(x + 5, y + 7, 16, 16, mouseX, mouseY)) { 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) { 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); super.render(mouseX, mouseY, partialTicks);
if (hoveringStack != null) { 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) { } else if (hoveringFluid != null) {
renderTooltip(mouseX, mouseY, hoveringFluid.getDisplayName().getFormattedText()); // TODO gft renderTooltip(mouseX, mouseY, hoveringFluid.getDisplayName().getFormattedText());
}
}
/* 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);
} }
} }
@Override @Override
protected void actionPerformed(GuiButton button) throws IOException { public void mouseMoved(double mx, double my) {
super.actionPerformed(button); scrollbar.mouseMoved(mx, my);
if (button.id == startButton.id) { super.mouseMoved(mx, my);
startRequest(); }
} else if (button.id == cancelButton.id) {
close(); @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() { private void startRequest() {
// TODO RS.INSTANCE.network.sendToServer(new MessageGridCraftingStart(hash, quantity, fluids)); RS.NETWORK_HANDLER.sendToServer(new GridCraftingStartRequestMessage(id, quantity, fluids));
close(); close();
} }
@@ -242,6 +266,6 @@ public class GuiCraftingPreview extends BaseScreen {
} }
private void close() { private void close() {
// TODO FMLClientHandler.instance().showGuiScreen(parent); minecraft.displayGuiScreen(parent);
} }
} }

View File

@@ -1,7 +1,8 @@
package com.raoulvdberge.refinedstorage.screen.grid; 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.container.CraftingSettingsContainer;
import com.raoulvdberge.refinedstorage.network.grid.GridCraftingPreviewRequestMessage;
import com.raoulvdberge.refinedstorage.screen.AmountSpecifyingScreen; import com.raoulvdberge.refinedstorage.screen.AmountSpecifyingScreen;
import com.raoulvdberge.refinedstorage.screen.BaseScreen; import com.raoulvdberge.refinedstorage.screen.BaseScreen;
import com.raoulvdberge.refinedstorage.screen.grid.stack.FluidGridStack; 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.minecraft.util.text.TranslationTextComponent;
import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidAttributes;
public class GuiGridCraftingSettings extends AmountSpecifyingScreen<CraftingSettingsContainer> { public class CraftingSettingsScreen extends AmountSpecifyingScreen<CraftingSettingsContainer> {
private IGridStack stack; 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")); super(parent, new CraftingSettingsContainer(player, stack), 172, 99, player.inventory, new TranslationTextComponent("container.crafting"));
this.stack = stack; this.stack = stack;
@@ -22,7 +23,7 @@ public class GuiGridCraftingSettings extends AmountSpecifyingScreen<CraftingSett
@Override @Override
protected String getOkButtonText() { protected String getOkButtonText() {
return I18n.format("misc.refinedstorage:start"); return I18n.format("misc.refinedstorage.start");
} }
@Override @Override
@@ -61,12 +62,14 @@ public class GuiGridCraftingSettings extends AmountSpecifyingScreen<CraftingSett
} }
protected void onOkButtonPressed(boolean shiftDown) { protected void onOkButtonPressed(boolean shiftDown) {
Integer quantity = Ints.tryParse(amountField.getText()); try {
int quantity = Integer.parseInt(amountField.getText());
if (quantity != null && quantity > 0) { RS.NETWORK_HANDLER.sendToServer(new GridCraftingPreviewRequestMessage(stack.getId(), quantity, shiftDown, stack instanceof FluidGridStack));
// TODO RS.INSTANCE.network.sendToServer(new MessageGridCraftingPreview(stack.getHash(), quantity, shiftDown, stack instanceof GridStackFluid));
okButton.active = false; 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> textLines = Lists.newArrayList(gridStack.getTooltip().split("\n"));
List<String> smallTextLines = Lists.newArrayList(); List<String> smallTextLines = Lists.newArrayList();
if (!gridStack.doesDisplayCraftText()) { if (!gridStack.isCraftable()) {
smallTextLines.add(I18n.format("misc.refinedstorage.total", gridStack.getFormattedFullQuantity())); 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); IGridStack stack = view.getStacks().get(slotNumber);
if (isPulling) { if (isPulling) {
if (stack.isCraftable() && view.canCraft() && (stack.doesDisplayCraftText() || (hasShiftDown() && hasControlDown()))) { if (stack.isCraftable() && view.canCraft()) {
// @TODO FMLCommonHandler.instance().showGuiScreen(new GuiGridCraftingSettings(this, ((ContainerGrid) this.inventorySlots).getPlayer(), stack)); minecraft.displayGuiScreen(new CraftingSettingsScreen(this, playerInventory.player, stack));
} else if (grid.getGridType() == GridType.FLUID && held.isEmpty()) { } else if (grid.getGridType() == GridType.FLUID && held.isEmpty()) {
RS.NETWORK_HANDLER.sendToServer(new GridFluidPullMessage(view.getStacks().get(slotNumber).getId(), hasShiftDown())); RS.NETWORK_HANDLER.sendToServer(new GridFluidPullMessage(view.getStacks().get(slotNumber).getId(), hasShiftDown()));
} else if (grid.getGridType() != GridType.FLUID) { } else if (grid.getGridType() != GridType.FLUID) {

View File

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

View File

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

View File

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

View File

@@ -17,11 +17,6 @@ public class FluidGridView extends BaseGridView {
map.clear(); map.clear();
for (IGridStack stack : stacks) { 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); map.put(stack.getId(), stack);
} }
} }
@@ -40,20 +35,12 @@ public class FluidGridView extends BaseGridView {
map.put(stack.getId(), stack); map.put(stack.getId(), stack);
} else { } else {
if (existing.getStack().getAmount() + delta <= 0) { if (existing.getStack().getAmount() + delta <= 0) {
if (existing.isCraftable()) { existing.getStack().grow(delta);
existing.setDisplayCraftText(true);
} else {
map.remove(existing.getId());
}
} else {
if (existing.doesDisplayCraftText()) {
existing.setDisplayCraftText(false);
existing.getStack().setAmount(delta); map.remove(existing.getId());
} else { } else {
existing.getStack().grow(delta); existing.getStack().grow(delta);
} }
}
existing.setTrackerEntry(stack.getTrackerEntry()); existing.setTrackerEntry(stack.getTrackerEntry());
} }

View File

@@ -17,11 +17,6 @@ public class ItemGridView extends BaseGridView {
map.clear(); map.clear();
for (IGridStack stack : stacks) { 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); map.put(stack.getId(), stack);
} }
} }
@@ -40,20 +35,12 @@ public class ItemGridView extends BaseGridView {
map.put(stack.getId(), stack); map.put(stack.getId(), stack);
} else { } else {
if (existing.getStack().getCount() + delta <= 0) { if (existing.getStack().getCount() + delta <= 0) {
if (existing.isCraftable()) { existing.getStack().grow(delta);
existing.setDisplayCraftText(true);
} else {
map.remove(existing.getId());
}
} else {
if (existing.doesDisplayCraftText()) {
existing.setDisplayCraftText(false);
existing.getStack().setCount(delta); map.remove(existing.getId());
} else { } else {
existing.getStack().grow(delta); existing.getStack().grow(delta);
} }
}
existing.setTrackerEntry(stack.getTrackerEntry()); existing.setTrackerEntry(stack.getTrackerEntry());
} }

View File

@@ -2,7 +2,7 @@ package com.raoulvdberge.refinedstorage.tile;
import com.raoulvdberge.refinedstorage.RSTiles; import com.raoulvdberge.refinedstorage.RSTiles;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.CrafterNetworkNode; 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 com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.network.datasync.DataSerializers; import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
@@ -18,7 +18,7 @@ import javax.annotation.Nullable;
public class CrafterTile extends NetworkNodeTile<CrafterNetworkNode> { 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))); 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()); 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); writeItemStack(buf, stack);
buf.writeBoolean(craftable);
buf.writeUniqueId(id); 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) { if (entry == null) {
buf.writeBoolean(false); buf.writeBoolean(false);
} else { } else {
@@ -101,31 +94,24 @@ public final class StackUtils {
public static ItemGridStack readItemGridStack(PacketBuffer buf) { public static ItemGridStack readItemGridStack(PacketBuffer buf) {
ItemStack stack = readItemStack(buf); ItemStack stack = readItemStack(buf);
UUID id = buf.readUniqueId();
boolean craftable = buf.readBoolean(); boolean craftable = buf.readBoolean();
boolean displayCraftText = buf.readBoolean(); UUID id = buf.readUniqueId();
StorageTrackerEntry entry = null; StorageTrackerEntry entry = null;
if (buf.readBoolean()) { if (buf.readBoolean()) {
entry = new StorageTrackerEntry(buf.readLong(), buf.readString()); 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); stack.writeToPacket(buf);
buf.writeBoolean(craftable);
buf.writeUniqueId(id); 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) { if (entry == null) {
buf.writeBoolean(false); buf.writeBoolean(false);
} else { } else {
@@ -138,16 +124,15 @@ public final class StackUtils {
public static FluidGridStack readFluidGridStack(PacketBuffer buf) { public static FluidGridStack readFluidGridStack(PacketBuffer buf) {
FluidStack stack = FluidStack.readFromPacket(buf); FluidStack stack = FluidStack.readFromPacket(buf);
UUID id = buf.readUniqueId();
boolean craftable = buf.readBoolean(); boolean craftable = buf.readBoolean();
boolean displayCraftText = buf.readBoolean(); UUID id = buf.readUniqueId();
StorageTrackerEntry entry = null; StorageTrackerEntry entry = null;
if (buf.readBoolean()) { if (buf.readBoolean()) {
entry = new StorageTrackerEntry(buf.readLong(), buf.readString()); entry = new StorageTrackerEntry(buf.readLong(), buf.readString());
} }
return new FluidGridStack(id, stack, entry, craftable, displayCraftText); return new FluidGridStack(id, stack, entry, craftable);
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@@ -77,7 +77,7 @@ public final class WorldUtils {
} }
public static void sendNoPermissionMessage(PlayerEntity player) { 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) { public static RayTraceResult rayTracePlayer(World world, PlayerEntity player) {

View File

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