4: Move constant storage rebuilding out

This commit is contained in:
Raoul Van den Berge
2016-07-02 20:35:25 +02:00
parent f0be81f1bc
commit 0abd9cf779
10 changed files with 141 additions and 84 deletions

View File

@@ -8,7 +8,6 @@ import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.autocrafting.ICraftingTask;
import refinedstorage.api.storage.CompareFlags;
import refinedstorage.api.storage.IGroupedStorage;
import refinedstorage.api.storage.IStorage;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -65,11 +64,6 @@ public interface INetworkMaster {
*/
IGroupedStorage getStorage();
/**
* @return The storages connected to this network
*/
List<IStorage> getStorages();
/**
* @return The crafting tasks in this network, do NOT modify this list
*/

View File

@@ -4,6 +4,7 @@ import net.minecraft.item.ItemStack;
import refinedstorage.api.network.INetworkMaster;
import java.util.Collection;
import java.util.List;
/**
* This holds all items from all the connected storages from a {@link INetworkMaster}.
@@ -47,4 +48,9 @@ public interface IGroupedStorage {
* @return All stacks in this storage network
*/
Collection<ItemStack> getStacks();
/**
* @return The storages connected to this network
*/
List<IStorage> getStorages();
}

View File

@@ -7,13 +7,18 @@ import net.minecraft.item.ItemStack;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.autocrafting.ICraftingPattern;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.network.INetworkSlave;
import refinedstorage.api.storage.IGroupedStorage;
import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class GroupedStorage implements IGroupedStorage {
private INetworkMaster network;
private List<IStorage> storages = new ArrayList<IStorage>();
private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create();
private boolean rebuilding;
@@ -25,9 +30,17 @@ public class GroupedStorage implements IGroupedStorage {
public void rebuild() {
this.rebuilding = true;
storages.clear();
for (INetworkSlave slave : network.getSlaves()) {
if (slave.canUpdate() && slave instanceof IStorageProvider) {
((IStorageProvider) slave).addStorages(storages);
}
}
stacks.clear();
for (IStorage storage : network.getStorages()) {
for (IStorage storage : storages) {
for (ItemStack stack : storage.getItems()) {
add(stack);
}
@@ -102,4 +115,9 @@ public class GroupedStorage implements IGroupedStorage {
public Collection<ItemStack> getStacks() {
return stacks.values();
}
@Override
public List<IStorage> getStorages() {
return storages;
}
}

View File

@@ -0,0 +1,9 @@
package refinedstorage.tile;
import refinedstorage.api.network.INetworkMaster;
public interface IConnectionHandler {
void onConnected(INetworkMaster network);
void onDisconnected(INetworkMaster network);
}

View File

@@ -14,6 +14,7 @@ import refinedstorage.RefinedStorageItems;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.autocrafting.ICraftingPatternContainer;
import refinedstorage.api.autocrafting.ICraftingTask;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.container.ContainerCrafter;
import refinedstorage.inventory.BasicItemHandler;
import refinedstorage.inventory.BasicItemValidator;
@@ -21,7 +22,7 @@ import refinedstorage.inventory.IItemValidator;
import refinedstorage.item.ItemPattern;
import refinedstorage.item.ItemUpgrade;
public class TileCrafter extends TileSlave implements ICraftingPatternContainer {
public class TileCrafter extends TileSlave implements ICraftingPatternContainer, IConnectionHandler {
private BasicItemHandler patterns = new BasicItemHandler(9, this, new IItemValidator() {
@Override
public boolean valid(ItemStack stack) {
@@ -127,4 +128,14 @@ public class TileCrafter extends TileSlave implements ICraftingPatternContainer
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
return (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && facing != getDirection()) || super.hasCapability(capability, facing);
}
@Override
public void onConnected(INetworkMaster network) {
network.rebuildPatterns();
}
@Override
public void onDisconnected(INetworkMaster network) {
network.rebuildPatterns();
}
}

View File

@@ -13,6 +13,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageItems;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.apiimpl.storage.NBTStorage;
@@ -25,7 +26,7 @@ import refinedstorage.tile.config.*;
import java.util.List;
public class TileDiskDrive extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig {
public class TileDiskDrive extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig, IConnectionHandler {
public class Storage extends NBTStorage {
public Storage(ItemStack disk) {
super(disk.getTagCompound(), EnumStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskDrive.this);
@@ -62,6 +63,10 @@ public class TileDiskDrive extends TileSlave implements IStorageProvider, IStora
} else {
storages[slot] = new Storage(disk);
}
if (network != null) {
network.getStorage().rebuild();
}
}
@Override
@@ -304,4 +309,14 @@ public class TileDiskDrive extends TileSlave implements IStorageProvider, IStora
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing);
}
@Override
public void onConnected(INetworkMaster network) {
network.getStorage().rebuild();
}
@Override
public void onDisconnected(INetworkMaster network) {
network.getStorage().rebuild();
}
}

View File

@@ -23,6 +23,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
private RedstoneMode redstoneMode = RedstoneMode.IGNORE;
private boolean active;
private boolean update;
protected boolean connected;
protected INetworkMaster network;
@@ -46,6 +47,19 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
if (!worldObj.isRemote) {
if (ticks == 0) {
refreshConnection(worldObj);
} else {
// @TODO: Fix updating twice on block placement
if (update != canUpdate()) {
if (network != null && this instanceof IConnectionHandler) {
if (canUpdate()) {
((IConnectionHandler) this).onConnected(network);
} else {
((IConnectionHandler) this).onDisconnected(network);
}
}
update = canUpdate();
}
}
if (isActive()) {
@@ -165,9 +179,9 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
@Override
public void setRedstoneMode(RedstoneMode mode) {
markDirty();
this.redstoneMode = mode;
markDirty();
}
@Override

View File

@@ -10,6 +10,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageBlocks;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.apiimpl.storage.NBTStorage;
@@ -22,7 +23,7 @@ import refinedstorage.tile.config.*;
import java.util.List;
public class TileStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig {
public class TileStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig, IConnectionHandler {
class Storage extends NBTStorage {
public Storage() {
super(TileStorage.this.getStorageTag(), TileStorage.this.getCapacity(), TileStorage.this);
@@ -256,4 +257,14 @@ public class TileStorage extends TileSlave implements IStorageProvider, IStorage
public int getCapacity() {
return getType().getCapacity();
}
@Override
public void onConnected(INetworkMaster network) {
network.getStorage().rebuild();
}
@Override
public void onDisconnected(INetworkMaster network) {
network.getStorage().rebuild();
}
}

View File

@@ -27,7 +27,6 @@ import refinedstorage.api.network.IWirelessGridHandler;
import refinedstorage.api.storage.CompareFlags;
import refinedstorage.api.storage.IGroupedStorage;
import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.apiimpl.autocrafting.BasicCraftingTask;
import refinedstorage.apiimpl.autocrafting.CraftingPattern;
import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask;
@@ -40,6 +39,7 @@ import refinedstorage.container.ContainerController;
import refinedstorage.container.ContainerGrid;
import refinedstorage.item.ItemPattern;
import refinedstorage.network.MessageGridItems;
import refinedstorage.tile.IConnectionHandler;
import refinedstorage.tile.ISynchronizedContainer;
import refinedstorage.tile.TileBase;
import refinedstorage.tile.TileCrafter;
@@ -102,36 +102,52 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
@Override
public void update() {
if (!worldObj.isRemote) {
boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty();
for (INetworkSlave slave : slavesToAdd) {
slaves.add(slave);
for (INetworkSlave newSlave : slavesToAdd) {
boolean found = false;
for (int i = 0; i < slaves.size(); ++i) {
INetworkSlave slave = slaves.get(i);
if (slave.getPosition().equals(newSlave.getPosition())) {
slaves.set(i, newSlave);
found = true;
break;
}
}
if (!found) {
slaves.add(newSlave);
if (slave instanceof IConnectionHandler) {
((IConnectionHandler) slave).onConnected(this);
}
}
slavesToAdd.clear();
slaves.removeAll(slavesToRemove);
for (INetworkSlave slave : slavesToRemove) {
slaves.remove(slave);
if (slave instanceof IConnectionHandler) {
((IConnectionHandler) slave).onDisconnected(this);
}
}
slavesToRemove.clear();
if (canRun()) {
if (ticks % 20 == 0 || forceUpdate) {
updateSlaves();
if (ticks % 20 == 0) {
Collections.sort(storages, new Comparator<IStorage>() {
@Override
public int compare(IStorage left, IStorage right) {
int leftStored = left.getStored();
int rightStored = right.getStored();
if (leftStored == rightStored) {
return 0;
}
return (leftStored > rightStored) ? -1 : 1;
}
});
Collections.sort(storages, new Comparator<IStorage>() {
@Override
public int compare(IStorage left, IStorage right) {
if (left.getPriority() == right.getPriority()) {
return 0;
}
return (left.getPriority() > right.getPriority()) ? -1 : 1;
}
});
}
for (ICraftingTask taskToCancel : craftingTasksToCancel) {
@@ -180,8 +196,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
if (!canRun() && !slaves.isEmpty()) {
disconnectSlaves();
updateSlaves();
}
if (couldRun != canRun()) {
@@ -252,11 +266,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
return storage;
}
@Override
public List<IStorage> getStorages() {
return storages;
}
@Override
public List<ICraftingTask> getCraftingTasks() {
return craftingTasks;
@@ -369,48 +378,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
}
}
private void updateSlaves() {
this.storages.clear();
this.patterns.clear();
for (INetworkSlave slave : slaves) {
if (!slave.canUpdate()) {
continue;
}
if (slave instanceof IStorageProvider) {
((IStorageProvider) slave).addStorages(storages);
}
}
Collections.sort(storages, new Comparator<IStorage>() {
@Override
public int compare(IStorage left, IStorage right) {
int leftStored = left.getStored();
int rightStored = right.getStored();
if (leftStored == rightStored) {
return 0;
}
return (leftStored > rightStored) ? -1 : 1;
}
});
Collections.sort(storages, new Comparator<IStorage>() {
@Override
public int compare(IStorage left, IStorage right) {
if (left.getPriority() == right.getPriority()) {
return 0;
}
return (left.getPriority() > right.getPriority()) ? -1 : 1;
}
});
storage.rebuild();
}
@Override
public void sendStorageToClient() {
if (!storage.isRebuilding()) {

View File

@@ -10,11 +10,13 @@ import net.minecraftforge.items.IItemHandler;
import powercrystals.minefactoryreloaded.api.IDeepStorageUnit;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.api.storage.IStorage;
import refinedstorage.api.storage.IStorageProvider;
import refinedstorage.container.ContainerStorage;
import refinedstorage.inventory.BasicItemHandler;
import refinedstorage.network.MessagePriorityUpdate;
import refinedstorage.tile.IConnectionHandler;
import refinedstorage.tile.IStorageGui;
import refinedstorage.tile.TileSlave;
import refinedstorage.tile.config.ICompareConfig;
@@ -25,7 +27,7 @@ import refinedstorage.tile.config.ModeConstants;
import java.util.ArrayList;
import java.util.List;
public class TileExternalStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig {
public class TileExternalStorage extends TileSlave implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig, IConnectionHandler {
public static final String NBT_PRIORITY = "Priority";
public static final String NBT_COMPARE = "Compare";
public static final String NBT_MODE = "Mode";
@@ -247,4 +249,14 @@ public class TileExternalStorage extends TileSlave implements IStorageProvider,
public IItemHandler getFilters() {
return filters;
}
@Override
public void onConnected(INetworkMaster network) {
network.getStorage().rebuild();
}
@Override
public void onDisconnected(INetworkMaster network) {
network.getStorage().rebuild();
}
}