using Amazon.Runtime.Internal; using Amazon.Runtime.Internal.Transform; using GameServer; using Newtonsoft.Json; using NLog.LayoutRenderers; using Org.BouncyCastle.Asn1.Ocsp; using ServerCommon; using ServerCore; using ServerBase; using System; using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using static ClientToGameReq.Types; namespace GameServer { public class WorldMapTree { public int WorldMetaId { get; } public string WorldMapFileName { get; } public Dictionary ChildLandMapTrees = new(); public Dictionary Anchors = new(); public WorldMapTree(int worldMetaId, string worldMapFileName) { WorldMetaId = worldMetaId; WorldMapFileName = worldMapFileName; } } public class LandMapTree { public int LandId { get; } public string LandMapFileName { get; } public WorldMapTree ParentWorldMapTree { get; } public BuildingMapTree? ChildBuildingMapTree; public Dictionary Anchors = new(); public LandMapTree(int landMetaId, string landMapFileName, WorldMapTree parentWorldMapTree) { LandId = landMetaId; LandMapFileName = landMapFileName; ParentWorldMapTree = parentWorldMapTree; } } public class BuildingMapTree { public int BuildingMetaId { get; } public string BuildingMapFileName { get; } public LandMapTree ParentLandMapTree { get; } public Dictionary ChildRoomMapTrees = new(); public Dictionary Anchors = new(); public BuildingMapTree(int buildingMetaId, string buildingMapFileName, LandMapTree parentLandMapTree) { BuildingMetaId = buildingMetaId; BuildingMapFileName = buildingMapFileName; ParentLandMapTree = parentLandMapTree; } } public class RoomMapTree { public int InstanceMetaId { get; } public string RoomMapFileName { get; } public BuildingMapTree ParentBuildingMapTree { get; } public string OwnerGuid { get; set; } = string.Empty; public string MyhomeGuid { get; set; } = string.Empty; public string InstanceName { get; set; } = string.Empty; public int ThumbnailImageId { get; set; } public int ListImageId { get; set; } public int EnterPlayerCount { get; set; } public Dictionary Anchors = new(); public List UgcNpcs = new(); public RoomMapTree(int instanceMetaId, string roomMapFileName, BuildingMapTree parentBuildingMapTree) { InstanceMetaId = instanceMetaId; RoomMapFileName = roomMapFileName; ParentBuildingMapTree = parentBuildingMapTree; } } public class PersonalRoom { public Dictionary Anchors = new(); } public class AnchorTree { public string ParentMapFileName; public string AnchorGuid; public Pos AnchorPos; public AnchorProp AnchorProp = new(); public AnchorTree(string parentMapFileName, string anchorGuid, Pos anchorPos) { ParentMapFileName = parentMapFileName; AnchorGuid = anchorGuid; AnchorPos = anchorPos; } } public partial class MapManager { private static readonly MapManager _instance = new(); static MapManager() { } private MapManager() { } public static MapManager Instance { get { return _instance; } } ConcurrentDictionary WorldMapTrees = new(); ConcurrentDictionary LandMapTrees = new(); ConcurrentDictionary BuildingMapTrees = new(); ConcurrentDictionary RoomMapTrees = new(); ConcurrentDictionary AnchorTrees = new(); ConcurrentDictionary PersonalRooms = new(); ConcurrentDictionary m_myhome_ugc_infos = new(); List BotStartPos = new(); public void Load() { foreach (var world_meta_data in MetaData.Instance._WorldMetaTable.Values) { var world_map_file_name = world_meta_data.MapPath; if (!MapDataTable.Instance.getMapData(world_map_file_name, out var world_map_data)) { Log.getLogger().error($"Not Exist MapData !!! : fileName:{world_map_file_name}"); continue; } var world_map_tree = new WorldMapTree(world_meta_data.Id, world_map_file_name); if (!WorldMapTrees.TryAdd(world_map_file_name, world_map_tree)) { WorldMapTrees.TryGetValue(world_map_file_name, out var duplicate_map_tree); Log.getLogger().error($"Exist WorldMapFile:{world_map_file_name} - WorldMetaId:{world_meta_data.Id}, WorldMetaId:{duplicate_map_tree?.WorldMetaId}"); continue; } foreach (var anchor in world_map_data.Anchors) { var new_anchor_pos = anchor.Position.toPos(); new_anchor_pos.Angle = (int)(anchor.Rotation.Yaw); var anchor_tree = new AnchorTree(world_map_file_name, anchor.GUID, new_anchor_pos); anchor_tree.AnchorProp.TableId = anchor.TableID; if (anchor.MannequinItems.Count > 0) anchor_tree.AnchorProp.Mannequins = anchor.MannequinItems.ToList(); world_map_tree.Anchors.TryAdd(anchor.GUID, anchor_tree); AnchorTrees.TryAdd(anchor.GUID, anchor_tree); } // Land foreach (var land_name in world_map_data.LandNames) { var land_map_file_name = $"{land_name}.land"; if (!MapDataTable.Instance.getMapData(land_map_file_name, out var land_map_data)) { Log.getLogger().error($"Not Exist MapData !!! : fileName:{land_map_file_name} or CHECK LandData.xlsx"); continue; } if (land_map_data.MapFileType != MapFileType.Land) continue; var land_meta_id = land_map_data.MapMetaId; var land_map_tree = new LandMapTree(land_meta_id, land_map_file_name, world_map_tree); if (!LandMapTrees.TryAdd(land_map_file_name, land_map_tree)) { LandMapTrees.TryGetValue(land_map_file_name, out var duplicate_map_tree); Log.getLogger().error($"Exist LandMapFile:{land_map_file_name} - fileName:{world_map_file_name}, fileName:{duplicate_map_tree?.ParentWorldMapTree.WorldMapFileName}"); continue; } world_map_tree.ChildLandMapTrees.Add(land_meta_id, land_map_tree); foreach (var anchor in land_map_data.Anchors) { var new_anchor_position = TransformHelper.rotate(anchor.Position, land_map_data.Rotation); new_anchor_position.X += land_map_data.Position.X; new_anchor_position.Y += land_map_data.Position.Y; new_anchor_position.Z += land_map_data.Position.Z; var new_anchor_pos = new_anchor_position.toPos(); new_anchor_pos.Angle = (int)(land_map_data.Rotation.Yaw + anchor.Rotation.Yaw); var anchor_tree = new AnchorTree(land_map_file_name, anchor.GUID, new_anchor_pos); anchor_tree.AnchorProp.TableId = anchor.TableID; if (anchor.MannequinItems.Count > 0) anchor_tree.AnchorProp.Mannequins = anchor.MannequinItems.ToList(); land_map_tree.Anchors.TryAdd(anchor.GUID, anchor_tree); AnchorTrees.TryAdd(anchor.GUID, anchor_tree); } // Building foreach (var building_data in land_map_data.BuildingDatas) { var building_map_file_name = Path.GetFileName(building_data.BuildingName); if (!MapDataTable.Instance.getMapData(building_map_file_name, out var building_map_data)) { Log.getLogger().error($"Not Exist MapData !!! : fileName:{building_map_file_name} or CHECK BuildingData.xlsx"); continue; } if (building_map_data.MapFileType != MapFileType.Building) continue; var building_meta_id = building_map_data.MapMetaId; var building_map_tree = new BuildingMapTree(building_meta_id, building_map_file_name, land_map_tree); if (!BuildingMapTrees.TryAdd(building_map_file_name, building_map_tree)) { BuildingMapTrees.TryGetValue(building_map_file_name, out var duplicate_map_tree); Log.getLogger().error($"Exist BuildingMapFile:{building_map_file_name} - filename:{land_map_file_name}, fileName:{duplicate_map_tree?.ParentLandMapTree.LandMapFileName}"); continue; } land_map_tree.ChildBuildingMapTree = building_map_tree; foreach (var anchor in building_map_data.Anchors) { var new_anchor_position = TransformHelper.rotate(anchor.Position, building_map_data.Rotation); new_anchor_position.X += building_data.Position.X; new_anchor_position.Y += building_data.Position.Y; new_anchor_position.Z += building_data.Position.Z; new_anchor_position = TransformHelper.rotate(new_anchor_position, land_map_data.Rotation); new_anchor_position.X += land_map_data.Position.X; new_anchor_position.Y += land_map_data.Position.Y; new_anchor_position.Z += land_map_data.Position.Z; var new_anchor_pos = new_anchor_position.toPos(); new_anchor_pos.Angle = (int)(building_map_data.Rotation.Yaw + land_map_data.Rotation.Yaw + anchor.Rotation.Yaw); var anchor_tree = new AnchorTree(building_map_file_name, anchor.GUID, new_anchor_pos); anchor_tree.AnchorProp.TableId = anchor.TableID; if (anchor.MannequinItems.Count > 0) anchor_tree.AnchorProp.Mannequins = anchor.MannequinItems.ToList(); building_map_tree.Anchors.TryAdd(anchor.GUID, anchor_tree); AnchorTrees.TryAdd(anchor.GUID, anchor_tree); } foreach (var room_data in building_map_data.RoomDatas) { var room_map_file_name = Path.GetFileName(room_data.RoomName); if (!MapDataTable.Instance.getMapData(room_map_file_name, out var room_map_data)) { Log.getLogger().error($"Not Exist MapData !!! : fileName:{room_map_file_name} or CHECK InstanceData.xlsx"); continue; } if (room_map_data.MapFileType != MapFileType.Instance) continue; var instance_meta_id = room_map_data.MapMetaId; if (!MetaData.Instance._IndunTable.TryGetValue(instance_meta_id, out var indun_meta_data)) { Log.getLogger().error($"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instance_meta_id}"); continue; } var room_map_tree = new RoomMapTree(instance_meta_id, room_map_file_name, building_map_tree); if (!RoomMapTrees.TryAdd(room_map_file_name, room_map_tree)) { RoomMapTrees.TryGetValue(room_map_file_name, out var duplicate_map_tree); Log.getLogger().error($"Exist RoomMapFile:{room_map_file_name} - fileName:{building_map_file_name}, fileName:{duplicate_map_tree?.ParentBuildingMapTree.BuildingMapFileName}"); continue; } if (!building_map_tree.ChildRoomMapTrees.TryAdd(indun_meta_data.Building_Socket_, room_map_tree)) { building_map_tree.ChildRoomMapTrees.TryGetValue(indun_meta_data.Building_Socket_, out var duplicate_room_map_tree); Log.getLogger().error($"Exist Floor !!! buildingMetaId:{building_meta_id}, floor:{indun_meta_data.Building_Socket_} - fileName:{room_map_tree.RoomMapFileName}, fileName:{duplicate_room_map_tree?.RoomMapFileName}"); continue; } foreach (var anchor in room_map_data.Anchors) { var new_anchor_position = TransformHelper.rotate(anchor.Position, room_map_data.Rotation); new_anchor_position.X += room_data.Position.X; new_anchor_position.Y += room_data.Position.Y; new_anchor_position.Z += room_data.Position.Z; new_anchor_position = TransformHelper.rotate(new_anchor_position, building_map_data.Rotation); new_anchor_position.X += building_data.Position.X; new_anchor_position.Y += building_data.Position.Y; new_anchor_position.Z += building_data.Position.Z; new_anchor_position = TransformHelper.rotate(new_anchor_position, land_map_data.Rotation); new_anchor_position.X += land_map_data.Position.X; new_anchor_position.Y += land_map_data.Position.Y; new_anchor_position.Z += land_map_data.Position.Z; var new_anchor_pos = new_anchor_position.toPos(); new_anchor_pos.Angle = (int)(room_map_data.Rotation.Yaw + building_map_data.Rotation.Yaw + land_map_data.Rotation.Yaw + anchor.Rotation.Yaw); var anchor_tree = new AnchorTree(room_map_file_name, anchor.GUID, new_anchor_pos); anchor_tree.AnchorProp.TableId = anchor.TableID; if (anchor.MannequinItems.Count > 0) anchor_tree.AnchorProp.Mannequins = anchor.MannequinItems.ToList(); room_map_tree.Anchors.TryAdd(anchor.GUID, anchor_tree); AnchorTrees.TryAdd(anchor.GUID, anchor_tree); } } } } } LoadPersonal(ServerCommon.Constant.DRESS_ROOM_INSTANCE_META_ID); LoadPersonal(ServerCommon.Constant.EDIT_ROOM_INSTANCE_META_ID); loadMyhomeUgcInfo(); } void LoadPersonal(int instanceId) { if (!MetaData.Instance._IndunTable.TryGetValue(instanceId, out var instanceData)) { Log.getLogger().error($"Not Found InstanceData:{instanceId}"); return; } if (!MapDataTable.Instance.getMapData(instanceData.RoomFile, out var personalMapData)) { Log.getLogger().error($"Not Exist MapData {instanceData.RoomFile}"); return; } var warp_pos = MapHelper.getWarpPos(instanceData.ContentsType); personalMapData.Position.X = warp_pos.X; personalMapData.Position.Y = warp_pos.Y; personalMapData.Position.Z = warp_pos.Z; var personalRoom = new PersonalRoom(); foreach (var anchor in personalMapData.Anchors) { var newAnchorPosition = TransformHelper.rotate(anchor.Position, personalMapData.Rotation); newAnchorPosition.X += personalMapData.Position.X; newAnchorPosition.Y += personalMapData.Position.Y; newAnchorPosition.Z += personalMapData.Position.Z; var new_anchor_pos = newAnchorPosition.toPos(); new_anchor_pos.Angle = (int)(personalMapData.Rotation.Yaw + anchor.Rotation.Yaw); var anchorTree = new AnchorTree(instanceData.RoomFile, anchor.GUID, new_anchor_pos); anchorTree.AnchorProp.TableId = anchor.TableID; if (anchor.MannequinItems.Count > 0) anchorTree.AnchorProp.Mannequins = anchor.MannequinItems.ToList(); personalRoom.Anchors.TryAdd(anchor.GUID, anchorTree); AnchorTrees.TryAdd(anchor.GUID, anchorTree); } PersonalRooms.TryAdd(instanceData.RoomFile, personalRoom); } bool loadMyhomeUgcInfo() { // 기본 마이홈 var default_myhome_ugc_info_file_name = MetaHelper.GameConfigMeta.MyHomeDefaultSaveFileName; if (!loadMyhomeFile(default_myhome_ugc_info_file_name)) return false; // TestUser foreach (var meta_data in MetaData.Instance.m_test_user_initial_meta_datas.Values) { if (meta_data.MyhomeFile == string.Empty) continue; if (!loadMyhomeUgcInfoFile(meta_data.MyhomeFile)) return false; } return true; } bool loadMyhomeFile(string myhomeFileName) { var map_data_folder_path = Path.GetFullPath("resource/map/DefaultMap", Environment.CurrentDirectory); var myhome_file_path = Path.Combine(map_data_folder_path, myhomeFileName); if (!File.Exists(myhome_file_path)) { Log.getLogger().warn($"{myhome_file_path} not exist !!!"); return false; } var myhome_file_data = File.ReadAllText(myhome_file_path); var myhome_map_data = JsonConvert.DeserializeObject(myhome_file_data); if (myhome_map_data == null) { Log.getLogger().warn($"{myhome_file_path} convert fail !!!"); return false; } var myhome_ugc_info = new MyhomeUgcInfo(); myhome_ugc_info.RoomType = myhome_map_data.roomtype; foreach (var framework in myhome_map_data.Frameworks) { var ugcFrameworkInfo = new UgcFrameworkInfo(); ugcFrameworkInfo.InteriorItemId = framework.tableid; ugcFrameworkInfo.Floor = framework.Floor; ugcFrameworkInfo.Coordinate = new(); ugcFrameworkInfo.Coordinate.X = (float)framework.Position.X; ugcFrameworkInfo.Coordinate.Y = (float)framework.Position.Y; ugcFrameworkInfo.Coordinate.Z = (float)framework.Position.Z; ugcFrameworkInfo.Rotation = new(); ugcFrameworkInfo.Rotation.Pitch = (float)framework.Rotation.Pitch; ugcFrameworkInfo.Rotation.Yaw = (float)framework.Rotation.Yaw; ugcFrameworkInfo.Rotation.Roll = (float)framework.Rotation.Roll; myhome_ugc_info.FrameworkInfos.Add(ugcFrameworkInfo); } foreach (var anchor in myhome_map_data.Anchors) { var ugcAnchorInfo = new UgcAnchorInfo(); ugcAnchorInfo.AnchorGuid = anchor.GUID; ugcAnchorInfo.AnchorType = anchor.Type; ugcAnchorInfo.TableId = anchor.TableID; ugcAnchorInfo.EntityGuid = anchor.EntityGuid; ugcAnchorInfo.Coordinate = new(); ugcAnchorInfo.Coordinate.X = (float)anchor.Position.X; ugcAnchorInfo.Coordinate.Y = (float)anchor.Position.Y; ugcAnchorInfo.Coordinate.Z = (float)anchor.Position.Z; ugcAnchorInfo.Rotation = new(); ugcAnchorInfo.Rotation.Pitch = (float)anchor.Rotation.Pitch; ugcAnchorInfo.Rotation.Yaw = (float)anchor.Rotation.Yaw; ugcAnchorInfo.Rotation.Roll = (float)anchor.Rotation.Roll; myhome_ugc_info.AnchorInfos.Add(ugcAnchorInfo); } if (!m_myhome_ugc_infos.TryAdd(myhomeFileName, myhome_ugc_info)) { Log.getLogger().warn($"{myhomeFileName} add fail !!!"); return false; } return true; } bool loadMyhomeUgcInfoFile(string myhomeUgcInfoFileName) { var map_data_folder_path = Path.GetFullPath("resource/map/DefaultMap", Environment.CurrentDirectory); var myhome_ugc_info_file_path = Path.Combine(map_data_folder_path, myhomeUgcInfoFileName); if (!File.Exists(myhome_ugc_info_file_path)) { Log.getLogger().warn($"{myhome_ugc_info_file_path} not exist !!!"); return false; } var myhome_ugc_info_file_data = File.ReadAllText(myhome_ugc_info_file_path); var myhome_ugc_info = JsonConvert.DeserializeObject(myhome_ugc_info_file_data); if (myhome_ugc_info == null) { Log.getLogger().warn($"{myhome_ugc_info_file_path} convert fail !!!"); return false; } if (!m_myhome_ugc_infos.TryAdd(myhomeUgcInfoFileName, myhome_ugc_info)) { Log.getLogger().warn($"{myhomeUgcInfoFileName} add fail !!!"); return false; } return true; } public bool UpdateProp(string anchorGuid, AnchorProp prop) { if (!AnchorTrees.TryGetValue(anchorGuid, out var anchorTree)) return false; anchorTree.AnchorProp.TableId = prop.TableId; anchorTree.AnchorProp.GuidByType = prop.GuidByType; anchorTree.AnchorProp.Mannequins = prop.Mannequins; return true; } public void GetMapAnchorList(string mapFileName, out List anchorList) { anchorList = new List(); switch (Path.GetExtension(mapFileName)) { case ".zone": { if (!WorldMapTrees.TryGetValue(mapFileName, out var worldMapTree)) return; anchorList = worldMapTree.Anchors.Values.ToList(); } break; case ".land": { if (!LandMapTrees.TryGetValue(mapFileName, out var landMapTree)) return; anchorList = landMapTree.Anchors.Values.ToList(); } break; case ".build": { if (!BuildingMapTrees.TryGetValue(mapFileName, out var buildMapTree)) return; anchorList = buildMapTree.Anchors.Values.ToList(); } break; case ".room": { if (!RoomMapTrees.TryGetValue(mapFileName, out var roomMapTree)) return; anchorList = roomMapTree.Anchors.Values.ToList(); } break; default: { Log.getLogger().error($"{mapFileName} is not map file"); } return; } } public void GetMapAnchorListForMapCreate(string mapFileName, out List anchorList) { anchorList = new List(); switch (Path.GetExtension(mapFileName)) { case ".zone": { if (!WorldMapTrees.TryGetValue(mapFileName, out var world)) return; anchorList.AddRange(world.Anchors.Values); foreach (var land in world.ChildLandMapTrees.Values) { anchorList.AddRange(land.Anchors.Values); var building = land.ChildBuildingMapTree; if (building == null) continue; anchorList.AddRange(building.Anchors.Values); } } break; case ".room": { if (PersonalRooms.TryGetValue(mapFileName, out var personalRoom)) { anchorList.AddRange(personalRoom.Anchors.Values); return; } if (!RoomMapTrees.TryGetValue(mapFileName, out var room)) return; anchorList.AddRange(room.Anchors.Values); } break; default: { Log.getLogger().error($"{mapFileName} is not map create file"); } return; } } public Pos GetStartPos(string mapFileName) { Pos startPos = new(); var startPosAnchorGuid = MapDataTable.Instance.GetRoomStartPosAnchorGuid(mapFileName); if (!AnchorTrees.TryGetValue(startPosAnchorGuid, out var startPosAnchor)) { return startPos; } startPos.X = startPosAnchor.AnchorPos.X; startPos.Y = startPosAnchor.AnchorPos.Y; startPos.Z = startPosAnchor.AnchorPos.Z + 100; return startPos; } public bool GetWorldMapTree(string mapFileName, [MaybeNullWhen(false)] out WorldMapTree worldMapTree) { return WorldMapTrees.TryGetValue(mapFileName, out worldMapTree); } public bool GetLandMapTree(int landMetaId, [MaybeNullWhen(false)] out LandMapTree landMapTree) { landMapTree = null; if (!MetaData.Instance._LandTable.TryGetValue(landMetaId, out var landData)) { var err_msg = $"Failed to MetaData.TryGetValue() !!! : LandMetaId:{landMetaId}"; Log.getLogger().error(err_msg); return false; } return LandMapTrees.TryGetValue(landData.LandFile, out landMapTree); } public bool GetBuildingMapTree(int buildingMetaId, [MaybeNullWhen(false)] out BuildingMapTree buildingMapTree) { buildingMapTree = null; if (!MetaData.Instance._BuildingTable.TryGetValue(buildingMetaId, out var buildingData)) { var err_msg = $"Failed to MetaData.TryGetValue() !!! : BuildingMetaId:{buildingMetaId}"; Log.getLogger().error(err_msg); return false; } return BuildingMapTrees.TryGetValue(buildingData.BuildingFile, out buildingMapTree); } public bool getRoomMapTree(string myhomeGuid, [MaybeNullWhen(false)] out RoomMapTree roomMapTree) { if (!RoomMapTrees.TryGetValue(myhomeGuid, out roomMapTree)) return false; return true; } public List getLandMetaIds() { var land_meta_ids = new List(); foreach (var land_map_tree in LandMapTrees.Values) { land_meta_ids.Add(land_map_tree.LandId); } return land_meta_ids; } public List getBuildingMetaIds() { var building_meta_ids = new List(); foreach (var building_map_tree in BuildingMapTrees.Values) { building_meta_ids.Add(building_map_tree.BuildingMetaId); } return building_meta_ids; } public bool tryGetLandChildBuildingMetaId(int landMetaId, out int childBuildingMetaId) { childBuildingMetaId = 0; if (!GetLandMapTree(landMetaId, out var land_map_tree)) return false; if (land_map_tree.ChildBuildingMapTree == null) return false; childBuildingMetaId = land_map_tree.ChildBuildingMapTree.BuildingMetaId; return true; } public void ExchangeMannequinDisplayItem(string anchorGuid, List displayItemIds) { if (!AnchorTrees.TryGetValue(anchorGuid, out var anchorTree)) return; anchorTree.AnchorProp.Mannequins = displayItemIds; anchorTree.AnchorProp.IsMannequinsChanged = true; } public bool getParentMapFileName(string anchorGuid, [MaybeNullWhen(false)] out string parentMapFileName) { parentMapFileName = null; if (!AnchorTrees.TryGetValue(anchorGuid, out var anchorTree)) return false; parentMapFileName = anchorTree.ParentMapFileName; return true; } public bool getDefaultMyhomeUgcInfo(string myhomeUgcInfoFileName, [MaybeNullWhen(false)] out MyhomeUgcInfo myhomeUgcInfo) { return m_myhome_ugc_infos.TryGetValue(myhomeUgcInfoFileName, out myhomeUgcInfo); } public void addRoomMaptree(BuildingMapTree buildingMapTree, int floor, RoomMapTree roomMapTree) { buildingMapTree.ChildRoomMapTrees[floor] = roomMapTree; RoomMapTrees[roomMapTree.RoomMapFileName] = roomMapTree; } public async Task tryAddRoomMapTreeFromDb(BuildingFloorDoc buildingFloorDoc) { var result = new Result(); var err_msg = string.Empty; var building_floor_attrib = buildingFloorDoc.getAttrib(); NullReferenceCheckHelper.throwIfNull(building_floor_attrib, () => $"building_floor_attrib is null !!!"); (result, var myhome_attrib) = await MyhomeHelper.getEnterMyhomeAttribFromDynamoDb(building_floor_attrib.OwnerGuid, building_floor_attrib.MyhomeGuid); if (result.isFail() || null == myhome_attrib) { err_msg = $"Failed to getSelectedMyhomeUgcInfoFromDynamoDb() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } (result, var myhome_ugc_info) = await MyhomeHelper.getMyhomeUgcInfo(myhome_attrib); if (result.isFail() || null == myhome_ugc_info) { err_msg = $"Failed to getMyhomeUgcInfo() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } result = MyhomeHelper.getMyhomeInstanceId(myhome_ugc_info.RoomType, out var instance_meta_id); if (result.isFail()) { err_msg = $"Fail to getMyhomeInstanceId() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } if (!MetaData.Instance._IndunTable.TryGetValue(instance_meta_id, out var indun_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instance_meta_id}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (!GetBuildingMapTree(building_floor_attrib.BuildingMetaId, out var building_map_tree)) { err_msg = $"Failed to GetBuildingMapTree() !!! : BuildingMetaId:{building_floor_attrib.BuildingMetaId}"; result.setFail(ServerErrorCode.BuildingMapTreeDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var server_logic = GameServerApp.getServerLogic(); var db_client = server_logic.getDynamoDbClient(); NullReferenceCheckHelper.throwIfNull(db_client, () => $"db_client is null !!!"); var location_unique_id = server_logic.getMap().makeLOCATION_UNIQUE_IDByMetaIdWithLocationTargetType(LocationTargetType.Instance, building_floor_attrib.MyhomeGuid); var npc_location_in_target_doc = new NpcLocationInTargetDoc(location_unique_id, building_floor_attrib.MyhomeGuid); var query_config = db_client.makeQueryConfigForReadByPKOnly(npc_location_in_target_doc.getPK()); (result, var read_docs) = await db_client.simpleQueryDocTypesWithQueryOperationConfig(query_config); if (result.isFail()) { err_msg = $"Failed to simpleQueryDocTypesWithQueryOperationConfig() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } NullReferenceCheckHelper.throwIfNull(read_docs, () => $"read_docs is null !!!"); var ugc_npc_guids = new List(); foreach (var read_doc in read_docs) { var npc_location_in_target_attrib = read_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(npc_location_in_target_attrib, () => $"npc_location_in_target_attrib is null !!!"); ugc_npc_guids.Add(npc_location_in_target_attrib.NpcUniqueId); } var room_map_tree = new RoomMapTree(instance_meta_id, building_floor_attrib.MyhomeGuid, building_map_tree); room_map_tree.OwnerGuid = building_floor_attrib.OwnerGuid; room_map_tree.MyhomeGuid = building_floor_attrib.MyhomeGuid; room_map_tree.InstanceName = building_floor_attrib.InstanceName; room_map_tree.ThumbnailImageId = building_floor_attrib.ThumbnailImageId; room_map_tree.ListImageId = building_floor_attrib.ListImageId; room_map_tree.EnterPlayerCount = building_floor_attrib.EnterPlayerCount; room_map_tree.UgcNpcs = ugc_npc_guids; building_map_tree.ChildRoomMapTrees[building_floor_attrib.Floor] = room_map_tree; RoomMapTrees[room_map_tree.RoomMapFileName] = room_map_tree; return result; } public bool tryRemoveRoomMapTree(int building_meta_id, int floor, [MaybeNullWhen(false)] out RoomMapTree removedRoomMapTree) { removedRoomMapTree = default; if (!GetBuildingMapTree(building_meta_id, out var building_map_tree)) return false; if (!building_map_tree.ChildRoomMapTrees.Remove(floor, out var room_map_tree)) return false; return RoomMapTrees.TryRemove(room_map_tree.RoomMapFileName, out removedRoomMapTree); } public Result modifyFloorLinkedInfo(ModifyFloorLinkedInfo modifyFloorLinkedInfo) { var result = new Result(); var err_msg = string.Empty; if (!GetBuildingMapTree(modifyFloorLinkedInfo.BuildingId, out var building_map_tree)) { err_msg = $"Failed to GetBuildingMapTree() !!! : BuildingMetaId:{modifyFloorLinkedInfo.BuildingId}"; result.setFail(ServerErrorCode.BuildingMapTreeDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (!building_map_tree.ChildRoomMapTrees.TryGetValue(modifyFloorLinkedInfo.Floor, out var room_map_tree)) { err_msg = $"Failed to ChildRoomMapTrees.TryGetValue() !!! : floor:{modifyFloorLinkedInfo.Floor}"; result.setFail(ServerErrorCode.BuildingMapTreeChildRoomNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } switch (modifyFloorLinkedInfo.ModifyType) { case ModifyType.Add: { room_map_tree.UgcNpcs.AddRange(modifyFloorLinkedInfo.FloorLinkedInfo.UgcNpcGuids); } break; case ModifyType.Delete: { foreach (var ugc_npc_guid in modifyFloorLinkedInfo.FloorLinkedInfo.UgcNpcGuids) { room_map_tree.UgcNpcs.Remove(ugc_npc_guid); } } break; } return result; } public Result tryGetUsingFloorCountByLandMetaId(int landMetaId, out int usingFloorCount) { var result = new Result(); var err_msg = string.Empty; usingFloorCount = 0; if (!GetLandMapTree(landMetaId, out var land_map_tree)) { err_msg = $"Failed to GetLandMapTree() !!! : LandMetaId:{landMetaId}"; result.setFail(ServerErrorCode.LandMapTreeDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var building_map_tree = land_map_tree.ChildBuildingMapTree; if (building_map_tree == null) { err_msg = $"Not Exist LandMapTree ChildBuilding !!! : LandMap:{land_map_tree.LandMapFileName}"; result.setFail(ServerErrorCode.LandMapTreeChildBuildingNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } return tryGetUsingFloorCountByBuildingMetaId(building_map_tree.BuildingMetaId, out usingFloorCount); } public Result tryGetUsingFloorCountByBuildingMetaId(int buildingMetaId, out int usingFloorCount) { var result = new Result(); var err_msg = string.Empty; usingFloorCount = 0; if (!GetBuildingMapTree(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; } usingFloorCount = building_map_tree.ChildRoomMapTrees.Count; return result; } } }