package WayofTime.bloodmagic.inversion; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; public class InversionPillarHandler { public static final double farthestDistanceSquared = 16 * 16; public static Map>> pillarMap = new HashMap>>(); public static Map>>> nearPillarMap = new HashMap>>>(); public static boolean addPillarToMap(World world, EnumDemonWillType type, BlockPos pos) { int dim = world.provider.getDimension(); if (pillarMap.containsKey(dim)) { Map> willMap = pillarMap.get(dim); if (willMap.containsKey(type)) { if (!willMap.get(type).contains(pos)) { willMap.get(type).add(pos); onPillarAdded(world, type, pos); return true; } else { return false; } } else { List posList = new ArrayList(); posList.add(pos); willMap.put(type, posList); onPillarAdded(world, type, pos); return true; } } else { Map> willMap = new HashMap>(); List posList = new ArrayList(); posList.add(pos); willMap.put(type, posList); pillarMap.put(dim, willMap); onPillarAdded(world, type, pos); return true; } } public static boolean removePillarFromMap(World world, EnumDemonWillType type, BlockPos pos) { int dim = world.provider.getDimension(); if (pillarMap.containsKey(dim)) { Map> willMap = pillarMap.get(dim); if (willMap.containsKey(type)) { if (willMap.get(type).contains(pos)) { onPillarRemoved(world, type, pos); return willMap.get(type).remove(pos); } else { return false; } } else { return false; } } else { return false; } } //Assume that it has been added already. private static void onPillarAdded(World world, EnumDemonWillType type, BlockPos pos) { System.out.println("Adding..."); List closePosList = new ArrayList(); int dim = world.provider.getDimension(); if (pillarMap.containsKey(dim)) { Map> willMap = pillarMap.get(dim); if (willMap.containsKey(type)) { List otherPosList = willMap.get(type); Iterator posIterator = otherPosList.iterator(); while (posIterator.hasNext()) { BlockPos closePos = posIterator.next(); if (!closePos.equals(pos) && closePos.distanceSq(pos) <= farthestDistanceSquared) { closePosList.add(closePos); } } } } if (nearPillarMap.containsKey(dim)) { Map>> willMap = nearPillarMap.get(dim); if (willMap.containsKey(type)) { Map> posMap = willMap.get(type); Iterator closePosIterator = closePosList.iterator(); while (closePosIterator.hasNext()) { BlockPos closePos = closePosIterator.next(); List posList = posMap.get(closePos); if (posList != null && !posList.contains(pos)) { posList.add(pos); } else { posList = new ArrayList(); posList.add(pos); posMap.put(closePos, posList); } } posMap.put(pos, closePosList); } else { Map> posMap = new HashMap>(); posMap.put(pos, closePosList); willMap.put(type, posMap); } } else { Map>> willMap = new HashMap>>(); Map> posMap = new HashMap>(); posMap.put(pos, closePosList); willMap.put(type, posMap); nearPillarMap.put(dim, willMap); } } private static void onPillarRemoved(World world, EnumDemonWillType type, BlockPos pos) { System.out.println("Removing..."); int dim = world.provider.getDimension(); if (nearPillarMap.containsKey(dim)) { Map>> willMap = nearPillarMap.get(dim); if (willMap.containsKey(type)) { Map> posMap = willMap.get(type); List posList = posMap.get(pos); if (posList != null) { Iterator itr = posList.iterator(); while (itr.hasNext()) { BlockPos checkPos = itr.next(); List checkPosList = posMap.get(checkPos); if (checkPosList != null) { checkPosList.remove(pos); } } posMap.remove(pos); } } } } //TODO: Change to use the nearPillarMap. public static List getNearbyPillars(World world, EnumDemonWillType type, BlockPos pos) { int dim = world.provider.getDimension(); if (nearPillarMap.containsKey(dim)) { Map>> willMap = nearPillarMap.get(dim); if (willMap.containsKey(type)) { Map> posMap = willMap.get(type); List posList = posMap.get(pos); if (posList != null) { return posList; } } } return new ArrayList(); } }