/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.core.blueprints; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import net.minecraft.item.ItemStack; import net.minecraft.world.WorldSettings; import buildcraft.core.builders.BuilderItemMetaPair; import buildcraft.core.builders.BuildingSlotBlock; import buildcraft.core.builders.TileAbstractBuilder; import buildcraft.core.lib.fluids.Tank; public class BuildingSlotMapIterator { public static int MAX_PER_ITEM = 512; private final BptBuilderBlueprint builderBlueprint; private final Map<BuilderItemMetaPair, List<BuildingSlotBlock>> slotMap; private final Set<BuilderItemMetaPair> availablePairs = new HashSet<BuilderItemMetaPair>(); private final int[] buildStageOccurences; private final boolean isCreative; private Iterator<BuilderItemMetaPair> keyIterator; private BuilderItemMetaPair currentKey; private List<BuildingSlotBlock> slots; private int slotPos, slotFound; public BuildingSlotMapIterator(BptBuilderBlueprint builderBlueprint, TileAbstractBuilder builder) { this.builderBlueprint = builderBlueprint; this.slotMap = builderBlueprint.buildList; this.buildStageOccurences = builderBlueprint.buildStageOccurences; this.isCreative = builder == null || builder.getWorldObj().getWorldInfo().getGameType() == WorldSettings.GameType.CREATIVE; reset(); } public void refresh(TileAbstractBuilder builder) { if (!isCreative) { availablePairs.clear(); availablePairs.add(new BuilderItemMetaPair(null)); if (builder != null) { for (int i = 0; i < builder.getSizeInventory(); i++) { ItemStack stack = builder.getStackInSlot(i); if (stack != null) { availablePairs.add(new BuilderItemMetaPair(stack)); } } for (Tank t : builder.getFluidTanks()) { if (t.getFluid() != null && t.getFluid().getFluid().getBlock() != null) { availablePairs.add(new BuilderItemMetaPair(new ItemStack(t.getFluid().getFluid().getBlock()))); } } } } } public void skipKey() { findNextKey(); } private void findNextKey() { slotPos = -1; slotFound = 0; slots = null; while (keyIterator.hasNext()) { currentKey = keyIterator.next(); if (isCreative || availablePairs.contains(currentKey)) { slots = slotMap.get(currentKey); slotPos = currentKey.position - 1; return; } } this.currentKey = null; this.keyIterator = slotMap.keySet().iterator(); } public BuildingSlotBlock next() { if (slots == null) { findNextKey(); } while (slots != null) { slotPos++; while (slotFound < MAX_PER_ITEM && slotPos < slots.size()) { BuildingSlotBlock b = slots.get(slotPos); if (b != null) { slotFound++; currentKey.position = slotPos + 1; return b; } slotPos++; } if (slotFound >= MAX_PER_ITEM) { currentKey.position = slotPos; } else if (slotPos >= slots.size()) { currentKey.position = 0; } findNextKey(); } return null; } public void remove() { BuildingSlotBlock slot = slots.get(slotPos); slots.set(slotPos, null); builderBlueprint.onRemoveBuildingSlotBlock(slot); } public void reset() { this.keyIterator = slotMap.keySet().iterator(); this.currentKey = null; this.slots = null; findNextKey(); } }