using GameServer.Contents.GameMode.Manage.PlayManage; using ServerBase; using ServerCommon; using ServerCore; namespace GameServer.Contents.GameMode.Manage.LeaveManage; public abstract class GameModeDestroyHandlerBase : IGameModeDestroyHandler { protected readonly GameModeType m_game_mode_type; protected string m_room_id; protected IGameMode? m_game_mode; public GameModeDestroyHandlerBase(string roomId, GameModeType gameModeType) { m_game_mode_type = gameModeType; m_room_id = roomId; } public abstract Task postDestroy(IGameMode gameMode); public async Task gameModeDestroy() { var result = new Result(); if (false == GameModeManager.It.tryGetGameMode(m_room_id, out var gameMode)) { var err_msg = $"game_mode is null !!!! gameModeType : {m_game_mode_type}, instanceRoomId : {m_room_id}"; Log.getLogger().error(err_msg); result.setFail(ServerErrorCode.GameModeClassIsNull, err_msg); return result; } var game_mode_base = gameMode as GameModeBase; NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!! casting error"); using (var releaser = await game_mode_base.getAsyncLock()) { var ticker = game_mode_base.getEntityTicker(); if (ticker is not null) { try { ticker.cancel(); ticker = null; } catch(Exception e) { var err_msg = $"Exception !!!, Failed to cancel ||| : Exception:{e}"; Log.getLogger().debug(err_msg); } } //모드별 destroy 처리 await postDestroy(gameMode); if (false == GameModeManager.It.tryRemoveGameMode(m_room_id, out var _)) { var err_msg = $"game_mode is null !!!! gameModeType : {m_game_mode_type}, instanceRoomId : {m_room_id}"; Log.getLogger().warn(err_msg); } } return result; } }