Fixed high CPU load when Refined Storage GUIs are open, fixes #1295
This commit is contained in:
@@ -9,6 +9,7 @@ import com.raoulvdberge.refinedstorage.network.MessageGridItemDelta;
|
|||||||
import com.raoulvdberge.refinedstorage.network.MessageGridItemUpdate;
|
import com.raoulvdberge.refinedstorage.network.MessageGridItemUpdate;
|
||||||
import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid;
|
import com.raoulvdberge.refinedstorage.tile.grid.portable.IPortableGrid;
|
||||||
import com.raoulvdberge.refinedstorage.util.StackUtils;
|
import com.raoulvdberge.refinedstorage.util.StackUtils;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.entity.player.EntityPlayerMP;
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
@@ -36,7 +37,7 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
|
|||||||
|
|
||||||
listeners.forEach(Runnable::run);
|
listeners.forEach(Runnable::run);
|
||||||
|
|
||||||
portableGrid.getWatchers().forEach(w -> sendUpdateTo(w.getPlayer()));
|
portableGrid.getWatchers().forEach(this::sendUpdateTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -44,7 +45,7 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
|
|||||||
list.add(stack, size);
|
list.add(stack, size);
|
||||||
|
|
||||||
if (!rebuilding) {
|
if (!rebuilding) {
|
||||||
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, size), w.getPlayer()));
|
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, size), (EntityPlayerMP) w));
|
||||||
|
|
||||||
listeners.forEach(Runnable::run);
|
listeners.forEach(Runnable::run);
|
||||||
}
|
}
|
||||||
@@ -53,7 +54,7 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
|
|||||||
@Override
|
@Override
|
||||||
public void remove(@Nonnull ItemStack stack, int size, boolean batched) {
|
public void remove(@Nonnull ItemStack stack, int size, boolean batched) {
|
||||||
if (list.remove(stack, size)) {
|
if (list.remove(stack, size)) {
|
||||||
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, -size), w.getPlayer()));
|
portableGrid.getWatchers().forEach(w -> RS.INSTANCE.network.sendTo(new MessageGridItemDelta(null, stack, -size), (EntityPlayerMP) w));
|
||||||
|
|
||||||
listeners.forEach(Runnable::run);
|
listeners.forEach(Runnable::run);
|
||||||
}
|
}
|
||||||
@@ -84,13 +85,13 @@ public class StorageCacheItemPortable implements IStorageCache<ItemStack> {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendUpdateTo(EntityPlayerMP player) {
|
public void sendUpdateTo(EntityPlayer player) {
|
||||||
RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(buf -> {
|
RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(buf -> {
|
||||||
buf.writeInt(list.getStacks().size());
|
buf.writeInt(list.getStacks().size());
|
||||||
|
|
||||||
for (ItemStack stack : list.getStacks()) {
|
for (ItemStack stack : list.getStacks()) {
|
||||||
StackUtils.writeItemStack(buf, stack, null, false);
|
StackUtils.writeItemStack(buf, stack, null, false);
|
||||||
}
|
}
|
||||||
}, false), player);
|
}, false), (EntityPlayerMP) player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.tile.data;
|
|||||||
|
|
||||||
import com.raoulvdberge.refinedstorage.RS;
|
import com.raoulvdberge.refinedstorage.RS;
|
||||||
import com.raoulvdberge.refinedstorage.network.MessageTileDataParameterUpdate;
|
import com.raoulvdberge.refinedstorage.network.MessageTileDataParameterUpdate;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -20,6 +21,7 @@ public class TileDataManager {
|
|||||||
private List<TileDataParameter> watchedParameters = new ArrayList<>();
|
private List<TileDataParameter> watchedParameters = new ArrayList<>();
|
||||||
|
|
||||||
private List<TileDataWatcher> watchers = new CopyOnWriteArrayList<>();
|
private List<TileDataWatcher> watchers = new CopyOnWriteArrayList<>();
|
||||||
|
private List<EntityPlayer> playersWatching = new CopyOnWriteArrayList<>();
|
||||||
|
|
||||||
public TileDataManager(TileEntity tile) {
|
public TileDataManager(TileEntity tile) {
|
||||||
this.tile = tile;
|
this.tile = tile;
|
||||||
@@ -47,16 +49,18 @@ public class TileDataManager {
|
|||||||
return watchedParameters;
|
return watchedParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TileDataWatcher> getWatchers() {
|
public List<EntityPlayer> getPlayersWatching() {
|
||||||
return watchers;
|
return playersWatching;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addWatcher(TileDataWatcher listener) {
|
public void addWatcher(TileDataWatcher listener) {
|
||||||
watchers.add(listener);
|
watchers.add(listener);
|
||||||
|
playersWatching.add(listener.getPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeWatcher(TileDataWatcher listener) {
|
public void removeWatcher(TileDataWatcher listener) {
|
||||||
watchers.remove(listener);
|
watchers.remove(listener);
|
||||||
|
playersWatching.remove(listener.getPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendParameterToWatchers(TileDataParameter parameter) {
|
public void sendParameterToWatchers(TileDataParameter parameter) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package com.raoulvdberge.refinedstorage.tile.grid.portable;
|
|||||||
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
|
import com.raoulvdberge.refinedstorage.api.storage.IStorageCache;
|
||||||
import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk;
|
import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk;
|
||||||
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
|
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
|
||||||
import com.raoulvdberge.refinedstorage.tile.data.TileDataWatcher;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ public interface IPortableGrid {
|
|||||||
@Nullable
|
@Nullable
|
||||||
IStorageDisk<ItemStack> getStorage();
|
IStorageDisk<ItemStack> getStorage();
|
||||||
|
|
||||||
List<TileDataWatcher> getWatchers();
|
List<EntityPlayer> getWatchers();
|
||||||
|
|
||||||
void drainEnergy(int energy);
|
void drainEnergy(int energy);
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import net.minecraftforge.items.IItemHandlerModifiable;
|
|||||||
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.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class PortableGrid implements IGrid, IPortableGrid {
|
public class PortableGrid implements IGrid, IPortableGrid {
|
||||||
@@ -166,8 +167,8 @@ public class PortableGrid implements IGrid, IPortableGrid {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<TileDataWatcher> getWatchers() {
|
public List<EntityPlayer> getWatchers() {
|
||||||
return dummyWatchers;
|
return Collections.singletonList(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ import com.raoulvdberge.refinedstorage.tile.config.IRedstoneConfigurable;
|
|||||||
import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode;
|
import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode;
|
||||||
import com.raoulvdberge.refinedstorage.tile.data.TileDataManager;
|
import com.raoulvdberge.refinedstorage.tile.data.TileDataManager;
|
||||||
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
|
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
|
||||||
import com.raoulvdberge.refinedstorage.tile.data.TileDataWatcher;
|
|
||||||
import com.raoulvdberge.refinedstorage.util.StackUtils;
|
import com.raoulvdberge.refinedstorage.util.StackUtils;
|
||||||
import com.raoulvdberge.refinedstorage.util.WorldUtils;
|
import com.raoulvdberge.refinedstorage.util.WorldUtils;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
@@ -461,8 +460,8 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<TileDataWatcher> getWatchers() {
|
public List<EntityPlayer> getWatchers() {
|
||||||
return dataManager.getWatchers();
|
return dataManager.getPlayersWatching();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user