Files
caliverse_server/GameServer/Contents/Reward/RewardQuest.cs
2025-05-01 07:20:41 +09:00

91 lines
4.2 KiB
C#

using Amazon.DynamoDBv2.DocumentModel;
using GameServer;
using Newtonsoft.Json;
using ServerCommon;
using ServerCore; using ServerBase;
namespace GameServer;
public class RewardQuest : RewardBase
{
QuestRewardHandler m_quest_reward_handler;
public RewardQuest(Player player, string userGuid, QuestRewardHandler questRewardRef) : base(player, userGuid)
{
m_quest_reward_handler = questRewardRef;
setRewardMetas(questRewardRef.m_rewards);
//m_res = res;
//m_quest_log_invoker = new QuestRewardBusinessLog(LogActionType.QuestMainReward, )
}
//=====================================================================================
// 보상전 처리해야되는 것들 처리, 여기선 퀘스트 삭제 처리하고, EndQuest 추가 처리
//=====================================================================================
public override Task<Result> prepareReward()
{
var result = new Result();
//기존 퀘스트 삭제 처리
var quest = m_quest_reward_handler.m_quest;
if (quest == null)
{
//정상 로직대로라면 퀘스트가 null일수가 없는데 일단 예외처리
var err_msg = $"questRewardRef quest is null. questRewardRef = {JsonConvert.SerializeObject(m_quest_reward_handler)}";
result.setFail(ServerErrorCode.QuestInvalidValue, err_msg);
Log.getLogger().error(result.toBasicString());
return Task.FromResult(result);
}
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!!");
quest_attribute.deleteEntityAttribute();
//완료 퀘스트 생성
m_quest_reward_handler.m_end_quest = new EndQuest(getOwner(), getUserGuid(), m_quest_reward_handler.m_quest_id, m_quest_reward_handler.m_quest_revision);
var end_quest_attribute = m_quest_reward_handler.m_end_quest.getEntityAttribute<EndQuestAttribute>();
NullReferenceCheckHelper.throwIfNull(end_quest_attribute, () => $"end_quest_attribute is null !!!");
var end_quest_doc = new EndQuestDoc(getOwner().getUserGuid(), m_quest_reward_handler.m_quest_id, m_quest_reward_handler.m_quest_revision);
end_quest_attribute.syncOriginDocBaseWithNewDoc<EndQuestAttribute>(end_quest_doc);
var end_quest_attrib = end_quest_doc.getAttrib<EndQuestAttrib>();
NullReferenceCheckHelper.throwIfNull(end_quest_attrib, () => $"end_quest_attrib is null !!!");
end_quest_attrib.m_last_end_time = DateTimeHelper.Current;
end_quest_attrib.m_end_count = 1;
end_quest_attrib.m_quest_id = m_quest_reward_handler.m_quest_id;
end_quest_attribute.modifiedEntityAttribute(true);
if (m_quest_reward_handler.m_has_ugq_daily_reward)
{
var daily_reward_attribute = getOwner().getEntityAttribute<UgqDailyRewardCountAttribute>();
NullReferenceCheckHelper.throwIfNull(daily_reward_attribute, () => $"daily_reward_attribute is null !!!");
NullReferenceCheckHelper.throwIfNull(m_quest_reward_handler.m_ugq_game_data, () => $"m_quest_reward_handler.m_ugq_game_data is null !!!");
if (true == daily_reward_attribute.m_ugq_daily_reward_count.TryGetValue(m_quest_reward_handler.m_ugq_game_data.GradeType, out var cnt))
{
cnt++;
daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(m_quest_reward_handler.m_ugq_game_data.GradeType, cnt, (key, old) => cnt);
daily_reward_attribute.modifiedEntityAttribute(true);
}
}
return Task.FromResult(result);
}
//=====================================================================================
// 보상처리 후 필요한 로직들 처리
//=====================================================================================
public override Task<Result> finalizeReward()
{
var result = new Result();
m_quest_reward_handler.m_rewarded_money.AddRange(getRewardedMoneys());
m_quest_reward_handler.m_rewarded_items.AddRange(getRewardedItems());
return Task.FromResult(result);
}
}