using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using Newtonsoft.Json; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using USER_GUID = System.String; namespace GameServer; public partial class GameZoneMoveAction { public async Task<(Result, ServerConnectInfo?, List)> tryJoinBattleInstance(USER_GUID userGuid, Int32 eventId, Timestamp eventStartTS, InstanceMetaData instanceMetaData) { var result = new Result(); var err_msg = string.Empty; var server_connect_info = new ServerConnectInfo(); var business_logs = new List(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); var server_logic = GameServerApp.getServerLogic(); //아이템 혹은 재화 사용해서 입장하는건지, 퍼블릭인지 그에 맞게 조건을 체크하는 함수. 아직 기획적인 내용은 없어서 주석처리.. // result = player.checkInstanceAccess(instanceMetaId); // if (result.isFail()) // { // err_msg = $"Failed to checkInstanceAccess() !!! : {result.toBasicString()}"; // Log.getLogger().error(err_msg); // // return (result, null, business_logs); // } //현재 포지션은 departure pos 가 된다. 관련한 로그 처리 var departure_position_info = player.getCurrentPositionInfo(); var departure_position_log_info = PositionBusinessLogHelper.toPositionLogInfo(PositionMoveType.Departure, departure_position_info); var departure_position_business_log = new PositionBusinessLog(departure_position_log_info); business_logs.Add(departure_position_business_log); BattleInstanceRoomHandler battle_instance_room_handler = new(player.getUserGuid(), instanceMetaData); //적절한 인스턴스 가져오고, 없으면 생성해서 Join처리 (result, var instance_room_id) = await battle_instance_room_handler.joinBattleInstance(player.getUserGuid(), eventId, eventStartTS, instanceMetaData.Id); if (result.isFail()) { err_msg = $"Failed to joinInstance() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return (result, null, business_logs); } var instance_room_storage = new InstanceRoomStorage(); instance_room_storage.Init(server_logic.getRedisDb(), ""); var instance_room_info = await instance_room_storage.GetInstanceRoomInfo(instance_room_id); if (instance_room_info == null) { err_msg = $"Failed to GetInstanceRoomInfo() !!! : instanceRoomId:{instance_room_id} - {player.toBasicString()}"; result.setFail(ServerErrorCode.NotExistRoomInfoForEnter, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, business_logs); } var server_name = ServerType.Indun.toServerName(instance_room_info.InstanceAddress, (ushort)instance_room_info.InstancePort); // 이동 예약 걸기 var message = new ServerMessage.Types.GS2GS_REQ_RESERVATION_ENTER_TO_SERVER(); message.MoveType = ServerMoveType.Force; message.RequestUserGuid = userGuid; message.RequestServerName = server_logic.getServerName(); var reserved = await server_logic.getReservationManager().registerReservationEnterToServer(message, server_name); // 예약 실패 체크 if (null == reserved) { err_msg = $"Failed to Reservation Enter to server !!! : {server_name} - {player.toBasicString()}"; result.setFail(ServerErrorCode.FailedToReservationEnter, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, business_logs); } var location_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(location_action, () => $"location_action is null !!! - {player.toBasicString()}"); result = await location_action.tryMoveToBattleIndun(instance_room_info); if (result.isFail()) { err_msg = $"Failed to tryMoveToIndun() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, null, business_logs); } var buff_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(buff_action, () => $"buff_action is null !!! - {player.toBasicString()}"); result = await buff_action.MoveServer(instanceMetaData.placeType()); if (result.isFail()) { err_msg = $"Failed to MoveServer() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, null, business_logs); } (result, var reserved_to_switch_server) = await ServerConnectionSwitchHelper.startServerSwitch(player, server_logic.getRedisConnector(), server_name); if (result.isFail() || null == reserved_to_switch_server) { err_msg = $"Failed to startServerSwitch() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return (result, null, business_logs); } var game_login_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(game_login_action, () => $"game_login_action is null !!! - {player.toBasicString()}"); var login_cache = game_login_action.getLoginCacheRequest()?.getLoginCache(); NullReferenceCheckHelper.throwIfNull(login_cache, () => $"login_cache is null !! player: {player.toBasicString()}"); login_cache.ReservedToSwitchServer = reserved_to_switch_server; server_connect_info.ServerAddr = instance_room_info.InstanceAddress; server_connect_info.ServerPort = instance_room_info.InstancePort; server_connect_info.Otp = reserved_to_switch_server.OneTimeKey; server_connect_info.RoomId = instance_room_info.roomId; //배틀 인스턴스 같은 경우는 실제 인스턴스 진입시에 Pos를 정해야 하기 때문에 여기서는 빈값으로 처리 //var start_pos = MapManager.Instance.GetBattleInstnaceStartPos(indun_meta_data.RoomFile, instance_room_id); var arrival_position_log_info = PositionBusinessLogHelper.toPositionLogInfo(PositionMoveType.Arrival, server_name, instance_room_info.roomId, MapFileType.Instance, instance_room_info.InstanceId, new()); var arrival_position_business_log = new PositionBusinessLog(arrival_position_log_info); business_logs.Add(arrival_position_business_log); Log.getLogger().debug($"tryJoinBattleInstance server connect info : {JsonConvert.SerializeObject(server_connect_info)}"); return (result, server_connect_info, business_logs); } public async Task<(Result, ClientToGameRes.Types.GS2C_ACK_LEAVE_BATTLE_INSTANCE)> tryLeaveBattleInstanceRoom() { var result = new Result(); var err_msg = string.Empty; var res = new ClientToGameRes.Types.GS2C_ACK_LEAVE_BATTLE_INSTANCE(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); var user_attribute = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {player.toBasicString()}"); var farming_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {player.toBasicString()}"); var location_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(location_action, () => $"location_action is null !!! - {player.toBasicString()}"); var current_indun_location = location_action.getCurrentLocation() as IndunLocation; NullReferenceCheckHelper.throwIfNull(current_indun_location, () => $"current_indun_location is null !!! - {player.toBasicString()}"); var instance_room_Id = current_indun_location.InstanceRoomId; if (instance_room_Id == string.Empty) return (result, res); if (!await BattleInstanceManager.It.LeaveBattleRoom(player, instance_room_Id)) { err_msg = $"Fail to LeaveBattleRoom() !!! : instanceRoomId:{instance_room_Id}"; result.setFail(ServerErrorCode.NotExistInstanceRoom, err_msg); Log.getLogger().error(result.toBasicString()); return (result, res); } Log.getLogger().debug($"try leave battle instancr room done instance_room_Id : {instance_room_Id}"); return (result, res); } }