Fixed client FPS stuttering when opening a Crafting Grid.
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
### 1.6.9
|
### 1.6.9
|
||||||
- Fixed OpenComputers "unknown error" when using extract item API (raoulvdberge)
|
- Fixed OpenComputers "unknown error" when using extract item API (raoulvdberge)
|
||||||
|
- Fixed client FPS stuttering when opening a Crafting Grid (raoulvdberge)
|
||||||
|
|
||||||
### 1.6.8
|
### 1.6.8
|
||||||
- Fixed Ender IO incompatibility (raoulvdberge)
|
- Fixed Ender IO incompatibility (raoulvdberge)
|
||||||
|
@@ -73,6 +73,18 @@ public interface IGrid {
|
|||||||
@Nullable
|
@Nullable
|
||||||
IFluidGridHandler getFluidHandler();
|
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
|
* @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;
|
package com.raoulvdberge.refinedstorage.api.storage;
|
||||||
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
@@ -30,5 +29,10 @@ public interface IStorageCacheListener<T> {
|
|||||||
*/
|
*/
|
||||||
void onChanged(@Nonnull T stack, int size);
|
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);
|
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.RSBlocks;
|
||||||
import com.raoulvdberge.refinedstorage.RSItems;
|
import com.raoulvdberge.refinedstorage.RSItems;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
import com.raoulvdberge.refinedstorage.api.network.grid.*;
|
||||||
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.handler.IFluidGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.item.INetworkItem;
|
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.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, IType {
|
public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, IType {
|
||||||
public static final String ID = "grid";
|
public static final String ID = "grid";
|
||||||
@@ -80,8 +79,10 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCraftMatrixChanged(IInventory inventory) {
|
public void onCraftMatrixChanged(IInventory inventory) {
|
||||||
|
if (!world.isRemote) {
|
||||||
onCraftingMatrixChanged();
|
onCraftingMatrixChanged();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
private IRecipe currentRecipe;
|
private IRecipe currentRecipe;
|
||||||
private InventoryCrafting matrix = new InventoryCrafting(craftingContainer, 3, 3);
|
private InventoryCrafting matrix = new InventoryCrafting(craftingContainer, 3, 3);
|
||||||
@@ -89,6 +90,8 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I
|
|||||||
private ItemHandlerBase processingMatrix = new ItemHandlerBase(9 * 2, new ListenerNetworkNode(this));
|
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 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)) {
|
private ItemHandlerBase patterns = new ItemHandlerBase(2, new ListenerNetworkNode(this), new ItemValidatorBasic(RSItems.PATTERN)) {
|
||||||
@Override
|
@Override
|
||||||
protected void onContentsChanged(int slot) {
|
protected void onContentsChanged(int slot) {
|
||||||
@@ -252,6 +255,16 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I
|
|||||||
return network != null ? network.getFluidGridHandler() : null;
|
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
|
@Override
|
||||||
public String getGuiTitle() {
|
public String getGuiTitle() {
|
||||||
GridType type = getGridType();
|
GridType type = getGridType();
|
||||||
@@ -317,6 +330,8 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I
|
|||||||
result.setInventorySlotContents(0, currentRecipe.getCraftingResult(matrix));
|
result.setInventorySlotContents(0, currentRecipe.getCraftingResult(matrix));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
craftingListeners.forEach(IGridCraftingListener::onCraftingOutputChanged);
|
||||||
|
|
||||||
markDirty();
|
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.GridType;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
|
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.IFluidGridHandler;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||||
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
|
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.IContainerListener;
|
||||||
import net.minecraft.inventory.Slot;
|
import net.minecraft.inventory.Slot;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.network.play.server.SPacketSetSlot;
|
||||||
import net.minecraftforge.items.SlotItemHandler;
|
import net.minecraftforge.items.SlotItemHandler;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public class ContainerGrid extends ContainerBase {
|
public class ContainerGrid extends ContainerBase implements IGridCraftingListener {
|
||||||
private IGrid grid;
|
private IGrid grid;
|
||||||
private IStorageCache cache;
|
private IStorageCache cache;
|
||||||
private IStorageCacheListener listener;
|
private IStorageCacheListener listener;
|
||||||
@@ -45,6 +47,8 @@ public class ContainerGrid extends ContainerBase {
|
|||||||
this.display = display;
|
this.display = display;
|
||||||
|
|
||||||
initSlots();
|
initSlots();
|
||||||
|
|
||||||
|
grid.addCraftingListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initSlots() {
|
public void initSlots() {
|
||||||
@@ -73,7 +77,7 @@ public class ContainerGrid extends ContainerBase {
|
|||||||
if (slot == craftingResultSlot) {
|
if (slot == craftingResultSlot) {
|
||||||
grid.onCraftedShift(getPlayer());
|
grid.onCraftedShift(getPlayer());
|
||||||
|
|
||||||
sendCraftingSlots();
|
onCraftingOutputChanged();
|
||||||
|
|
||||||
detectAndSendChanges();
|
detectAndSendChanges();
|
||||||
} else {
|
} else {
|
||||||
@@ -199,13 +203,17 @@ public class ContainerGrid extends ContainerBase {
|
|||||||
return grid;
|
return grid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendCraftingSlots() {
|
@Override
|
||||||
|
public void onCraftingOutputChanged() {
|
||||||
for (int i = 0; i < inventorySlots.size(); ++i) {
|
for (int i = 0; i < inventorySlots.size(); ++i) {
|
||||||
Slot slot = inventorySlots.get(i);
|
Slot slot = inventorySlots.get(i);
|
||||||
|
|
||||||
if (slot instanceof SlotGridCrafting || slot == craftingResultSlot) {
|
if (slot instanceof SlotGridCrafting || slot == craftingResultSlot) {
|
||||||
for (IContainerListener listener : listeners) {
|
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);
|
cache.removeListener(listener);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grid.removeCraftingListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -27,7 +27,7 @@ public class SlotGridCraftingResult extends SlotCrafting {
|
|||||||
if (!player.getEntityWorld().isRemote) {
|
if (!player.getEntityWorld().isRemote) {
|
||||||
grid.onCrafted(player);
|
grid.onCrafted(player);
|
||||||
|
|
||||||
container.sendCraftingSlots();
|
container.onCraftingOutputChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
return ItemStack.EMPTY;
|
return ItemStack.EMPTY;
|
||||||
|
@@ -2,10 +2,7 @@ package com.raoulvdberge.refinedstorage.tile.grid;
|
|||||||
|
|
||||||
import com.raoulvdberge.refinedstorage.RS;
|
import com.raoulvdberge.refinedstorage.RS;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
import com.raoulvdberge.refinedstorage.api.network.grid.*;
|
||||||
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.handler.IFluidGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||||
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
|
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
|
||||||
@@ -133,6 +130,16 @@ public class WirelessFluidGrid implements IGridNetworkAware {
|
|||||||
return network != null ? network.getFluidGridHandler() : null;
|
return network != null ? network.getFluidGridHandler() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addCraftingListener(IGridCraftingListener listener) {
|
||||||
|
// NO OP
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeCraftingListener(IGridCraftingListener listener) {
|
||||||
|
// NO OP
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getGuiTitle() {
|
public String getGuiTitle() {
|
||||||
return "gui.refinedstorage:fluid_grid";
|
return "gui.refinedstorage:fluid_grid";
|
||||||
|
@@ -2,10 +2,7 @@ package com.raoulvdberge.refinedstorage.tile.grid;
|
|||||||
|
|
||||||
import com.raoulvdberge.refinedstorage.RS;
|
import com.raoulvdberge.refinedstorage.RS;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
import com.raoulvdberge.refinedstorage.api.network.INetwork;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
import com.raoulvdberge.refinedstorage.api.network.grid.*;
|
||||||
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.handler.IFluidGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||||
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
|
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
|
||||||
@@ -135,6 +132,16 @@ public class WirelessGrid implements IGridNetworkAware {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addCraftingListener(IGridCraftingListener listener) {
|
||||||
|
// NO OP
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeCraftingListener(IGridCraftingListener listener) {
|
||||||
|
// NO OP
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getGuiTitle() {
|
public String getGuiTitle() {
|
||||||
return "gui.refinedstorage:grid";
|
return "gui.refinedstorage:grid";
|
||||||
|
@@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.tile.grid.portable;
|
|||||||
import com.raoulvdberge.refinedstorage.RS;
|
import com.raoulvdberge.refinedstorage.RS;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
|
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.IGridTab;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||||
@@ -236,6 +237,16 @@ public class PortableGrid implements IGrid, IPortableGrid, IStorageDiskContainer
|
|||||||
return fluidHandler;
|
return fluidHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addCraftingListener(IGridCraftingListener listener) {
|
||||||
|
// NO OP
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeCraftingListener(IGridCraftingListener listener) {
|
||||||
|
// NO OP
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getGuiTitle() {
|
public String getGuiTitle() {
|
||||||
return "gui.refinedstorage:portable_grid";
|
return "gui.refinedstorage:portable_grid";
|
||||||
|
@@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.RS;
|
|||||||
import com.raoulvdberge.refinedstorage.RSBlocks;
|
import com.raoulvdberge.refinedstorage.RSBlocks;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
import com.raoulvdberge.refinedstorage.api.network.grid.GridType;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
|
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.IGridTab;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler;
|
||||||
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler;
|
||||||
@@ -313,6 +314,16 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
|
|||||||
return fluidHandler;
|
return fluidHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addCraftingListener(IGridCraftingListener listener) {
|
||||||
|
// NO OP
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeCraftingListener(IGridCraftingListener listener) {
|
||||||
|
// NO OP
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getGuiTitle() {
|
public String getGuiTitle() {
|
||||||
return "gui.refinedstorage:portable_grid";
|
return "gui.refinedstorage:portable_grid";
|
||||||
|
Reference in New Issue
Block a user