using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ServerCore; using ServerBase; using ServerCommon; using UGQDatabase.Models; namespace GameServer; public class QuestMetaManager : Singleton { IQuestMeta m_system_quest_meta; IQuestMeta m_ugq_live_quest_meta; IQuestMeta m_ugq_test_quest_meta; public QuestMetaManager() { m_system_quest_meta = new QuestSystemMeta(); m_ugq_live_quest_meta = new QuestUgqLiveMeta(); m_ugq_test_quest_meta = new QuestUgqTestMeta(); } //system quest일때 사용 public async Task<(Result, QuestMetaAllBaseInfo)> getQuestMeta(UInt32 questId) { return await m_system_quest_meta.getQuestMetaInfo(null, questId, 0); } //시스템 퀘스트 인지 아닌지 잘 모를때 사용 public async Task<(Result, QuestMetaAllBaseInfo)> getQuestMeta(Player player, UInt32 questId, UInt32 questRevision) { (var result, IQuestMeta i_quest_meta) = await getIUgqMeta(questId, questRevision); return await i_quest_meta.getQuestMetaInfo(player, questId, questRevision); } //Ugq 퀘스트를 명시적으로 호출할때 사용 public async Task<(Result, QuestMetaAllBaseInfo)> getQuestMeta(Player player, UInt32 questId, UInt32 questRevision, QuestContentState contentState) { (var result, IQuestMeta i_quest_meta) = getIUgqMeta(questRevision, contentState); return await i_quest_meta.getQuestMetaInfo(player, questId, questRevision); } //Ugq 퀘스트를 명시적으로 호출할때 사용 public async Task<(Result, QuestMetaAllBaseInfo)> getQuestMeta(Player player, UInt32 questId, UInt32 questRevision, UgqStateType UgqStateState) { (var result, IQuestMeta i_quest_meta) = getIUgqMeta(questRevision, UgqStateState); return await i_quest_meta.getQuestMetaInfo(player, questId, questRevision); } private (Result, IQuestMeta) getIUgqMeta(UInt32 questRevision, QuestContentState contentState) { var result = new Result(); if (questRevision == 0) { return (result, m_system_quest_meta); } switch (contentState) { case QuestContentState.Live: return (result, m_ugq_live_quest_meta); case QuestContentState.Test: return (result, m_ugq_test_quest_meta); default: var err_msg = $"Not Support QuestContentState : {contentState}"; result.setFail(ServerErrorCode.MetaInfoException, err_msg); return (result, null!); } } private (Result, IQuestMeta) getIUgqMeta(UInt32 questRevision, UgqStateType ugqQuestType) { var result = new Result(); if (questRevision == 0) { return (result, m_system_quest_meta); } switch (ugqQuestType) { case UgqStateType.Live: return (result, m_ugq_live_quest_meta); case UgqStateType.Test: return (result, m_ugq_test_quest_meta); default: var err_msg = $"Not Support ugqQuestType : {ugqQuestType}"; result.setFail(ServerErrorCode.MetaInfoException, err_msg); return (result, null!); } } private async Task<(Result, IQuestMeta)> getIUgqMeta(UInt32 questId, UInt32 questRevision) { var result = new Result(); if(questRevision == 0) { return (result, m_system_quest_meta); } else { //Live 상태가 많을 것으로 생각해서 많은것 먼저조회 해서 가져 오도록 하자. var server_logic = GameServerApp.getServerLogic(); var ugq_api_manager = server_logic.GetUqgApiManager(); (result, var simple_game_quest_data) = await ugq_api_manager.getUgqQuestSimpleInfo(questId, questRevision, QuestContentState.Live); if (result.isSuccess() && simple_game_quest_data is not null) return (result, m_ugq_live_quest_meta); (result, simple_game_quest_data) = await ugq_api_manager.getUgqQuestSimpleInfo(questId, questRevision, QuestContentState.Test); if (result.isSuccess() && simple_game_quest_data is not null) return (result, m_ugq_test_quest_meta); //여기까지 오면 에러... var err_msg = $"Not Exist QuestUgqMetaInfo QuestID : {questId} - QuestRevision : {questRevision}"; result.setFail(ServerErrorCode.MetaInfoException, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null!); } } }