397 lines
16 KiB
C#
397 lines
16 KiB
C#
using Google.Protobuf.WellKnownTypes;
|
|
using MetaAssets;
|
|
using Nettention.Proud;
|
|
using ServerCommon;
|
|
using ServerCommon.Cache;
|
|
using ServerCore; using ServerBase;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using UGQDatabase.Models;
|
|
|
|
namespace GameServer;
|
|
|
|
public static class QuestNotifyHelper
|
|
{
|
|
public static async Task<ClientToGame> makeQuestUpdateNotify(Player player, UInt32 questId, ServerCommon.Quest assigned_quest, bool isNewQuest = false)
|
|
{
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
|
|
ClientToGame ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new ();
|
|
ntf_packet.Message.QuestUpdateNoti = new();
|
|
|
|
List<ServerCommon.Quest> quests = new();
|
|
quests.Add(assigned_quest);
|
|
|
|
ntf_packet.Message.QuestUpdateNoti.Quests.AddRange(await QuestMetaHelper.makeQuestInfoData(quests));
|
|
|
|
if (isNewQuest)
|
|
{
|
|
ntf_packet.Message.QuestUpdateNoti.QuestMetaInfos.AddRange(makeQuestMetaInfoData(new List<UInt32>() { questId }));
|
|
}
|
|
|
|
return ntf_packet;
|
|
}
|
|
|
|
//public static void send_GS2C_NTF_QUEST_UPDATE_ALL(this Player player)
|
|
//{
|
|
// var quest_action = player.getEntityAction<QuestAction>();
|
|
// var quests = quest_action.getQuests();
|
|
// foreach(var quest_key in quests.Keys)
|
|
// {
|
|
// var quest_id = quest_key.Item2;
|
|
// send_GS2C_NTF_QUEST_UPDATE(player, quest_id, false);
|
|
// }
|
|
//}
|
|
|
|
public static async Task<Result> send_GS2C_NTF_QUEST_UPDATE_ALL(this Player player)
|
|
{
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
|
|
var quest_action = player.getEntityAction<QuestAction>();
|
|
var quests = quest_action.getQuests();
|
|
foreach (var quest in quests.Values)
|
|
{
|
|
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!!");
|
|
await player.send_GS2C_NTF_QUEST_UPDATE(quest_attribute.QuestId, quest_attribute.UgqInfo.QuestRevision);
|
|
}
|
|
|
|
return new();
|
|
}
|
|
|
|
|
|
public static async Task<Result> send_GS2C_NTF_QUEST_UPDATE(this Player player, UInt32 questId, UInt32 questRevision, CommonResult? commonResult = null, bool isNewQuest = false)
|
|
{
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
|
|
ClientToGame ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new ClientToGameMessage();
|
|
ntf_packet.Message.QuestUpdateNoti = new ClientToGameMessage.Types.QuestList();
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var quest_action = player.getEntityAction<QuestAction>();
|
|
|
|
(var result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(player, questId, questRevision);
|
|
if (result.isFail()) return result;
|
|
var quest_base_info = quest_meta_all_base_info.m_quest_base_info;
|
|
|
|
NullReferenceCheckHelper.throwIfNull(quest_base_info, () => $"quest_base_info is null !!!");
|
|
|
|
result = quest_action.getQuest(quest_base_info.QuestType, questId, out var quest);
|
|
if (result.isFail()) return result;
|
|
|
|
NullReferenceCheckHelper.throwIfNull(quest, () => $"quest is null !!!");
|
|
|
|
List<ServerCommon.Quest> quests = new();
|
|
quests.Add(quest);
|
|
ntf_packet.Message.QuestUpdateNoti.Quests.AddRange(await QuestMetaHelper.makeQuestInfoData(quests));
|
|
if (isNewQuest)
|
|
{
|
|
ntf_packet.Message.QuestUpdateNoti.QuestMetaInfos.AddRange(makeQuestMetaInfoData(new List<UInt32>() { questId }));
|
|
}
|
|
|
|
ntf_packet.Message.QuestUpdateNoti.CommonResult = commonResult;
|
|
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
return result;
|
|
|
|
}
|
|
|
|
public static Result send_GS2C_NTF_QUEST_UPDATE_EMPTY(this Player player)
|
|
{
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
ClientToGame ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new ClientToGameMessage();
|
|
ntf_packet.Message.QuestUpdateNoti = new ClientToGameMessage.Types.QuestList();
|
|
|
|
var quest_action = player.getEntityAction<QuestAction>();
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
return new();
|
|
|
|
}
|
|
|
|
public static void send_GS2C_NTF_SYSTEM_QUEST_METAS(this Player player)
|
|
{
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
int quest_meta_count = MetaData.Instance.m_quest_assign_meta_infos.Count;
|
|
int quest_task_meta_count = MetaData.Instance.m_quest_task_meta_infos.Count;
|
|
int batch_size = 500;
|
|
|
|
for (int i = 0; i < quest_meta_count; i += batch_size)
|
|
{
|
|
var splited_infos = MetaData.Instance.m_quest_assign_meta_infos.GetRange(i, Math.Min(batch_size, quest_meta_count - i));
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.NtfQuestAssignMetaInfo = new();
|
|
ntf_packet.Message.NtfQuestAssignMetaInfo.QuestAssignMeteInfos.AddRange(splited_infos);
|
|
//ntf_packet.Message.NtfQuestAssignMetaInfo.QuestTaskMetaInfos.AddRange(MetaData.Instance.m_quest_task_meta_infos);
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
}
|
|
|
|
for (int i = 0; i < quest_task_meta_count; i += batch_size)
|
|
{
|
|
var splited_infos = MetaData.Instance.m_quest_task_meta_infos.GetRange(i, Math.Min(batch_size, quest_task_meta_count - i));
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.NtfQuestAssignMetaInfo = new();
|
|
//ntf_packet.Message.NtfQuestAssignMetaInfo.QuestAssignMeteInfos.AddRange(splited_infos);
|
|
ntf_packet.Message.NtfQuestAssignMetaInfo.QuestTaskMetaInfos.AddRange(splited_infos);
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
}
|
|
|
|
// var ntf_packet = new ClientToGame();
|
|
// ntf_packet.Message = new();
|
|
// ntf_packet.Message.NtfQuestAssignMetaInfo = new();
|
|
// ntf_packet.Message.NtfQuestAssignMetaInfo.QuestAssignMeteInfos.AddRange(MetaData.Instance.m_quest_assign_meta_infos);
|
|
// ntf_packet.Message.NtfQuestAssignMetaInfo.QuestTaskMetaInfos.AddRange(MetaData.Instance.m_quest_task_meta_infos);
|
|
// server_logic.onSendPacket(player, ntf_packet);
|
|
|
|
}
|
|
|
|
public static async Task send_GS2C_NTF_SYSTEM_QUESTS(this Player player)
|
|
{
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.QuestInfoNoti = new();
|
|
|
|
var quest_action = player.getEntityAction<QuestAction>();
|
|
var quests = quest_action.getSystemQuests();
|
|
|
|
ntf_packet.Message.QuestInfoNoti.Quests.AddRange(await QuestMetaHelper.makeQuestInfoData(quests));
|
|
|
|
List<UInt32> quest_ids = new();
|
|
|
|
foreach (var quest in quests)
|
|
{
|
|
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!!");
|
|
quest_ids.Add(quest_attribute.QuestId);
|
|
}
|
|
|
|
ntf_packet.Message.QuestInfoNoti.QuestMetaInfos.AddRange(makeQuestMetaInfoData(quest_ids));
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
}
|
|
|
|
|
|
public static void send_GS2C_NTF_END_QUESTS(this Player player)
|
|
{
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.QuestEndInfoNoti = new();
|
|
|
|
var end_quest_action = player.getEntityAction<EndQuestAction>();
|
|
var end_quests = end_quest_action.getEndQuests();
|
|
|
|
var infos = end_quest_action.makeQuestEndInfo(end_quests.Keys.ToList());
|
|
|
|
ntf_packet.Message.QuestEndInfoNoti.EndQuests.AddRange(infos);
|
|
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
}
|
|
|
|
|
|
public static async Task send_GS2C_NTF_UGQS(this Player player)
|
|
{
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var ugq_info_action = player.getEntityAction<UgqInfoAction>();
|
|
var all_infos = await ugq_info_action.makeUqgInfosForClient();
|
|
|
|
foreach (var info in all_infos)
|
|
{
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.NtfUgqQuests = new();
|
|
|
|
ntf_packet.Message.NtfUgqQuests.AllUgqInfos.Add(info);
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
}
|
|
|
|
}
|
|
|
|
public static async Task send_GS2C_NTF_UGQ(this Player player, UInt32 questId, UInt32 questRevision)
|
|
{
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.NtfUgqQuests = new();
|
|
|
|
var ugq_info_action = player.getEntityAction<UgqInfoAction>();
|
|
var all_infos = await ugq_info_action.makeUqgInfoForClient(questId, questRevision);
|
|
|
|
ntf_packet.Message.NtfUgqQuests.AllUgqInfos.AddRange(all_infos);
|
|
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
}
|
|
|
|
public static async Task send_GS2C_NTF_UGQ_DAILY_REWARD(this Player player)
|
|
{
|
|
//보내기 전에 여기에 리프레시 하는것 추가
|
|
var ugq_reward_action = player.getEntityAction<UgqRewardAction>();
|
|
await ugq_reward_action.uggDailyRewardRefresh();
|
|
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
var daily_reward_attribute = player.getEntityAttribute<UgqDailyRewardCountAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(daily_reward_attribute, () => $"daily_reward_attribute is null !!!");
|
|
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.NtfUgqDailyRewardCounts = new();
|
|
ntf_packet.Message.NtfUgqDailyRewardCounts.NextRefreshTime = daily_reward_attribute.m_next_refresh_time.ToTimestamp();
|
|
|
|
var reward_counts = daily_reward_attribute.getDailyRewardCount();
|
|
foreach(var reward_cnt in reward_counts)
|
|
{
|
|
UgqDailyRewardCount usg_daily_reward_count = new();
|
|
usg_daily_reward_count.GradeType = reward_cnt.Key;
|
|
usg_daily_reward_count.CurrentCount = reward_cnt.Value;
|
|
|
|
(var max_cnt, _) = UgqMetaHelper.getUgqDailyRewardMaxCountByGrade(reward_cnt.Key);
|
|
usg_daily_reward_count.DailyMaxCount = max_cnt;
|
|
|
|
ntf_packet.Message.NtfUgqDailyRewardCounts.UgqDailyRewardCounts.Add(usg_daily_reward_count);
|
|
}
|
|
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
}
|
|
|
|
|
|
public static List<QuestMetaInfo> makeQuestMetaInfoData(List<UInt32> questIds)
|
|
{
|
|
List<QuestMetaInfo> metaInfos = new List<QuestMetaInfo>();
|
|
|
|
foreach(var questId in questIds)
|
|
{
|
|
if (!MetaData.Instance._QuestScriptMetaTable.TryGetValue(questId, out var questScripts))
|
|
{
|
|
Log.getLogger().error($"QuestMetaInfoData Not Exist questId : {questId}");
|
|
continue;
|
|
}
|
|
foreach (var script in questScripts.Values)
|
|
{
|
|
var meta = fillQuestMetaInfo(script);
|
|
metaInfos.Add(meta);
|
|
}
|
|
}
|
|
return metaInfos;
|
|
}
|
|
|
|
public static List<QuestMetaInfo> fillQuestMetaInfos(List<MetaAssets.QuestScriptMetaData> datas)
|
|
{
|
|
List<QuestMetaInfo> metaInfos = new List<QuestMetaInfo>();
|
|
foreach (var script in datas)
|
|
{
|
|
var meta = fillQuestMetaInfo(script);
|
|
metaInfos.Add(meta);
|
|
}
|
|
|
|
return metaInfos;
|
|
}
|
|
|
|
public static QuestMetaInfo fillQuestMetaInfo(MetaAssets.QuestScriptMetaData data)
|
|
{
|
|
QuestMetaInfo meta = new QuestMetaInfo();
|
|
meta.Index = data.Index;
|
|
|
|
meta.ComposedQuestId = QuestHelper.convertQuestIdAndRevisionToUgqQuestId(data.QuestId, 0);
|
|
meta.EventTarget = data.EventTarget;
|
|
meta.EventName = data.Event;
|
|
meta.EventCondition1 = data.EventCondition1;
|
|
meta.EventCondition2 = data.EventCondition2;
|
|
if (data.EventCondition2.Equals("0"))
|
|
{
|
|
meta.EventCondition2 = "";
|
|
}
|
|
meta.EventCondition3 = data.EventCondition3;
|
|
meta.FunctionTarget = data.FunctionTarget;
|
|
meta.FunctionName = data.Function;
|
|
meta.FunctionCondition1 = data.FunctionCondition1;
|
|
meta.FunctionCondition2 = data.FunctionCondition2;
|
|
meta.FunctionCondition3 = data.FunctionCondition3;
|
|
|
|
return meta;
|
|
}
|
|
|
|
public static async Task<Result> sendRedisQuestNotifyRequest(Player player, QuestTaskUpdateHandler questTaskUpdateHandler)
|
|
{
|
|
var result = new Result();
|
|
if (questTaskUpdateHandler is null)
|
|
{
|
|
var err_msg = $"quest notify redis regist fail questTaskUpdateHandler is null";
|
|
result.setFail(ServerErrorCode.QuestNotifyRedisRegistFail, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
return result;
|
|
}
|
|
|
|
var quest_id = questTaskUpdateHandler.m_quest_id;
|
|
var quest_revision = questTaskUpdateHandler.m_quest_revision;
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
QuestNotifyCacheRequest cache = new QuestNotifyCacheRequest(player, player.getUserGuid(), quest_id, quest_revision, server_logic.getRedisConnector());
|
|
|
|
result = await cache.addQuestNotify();
|
|
if(result.isFail())
|
|
{
|
|
var err_msg = $"addQuestNotify fail";
|
|
result.setFail(ServerErrorCode.RedisHashesWriteFailed, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
return result;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static async Task<Result> send_GS2C_NTF_QUEST_UPDATE_BY_SERVER_MOVE(this Player player)
|
|
{
|
|
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
QuestNotifyCacheRequest cache = new QuestNotifyCacheRequest(player, player.getUserGuid(), server_logic.getRedisConnector());
|
|
|
|
var notify_caches = await cache.getQuestNotifyAll();
|
|
|
|
foreach (var notify_cache in notify_caches)
|
|
{
|
|
var quest_id = notify_cache.m_quest_id;
|
|
var quest_revision = notify_cache.m_quest_revision;
|
|
|
|
await send_GS2C_NTF_QUEST_UPDATE(player, quest_id, quest_revision, new(), false);
|
|
await cache.deleteQuestNotify(quest_id, quest_revision);
|
|
}
|
|
|
|
return new();
|
|
}
|
|
|
|
public static Result send_GS2C_NTF_QUEST_REWARD(Player player, CommonResult commonResult)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
ClientToGame ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new ClientToGameMessage();
|
|
ntf_packet.Message.NtfQuestReward = new ClientToGameMessage.Types.GS2C_NTF_QUEST_REWARD();
|
|
ntf_packet.Message.NtfQuestReward.CommonResult = commonResult;
|
|
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
return new();
|
|
|
|
}
|
|
}
|
|
|