From e64d64bf18e45ff7772092a62acc5f4274796a51 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Sun, 18 Oct 2026 09:19:40 -0400 Subject: [PATCH] Keep destroyed warehouse contents in memory so the rubble can be looted destroyOrDerank nulled city.warehouse on destruction, so the loot click found no warehouse and returned silently. The destroyed Warehouse is now held in Warehouse.destroyedWarehouses keyed by the rubble building UUID until it is looted empty, the rubble is destroyed, or the city places a new warehouse. Contents are not persisted across a reboot. Co-Authored-By: Claude Opus 5.5 --- src/engine/gameManager/BuildingManager.java | 10 ++++------ .../net/client/handlers/DestroyBuildingHandler.java | 1 + .../client/handlers/ManageCityAssetMsgHandler.java | 12 ++---------- .../net/client/handlers/PlaceAssetMsgHandler.java | 1 + src/engine/objects/Building.java | 1 + src/engine/objects/Warehouse.java | 3 +++ 6 files changed, 12 insertions(+), 16 deletions(-) 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;