using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using Google.Protobuf; using Guid = System.Guid; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.QuestRewardReq), typeof(QuestRewardPacketHandler), typeof(GameLoginListener))] public class QuestRewardPacketHandler : PacketRecvHandler { public override async Task onProcessPacket(ISession session, IMessage recvMessage) { var player = session as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var ugq_reward_action = player.getEntityAction(); await ugq_reward_action.uggDailyRewardRefresh(); var recv_msg = recvMessage as ClientToGame; NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!!"); var request = recv_msg.Request.QuestRewardReq; (var quest_id, var quest_revision) = QuestHelper.convertUgqQuestIdToQuestIdAndRevision(request.ComposedQuestId); var end_quest_action = player.getEntityAction(); var quest_reward_action = player.getEntityAction(); var account_attribute = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!!"); QuestRewardHandler quest_reward_handler = new QuestRewardHandler(player, quest_id, quest_revision); await quest_reward_handler.init(); var result = quest_reward_action.questRewardConditionCheck(ref quest_reward_handler); if(result.isFail()) { send_GS2C_ACK_QUEST_REWARD(player, result); return result; } IReward reward_proc = new RewardQuest(player, player.getUserGuid(), quest_reward_handler); //UGQ 반복 진행 시에는 이용자의 이용료 지불과 지급 보상 없음 CommonResult common_result = new(); var fn_quest_reward = async delegate () { var result = await RewardManager.It.proceedRewardProcess(reward_proc); if (result.isFail()) return result; var server_logic = GameServerApp.getServerLogic(); var batch = new QueryBatchEx(player, LogActionType.QuestMainReward, server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } batch.appendBusinessLog(new QuestRewardBusinessLog(quest_id, quest_revision, quest_reward_handler.m_replaced_reward_group_id)); result = await QueryHelper.sendQueryAndBusinessLog(batch); 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(); if (result.isFail()) return result; return result; }; //퀘스트는 삭제처리, EndQuest에 추가처리, 아이템 추가 처리 result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "QuestReward", fn_quest_reward); if (result.isFail()) { string err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); send_GS2C_ACK_QUEST_REWARD(player, result); return result; } var quest_action = player.getEntityAction(); //메모리 업데이트 NullReferenceCheckHelper.throwIfNull(quest_reward_handler.m_quest, () => $"quest_reward_handler.m_quest is null !!!"); NullReferenceCheckHelper.throwIfNull(quest_reward_handler.m_end_quest, () => $"quest_reward_handler.m_end_quest is null !!!"); quest_action.removeQuest(quest_reward_handler.m_quest); end_quest_action.addEndQuest(quest_reward_handler.m_end_quest); //Res 패킷 전달 send_GS2C_ACK_QUEST_REWARD(player, result, quest_reward_handler, common_result); reward_proc.postRewardProcess(); await QuestManager.It.QuestCheck(player, new QuestActiveQuest(EQuestEventTargetType.QUEST, EQuestEventNameType.ENDED, quest_id)); //Log.getLogger().debug($"QuestCheck QUEST ENDED Player : {player.getAccountId()}, questId = {quest_id}"); await QuestManager.It.QuestCheck(player, new QuestReward(EQuestEventTargetType.REWARD, EQuestEventNameType.RECEIVED, quest_reward_handler.m_replaced_reward_group_id)); //Log.getLogger().debug($"QuestCheck REWARD RECEIVED Player : {player.getAccountId()}, questId = {quest_id}"); if (quest_reward_handler.m_ugq_game_data is not null) { var grade_type = quest_reward_handler.m_ugq_game_data.GradeType; var grade_string = QuestHelper.convertUgqGradeToQuestCheckGrade(grade_type); await QuestManager.It.QuestCheck(player, new QuestUgq(EQuestEventTargetType.UGQ, EQuestEventNameType.COMPLETED, grade_string)); } //퀘스트가 끝나고 다음 퀘스트 진행할게 있으면 처리 await quest_reward_action.processAfterReward(quest_reward_handler); await quest_reward_action.normalQuestCheckInitialize(); await player.send_GS2C_NTF_UGQ_DAILY_REWARD(); return result; } private static bool send_GS2C_ACK_QUEST_REWARD(Player owner, Result result) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.QuestRewardRes = new(); if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false; return true; } private static bool send_GS2C_ACK_QUEST_REWARD(Player owner, Result result, QuestRewardHandler questRewardHandler, CommonResult commonResult) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.QuestRewardRes = new(); ack_packet.Response.QuestRewardRes.ReplacedRewardGroupId = questRewardHandler.m_replaced_reward_group_id; ack_packet.Response.QuestRewardRes.ComposedQuestId = QuestHelper.convertQuestIdAndRevisionToUgqQuestId(questRewardHandler.m_quest_id, questRewardHandler.m_quest_revision); ack_packet.Response.QuestRewardRes.CommonResult = commonResult; if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false; return true; } }