/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.util.inventory; import mods.railcraft.common.util.misc.AdjacentTileCache; import mods.railcraft.common.util.misc.ITileFilter; import net.minecraft.inventory.IInventory; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import java.util.*; /** * @author CovertJaguar <http://www.railcraft.info/> */ public final class AdjacentInventoryCache { private final AdjacentTileCache cache; private final List<IInventory> sortedInvs = new LinkedList<IInventory>(); private final Map<ForgeDirection, IInventory> invs = new EnumMap<ForgeDirection, IInventory>(ForgeDirection.class); private final Comparator<IInventory> sorter; private final ITileFilter filter; private final EnumSet<ForgeDirection> changedSides = EnumSet.allOf(ForgeDirection.class); public AdjacentInventoryCache(TileEntity tile, AdjacentTileCache cache) { this(tile, cache, null, null); } public AdjacentInventoryCache(TileEntity tile, AdjacentTileCache cache, ITileFilter filter, Comparator<IInventory> sorter) { this.cache = cache; cache.addListener(new AdjacentTileCache.ICacheListener() { @Override public void changed(ForgeDirection side) { changedSides.add(side); } @Override public void purge() { changedSides.addAll(EnumSet.allOf(ForgeDirection.class)); invs.clear(); } }); this.filter = filter; this.sorter = sorter; } public Collection<IInventory> getAdjacentInventories() { Map<ForgeDirection, TileEntity> tiles = cache.refreshTiles(); if (!changedSides.isEmpty()) { for (ForgeDirection side : changedSides) { invs.remove(side); TileEntity tile = tiles.get(side); if (tile != null && (filter == null || filter.matches(tile))) { IInventory inv = InvTools.getInventoryFromTile(tile, side.getOpposite()); if (inv != null) invs.put(side, inv); } } changedSides.clear(); sortedInvs.clear(); sortedInvs.addAll(invs.values()); if (sorter != null) Collections.sort(sortedInvs, sorter); } return sortedInvs; } }