using Amazon.S3.Model; using ServerCommon; using ServerCore; using ServerBase; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GameServer { public class BuildingManager { ConcurrentDictionary m_buildings = new(); public async Task loadBuildings() { var result = new Result(); var err_msg = string.Empty; var building_meta_ids = MapManager.Instance.getBuildingMetaIds(); foreach (var building_meta_id in building_meta_ids) { var building = new Building(); await building.onInit(); m_buildings.TryAdd(building_meta_id, building); var building_action = building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_action, () => $"building_action is null !!!"); result = await building_action.tryLoadBuildingFromDb(building_meta_id); if (result.isFail()) { err_msg = $"Failed to tryLoadBuildingFromDb() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } var building_floor_agent_action = building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_floor_agent_action, () => $"building_floor_agent_action is null !!!"); result = await building_floor_agent_action.tryLoadBuildingFloorFromDb(building_meta_id); if (result.isFail()) { err_msg = $"Failed to tryLoadBuildingFloorFromDb() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } var building_profit_agent_action = building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_profit_agent_action, () => $"building_profit_agent_action is null !!!"); result = await building_profit_agent_action.tryLoadBuildingProfitFromDb(building_meta_id); if (result.isFail()) { err_msg = $"Failed to tryLoadBuildingProfitFromDb() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } var building_profit_history_agent_action = building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_profit_history_agent_action, () => $"building_profit_history_agent_action is null !!!"); result = await building_profit_history_agent_action.tryLoadBuildingProfitHistoryFromDb(building_meta_id); if (result.isFail()) { err_msg = $"Failed to tryLoadBuildingProfitHistoryFromDb() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } var building_rental_history_agent_action = building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_rental_history_agent_action, () => $"building_rental_history_agent_action is null !!!"); result = await building_rental_history_agent_action.tryLoadBuildingRentalHistoryFromDb(building_meta_id); if (result.isFail()) { err_msg = $"Failed to tryLoadBuildingRentalHistoryFromDb() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } } return result; } public bool tryGetBuilding(int buildingMetaId, [MaybeNullWhen(false)] out Building building) { return m_buildings.TryGetValue(buildingMetaId, out building); } public async Task> tryGetBuildingInfos() { var building_infos = new List(); foreach (var building in m_buildings.Values) { var building_info = await building.toBuildingInfo(); building_infos.Add(building_info); } return building_infos; } public List<(int, int, int)> checkRentalFinish() { var rental_finish_building_floors = new List<(int, int, int)>(); foreach (var building in m_buildings.Values) { var building_floor_agent_action = building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_floor_agent_action, () => $"building_floor_agent_action is null !!!"); var building_floors = building_floor_agent_action.getBuildingFloors(); foreach (var building_floor in building_floors.Values) { var building_floor_action = building_floor.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_floor_action, () => $"building_floor_action is null !!!"); if (building_floor_action.isRentalFinish()) { var (land_meta_id, building_meta_id, floor) = building_floor_action.getAddress(); rental_finish_building_floors.Add((land_meta_id, (int)building_meta_id, floor)); } } } return rental_finish_building_floors; } public Result tryRemoveBuildingFloor(int buildingMetaId, int floor) { var result = new Result(); var err_msg = string.Empty; if (!m_buildings.TryGetValue(buildingMetaId, out var building)) { err_msg = $"Failed to TryGetValue() !!! : buildingMetaId:{buildingMetaId} : {this.getTypeName()}"; result.setFail(ServerErrorCode.BuildingNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var building_floor_agent_action = building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_floor_agent_action, () => $"building_floor_agent_action is null !!!"); building_floor_agent_action.removeBuildingFloor(floor); return result; } } }