Files
caliverse_server/GameServer/Contents/Quest/QuestMetaBase/QuestMetaManager.cs
2025-05-01 07:20:41 +09:00

127 lines
4.7 KiB
C#

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<QuestMetaManager>
{
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!);
}
}
}