using Amazon.DynamoDBv2.DocumentModel; using GameServer; using GameServer.Contents.Room; using Google.Protobuf.WellKnownTypes; using MetaAssets; using ServerCommon; using ServerCore; using ServerBase; namespace GameServer { internal class InstanceRoomHandler { public static async Task<(Result, string)> joinInstance(string userGuid, int instanceMetaId, string? reJoinRoomId = null) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } if (!string.IsNullOrEmpty(reJoinRoomId)) { var roomInfo = await instance_room_storage.GetInstanceRoomInfo(reJoinRoomId); if (roomInfo == null) { await deleteInstanceRoom(reJoinRoomId); } else { var rejoin_instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(reJoinRoomId); result = await joinInstanceRoomFromRedis(userGuid, reJoinRoomId, instanceMetaId, rejoin_instance_room_id_base, roomInfo.UgcNpcCount); if (result.isSuccess()) return (result, reJoinRoomId); } } var instance_room_id = string.Empty; if (instance_meta_data.OverLimit == 1) { (result, instance_room_id) = await joinInstanceRoom(userGuid, instanceMetaId); if (result.isFail()) { err_msg = $"Failed to joinInstanceRoom() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } } else { (result, instance_room_id) = await joinOnlyOneInstanceRoom(userGuid, instanceMetaId); if (instance_room_id == string.Empty) { err_msg = $"Failed to joinOnlyOneInstanceRoom() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } } return (result, instance_room_id); } static async Task<(Result, string)> joinInstanceRoom(string userGuid, int instanceMetaId) { var result = new Result(); string err_msg; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } if (instance_meta_data.OverLimit != 1) { err_msg = $"InstanceMetaData.OverLimit != 1 !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.InstanceMetaDataOverLimitWrong, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } var instance_room_id_base = makeInstanceRoomIdBase(instanceMetaId); var instance_room_id = string.Empty; var room_list = await instance_room_storage.GetInstanceRoomList(instance_room_id_base, instance_meta_data.LimitCount); foreach (var room_id in room_list) { var instance_room_Info = await instance_room_storage.GetInstanceRoomInfo(room_id); if (instance_room_Info == null) { await deleteInstanceRoom(room_id); continue; } // 콘서트 입장 조건 체크 if (instance_room_Info.InstancePlaceType == EPlaceType.Concert) { // 콘서트 시작시간 Delta 전 까지만 입장 가능 if (DateTime.UtcNow.AddSeconds(MetaHelper.GameConfigMeta.ConcertEntranceLimitTime).ToTimestamp() >= instance_room_Info.InstanceStartTime) continue; } result = await joinInstanceRoomFromRedis(userGuid, room_id, instanceMetaId, instance_room_id_base, instance_room_Info.UgcNpcCount); if (result.isSuccess()) { instance_room_id = room_id; break; } } if (instance_room_id == string.Empty) { (result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instanceMetaId); if (result.isFail()) { err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}"; Log.getLogger().error(err_msg); return (result, string.Empty); } result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instanceMetaId, instance_room_id_base, 0); if (result.isFail()) { err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } } return (result, instance_room_id); } /// /// 방이 하나만 존재하는 인스턴스 룸 생성 함수
/// 값이 0 인 인스턴스의 룸 생성시 사용 ///
/// /// /// static async Task<(Result, string)> joinOnlyOneInstanceRoom(string userGuid, int instanceMetaId) { var result = new Result(); string err_msg; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } if (instance_meta_data.OverLimit != 0) { err_msg = $"InstanceMetaData.OverLimit != 0 !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.InstanceMetaDataOverLimitWrong, err_msg); Log.getLogger().error(err_msg); return (result, string.Empty); } var instance_room_id_base = makeInstanceRoomIdBase(instanceMetaId); var instance_room_id = makeOnlyOneInstanceRoomId(instance_room_id_base); var room_info = await instance_room_storage.GetInstanceRoomInfo(instance_room_id); var room_ugc_npc_count = room_info?.UgcNpcCount ?? 0; if (room_info == null) { (result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instanceMetaId); if (result.isFail()) { err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}"; Log.getLogger().error(err_msg); return (result, string.Empty); } } result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instanceMetaId, instance_room_id_base, room_ugc_npc_count); if (result.isFail()) { err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } return (result, instance_room_id); } public static async Task<(Result, string)> joinMyhomeInstance(string userGuid, string myhomeOwnerUserGuid, string myhomeGuid, int myhomeInstanceMetaId, int enterPlayerCount = 0) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var instance_meta_id = myhomeInstanceMetaId; if (!MetaData.Instance._IndunTable.TryGetValue(instance_meta_id, out var instance_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instance_meta_id} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } if (enterPlayerCount < 1) enterPlayerCount = instance_meta_data.LimitCount; var instance_room_id_base = makeMyhomeInstanceRoomIdBase(myhomeOwnerUserGuid, myhomeGuid); var instance_room_id = string.Empty; var room_list = await instance_room_storage.GetInstanceRoomList(instance_room_id_base, enterPlayerCount); foreach (var room_id in room_list) { var instance_room_Info = await instance_room_storage.GetInstanceRoomInfo(room_id); if (instance_room_Info == null) { await deleteInstanceRoom(room_id); continue; } result = await joinInstanceRoomFromRedis(userGuid, room_id, instance_meta_id, instance_room_id_base, instance_room_Info.UgcNpcCount); if (result.isSuccess()) { instance_room_id = room_id; break; } } if (instance_room_id == string.Empty) { (result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instance_meta_id); if (result.isFail()) { err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}"; Log.getLogger().error(err_msg); return (result, string.Empty); } result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instance_meta_id, instance_room_id_base, 0); if (result.isFail()) { err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } } return (result, instance_room_id); } public static async Task<(Result, string)> JoinOnlyOneMyhomeInstance(string userGuid, string myhomeOwnerUserGuid, string myhomeGuid, int myhomeInstanceMetaId) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var instance_meta_id = myhomeInstanceMetaId; if (!MetaData.Instance._IndunTable.TryGetValue(instance_meta_id, out var instance_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instance_meta_id} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } var instance_room_id_base = makeMyhomeInstanceRoomIdBase(myhomeOwnerUserGuid, myhomeGuid); var instance_room_id = makeOnlyOneInstanceRoomId(instance_room_id_base); var room_info = await instance_room_storage.GetInstanceRoomInfo(instance_room_id); var room_ugc_npc_count = room_info?.UgcNpcCount ?? 0; if (room_info == null) { (result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instance_meta_id); if (result.isFail()) { err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}"; Log.getLogger().error(err_msg); return (result, string.Empty); } } result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instance_meta_id, instance_room_id_base, room_ugc_npc_count); if (result.isFail()) { err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } return (result, instance_room_id); } public static async Task<(Result, string)> joinDressRoomInstance(string userGuid) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var instance_meta_id = ServerCommon.Constant.DRESS_ROOM_INSTANCE_META_ID; if (!MetaData.Instance._IndunTable.TryGetValue(instance_meta_id, out var instance_meta_data)) { err_msg = $"Failed to TryGetValue() !!! : instanceMetaId:{instance_meta_id}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } var instance_room_id_base = makeDressRoomInstanceRoomIdBase(userGuid); var instance_room_id = makeOnlyOneInstanceRoomId(instance_room_id_base); var room_info = await instance_room_storage.GetInstanceRoomInfo(instance_room_id); var room_ugc_npc_count = room_info?.UgcNpcCount ?? 0; if (room_info == null) { (result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instance_meta_id); if (result.isFail()) { err_msg = $"Failed to createInstance() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } } result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instance_meta_id, instance_room_id_base, room_ugc_npc_count); if (result.isFail()) { err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } return (result, instance_room_id); } public static async Task<(Result, string)> joinEditRoomInstance(string userGuid) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var instanceMetaId = ServerCommon.Constant.EDIT_ROOM_INSTANCE_META_ID; if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } var instance_room_id_base = makeEditRoomInstanceRoomIdBase(userGuid); var instance_room_id = makeOnlyOneInstanceRoomId(instance_room_id_base); var room_info = await instance_room_storage.GetInstanceRoomInfo(instance_room_id); var room_ugc_npc_count = room_info?.UgcNpcCount ?? 0; if (room_info == null) { (result, instance_room_id) = await createInstanceRoomFromRedis(instance_room_id_base, instanceMetaId); if (result.isFail()) { err_msg = $"Failed to createInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}"; Log.getLogger().error(err_msg); return (result, string.Empty); } } result = await joinInstanceRoomFromRedis(userGuid, instance_room_id, instanceMetaId, instance_room_id_base, room_ugc_npc_count); if (result.isFail()) { err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } return (result, instance_room_id); } public static async Task joinTargetInstanceRoom(string userGuid, string instanceRoomId, int instanceMetaId, int enterPlayerCount = 0) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(instanceRoomId); var instance_room_Info = await instance_room_storage.GetInstanceRoomInfo(instanceRoomId); if (instance_room_Info == null) { await deleteInstanceRoom(instanceRoomId); err_msg = $"Not Found InstanceRoomInfo !!! : instanceRoomId:{instanceRoomId} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.NotExistRoomInfoForEnter, err_msg); Log.getLogger().error(result.toBasicString()); return result; } result = await joinInstanceRoomFromRedis(userGuid, instanceRoomId, instanceMetaId, instance_room_id_base, instance_room_Info.UgcNpcCount, enterPlayerCount); if (result.isFail()) { err_msg = $"Failed to joinInstanceRoomFromRedis() !!! : {result.toBasicString()} - userGuid:{userGuid}"; Log.getLogger().error(err_msg); return result; } return result; } public static async Task CreatePartyInstance(string partyGuid, int instanceMetaId) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data)) { err_msg = $"Failed to TryGetValue() !!! : instanceMetaId:{instanceMetaId}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return string.Empty; } (result, var instance_server_info) = await getBestInstanceServerForCreateInstance(MetaHelper.GameConfigMeta.MaxPartyMembers); if (result.isFail() || instance_server_info == null) { err_msg = $"Failed to getBestInstanceServerForCreateInstance() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return string.Empty; } if (instance_server_info.Address == string.Empty || instance_server_info.Port == 0) { err_msg = $"ServerInfo is invalid !!! Address:{instance_server_info.Address}, Port:{instance_server_info.Port}"; result.setFail(ServerErrorCode.ValidServerNotFound, err_msg); Log.getLogger().error(err_msg); return string.Empty; } var instance_room_id_base = makePartyInstanceRoomIdBase(partyGuid); var instance_room_id = makeOnlyOneInstanceRoomId(instance_room_id_base); (result, _) = await instance_room_storage.createInstanceRoom(instance_room_id, instance_server_info.Address, instance_server_info.Port, instanceMetaId); if (result.isFail()) { err_msg = $"Failed to createInstanceRoom() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return string.Empty; } return instance_room_id; } public static async Task JoinPartyInstance(string userGuid, string instanceRoomId) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var roomInfo = await instance_room_storage.GetInstanceRoomInfo(instanceRoomId); if (roomInfo == null) { await deleteInstanceRoom(instanceRoomId); err_msg = $"Not exist instanceroom:{instanceRoomId}"; Log.getLogger().error(err_msg); return string.Empty; } result = await instance_room_storage.joinInstanceRoom(userGuid, instanceRoomId, MetaHelper.GameConfigMeta.MaxPartyMembers); if (result.isFail()) { err_msg = $"Failed to TryJoinInstanceRoom() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return string.Empty; } return instanceRoomId; } public static async Task leaveInstanceRoom(string userGuid, string instanceRoomId) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); await instance_room_storage.leaveInstanceRoom(userGuid, instanceRoomId); if (!isOnlyOneInstanceRoomID(instanceRoomId)) { var instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(instanceRoomId); await instance_room_storage.decreaseInstanceRoomScore(instance_room_id_base, instanceRoomId); } return result; } public static async Task deleteInstanceRoom(string instanceRoomId) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); await instance_room_storage.deleteInstanceRoom(instanceRoomId); if (!isOnlyOneInstanceRoomID(instanceRoomId)) { var instance_room_id_base = getInstanceRoomIdBaseFromInstanceRoomId(instanceRoomId); await instance_room_storage.removeInstanceRoomList(instance_room_id_base, instanceRoomId); } return result; } public static async Task getInstanceUserCount(int instanceMetaId, string roomIdBase) { var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data)) { err_msg = $"Failed to TryGetValue() !!! : instanceMetaId:{instanceMetaId}"; Log.getLogger().error(err_msg); return 0; } int user_count = 0; if (instance_meta_data.OverLimit == 1) { user_count = await instance_room_storage.getInstanceRoomListTotalUserCount(roomIdBase); } else { var instance_room_id = makeOnlyOneInstanceRoomId(roomIdBase); var instance_room = await instance_room_storage.GetInstanceRoomInfo(instance_room_id); if (instance_room == null) return 0; user_count = await instance_room_storage.getInstanceRoomUserCount(instance_room_id); user_count += instance_room.UgcNpcCount; } return user_count; } public static string makeInstanceRoomIdBase(int instanceMetaId) { return $"{ServerCommon.Constant.PREFIX_INSTANCE_ROOM_ID}:{instanceMetaId}"; } public static string makeMyhomeInstanceRoomIdBase(string userGuid, string myhomeGuid) { return $"{ServerCommon.Constant.PREFIX_MYHOME_INSTANCE_ROOM_ID}:{userGuid}:{myhomeGuid}"; } static string makeDressRoomInstanceRoomIdBase(string userGuid) { return $"{ServerCommon.Constant.PREFIX_DRESS_ROOM_INSTANCE_ROOM_ID}:{userGuid}"; } public static string makeEditRoomInstanceRoomIdBase(string userGuid) { return $"{ServerCommon.Constant.PREFIX_EDIT_ROOM_INSTANCE_ROOM_ID}:{userGuid}"; } static string makePartyInstanceRoomIdBase(string partyGuid) { return $"{ServerCommon.Constant.PREFIX_PARTY_INSTANCE_ROOM_ID}:{partyGuid}"; } public static async Task makeInstanceRoomId(string instanceRoomIdBase, int overLimit) { if (overLimit == 1) { var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var room_id_seq = await instance_room_storage.getRoomIdSeq(); if (room_id_seq == 0) return string.Empty; return $"{instanceRoomIdBase}:{room_id_seq}"; } else { return makeOnlyOneInstanceRoomId(instanceRoomIdBase); } } static string makeOnlyOneInstanceRoomId(string instanceRoomIdBase) { return $"{instanceRoomIdBase}:{ServerCommon.Constant.POSTFIX_ONLY_ONE_INSTANCE_ROOM_ID}"; } public static string getInstanceRoomIdBaseFromInstanceRoomId(string instanceRoomId) { var instance_room_Id_element = instanceRoomId.Split(":"); if (instance_room_Id_element.Length == ServerCommon.Constant.INSTANCE_ROOM_ID_ELEMENT_COUNT) { return $"{instance_room_Id_element[0]}:{instance_room_Id_element[1]}"; } if (instance_room_Id_element.Length == ServerCommon.Constant.MYHOME_INSTANCE_ROOM_ID_ELEMENT_COUNT) { return $"{instance_room_Id_element[0]}:{instance_room_Id_element[1]}:{instance_room_Id_element[2]}"; } return string.Empty; } public static bool isOnlyOneInstanceRoomID(string instanceRoomId) { var room_id_element = instanceRoomId.Split(":"); if (room_id_element.Length != ServerCommon.Constant.INSTANCE_ROOM_ID_ELEMENT_COUNT && room_id_element.Length != ServerCommon.Constant.MYHOME_INSTANCE_ROOM_ID_ELEMENT_COUNT) return false; if (room_id_element[room_id_element.Length - 1] == ServerCommon.Constant.POSTFIX_ONLY_ONE_INSTANCE_ROOM_ID) return true; return false; } static async Task<(Result, string)> createInstanceRoomFromRedis(string instanceRoomIdBase, int instanceMetaId) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } (result, var instance_server_info) = await getBestInstanceServerForCreateInstance(instance_meta_data.LimitCount); if (result.isFail() || instance_server_info == null) { err_msg = $"Failed to getBestInstanceServerForCreateInstance() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } if (instance_server_info.Address == string.Empty || instance_server_info.Port == 0) { err_msg = $"ServerInfo is invalid !!! Address:{instance_server_info.Address}, Port:{instance_server_info.Port}"; result.setFail(ServerErrorCode.ValidServerNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } var instance_room_id = await makeInstanceRoomId(instanceRoomIdBase, instance_meta_data.OverLimit); if (instance_room_id == string.Empty) { err_msg = $"Failed to makeInstanceRoomId() !!!"; result.setFail(ServerErrorCode.ValidServerNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, string.Empty); } (result, var is_created) = await instance_room_storage.createInstanceRoom(instance_room_id, instance_server_info.Address, instance_server_info.Port, instanceMetaId); if (result.isFail()) { err_msg = $"Failed to createInstanceRoom() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } if (instance_meta_data.OverLimit == 1 && is_created) { result = await instance_room_storage.addInstanceRoomList(instanceRoomIdBase, instance_room_id); if (result.isFail()) { err_msg = $"Failed to addInstanceRoomList() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, string.Empty); } } return (result, instance_room_id); } public static async Task<(Result, ServerInfo?)> getBestInstanceServerForCreateInstance(int roomCapacity) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); (result, var server_info_list) = await server_logic.getServerInfosByServerType(ServerType.Indun); if (server_info_list.Count == 0) { err_msg = $"Not Exist Indun Server !!!"; result.setFail(ServerErrorCode.ValidServerNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } int selected_server_index = LoadBalanceServerHelper.getBestInstanceServerIndexForCreate(server_info_list, roomCapacity); if (selected_server_index == -1) { foreach (var server_info in server_info_list) { Log.getLogger().info($"IndunServer Capacity Info !!! : serverName:{server_info.Name}, serverCapacity:{server_info.Capacity}, serverRoomCapacity:{server_info.RoomCapacity}"); } err_msg = $"Not Found Enough Capacity Indun Server !!! : tryCreateRoomCapacity:{roomCapacity}"; result.setFail(ServerErrorCode.ValidServerNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } return (result, server_info_list[selected_server_index]); } public static async Task joinInstanceRoomFromRedis(string userGuid, string instanceRoomId, int instanceMetaId, string instanceRoomIdBase, int ugcNpcCount, int enterPlayerCount = 0) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data)) { err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - userGuid:{userGuid}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (enterPlayerCount < 1) enterPlayerCount = instance_meta_data.LimitCount; result = await instance_room_storage.joinInstanceRoom(userGuid, instanceRoomId, enterPlayerCount - ugcNpcCount); if (result.isFail()) { err_msg = $"Failed to TryJoinInstanceRoom() !!! : {result.toBasicString()}"; Log.getLogger().debug(err_msg); return result; } if (instance_meta_data.OverLimit == 1) { result = await instance_room_storage.increaseInstanceRoomScore(instanceRoomIdBase, instanceRoomId); if (result.isFail()) { await instance_room_storage.leaveInstanceRoom(userGuid, instanceRoomId); err_msg = $"Failed to increaseInstanceRoomScore() !!! : {result.toBasicString()} - userGuid:{userGuid}"; Log.getLogger().debug(err_msg); return result; } } return result; } public static async Task increaseInstanceRoomScoreForUgcNpc(string instanceRoomIdBase, string instanceRoomId) { var result = new Result(); string err_msg; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var instance_room = await instance_room_storage.GetInstanceRoomInfo(instanceRoomId); if (instance_room == null) { err_msg = $"Fail to increase instance room score for ugc npc: instance room id - {instanceRoomId}"; result.setFail(ServerErrorCode.InstanceRoomException, err_msg); Log.getLogger().error(result.toBasicString()); return result; } result = await instance_room_storage.increaseInstanceRoomUgcNpcScore(instanceRoomId); if (!MetaData.Instance._IndunTable.TryGetValue(instance_room.InstanceId, out var instance_meta_data)) { err_msg = $"Failed to TryGetValue() !!! : instanceMetaId:{instance_room.InstanceId}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (instance_meta_data.OverLimit == 1) { result = await instance_room_storage.increaseInstanceRoomScore(instanceRoomIdBase, instanceRoomId); } return result; } public static async Task decreaseInstanceRoomScoreForUgcNpc(string instanceRoomIdBase, string instanceRoomId) { var result = new Result(); string err_msg; var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var instance_room = await instance_room_storage.GetInstanceRoomInfo(instanceRoomId); if (instance_room == null) { err_msg = $"Fail to increase instance room score for ugc npc: instance room id - {instanceRoomId}"; result.setFail(ServerErrorCode.InstanceRoomException, err_msg); Log.getLogger().error(result.toBasicString()); return result; } result = await instance_room_storage.decreaseInstanceRoomUgcNpcScore(instanceRoomId); if (!MetaData.Instance._IndunTable.TryGetValue(instance_room.InstanceId, out var instance_meta_data)) { err_msg = $"Failed to TryGetValue() !!! : instanceMetaId:{instance_room.InstanceId}"; result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (instance_meta_data.OverLimit == 1) { result = await instance_room_storage.decreaseInstanceRoomScore(instanceRoomIdBase, instanceRoomId); } return result; } public static async Task<(Result, List)> tryGetMyhomeInstanceRoomInfos(string myhomeOwnerUserGuid, string myhomeGuid) { var result = new Result(); var err_msg = string.Empty; var myhome_Instance_room_infos = new List(); var server_logic = GameServerApp.getServerLogic(); var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var instance_room_id_base = makeMyhomeInstanceRoomIdBase(myhomeOwnerUserGuid, myhomeGuid); var room_list = await instance_room_storage.GetInstanceRoomList(instance_room_id_base, int.MaxValue); foreach (var room_id in room_list) { var instance_room_Info = await instance_room_storage.GetInstanceRoomInfo(room_id); if (instance_room_Info == null) { await deleteInstanceRoom(room_id); continue; } myhome_Instance_room_infos.Add(instance_room_Info); } return (result, myhome_Instance_room_infos); } } }