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_<questname>_enabled 0/1 - Enable/disable specific quest
  - /event quest_npc_<vnum>_enabled 0/1 - Enable/disable all NPC quests
  - /event quests_global_enabled 0/1 - Enable/disable all quests globally
This commit is contained in:
savis
2025-12-27 02:50:46 +01:00
parent db097e3ba2
commit 8123fc602c
3 changed files with 60 additions and 1 deletions

View File

@@ -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<AArgScript*>* 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)

View File

@@ -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);

View File

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