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.