using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics.CodeAnalysis; using Newtonsoft.Json; using Google.Protobuf.WellKnownTypes; using Microsoft.AspNetCore.SignalR.Protocol; using RabbitMQ.Client; using ServerCore; using ServerBase; using ServerCommon; using MetaAssets; using UGQDatabase.Models; namespace GameServer; public static class QuestMetaHelper { public static Result getQuestTaskEventGroupByEventString(QuestTaskGroup questTaskInfo, string eventString, [MaybeNullWhen(false)] out QuestEventInfo? questEventInfo) { var result = new Result(); if (false == questTaskInfo.QuestEventGroupByEventString.TryGetValue(eventString, out questEventInfo)) { var err_msg = $"activeEnvent info not match current task !!!, eventString : {eventString}, questTaskInfo = {JsonConvert.SerializeObject(questTaskInfo)}"; result.setFail(ServerErrorCode.QuestInvalidValue, err_msg); Log.getLogger().error(result.toBasicString()); questEventInfo = null; return result; } return result; } public static async Task<(Result, QuestInfo?)> makeQuestInfoData(ServerCommon.Quest quest) { var quest_attribute = quest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!!"); QuestInfo questInfo = new QuestInfo(); var quest_id = quest_attribute.QuestId; var quest_revision = quest_attribute.UgqInfo.QuestRevision; (var result, var quest_task_info) = await getQuestTaskGroupFromQuest(quest); if (result.isFail()) return (result, null); questInfo.ComposedQuestId = QuestHelper.convertQuestIdAndRevisionToUgqQuestId(quest_id, quest_revision); questInfo.QuestAssignTime = Timestamp.FromDateTime(quest_attribute.QuestAssignTime); questInfo.CurrentTaskNum = quest_attribute.CurrentTaskNum; questInfo.TaskStartTime = Timestamp.FromDateTime(quest_attribute.TaskStartTime); questInfo.QuestCompleteTime = Timestamp.FromDateTime(quest_attribute.QuestCompleteTime); questInfo.HasCounter = quest_attribute.HasCounter; questInfo.MinCounter = quest_attribute.MinCounter; questInfo.MaxCounter = quest_attribute.MaxCounter; questInfo.CurrentCounter = quest_attribute.CurrentCounter; questInfo.IsComplete = quest_attribute.IsComplete; questInfo.ReplacedRewardGroupId = quest_attribute.ReplacedRewardGroupId; questInfo.HasTimer = quest_attribute.HasTimer; questInfo.TimerCompleteTime = Timestamp.FromDateTime(quest_attribute.TimerCompleteTime); questInfo.ActiveEvents.AddRange(quest_attribute.ActiveEvents); return (result, questInfo); } public static async Task<(Result, QuestTaskGroup?)> getQuestTaskGroupFromQuest(ServerCommon.Quest quest) { var player = quest.getRootParent() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var quest_attribute = quest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!!"); var quest_id = quest_attribute.QuestId; var quest_revision = quest_attribute.UgqInfo.QuestRevision; (var result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(player, quest_id, quest_revision, quest_attribute.UgqInfo.UqgState); if (result.isFail()) return (result, null); var quest_base_info = quest_meta_all_base_info.m_quest_base_info; NullReferenceCheckHelper.throwIfNull(quest_base_info, () => $"quest_base_info is null !!!"); if (false == quest_base_info.QuestTaskGroupList.TryGetValue(quest_attribute.CurrentTaskNum, out var quest_task_info)) { string err_msg = $"NotExist Quest Task Group Data QuestID : {quest_attribute.QuestId}, TaskNum : {quest_attribute.CurrentTaskNum}"; result.setFail(ServerErrorCode.QuestInvalidTaskNum, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } return (result, quest_task_info); } public static async Task> makeQuestInfoData(List quests) { List questInfos = new List(); foreach (var quest in quests) { (var result, var quest_info) = await makeQuestInfoData(quest); if (result.isFail()) continue; NullReferenceCheckHelper.throwIfNull(quest_info, () => $"quest_info is null !!!"); questInfos.Add(quest_info); } return questInfos; } public static async Task getQuestType(Player player, UInt32 questId, UInt32 questRevision) { if (questRevision > 0) { return EQuestType.UGQ; } else { (var result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(player, questId, questRevision); if (result.isFail()) return EQuestType.NORMAL; var quest_base_info = quest_meta_all_base_info.m_quest_base_info; NullReferenceCheckHelper.throwIfNull(quest_base_info, () => $"quest_base_info is null !!!"); var quest_type = EnumHelper.convertEnumTypeAndValueStringToEnum(quest_base_info.QuestType, EQuestType.NORMAL); return quest_type; } } public static string convertFarmingSummonedEntityTypeToQuestEntityType(FarmingSummonedEntityType entityType) { switch (entityType) { case FarmingSummonedEntityType.User: return "MYSELF"; case FarmingSummonedEntityType.Beacon: return "BEACON"; default: return "UNKNOWN"; } } }