using ServerCore; using ServerBase; using ServerCommon; namespace GameServer; public class BattleInstanceJoinSuccessHandler : GameModeJoinSuccessHandlerBase { private readonly BattleInstanceRoom m_battle_instance_room; public BattleInstanceJoinSuccessHandler(Player player, InstanceRoom instanceRoom) : base(player, EPlaceType.BattleRoom) { var room_id = instanceRoom.getMap().m_room_id; var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id); NullReferenceCheckHelper.throwIfNull(battle_instance_room, () => $"m_battle_instance_room is null !!!"); m_battle_instance_room = battle_instance_room; } public override Result joinSuccessValidate() { var result = BattleRoomHelper.checkBattleActive(m_place_type); if (result.isFail()) return result; return result; } public override async Task joinSuccessConfirmation() { var result = new Result(); string err_msg = string.Empty; var room_id = m_battle_instance_room.m_instance_room.getMap().m_room_id; var battle_instance_attribute = m_battle_instance_room.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(battle_instance_attribute, () => $"battle_instance_attribute is null !!!"); (result, var pos_meta_guid) = BattleRoomHelper.getRandomRespawnPos(battle_instance_attribute, m_battle_instance_room); if (result.isFail()) { return result; } if (false == m_battle_instance_room.m_respawn_pos_anchors_meta.Contains(pos_meta_guid)) { err_msg = $"respawn pos meta not exist idx : {pos_meta_guid}"; result.setFail(ServerErrorCode.BattleInstanceUsableSpawnPointNotExist, err_msg); return result; } using (var releaser = await m_battle_instance_room.getAsyncLock()) { var now = DateTimeHelper.Current; var next_respawn_time = now.AddSeconds(m_battle_instance_room.m_ffa_config_meta.PlayerRespawnTime); battle_instance_attribute.m_combat_pod_mode.m_respawns.AddOrUpdate(pos_meta_guid, next_respawn_time, (key, old) => next_respawn_time); var location_action = m_player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(location_action, () => $"location_action is null !!! - {m_player.toBasicString()}"); var currenct_pos = location_action.getCurrentPos(); if (false == m_battle_instance_room.m_instance_room.getMap().getAnchors().TryGetValue(pos_meta_guid, out var anchorInfo)) { err_msg = $"anchorInfo not exist idx : {pos_meta_guid}"; result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg); return result; } currenct_pos = anchorInfo.AnchorPos.Clone(); currenct_pos.Z += 100; location_action.tryUpdateCurrentPos(currenct_pos); } return result; } public override async Task joinSuccessNotify() { var result = new Result(); m_player.send_S2C_NTF_SET_LOCATION(); result = await BattleInstanceManager.It.sendNtfAboutBattleInstance(m_battle_instance_room, m_player); if (result.isFail()) return result; return result; } public override void joinSuccessWriteLog() { var room_id = m_battle_instance_room.m_instance_room.getMap().m_room_id; var user_guid = m_player.getUserGuid(); var user_nickname = m_player.getUserNickname(); var battle_instance_attribute = m_battle_instance_room.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(battle_instance_attribute, () => $"battle_instance_attribute is null !!!"); var currenct_round = battle_instance_attribute.m_combat_pod_mode.m_current_round; var log_action = new LogActionEx(LogActionType.BattleInstanceJoin); var invoker = new BattleRoomJoinBusinessLog(user_guid, user_nickname, room_id, currenct_round); BusinessLogger.collectLogs(log_action, m_player, new List(){invoker}); } }