Compare commits

7 Commits

Author SHA1 Message Date
eb81b15f16 Make crafters faster 2024-07-11 11:43:59 +02:00
5aa9627328 Restore filter filtering functionality 2024-07-10 16:30:25 +02:00
raoulvdberge
2ed9fc1f7b Fixed compile error, updated changelog 2020-04-26 10:28:55 +02:00
Dabombber
7fd7eac594 b485c74503 backport (#2397)
Co-authored-by: Raoul <raoulvdberge@gmail.com>
2020-04-26 10:20:01 +02:00
BlueAgent
3248514a65 Fix extractFluid voiding excess in OC driver (#2363) 2020-04-26 10:16:27 +02:00
Thanh-Phuong
98ed5b89c2 Fix Inventory Tweaks woes (#2447) 2020-04-26 10:15:37 +02:00
ian-rampage
e72f1b64bc getWorld is abstract on TileController when running outside of a development enviroment due to obfustcation. (#2490) 2020-04-26 10:14:51 +02:00
44 changed files with 244 additions and 108 deletions

View File

@@ -2,6 +2,10 @@
### 1.6.16 ### 1.6.16
- Updated Russian translation (Bytegm) - Updated Russian translation (Bytegm)
- Fixed erroring controller tile entity (ian-rampage)
- Fixed Inventory Tweaks sorting not respecting locked slots (Landmaster)
- Fixed OpenComputers driver voiding excess fluids (BlueAgent)
- Fixed being able to move wireless items in inventory (raoulvdberge, Dabombber)
### 1.6.15 ### 1.6.15
- Fixed recipes with more than 1 bucket of fluid not transferring from JEI (Darkere) - Fixed recipes with more than 1 bucket of fluid not transferring from JEI (Darkere)

View File

@@ -231,6 +231,11 @@ public interface IGrid {
*/ */
boolean isActive(); boolean isActive();
/**
* @return the slot id where this grid is located, if applicable, otherwise -1
*/
int getSlotId();
static boolean isValidViewType(int type) { static boolean isValidViewType(int type) {
return type == VIEW_TYPE_NORMAL || return type == VIEW_TYPE_NORMAL ||
type == VIEW_TYPE_CRAFTABLES || type == VIEW_TYPE_CRAFTABLES ||

View File

@@ -17,10 +17,11 @@ public interface IGridFactory {
* *
* @param player the player * @param player the player
* @param stack the stack * @param stack the stack
* @param slotId the slot id, if applicable, otherwise -1
* @return the grid, or null if a problem occurred * @return the grid, or null if a problem occurred
*/ */
@Nullable @Nullable
IGrid createFromStack(EntityPlayer player, ItemStack stack); IGrid createFromStack(EntityPlayer player, ItemStack stack, int slotId);
/** /**
* Creates a grid from a block. Used when {@link #getType()} is BLOCK. * Creates a grid from a block. Used when {@link #getType()} is BLOCK.

View File

@@ -41,8 +41,9 @@ public interface IGridManager {
* @param id the grid factory id as returned from {@link #add(IGridFactory)} * @param id the grid factory id as returned from {@link #add(IGridFactory)}
* @param player the player * @param player the player
* @param stack the stack * @param stack the stack
* @param slotId the slot id, if applicable, otherwise -1
*/ */
void openGrid(int id, EntityPlayerMP player, ItemStack stack); void openGrid(int id, EntityPlayerMP player, ItemStack stack, int slotId);
/** /**
* Creates a grid. * Creates a grid.
@@ -51,8 +52,9 @@ public interface IGridManager {
* @param player the player * @param player the player
* @param stack the stack, if there is one * @param stack the stack, if there is one
* @param pos the block position, if there is one * @param pos the block position, if there is one
* @param slotId the slot id, if applicable, otherwise -1
* @return a grid, or null if an error has occurred * @return a grid, or null if an error has occurred
*/ */
@Nullable @Nullable
Pair<IGrid, TileEntity> createGrid(int id, EntityPlayer player, @Nullable ItemStack stack, @Nullable BlockPos pos); Pair<IGrid, TileEntity> createGrid(int id, EntityPlayer player, @Nullable ItemStack stack, @Nullable BlockPos pos, int slotId);
} }

View File

@@ -15,8 +15,9 @@ public interface INetworkItemHandler {
* *
* @param player the player that opened the network item * @param player the player that opened the network item
* @param stack the stack that has been opened * @param stack the stack that has been opened
* @param slotId the slot id, if applicable, otherwise -1
*/ */
void open(EntityPlayer player, ItemStack stack); void open(EntityPlayer player, ItemStack stack, int slotId);
/** /**
* Called when the player closes a network item. * Called when the player closes a network item.

View File

@@ -15,8 +15,9 @@ public interface INetworkItemProvider {
* @param handler the network item handler * @param handler the network item handler
* @param player the player * @param player the player
* @param stack the stack * @param stack the stack
* @param slotId the slot id, if applicable, otherwise -1
* @return the network item * @return the network item
*/ */
@Nonnull @Nonnull
INetworkItem provide(INetworkItemHandler handler, EntityPlayer player, ItemStack stack); INetworkItem provide(INetworkItemHandler handler, EntityPlayer player, ItemStack stack, int slotId);
} }

View File

@@ -15,7 +15,7 @@ import javax.annotation.Nullable;
public class GridFactoryGridBlock implements IGridFactory { public class GridFactoryGridBlock implements IGridFactory {
@Override @Override
@Nullable @Nullable
public IGrid createFromStack(EntityPlayer player, ItemStack stack) { public IGrid createFromStack(EntityPlayer player, ItemStack stack, int slotId) {
return null; return null;
} }

View File

@@ -15,8 +15,8 @@ import javax.annotation.Nullable;
public class GridFactoryPortableGrid implements IGridFactory { public class GridFactoryPortableGrid implements IGridFactory {
@Nullable @Nullable
@Override @Override
public IGrid createFromStack(EntityPlayer player, ItemStack stack) { public IGrid createFromStack(EntityPlayer player, ItemStack stack, int slotId) {
return new PortableGrid(player, stack); return new PortableGrid(player, stack, slotId);
} }
@Nullable @Nullable

View File

@@ -15,7 +15,7 @@ import javax.annotation.Nullable;
public class GridFactoryPortableGridBlock implements IGridFactory { public class GridFactoryPortableGridBlock implements IGridFactory {
@Override @Override
@Nullable @Nullable
public IGrid createFromStack(EntityPlayer player, ItemStack stack) { public IGrid createFromStack(EntityPlayer player, ItemStack stack, int slotId) {
return null; return null;
} }

View File

@@ -15,8 +15,8 @@ import javax.annotation.Nullable;
public class GridFactoryWirelessFluidGrid implements IGridFactory { public class GridFactoryWirelessFluidGrid implements IGridFactory {
@Nullable @Nullable
@Override @Override
public IGrid createFromStack(EntityPlayer player, ItemStack stack) { public IGrid createFromStack(EntityPlayer player, ItemStack stack, int slotId) {
return new WirelessFluidGrid(stack); return new WirelessFluidGrid(stack, slotId);
} }
@Nullable @Nullable

View File

@@ -15,8 +15,8 @@ import javax.annotation.Nullable;
public class GridFactoryWirelessGrid implements IGridFactory { public class GridFactoryWirelessGrid implements IGridFactory {
@Nullable @Nullable
@Override @Override
public IGrid createFromStack(EntityPlayer player, ItemStack stack) { public IGrid createFromStack(EntityPlayer player, ItemStack stack, int slotId) {
return new WirelessGrid(stack); return new WirelessGrid(stack, slotId);
} }
@Nullable @Nullable

View File

@@ -43,16 +43,16 @@ public class GridManager implements IGridManager {
@Override @Override
public void openGrid(int id, EntityPlayerMP player, BlockPos pos) { public void openGrid(int id, EntityPlayerMP player, BlockPos pos) {
openGrid(id, player, null, pos); openGrid(id, player, null, pos, -1);
} }
@Override @Override
public void openGrid(int id, EntityPlayerMP player, ItemStack stack) { public void openGrid(int id, EntityPlayerMP player, ItemStack stack, int slotId) {
openGrid(id, player, stack, null); openGrid(id, player, stack, null, slotId);
} }
private void openGrid(int id, EntityPlayerMP player, @Nullable ItemStack stack, @Nullable BlockPos pos) { private void openGrid(int id, EntityPlayerMP player, @Nullable ItemStack stack, @Nullable BlockPos pos, int slotId) {
Pair<IGrid, TileEntity> grid = createGrid(id, player, stack, pos); Pair<IGrid, TileEntity> grid = createGrid(id, player, stack, pos, slotId);
if (grid == null) { if (grid == null) {
return; return;
} }
@@ -73,7 +73,7 @@ public class GridManager implements IGridManager {
// So we first send the window id in MessageGridOpen. // So we first send the window id in MessageGridOpen.
// The order is preserved by TCP. // The order is preserved by TCP.
RS.INSTANCE.network.sendTo(new MessageGridOpen(player.currentWindowId, pos, id, stack), player); RS.INSTANCE.network.sendTo(new MessageGridOpen(player.currentWindowId, pos, id, stack, slotId), player);
player.openContainer = new ContainerGrid(grid.getLeft(), new ResizableDisplayDummy(), grid.getRight() instanceof TileBase ? (TileBase) grid.getRight() : null, player); player.openContainer = new ContainerGrid(grid.getLeft(), new ResizableDisplayDummy(), grid.getRight() instanceof TileBase ? (TileBase) grid.getRight() : null, player);
player.openContainer.windowId = player.currentWindowId; player.openContainer.windowId = player.currentWindowId;
@@ -84,7 +84,7 @@ public class GridManager implements IGridManager {
@Override @Override
@Nullable @Nullable
public Pair<IGrid, TileEntity> createGrid(int id, EntityPlayer player, @Nullable ItemStack stack, @Nullable BlockPos pos) { public Pair<IGrid, TileEntity> createGrid(int id, EntityPlayer player, @Nullable ItemStack stack, @Nullable BlockPos pos, int slotId) {
IGridFactory factory = get(id); IGridFactory factory = get(id);
if (factory == null) { if (factory == null) {
@@ -96,7 +96,7 @@ public class GridManager implements IGridManager {
switch (factory.getType()) { switch (factory.getType()) {
case STACK: case STACK:
grid = factory.createFromStack(player, stack); grid = factory.createFromStack(player, stack, slotId);
break; break;
case BLOCK: case BLOCK:
grid = factory.createFromBlock(player, pos); grid = factory.createFromBlock(player, pos);

View File

@@ -23,7 +23,7 @@ public class GridOpenHandler implements Runnable {
public void run() { public void run() {
EntityPlayer player = Minecraft.getMinecraft().player; EntityPlayer player = Minecraft.getMinecraft().player;
Pair<IGrid, TileEntity> grid = API.instance().getGridManager().createGrid(message.getGridId(), player, message.getStack(), message.getPos()); Pair<IGrid, TileEntity> grid = API.instance().getGridManager().createGrid(message.getGridId(), player, message.getStack(), message.getPos(), message.getSlotId());
if (grid == null) { if (grid == null) {
return; return;

View File

@@ -23,7 +23,7 @@ public class NetworkItemHandler implements INetworkItemHandler {
} }
@Override @Override
public void open(EntityPlayer player, ItemStack stack) { public void open(EntityPlayer player, ItemStack stack, int slotId) {
boolean inRange = false; boolean inRange = false;
for (INetworkNode node : network.getNodeGraph().all()) { for (INetworkNode node : network.getNodeGraph().all()) {
@@ -46,7 +46,7 @@ public class NetworkItemHandler implements INetworkItemHandler {
return; return;
} }
INetworkItem item = ((INetworkItemProvider) stack.getItem()).provide(this, player, stack); INetworkItem item = ((INetworkItemProvider) stack.getItem()).provide(this, player, stack, slotId);
if (item.onOpen(network)) { if (item.onOpen(network)) {
items.put(player, item); items.put(player, item);

View File

@@ -17,13 +17,13 @@ public class NetworkItemWirelessCraftingMonitor implements INetworkItem {
private INetworkItemHandler handler; private INetworkItemHandler handler;
private EntityPlayer player; private EntityPlayer player;
private ItemStack stack; private ItemStack stack;
private int invIndex; private int slotId;
public NetworkItemWirelessCraftingMonitor(INetworkItemHandler handler, EntityPlayer player, ItemStack stack, int invIndex) { public NetworkItemWirelessCraftingMonitor(INetworkItemHandler handler, EntityPlayer player, ItemStack stack, int slotId) {
this.handler = handler; this.handler = handler;
this.player = player; this.player = player;
this.stack = stack; this.stack = stack;
this.invIndex = invIndex; this.slotId = slotId;
} }
@Override @Override
@@ -43,7 +43,7 @@ public class NetworkItemWirelessCraftingMonitor implements INetworkItem {
return false; return false;
} }
player.openGui(RS.INSTANCE, RSGui.WIRELESS_CRAFTING_MONITOR, player.getEntityWorld(), invIndex, 0, 0); player.openGui(RS.INSTANCE, RSGui.WIRELESS_CRAFTING_MONITOR, player.getEntityWorld(), slotId, 0, 0);
drainEnergy(RS.INSTANCE.config.wirelessCraftingMonitorOpenUsage); drainEnergy(RS.INSTANCE.config.wirelessCraftingMonitorOpenUsage);

View File

@@ -19,11 +19,13 @@ public class NetworkItemWirelessFluidGrid implements INetworkItem {
private INetworkItemHandler handler; private INetworkItemHandler handler;
private EntityPlayer player; private EntityPlayer player;
private ItemStack stack; private ItemStack stack;
private int slotId;
public NetworkItemWirelessFluidGrid(INetworkItemHandler handler, EntityPlayer player, ItemStack stack) { public NetworkItemWirelessFluidGrid(INetworkItemHandler handler, EntityPlayer player, ItemStack stack, int slotId) {
this.handler = handler; this.handler = handler;
this.player = player; this.player = player;
this.stack = stack; this.stack = stack;
this.slotId = slotId;
} }
@Override @Override
@@ -43,7 +45,7 @@ public class NetworkItemWirelessFluidGrid implements INetworkItem {
return false; return false;
} }
API.instance().getGridManager().openGrid(WirelessFluidGrid.ID, (EntityPlayerMP) player, stack); API.instance().getGridManager().openGrid(WirelessFluidGrid.ID, (EntityPlayerMP) player, stack, slotId);
drainEnergy(RS.INSTANCE.config.wirelessFluidGridOpenUsage); drainEnergy(RS.INSTANCE.config.wirelessFluidGridOpenUsage);

View File

@@ -19,11 +19,13 @@ public class NetworkItemWirelessGrid implements INetworkItem {
private INetworkItemHandler handler; private INetworkItemHandler handler;
private EntityPlayer player; private EntityPlayer player;
private ItemStack stack; private ItemStack stack;
private int slotId;
public NetworkItemWirelessGrid(INetworkItemHandler handler, EntityPlayer player, ItemStack stack) { public NetworkItemWirelessGrid(INetworkItemHandler handler, EntityPlayer player, ItemStack stack, int slotId) {
this.handler = handler; this.handler = handler;
this.player = player; this.player = player;
this.stack = stack; this.stack = stack;
this.slotId = slotId;
} }
@Override @Override
@@ -43,7 +45,7 @@ public class NetworkItemWirelessGrid implements INetworkItem {
return false; return false;
} }
API.instance().getGridManager().openGrid(WirelessGrid.ID, (EntityPlayerMP) player, stack); API.instance().getGridManager().openGrid(WirelessGrid.ID, (EntityPlayerMP) player, stack, slotId);
drainEnergy(RS.INSTANCE.config.wirelessGridOpenUsage); drainEnergy(RS.INSTANCE.config.wirelessGridOpenUsage);

View File

@@ -262,13 +262,13 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC
case 0: case 0:
return 1; return 1;
case 1: case 1:
return 2;
case 2:
return 3;
case 3:
return 4; return 4;
case 2:
return 8;
case 3:
return 16;
case 4: case 4:
return 5; return 32;
default: default:
return 1; return 1;
} }

View File

@@ -135,4 +135,9 @@ public class NetworkNodeCraftingMonitor extends NetworkNode implements ICrafting
TileDataManager.setParameter(TileCraftingMonitor.TAB_PAGE, page); TileDataManager.setParameter(TileCraftingMonitor.TAB_PAGE, page);
} }
} }
@Override
public int getSlotId() {
return -1;
}
} }

View File

@@ -1,6 +1,7 @@
package com.raoulvdberge.refinedstorage.apiimpl.network.node; package com.raoulvdberge.refinedstorage.apiimpl.network.node;
import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.RSItems;
import com.raoulvdberge.refinedstorage.api.util.Action; import com.raoulvdberge.refinedstorage.api.util.Action;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.CoverManager; import com.raoulvdberge.refinedstorage.apiimpl.network.node.cover.CoverManager;
@@ -8,6 +9,7 @@ import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory;
import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerBase;
import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerUpgrade; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerUpgrade;
import com.raoulvdberge.refinedstorage.inventory.listener.ListenerNetworkNode; import com.raoulvdberge.refinedstorage.inventory.listener.ListenerNetworkNode;
import com.raoulvdberge.refinedstorage.item.ItemFilter;
import com.raoulvdberge.refinedstorage.item.ItemUpgrade; import com.raoulvdberge.refinedstorage.item.ItemUpgrade;
import com.raoulvdberge.refinedstorage.tile.TileExporter; import com.raoulvdberge.refinedstorage.tile.TileExporter;
import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.config.IComparable;
@@ -83,21 +85,15 @@ public class NetworkNodeExporter extends NetworkNode implements IComparable, ITy
ItemStack slot = itemFilters.getStackInSlot(filterSlot); ItemStack slot = itemFilters.getStackInSlot(filterSlot);
if (!slot.isEmpty()) { if (!slot.isEmpty()) {
int stackSize = upgrades.getItemInteractCount(); if (slot.getItem() == RSItems.FILTER) {
for (ItemStack slotFilter : ItemFilter.getFilterItemsFromCache(slot)) {
ItemStack took = network.extractItem(slot, Math.min(slot.getMaxStackSize(), stackSize), compare, Action.SIMULATE); if (!slotFilter.isEmpty()) {
doExport(handler, slotFilter);
if (took == null) { }
if (upgrades.hasUpgrade(ItemUpgrade.TYPE_CRAFTING)) { }
network.getCraftingManager().request(new SlottedCraftingRequest(this, filterSlot), slot, stackSize); } else {
} doExport(handler, slot);
} else if (ItemHandlerHelper.insertItem(handler, took, true).isEmpty()) { }
took = network.extractItem(slot, Math.min(slot.getMaxStackSize(), stackSize), compare, Action.PERFORM);
if (took != null) {
ItemHandlerHelper.insertItem(handler, took, false);
}
}
} }
filterSlot++; filterSlot++;
@@ -152,6 +148,24 @@ public class NetworkNodeExporter extends NetworkNode implements IComparable, ITy
} }
} }
private void doExport(IItemHandler handler, ItemStack slot) {
int stackSize = upgrades.getItemInteractCount();
ItemStack took = network.extractItem(slot, Math.min(slot.getMaxStackSize(), stackSize), compare, Action.SIMULATE);
if (took == null) {
if (upgrades.hasUpgrade(ItemUpgrade.TYPE_CRAFTING)) {
network.getCraftingManager().request(new SlottedCraftingRequest(this, filterSlot), slot, stackSize);
}
} else if (ItemHandlerHelper.insertItem(handler, took, true).isEmpty()) {
took = network.extractItem(slot, Math.min(slot.getMaxStackSize(), stackSize), compare, Action.PERFORM);
if (took != null) {
ItemHandlerHelper.insertItem(handler, took, false);
}
}
}
@Override @Override
public int getCompare() { public int getCompare() {
return compare; return compare;

View File

@@ -449,6 +449,11 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I
// NO OP // NO OP
} }
@Override
public int getSlotId() {
return -1;
}
@Override @Override
public void onCrafted(EntityPlayer player) { public void onCrafted(EntityPlayer player) {
onCrafted(this, world, player); onCrafted(this, world, player);

View File

@@ -57,13 +57,29 @@ public abstract class ContainerBase extends Container {
} }
protected void addPlayerInventory(int xInventory, int yInventory) { protected void addPlayerInventory(int xInventory, int yInventory) {
int id = 0; int disabledSlotNumber = getDisabledSlotNumber();
int id = 9;
for (int y = 0; y < 3; y++) {
for (int x = 0; x < 9; x++) {
if (id == disabledSlotNumber) {
addSlotToContainer(new SlotLegacyDisabled(player.inventory, id, xInventory + x * 18, yInventory + y * 18));
} else {
addSlotToContainer(new Slot(player.inventory, id, xInventory + x * 18, yInventory + y * 18));
}
id++;
}
}
id = 0;
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
int x = xInventory + i * 18; int x = xInventory + i * 18;
int y = yInventory + 4 + (3 * 18); int y = yInventory + 4 + (3 * 18);
if (isHeldItemDisabled() && i == player.inventory.currentItem) { if (id == disabledSlotNumber) {
addSlotToContainer(new SlotLegacyDisabled(player.inventory, id, x, y)); addSlotToContainer(new SlotLegacyDisabled(player.inventory, id, x, y));
} else { } else {
addSlotToContainer(new Slot(player.inventory, id, x, y)); addSlotToContainer(new Slot(player.inventory, id, x, y));
@@ -71,14 +87,6 @@ public abstract class ContainerBase extends Container {
id++; id++;
} }
for (int y = 0; y < 3; y++) {
for (int x = 0; x < 9; x++) {
addSlotToContainer(new Slot(player.inventory, id, xInventory + x * 18, yInventory + y * 18));
id++;
}
}
} }
public List<SlotFilterFluid> getFluidSlots() { public List<SlotFilterFluid> getFluidSlots() {
@@ -89,8 +97,12 @@ public abstract class ContainerBase extends Container {
public ItemStack slotClick(int id, int dragType, ClickType clickType, EntityPlayer player) { public ItemStack slotClick(int id, int dragType, ClickType clickType, EntityPlayer player) {
Slot slot = id >= 0 ? getSlot(id) : null; Slot slot = id >= 0 ? getSlot(id) : null;
int disabledSlotNumber = getDisabledSlotNumber();
// Prevent swapping disabled held item with the number keys (dragType is the slot we're swapping with) // Prevent swapping disabled held item with the number keys (dragType is the slot we're swapping with)
if (isHeldItemDisabled() && clickType == ClickType.SWAP && dragType == player.inventory.currentItem) { if (disabledSlotNumber != -1 &&
clickType == ClickType.SWAP &&
dragType == disabledSlotNumber) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@@ -156,8 +168,8 @@ public abstract class ContainerBase extends Container {
return super.canMergeSlot(stack, slot); return super.canMergeSlot(stack, slot);
} }
protected boolean isHeldItemDisabled() { protected int getDisabledSlotNumber() {
return false; return -1;
} }
@Override @Override

View File

@@ -82,8 +82,8 @@ public class ContainerCraftingMonitor extends ContainerBase implements ICrafting
} }
@Override @Override
protected boolean isHeldItemDisabled() { protected int getDisabledSlotNumber() {
return craftingMonitor instanceof WirelessCraftingMonitor; return craftingMonitor.getSlotId();
} }
@Override @Override

View File

@@ -53,7 +53,7 @@ public class ContainerFilter extends ContainerBase {
} }
@Override @Override
protected boolean isHeldItemDisabled() { protected int getDisabledSlotNumber() {
return true; return getPlayer().inventory.currentItem;
} }
} }

View File

@@ -18,9 +18,7 @@ import com.raoulvdberge.refinedstorage.container.slot.legacy.SlotLegacyFilter;
import com.raoulvdberge.refinedstorage.gui.IResizableDisplay; import com.raoulvdberge.refinedstorage.gui.IResizableDisplay;
import com.raoulvdberge.refinedstorage.tile.TileBase; import com.raoulvdberge.refinedstorage.tile.TileBase;
import com.raoulvdberge.refinedstorage.tile.config.IType; import com.raoulvdberge.refinedstorage.tile.config.IType;
import com.raoulvdberge.refinedstorage.tile.grid.WirelessGrid;
import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid; import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid;
import com.raoulvdberge.refinedstorage.tile.grid.portable.PortableGrid;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.IContainerListener; import net.minecraft.inventory.IContainerListener;
@@ -271,8 +269,7 @@ public class ContainerGrid extends ContainerBase implements IGridCraftingListene
} }
@Override @Override
protected boolean isHeldItemDisabled() { protected int getDisabledSlotNumber() {
// Here we check for the concrete portable grid type, not IPortableGrid, because we *CAN* move the held item in the portable grid tile return grid.getSlotId();
return grid instanceof WirelessGrid || grid instanceof PortableGrid;
} }
} }

View File

@@ -143,7 +143,7 @@ public class GuiHandler implements IGuiHandler {
} }
private WirelessCraftingMonitor getWirelessCraftingMonitor(EntityPlayer player, int invIndex) { private WirelessCraftingMonitor getWirelessCraftingMonitor(EntityPlayer player, int invIndex) {
return new WirelessCraftingMonitor(player.inventory.getStackInSlot(invIndex)); return new WirelessCraftingMonitor(player.inventory.getStackInSlot(invIndex), invIndex);
} }
private GuiCraftingMonitor getWirelessCraftingMonitorGui(EntityPlayer player, int invIndex) { private GuiCraftingMonitor getWirelessCraftingMonitorGui(EntityPlayer player, int invIndex) {

View File

@@ -258,10 +258,16 @@ public class EnvironmentNetwork extends AbstractManagedEnvironment {
} }
// Actually do it and return how much fluid we've inserted // Actually do it and return how much fluid we've inserted
FluidStack extracted = node.getNetwork().extractFluid(stack, stack.amount, Action.PERFORM); FluidStack extractedActual = node.getNetwork().extractFluid(stack, filledAmountSim, Action.PERFORM);
handler.fill(extracted, true); int filledAmountActual = handler.fill(extractedActual, true);
return new Object[]{filledAmountSim}; // Attempt to insert excess fluid back into the network
// This shouldn't need to happen for most tanks, unless input cap decreases based on insert amount
if (extractedActual != null && extractedActual.amount > filledAmountActual) {
node.getNetwork().insertFluid(stack, extractedActual.amount - filledAmountActual, Action.PERFORM);
}
return new Object[]{filledAmountActual};
} }
@Callback(doc = "function(stack:table):table -- Gets a fluid from the network.") @Callback(doc = "function(stack:table):table -- Gets a fluid from the network.")

View File

@@ -15,11 +15,13 @@ import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
@@ -28,7 +30,9 @@ import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
public class ItemFilter extends ItemBase { public class ItemFilter extends ItemBase {
private static final String NBT_COMPARE = "Compare"; private static final String NBT_COMPARE = "Compare";
@@ -40,6 +44,13 @@ public class ItemFilter extends ItemBase {
private static final String NBT_TYPE = "Type"; private static final String NBT_TYPE = "Type";
public static final String NBT_FLUID_FILTERS = "FluidFilters"; public static final String NBT_FLUID_FILTERS = "FluidFilters";
private static Map<ItemStack, NonNullList<ItemStack>> FILTER_CACHE = new HashMap<>();
public static NonNullList<ItemStack> getFilterItemsFromCache(ItemStack stack) {
FILTER_CACHE.putIfAbsent(stack, new ItemHandlerFilterItems(stack).getFilteredItems());
return FILTER_CACHE.get(stack);
}
public ItemFilter() { public ItemFilter() {
super(new ItemInfo(RS.ID, "filter")); super(new ItemInfo(RS.ID, "filter"));

View File

@@ -47,7 +47,7 @@ public abstract class ItemNetworkItem extends ItemEnergyItem implements INetwork
ItemStack stack = player.getHeldItem(hand); ItemStack stack = player.getHeldItem(hand);
if (!world.isRemote) { if (!world.isRemote) {
applyNetwork(stack, n -> n.getNetworkItemHandler().open(player, player.getHeldItem(hand)), player::sendMessage); applyNetwork(stack, n -> n.getNetworkItemHandler().open(player, player.getHeldItem(hand), player.inventory.currentItem), player::sendMessage);
} }
return ActionResult.newResult(EnumActionResult.SUCCESS, stack); return ActionResult.newResult(EnumActionResult.SUCCESS, stack);

View File

@@ -33,16 +33,8 @@ public class ItemWirelessCraftingMonitor extends ItemNetworkItem {
@Override @Override
@Nonnull @Nonnull
public INetworkItem provide(INetworkItemHandler handler, EntityPlayer player, ItemStack stack) { public INetworkItem provide(INetworkItemHandler handler, EntityPlayer player, ItemStack stack, int slotId) {
int invIndex = 0; return new NetworkItemWirelessCraftingMonitor(handler, player, stack, slotId);
for (int i = 0; i < player.inventory.getSizeInventory(); ++i) {
if (player.inventory.getStackInSlot(i) == stack) {
invIndex = i;
break;
}
}
return new NetworkItemWirelessCraftingMonitor(handler, player, stack, invIndex);
} }
public static Optional<UUID> getTabSelected(ItemStack stack) { public static Optional<UUID> getTabSelected(ItemStack stack) {

View File

@@ -29,8 +29,8 @@ public class ItemWirelessFluidGrid extends ItemNetworkItem {
@Override @Override
@Nonnull @Nonnull
public INetworkItem provide(INetworkItemHandler handler, EntityPlayer player, ItemStack stack) { public INetworkItem provide(INetworkItemHandler handler, EntityPlayer player, ItemStack stack, int slotId) {
return new NetworkItemWirelessFluidGrid(handler, player, stack); return new NetworkItemWirelessFluidGrid(handler, player, stack, slotId);
} }
public static int getSortingType(ItemStack stack) { public static int getSortingType(ItemStack stack) {

View File

@@ -34,8 +34,8 @@ public class ItemWirelessGrid extends ItemNetworkItem {
@Override @Override
@Nonnull @Nonnull
public INetworkItem provide(INetworkItemHandler handler, EntityPlayer player, ItemStack stack) { public INetworkItem provide(INetworkItemHandler handler, EntityPlayer player, ItemStack stack, int slotId) {
return new NetworkItemWirelessGrid(handler, player, stack); return new NetworkItemWirelessGrid(handler, player, stack, slotId);
} }
public static int getViewType(ItemStack stack) { public static int getViewType(ItemStack stack) {

View File

@@ -30,7 +30,7 @@ public class ItemBlockPortableGrid extends ItemBlockEnergyItem {
ItemStack stack = player.getHeldItem(hand); ItemStack stack = player.getHeldItem(hand);
if (!world.isRemote) { if (!world.isRemote) {
API.instance().getGridManager().openGrid(PortableGrid.ID, (EntityPlayerMP) player, stack); API.instance().getGridManager().openGrid(PortableGrid.ID, (EntityPlayerMP) player, stack, player.inventory.currentItem);
} }
return ActionResult.newResult(EnumActionResult.SUCCESS, stack); return ActionResult.newResult(EnumActionResult.SUCCESS, stack);

View File

@@ -18,12 +18,13 @@ public class MessageGridOpen implements IMessage, IMessageHandler<MessageGridOpe
private BlockPos pos; private BlockPos pos;
@Nullable @Nullable
private ItemStack stack; private ItemStack stack;
private int slotId;
private int gridId; private int gridId;
public MessageGridOpen() { public MessageGridOpen() {
} }
public MessageGridOpen(int windowId, @Nullable BlockPos pos, int gridId, @Nullable ItemStack stack) { public MessageGridOpen(int windowId, @Nullable BlockPos pos, int gridId, @Nullable ItemStack stack, int slotId) {
if (pos == null && stack == null) { if (pos == null && stack == null) {
throw new IllegalArgumentException("Can't be both null"); throw new IllegalArgumentException("Can't be both null");
} }
@@ -32,12 +33,14 @@ public class MessageGridOpen implements IMessage, IMessageHandler<MessageGridOpe
this.pos = pos; this.pos = pos;
this.stack = stack; this.stack = stack;
this.gridId = gridId; this.gridId = gridId;
this.slotId = slotId;
} }
@Override @Override
public void fromBytes(ByteBuf buf) { public void fromBytes(ByteBuf buf) {
windowId = buf.readInt(); windowId = buf.readInt();
gridId = buf.readInt(); gridId = buf.readInt();
slotId = buf.readInt();
if (buf.readBoolean()) { if (buf.readBoolean()) {
pos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt()); pos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt());
@@ -52,6 +55,7 @@ public class MessageGridOpen implements IMessage, IMessageHandler<MessageGridOpe
public void toBytes(ByteBuf buf) { public void toBytes(ByteBuf buf) {
buf.writeInt(windowId); buf.writeInt(windowId);
buf.writeInt(gridId); buf.writeInt(gridId);
buf.writeInt(slotId);
buf.writeBoolean(pos != null); buf.writeBoolean(pos != null);
if (pos != null) { if (pos != null) {
@@ -84,6 +88,10 @@ public class MessageGridOpen implements IMessage, IMessageHandler<MessageGridOpe
return gridId; return gridId;
} }
public int getSlotId() {
return slotId;
}
@Override @Override
public IMessage onMessage(MessageGridOpen message, MessageContext ctx) { public IMessage onMessage(MessageGridOpen message, MessageContext ctx) {
Minecraft.getMinecraft().addScheduledTask(new GridOpenHandler(message)); Minecraft.getMinecraft().addScheduledTask(new GridOpenHandler(message));

View File

@@ -10,7 +10,6 @@ import com.raoulvdberge.refinedstorage.util.StackUtils;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessage;

View File

@@ -25,9 +25,9 @@ public class MessageNetworkItemOpen extends MessageHandlerPlayerToServer<Message
ItemStack stack = player.inventory.getStackInSlot(message.slotId); ItemStack stack = player.inventory.getStackInSlot(message.slotId);
if (stack.getItem() instanceof ItemNetworkItem) { if (stack.getItem() instanceof ItemNetworkItem) {
((ItemNetworkItem) stack.getItem()).applyNetwork(stack, n -> n.getNetworkItemHandler().open(player, player.inventory.getStackInSlot(message.slotId)), player::sendMessage); ((ItemNetworkItem) stack.getItem()).applyNetwork(stack, n -> n.getNetworkItemHandler().open(player, stack, message.slotId), player::sendMessage);
} else if (stack.getItem() == Item.getItemFromBlock(RSBlocks.PORTABLE_GRID)) { // @Hack } else if (stack.getItem() == Item.getItemFromBlock(RSBlocks.PORTABLE_GRID)) { // @Hack
API.instance().getGridManager().openGrid(PortableGrid.ID, player, stack); API.instance().getGridManager().openGrid(PortableGrid.ID, player, stack, message.slotId);
} }
} }

View File

@@ -510,6 +510,14 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe
return world; return world;
} }
@Override
public World getWorld()
{
// This is provided by net.minecraft.TileEntity - and needed as a part of INetworkNode
// After obfuscation - these two methods will not be the same - so we have to redefine this here
return this.world;
}
@Override @Override
public void read(NBTTagCompound tag) { public void read(NBTTagCompound tag) {
super.read(tag); super.read(tag);

View File

@@ -1,8 +1,10 @@
package com.raoulvdberge.refinedstorage.tile.config; package com.raoulvdberge.refinedstorage.tile.config;
import com.raoulvdberge.refinedstorage.RSItems;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy;
import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory;
import com.raoulvdberge.refinedstorage.item.ItemFilter;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.datasync.DataSerializers; import net.minecraft.network.datasync.DataSerializers;
@@ -24,21 +26,44 @@ public interface IFilterable {
static boolean acceptsItem(IItemHandler filters, int mode, int compare, ItemStack stack) { static boolean acceptsItem(IItemHandler filters, int mode, int compare, ItemStack stack) {
if (mode == WHITELIST) { if (mode == WHITELIST) {
int slots = 0;
for (int i = 0; i < filters.getSlots(); ++i) { for (int i = 0; i < filters.getSlots(); ++i) {
ItemStack slot = filters.getStackInSlot(i); ItemStack slot = filters.getStackInSlot(i);
if (API.instance().getComparer().isEqual(slot, stack, compare)) { if (!slot.isEmpty()) {
return true; slots++;
if (slot.getItem() == RSItems.FILTER) {
for (ItemStack slotInFilter : ItemFilter.getFilterItemsFromCache(slot)) {
if (!slotInFilter.isEmpty() && API.instance().getComparer().isEqual(
slotInFilter,
stack,
compare
)) {
return true;
}
}
} else if (API.instance().getComparer().isEqual(slot, stack, compare)) {
return true;
}
} }
} }
return slots == 0;
return false;
} else if (mode == BLACKLIST) { } else if (mode == BLACKLIST) {
for (int i = 0; i < filters.getSlots(); ++i) { for (int i = 0; i < filters.getSlots(); ++i) {
ItemStack slot = filters.getStackInSlot(i); ItemStack slot = filters.getStackInSlot(i);
if (API.instance().getComparer().isEqual(slot, stack, compare)) { if (!slot.isEmpty()) {
return false; if (slot.getItem() == RSItems.FILTER) {
for (ItemStack slotInFilter : ItemFilter.getFilterItemsFromCache(slot)) {
if (!slotInFilter.isEmpty() && API.instance().getComparer().isEqual(slotInFilter, stack, compare)) {
return false;
}
}
} else if (API.instance().getComparer().isEqual(slot, stack, compare)) {
return false;
}
} }
} }

View File

@@ -36,4 +36,6 @@ public interface ICraftingMonitor {
void onTabSelectionChanged(Optional<UUID> taskId); void onTabSelectionChanged(Optional<UUID> taskId);
void onTabPageChanged(int page); void onTabPageChanged(int page);
int getSlotId();
} }

View File

@@ -28,9 +28,11 @@ public class WirelessCraftingMonitor implements ICraftingMonitor {
private BlockPos network; private BlockPos network;
private int tabPage; private int tabPage;
private Optional<UUID> tabSelected; private Optional<UUID> tabSelected;
private int slotId;
public WirelessCraftingMonitor(ItemStack stack) { public WirelessCraftingMonitor(ItemStack stack, int slotId) {
this.stack = stack; this.stack = stack;
this.slotId = slotId;
this.networkDimension = ItemWirelessCraftingMonitor.getDimensionId(stack); this.networkDimension = ItemWirelessCraftingMonitor.getDimensionId(stack);
this.network = new BlockPos(ItemWirelessCraftingMonitor.getX(stack), ItemWirelessCraftingMonitor.getY(stack), ItemWirelessCraftingMonitor.getZ(stack)); this.network = new BlockPos(ItemWirelessCraftingMonitor.getX(stack), ItemWirelessCraftingMonitor.getY(stack), ItemWirelessCraftingMonitor.getZ(stack));
this.tabPage = ItemWirelessCraftingMonitor.getTabPage(stack); this.tabPage = ItemWirelessCraftingMonitor.getTabPage(stack);
@@ -138,4 +140,9 @@ public class WirelessCraftingMonitor implements ICraftingMonitor {
RS.INSTANCE.network.sendToServer(new MessageWirelessCraftingMonitorSettings(tabSelected, tabPage)); RS.INSTANCE.network.sendToServer(new MessageWirelessCraftingMonitorSettings(tabSelected, tabPage));
} }
} }
@Override
public int getSlotId() {
return slotId;
}
} }

View File

@@ -39,6 +39,7 @@ public class WirelessFluidGrid implements IGridNetworkAware {
private int networkDimension; private int networkDimension;
private BlockPos network; private BlockPos network;
private int slotId;
private int sortingType; private int sortingType;
private int sortingDirection; private int sortingDirection;
@@ -62,11 +63,12 @@ public class WirelessFluidGrid implements IGridNetworkAware {
} }
}; };
public WirelessFluidGrid(ItemStack stack) { public WirelessFluidGrid(ItemStack stack, int slotId) {
this.networkDimension = ItemWirelessFluidGrid.getDimensionId(stack); this.networkDimension = ItemWirelessFluidGrid.getDimensionId(stack);
this.network = new BlockPos(ItemWirelessFluidGrid.getX(stack), ItemWirelessFluidGrid.getY(stack), ItemWirelessFluidGrid.getZ(stack)); this.network = new BlockPos(ItemWirelessFluidGrid.getX(stack), ItemWirelessFluidGrid.getY(stack), ItemWirelessFluidGrid.getZ(stack));
this.stack = stack; this.stack = stack;
this.slotId = slotId;
this.sortingType = ItemWirelessFluidGrid.getSortingType(stack); this.sortingType = ItemWirelessFluidGrid.getSortingType(stack);
this.sortingDirection = ItemWirelessFluidGrid.getSortingDirection(stack); this.sortingDirection = ItemWirelessFluidGrid.getSortingDirection(stack);
@@ -294,6 +296,11 @@ public class WirelessFluidGrid implements IGridNetworkAware {
return true; return true;
} }
@Override
public int getSlotId() {
return slotId;
}
@Override @Override
public void onClosed(EntityPlayer player) { public void onClosed(EntityPlayer player) {
INetwork network = getNetwork(); INetwork network = getNetwork();

View File

@@ -39,6 +39,7 @@ public class WirelessGrid implements IGridNetworkAware {
private int networkDimension; private int networkDimension;
private BlockPos network; private BlockPos network;
private int slotId;
private int viewType; private int viewType;
private int sortingType; private int sortingType;
@@ -63,11 +64,12 @@ public class WirelessGrid implements IGridNetworkAware {
} }
}; };
public WirelessGrid(ItemStack stack) { public WirelessGrid(ItemStack stack, int slotId) {
this.networkDimension = ItemWirelessGrid.getDimensionId(stack); this.networkDimension = ItemWirelessGrid.getDimensionId(stack);
this.network = new BlockPos(ItemWirelessGrid.getX(stack), ItemWirelessGrid.getY(stack), ItemWirelessGrid.getZ(stack)); this.network = new BlockPos(ItemWirelessGrid.getX(stack), ItemWirelessGrid.getY(stack), ItemWirelessGrid.getZ(stack));
this.stack = stack; this.stack = stack;
this.slotId = slotId;
this.viewType = ItemWirelessGrid.getViewType(stack); this.viewType = ItemWirelessGrid.getViewType(stack);
this.sortingType = ItemWirelessGrid.getSortingType(stack); this.sortingType = ItemWirelessGrid.getSortingType(stack);
@@ -300,6 +302,12 @@ public class WirelessGrid implements IGridNetworkAware {
return true; return true;
} }
@Override
public int getSlotId() {
return slotId;
}
@Override @Override
public void onClosed(EntityPlayer player) { public void onClosed(EntityPlayer player) {
INetwork network = getNetwork(); INetwork network = getNetwork();

View File

@@ -63,6 +63,7 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
private EntityPlayer player; private EntityPlayer player;
private ItemStack stack; private ItemStack stack;
private int slotId;
private int sortingType; private int sortingType;
private int sortingDirection; private int sortingDirection;
@@ -132,9 +133,10 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
} }
}; };
public PortableGrid(EntityPlayer player, ItemStack stack) { public PortableGrid(EntityPlayer player, ItemStack stack, int slotId) {
this.player = player; this.player = player;
this.stack = stack; this.stack = stack;
this.slotId = slotId;
if (player != null) { if (player != null) {
this.sortingType = ItemWirelessGrid.getSortingType(stack); this.sortingType = ItemWirelessGrid.getSortingType(stack);
@@ -426,6 +428,11 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
return true; return true;
} }
@Override
public int getSlotId() {
return slotId;
}
@Override @Override
public AccessType getAccessType() { public AccessType getAccessType() {
return AccessType.INSERT_EXTRACT; return AccessType.INSERT_EXTRACT;

View File

@@ -519,6 +519,11 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
return redstoneMode.isEnabled(world, pos); return redstoneMode.isEnabled(world, pos);
} }
@Override
public int getSlotId() {
return -1;
}
@Override @Override
@Nullable @Nullable
public IStorageCache getCache() { public IStorageCache getCache() {