From e082a0b49cf28edc8e4d54739e0def569d381626 Mon Sep 17 00:00:00 2001
From: MagicBot <MagicBot@magicbane.com>
Date: Sun, 25 Aug 2024 15:18:40 -0400
Subject: [PATCH] Bane logic tweaking

---
 src/engine/objects/Building.java              |   2 +-
 src/engine/workthreads/DestroyCityThread.java | 144 ++++++++----------
 2 files changed, 68 insertions(+), 78 deletions(-)

diff --git a/src/engine/objects/Building.java b/src/engine/objects/Building.java
index 5367c8f7..0a356546 100644
--- a/src/engine/objects/Building.java
+++ b/src/engine/objects/Building.java
@@ -561,7 +561,7 @@ public class Building extends AbstractWorldObject {
                 BuildingManager.setRank(barracksBuilding, -1);
         }
 
-        // If the tree is R8 and deranking, we need to update it's
+        // If the tree is R8 and deranking, we need to update the
         // mesh along with buildings losing their health bonus
 
         if (this.rank == 8) {
diff --git a/src/engine/workthreads/DestroyCityThread.java b/src/engine/workthreads/DestroyCityThread.java
index 9c5b2050..ae4ac2d8 100644
--- a/src/engine/workthreads/DestroyCityThread.java
+++ b/src/engine/workthreads/DestroyCityThread.java
@@ -53,120 +53,110 @@ public class DestroyCityThread implements Runnable {
 
         // Member variable assignment
 
-        cityZone = city.getParent();
-        newParent = cityZone.parent;
-        formerGuild = city.getTOL().getGuild();
+        try {
+            cityZone = city.getParent();
+            newParent = cityZone.parent;
+            formerGuild = city.getTOL().getGuild();
 
-        // Former guild loses it's tree!
+            // Former guild loses tree!
 
-        if (DbManager.GuildQueries.SET_GUILD_OWNED_CITY(formerGuild.getObjectUUID(), 0)) {
+            if (DbManager.GuildQueries.SET_GUILD_OWNED_CITY(formerGuild.getObjectUUID(), 0)) {
 
-            //Successful Update of guild
+                //Successful Update of guild
 
-            formerGuild.setGuildState(mbEnums.GuildState.Errant);
-            formerGuild.setNation(null);
-            formerGuild.setCityUUID(0);
-            GuildManager.updateAllGuildTags(formerGuild);
-            GuildManager.updateAllGuildBinds(formerGuild, null);
-        }
+                formerGuild.setGuildState(mbEnums.GuildState.Errant);
+                formerGuild.setNation(null);
+                formerGuild.setCityUUID(0);
+                GuildManager.updateAllGuildTags(formerGuild);
+                GuildManager.updateAllGuildBinds(formerGuild, null);
+            }
 
-        // By losing the tree, the former owners lose all of their subguilds.
+            // By losing the tree, the former owners lose all of their subguilds.
 
-        if (!formerGuild.getSubGuildList().isEmpty()) {
+            if (!formerGuild.getSubGuildList().isEmpty()) {
 
-            subGuildList = new ArrayList<>();
+                subGuildList = new ArrayList<>();
 
-            subGuildList.addAll(formerGuild.getSubGuildList());
+                subGuildList.addAll(formerGuild.getSubGuildList());
 
-            for (Guild subGuild : subGuildList) {
-                formerGuild.removeSubGuild(subGuild);
+                for (Guild subGuild : subGuildList) {
+                    formerGuild.removeSubGuild(subGuild);
+                }
             }
-        }
 
-        Building tol = null;
+            // Build list of buildings within this parent zone
 
-        // Build list of buildings within this parent zone
+            for (Building cityBuilding : cityZone.zoneBuildingSet) {
 
-        for (Building cityBuilding : cityZone.zoneBuildingSet) {
+                // Sanity Check in case player deletes the building
+                // before this thread can get to it
 
-            // Sanity Check in case player deletes the building
-            // before this thread can get to it
+                if (cityBuilding == null)
+                    continue;
 
-            if (cityBuilding == null)
-                continue;
+                // Do nothing with the banestone.  It will be removed elsewhere
 
-            // Do nothing with the banestone.  It will be removed elsewhere
+                if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.BANESTONE))
+                    continue;
 
-            if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.BANESTONE))
-                continue;
+                // All buildings are moved to a location relative
+                // to their new parent zone
 
-            // TOL is processed after all other structures in the city zone
+                localCoords = ZoneManager.worldToLocal(cityBuilding.getLoc(), newParent);
 
-            if (cityBuilding.getBlueprint().getBuildingGroup().equals(mbEnums.BuildingGroup.TOL)) {
-                tol = cityBuilding;
-                continue;
-            }
-
-            // All buildings are moved to a location relative
-            // to their new parent zone
+                DbManager.BuildingQueries.MOVE_BUILDING(cityBuilding.getObjectUUID(), newParent.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z);
 
-            localCoords = ZoneManager.worldToLocal(cityBuilding.getLoc(), newParent);
+                // All buildings are re-parented to a zone one node
+                // higher in the tree (continent) as we will be
+                // deleting the city zone very shortly.
 
-            DbManager.BuildingQueries.MOVE_BUILDING(cityBuilding.getObjectUUID(), newParent.getObjectUUID(), localCoords.x, localCoords.y, localCoords.z);
+                if (cityBuilding.getParentZoneID() != newParent.getParentZoneID())
+                    cityBuilding.setParentZone(newParent);
 
-            // All buildings are re-parented to a zone one node
-            // higher in the tree (continent) as we will be
-            // deleting the city zone very shortly.
+                // No longer a tree, no longer any protection contract!
 
-            if (cityBuilding.getParentZoneID() != newParent.getParentZoneID())
-                cityBuilding.setParentZone(newParent);
+                cityBuilding.setProtectionState(mbEnums.ProtectionState.NONE);
 
-            // No longer a tree, no longer any protection contract!
+                // Remove warehouse entry if one exists.
 
-            cityBuilding.setProtectionState(mbEnums.ProtectionState.NONE);
+                if (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE) {
+                    DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse);
+                    city.warehouse = null;
+                }
 
-            // Remove warehouse entry if one exists.
+                if ((cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.BARRACK)
+                        || (cityBuilding.getBlueprint().isWallPiece())
+                        || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SHRINE)
+                        || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.TOL)
+                        || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SPIRE)
+                        || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE)) {
 
-            if (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE) {
-                DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse);
-                city.warehouse = null;
+                    if (cityBuilding.getRank() != -1)
+                        BuildingManager.setRank(cityBuilding, -1);
+                }
             }
 
