193 lines
6.8 KiB
C#
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;
|
|
|
|
}
|
|
}
|
|
}
|