using ServerCommon; using System.Collections.Concurrent; using ServerCore; using ServerBase; using MetaAssets; using UGQDatabase.Models; namespace GameServer; public class QuestTaskUpdateHandler { private Player m_player; public UInt32 m_quest_id { get; set; } = 0; public UInt32 m_quest_revision { get; set; } = 0; public EQuestType m_quest_type { get; set; } = EQuestType.NONE; public QuestBaseInfo? m_quest_meta_info { get; set; } = null; public GameQuestDataEntity? m_game_quest_data { get; set; } = null; public QuestTaskGroup? m_quest_task_group { get; set; } = null; public ServerCommon.Quest? m_quest { get; set; } = null; public string m_active_event { get; set; } = string.Empty; public EQuestEventTargetType m_target_type { get; set; } = EQuestEventTargetType.NONE; public EQuestEventNameType m_name_type { get; set; } = EQuestEventNameType.NONE; public List m_rewards { get; set; } = new(); public ConcurrentDictionary m_deletable_items { get; set; } = new(); public List m_rewarded_money { get; set; } = new(); public List m_rewarded_items { get; set; } = new(); public List m_deleted_items { get; set; } = new(); public List m_last_check_functions { get; set; } = new(); public bool m_need_counter_check { get; set; } = false; public int m_next_task_number { get; set; } = 0; public CommonResult m_common_result { get; set; } = new(); public List m_log_invokers { get; set; } = new(); public QuestTaskUpdateHandler(Player player, UInt32 questId, UInt32 questRevision, string activeEvent) { m_player = player; m_quest_id = questId; m_quest_revision = questRevision; m_active_event = activeEvent; } public async Task init() { var quest_action = m_player.getEntityAction(); (var result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(m_player, m_quest_id, m_quest_revision); if (result.isFail()) return result; m_quest_meta_info = quest_meta_all_base_info.m_quest_base_info; NullReferenceCheckHelper.throwIfNull(m_quest_meta_info, () => $"m_quest_meta_info is null !!!"); var quest_type = EnumHelper.convertEnumTypeAndValueStringToEnum(m_quest_meta_info.QuestType, EQuestType.NORMAL); m_quest_type = quest_type; result = quest_action.getQuest(quest_type, m_quest_id, out var quest); if (result.isFail()) return result; m_quest = quest; if (m_quest_revision > 0) { var game_quest_data = quest_meta_all_base_info.m_quest_data_entity; NullReferenceCheckHelper.throwIfNull(game_quest_data, () => $"game_quest_data is null !!!"); if (game_quest_data.UgqGameQuestDataForClient.UgqStateType == UgqStateType.Standby) { result.setFail(ServerErrorCode.UgqQuestShutdowned); return result; } else if (game_quest_data.UgqGameQuestDataForClient.UgqStateType == UgqStateType.Shutdown || game_quest_data.Shutdown == true) { result.setFail(ServerErrorCode.UgqQuestShutdowned); return result; } else if (game_quest_data.UgqGameQuestDataForClient.UgqStateType == UgqStateType.RevisionChanged) { result.setFail(ServerErrorCode.UgqQuestRevisionChanged); return result; } } return result; } public async Task init(Player player, ServerCommon.Quest quest) { (var result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(m_player, m_quest_id, m_quest_revision); if (result.isFail()) return result; //var game_quest_data = quest_meta_all_base_info.m_quest_data_entity; m_quest_meta_info = quest_meta_all_base_info.m_quest_base_info; NullReferenceCheckHelper.throwIfNull(m_quest_meta_info, () => $"m_quest_meta_info is null !!!"); var quest_type = EnumHelper.convertEnumTypeAndValueStringToEnum(m_quest_meta_info.QuestType, EQuestType.NORMAL); m_quest_type = quest_type; m_quest = quest; if (result.isFail()) return result; if (m_quest_revision > 0) { var game_quest_data = quest_meta_all_base_info.m_quest_data_entity; NullReferenceCheckHelper.throwIfNull(game_quest_data, () => $"game_quest_data is null !!!"); if (game_quest_data.UgqGameQuestDataForClient.UgqStateType == UgqStateType.Shutdown) { result.setFail(ServerErrorCode.UgqQuestShutdowned); send_NTF_UGQ_STATE_CHANGED(player, result, m_quest_id, m_quest_revision); return result; } else if (game_quest_data.UgqGameQuestDataForClient.UgqStateType == UgqStateType.RevisionChanged) { result.setFail(ServerErrorCode.UgqQuestRevisionChanged); send_NTF_UGQ_STATE_CHANGED(player, result, m_quest_id, m_quest_revision); return result; } } return result; } private void send_NTF_UGQ_STATE_CHANGED(Player player, Result result, UInt32 questId, UInt32 questRevision) { if (result.getErrorCode() != ServerErrorCode.UgqQuestRevisionChanged && result.getErrorCode() != ServerErrorCode.UgqQuestShutdowned) return; var server_logic = GameServerApp.getServerLogic(); var ntf_packet = new ClientToGame(); ntf_packet.Message = new(); ntf_packet.Message.NtfUgqStateChanged = new(); ntf_packet.Message.NtfUgqStateChanged.ComposedQuestId = QuestHelper.convertQuestIdAndRevisionToUgqQuestId(questId, questRevision); ntf_packet.Message.NtfUgqStateChanged.State = UgqStateType.Shutdown; if (result.getErrorCode() == ServerErrorCode.UgqQuestRevisionChanged) { ntf_packet.Message.NtfUgqStateChanged.State = UgqStateType.RevisionChanged; } server_logic.onSendPacket(player, ntf_packet); } }