using Amazon.S3.Model; using Google.Protobuf.WellKnownTypes; using Newtonsoft.Json; using ServerCommon; using ServerCore; using ServerBase; using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GameServer { public class EndQuestAction : EntityActionBase { private ConcurrentDictionary<(UInt32, UInt32/*questid, revision*/), ServerCommon.EndQuest> m_end_quests = new(); public EndQuestAction(EntityBase owner) : base(owner) { } public override async Task onInit() { await Task.CompletedTask; var result = new Result(); return result; } public override void onClear() { m_end_quests.Clear(); } public async Task loadEndQuests() { var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var server_logic = GameServerApp.getServerLogic(); var batch = new QueryBatchEx(owner, LogActionType.None , server_logic.getDynamoDbClient()); { batch.addQuery(new DBQEndQuestsReadAll(owner.getUserGuid())); } var result = await QueryHelper.sendQueryAndBusinessLog(batch); return result; } public void addEndQuest(ServerCommon.EndQuest endQuest) { if (endQuest is null) { Log.getLogger().error("endQuest is null !!!"); return; } var end_quest_attribute = endQuest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(end_quest_attribute, () => $"end_quest_attribute is null !!!"); _ = m_end_quests.TryAdd((end_quest_attribute.QuestId, end_quest_attribute.QuestRevision), endQuest); //if (false == m_end_quests.TryAdd((end_quest_attribute.QuestId, end_quest_attribute.QuestRevision), endQuest)) //{ // Log.getLogger().error($"endQuest TryAdd fail !!! quest : {JsonConvert.SerializeObject(endQuest)}"); // return; //} } public Result setEndQuestsFromDoc(EndQuestDoc doc) { var result = new Result(); var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var end_quest_attrib = doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(end_quest_attrib, () => $"end_quest_attrib is null !!!"); ServerCommon.EndQuest end_quest = new ServerCommon.EndQuest(owner, owner.getUserGuid(), end_quest_attrib.m_quest_id, end_quest_attrib.m_quest_revision); var attribute = end_quest.getEntityAttribute(); if (attribute is null) { var err_msg = $"Fail to get QuestAttribute"; result.setFail(ServerErrorCode.EntityAttributeNotFound, err_msg); return result; } if (false == doc.getAttribWrappers().TryGetValue(typeof(EndQuestAttrib), out var to_copy_doc_attrib)) { var err_msg = $"Fail to get QuestAttrib"; result.setFail(ServerErrorCode.EntityAttributeNotFound, err_msg); return result; } var attrib_base = to_copy_doc_attrib.getAttribBase(); var doc_attrib = attrib_base as EndQuestAttrib; if (doc_attrib is null) { var err_msg = $"Fail to get QuestAttrib"; result.setFail(ServerErrorCode.EntityAttributeNotFound, err_msg); return result; } attribute.QuestId = doc_attrib.m_quest_id; attribute.EndCount = doc_attrib.m_end_count; attribute.LastEndTime = doc_attrib.m_last_end_time; if (false == m_end_quests.TryAdd((attribute.QuestId, attribute.QuestRevision), end_quest)) { var err_msg = $"m_end_quest try Add Fail"; result.setFail(ServerErrorCode.ServerLogicError, err_msg); return result; } return result; } public ConcurrentDictionary<(UInt32, UInt32), ServerCommon.EndQuest> getEndQuests() { return m_end_quests; } public ServerCommon.EndQuest? getEndQuest(UInt32 questId, UInt32 questRevision) { if (m_end_quests.TryGetValue((questId, questRevision), out var end_quest)) { return end_quest; } return null; } public Result endQuestCheck(MetaAssets.EQuestType questType, UInt32 questId, UInt32 questRevision) { var result = new Result(); //normal은 체크안한다. if (questType == MetaAssets.EQuestType.NORMAL) return result; if (true == m_end_quests.ContainsKey((questId, questRevision))) { result.setFail(ServerErrorCode.QuestAlreadyEnded, $"Quest Already End. QuestID : {questId}"); return result; } return result; } public bool hasEndQuest(UInt32 questId, UInt32 questRevision = 0) { return m_end_quests.ContainsKey((questId, questRevision)); } public List makeQuestEndInfo(List<(UInt32, UInt32)> questIdAndRevisions) { var infos = new List(); foreach (var quest_id_revision in questIdAndRevisions) { if (false == m_end_quests.TryGetValue(quest_id_revision, out var end_quest)) { Log.getLogger().error($"makeQuestEndInfo End Quest Not Found. QuestID : {quest_id_revision}"); continue; } var end_quest_attribute = end_quest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(end_quest_attribute, () => $"end_quest_attribute is null !!!"); var quest_id = quest_id_revision.Item1; var quest_revision = quest_id_revision.Item2; var ugq_quest_id = QuestHelper.convertQuestIdAndRevisionToUgqQuestId(quest_id, quest_revision); var info = new QuestEndInfo(); info.ComposedQuestId = ugq_quest_id; info.EndCount = end_quest_attribute.EndCount; info.LastEndTime = Timestamp.FromDateTime(end_quest_attribute.LastEndTime); infos.Add(info); } return infos; } } }