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 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 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() { questId })); } return ntf_packet; } //public static void send_GS2C_NTF_QUEST_UPDATE_ALL(this Player player) //{ // var quest_action = player.getEntityAction(); // 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 send_GS2C_NTF_QUEST_UPDATE_ALL(this Player player) { ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var quest_action = player.getEntityAction(); var quests = quest_action.getQuests(); foreach (var quest in quests.Values) { var quest_attribute = quest.getEntityAttribute(); 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 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(); (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 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() { 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(); 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(); var quests = quest_action.getSystemQuests(); ntf_packet.Message.QuestInfoNoti.Quests.AddRange(await QuestMetaHelper.makeQuestInfoData(quests)); List quest_ids = new(); foreach (var quest in quests) { var quest_attribute = quest.getEntityAttribute(); 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(); 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(); 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(); 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(); await ugq_reward_action.uggDailyRewardRefresh(); ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var daily_reward_attribute = player.getEntityAttribute(); 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 makeQuestMetaInfoData(List questIds) { List metaInfos = new List(); 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 fillQuestMetaInfos(List datas) { List metaInfos = new List(); 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 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 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(); } }