-            // Destroy all remaining city assets
-
-            if ((cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.BARRACK)
-                    || (cityBuilding.getBlueprint().isWallPiece())
-                    || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SHRINE)
-                    || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.TOL)
-                    || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.SPIRE)
-                    || (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE)) {
-
-                if (cityBuilding.getRank() != -1)
-                    BuildingManager.setRank(cityBuilding, -1);
+            if (city.realm != null) {
+                city.realm.removeCity(city.getObjectUUID());
+                city.realm = null;
             }
-        }
-
-        // Destroy the tol
 
-        if (tol != null)
-            BuildingManager.setRank(tol, -1);
+            // It's now safe to delete the city zone from the database
+            // which will cause a cascade delete of everything else
 
-        if (city.realm != null)
-            city.realm.removeCity(city.getObjectUUID());
+            if (DbManager.ZoneQueries.DELETE_ZONE(cityZone) == false) {
+                Logger.error("DestroyCityThread", "Database error when deleting city zone: " + cityZone.getObjectUUID());
+                return;
+            }
 
-        // It's now safe to delete the city zone from the database
-        // which will cause a cascade delete of everything else
+            // Refresh the city for map requests
 
+            City.lastCityUpdate = System.currentTimeMillis();
 
-        if (DbManager.ZoneQueries.DELETE_ZONE(cityZone) == false) {
-            Logger.error("DestroyCityThread", "Database error when deleting city zone: " + cityZone.getObjectUUID());
-            return;
+        } catch (Exception e) {
+            Logger.error(e);
         }
 
-        // Refresh the city for map requests
-
-        City.lastCityUpdate = System.currentTimeMillis();
-
         // Zone and city should vanish upon next reboot
         // if the codebase reaches here.