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 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(); 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(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; 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 battleInstanceRoom, CommonResult commonResult) { //pod combat이 활성화 되서 stand는 전부 비활성화 if (handler.m_need_noti_objects.Count > 0) { System.Collections.Generic.List 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 interactObject(BattleObjectInteractionLogicHandler handler, GameModeBase battleInstanceRoom, string anchorGuid, Player player) { var attribute = battleInstanceRoom.getEntityAttribute(); 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 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(); NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!!"); var interact_action = battleInstanceRoom.getEntityAction(); 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 interactPodCombat(BattleObjectInteractionLogicHandler handler, GameModeBase battleInstanceRoom, string anchorGuid, Player player) { await Task.CompletedTask; var interact_action = battleInstanceRoom.getEntityAction(); 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; } }