using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ServerCore; using ServerBase; using ServerCommon; using MetaAssets; using META_ID = System.UInt32; namespace GameServer { internal static class BuildingHelper { public static async Task toBuildingInfo(this Building building) { var result = new Result(); var building_attribute = building.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(building_attribute, () => $"building_attribute is null !!!"); var building_info = new BuildingInfo(); building_info.BuildingMetaId = (int)building_attribute.BuildingMetaId; building_info.BuildingName = building_attribute.BuildingName; building_info.BuildingDescription = building_attribute.Description; building_info.OwnerUserGuid = building_attribute.OwnerUserGuid; building_info.RentalCurrencyType = building_attribute.RentalCurrencyType; building_info.RentalCurrencyAmount = building_attribute.RentalCurrencyAmount; building_info.IsRentalOpen = building_attribute.IsRentalOpen == true ? BoolType.True : BoolType.False; if (building_attribute.OwnerUserGuid != string.Empty) { (result, var nickname_attrib) = await NicknameDoc.findNicknameFromGuid(building_attribute.OwnerUserGuid); if (result.isSuccess() && nickname_attrib != null) { building_info.OwnerUserNickname = nickname_attrib.Nickname; } } result = MapManager.Instance.tryGetUsingFloorCountByBuildingMetaId((int)building_attribute.BuildingMetaId, out var usingFloorCount); if (result.isSuccess()) { building_info.RentalFloorCount = usingFloorCount; } return building_info; } public static async Task<(Result, Building?, OwnedBuilding?, DynamoDbDocBase?)> tryGainBuilding(Player player, int buildingMetaId) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); (result, var land_meta_data, var rental_fee_meta_data) = validCheckBuilding((META_ID)buildingMetaId); if (result.isFail()) { err_msg = $"Failed to validCheckOwnerLand() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return (result, null, null, null); } NullReferenceCheckHelper.throwIfNull(land_meta_data, () => $"land_meta_data is null !!!"); NullReferenceCheckHelper.throwIfNull(rental_fee_meta_data, () => $"rental_fee_meta_data is null !!!"); var building_manager = server_logic.getBuildingManager(); if (!building_manager.tryGetBuilding(buildingMetaId, out var building)) { err_msg = $"Failed to tryGetBuilding() !!! : BuildingMetaId:{buildingMetaId} - {player.toBasicString()}"; result.setFail(ServerErrorCode.BuildingNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null, null); } var building_action = building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_action, () => $"building_action is null !!! - {player.toBasicString()}"); var user_guid = player.getUserGuid(); building_action.setBuildingOwner( buildingMetaId, user_guid , (CurrencyType)rental_fee_meta_data.CurrencyType , rental_fee_meta_data.CurrencyValue, land_meta_data.RentalAvailable ); var building_attribute = building.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(building_attribute, () => $"land_building_attributettribute is null !!! - {player.toBasicString()}"); (result, var building_doc_base) = await building_attribute.toDocBase(); if (result.isFail()) { err_msg = $"Failed to toDocBase() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, null, null, null); } NullReferenceCheckHelper.throwIfNull(building_doc_base, () => $"building_doc_base is null !!! - {player.toBasicString()}"); (result, var owned_building) = await OwnedBuildingHelper.createOwnedBuilding(player, buildingMetaId, OwnedType.Own); if (result.isFail()) { err_msg = $"Failed to createOwnedBuilding() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, null, null, null); } return (result, building, owned_building, building_doc_base); } public static (Result, LandMetaData?, RentalfeeData?) validCheckBuilding(META_ID buildingMetaId) { var result = new Result(); var err_msg = string.Empty; if (!MapManager.Instance.GetBuildingMapTree((Int32)buildingMetaId, out var building_map_tree)) { err_msg = $"Failed to GetBuildingMapTree() !!! : BuildingMetaId:{buildingMetaId}"; result.setFail(ServerErrorCode.BuildingMapTreeDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null); } var land_map_tree = building_map_tree.ParentLandMapTree; if (land_map_tree == null) { err_msg = $"Not Exist BuildingMapTree ParentLand !!! : BuildingMap:{building_map_tree.BuildingMapFileName}"; result.setFail(ServerErrorCode.BuildingMapTreeParentLandNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null); } if (!MetaData.Instance._LandTable.TryGetValue(land_map_tree.LandId, out var land_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : LandMetaId:{land_map_tree.LandId}"; result.setFail(ServerErrorCode.LandMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null); } if (!MetaData.Instance._RentalfeeTable.TryGetValue((land_meta_data.Editor, land_meta_data.LandSize), out var rentalfee_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : Editor:{land_meta_data.Editor}, Size:{land_meta_data.LandSize}"; result.setFail(ServerErrorCode.RentalfeeMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null); } return (result, land_meta_data, rentalfee_meta_data); } public static async Task<(Result, Building?, OwnedBuilding?, DynamoDbDocBase?)> tryInitMyBuildingOwnership(Player player, int buildingMetaId) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); if (!MapManager.Instance.GetBuildingMapTree(buildingMetaId, out var building_map_tree)) { err_msg = $"Failed to GetBuildingMapTree() !!! : BuildingMetaId:{buildingMetaId} - {player.toBasicString()}"; result.setFail(ServerErrorCode.BuildingMapTreeDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null, null); } var land_map_tree = building_map_tree.ParentLandMapTree; if (land_map_tree == null) { err_msg = $"Not Exist BuildingMapTree ParentLand !!! : BuildingMap:{building_map_tree.BuildingMapFileName} - {player.toBasicString()}"; result.setFail(ServerErrorCode.BuildingMapTreeParentLandNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null, null); } if (!MetaData.Instance._LandTable.TryGetValue(land_map_tree.LandId, out var land_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : LandMetaId:{land_map_tree.LandId} - {player.toBasicString()}"; result.setFail(ServerErrorCode.LandMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null, null); } var building_manager = server_logic.getBuildingManager(); if (!building_manager.tryGetBuilding(buildingMetaId, out var building)) { err_msg = $"Failed to tryGetBuilding() !!! : BuildingMetaId:{buildingMetaId} - {player.toBasicString()}"; result.setFail(ServerErrorCode.BuildingNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null, null); } var building_action = building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_action, () => $"building_action is null !!! - {player.toBasicString()}"); var user_guid = player.getUserGuid(); if (!building_action.isBuildingOwner(user_guid)) { err_msg = $"Building Owner is Not Match !!! : buildingMetaId:{buildingMetaId} - {player.toBasicString()}"; result.setFail(ServerErrorCode.BuildingOwnerIsNotMatch, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null, null); } building_action.initOwner(); var building_attribute = building.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(building_attribute, () => $"building_attribute is null !!! - {player.toBasicString()}"); (result, var building_doc_base) = await building_attribute.toDocBase(); if (result.isFail()) { err_msg = $"Failed to toDocBase() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, null, null, null); } NullReferenceCheckHelper.throwIfNull(building_doc_base, () => $"building_doc_base is null !!! - {player.toBasicString()}"); var owned_building_agent_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(owned_building_agent_action, () => $"owned_building_agent_action is null !!! - {player.toBasicString()}"); if (!owned_building_agent_action.tryGetOwnedBuilding(buildingMetaId, out var owned_building)) { err_msg = $"Failed to tryGetOwnedBuilding() !!! : buildingMetaId:{buildingMetaId} - {player.toBasicString()}"; result.setFail(ServerErrorCode.OwnedBuildingNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null, null); } var owned_building_action = owned_building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(owned_building_action, () => $"owned_building_action is null !!! - {player.toBasicString()}"); owned_building_action.DeleteOwnedBuilding(); return (result, building, owned_building, building_doc_base); } } }