From 8123fc602ca9868221d7ccae01a31175cec0eac3 Mon Sep 17 00:00:00 2001 From: savis <106487343+savisxss@users.noreply.github.com> Date: Sat, 27 Dec 2025 02:50:46 +0100 Subject: [PATCH] Add EventFlag-based quest enable/disable system Implemented EventFlag system to control quest availability: - Added IsEventFlagSet() to check if EventFlag exists in questmanager - Added EventFlag checks in ExecuteQuestScript() for per-quest control - Added EventFlag checks in HandleEvent() for NPC-based quest control - Added EventFlag checks in OnChat() for chat-based quest control Usage: - /event quest__enabled 0/1 - Enable/disable specific quest - /event quest_npc__enabled 0/1 - Enable/disable all NPC quests - /event quests_global_enabled 0/1 - Enable/disable all quests globally --- src/game/questmanager.cpp | 26 ++++++++++++++++++++++++++ src/game/questmanager.h | 1 + src/game/questnpc.cpp | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/game/questmanager.cpp b/src/game/questmanager.cpp index 95ba973..45e2a83 100644 --- a/src/game/questmanager.cpp +++ b/src/game/questmanager.cpp @@ -1501,6 +1501,11 @@ namespace quest return it->second; } + bool CQuestManager::IsEventFlagSet(const string& name) + { + return m_mapEventFlag.find(name) != m_mapEventFlag.end(); + } + void CQuestManager::BroadcastEventFlagOnLogin(LPCHARACTER ch) { int iEventFlagValue; @@ -1569,6 +1574,27 @@ namespace quest bool CQuestManager::ExecuteQuestScript(PC& pc, const string& quest_name, const int state, const char* code, const int code_size, vector* pChatScripts, bool bUseCache) { + // Check if quest is enabled via event flag + // Only blocks if flag is explicitly set to 0 (default is enabled) + string quest_flag = "quest_" + quest_name + "_enabled"; + + if (CQuestManager::instance().IsEventFlagSet(quest_flag) + && CQuestManager::instance().GetEventFlag(quest_flag) == 0) + { + if (test_server) + sys_log(0, "QUEST: Quest %s is disabled via event flag %s", quest_name.c_str(), quest_flag.c_str()); + return false; + } + + // Check global quest disable flag (only if explicitly set) + if (CQuestManager::instance().IsEventFlagSet("quests_global_enabled") + && CQuestManager::instance().GetEventFlag("quests_global_enabled") == 0) + { + if (test_server) + sys_log(0, "QUEST: All quests are disabled via quests_global_enabled flag"); + return false; + } + // 실행공간을 생성 QuestState qs = CQuestManager::instance().OpenState(quest_name, state); if (pChatScripts) diff --git a/src/game/questmanager.h b/src/game/questmanager.h index ebef9ea..34b8c00 100644 --- a/src/game/questmanager.h +++ b/src/game/questmanager.h @@ -157,6 +157,7 @@ namespace quest void SetEventFlag(const string& name, int value); int GetEventFlag(const string& name); + bool IsEventFlagSet(const string& name); // Check if flag exists void BroadcastEventFlagOnLogin(LPCHARACTER ch); void SendEventFlagList(LPCHARACTER ch); diff --git a/src/game/questnpc.cpp b/src/game/questnpc.cpp index 3f83ff2..ae31ad2 100644 --- a/src/game/questnpc.cpp +++ b/src/game/questnpc.cpp @@ -457,6 +457,22 @@ namespace quest return false; } + // Check if NPC quests are disabled via event flag + // Only blocks if flag is explicitly set to 0 (default is enabled) + if (m_vnum > 0) + { + string npc_flag_str = "quest_npc_" + std::to_string(m_vnum) + "_enabled"; + + // Only check if flag is explicitly set + if (CQuestManager::instance().IsEventFlagSet(npc_flag_str) + && CQuestManager::instance().GetEventFlag(npc_flag_str) == 0) + { + if (test_server) + sys_log(0, "QUEST: NPC %u quests are disabled via event flag %s", m_vnum, npc_flag_str.c_str()); + return false; + } + } + if (pc.IsRunning()) { if (test_server) @@ -870,7 +886,23 @@ namespace quest bool NPC::OnChat(PC& pc) { - if (pc.IsRunning()) + // Check if NPC quests are disabled via event flag + // Only blocks if flag is explicitly set to 0 (default is enabled) + if (m_vnum > 0) + { + string npc_flag_str = "quest_npc_" + std::to_string(m_vnum) + "_enabled"; + + // Only check if flag is explicitly set + if (CQuestManager::instance().IsEventFlagSet(npc_flag_str) + && CQuestManager::instance().GetEventFlag(npc_flag_str) == 0) + { + if (test_server) + sys_log(0, "QUEST: NPC %u chat quests are disabled via event flag %s", m_vnum, npc_flag_str.c_str()); + return false; + } + } + + if (pc.IsRunning()) { if (test_server) {