diff --git a/src/engine/gameManager/BuildingManager.java b/src/engine/gameManager/BuildingManager.java index 8907339a..a939f289 100644 --- a/src/engine/gameManager/BuildingManager.java +++ b/src/engine/gameManager/BuildingManager.java @@ -777,7 +777,7 @@ public enum BuildingManager { int newMeshUUID; boolean success; - // If this building has no blueprint then set rank and exit immediatly. + // If this building has no blueprint then set rank and exit immediately. if (building.blueprintUUID == 0 || building.getBlueprint() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.MINE)) { building.rank = rank; diff --git a/src/engine/objects/Building.java b/src/engine/objects/Building.java index 5367c8f7..b9d11769 100644 --- a/src/engine/objects/Building.java +++ b/src/engine/objects/Building.java @@ -505,6 +505,11 @@ public class Building extends AbstractWorldObject { return; } + if (city.destroyed.get() == true) { + Logger.error(city.getName() + "derankk called on destroyed city"); + return; + } + bane = city.getBane(); // We need to collect the spires and shrines on the citygrid in case diff --git a/src/engine/objects/City.java b/src/engine/objects/City.java index 8f674de8..6b52dc7a 100644 --- a/src/engine/objects/City.java +++ b/src/engine/objects/City.java @@ -41,6 +41,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantReadWriteLock; public class City extends AbstractWorldObject { @@ -80,6 +81,7 @@ public class City extends AbstractWorldObject { private String hash; public Warehouse warehouse; public Realm realm; + public AtomicBoolean destroyed = new AtomicBoolean(false); /** * ResultSet Constructor @@ -1104,7 +1106,7 @@ public class City extends AbstractWorldObject { Thread destroyCityThread = new Thread(new DestroyCityThread(this)); - destroyCityThread.setName("destroyCity:" + this.getName()); + destroyCityThread.setName("destroyCity: " + this.getName()); destroyCityThread.start(); } @@ -1112,7 +1114,7 @@ public class City extends AbstractWorldObject { Thread transferCityThread = new Thread(new TransferCityThread(this, newOwner)); - transferCityThread.setName("TransferCity:" + this.getName()); + transferCityThread.setName("TransferCity: " + this.getName()); transferCityThread.start(); } diff --git a/src/engine/workthreads/DestroyCityThread.java b/src/engine/workthreads/DestroyCityThread.java index 9c5b2050..8f2ed1b3 100644 --- a/src/engine/workthreads/DestroyCityThread.java +++ b/src/engine/workthreads/DestroyCityThread.java @@ -51,6 +51,8 @@ public class DestroyCityThread implements Runnable { Vector3fImmutable localCoords; ArrayList subGuildList; + city.destroyed.set(true); + // Member variable assignment cityZone = city.getParent(); @@ -83,8 +85,6 @@ public class DestroyCityThread implements Runnable { } } - Building tol = null; - // Build list of buildings within this parent zone for (Building cityBuilding : cityZone.zoneBuildingSet) { @@ -100,13 +100,6 @@ public class DestroyCityThread implements Runnable { if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.BANESTONE)) continue; - // TOL is processed after all other structures in the city zone - - if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.TOL)) { - tol = cityBuilding; - continue; - } - // All buildings are moved to a location relative // to their new parent zone @@ -146,11 +139,6 @@ public class DestroyCityThread implements Runnable { } } - // Destroy the tol - - if (tol != null) - BuildingManager.setRank(tol, -1); - if (city.realm != null) city.realm.removeCity(city.getObjectUUID());