diff --git a/src/engine/gameManager/BuildingManager.java b/src/engine/gameManager/BuildingManager.java index 1aaae006..587106f3 100644 --- a/src/engine/gameManager/BuildingManager.java +++ b/src/engine/gameManager/BuildingManager.java @@ -211,12 +211,7 @@ public enum BuildingManager { break; case WAREHOUSE: - City city = building.getCity(); - - if (city == null) - return true; - - Warehouse warehouse = city.warehouse; + Warehouse warehouse = Warehouse.destroyedWarehouses.get(building.getObjectUUID()); if (warehouse == null) return false; @@ -241,6 +236,9 @@ public enum BuildingManager { } } + + if (Warehouse.isEmpty(warehouse)) + Warehouse.destroyedWarehouses.remove(building.getObjectUUID()); break; } diff --git a/src/engine/net/client/handlers/DestroyBuildingHandler.java b/src/engine/net/client/handlers/DestroyBuildingHandler.java index 117bb9e5..c79beb98 100644 --- a/src/engine/net/client/handlers/DestroyBuildingHandler.java +++ b/src/engine/net/client/handlers/DestroyBuildingHandler.java @@ -97,6 +97,7 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler { if (city == null) return true; + Warehouse.destroyedWarehouses.remove(building.getObjectUUID()); DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse); city.warehouse = null; diff --git a/src/engine/net/client/handlers/ManageCityAssetMsgHandler.java b/src/engine/net/client/handlers/ManageCityAssetMsgHandler.java index 1b4f8200..2afff695 100644 --- a/src/engine/net/client/handlers/ManageCityAssetMsgHandler.java +++ b/src/engine/net/client/handlers/ManageCityAssetMsgHandler.java @@ -141,17 +141,9 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler { return true; } - City city = building.getCity(); + Warehouse warehouse = Warehouse.destroyedWarehouses.get(building.getObjectUUID()); - if (city == null) - return true; - - Warehouse warehouse = city.warehouse; - - if (warehouse == null) - return true; - - if (Warehouse.isEmpty(warehouse)) { + if (warehouse == null || Warehouse.isEmpty(warehouse)) { ErrorPopupMsg.sendErrorPopup(player, 167); // no more resources. return true; } diff --git a/src/engine/net/client/handlers/PlaceAssetMsgHandler.java b/src/engine/net/client/handlers/PlaceAssetMsgHandler.java index 4315a5a1..515f63c0 100644 --- a/src/engine/net/client/handlers/PlaceAssetMsgHandler.java +++ b/src/engine/net/client/handlers/PlaceAssetMsgHandler.java @@ -1341,6 +1341,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { } Warehouse warehouse = new Warehouse(warehouseBuilding); + Warehouse.destroyedWarehouses.values().removeIf(destroyed -> destroyed.city == city); city.warehouse = warehouse; DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse); diff --git a/src/engine/objects/Building.java b/src/engine/objects/Building.java index c95e402b..09d69d51 100644 --- a/src/engine/objects/Building.java +++ b/src/engine/objects/Building.java @@ -433,6 +433,7 @@ public class Building extends AbstractWorldObject { // Special handling of warehouses if (blueprint.getBuildingGroup() == BuildingGroup.WAREHOUSE) { + Warehouse.destroyedWarehouses.put(this.getObjectUUID(), city.warehouse); DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse); city.warehouse = null; } diff --git a/src/engine/objects/Warehouse.java b/src/engine/objects/Warehouse.java index 73d21188..bfcf5301 100644 --- a/src/engine/objects/Warehouse.java +++ b/src/engine/objects/Warehouse.java @@ -31,6 +31,9 @@ import java.util.concurrent.ConcurrentHashMap; public class Warehouse { + // Destroyed warehouses keyed by rubble building UUID; memory only so the rubble can be looted + public static final ConcurrentHashMap destroyedWarehouses = new ConcurrentHashMap<>(); + public EnumSet locked = EnumSet.noneOf(mbEnums.ResourceType.class); public Building building; public City city;