BloodMagic/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java

194 lines
7.8 KiB
Java
Raw Normal View History

package WayofTime.bloodmagic.inversion;
import WayofTime.bloodmagic.soul.EnumDemonWillType;
import WayofTime.bloodmagic.util.BMLog;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
2017-08-15 21:30:48 -07:00
import java.util.*;
public class InversionPillarHandler {
2016-09-11 17:58:54 -04:00
public static final double farthestDistanceSquared = 16 * 16;
public static Map<Integer, Map<EnumDemonWillType, List<BlockPos>>> pillarMap = new HashMap<>();
public static Map<Integer, Map<EnumDemonWillType, Map<BlockPos, List<BlockPos>>>> nearPillarMap = new HashMap<>();
2017-08-15 21:30:48 -07:00
public static boolean addPillarToMap(World world, EnumDemonWillType type, BlockPos pos) {
int dim = world.provider.getDimension();
2017-08-15 21:30:48 -07:00
if (pillarMap.containsKey(dim)) {
Map<EnumDemonWillType, List<BlockPos>> willMap = pillarMap.get(dim);
2017-08-15 21:30:48 -07:00
if (willMap.containsKey(type)) {
if (!willMap.get(type).contains(pos)) {
willMap.get(type).add(pos);
onPillarAdded(world, type, pos);
return true;
2017-08-15 21:30:48 -07:00
} else {
return false;
}
2017-08-15 21:30:48 -07:00
} else {
List<BlockPos> posList = new ArrayList<>();
posList.add(pos);
willMap.put(type, posList);
onPillarAdded(world, type, pos);
return true;
}
2017-08-15 21:30:48 -07:00
} else {
Map<EnumDemonWillType, List<BlockPos>> willMap = new HashMap<>();
List<BlockPos> posList = new ArrayList<>();
posList.add(pos);
willMap.put(type, posList);
pillarMap.put(dim, willMap);
onPillarAdded(world, type, pos);
return true;
}
}
2017-08-15 21:30:48 -07:00
public static boolean removePillarFromMap(World world, EnumDemonWillType type, BlockPos pos) {
2016-09-11 17:58:54 -04:00
int dim = world.provider.getDimension();
2017-08-15 21:30:48 -07:00
if (pillarMap.containsKey(dim)) {
2016-09-11 17:58:54 -04:00
Map<EnumDemonWillType, List<BlockPos>> willMap = pillarMap.get(dim);
2017-08-15 21:30:48 -07:00
if (willMap.containsKey(type)) {
if (willMap.get(type).contains(pos)) {
onPillarRemoved(world, type, pos);
2016-09-11 17:58:54 -04:00
return willMap.get(type).remove(pos);
2017-08-15 21:30:48 -07:00
} else {
2016-09-11 17:58:54 -04:00
return false;
}
2017-08-15 21:30:48 -07:00
} else {
2016-09-11 17:58:54 -04:00
return false;
}
2017-08-15 21:30:48 -07:00
} else {
2016-09-11 17:58:54 -04:00
return false;
}
}
//Assume that it has been added already.
2017-08-15 21:30:48 -07:00
private static void onPillarAdded(World world, EnumDemonWillType type, BlockPos pos) {
BMLog.DEBUG.info("Adding...");
List<BlockPos> closePosList = new ArrayList<>();
int dim = world.provider.getDimension();
2017-08-15 21:30:48 -07:00
if (pillarMap.containsKey(dim)) {
Map<EnumDemonWillType, List<BlockPos>> willMap = pillarMap.get(dim);
2017-08-15 21:30:48 -07:00
if (willMap.containsKey(type)) {
List<BlockPos> otherPosList = willMap.get(type);
2016-12-12 19:56:36 -08:00
for (BlockPos closePos : otherPosList) {
if (!closePos.equals(pos) && closePos.distanceSq(pos) <= farthestDistanceSquared) {
closePosList.add(closePos);
}
}
}
}
2017-08-15 21:30:48 -07:00
if (nearPillarMap.containsKey(dim)) {
Map<EnumDemonWillType, Map<BlockPos, List<BlockPos>>> willMap = nearPillarMap.get(dim);
2017-08-15 21:30:48 -07:00
if (willMap.containsKey(type)) {
Map<BlockPos, List<BlockPos>> posMap = willMap.get(type);
2016-12-12 19:56:36 -08:00
for (BlockPos closePos : closePosList) {
List<BlockPos> posList = posMap.get(closePos);
2016-12-12 19:56:36 -08:00
if (posList != null && !posList.contains(pos)) {
posList.add(pos);
2016-12-12 19:56:36 -08:00
} else {
posList = new ArrayList<>();
posList.add(pos);
posMap.put(closePos, posList);
}
}
posMap.put(pos, closePosList);
2017-08-15 21:30:48 -07:00
} else {
Map<BlockPos, List<BlockPos>> posMap = new HashMap<>();
posMap.put(pos, closePosList);
willMap.put(type, posMap);
}
2017-08-15 21:30:48 -07:00
} else {
Map<EnumDemonWillType, Map<BlockPos, List<BlockPos>>> willMap = new HashMap<>();
Map<BlockPos, List<BlockPos>> posMap = new HashMap<>();
posMap.put(pos, closePosList);
willMap.put(type, posMap);
nearPillarMap.put(dim, willMap);
}
}
2017-08-15 21:30:48 -07:00
private static void onPillarRemoved(World world, EnumDemonWillType type, BlockPos pos) {
BMLog.DEBUG.info("Removing...");
2016-09-11 17:58:54 -04:00
int dim = world.provider.getDimension();
2017-08-15 21:30:48 -07:00
if (nearPillarMap.containsKey(dim)) {
2016-09-11 17:58:54 -04:00
Map<EnumDemonWillType, Map<BlockPos, List<BlockPos>>> willMap = nearPillarMap.get(dim);
2017-08-15 21:30:48 -07:00
if (willMap.containsKey(type)) {
2016-09-11 17:58:54 -04:00
Map<BlockPos, List<BlockPos>> posMap = willMap.get(type);
List<BlockPos> posList = posMap.get(pos);
2017-08-15 21:30:48 -07:00
if (posList != null) {
for (BlockPos checkPos : posList) {
2016-09-11 17:58:54 -04:00
List<BlockPos> checkPosList = posMap.get(checkPos);
2017-08-15 21:30:48 -07:00
if (checkPosList != null) {
2016-09-11 17:58:54 -04:00
checkPosList.remove(pos);
}
}
posMap.remove(pos);
}
}
}
}
//TODO: Change to use the nearPillarMap.
2017-08-15 21:30:48 -07:00
public static List<BlockPos> getNearbyPillars(World world, EnumDemonWillType type, BlockPos pos) {
int dim = world.provider.getDimension();
2017-08-15 21:30:48 -07:00
if (nearPillarMap.containsKey(dim)) {
Map<EnumDemonWillType, Map<BlockPos, List<BlockPos>>> willMap = nearPillarMap.get(dim);
2017-08-15 21:30:48 -07:00
if (willMap.containsKey(type)) {
Map<BlockPos, List<BlockPos>> posMap = willMap.get(type);
List<BlockPos> posList = posMap.get(pos);
2017-08-15 21:30:48 -07:00
if (posList != null) {
return posList;
}
}
}
return new ArrayList<>();
}
2017-08-15 21:30:48 -07:00
public static List<BlockPos> getAllConnectedPillars(World world, EnumDemonWillType type, BlockPos pos) {
List<BlockPos> checkedPosList = new ArrayList<>();
List<BlockPos> uncheckedPosList = new ArrayList<>(); //Positions where we did not check their connections.
uncheckedPosList.add(pos);
int dim = world.provider.getDimension();
2017-08-15 21:30:48 -07:00
if (nearPillarMap.containsKey(dim)) {
Map<EnumDemonWillType, Map<BlockPos, List<BlockPos>>> willMap = nearPillarMap.get(dim);
2017-08-15 21:30:48 -07:00
if (willMap.containsKey(type)) {
Map<BlockPos, List<BlockPos>> posMap = willMap.get(type);
// This is where the magic happens.
2017-08-15 21:30:48 -07:00
while (!uncheckedPosList.isEmpty()) {
//Positions that are new this iteration and need to be dumped into uncheckedPosList next iteration.
List<BlockPos> newPosList = new ArrayList<>();
2016-12-12 19:56:36 -08:00
for (BlockPos checkPos : uncheckedPosList) {
List<BlockPos> posList = posMap.get(checkPos);
2016-12-12 19:56:36 -08:00
if (posList != null) {
for (BlockPos testPos : posList) {
//Check if the position has already been checked, is scheduled to be checked, or is already found it needs to be checked.
2016-12-12 19:56:36 -08:00
if (!checkedPosList.contains(testPos) && !uncheckedPosList.contains(testPos) && !newPosList.contains(testPos)) {
newPosList.add(testPos);
}
}
}
}
checkedPosList.addAll(uncheckedPosList);
uncheckedPosList = newPosList;
}
}
}
return checkedPosList;
}
}