Fixed client FPS stuttering when opening a Crafting Grid.
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
### 1.6.9
|
||||
- Fixed OpenComputers "unknown error" when using extract item API (raoulvdberge)
|
||||
- Fixed client FPS stuttering when opening a Crafting Grid (raoulvdberge)
|
||||
|
||||
### 1.6.8
|
||||
- Fixed Ender IO incompatibility (raoulvdberge)
|
||||
|
@@ -73,6 +73,18 @@ public interface IGrid {
|
||||
@Nullable
|
||||
IFluidGridHandler getFluidHandler();
|
||||
|
||||
/**
|
||||
* @param listener the listener
|
||||
*/
|
||||
default void addCraftingListener(IGridCraftingListener listener) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param listener the listener
|
||||
*/
|
||||
default void removeCraftingListener(IGridCraftingListener listener) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an unlocalized gui title
|
||||
*/
|
||||
|
@@ -0,0 +1,12 @@
|
||||
package com.raoulvdberge.refinedstorage.api.network.grid;
|
||||
|
||||
/**
|
||||
* A crafting listener for the grid.
|
||||
*/
|
||||
public interface IGridCraftingListener {
|
||||
/**
|
||||
* Called when the crafting output changes.
|
||||
* Usually you'd send slot updates for the crafting slots (and output slot) here, so that all clients get an actual view.
|
||||
*/
|
||||
void onCraftingOutputChanged();
|
||||
}
|
@@ -1,6 +1,5 @@
|
||||
package com.raoulvdberge.refinedstorage.api.storage;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
@@ -30,5 +29,10 @@ public interface IStorageCacheListener<T> {
|
||||
*/
|
||||
void onChanged(@Nonnull T stack, int size);
|
||||
|
||||
/**
|
||||
* Called when the storage cache changes.
|
||||
*
|
||||
* @param stacks a list of stacks that are changed, with the size changed (negative if the amount decreases)
|
||||
*/
|
||||
void onChangedBulk(@Nonnull List<Pair<T, Integer>> stacks);
|
||||
}
|
||||
|
@@ -4,10 +4,7 @@ import com.raoulvdberge.refinedstorage.RS;
|
||||
import com.raoulvdberge.refinedstorage.RSBlocks;
|
||||
import com.raoulvdberge.refinedstorage.RSItems;
|
||||
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridNetworkAware;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.*;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||
import com.raoulvdberge.refinedstorage.api.network.item.INetworkItem;
|
||||
@@ -55,7 +52,9 @@ import net.minecraftforge.items.wrapper.InvWrapper;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, IType {
|
||||
public static final String ID = "grid";
|
||||
@@ -80,7 +79,9 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I
|
||||
|
||||
@Override
|
||||
public void onCraftMatrixChanged(IInventory inventory) {
|
||||
onCraftingMatrixChanged();
|
||||
if (!world.isRemote) {
|
||||
onCraftingMatrixChanged();
|
||||
}
|
||||
}
|
||||
};
|
||||
private IRecipe currentRecipe;
|
||||
@@ -89,6 +90,8 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I
|
||||
private ItemHandlerBase processingMatrix = new ItemHandlerBase(9 * 2, new ListenerNetworkNode(this));
|
||||
private FluidInventory processingMatrixFluids = new FluidInventory(9 * 2, Fluid.BUCKET_VOLUME * 64, new ListenerNetworkNode(this));
|
||||
|
||||
private Set<IGridCraftingListener> craftingListeners = new HashSet<>();
|
||||
|
||||
private ItemHandlerBase patterns = new ItemHandlerBase(2, new ListenerNetworkNode(this), new ItemValidatorBasic(RSItems.PATTERN)) {
|
||||
@Override
|
||||
protected void onContentsChanged(int slot) {
|
||||
@@ -252,6 +255,16 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I
|
||||
return network != null ? network.getFluidGridHandler() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCraftingListener(IGridCraftingListener listener) {
|
||||
craftingListeners.add(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCraftingListener(IGridCraftingListener listener) {
|
||||
craftingListeners.remove(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getGuiTitle() {
|
||||
GridType type = getGridType();
|
||||
@@ -317,6 +330,8 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I
|
||||
result.setInventorySlotContents(0, currentRecipe.getCraftingResult(matrix));
|
||||
}
|
||||
|
||||
craftingListeners.forEach(IGridCraftingListener::onCraftingOutputChanged);
|
||||
|
||||
markDirty();
|
||||
}
|
||||
|
||||
|
@@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.container;
|
||||
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridCraftingListener;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
|
||||
@@ -25,11 +26,12 @@ import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.inventory.IContainerListener;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.play.server.SPacketSetSlot;
|
||||
import net.minecraftforge.items.SlotItemHandler;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class ContainerGrid extends ContainerBase {
|
||||
public class ContainerGrid extends ContainerBase implements IGridCraftingListener {
|
||||
private IGrid grid;
|
||||
private IStorageCache cache;
|
||||
private IStorageCacheListener listener;
|
||||
@@ -45,6 +47,8 @@ public class ContainerGrid extends ContainerBase {
|
||||
this.display = display;
|
||||
|
||||
initSlots();
|
||||
|
||||
grid.addCraftingListener(this);
|
||||
}
|
||||
|
||||
public void initSlots() {
|
||||
@@ -73,7 +77,7 @@ public class ContainerGrid extends ContainerBase {
|
||||
if (slot == craftingResultSlot) {
|
||||
grid.onCraftedShift(getPlayer());
|
||||
|
||||
sendCraftingSlots();
|
||||
onCraftingOutputChanged();
|
||||
|
||||
detectAndSendChanges();
|
||||
} else {
|
||||
@@ -199,13 +203,17 @@ public class ContainerGrid extends ContainerBase {
|
||||
return grid;
|
||||
}
|
||||
|
||||
public void sendCraftingSlots() {
|
||||
@Override
|
||||
public void onCraftingOutputChanged() {
|
||||
for (int i = 0; i < inventorySlots.size(); ++i) {
|
||||
Slot slot = inventorySlots.get(i);
|
||||
|
||||
if (slot instanceof SlotGridCrafting || slot == craftingResultSlot) {
|
||||
for (IContainerListener listener : listeners) {
|
||||
listener.sendSlotContents(this, i, slot.getStack());
|
||||
// @Volatile: We can't use IContainerListener#sendSlotContents since EntityPlayerMP blocks SlotCrafting changes...
|
||||
if (listener instanceof EntityPlayerMP) {
|
||||
((EntityPlayerMP) listener).connection.sendPacket(new SPacketSetSlot(windowId, i, slot.getStack()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -246,6 +254,8 @@ public class ContainerGrid extends ContainerBase {
|
||||
cache.removeListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
grid.removeCraftingListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -27,7 +27,7 @@ public class SlotGridCraftingResult extends SlotCrafting {
|
||||
if (!player.getEntityWorld().isRemote) {
|
||||
grid.onCrafted(player);
|
||||
|
||||
container.sendCraftingSlots();
|
||||
container.onCraftingOutputChanged();
|
||||
}
|
||||
|
||||
return ItemStack.EMPTY;
|
||||
|
@@ -2,10 +2,7 @@ package com.raoulvdberge.refinedstorage.tile.grid;
|
||||
|
||||
import com.raoulvdberge.refinedstorage.RS;
|
||||
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridNetworkAware;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.*;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
|
||||
@@ -133,6 +130,16 @@ public class WirelessFluidGrid implements IGridNetworkAware {
|
||||
return network != null ? network.getFluidGridHandler() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCraftingListener(IGridCraftingListener listener) {
|
||||
// NO OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCraftingListener(IGridCraftingListener listener) {
|
||||
// NO OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getGuiTitle() {
|
||||
return "gui.refinedstorage:fluid_grid";
|
||||
|
@@ -2,10 +2,7 @@ package com.raoulvdberge.refinedstorage.tile.grid;
|
||||
|
||||
import com.raoulvdberge.refinedstorage.RS;
|
||||
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridNetworkAware;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.*;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
|
||||
@@ -135,6 +132,16 @@ public class WirelessGrid implements IGridNetworkAware {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCraftingListener(IGridCraftingListener listener) {
|
||||
// NO OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCraftingListener(IGridCraftingListener listener) {
|
||||
// NO OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getGuiTitle() {
|
||||
return "gui.refinedstorage:grid";
|
||||
|
@@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.tile.grid.portable;
|
||||
import com.raoulvdberge.refinedstorage.RS;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridCraftingListener;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||
@@ -236,6 +237,16 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
|
||||
return fluidHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCraftingListener(IGridCraftingListener listener) {
|
||||
// NO OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCraftingListener(IGridCraftingListener listener) {
|
||||
// NO OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getGuiTitle() {
|
||||
return "gui.refinedstorage:portable_grid";
|
||||
|
@@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.RS;
|
||||
import com.raoulvdberge.refinedstorage.RSBlocks;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridCraftingListener;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||
@@ -313,6 +314,16 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
|
||||
return fluidHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCraftingListener(IGridCraftingListener listener) {
|
||||
// NO OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCraftingListener(IGridCraftingListener listener) {
|
||||
// NO OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getGuiTitle() {
|
||||
return "gui.refinedstorage:portable_grid";
|
||||
|
Reference in New Issue
Block a user