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) {