package mekanism.common.content.transporter; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import mekanism.api.Coord4D; import net.minecraftforge.common.util.ForgeDirection; public class PathfinderCache { public static Map<PathData, List<Coord4D>> cachedPaths = new HashMap<PathData, List<Coord4D>>(); public static void onChanged(Coord4D location) { reset(); } public static List<Coord4D> getCache(Coord4D start, Coord4D end, EnumSet<ForgeDirection> sides) { List<Coord4D> ret = null; for(ForgeDirection side : sides) { PathData data = new PathData(start, end, side); List<Coord4D> test = cachedPaths.get(data); if(ret == null || (test != null && test.size() < ret.size())) { ret = test; } } return ret; } public static void reset() { cachedPaths.clear(); } public static class PathData { public Coord4D startTransporter; public Coord4D end; public ForgeDirection endSide; public PathData(Coord4D s, Coord4D e, ForgeDirection es) { startTransporter = s; end = e; endSide = es; } @Override public boolean equals(Object obj) { return obj instanceof PathData && ((PathData)obj).startTransporter.equals(startTransporter) && ((PathData)obj).end.equals(end) && ((PathData)obj).endSide.equals(endSide); } @Override public int hashCode() { int code = 1; code = 31 * code + startTransporter.hashCode(); code = 31 * code + end.hashCode(); code = 31 * code + endSide.hashCode(); return code; } } }