250501 커밋
This commit is contained in:
@@ -0,0 +1,287 @@
|
||||
using GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
using GameServer.Contents.GameMode.Mode_Battle.Manage;
|
||||
using Google.Protobuf;
|
||||
using MetaAssets;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_BATTLE_OBJECT_INTERACTION), typeof(BattleObjectInteractionPacketHandler), typeof(GameLoginListener))]
|
||||
|
||||
public class BattleObjectInteractionPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public override async Task<Result> onProcessPacket(ISession session, IMessage recvMessage)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var player = session as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
//var server_config = server_logic.getServerConfig();
|
||||
// bool is_battle_system_active = server_config.BattleSystemEnable;
|
||||
//
|
||||
// if (false == is_battle_system_active)
|
||||
// {
|
||||
// err_msg = $"is_battle_system_active is false!!!";
|
||||
// result.setFail(ServerErrorCode.BattleInstanceInActive, err_msg);
|
||||
// Log.getLogger().error(err_msg);
|
||||
// send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, "");
|
||||
// return result;
|
||||
// }
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ReqBattleObjectInteraction;
|
||||
if (null == request)
|
||||
{
|
||||
err_msg = $"failed to get request message : Invalid Request message - {req_msg.Request.MsgCase}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
|
||||
send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, "");
|
||||
return result;
|
||||
}
|
||||
|
||||
var anchor_guid = request.AnchorGuid;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(anchor_guid, () => $"anchor_guid is null !!! - {player.toBasicString()}");
|
||||
var packet_create_time = request.PacketCreateTime;
|
||||
|
||||
var room_id = player.getCurrentInstanceRoomId();
|
||||
if(false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode))
|
||||
{
|
||||
err_msg = $"battle_instance_room is null : room_id - {room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
||||
send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, anchor_guid);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id);
|
||||
// if (battle_instance_room == null)
|
||||
// {
|
||||
// err_msg = $"battle_instance_room is null : room_id - {room_id}";
|
||||
// Log.getLogger().error(err_msg);
|
||||
// result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
||||
// send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, anchor_guid);
|
||||
// return result;
|
||||
// }
|
||||
var game_mode_base = gameMode as GameModeBase;
|
||||
NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!");
|
||||
|
||||
var attribute = game_mode_base.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
|
||||
if (packet_create_time is not null)
|
||||
{
|
||||
Log.getLogger().info($"Battle Object interaction packet received anchor_guid : {anchor_guid}, packetCreateTime : {packet_create_time}, player : {player.toBasicString()}");
|
||||
}
|
||||
|
||||
|
||||
BattleObjectInteractionLogicHandler handler = new(player.getUserGuid(), player.getUserNickname(), anchor_guid, attribute.m_room_id);
|
||||
CommonResult common_result = new();
|
||||
var fn_interact_battle_object = async delegate()
|
||||
{
|
||||
using (var releaser = await game_mode_base.getAsyncLock())
|
||||
{
|
||||
result = await interactObject(handler, game_mode_base, anchor_guid, player);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
//batch 처리
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.BattleObjectInteraction, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
}
|
||||
|
||||
BattleObjectInteractionBusinessLog business_log = new(handler.m_interaction_log_info);
|
||||
batch.appendBusinessLog(business_log);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
|
||||
if (result.isFail()) return result;
|
||||
|
||||
//보상 내용 가져올것
|
||||
var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents);
|
||||
NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}");
|
||||
common_result = found_transaction_runner.getCommonResult();
|
||||
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafelyWithTransGuid(player.getUserGuid(), TransactionIdType.PrivateContents, "InteractBattleObject", fn_interact_battle_object);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafelyWithTransGuid() !!! : {result.toBasicString()}, {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, anchor_guid);
|
||||
return result;
|
||||
}
|
||||
|
||||
//순서 바꾸지 말것(클라 요청사항)
|
||||
send_S2C_ACK_BATTLE_OBJECT_INTERACTION(player, result, anchor_guid);
|
||||
|
||||
var ffa = game_mode_base as GameModeTPSFreeForAll<GameModeTPSFreeForAllData>;
|
||||
NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!! - {player.toBasicString()}");
|
||||
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_INTERACTION(ffa, player.getUserGuid(), anchor_guid);
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(ffa, handler);
|
||||
|
||||
sendOtherNotifies(handler, ffa, common_result);
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void sendOtherNotifies(BattleObjectInteractionLogicHandler handler, GameModeTPSFreeForAll<GameModeTPSFreeForAllData> battleInstanceRoom, CommonResult commonResult)
|
||||
{
|
||||
//pod combat이 활성화 되서 stand는 전부 비활성화
|
||||
if (handler.m_need_noti_objects.Count > 0)
|
||||
{
|
||||
System.Collections.Generic.List<BattleObjectInfo> infos = new();
|
||||
foreach (var battle_object in handler.m_need_noti_objects)
|
||||
{
|
||||
BattleObjectInfo info = new();
|
||||
info.AnchorGuid = battle_object.m_anchor_guid;
|
||||
info.IsActive = battle_object.m_is_active ? BoolType.True : BoolType.False;
|
||||
infos.Add(info);
|
||||
}
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_OBJECT_STATE_INFO(battleInstanceRoom, infos);
|
||||
}
|
||||
|
||||
//pod combat 활성화 Noti
|
||||
if (handler.m_is_need_combat_pod_noti)
|
||||
{
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(battleInstanceRoom);
|
||||
}
|
||||
|
||||
if (handler.m_is_need_combat_pod_noti)
|
||||
{
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(battleInstanceRoom);
|
||||
}
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_BATTLE_REWARD(battleInstanceRoom, handler.m_user_guid, commonResult);
|
||||
}
|
||||
|
||||
public async Task<Result> interactObject(BattleObjectInteractionLogicHandler handler, GameModeBase battleInstanceRoom, string anchorGuid, Player player)
|
||||
{
|
||||
var attribute = battleInstanceRoom.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
|
||||
handler.m_is_combat_pod = BattleInstancePlayModeHelper.isPodCombat(attribute, anchorGuid);
|
||||
if (handler.m_is_combat_pod)
|
||||
{
|
||||
Log.getLogger().debug($"m is pod combat is true anchor_guid : {anchorGuid}, player : {player.toBasicString()}");
|
||||
result = await interactPodCombat(handler, battleInstanceRoom, anchorGuid, player);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.getLogger().debug($"m is pod combat is false anchor_guid : {anchorGuid}, player : {player.toBasicString()}");
|
||||
result = await interactBattleObject(handler, battleInstanceRoom, anchorGuid, player);
|
||||
}
|
||||
if (result.isFail()) return result;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> interactBattleObject(BattleObjectInteractionLogicHandler handler, GameModeBase battleInstanceRoom, string anchorGuid, Player player)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
(result, handler.m_battle_object_meta) = BattleInstancePlayModeHelper.getBattleObjectMeta(handler.m_interaction_anchor_guid, battleInstanceRoom);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
|
||||
var attribute = battleInstanceRoom.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
|
||||
var interact_action = battleInstanceRoom.getEntityAction<BattleObjectInteractAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(interact_action, () => $"interact_action is null !!!");
|
||||
|
||||
|
||||
var battle_instance_object = BattleInstancePlayModeHelper.getBattleObject(handler.m_interaction_anchor_guid, attribute, handler.m_battle_object_meta.ObjectType);
|
||||
if (battle_instance_object is null)
|
||||
{
|
||||
err_msg = $"battle_object activate time not yet " +
|
||||
$"anchorGuid : {handler.m_interaction_anchor_guid}, " +
|
||||
$"objectType : {handler.m_battle_object_meta.ObjectType}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceObjectNotExist, err_msg);
|
||||
return result;
|
||||
}
|
||||
handler.m_battle_object = battle_instance_object;
|
||||
|
||||
if (handler.m_battle_object.m_is_active == false)
|
||||
{
|
||||
err_msg = $"battle_object activ is false " +
|
||||
$"anchorGuid : {handler.m_interaction_anchor_guid}, " +
|
||||
$"objectType : {handler.m_battle_object_meta.ObjectType}," +
|
||||
$" nextActivateTime : {handler.m_battle_object.m_active_time}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceObjectInteractionNotActive, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
handler.m_interaction_log_info.m_battle_object_type = handler.m_battle_object_meta.ObjectType;
|
||||
switch (handler.m_battle_object_meta.ObjectType)
|
||||
{
|
||||
case EBattleObjectType.Buff:
|
||||
case EBattleObjectType.Weapon:
|
||||
result = await interact_action.interactCommonBattleObject(handler, player);
|
||||
break;
|
||||
case EBattleObjectType.Pod_Box:
|
||||
result = await interact_action.interactPickupPod(handler, player);
|
||||
break;
|
||||
case EBattleObjectType.Pod_Combat:
|
||||
result = await interact_action.interactPodStorage(handler, player);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public async Task<Result> interactPodCombat(BattleObjectInteractionLogicHandler handler, GameModeBase battleInstanceRoom, string anchorGuid, Player player)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var interact_action = battleInstanceRoom.getEntityAction<BattleObjectInteractAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(interact_action, () => $"interact_action is null !!!");
|
||||
|
||||
var result = await interact_action.interactPodCombat(handler, player);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public bool send_S2C_ACK_BATTLE_OBJECT_INTERACTION(Player player, Result result, string anchorGuid)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckBattleObjectInteraction = new ClientToGameRes.Types.GS2C_ACK_BATTLE_OBJECT_INTERACTION();
|
||||
ack_packet.Response.AckBattleObjectInteraction.AnchorGuid = anchorGuid;
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,194 @@
|
||||
using GameServer.Contents.GameMode.Mode_Battle.Manage;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_BATTLE_PLAYER_DEATH), typeof(BattlePlayerDeadPacketHandler), typeof(GameLoginListener))]
|
||||
public class BattlePlayerDeadPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_config = server_logic.getServerConfig();
|
||||
bool is_battle_system_active = server_config.BattleSystemEnable;
|
||||
|
||||
if (false == is_battle_system_active)
|
||||
{
|
||||
err_msg = $"is_battle_system_active is false!!!";
|
||||
result.setFail(ServerErrorCode.BattleInstanceInActive, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_BATTLE_PLAYER_DEATH(player, result);
|
||||
return result;
|
||||
}
|
||||
var room_id = player.getCurrentInstanceRoomId();
|
||||
//var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id);
|
||||
|
||||
if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode))
|
||||
{
|
||||
err_msg = $"battle_instance_room is null : room_id - {room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
||||
send_S2C_ACK_BATTLE_PLAYER_DEATH(player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ReqBattlePlayerDeath;
|
||||
if (null == request)
|
||||
{
|
||||
err_msg = $"failed to get request message : Invalid Request message - {req_msg.Request.MsgCase}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
|
||||
send_S2C_ACK_BATTLE_PLAYER_DEATH(player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var killer_guid = request.KillerGuid;
|
||||
var packet_create_time = request.PacketCreateTime;
|
||||
|
||||
if (packet_create_time is not null)
|
||||
{
|
||||
Log.getLogger().info($"Player Deat packet received room_id : {room_id}, anchor_guid : {killer_guid}, packetCreateTime : {packet_create_time}, player : {player.toBasicString()}");
|
||||
}
|
||||
|
||||
var ffa = gameMode as GameModeTPSFreeForAll<GameModeTPSFreeForAllData>;
|
||||
NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!");
|
||||
result = await playerDeadProcess(player, killer_guid, ffa);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
await killUserQuestCheck(killer_guid, ffa);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task killUserQuestCheck(string killerGuid, GameModeTPSFreeForAll<GameModeTPSFreeForAllData> battleInstanceRoom)
|
||||
{
|
||||
battleInstanceRoom.getInstanceRoom().tryGetInstanceMember(killerGuid, out var killer);
|
||||
|
||||
if (killer is null)
|
||||
{
|
||||
Log.getLogger().warn($"killer User not exist instance killerGuid : {killerGuid}, roomId :{battleInstanceRoom.getRoomId()} ");
|
||||
return;
|
||||
}
|
||||
|
||||
var attribute = battleInstanceRoom.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
if (false == attribute.m_combat_pod_mode.m_tactical_board.TryGetValue(killerGuid, out var boradInfo))
|
||||
{
|
||||
Log.getLogger().warn($"killer User not exist m_tactical_board killerGuid : {killerGuid}, roomId :{battleInstanceRoom.getRoomId()} ");
|
||||
return;
|
||||
}
|
||||
|
||||
var kill_count = boradInfo.m_kill_count;
|
||||
await QuestManager.It.QuestCheck(killer, new QuestTpsPlayerKill(EQuestEventTargetType.TPS, EQuestEventNameType.PLAYERKILL, kill_count));
|
||||
}
|
||||
|
||||
public async Task<Result> playerDeadProcess(Player player, string kilerUserGuid, GameModeTPSFreeForAll<GameModeTPSFreeForAllData> battleInstanceRoom)
|
||||
{
|
||||
var dead_user_guid = player.getUserGuid();
|
||||
var dead_user_nickname = player.getUserNickname();
|
||||
|
||||
var attribute = battleInstanceRoom.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
|
||||
var fn_player_dead = async delegate()
|
||||
{
|
||||
|
||||
bool need_pod_combat_drop_noti = false;
|
||||
using (var releaser = await battleInstanceRoom.getAsyncLock())
|
||||
{
|
||||
increaseKillDeadCount(attribute, kilerUserGuid, dead_user_guid);
|
||||
|
||||
var current_owner_guid = attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid;
|
||||
need_pod_combat_drop_noti = dead_user_guid.Equals(current_owner_guid);
|
||||
|
||||
if (need_pod_combat_drop_noti)
|
||||
{
|
||||
attribute.m_combat_pod_mode.m_pod_combat.changeDropState(player.getCurrentPositionInfo().Pos);
|
||||
attribute.modifiedEntityAttribute(true);
|
||||
}
|
||||
}
|
||||
|
||||
Result fn_result = new();
|
||||
send_S2C_ACK_BATTLE_PLAYER_DEATH(player, fn_result);
|
||||
BattleRoomNotifyHelper.send_GS2C_NTF_PLAYER_DEATH(battleInstanceRoom, kilerUserGuid, dead_user_guid, player);
|
||||
if (need_pod_combat_drop_noti)
|
||||
{
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(battleInstanceRoom);
|
||||
}
|
||||
|
||||
battleInstanceRoom.getInstanceRoom().tryGetInstanceMember(kilerUserGuid, out var killer_player);
|
||||
string killer_nickname = string.Empty;
|
||||
if (killer_player is not null)
|
||||
{
|
||||
killer_nickname = killer_player.getUserNickname();
|
||||
}
|
||||
|
||||
var log_action = new LogAction(LogActionType.BattleUserDead.ToString());
|
||||
var invoker = new BattleRoomPlayerDeadBusinessLog(dead_user_guid, dead_user_nickname, kilerUserGuid, killer_nickname
|
||||
, battleInstanceRoom.getRoomId(), attribute.m_combat_pod_mode.m_current_round, need_pod_combat_drop_noti);
|
||||
BusinessLogger.collectLogs(log_action, player, new List<ILogInvoker>(){invoker});
|
||||
|
||||
return fn_result;
|
||||
|
||||
|
||||
};
|
||||
|
||||
var result = await player.runTransactionRunnerSafely(TransactionIdType.BattleRoom, "BattlePlayerDead", fn_player_dead);
|
||||
if (result.isFail())
|
||||
{
|
||||
var err_msg = $"Failed to runTransactionRunnerSafelyWithTransGuid() !!! : {result.toBasicString()}, {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_BATTLE_PLAYER_DEATH(player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void increaseKillDeadCount(BattleInstanceSnapshotAttribute attribute, string kilerUserGuid, string deadUserGuid)
|
||||
{
|
||||
if (false == attribute.m_combat_pod_mode.m_tactical_board.TryGetValue(kilerUserGuid, out var killerTacticalBoardInfo))
|
||||
{
|
||||
killerTacticalBoardInfo = new(kilerUserGuid);
|
||||
attribute.m_combat_pod_mode.m_tactical_board.TryAdd(kilerUserGuid, killerTacticalBoardInfo);
|
||||
}
|
||||
killerTacticalBoardInfo.m_kill_count++;
|
||||
|
||||
if (false == attribute.m_combat_pod_mode.m_tactical_board.TryGetValue(deadUserGuid, out var deadTacticalBoardInfo))
|
||||
{
|
||||
deadTacticalBoardInfo = new(deadUserGuid);
|
||||
attribute.m_combat_pod_mode.m_tactical_board.TryAdd(deadUserGuid, deadTacticalBoardInfo);
|
||||
}
|
||||
deadTacticalBoardInfo.m_Death_count++;
|
||||
}
|
||||
|
||||
public bool send_S2C_ACK_BATTLE_PLAYER_DEATH(Player player, Result result)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckBattlePlayerDeath = new ClientToGameRes.Types.GS2C_ACK_BATTLE_PLAYER_DEATH();
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
using GameServer.Contents.Battle.Log;
|
||||
using GameServer.Contents.GameMode.Manage.PlayManage;
|
||||
using GameServer.Contents.GameMode.Mode_Battle.Manage;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_BATTLE_PLAYER_RESPAWN), typeof(BattlePlayerRespawnPacketHandler), typeof(GameLoginListener))]
|
||||
public class BattlePlayerRespawnPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_config = server_logic.getServerConfig();
|
||||
bool is_battle_system_active = server_config.BattleSystemEnable;
|
||||
|
||||
if (false == is_battle_system_active)
|
||||
{
|
||||
err_msg = $"is_battle_system_active is false!!!";
|
||||
result.setFail(ServerErrorCode.BattleInstanceInActive, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var room_id = player.getCurrentInstanceRoomId();
|
||||
//var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id);
|
||||
|
||||
if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode))
|
||||
{
|
||||
err_msg = $"gameMode is null : room_id - {room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
||||
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ReqBattlePlayerRespawn;
|
||||
if (null == request)
|
||||
{
|
||||
err_msg = $"failed to get request message : Invalid Request message - {req_msg.Request.MsgCase}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
|
||||
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var packet_create_time = request.PacketCreateTime;
|
||||
if (packet_create_time is not null)
|
||||
{
|
||||
Log.getLogger().info($"Battle Player respawn packet received packetCreateTime : {packet_create_time}, player : {player.toBasicString()}");
|
||||
}
|
||||
|
||||
var game_mode_base = gameMode as GameModeBase;
|
||||
NullReferenceCheckHelper.throwIfNull(game_mode_base, () => $"game_mode_base is null !!!");
|
||||
AnchorInfo? anchor_info = null;
|
||||
var attribute = game_mode_base.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
var next_respawn_time = DateTimeHelper.Current;
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
var ffa = gameMode as GameModeTPSFreeForAll<GameModeTPSFreeForAllData>;
|
||||
NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!");
|
||||
|
||||
using (var releaser = await game_mode_base.getAsyncLock())
|
||||
{
|
||||
|
||||
|
||||
(result, var pos_meta_guid) = BattleRoomHelper.getRandomRespawnPos(attribute, ffa);
|
||||
if (result.isFail())
|
||||
{
|
||||
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
if (false == ffa.m_respawn_pos_anchors_meta.Contains(pos_meta_guid))
|
||||
{
|
||||
err_msg = $"respawn pos meta not exist pos_meta_guid : {pos_meta_guid}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceUsableSpawnPointNotExist, err_msg);
|
||||
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var now = DateTimeHelper.Current;
|
||||
next_respawn_time = now.AddSeconds(ffa.m_ffa_config_meta.PlayerRespawnTime);
|
||||
|
||||
attribute.m_combat_pod_mode.m_respawns.AddOrUpdate(pos_meta_guid, next_respawn_time, (key, old) => next_respawn_time);
|
||||
attribute.modifiedEntityAttribute(true);
|
||||
|
||||
if (false == game_mode_base.getInstanceRoom().getMap().m_anchors.TryGetValue(pos_meta_guid, out var anchorInfo))
|
||||
{
|
||||
err_msg = $"anchorInfo not exist pos_meta_guid : {pos_meta_guid}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceNotExistAnchors, err_msg);
|
||||
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, null, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
anchor_info = anchorInfo;
|
||||
|
||||
}
|
||||
var cloned_anchor_pos = anchor_info.AnchorPos.Clone();
|
||||
cloned_anchor_pos.Z += 100;
|
||||
|
||||
send_S2C_ACK_BATTLE_PLAYER_RESPAWN(player, cloned_anchor_pos, result);
|
||||
BattleRoomNotifyHelper.send_GS2C_NTF_PLAYER_RESPAWN(ffa, cloned_anchor_pos, player);
|
||||
|
||||
//로그 남긴다.
|
||||
var invokers = new List<ILogInvoker>();
|
||||
var log_action = new LogAction(LogActionType.BattleUserRespawn.ToString());
|
||||
|
||||
var round = attribute.m_combat_pod_mode.m_current_round;
|
||||
var round_state = attribute.m_combat_pod_mode.m_round_state_type;
|
||||
var users = ffa.getInstanceRoom().tryGetInstanceExistUserForLog();
|
||||
BattleRespawnBusinessLog business_log = new(room_id, round, round_state, player.getUserGuid(), player.getUserNickname(), anchor_info.AnchorGuid, next_respawn_time);
|
||||
invokers.Add(business_log);
|
||||
BusinessLogger.collectLogs(log_action, player, invokers);
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool send_S2C_ACK_BATTLE_PLAYER_RESPAWN(Player player, Pos? pos, Result result)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckBattlePlayerRespawn = new ClientToGameRes.Types.GS2C_ACK_BATTLE_PLAYER_RESPAWN();
|
||||
|
||||
if (result.isSuccess() && pos is not null)
|
||||
{
|
||||
ack_packet.Response.AckBattlePlayerRespawn.Pos = pos;
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,262 @@
|
||||
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_JOIN_BATTLE_INSTANCE), typeof(JoinBattleInstancePacketHandler), typeof(GameLoginListener))]
|
||||
public class JoinBattleInstancePacketHandler : PacketRecvHandler
|
||||
{
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
||||
{
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ReqJoinBattleInstance;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
|
||||
|
||||
var result = parameterValidationCheck(player, request);
|
||||
if (result.isFail())
|
||||
{
|
||||
send_S2C_ACK_JOIN_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
Int32 event_id = request.EventId;
|
||||
var packet_create_time = request.PacketCreateTime;
|
||||
if (packet_create_time is not null)
|
||||
{
|
||||
Log.getLogger().info($"Join Battle Instance packet received event_id : {event_id}, packetCreateTime : {packet_create_time}, player : {player.toBasicString()}");
|
||||
}
|
||||
|
||||
//Battle Instance는 결과적으로 eventId의해 처리될 확률이 높다. 이거 코드 수정 필요
|
||||
if (event_id == 0)
|
||||
{
|
||||
var server_config = ServerConfigHelper.getServerConfig();
|
||||
NullReferenceCheckHelper.throwIfNull(server_config, () => $"server_config is null !!!");
|
||||
|
||||
// ServiceType.Dev 타입일 경우 무조건 치트 사용이 가능 하다. !!!
|
||||
if (server_config.ServiceType.Equals(ServiceType.Dev.ToString()))
|
||||
{
|
||||
return await processPacketByLandId(player, request);
|
||||
}
|
||||
else
|
||||
{
|
||||
err_msg = $"event_id must have over zero !!! : event_id:{event_id} - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_JOIN_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return await processPacketByEventId(player, event_id);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<Result> processJoinBattleInstance(Player player, Int32 eventId, Int32 instanceId, Timestamp eventStartTS)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
Log.getLogger().info($"player : {player.getUserGuid()} join battle instance eventId : {eventId}, intanceId : {instanceId}, evenstStartTS : {eventStartTS}");
|
||||
|
||||
if (!MetaData.Instance._IndunTable.TryGetValue(instanceId, out var indun_meta_data))
|
||||
{
|
||||
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceId} - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_JOIN_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
//3. indun content type이 battleRoom이 아니면 리턴
|
||||
var server_connect_info = new ServerConnectInfo();
|
||||
var business_logs = new List<ILogInvoker>();
|
||||
if (indun_meta_data.ContentsType != ContentsType.BattleRoom)
|
||||
{
|
||||
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceId} - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.BattleRoomContentsTypeOnly, err_msg);
|
||||
send_S2C_ACK_JOIN_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
var game_zone_move_action = player.getEntityAction<GameZoneMoveAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(game_zone_move_action, () => $"game_zone_move_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var fn_transaction_runner = async delegate ()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
(result, server_connect_info, business_logs) = await game_zone_move_action.tryJoinBattleInstance(player.getUserGuid(), eventId, eventStartTS, indun_meta_data);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to tryJoinInstance() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_JOIN_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
var batch = new QueryBatch<QueryRunnerWithDocument>(player, LogActionType.JoinInstance.ToString(), server_logic.getDynamoDbClient(), true);
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
batch.addQuery(new QueryFinal());
|
||||
}
|
||||
|
||||
//if(address_business_log != null) batch.appendBusinessLog(address_business_log);
|
||||
if(business_logs.Count > 0) batch.appendBusinessLogs(business_logs);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
|
||||
|
||||
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to sendQueryAndBusinessLog() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_JOIN_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
//이거 쓸지 안쓸지 모르겠군...일단 주석 처리
|
||||
//await QuestManager.It.QuestCheckWithoutTransaction(player, new QuestInstance(EQuestEventTargetType.INSTANCE, EQuestEventNameType.ENTERED, request.LandId, request.Floor));
|
||||
//QuestNotifyHelper.send_GS2C_NTF_QUEST_REWARD(player, common_result);
|
||||
//var common_result = found_transaction_runner.getCommonResult();
|
||||
//var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents);
|
||||
//NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}");
|
||||
|
||||
send_S2C_ACK_JOIN_BATTLE_INSTANCE(player, result, server_connect_info);
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "JoinBattleInstance", fn_transaction_runner);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<Result> processPacketByEventId(Player player, Int32 eventId)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
if (false == BattleInstanceManager.It.getSystemBattleEvent(eventId, out var systemBattleEvent))
|
||||
{
|
||||
err_msg = $"not exist system battle evetn : eventId:{eventId} - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceNotExistEventInfo, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_JOIN_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
//이벤트 인스턴스 시작시간, 종료 시간 계산해서 들어가게
|
||||
var now = DateTimeHelper.Current;
|
||||
var joinable_time = BattleRoomHelper.calculateRoomJoinableTime(systemBattleEvent.m_start_time, systemBattleEvent.m_ffa_config_data_id, systemBattleEvent.m_round_count);
|
||||
if (joinable_time < now)
|
||||
{
|
||||
err_msg = $"already joinable_time passed : eventId:{eventId} joinable_time : {joinable_time} - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceClosingTime, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_JOIN_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
var instance_meta_id = systemBattleEvent.m_instance_id;
|
||||
return await processJoinBattleInstance(player, eventId, instance_meta_id, Timestamp.FromDateTime(systemBattleEvent.m_start_time));
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
private async Task<Result> processPacketByLandId(Player player, ClientToGameReq.Types.C2GS_REQ_JOIN_BATTLE_INSTANCE request)
|
||||
{
|
||||
Int32 land_id = request.LandId;
|
||||
Int32 floor_id = request.Floor;
|
||||
Int32 building_id = request.BuildingId;
|
||||
|
||||
var result = new Result();
|
||||
string err_msg = string.Empty;
|
||||
|
||||
var game_zone_move_action = player.getEntityAction<GameZoneMoveAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(game_zone_move_action, () => $"game_zone_move_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
//RoomMapTree 정로를 이용해서 Instance 정보 호출
|
||||
(result, var room_map_tree, var address_business_log) = MapHelper.tryGetRoomMapTree(land_id, floor_id, building_id);
|
||||
if (result.isFail() || null == room_map_tree)
|
||||
{
|
||||
err_msg = $"Failed to tryGetRoomMapTree() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_JOIN_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
//instance meta id를 이용해 IndunMetadata 정보 호출
|
||||
var instance_meta_id = room_map_tree.InstanceMetaId;
|
||||
return await processJoinBattleInstance(player, 0, instance_meta_id, Timestamp.FromDateTime(DateTimeHelper.MinTime.Date));
|
||||
|
||||
}
|
||||
|
||||
private Result parameterValidationCheck(Player player, ClientToGameReq.Types.C2GS_REQ_JOIN_BATTLE_INSTANCE request)
|
||||
{
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var server_config = server_logic.getServerConfig();
|
||||
bool is_battle_system_active = server_config.BattleSystemEnable;
|
||||
|
||||
string err_msg = string.Empty;
|
||||
var result = new Result();
|
||||
|
||||
if (false == is_battle_system_active)
|
||||
{
|
||||
err_msg = $"is_battle_system_active is false!!!";
|
||||
result.setFail(ServerErrorCode.BattleInstanceInActive, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static bool send_S2C_ACK_JOIN_BATTLE_INSTANCE(Player owner, Result result, ServerConnectInfo? serverConnectInfo)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckJoinBattleInstance = new();
|
||||
|
||||
if (result.isSuccess() && serverConnectInfo != null)
|
||||
{
|
||||
ack_packet.Response.AckJoinBattleInstance.InstanceServerConnectInfo = serverConnectInfo;
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,282 @@
|
||||
using GameServer.Contents.GameMode.Mode_Battle.Manage;
|
||||
using MetaAssets;
|
||||
using Newtonsoft.Json;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_LEAVE_BATTLE_INSTANCE), typeof(LeaveBattleInstancePacketHandler), typeof(GameLoginListener))]
|
||||
public class LeaveBattleInstancePacketHandler : PacketRecvHandler
|
||||
{
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var server_config = server_logic.getServerConfig();
|
||||
bool is_battle_system_active = server_config.BattleSystemEnable;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"entity_player is null !!!");
|
||||
|
||||
//앞단에 넣으면 좋겠지만... 일단 여기에..
|
||||
if (false == is_battle_system_active)
|
||||
{
|
||||
err_msg = $"is_battle_system_active is false!!!";
|
||||
result.setFail(ServerErrorCode.BattleInstanceInActive, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ReqLeaveBattleInstance;
|
||||
if (null == request)
|
||||
{
|
||||
err_msg = $"failed to get request message : Invalid Request message - {req_msg.Request.MsgCase}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
var packet_create_time = request.PacketCreateTime;
|
||||
if (packet_create_time is not null)
|
||||
{
|
||||
Log.getLogger().info($"Leave Battle Instance packet received, packetCreateTime : {packet_create_time}, player : {player.toBasicString()}");
|
||||
}
|
||||
|
||||
|
||||
var attribute = player.getEntityAttribute<LocationAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"LocationAttribute is null !!! - player:{player.toBasicString()}");
|
||||
|
||||
if (false == MetaData.Instance._IndunTable.TryGetValue(attribute.CurrentIndunLocation.InstanceMetaId, out var prev_indun_data) || null == prev_indun_data)
|
||||
{
|
||||
err_msg = $"failed to get indun data !!! - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.NotFoundIndunData, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
List<ILogInvoker> invokers = new();
|
||||
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);
|
||||
invokers.Add(departure_position_business_log);
|
||||
|
||||
|
||||
// 1. 이동할 서버 조회
|
||||
var channel_server_name = attribute.LastestChannelServerLocation.ServerName;
|
||||
var world_meta_id = attribute.LastestChannelServerLocation.WorldMetaId;
|
||||
|
||||
var move_server_info = await server_logic.getReturnToServerInfo(channel_server_name, ServerType.Channel, player, (ushort)world_meta_id);
|
||||
if (null == move_server_info)
|
||||
{
|
||||
err_msg = $"Failed to get balanced GameServer !!! - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.NoServerConnectable, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
// 2. 이동 예약 요청
|
||||
var message = new ServerMessage.Types.GS2GS_REQ_RESERVATION_ENTER_TO_SERVER();
|
||||
message.MoveType = ServerMoveType.Force;
|
||||
message.RequestUserGuid = player.getUserGuid();
|
||||
message.RequestServerName = GameServerApp.getServerLogic().getServerName();
|
||||
|
||||
var reserved = await server_logic.getReservationManager().registerReservationEnterToServer(message, move_server_info.Name);
|
||||
|
||||
// 예약 실패 체크
|
||||
if (null == reserved)
|
||||
{
|
||||
err_msg = $"Failed to reservation enter to game server!!! - {nameof(LeaveInstancePacketHandler)}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.FailedToReservationEnter, err_msg);
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
// 4. instance room 떠나기
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "LeaveBattleInstance", leaveBattleInstanceDelegate);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunner() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
// if (prev_is_in_concert && prev_indun_data is not null)
|
||||
// {
|
||||
// await QuestManager.It.QuestCheck(entity_player, new QuestConcert(EQuestEventTargetType.CONCERT, EQuestEventNameType.ENDED, prev_indun_data.MapId));
|
||||
// }
|
||||
|
||||
|
||||
return result;
|
||||
|
||||
async Task<Result> leaveBattleInstanceDelegate() => await leaveBattleInstanceAsync(player, move_server_info, prev_indun_data, invokers);
|
||||
}
|
||||
|
||||
|
||||
public async Task<Result> leaveBattleInstanceAsync(Player player, ServerInfo server_info, InstanceMetaData prevIndunData, List<ILogInvoker> invokers)
|
||||
{
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var battle_zone_move_action = player.getEntityAction<GameZoneMoveAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(battle_zone_move_action, () => $"game_zone_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
// 1. leave battle room
|
||||
(result, _) = await battle_zone_move_action.tryLeaveBattleInstanceRoom();
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to tryLeaveInstance() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
var location_action = player.getEntityAction<LocationAction>();
|
||||
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)
|
||||
{
|
||||
err_msg = $"tryLeaveBattelInstance instance_room_Id is Empty player : {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
//var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(instance_room_Id);
|
||||
|
||||
if (false == GameModeManager.It.tryGetGameMode(instance_room_Id, out var gameMode))
|
||||
{
|
||||
err_msg = $"battle_instance_room not esist instance_room_Id : {instance_room_Id}, player : {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
var ffa = gameMode as GameModeTPSFreeForAll<GameModeTPSFreeForAllData>;
|
||||
NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!! - {player.toBasicString()}");
|
||||
|
||||
var battle_instance_room_attribute = ffa.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(battle_instance_room_attribute, () => $"battle_instance_room_attribute is null !!! - {player.toBasicString()}");
|
||||
|
||||
// 2. move to channel
|
||||
result = await location_action.tryMoveToChannel();
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Fail to tryMoveToIndun";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
var buff_action = player.getEntityAction<BuffAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(buff_action, () => $"buff_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
result = await buff_action.MoveServer(EPlaceType.World);
|
||||
if (result.isFail())
|
||||
{
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
// 3. otp 생성
|
||||
(result, var reserved_to_switch_server) = await ServerConnectionSwitchHelper.startServerSwitch(player, server_logic.getRedisConnector(), server_info.Name);
|
||||
if (result.isFail() || null == reserved_to_switch_server)
|
||||
{
|
||||
err_msg = $"Fail to startServerSwitch() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
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, () => $"LoginCache is null !!! - player:{player.toBasicString()}");
|
||||
|
||||
login_cache.ReservedToSwitchServer = reserved_to_switch_server;
|
||||
|
||||
var gameServer_connection_info = new ServerConnectInfo
|
||||
{
|
||||
ServerAddr = server_info.Address,
|
||||
ServerPort = server_info.Port,
|
||||
Otp = reserved_to_switch_server.OneTimeKey,
|
||||
};
|
||||
|
||||
var location_attribute = player.getEntityAttribute<LocationAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(location_attribute, () => $"location attribute is null !!! - {player.toBasicString()}");
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.LeaveInstance, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
batch.addQuery(new QueryFinal());
|
||||
}
|
||||
|
||||
var server_name = ServerType.Indun.toServerName(gameServer_connection_info.ServerAddr, (ushort)gameServer_connection_info.ServerPort);
|
||||
|
||||
var arrival_position_log_info = PositionBusinessLogHelper.toPositionLogInfo(PositionMoveType.Arrival, server_name, ""
|
||||
, MapFileType.World, 0, new());
|
||||
var arrival_position_business_log = new PositionBusinessLog(arrival_position_log_info);
|
||||
invokers.Add(arrival_position_business_log);
|
||||
|
||||
//로그 추가
|
||||
batch.appendBusinessLogs(invokers);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, null);
|
||||
return result;
|
||||
}
|
||||
|
||||
send_S2C_ACK_LEAVE_BATTLE_INSTANCE(player, result, gameServer_connection_info);
|
||||
|
||||
Log.getLogger().debug($"LeaveBattleInstance gameServer_connection_info : {JsonConvert.SerializeObject(gameServer_connection_info)}, player : {player.toBasicString()}");
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool send_S2C_ACK_LEAVE_BATTLE_INSTANCE(Player owner, Result result, ServerConnectInfo? server_info)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckLeaveBattleInstance = new ClientToGameRes.Types.GS2C_ACK_LEAVE_BATTLE_INSTANCE();
|
||||
|
||||
if (result.isSuccess() && null != server_info)
|
||||
{
|
||||
ack_packet.Response.AckLeaveBattleInstance.GameServerAddr = server_info.ServerAddr;
|
||||
ack_packet.Response.AckLeaveBattleInstance.GameServerPort = server_info.ServerPort;
|
||||
ack_packet.Response.AckLeaveBattleInstance.Otp = server_info.Otp;
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
using GameServer.Contents.GameMode.Mode_Battle.Manage;
|
||||
using Nettention.Proud;
|
||||
using ServerBase;
|
||||
using ServerCore;
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_PREPARATION_FOR_LEAVING_BATTLE_INSTANCE), typeof(PreparationForLeavingBattleInstancePacketHandler), typeof(GameLoginListener))]
|
||||
public class PreparationForLeavingBattleInstancePacketHandler : PacketRecvHandler
|
||||
{
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var server_config = server_logic.getServerConfig();
|
||||
bool is_battle_system_active = server_config.BattleSystemEnable;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"entity_player is null !!!");
|
||||
|
||||
//앞단에 넣으면 좋겠지만... 일단 여기에..
|
||||
if (false == is_battle_system_active)
|
||||
{
|
||||
err_msg = $"is_battle_system_active is false!!!";
|
||||
result.setFail(ServerErrorCode.BattleInstanceInActive, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_PREPARE_FOR_LEAVING_BATTLE_INSTANCE(player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
var request = req_msg.Request.ReqPreparationForLeavingInstance;
|
||||
if (null == request)
|
||||
{
|
||||
err_msg = $"failed to get request message : Invalid Request message - {req_msg.Request.MsgCase}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
|
||||
send_S2C_ACK_PREPARE_FOR_LEAVING_BATTLE_INSTANCE(player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var packet_create_time = request.PacketCreateTime;
|
||||
if (packet_create_time is not null)
|
||||
{
|
||||
Log.getLogger().info($"Preparation For leaving Battle Instance Packet Received, packetCreateTime : {packet_create_time}, player : {player.toBasicString()}");
|
||||
}
|
||||
|
||||
|
||||
var room_id = player.getCurrentInstanceRoomId();
|
||||
//var battle_instance_room = BattleInstanceManager.It.getBattleInstanceRoom(room_id);
|
||||
if (false == GameModeManager.It.tryGetGameMode(room_id, out var gameMode))
|
||||
{
|
||||
err_msg = $"battle_instance_room is null : room_id - {room_id}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.BattleInstanceInfoNotExist, err_msg);
|
||||
send_S2C_ACK_PREPARE_FOR_LEAVING_BATTLE_INSTANCE(player, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
var user_guid = player.getUserGuid();
|
||||
var ffa = gameMode as GameModeTPSFreeForAll<GameModeTPSFreeForAllData>;
|
||||
NullReferenceCheckHelper.throwIfNull(ffa, () => $"ffa is null !!!");
|
||||
var fn_preparation_for_leaving = async delegate()
|
||||
{
|
||||
bool need_pod_combat_drop_noti = false;
|
||||
using (var releaser = await ffa.getAsyncLock())
|
||||
{
|
||||
|
||||
var attribute = ffa.getEntityAttribute<BattleInstanceSnapshotAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!");
|
||||
var current_owner_guid = attribute.m_combat_pod_mode.m_pod_combat.m_current_occupier_guid;
|
||||
need_pod_combat_drop_noti = user_guid.Equals(current_owner_guid);
|
||||
|
||||
if (need_pod_combat_drop_noti)
|
||||
{
|
||||
attribute.m_combat_pod_mode.m_pod_combat.changeDropState(player.getCurrentPositionInfo().Pos);
|
||||
attribute.modifiedEntityAttribute();
|
||||
}
|
||||
}
|
||||
|
||||
send_S2C_ACK_PREPARE_FOR_LEAVING_BATTLE_INSTANCE(player, result);
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_PREPARATION_FOR_LEAVING_BATTLE_INSTANCE(ffa, user_guid);
|
||||
if (need_pod_combat_drop_noti)
|
||||
{
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_POD_COMBAT_STATE(ffa);
|
||||
}
|
||||
|
||||
var host_guid = ffa.m_host_migrator.getHostUserGuid();
|
||||
|
||||
if (user_guid.Equals(host_guid))
|
||||
{
|
||||
var hosts = new List<HostID>();
|
||||
hosts.Add(player.getHostId());
|
||||
var p2p_group_id = ffa.getInstanceRoom().getMap().getP2PGroupId();
|
||||
var define_result = ffa.m_host_migrator.defineHost(p2p_group_id, new SuperPeerSelectionPolicy(), hosts.ToArray());
|
||||
if (define_result.isFail())
|
||||
{
|
||||
Log.getLogger().warn(define_result.toBasicString());
|
||||
//이걸 define_result로 넘겨야 되나 말아야 되나....리팩토링 후에 고민좀 해보자... 만약 두명이 동시에 나간다고 하면??
|
||||
return result;
|
||||
}
|
||||
|
||||
var new_host_user_guid = ffa.m_host_migrator.getHostUserGuid();
|
||||
BattleRoomNotifyHelper.broadcast_GS2C_NTF_P2P_HOST_UPDATE(ffa.getInstanceRoom(), new_host_user_guid);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "PreparationForLeavingBattleInstance", fn_preparation_for_leaving);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunner() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
send_S2C_ACK_PREPARE_FOR_LEAVING_BATTLE_INSTANCE(player, result);
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool send_S2C_ACK_PREPARE_FOR_LEAVING_BATTLE_INSTANCE(Player player, Result result)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckPreparationForLeavingInstance = new ClientToGameRes.Types.GS2C_ACK_PREPARATION_FOR_LEAVING_BATTLE_INSTANCE();
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user