초기커밋
This commit is contained in:
@@ -0,0 +1,188 @@
|
||||
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<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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user