Files
2025-05-01 07:20:41 +09:00

154 lines
5.9 KiB
C#

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<QuestAttribute>();
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<QuestAttribute>();
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<List<QuestInfo>> makeQuestInfoData(List<ServerCommon.Quest> quests)
{
List<QuestInfo> questInfos = new List<QuestInfo>();
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<EQuestType> 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";
}
}
}