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 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(); 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(); 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(end_quest_doc); var end_quest_attrib = end_quest_doc.getAttrib(); 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(); 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 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); } }