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

193 lines
6.8 KiB
C#

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<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public override void onClear()
{
m_end_quests.Clear();
}
public async Task<Result> loadEndQuests()
{
var owner = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var server_logic = GameServerApp.getServerLogic();
var batch = new QueryBatchEx<QueryRunnerWithDocument>(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<EndQuestAttribute>();
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<EndQuestAttrib>();
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<EndQuestAttribute>();
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<QuestEndInfo> makeQuestEndInfo(List<(UInt32, UInt32)> questIdAndRevisions)
{
var infos = new List<QuestEndInfo>();
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<EndQuestAttribute>();
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;
}
}
}