Files
caliverse_server/GameServer/Contents/GameMode/Mode-Battle/ModeFreeForAll/Action/BattleZoneMoveAction.cs
2025-05-01 07:23:28 +09:00

182 lines
8.7 KiB
C#

using Google.Protobuf.WellKnownTypes;
using MetaAssets;
using Newtonsoft.Json;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using ServerCore;
using USER_GUID = System.String;
namespace GameServer;
public partial class GameZoneMoveAction
{
public async Task<(Result, ServerConnectInfo?, List<ILogInvoker>)> 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<ILogInvoker>();
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<LocationAction>();
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<BuffAction>();
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<GameLoginAction>();
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<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {player.toBasicString()}");
var farming_action = player.getEntityAction<FarmingAction>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {player.toBasicString()}");
var location_action = player.getEntityAction<LocationAction>();
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);
}
}