using Amazon.DynamoDBv2.DocumentModel; using Google.Protobuf; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.QuestAbandonReq), typeof(QuestAbandonPacketHandler), typeof(GameLoginListener))] public class QuestAbandonPacketHandler : PacketRecvHandler { public override async Task onProcessPacket(ISession session, IMessage recvMessage) { var owner = session as Player; ArgumentNullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var recv_msg = recvMessage as ClientToGame; ArgumentNullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!!"); var request = recv_msg.Request.QuestAbandonReq; (var quest_id, var quest_revision) = QuestHelper.convertUgqQuestIdToQuestIdAndRevision(request.ComposedQuestId); var quest_abandon_action = owner.getEntityAction(); ArgumentNullException.ThrowIfNull(quest_abandon_action); var result = await quest_abandon_action.abandonQuestConditionCheck(quest_id); if (result.isFail()) { send_GS2C_ACK_QUEST_ABANDON(owner, result, quest_id, quest_revision); return result; } result = await questAbandon(owner, quest_id, quest_revision); if (result.isFail()) { string err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {owner.toBasicString()}"; Log.getLogger().error(err_msg); send_GS2C_ACK_QUEST_ABANDON(owner, result, quest_id, quest_revision); return result; } //성공 후 처리 send_GS2C_ACK_QUEST_ABANDON(owner, result, quest_id, quest_revision); await postActionAfterSend(owner, quest_id, quest_revision); return result; } private async Task questAbandon(Player owner, UInt32 questId, UInt32 questRevision) { var server_logic = GameServerApp.getServerLogic(); ArgumentNullException.ThrowIfNull(server_logic); var batch = new QueryBatchEx(owner, LogActionType.QuestMainAbort, server_logic.getDynamoDbClient()); { batch.addQuery(new DBQAbandonQuest(owner.getUserGuid(), questId, questRevision)); } batch.appendBusinessLog(new QuestAbandonBusinessLog(questId, questRevision)); var result = await QueryHelper.sendQueryAndBusinessLog(batch); ArgumentNullException.ThrowIfNull(result); return result; } private async Task postActionAfterSend(Player owner, UInt32 questId, UInt32 questRevision) { var result = new Result(); //퀘스트 삭제 처리 된 후 재할당 처리 해야함 var quest_action = owner.getEntityAction(); (result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(questId); if (result.isFail()) return result; var quest_base_info = quest_meta_all_base_info.m_quest_base_info; ArgumentNullReferenceCheckHelper.throwIfNull(quest_base_info, () => $"quest_base_info is null !!!"); //에픽이 아니면 재할당 처리 필요 없다. if (false == quest_base_info.QuestType.Equals(nameof(MetaAssets.EQuestType.EPIC))) return result; result = await reAssignQuestByAbandon(owner, quest_base_info); return result; } private async Task reAssignQuestByAbandon(Player owner, QuestBaseInfo questMetaInfo) { QuestMailInfo mailInfo = new(); Document doc = new(); var result = new Result(); var quest_action = owner.getEntityAction(); var quest_accept_action = owner.getEntityAction(); var server_logic = GameServerApp.getServerLogic(); var quest_id = questMetaInfo.QuestId; ArgumentNullException.ThrowIfNull(quest_action); ArgumentNullException.ThrowIfNull(quest_accept_action); ArgumentNullException.ThrowIfNull(server_logic); if (true == questMetaInfo.ForceAccept) { result = await quest_accept_action.reAssignQuest(quest_id, questMetaInfo.QuestRevision); if (result.isFail()) { string err_msg = $"Failed to reAssignQuest() !!! : {result.toBasicString()} - {owner.toBasicString()}"; Log.getLogger().error(err_msg); return result; } } else { var quest_mail_action = owner.getEntityAction(); ArgumentNullException.ThrowIfNull(quest_mail_action); await quest_mail_action.sendQuestMailsWithTransaction(new List() { quest_id }); } return result; } private static bool send_GS2C_ACK_QUEST_ABANDON(Player owner, Result result, UInt32 questId, UInt32 questRevision) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.QuestAbandonRes = new(); ack_packet.Response.QuestAbandonRes.ComposedQuestId = QuestHelper.convertQuestIdAndRevisionToUgqQuestId(questId, questRevision); if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false; return true; } }