package com.prupe.mcpatcher.ctm; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import net.minecraft.src.Block; import net.minecraft.src.Icon; abstract class CTMUtils$TileOverrideIterator implements Iterator<ITileOverride> { private final Block block; private Icon currentIcon; private ITileOverride[] blockOverrides; private ITileOverride[] iconOverrides; private final Set<ITileOverride> skipOverrides = new HashSet(); private int blockPos; private int iconPos; private boolean foundNext; private ITileOverride nextOverride; private ITileOverride lastMatchedOverride; CTMUtils$TileOverrideIterator(Block block, Icon icon) { this.block = block; this.currentIcon = icon; this.blockOverrides = CTMUtils.access$100()[block.blockID]; this.iconOverrides = (ITileOverride[])CTMUtils.access$200().get(this.currentIcon.getIconName()); } private void resetForNextPass() { this.blockOverrides = null; this.iconOverrides = (ITileOverride[])CTMUtils.access$200().get(this.currentIcon.getIconName()); this.blockPos = 0; this.iconPos = 0; this.foundNext = false; } public boolean hasNext() { if (this.foundNext) { return true; } else { if (this.iconOverrides != null) { while (this.iconPos < this.iconOverrides.length) { if (this.checkOverride(this.iconOverrides[this.iconPos++])) { return true; } } } if (this.blockOverrides != null) { while (this.blockPos < this.blockOverrides.length) { if (this.checkOverride(this.blockOverrides[this.blockPos++])) { return true; } } } return false; } } public ITileOverride next() { if (!this.foundNext) { throw new IllegalStateException("next called before hasNext() == true"); } else { this.foundNext = false; return this.nextOverride; } } public void remove() { throw new UnsupportedOperationException("remove not supported"); } private boolean checkOverride(ITileOverride override) { if (override != null && !override.isDisabled() && !this.skipOverrides.contains(override)) { this.foundNext = true; this.nextOverride = override; return true; } else { return false; } } ITileOverride go() { for (int pass = 0; pass < CTMUtils.access$1000(); ++pass) { ITileOverride override; Icon newIcon; do { if (!this.hasNext()) { return this.lastMatchedOverride; } override = this.next(); newIcon = this.getTile(override, this.block, this.currentIcon); } while (newIcon == null); this.lastMatchedOverride = override; this.skipOverrides.add(override); this.currentIcon = newIcon; this.resetForNextPass(); } return this.lastMatchedOverride; } Icon getIcon() { return this.currentIcon; } abstract Icon getTile(ITileOverride var1, Block var2, Icon var3); }