using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using GameServer.Contents.GameMode.Helper; using GameServer.Contents.GameMode.Manage.PlayManage; using ServerCore; using NeoSmart.AsyncLock; using ServerBase; using ServerCommon; namespace GameServer; public class GameModeManager : Singleton { private AsyncLock m_lock = new(); private ConcurrentDictionary m_game_modes = new(); /**/ public async Task onInit() { //1. 이벤트 관리하는 Task 추가 //var result = await createBattleEventCheckerTask(); //kihoon todo : 이부분은 GameModeEventCheckerTask라는 걸로 변경 처리 해준다. 여기서 처리 안해줄수 도 있다. await Task.CompletedTask; } public async Task createGameMode(InstanceRoom instanceRoom, GameModeType gameModeType) { (var result, var game_mode) = GameModeHelper.createGameMode(instanceRoom, gameModeType); if (result.isFail()) return result; if (game_mode is null) { var err_msg = $"game_mode is null !!!! gameModeType : {gameModeType}, instanceRoomId : {instanceRoom.getMap().m_room_id}"; Log.getLogger().error(err_msg); result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg); return result; } var room_id = instanceRoom.getMap().m_room_id; if (false == tryAdd(room_id, game_mode)) { //이미 들어가져 있으므로 로그만 남겨놓고 리턴 Log.getLogger().warn($"game_mode already exist...... gameModeType : {gameModeType}, instanceRoomId : {instanceRoom.getMap().m_room_id}"); } await Task.CompletedTask; return result; } public bool tryGetGameMode(string roomId, [MaybeNullWhen(false)] out IGameMode gameMode) { var ret = m_game_modes.TryGetValue(roomId, out gameMode); if (ret == false) { var err_msg = $"gameMode is null : room_id - {roomId}"; Log.getLogger().error(err_msg); } return ret; } public bool tryRemoveGameMode(string roomId, [MaybeNullWhen(false)] out IGameMode gameMode) { return m_game_modes.TryRemove(roomId, out gameMode); } public bool tryAdd(string roomId, IGameMode gameMode) { return m_game_modes.TryAdd(roomId, gameMode); } }