Files
caliverse_server/GameServer/Contents/Quest/PacketHandler/QuestAcceptPacketHandler.cs
2025-05-01 07:20:41 +09:00

145 lines
6.4 KiB
C#

using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.QuestAcceptReq), typeof(QuestAcceptPacketHandler), typeof(GameLoginListener))]
public class QuestAcceptPacketHandler : PacketRecvHandler
{
public override async Task<Result> onProcessPacket(ISession session, IMessage recvMessage)
{
var owner = session as Player;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var recv_msg = recvMessage as ClientToGame;
NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!!");
var request = recv_msg.Request.QuestAcceptReq;
(var quest_id, var quest_revision) = QuestHelper.convertUgqQuestIdToQuestIdAndRevision(request.ComposedQuestId);
var accept_quest_action = owner.getEntityAction<QuestAcceptAction>();
var quest_mail_action = owner.getEntityAction<QuestMailAction>();
AcceptQuestVariable accept_quest_var = new();
var result = await accept_quest_action.acceptQuestConditionCheck(quest_id, accept_quest_var);
if(result.isFail())
{
send_GS2C_ACK_QUEST_ACCEPT(owner, result, 0, 0);
return result;
}
result = await owner.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "AcceptQuest", delegateAcceptQuest);
if (result.isFail())
{
send_GS2C_ACK_QUEST_ACCEPT(owner, result, 0, 0);
return result;
}
NullReferenceCheckHelper.throwIfNull(accept_quest_var.m_new_quest_nullable, () => $"accept_quest_var.m_new_quest_nullable is null !!!");
var new_quest_attribute = accept_quest_var.m_new_quest_nullable.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(new_quest_attribute);
var taskNum = new_quest_attribute.CurrentTaskNum;
var quest_meta_infos = QuestNotifyHelper.makeQuestMetaInfoData(new List<UInt32>() { quest_id });
send_GS2C_ACK_QUEST_ACCEPT(owner, result, quest_id, quest_revision, taskNum, quest_meta_infos);
//Send 해주고 체크해야 될것듯
if (true == accept_quest_var.m_is_mail_quest)
{
quest_mail_action.GS2C_NTF_DELETE_QUEST_MAIL_NOTI(quest_id);
}
await QuestNotifyHelper.send_GS2C_NTF_QUEST_UPDATE(owner, quest_id, quest_revision, new(), false);
await QuestManager.It.QuestCheck(owner, new QuestActiveQuest(EQuestEventTargetType.QUEST, EQuestEventNameType.ACTIVED, quest_id));
await quest_mail_action.normalMailActiveCheck();
return result;
async Task<Result> delegateAcceptQuest() => await acceptQuest(owner, quest_id, quest_revision, accept_quest_var);
}
private async Task<Result> acceptQuest(Player owner, UInt32 questId, UInt32 questRevision, AcceptQuestVariable acceptQuestVar)
{
var accept_quest_action = owner.getEntityAction<QuestAcceptAction>();
var quest_action = owner.getEntityAction<QuestAction>();
var quest_mail_action = owner.getEntityAction<QuestMailAction>();
accept_quest_action.makeNewQuestAssignInfo(ref acceptQuestVar);
if (acceptQuestVar.m_is_mail_quest)
{
NullReferenceCheckHelper.throwIfNull(acceptQuestVar.m_quest_base_info_nullable, () => $"acceptQuestVar.m_quest_base_info_nullable is null !!!");
var quest_type = EnumHelper.convertEnumValueStringToEnum(acceptQuestVar.m_quest_base_info_nullable.QuestType, MetaAssets.EQuestType.NORMAL);
(var mail_result, var quest_mail) = quest_mail_action.getQuestMail(quest_type, questId);
if (mail_result.isFail()) return mail_result;
var quest_mail_attribute = quest_mail.getEntityAttribute<QuestMailAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_mail_attribute, () => $"quest_mail_attribute is null !!!");
quest_mail_attribute.deleteEntityAttribute();
}
var server_logic = GameServerApp.getServerLogic();
var batch = new QueryBatchEx<QueryRunnerWithDocument>(owner, LogActionType.QuestMainAssign, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
var log_invoker = new QuestAcceptBusinessLog(questId, questRevision, acceptQuestVar.m_quest_type);
batch.appendBusinessLog(log_invoker);
var result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail()) return result;
NullReferenceCheckHelper.throwIfNull(acceptQuestVar.m_new_quest_nullable, () => $"acceptQuestVar.m_new_quest_nullable is null !!!");
quest_action.addNewQuest(questId, acceptQuestVar.m_new_quest_nullable);
if (true == acceptQuestVar.m_is_mail_quest)
{
await quest_mail_action.deleteQuestMail(questId, questRevision);
}
return result;
}
private static bool send_GS2C_ACK_QUEST_ACCEPT(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.QuestAcceptRes = new();
ack_packet.Response.QuestAcceptRes.ComposedQuestId = QuestHelper.convertQuestIdAndRevisionToUgqQuestId(questId, questRevision);
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false;
return true;
}
private static bool send_GS2C_ACK_QUEST_ACCEPT(Player owner, Result result, UInt32 questId, UInt32 questRevision, Int32 taskNum, List<QuestMetaInfo> questMetaInfos)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.QuestAcceptRes = new();
ack_packet.Response.QuestAcceptRes.ComposedQuestId = QuestHelper.convertQuestIdAndRevisionToUgqQuestId(questId, questRevision);
ack_packet.Response.QuestAcceptRes.TaskNum = taskNum;
ack_packet.Response.QuestAcceptRes.QuestMetaInfos.AddRange(questMetaInfos);
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false;
return true;
}
}