Revert networkmasterregistry changes.
This commit is contained in:
@@ -3,7 +3,6 @@ package refinedstorage.api.network;
|
||||
import cofh.api.energy.EnergyStorage;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||
@@ -19,14 +18,6 @@ public interface INetworkMaster {
|
||||
*/
|
||||
World getWorld();
|
||||
|
||||
/**
|
||||
* Initializes this network.
|
||||
* Starting from this call {@link INetworkMaster#update()} will be called every server tick.
|
||||
*
|
||||
* @param world The world this network is in
|
||||
*/
|
||||
void setWorld(World world);
|
||||
|
||||
/**
|
||||
* @return The energy storage of this network
|
||||
*/
|
||||
@@ -60,12 +51,12 @@ public interface INetworkMaster {
|
||||
/**
|
||||
* @param slave The slave to add
|
||||
*/
|
||||
void addSlave(BlockPos slave);
|
||||
void addSlave(INetworkSlave slave);
|
||||
|
||||
/**
|
||||
* @param slave The slave to remove
|
||||
*/
|
||||
void removeSlave(BlockPos slave);
|
||||
void removeSlave(INetworkSlave slave);
|
||||
|
||||
/**
|
||||
* @return The grid handler for this network
|
||||
@@ -203,8 +194,4 @@ public interface INetworkMaster {
|
||||
*/
|
||||
@Nullable
|
||||
ItemStack getItem(ItemStack stack, int flags);
|
||||
|
||||
NBTTagCompound writeToNBT(NBTTagCompound tag);
|
||||
|
||||
void readFromNBT(NBTTagCompound tag);
|
||||
}
|
||||
|
||||
@@ -1,700 +0,0 @@
|
||||
package refinedstorage.apiimpl.network;
|
||||
|
||||
import cofh.api.energy.EnergyStorage;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.Constants;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
import refinedstorage.RefinedStorage;
|
||||
import refinedstorage.RefinedStorageBlocks;
|
||||
import refinedstorage.RefinedStorageUtils;
|
||||
import refinedstorage.api.RefinedStorageCapabilities;
|
||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||
import refinedstorage.api.autocrafting.ICraftingTask;
|
||||
import refinedstorage.api.network.IGridHandler;
|
||||
import refinedstorage.api.network.INetworkMaster;
|
||||
import refinedstorage.api.network.INetworkSlave;
|
||||
import refinedstorage.api.network.IWirelessGridHandler;
|
||||
import refinedstorage.api.storage.CompareFlags;
|
||||
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;
|
||||
import refinedstorage.block.BlockController;
|
||||
import refinedstorage.block.EnumControllerType;
|
||||
import refinedstorage.container.ContainerGrid;
|
||||
import refinedstorage.item.ItemPattern;
|
||||
import refinedstorage.network.MessageGridItems;
|
||||
import refinedstorage.tile.TileCable;
|
||||
import refinedstorage.tile.TileCrafter;
|
||||
import refinedstorage.tile.TileWirelessTransmitter;
|
||||
import refinedstorage.tile.config.RedstoneMode;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class NetworkMaster implements INetworkMaster {
|
||||
public static final int ENERGY_CAPACITY = 32000;
|
||||
|
||||
public static final String NBT_CRAFTING_TASKS = "CraftingTasks";
|
||||
public static final String NBT_ENERGY = "Energy";
|
||||
public static final String NBT_SLAVES = "Slaves";
|
||||
public static final String NBT_SLAVE_X = "X";
|
||||
public static final String NBT_SLAVE_Y = "Y";
|
||||
public static final String NBT_SLAVE_Z = "Z";
|
||||
|
||||
private GridHandler gridHandler = new GridHandler(this);
|
||||
private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this);
|
||||
|
||||
private List<ItemStack> items = new ArrayList<ItemStack>();
|
||||
private List<ItemStack> combinedItems = new ArrayList<ItemStack>();
|
||||
private Set<Integer> combinedItemsIndices = new HashSet<Integer>();
|
||||
|
||||
private List<IStorage> storages = new ArrayList<IStorage>();
|
||||
|
||||
private List<BlockPos> slaves = new ArrayList<BlockPos>();
|
||||
private List<INetworkSlave> actualSlaves = new ArrayList<INetworkSlave>();
|
||||
private Map<BlockPos, Boolean> slaveConnectivity = new HashMap<BlockPos, Boolean>();
|
||||
private List<BlockPos> slavesToAdd = new ArrayList<BlockPos>();
|
||||
private List<BlockPos> slavesToLoad = new ArrayList<BlockPos>();
|
||||
private List<BlockPos> slavesToRemove = new ArrayList<BlockPos>();
|
||||
|
||||
private List<ICraftingPattern> patterns = new ArrayList<ICraftingPattern>();
|
||||
|
||||
private Stack<ICraftingTask> craftingTasks = new Stack<ICraftingTask>();
|
||||
private List<ICraftingTask> craftingTasksToAddAsLast = new ArrayList<ICraftingTask>();
|
||||
private List<ICraftingTask> craftingTasksToAdd = new ArrayList<ICraftingTask>();
|
||||
private List<ICraftingTask> craftingTasksToCancel = new ArrayList<ICraftingTask>();
|
||||
|
||||
private EnergyStorage energy = new EnergyStorage(ENERGY_CAPACITY);
|
||||
private int energyUsage;
|
||||
|
||||
private boolean couldRun;
|
||||
private long lastEnergyUpdate;
|
||||
|
||||
private int ticks;
|
||||
|
||||
private EnumControllerType type;
|
||||
|
||||
private World world;
|
||||
private BlockPos pos;
|
||||
|
||||
private RedstoneMode redstoneMode = RedstoneMode.IGNORE;
|
||||
|
||||
public NetworkMaster(BlockPos pos, World world) {
|
||||
this.pos = pos;
|
||||
|
||||
setWorld(world);
|
||||
}
|
||||
|
||||
public NetworkMaster(BlockPos pos) {
|
||||
this.pos = pos;
|
||||
}
|
||||
|
||||
public RedstoneMode getRedstoneMode() {
|
||||
return redstoneMode;
|
||||
}
|
||||
|
||||
public void setRedstoneMode(RedstoneMode mode) {
|
||||
this.redstoneMode = mode;
|
||||
|
||||
markDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnergyStorage getEnergy() {
|
||||
return energy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getEnergyUsage() {
|
||||
return energyUsage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockPos getPosition() {
|
||||
return pos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public World getWorld() {
|
||||
return world;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setWorld(World world) {
|
||||
this.world = world;
|
||||
this.type = (EnumControllerType) world.getBlockState(pos).getValue(BlockController.TYPE);
|
||||
|
||||
for (BlockPos slavePos : slavesToLoad) {
|
||||
INetworkSlave slave = world.getTileEntity(slavePos).getCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null);
|
||||
|
||||
slave.forceConnect(this);
|
||||
|
||||
if (!(slave instanceof TileCable)) {
|
||||
slaves.add(slavePos);
|
||||
}
|
||||
}
|
||||
|
||||
this.slavesToLoad.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canRun() {
|
||||
return energy.getEnergyStored() > 0 && energy.getEnergyStored() >= energyUsage && redstoneMode.isEnabled(world, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty();
|
||||
|
||||
for (BlockPos slave : slavesToAdd) {
|
||||
if (!slaves.contains(slave)) {
|
||||
slaves.add(slave);
|
||||
}
|
||||
}
|
||||
|
||||
slavesToAdd.clear();
|
||||
|
||||
slaves.removeAll(slavesToRemove);
|
||||
slavesToRemove.clear();
|
||||
|
||||
int lastEnergy = energy.getEnergyStored();
|
||||
|
||||
if (canRun()) {
|
||||
if (ticks % 20 == 0 || forceUpdate) {
|
||||
updateSlaves();
|
||||
}
|
||||
|
||||
for (INetworkSlave slave : getSlaves()) {
|
||||
if (slave.canUpdate()) {
|
||||
slave.updateSlave();
|
||||
}
|
||||
|
||||
boolean active = slave.canUpdate();
|
||||
|
||||
if (!slaveConnectivity.containsKey(slave.getPosition()) || slaveConnectivity.get(slave.getPosition()) != active) {
|
||||
slaveConnectivity.put(slave.getPosition(), active);
|
||||
|
||||
if (slave.canSendConnectivityUpdate()) {
|
||||
RefinedStorageUtils.updateBlock(world, slave.getPosition());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (ICraftingTask taskToCancel : craftingTasksToCancel) {
|
||||
taskToCancel.onCancelled(this);
|
||||
}
|
||||
|
||||
craftingTasks.removeAll(craftingTasksToCancel);
|
||||
craftingTasksToCancel.clear();
|
||||
|
||||
for (ICraftingTask task : craftingTasksToAdd) {
|
||||
craftingTasks.push(task);
|
||||
}
|
||||
|
||||
craftingTasksToAdd.clear();
|
||||
|
||||
for (ICraftingTask task : craftingTasksToAddAsLast) {
|
||||
craftingTasks.add(0, task);
|
||||
}
|
||||
|
||||
craftingTasksToAddAsLast.clear();
|
||||
|
||||
if (!craftingTasks.empty()) {
|
||||
ICraftingTask top = craftingTasks.peek();
|
||||
|
||||
if (ticks % top.getPattern().getContainer(world).getSpeed() == 0 && top.update(this)) {
|
||||
top.onDone(this);
|
||||
|
||||
craftingTasks.pop();
|
||||
}
|
||||
}
|
||||
} else if (!slaves.isEmpty()) {
|
||||
disconnectAll();
|
||||
updateSlaves();
|
||||
}
|
||||
|
||||
if (couldRun != canRun()) {
|
||||
couldRun = canRun();
|
||||
|
||||
world.notifyNeighborsOfStateChange(pos, RefinedStorageBlocks.CONTROLLER);
|
||||
}
|
||||
|
||||
wirelessGridHandler.update();
|
||||
|
||||
if (type == EnumControllerType.NORMAL && energyUsage > 0) {
|
||||
if (energy.getEnergyStored() - energyUsage >= 0) {
|
||||
energy.extractEnergy(energyUsage, false);
|
||||
} else {
|
||||
energy.setEnergyStored(0);
|
||||
}
|
||||
} else if (type == EnumControllerType.CREATIVE) {
|
||||
energy.setEnergyStored(energy.getMaxEnergyStored());
|
||||
}
|
||||
|
||||
if (energy.getEnergyStored() != lastEnergy) {
|
||||
world.updateComparatorOutputLevel(pos, RefinedStorageBlocks.CONTROLLER);
|
||||
|
||||
if (System.currentTimeMillis() - lastEnergyUpdate > 1500) {
|
||||
lastEnergyUpdate = System.currentTimeMillis();
|
||||
|
||||
RefinedStorageUtils.updateBlock(world, pos);
|
||||
}
|
||||
}
|
||||
|
||||
ticks++;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<INetworkSlave> getSlaves() {
|
||||
return actualSlaves;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addSlave(BlockPos slave) {
|
||||
slavesToAdd.add(slave);
|
||||
|
||||
markDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeSlave(BlockPos slave) {
|
||||
slavesToRemove.add(slave);
|
||||
|
||||
markDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IGridHandler getGridHandler() {
|
||||
return gridHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IWirelessGridHandler getWirelessGridHandler() {
|
||||
return wirelessGridHandler;
|
||||
}
|
||||
|
||||
public void disconnectAll() {
|
||||
for (INetworkSlave slave : getSlaves()) {
|
||||
slave.disconnect(world);
|
||||
}
|
||||
|
||||
slaves.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemStack> getItems() {
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ICraftingTask> getCraftingTasks() {
|
||||
return craftingTasks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCraftingTask(ICraftingTask task) {
|
||||
craftingTasksToAdd.add(task);
|
||||
|
||||
markDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCraftingTaskAsLast(ICraftingTask task) {
|
||||
craftingTasksToAddAsLast.add(task);
|
||||
|
||||
markDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICraftingTask createCraftingTask(ICraftingPattern pattern) {
|
||||
if (pattern.isProcessing()) {
|
||||
return new ProcessingCraftingTask(pattern);
|
||||
} else {
|
||||
return new BasicCraftingTask(pattern);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelCraftingTask(ICraftingTask task) {
|
||||
craftingTasksToCancel.add(task);
|
||||
|
||||
markDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ICraftingPattern> getPatterns() {
|
||||
return patterns;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ICraftingPattern> getPattern(ItemStack pattern, int flags) {
|
||||
List<ICraftingPattern> patterns = new ArrayList<ICraftingPattern>();
|
||||
|
||||
for (ICraftingPattern craftingPattern : getPatterns()) {
|
||||
for (ItemStack output : craftingPattern.getOutputs()) {
|
||||
if (RefinedStorageUtils.compareStack(output, pattern, flags)) {
|
||||
patterns.add(craftingPattern);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return patterns;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICraftingPattern getPatternWithBestScore(ItemStack pattern) {
|
||||
return getPatternWithBestScore(pattern, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICraftingPattern getPatternWithBestScore(ItemStack pattern, int flags) {
|
||||
List<ICraftingPattern> patterns = getPattern(pattern, flags);
|
||||
|
||||
if (patterns.isEmpty()) {
|
||||
return null;
|
||||
} else if (patterns.size() == 1) {
|
||||
return patterns.get(0);
|
||||
}
|
||||
|
||||
int highestScore = 0;
|
||||
int highestPattern = 0;
|
||||
|
||||
for (int i = 0; i < patterns.size(); ++i) {
|
||||
int score = 0;
|
||||
|
||||
for (ItemStack input : patterns.get(i).getInputs()) {
|
||||
ItemStack stored = getItem(input, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
|
||||
|
||||
score += stored != null ? stored.stackSize : 0;
|
||||
}
|
||||
|
||||
if (score > highestScore) {
|
||||
highestScore = score;
|
||||
highestPattern = i;
|
||||
}
|
||||
}
|
||||
|
||||
return patterns.get(highestPattern);
|
||||
}
|
||||
|
||||
private void updateSlaves() {
|
||||
this.energyUsage = 0;
|
||||
this.actualSlaves.clear();
|
||||
this.storages.clear();
|
||||
this.patterns.clear();
|
||||
|
||||
int range = 0;
|
||||
|
||||
for (BlockPos slavePos : slaves) {
|
||||
TileEntity tile = world.getTileEntity(slavePos);
|
||||
|
||||
if (tile == null || !tile.hasCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null)) {
|
||||
removeSlave(slavePos);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
INetworkSlave slave = tile.getCapability(RefinedStorageCapabilities.NETWORK_SLAVE_CAPABILITY, null);
|
||||
|
||||
actualSlaves.add(slave);
|
||||
|
||||
if (!slave.canUpdate()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (slave instanceof TileWirelessTransmitter) {
|
||||
range += ((TileWirelessTransmitter) slave).getRange();
|
||||
}
|
||||
|
||||
if (slave instanceof IStorageProvider) {
|
||||
((IStorageProvider) slave).provide(storages);
|
||||
}
|
||||
|
||||
if (slave instanceof TileCrafter) {
|
||||
TileCrafter crafter = (TileCrafter) slave;
|
||||
|
||||
for (int i = 0; i < crafter.getPatterns().getSlots(); ++i) {
|
||||
ItemStack pattern = crafter.getPatterns().getStackInSlot(i);
|
||||
|
||||
if (pattern != null && ItemPattern.isValid(pattern)) {
|
||||
patterns.add(new CraftingPattern(crafter.getPos().getX(), crafter.getPos().getY(), crafter.getPos().getZ(), ItemPattern.isProcessing(pattern), ItemPattern.getInputs(pattern), ItemPattern.getOutputs(pattern), ItemPattern.getByproducts(pattern)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.energyUsage += slave.getEnergyUsage();
|
||||
}
|
||||
|
||||
wirelessGridHandler.setRange(range);
|
||||
|
||||
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;
|
||||
}
|
||||
});
|
||||
|
||||
updateItems();
|
||||
updateItemsWithClient();
|
||||
}
|
||||
|
||||
private void updateItems() {
|
||||
items.clear();
|
||||
|
||||
for (IStorage storage : storages) {
|
||||
storage.addItems(items);
|
||||
}
|
||||
|
||||
for (ICraftingPattern pattern : patterns) {
|
||||
for (ItemStack output : pattern.getOutputs()) {
|
||||
ItemStack patternStack = output.copy();
|
||||
patternStack.stackSize = 0;
|
||||
items.add(patternStack);
|
||||
}
|
||||
}
|
||||
|
||||
combinedItems.clear();
|
||||
combinedItemsIndices.clear();
|
||||
|
||||
for (int i = 0; i < items.size(); ++i) {
|
||||
if (combinedItemsIndices.contains(i)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ItemStack stack = items.get(i);
|
||||
|
||||
for (int j = i + 1; j < items.size(); ++j) {
|
||||
if (combinedItemsIndices.contains(j)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ItemStack otherStack = items.get(j);
|
||||
|
||||
if (RefinedStorageUtils.compareStackNoQuantity(stack, otherStack)) {
|
||||
// We copy here so we don't modify the quantity of the ItemStack IStorage uses.
|
||||
// We re-get the ItemStack because the stack may change from a previous iteration in this loop
|
||||
ItemStack newStack = items.get(i).copy();
|
||||
newStack.stackSize += otherStack.stackSize;
|
||||
items.set(i, newStack);
|
||||
|
||||
combinedItems.add(otherStack);
|
||||
combinedItemsIndices.add(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
items.removeAll(combinedItems);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateItemsWithClient() {
|
||||
for (EntityPlayer player : world.playerEntities) {
|
||||
if (player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition())) {
|
||||
updateItemsWithClient((EntityPlayerMP) player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateItemsWithClient(EntityPlayerMP player) {
|
||||
RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack push(ItemStack stack, int size, boolean simulate) {
|
||||
if (stack == null || stack.getItem() == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (storages.isEmpty()) {
|
||||
return ItemHandlerHelper.copyStackWithSize(stack, size);
|
||||
}
|
||||
|
||||
int orginalSize = size;
|
||||
|
||||
ItemStack remainder = stack;
|
||||
|
||||
for (IStorage storage : storages) {
|
||||
remainder = storage.push(remainder, size, simulate);
|
||||
|
||||
if (remainder == null) {
|
||||
break;
|
||||
} else {
|
||||
size = remainder.stackSize;
|
||||
}
|
||||
}
|
||||
|
||||
int sizePushed = remainder != null ? (orginalSize - remainder.stackSize) : orginalSize;
|
||||
|
||||
if (!simulate && sizePushed > 0) {
|
||||
updateItems();
|
||||
updateItemsWithClient();
|
||||
|
||||
for (int i = 0; i < sizePushed; ++i) {
|
||||
if (!craftingTasks.empty()) {
|
||||
ICraftingTask top = craftingTasks.peek();
|
||||
|
||||
if (top instanceof ProcessingCraftingTask) {
|
||||
((ProcessingCraftingTask) top).onPushed(stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return remainder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack take(ItemStack stack, int size) {
|
||||
return take(stack, size, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack take(ItemStack stack, int size, int flags) {
|
||||
int requested = size;
|
||||
int received = 0;
|
||||
|
||||
ItemStack newStack = null;
|
||||
|
||||
for (IStorage storage : storages) {
|
||||
ItemStack took = storage.take(stack, requested - received, flags);
|
||||
|
||||
if (took != null) {
|
||||
if (newStack == null) {
|
||||
newStack = took;
|
||||
} else {
|
||||
newStack.stackSize += took.stackSize;
|
||||
}
|
||||
|
||||
received += took.stackSize;
|
||||
}
|
||||
|
||||
if (requested == received) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (newStack != null) {
|
||||
updateItems();
|
||||
updateItemsWithClient();
|
||||
}
|
||||
|
||||
return newStack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItem(ItemStack stack, int flags) {
|
||||
for (ItemStack otherStack : items) {
|
||||
if (RefinedStorageUtils.compareStack(otherStack, stack, flags)) {
|
||||
return otherStack;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound tag) {
|
||||
energy.readFromNBT(tag);
|
||||
|
||||
if (tag.hasKey(RedstoneMode.NBT)) {
|
||||
redstoneMode = RedstoneMode.getById(tag.getInteger(RedstoneMode.NBT));
|
||||
}
|
||||
|
||||
if (tag.hasKey(NBT_CRAFTING_TASKS)) {
|
||||
NBTTagList taskList = tag.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND);
|
||||
|
||||
for (int i = 0; i < taskList.tagCount(); ++i) {
|
||||
NBTTagCompound taskTag = taskList.getCompoundTagAt(i);
|
||||
|
||||
CraftingPattern pattern = CraftingPattern.readFromNBT(taskTag.getCompoundTag(CraftingPattern.NBT));
|
||||
|
||||
if (pattern != null) {
|
||||
switch (taskTag.getInteger("Type")) {
|
||||
case BasicCraftingTask.ID:
|
||||
addCraftingTask(new BasicCraftingTask(taskTag, pattern));
|
||||
break;
|
||||
case ProcessingCraftingTask.ID:
|
||||
addCraftingTask(new ProcessingCraftingTask(taskTag, pattern));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tag.hasKey(NBT_SLAVES)) {
|
||||
NBTTagList slavesTag = tag.getTagList(NBT_SLAVES, Constants.NBT.TAG_COMPOUND);
|
||||
|
||||
for (int i = 0; i < slavesTag.tagCount(); ++i) {
|
||||
NBTTagCompound slave = slavesTag.getCompoundTagAt(i);
|
||||
|
||||
slavesToLoad.add(new BlockPos(slave.getInteger(NBT_SLAVE_X), slave.getInteger(NBT_SLAVE_Y), slave.getInteger(NBT_SLAVE_Z)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
|
||||
energy.writeToNBT(tag);
|
||||
|
||||
tag.setInteger(RedstoneMode.NBT, redstoneMode.id);
|
||||
|
||||
NBTTagList list = new NBTTagList();
|
||||
|
||||
for (ICraftingTask task : craftingTasks) {
|
||||
NBTTagCompound taskTag = new NBTTagCompound();
|
||||
task.writeToNBT(taskTag);
|
||||
list.appendTag(taskTag);
|
||||
}
|
||||
|
||||
tag.setTag(NBT_CRAFTING_TASKS, list);
|
||||
|
||||
NBTTagList slavesTag = new NBTTagList();
|
||||
|
||||
for (BlockPos slave : slaves) {
|
||||
NBTTagCompound slaveTag = new NBTTagCompound();
|
||||
|
||||
slaveTag.setInteger(NBT_SLAVE_X, slave.getX());
|
||||
slaveTag.setInteger(NBT_SLAVE_Y, slave.getY());
|
||||
slaveTag.setInteger(NBT_SLAVE_Z, slave.getZ());
|
||||
|
||||
slavesTag.appendTag(slaveTag);
|
||||
}
|
||||
|
||||
tag.setTag(NBT_SLAVES, slavesTag);
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
public void markDirty() {
|
||||
if (world != null) {
|
||||
NetworkMasterSavedData.getOrLoad(world).markDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
package refinedstorage.apiimpl.network;
|
||||
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraftforge.event.world.WorldEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
||||
import refinedstorage.api.network.INetworkMaster;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class NetworkMasterEventHandler {
|
||||
@SubscribeEvent
|
||||
public void onWorldTick(TickEvent.WorldTickEvent e) {
|
||||
if (e.phase == TickEvent.Phase.START) {
|
||||
Map<BlockPos, INetworkMaster> networks = NetworkMasterRegistry.get(e.world);
|
||||
|
||||
if (networks != null) {
|
||||
for (INetworkMaster network : networks.values()) {
|
||||
if (network.getWorld() == null) {
|
||||
network.setWorld(e.world);
|
||||
}
|
||||
|
||||
network.update();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onWorldLoad(WorldEvent.Load e) {
|
||||
if (!e.getWorld().isRemote) {
|
||||
NetworkMasterSavedData.getOrLoad(e.getWorld());
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onWorldUnload(WorldEvent.Unload e) {
|
||||
NetworkMasterRegistry.clear();
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
package refinedstorage.apiimpl.network;
|
||||
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import refinedstorage.api.network.INetworkMaster;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class NetworkMasterRegistry {
|
||||
public static final Map<Integer, Map<BlockPos, INetworkMaster>> NETWORKS = new HashMap<Integer, Map<BlockPos, INetworkMaster>>();
|
||||
|
||||
public static void add(World world, INetworkMaster network) {
|
||||
add(world.provider.getDimension(), network);
|
||||
|
||||
NetworkMasterSavedData.getOrLoad(world).markDirty();
|
||||
}
|
||||
|
||||
public static void add(int dim, INetworkMaster network) {
|
||||
if (NETWORKS.get(dim) == null) {
|
||||
NETWORKS.put(dim, new HashMap<BlockPos, INetworkMaster>());
|
||||
}
|
||||
|
||||
NETWORKS.get(dim).put(network.getPosition(), network);
|
||||
}
|
||||
|
||||
public static void remove(World world, BlockPos pos) {
|
||||
if (get(world) != null) {
|
||||
INetworkMaster network = get(world).get(pos);
|
||||
|
||||
if (network != null) {
|
||||
get(world).remove(pos);
|
||||
|
||||
NetworkMasterSavedData.getOrLoad(world).markDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static INetworkMaster get(World world, BlockPos pos) {
|
||||
return get(world) == null ? null : get(world).get(pos);
|
||||
}
|
||||
|
||||
public static Map<BlockPos, INetworkMaster> get(World world) {
|
||||
return NETWORKS.get(world.provider.getDimension());
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
NETWORKS.clear();
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
package refinedstorage.apiimpl.network;
|
||||
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.WorldSavedData;
|
||||
import net.minecraftforge.common.util.Constants;
|
||||
import refinedstorage.api.network.INetworkMaster;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class NetworkMasterSavedData extends WorldSavedData {
|
||||
public static final String ID = "RSNetworks";
|
||||
public static final String NBT_NETWORKS = "Networks";
|
||||
public static final String NBT_NETWORK_X = "X";
|
||||
public static final String NBT_NETWORK_Y = "Y";
|
||||
public static final String NBT_NETWORK_Z = "Z";
|
||||
public static final String NBT_NETWORK_DIM = "Dim";
|
||||
public static final String NBT_NETWORK_DATA = "Data";
|
||||
|
||||
public NetworkMasterSavedData(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound tag) {
|
||||
NBTTagList networks = tag.getTagList(NBT_NETWORKS, Constants.NBT.TAG_COMPOUND);
|
||||
|
||||
for (int i = 0; i < networks.tagCount(); ++i) {
|
||||
NBTTagCompound networkTag = networks.getCompoundTagAt(i);
|
||||
|
||||
INetworkMaster network = new NetworkMaster(new BlockPos(networkTag.getInteger(NBT_NETWORK_X), networkTag.getInteger(NBT_NETWORK_Y), networkTag.getInteger(NBT_NETWORK_Z)));
|
||||
|
||||
network.readFromNBT(networkTag.getCompoundTag(NBT_NETWORK_DATA));
|
||||
|
||||
NetworkMasterRegistry.add(networkTag.getInteger(NBT_NETWORK_DIM), network);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
|
||||
NBTTagList networks = new NBTTagList();
|
||||
|
||||
for (Map.Entry<Integer, Map<BlockPos, INetworkMaster>> entry : NetworkMasterRegistry.NETWORKS.entrySet()) {
|
||||
for (INetworkMaster network : entry.getValue().values()) {
|
||||
NBTTagCompound networkTag = new NBTTagCompound();
|
||||
|
||||
networkTag.setInteger(NBT_NETWORK_X, network.getPosition().getX());
|
||||
networkTag.setInteger(NBT_NETWORK_Y, network.getPosition().getY());
|
||||
networkTag.setInteger(NBT_NETWORK_Z, network.getPosition().getZ());
|
||||
networkTag.setInteger(NBT_NETWORK_DIM, entry.getKey());
|
||||
|
||||
networkTag.setTag(NBT_NETWORK_DATA, network.writeToNBT(new NBTTagCompound()));
|
||||
|
||||
networks.appendTag(networkTag);
|
||||
}
|
||||
}
|
||||
|
||||
tag.setTag(NBT_NETWORKS, networks);
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
public static NetworkMasterSavedData getOrLoad(World world) {
|
||||
NetworkMasterSavedData instance = (NetworkMasterSavedData) world.getMapStorage().getOrLoadData(NetworkMasterSavedData.class, ID);
|
||||
|
||||
if (instance == null) {
|
||||
instance = new NetworkMasterSavedData(ID);
|
||||
|
||||
world.getMapStorage().setData(ID, instance);
|
||||
}
|
||||
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
@@ -15,14 +15,11 @@ import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.text.TextComponentTranslation;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import refinedstorage.RefinedStorage;
|
||||
import refinedstorage.RefinedStorageBlocks;
|
||||
import refinedstorage.RefinedStorageGui;
|
||||
import refinedstorage.apiimpl.network.NetworkMaster;
|
||||
import refinedstorage.apiimpl.network.NetworkMasterRegistry;
|
||||
import refinedstorage.item.ItemBlockController;
|
||||
import refinedstorage.tile.controller.TileController;
|
||||
|
||||
@@ -68,7 +65,7 @@ public class BlockController extends BlockBase {
|
||||
TileController controller = (TileController) world.getTileEntity(pos);
|
||||
|
||||
return super.getActualState(state, world, pos)
|
||||
.withProperty(ENERGY, (int) Math.ceil((float) controller.getEnergy() / (float) NetworkMaster.ENERGY_CAPACITY * 8f));
|
||||
.withProperty(ENERGY, controller.getEnergyScaled(8));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -84,11 +81,7 @@ public class BlockController extends BlockBase {
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
|
||||
if (!world.isRemote) {
|
||||
if (((TileController) world.getTileEntity(pos)).getNetwork() == null) {
|
||||
player.addChatComponentMessage(new TextComponentTranslation("misc.refinedstorage:no_network"));
|
||||
} else {
|
||||
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.CONTROLLER, world, pos.getX(), pos.getY(), pos.getZ());
|
||||
}
|
||||
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.CONTROLLER, world, pos.getX(), pos.getY(), pos.getZ());
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -97,15 +90,13 @@ public class BlockController extends BlockBase {
|
||||
@Override
|
||||
public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) {
|
||||
if (!world.isRemote) {
|
||||
NetworkMaster network = new NetworkMaster(pos, world);
|
||||
TileController controller = (TileController) world.getTileEntity(pos);
|
||||
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
|
||||
if (tag != null && tag.hasKey(NetworkMaster.NBT_ENERGY)) {
|
||||
network.getEnergy().receiveEnergy(tag.getInteger(NetworkMaster.NBT_ENERGY), false);
|
||||
if (tag != null && tag.hasKey(TileController.NBT_ENERGY)) {
|
||||
controller.getEnergy().receiveEnergy(tag.getInteger(TileController.NBT_ENERGY), false);
|
||||
}
|
||||
|
||||
NetworkMasterRegistry.add(world, network);
|
||||
}
|
||||
|
||||
super.onBlockPlacedBy(world, pos, state, player, stack);
|
||||
@@ -114,7 +105,7 @@ public class BlockController extends BlockBase {
|
||||
@Override
|
||||
public void breakBlock(World world, BlockPos pos, IBlockState state) {
|
||||
if (!world.isRemote) {
|
||||
NetworkMasterRegistry.remove(world, pos);
|
||||
((TileController) world.getTileEntity(pos)).disconnectAll();
|
||||
}
|
||||
|
||||
super.breakBlock(world, pos, state);
|
||||
@@ -126,9 +117,8 @@ public class BlockController extends BlockBase {
|
||||
|
||||
ItemStack stack = new ItemStack(RefinedStorageBlocks.CONTROLLER, 1, RefinedStorageBlocks.CONTROLLER.getMetaFromState(state));
|
||||
|
||||
NBTTagCompound tag = new NBTTagCompound();
|
||||
tag.setInteger(NetworkMaster.NBT_ENERGY, ((TileController) world.getTileEntity(pos)).getEnergyStored(null));
|
||||
stack.setTagCompound(tag);
|
||||
stack.setTagCompound(new NBTTagCompound());
|
||||
stack.getTagCompound().setInteger(TileController.NBT_ENERGY, ((TileController) world.getTileEntity(pos)).getEnergy().getEnergyStored());
|
||||
|
||||
drops.add(stack);
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ package refinedstorage.gui;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.renderer.RenderHelper;
|
||||
import refinedstorage.RefinedStorageUtils;
|
||||
import refinedstorage.apiimpl.network.NetworkMaster;
|
||||
import refinedstorage.container.ContainerController;
|
||||
import refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
|
||||
import refinedstorage.tile.controller.ClientSlave;
|
||||
@@ -46,7 +45,7 @@ public class GuiController extends GuiBase {
|
||||
|
||||
drawTexture(x, y, 0, 0, width, height);
|
||||
|
||||
int barHeightNew = (int) ((float) controller.getEnergy() / (float) NetworkMaster.ENERGY_CAPACITY * (float) barHeight);
|
||||
int barHeightNew = controller.getEnergyScaled(barHeight);
|
||||
|
||||
drawTexture(x + barX, y + barY + barHeight - barHeightNew, 178, barHeight - barHeightNew, barWidth, barHeightNew);
|
||||
}
|
||||
@@ -103,7 +102,7 @@ public class GuiController extends GuiBase {
|
||||
}
|
||||
|
||||
if (inBounds(barX, barY, barWidth, barHeight, mouseX, mouseY)) {
|
||||
drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage", controller.getEnergyUsage()) + "\n" + t("misc.refinedstorage:energy_stored", controller.getEnergy(), NetworkMaster.ENERGY_CAPACITY));
|
||||
drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage", controller.getEnergyUsage()) + "\n" + t("misc.refinedstorage:energy_stored", controller.getEnergy().getEnergyStored(), TileController.ENERGY_CAPACITY));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.world.World;
|
||||
import refinedstorage.RefinedStorageBlocks;
|
||||
import refinedstorage.apiimpl.network.NetworkMaster;
|
||||
import refinedstorage.block.EnumControllerType;
|
||||
import refinedstorage.tile.controller.TileController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -21,11 +21,11 @@ public class ItemBlockController extends ItemBlockBase {
|
||||
if (stack.getMetadata() != EnumControllerType.CREATIVE.getId()) {
|
||||
int energyStored = 0;
|
||||
|
||||
if (stack.getTagCompound() != null && stack.getTagCompound().hasKey(NetworkMaster.NBT_ENERGY)) {
|
||||
energyStored = stack.getTagCompound().getInteger(NetworkMaster.NBT_ENERGY);
|
||||
if (stack.getTagCompound() != null && stack.getTagCompound().hasKey(TileController.NBT_ENERGY)) {
|
||||
energyStored = stack.getTagCompound().getInteger(TileController.NBT_ENERGY);
|
||||
}
|
||||
|
||||
list.add(I18n.format("misc.refinedstorage:energy_stored", energyStored, NetworkMaster.ENERGY_CAPACITY));
|
||||
list.add(I18n.format("misc.refinedstorage:energy_stored", energyStored, TileController.ENERGY_CAPACITY));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ public class ItemBlockController extends ItemBlockBase {
|
||||
tag = new NBTTagCompound();
|
||||
}
|
||||
|
||||
tag.setInteger(NetworkMaster.NBT_ENERGY, stack.getMetadata() == EnumControllerType.CREATIVE.getId() ? NetworkMaster.ENERGY_CAPACITY : 0);
|
||||
tag.setInteger(TileController.NBT_ENERGY, stack.getMetadata() == EnumControllerType.CREATIVE.getId() ? TileController.ENERGY_CAPACITY : 0);
|
||||
|
||||
return stack;
|
||||
}
|
||||
|
||||
@@ -10,14 +10,14 @@ import net.minecraft.item.IItemPropertyGetter;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.*;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.text.TextComponentTranslation;
|
||||
import net.minecraft.world.World;
|
||||
import refinedstorage.RefinedStorage;
|
||||
import refinedstorage.RefinedStorageBlocks;
|
||||
import refinedstorage.api.network.INetworkMaster;
|
||||
import refinedstorage.apiimpl.network.NetworkMasterRegistry;
|
||||
import refinedstorage.tile.controller.TileController;
|
||||
import refinedstorage.tile.grid.TileGrid;
|
||||
|
||||
import java.util.List;
|
||||
@@ -134,10 +134,10 @@ public class ItemWirelessGrid extends ItemEnergyContainer {
|
||||
@Override
|
||||
public ActionResult<ItemStack> onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) {
|
||||
if (!world.isRemote && hasValidNBT(stack) && getDimensionId(stack) == player.dimension) {
|
||||
INetworkMaster network = NetworkMasterRegistry.get(player.worldObj, new BlockPos(getX(stack), getY(stack), getZ(stack)));
|
||||
TileEntity tile = world.getTileEntity(new BlockPos(getX(stack), getY(stack), getZ(stack)));
|
||||
|
||||
if (network != null) {
|
||||
if (network.getWirelessGridHandler().onOpen(player, hand)) {
|
||||
if (tile instanceof TileController) {
|
||||
if (((TileController) tile).getWirelessGridHandler().onOpen(player, hand)) {
|
||||
return new ActionResult(EnumActionResult.SUCCESS, stack);
|
||||
} else {
|
||||
player.addChatComponentMessage(new TextComponentTranslation("misc.refinedstorage:wireless_grid.out_of_range"));
|
||||
|
||||
@@ -8,20 +8,20 @@ import net.minecraftforge.fml.common.network.ByteBufUtils;
|
||||
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
|
||||
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
|
||||
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
|
||||
import refinedstorage.apiimpl.network.NetworkMaster;
|
||||
import refinedstorage.api.network.INetworkMaster;
|
||||
import refinedstorage.container.ContainerGrid;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MessageGridItems implements IMessage, IMessageHandler<MessageGridItems, IMessage> {
|
||||
private NetworkMaster network;
|
||||
private INetworkMaster network;
|
||||
private List<ItemStack> items = new ArrayList<ItemStack>();
|
||||
|
||||
public MessageGridItems() {
|
||||
}
|
||||
|
||||
public MessageGridItems(NetworkMaster network) {
|
||||
public MessageGridItems(INetworkMaster network) {
|
||||
this.network = network;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
@@ -18,7 +17,6 @@ import refinedstorage.RefinedStorage;
|
||||
import refinedstorage.RefinedStorageBlocks;
|
||||
import refinedstorage.RefinedStorageItems;
|
||||
import refinedstorage.api.RefinedStorageAPI;
|
||||
import refinedstorage.apiimpl.network.NetworkMasterEventHandler;
|
||||
import refinedstorage.apiimpl.solderer.*;
|
||||
import refinedstorage.apiimpl.storage.NBTStorage;
|
||||
import refinedstorage.block.BlockBase;
|
||||
@@ -480,7 +478,6 @@ public class CommonProxy {
|
||||
}
|
||||
|
||||
public void init(FMLInitializationEvent e) {
|
||||
MinecraftForge.EVENT_BUS.register(new NetworkMasterEventHandler());
|
||||
}
|
||||
|
||||
public void postInit(FMLPostInitializationEvent e) {
|
||||
|
||||
@@ -11,7 +11,6 @@ import refinedstorage.RefinedStorageUtils;
|
||||
import refinedstorage.api.RefinedStorageCapabilities;
|
||||
import refinedstorage.api.network.INetworkMaster;
|
||||
import refinedstorage.api.network.INetworkSlave;
|
||||
import refinedstorage.apiimpl.network.NetworkMasterRegistry;
|
||||
import refinedstorage.tile.config.IRedstoneModeConfig;
|
||||
import refinedstorage.tile.config.RedstoneMode;
|
||||
import refinedstorage.tile.controller.TileController;
|
||||
@@ -23,6 +22,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
|
||||
public static final String NBT_CONNECTED = "Connected";
|
||||
|
||||
private RedstoneMode redstoneMode = RedstoneMode.IGNORE;
|
||||
private boolean active;
|
||||
|
||||
protected boolean connected;
|
||||
protected INetworkMaster network;
|
||||
@@ -41,6 +41,27 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
if (!worldObj.isRemote) {
|
||||
if (ticks == 0) {
|
||||
refreshConnection(worldObj);
|
||||
}
|
||||
|
||||
if (isActive()) {
|
||||
updateSlave();
|
||||
}
|
||||
|
||||
if (active != isActive()) {
|
||||
RefinedStorageUtils.updateBlock(worldObj, pos);
|
||||
|
||||
active = isActive();
|
||||
}
|
||||
}
|
||||
|
||||
super.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void connect(World world, INetworkMaster network) {
|
||||
if (network.canRun()) {
|
||||
@@ -48,7 +69,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
|
||||
this.connected = true;
|
||||
|
||||
if (!(this instanceof TileCable)) {
|
||||
this.network.addSlave(pos);
|
||||
this.network.addSlave(this);
|
||||
}
|
||||
|
||||
world.notifyNeighborsOfStateChange(pos, getBlockType());
|
||||
@@ -70,7 +91,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
|
||||
this.connected = false;
|
||||
|
||||
if (this.network != null) {
|
||||
this.network.removeSlave(pos);
|
||||
this.network.removeSlave(this);
|
||||
this.network = null;
|
||||
}
|
||||
|
||||
@@ -87,11 +108,7 @@ public abstract class TileSlave extends TileBase implements INetworkSlave, ISync
|
||||
|
||||
if (network == null) {
|
||||
if (controller != null) {
|
||||
INetworkMaster network = NetworkMasterRegistry.get(world, controller.getPos());
|
||||
|
||||
if (network != null) {
|
||||
connect(world, network);
|
||||
}
|
||||
connect(world, network);
|
||||
}
|
||||
} else {
|
||||
if (controller == null) {
|
||||
|
||||
@@ -1,83 +1,635 @@
|
||||
package refinedstorage.tile.controller;
|
||||
|
||||
import cofh.api.energy.EnergyStorage;
|
||||
import cofh.api.energy.IEnergyReceiver;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.Constants;
|
||||
import net.minecraftforge.fml.common.network.ByteBufUtils;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
import refinedstorage.RefinedStorage;
|
||||
import refinedstorage.RefinedStorageBlocks;
|
||||
import refinedstorage.RefinedStorageUtils;
|
||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||
import refinedstorage.api.autocrafting.ICraftingTask;
|
||||
import refinedstorage.api.network.IGridHandler;
|
||||
import refinedstorage.api.network.INetworkMaster;
|
||||
import refinedstorage.api.network.INetworkSlave;
|
||||
import refinedstorage.apiimpl.network.NetworkMaster;
|
||||
import refinedstorage.apiimpl.network.NetworkMasterRegistry;
|
||||
import refinedstorage.api.network.IWirelessGridHandler;
|
||||
import refinedstorage.api.storage.CompareFlags;
|
||||
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;
|
||||
import refinedstorage.apiimpl.network.GridHandler;
|
||||
import refinedstorage.apiimpl.network.WirelessGridHandler;
|
||||
import refinedstorage.block.BlockController;
|
||||
import refinedstorage.block.EnumControllerType;
|
||||
import refinedstorage.container.ContainerController;
|
||||
import refinedstorage.container.ContainerGrid;
|
||||
import refinedstorage.item.ItemPattern;
|
||||
import refinedstorage.network.MessageGridItems;
|
||||
import refinedstorage.tile.ISynchronizedContainer;
|
||||
import refinedstorage.tile.TileBase;
|
||||
import refinedstorage.tile.TileCrafter;
|
||||
import refinedstorage.tile.TileWirelessTransmitter;
|
||||
import refinedstorage.tile.config.IRedstoneModeConfig;
|
||||
import refinedstorage.tile.config.RedstoneMode;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public class TileController extends TileBase implements IEnergyReceiver, ISynchronizedContainer, IRedstoneModeConfig {
|
||||
private INetworkMaster network;
|
||||
public class TileController extends TileBase implements INetworkMaster, IEnergyReceiver, ISynchronizedContainer, IRedstoneModeConfig {
|
||||
public static final int ENERGY_CAPACITY = 32000;
|
||||
|
||||
// Only used client side
|
||||
private List<ClientSlave> clientSlaves = new ArrayList<ClientSlave>();
|
||||
private int energy;
|
||||
public static final String NBT_CRAFTING_TASKS = "CraftingTasks";
|
||||
public static final String NBT_ENERGY = "Energy";
|
||||
|
||||
private GridHandler gridHandler = new GridHandler(this);
|
||||
private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this);
|
||||
|
||||
private List<ItemStack> items = new ArrayList<ItemStack>();
|
||||
private List<ItemStack> combinedItems = new ArrayList<ItemStack>();
|
||||
private Set<Integer> combinedItemsIndices = new HashSet<Integer>();
|
||||
|
||||
private List<IStorage> storages = new ArrayList<IStorage>();
|
||||
|
||||
private List<INetworkSlave> slaves = new ArrayList<INetworkSlave>();
|
||||
private List<INetworkSlave> slavesToAdd = new ArrayList<INetworkSlave>();
|
||||
private List<INetworkSlave> slavesToRemove = new ArrayList<INetworkSlave>();
|
||||
|
||||
private List<ICraftingPattern> patterns = new ArrayList<ICraftingPattern>();
|
||||
|
||||
private Stack<ICraftingTask> craftingTasks = new Stack<ICraftingTask>();
|
||||
private List<ICraftingTask> craftingTasksToAddAsLast = new ArrayList<ICraftingTask>();
|
||||
private List<ICraftingTask> craftingTasksToAdd = new ArrayList<ICraftingTask>();
|
||||
private List<ICraftingTask> craftingTasksToCancel = new ArrayList<ICraftingTask>();
|
||||
|
||||
private EnergyStorage energy = new EnergyStorage(ENERGY_CAPACITY);
|
||||
private int energyUsage;
|
||||
private EnumControllerType type;
|
||||
private RedstoneMode redstoneMode;
|
||||
|
||||
public INetworkMaster getNetwork() {
|
||||
if (network == null) {
|
||||
network = NetworkMasterRegistry.get(worldObj, pos);
|
||||
private boolean couldRun;
|
||||
private long lastEnergyUpdate;
|
||||
|
||||
private EnumControllerType type;
|
||||
|
||||
private RedstoneMode redstoneMode = RedstoneMode.IGNORE;
|
||||
|
||||
private List<ClientSlave> clientSlaves;
|
||||
|
||||
@Override
|
||||
public BlockPos getPosition() {
|
||||
return pos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public World getWorld() {
|
||||
return worldObj;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnergyStorage getEnergy() {
|
||||
return energy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canRun() {
|
||||
return energy.getEnergyStored() > 0 && energy.getEnergyStored() >= energyUsage && redstoneMode.isEnabled(worldObj, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
if (!worldObj.isRemote) {
|
||||
boolean forceUpdate = !slavesToAdd.isEmpty() || !slavesToRemove.isEmpty();
|
||||
|
||||
for (INetworkSlave slave : slavesToAdd) {
|
||||
if (!slaves.contains(slave)) {
|
||||
slaves.add(slave);
|
||||
}
|
||||
}
|
||||
|
||||
slavesToAdd.clear();
|
||||
|
||||
slaves.removeAll(slavesToRemove);
|
||||
slavesToRemove.clear();
|
||||
|
||||
int lastEnergy = energy.getEnergyStored();
|
||||
|
||||
if (canRun()) {
|
||||
if (ticks % 20 == 0 || forceUpdate) {
|
||||
updateSlaves();
|
||||
}
|
||||
|
||||
for (ICraftingTask taskToCancel : craftingTasksToCancel) {
|
||||
taskToCancel.onCancelled(this);
|
||||
}
|
||||
|
||||
craftingTasks.removeAll(craftingTasksToCancel);
|
||||
craftingTasksToCancel.clear();
|
||||
|
||||
for (ICraftingTask task : craftingTasksToAdd) {
|
||||
craftingTasks.push(task);
|
||||
}
|
||||
|
||||
craftingTasksToAdd.clear();
|
||||
|
||||
for (ICraftingTask task : craftingTasksToAddAsLast) {
|
||||
craftingTasks.add(0, task);
|
||||
}
|
||||
|
||||
craftingTasksToAddAsLast.clear();
|
||||
|
||||
if (!craftingTasks.empty()) {
|
||||
ICraftingTask top = craftingTasks.peek();
|
||||
|
||||
if (ticks % top.getPattern().getContainer(worldObj).getSpeed() == 0 && top.update(this)) {
|
||||
top.onDone(this);
|
||||
|
||||
craftingTasks.pop();
|
||||
}
|
||||
}
|
||||
} else if (!slaves.isEmpty()) {
|
||||
disconnectAll();
|
||||
updateSlaves();
|
||||
}
|
||||
|
||||
if (couldRun != canRun()) {
|
||||
couldRun = canRun();
|
||||
|
||||
worldObj.notifyNeighborsOfStateChange(pos, RefinedStorageBlocks.CONTROLLER);
|
||||
}
|
||||
|
||||
wirelessGridHandler.update();
|
||||
|
||||
if (type == EnumControllerType.NORMAL && energyUsage > 0) {
|
||||
if (energy.getEnergyStored() - energyUsage >= 0) {
|
||||
energy.extractEnergy(energyUsage, false);
|
||||
} else {
|
||||
energy.setEnergyStored(0);
|
||||
}
|
||||
} else if (type == EnumControllerType.CREATIVE) {
|
||||
energy.setEnergyStored(energy.getMaxEnergyStored());
|
||||
}
|
||||
|
||||
if (energy.getEnergyStored() != lastEnergy) {
|
||||
worldObj.updateComparatorOutputLevel(pos, RefinedStorageBlocks.CONTROLLER);
|
||||
|
||||
if (System.currentTimeMillis() - lastEnergyUpdate > 1500) {
|
||||
lastEnergyUpdate = System.currentTimeMillis();
|
||||
|
||||
RefinedStorageUtils.updateBlock(worldObj, pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return network;
|
||||
super.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<INetworkSlave> getSlaves() {
|
||||
return slaves;
|
||||
}
|
||||
|
||||
public List<ClientSlave> getClientSlaves() {
|
||||
return clientSlaves;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addSlave(INetworkSlave slave) {
|
||||
slavesToAdd.add(slave);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeSlave(INetworkSlave slave) {
|
||||
slavesToRemove.add(slave);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IGridHandler getGridHandler() {
|
||||
return gridHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IWirelessGridHandler getWirelessGridHandler() {
|
||||
return wirelessGridHandler;
|
||||
}
|
||||
|
||||
public void disconnectAll() {
|
||||
for (INetworkSlave slave : getSlaves()) {
|
||||
slave.disconnect(worldObj);
|
||||
}
|
||||
|
||||
slaves.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemStack> getItems() {
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ICraftingTask> getCraftingTasks() {
|
||||
return craftingTasks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCraftingTask(ICraftingTask task) {
|
||||
craftingTasksToAdd.add(task);
|
||||
|
||||
markDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCraftingTaskAsLast(ICraftingTask task) {
|
||||
craftingTasksToAddAsLast.add(task);
|
||||
|
||||
markDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICraftingTask createCraftingTask(ICraftingPattern pattern) {
|
||||
if (pattern.isProcessing()) {
|
||||
return new ProcessingCraftingTask(pattern);
|
||||
} else {
|
||||
return new BasicCraftingTask(pattern);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelCraftingTask(ICraftingTask task) {
|
||||
craftingTasksToCancel.add(task);
|
||||
|
||||
markDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ICraftingPattern> getPatterns() {
|
||||
return patterns;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ICraftingPattern> getPattern(ItemStack pattern, int flags) {
|
||||
List<ICraftingPattern> patterns = new ArrayList<ICraftingPattern>();
|
||||
|
||||
for (ICraftingPattern craftingPattern : getPatterns()) {
|
||||
for (ItemStack output : craftingPattern.getOutputs()) {
|
||||
if (RefinedStorageUtils.compareStack(output, pattern, flags)) {
|
||||
patterns.add(craftingPattern);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return patterns;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICraftingPattern getPatternWithBestScore(ItemStack pattern) {
|
||||
return getPatternWithBestScore(pattern, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICraftingPattern getPatternWithBestScore(ItemStack pattern, int flags) {
|
||||
List<ICraftingPattern> patterns = getPattern(pattern, flags);
|
||||
|
||||
if (patterns.isEmpty()) {
|
||||
return null;
|
||||
} else if (patterns.size() == 1) {
|
||||
return patterns.get(0);
|
||||
}
|
||||
|
||||
int highestScore = 0;
|
||||
int highestPattern = 0;
|
||||
|
||||
for (int i = 0; i < patterns.size(); ++i) {
|
||||
int score = 0;
|
||||
|
||||
for (ItemStack input : patterns.get(i).getInputs()) {
|
||||
ItemStack stored = getItem(input, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
|
||||
|
||||
score += stored != null ? stored.stackSize : 0;
|
||||
}
|
||||
|
||||
if (score > highestScore) {
|
||||
highestScore = score;
|
||||
highestPattern = i;
|
||||
}
|
||||
}
|
||||
|
||||
return patterns.get(highestPattern);
|
||||
}
|
||||
|
||||
private void updateSlaves() {
|
||||
this.energyUsage = 0;
|
||||
this.storages.clear();
|
||||
this.patterns.clear();
|
||||
|
||||
int range = 0;
|
||||
|
||||
for (INetworkSlave slave : slaves) {
|
||||
if (!slave.canUpdate()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (slave instanceof TileWirelessTransmitter) {
|
||||
range += ((TileWirelessTransmitter) slave).getRange();
|
||||
}
|
||||
|
||||
if (slave instanceof IStorageProvider) {
|
||||
((IStorageProvider) slave).provide(storages);
|
||||
}
|
||||
|
||||
if (slave instanceof TileCrafter) {
|
||||
TileCrafter crafter = (TileCrafter) slave;
|
||||
|
||||
for (int i = 0; i < crafter.getPatterns().getSlots(); ++i) {
|
||||
ItemStack pattern = crafter.getPatterns().getStackInSlot(i);
|
||||
|
||||
if (pattern != null && ItemPattern.isValid(pattern)) {
|
||||
patterns.add(new CraftingPattern(crafter.getPos().getX(), crafter.getPos().getY(), crafter.getPos().getZ(), ItemPattern.isProcessing(pattern), ItemPattern.getInputs(pattern), ItemPattern.getOutputs(pattern), ItemPattern.getByproducts(pattern)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.energyUsage += slave.getEnergyUsage();
|
||||
}
|
||||
|
||||
wirelessGridHandler.setRange(range);
|
||||
|
||||
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;
|
||||
}
|
||||
});
|
||||
|
||||
updateItems();
|
||||
updateItemsWithClient();
|
||||
}
|
||||
|
||||
private void updateItems() {
|
||||
items.clear();
|
||||
|
||||
for (IStorage storage : storages) {
|
||||
storage.addItems(items);
|
||||
}
|
||||
|
||||
for (ICraftingPattern pattern : patterns) {
|
||||
for (ItemStack output : pattern.getOutputs()) {
|
||||
ItemStack patternStack = output.copy();
|
||||
patternStack.stackSize = 0;
|
||||
items.add(patternStack);
|
||||
}
|
||||
}
|
||||
|
||||
combinedItems.clear();
|
||||
combinedItemsIndices.clear();
|
||||
|
||||
for (int i = 0; i < items.size(); ++i) {
|
||||
if (combinedItemsIndices.contains(i)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ItemStack stack = items.get(i);
|
||||
|
||||
for (int j = i + 1; j < items.size(); ++j) {
|
||||
if (combinedItemsIndices.contains(j)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ItemStack otherStack = items.get(j);
|
||||
|
||||
if (RefinedStorageUtils.compareStackNoQuantity(stack, otherStack)) {
|
||||
// We copy here so we don't modify the quantity of the ItemStack IStorage uses.
|
||||
// We re-get the ItemStack because the stack may change from a previous iteration in this loop
|
||||
ItemStack newStack = items.get(i).copy();
|
||||
newStack.stackSize += otherStack.stackSize;
|
||||
items.set(i, newStack);
|
||||
|
||||
combinedItems.add(otherStack);
|
||||
combinedItemsIndices.add(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
items.removeAll(combinedItems);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateItemsWithClient() {
|
||||
for (EntityPlayer player : worldObj.playerEntities) {
|
||||
if (player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition())) {
|
||||
updateItemsWithClient((EntityPlayerMP) player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateItemsWithClient(EntityPlayerMP player) {
|
||||
RefinedStorage.NETWORK.sendTo(new MessageGridItems(this), player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack push(ItemStack stack, int size, boolean simulate) {
|
||||
if (stack == null || stack.getItem() == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (storages.isEmpty()) {
|
||||
return ItemHandlerHelper.copyStackWithSize(stack, size);
|
||||
}
|
||||
|
||||
int orginalSize = size;
|
||||
|
||||
ItemStack remainder = stack;
|
||||
|
||||
for (IStorage storage : storages) {
|
||||
remainder = storage.push(remainder, size, simulate);
|
||||
|
||||
if (remainder == null) {
|
||||
break;
|
||||
} else {
|
||||
size = remainder.stackSize;
|
||||
}
|
||||
}
|
||||
|
||||
int sizePushed = remainder != null ? (orginalSize - remainder.stackSize) : orginalSize;
|
||||
|
||||
if (!simulate && sizePushed > 0) {
|
||||
updateItems();
|
||||
updateItemsWithClient();
|
||||
|
||||
for (int i = 0; i < sizePushed; ++i) {
|
||||
if (!craftingTasks.empty()) {
|
||||
ICraftingTask top = craftingTasks.peek();
|
||||
|
||||
if (top instanceof ProcessingCraftingTask) {
|
||||
((ProcessingCraftingTask) top).onPushed(stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return remainder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack take(ItemStack stack, int size) {
|
||||
return take(stack, size, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack take(ItemStack stack, int size, int flags) {
|
||||
int requested = size;
|
||||
int received = 0;
|
||||
|
||||
ItemStack newStack = null;
|
||||
|
||||
for (IStorage storage : storages) {
|
||||
ItemStack took = storage.take(stack, requested - received, flags);
|
||||
|
||||
if (took != null) {
|
||||
if (newStack == null) {
|
||||
newStack = took;
|
||||
} else {
|
||||
newStack.stackSize += took.stackSize;
|
||||
}
|
||||
|
||||
received += took.stackSize;
|
||||
}
|
||||
|
||||
if (requested == received) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (newStack != null) {
|
||||
updateItems();
|
||||
updateItemsWithClient();
|
||||
}
|
||||
|
||||
return newStack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItem(ItemStack stack, int flags) {
|
||||
for (ItemStack otherStack : items) {
|
||||
if (RefinedStorageUtils.compareStack(otherStack, stack, flags)) {
|
||||
return otherStack;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound tag) {
|
||||
energy.readFromNBT(tag);
|
||||
|
||||
if (tag.hasKey(RedstoneMode.NBT)) {
|
||||
redstoneMode = RedstoneMode.getById(tag.getInteger(RedstoneMode.NBT));
|
||||
}
|
||||
|
||||
if (tag.hasKey(NBT_CRAFTING_TASKS)) {
|
||||
NBTTagList taskList = tag.getTagList(NBT_CRAFTING_TASKS, Constants.NBT.TAG_COMPOUND);
|
||||
|
||||
for (int i = 0; i < taskList.tagCount(); ++i) {
|
||||
NBTTagCompound taskTag = taskList.getCompoundTagAt(i);
|
||||
|
||||
CraftingPattern pattern = CraftingPattern.readFromNBT(taskTag.getCompoundTag(CraftingPattern.NBT));
|
||||
|
||||
if (pattern != null) {
|
||||
switch (taskTag.getInteger("Type")) {
|
||||
case BasicCraftingTask.ID:
|
||||
addCraftingTask(new BasicCraftingTask(taskTag, pattern));
|
||||
break;
|
||||
case ProcessingCraftingTask.ID:
|
||||
addCraftingTask(new ProcessingCraftingTask(taskTag, pattern));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
|
||||
energy.writeToNBT(tag);
|
||||
|
||||
tag.setInteger(RedstoneMode.NBT, redstoneMode.id);
|
||||
|
||||
NBTTagList list = new NBTTagList();
|
||||
|
||||
for (ICraftingTask task : craftingTasks) {
|
||||
NBTTagCompound taskTag = new NBTTagCompound();
|
||||
task.writeToNBT(taskTag);
|
||||
list.appendTag(taskTag);
|
||||
}
|
||||
|
||||
tag.setTag(NBT_CRAFTING_TASKS, list);
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound writeUpdate(NBTTagCompound tag) {
|
||||
super.writeUpdate(tag);
|
||||
|
||||
tag.setInteger(NetworkMaster.NBT_ENERGY, getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0);
|
||||
tag.setInteger(NBT_ENERGY, energy.getEnergyStored());
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readUpdate(NBTTagCompound tag) {
|
||||
energy = tag.getInteger(NetworkMaster.NBT_ENERGY);
|
||||
energy.setEnergyStored(tag.getInteger(NBT_ENERGY));
|
||||
|
||||
super.readUpdate(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int receiveEnergy(EnumFacing from, int maxReceive, boolean simulate) {
|
||||
return getNetwork() != null ? getNetwork().getEnergy().receiveEnergy(maxReceive, simulate) : 0;
|
||||
return energy.receiveEnergy(maxReceive, simulate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getEnergyStored(EnumFacing from) {
|
||||
return getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0;
|
||||
return energy.getEnergyStored();
|
||||
}
|
||||
|
||||
public int getEnergyScaled(int i) {
|
||||
float stored = worldObj.isRemote ? energy : (getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0);
|
||||
float max = NetworkMaster.ENERGY_CAPACITY;
|
||||
|
||||
return (int) (stored / max * (float) i);
|
||||
return (int) ((float) energy.getEnergyStored() / (float) ENERGY_CAPACITY * (float) i);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxEnergyStored(EnumFacing from) {
|
||||
return getNetwork() != null ? getNetwork().getEnergy().getMaxEnergyStored() : 0;
|
||||
return energy.getMaxEnergyStored();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -87,22 +639,12 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
|
||||
|
||||
@Override
|
||||
public RedstoneMode getRedstoneMode() {
|
||||
return worldObj.isRemote ? redstoneMode : (getNetwork() != null ? ((NetworkMaster) getNetwork()).getRedstoneMode() : RedstoneMode.IGNORE);
|
||||
return redstoneMode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRedstoneMode(RedstoneMode mode) {
|
||||
if (getNetwork() != null) {
|
||||
((NetworkMaster) getNetwork()).setRedstoneMode(mode);
|
||||
}
|
||||
}
|
||||
|
||||
public List<ClientSlave> getClientSlaves() {
|
||||
return clientSlaves;
|
||||
}
|
||||
|
||||
public int getEnergy() {
|
||||
return energy;
|
||||
this.redstoneMode = mode;
|
||||
}
|
||||
|
||||
public int getEnergyUsage() {
|
||||
@@ -119,7 +661,7 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
|
||||
|
||||
@Override
|
||||
public void readContainerData(ByteBuf buf) {
|
||||
this.energy = buf.readInt();
|
||||
energy.setEnergyStored(buf.readInt());
|
||||
this.energyUsage = buf.readInt();
|
||||
this.redstoneMode = RedstoneMode.getById(buf.readInt());
|
||||
|
||||
@@ -142,25 +684,25 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
|
||||
|
||||
@Override
|
||||
public void writeContainerData(ByteBuf buf) {
|
||||
buf.writeInt(getNetwork() != null ? getNetwork().getEnergy().getEnergyStored() : 0);
|
||||
buf.writeInt(getNetwork() != null ? getNetwork().getEnergyUsage() : 0);
|
||||
buf.writeInt(energy.getEnergyStored());
|
||||
buf.writeInt(energyUsage);
|
||||
|
||||
buf.writeInt(getNetwork() != null ? ((NetworkMaster) getNetwork()).getRedstoneMode().id : RedstoneMode.IGNORE.id);
|
||||
buf.writeInt(redstoneMode.id);
|
||||
|
||||
if (getNetwork() != null) {
|
||||
List<ClientSlave> clientSlaves = new ArrayList<ClientSlave>();
|
||||
List<ClientSlave> clientSlaves = new ArrayList<ClientSlave>();
|
||||
|
||||
for (INetworkSlave slave : getNetwork().getSlaves()) {
|
||||
if (slave.canUpdate()) {
|
||||
IBlockState state = worldObj.getBlockState(slave.getPosition());
|
||||
for (INetworkSlave slave : slaves) {
|
||||
if (slave.canUpdate()) {
|
||||
IBlockState state = worldObj.getBlockState(slave.getPosition());
|
||||
|
||||
ClientSlave clientSlave = new ClientSlave();
|
||||
ClientSlave clientSlave = new ClientSlave();
|
||||
|
||||
clientSlave.energyUsage = slave.getEnergyUsage();
|
||||
clientSlave.amount = 1;
|
||||
clientSlave.stack = new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state));
|
||||
clientSlave.energyUsage = slave.getEnergyUsage();
|
||||
clientSlave.amount = 1;
|
||||
clientSlave.stack = new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state));
|
||||
|
||||
if (clientSlave.stack.getItem() != null && clientSlaves.contains(clientSlave)) {
|
||||
if (clientSlave.stack.getItem() != null) {
|
||||
if (clientSlaves.contains(clientSlave)) {
|
||||
for (ClientSlave other : clientSlaves) {
|
||||
if (other.equals(clientSlave)) {
|
||||
other.amount++;
|
||||
@@ -173,16 +715,14 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buf.writeInt(clientSlaves.size());
|
||||
buf.writeInt(clientSlaves.size());
|
||||
|
||||
for (ClientSlave slave : clientSlaves) {
|
||||
buf.writeInt(slave.energyUsage);
|
||||
buf.writeInt(slave.amount);
|
||||
ByteBufUtils.writeItemStack(buf, slave.stack);
|
||||
}
|
||||
} else {
|
||||
buf.writeInt(0);
|
||||
for (ClientSlave slave : clientSlaves) {
|
||||
buf.writeInt(slave.energyUsage);
|
||||
buf.writeInt(slave.amount);
|
||||
ByteBufUtils.writeItemStack(buf, slave.stack);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,18 +2,18 @@ package refinedstorage.tile.grid;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import refinedstorage.RefinedStorage;
|
||||
import refinedstorage.RefinedStorageUtils;
|
||||
import refinedstorage.api.network.IGridHandler;
|
||||
import refinedstorage.api.network.INetworkMaster;
|
||||
import refinedstorage.apiimpl.network.NetworkMasterRegistry;
|
||||
import refinedstorage.block.EnumGridType;
|
||||
import refinedstorage.item.ItemWirelessGrid;
|
||||
import refinedstorage.network.MessageWirelessGridSettingsUpdate;
|
||||
import refinedstorage.tile.config.IRedstoneModeConfig;
|
||||
import refinedstorage.tile.controller.TileController;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -60,23 +60,25 @@ public class WirelessGrid implements IGrid {
|
||||
|
||||
@Override
|
||||
public IGridHandler getGridHandler() {
|
||||
INetworkMaster network = NetworkMasterRegistry.get(world, controllerPos);
|
||||
TileController controller = getController();
|
||||
|
||||
if (network != null) {
|
||||
return network.getGridHandler();
|
||||
}
|
||||
|
||||
return null;
|
||||
return controller != null ? controller.getGridHandler() : null;
|
||||
}
|
||||
|
||||
public void onClose(EntityPlayer player) {
|
||||
INetworkMaster network = NetworkMasterRegistry.get(world, controllerPos);
|
||||
TileController controller = getController();
|
||||
|
||||
if (network != null) {
|
||||
network.getWirelessGridHandler().onClose(player);
|
||||
if (controller != null) {
|
||||
controller.getWirelessGridHandler().onClose(player);
|
||||
}
|
||||
}
|
||||
|
||||
private TileController getController() {
|
||||
TileEntity tile = world.getTileEntity(controllerPos);
|
||||
|
||||
return tile instanceof TileController ? (TileController) tile : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSortingType() {
|
||||
return sortingType;
|
||||
|
||||
Reference in New Issue
Block a user