From c49e39b70b1a11bf765d93955cb3a931f414fd96 Mon Sep 17 00:00:00 2001 From: Flerp Date: Sat, 8 Nov 2025 08:52:02 -0800 Subject: [PATCH] Initial Upload --- conf/mod-dmf-always.conf.dist | 3 + src/mod_dmf_always.cpp | 119 ++++++++++++++++++++++++++++++++++ src/mod_dmf_always_loader.cpp | 6 ++ 3 files changed, 128 insertions(+) create mode 100644 conf/mod-dmf-always.conf.dist create mode 100644 src/mod_dmf_always.cpp create mode 100644 src/mod_dmf_always_loader.cpp diff --git a/conf/mod-dmf-always.conf.dist b/conf/mod-dmf-always.conf.dist new file mode 100644 index 0000000..437439a --- /dev/null +++ b/conf/mod-dmf-always.conf.dist @@ -0,0 +1,3 @@ +ModDMFAlways.Enable = 1 +ModDMFAlways.EventIDs = "4,71,376" +ModDMFAlways.ReassertInterval = 600000 diff --git a/src/mod_dmf_always.cpp b/src/mod_dmf_always.cpp new file mode 100644 index 0000000..3601a14 --- /dev/null +++ b/src/mod_dmf_always.cpp @@ -0,0 +1,119 @@ +#include "Config.h" +#include "GameEventMgr.h" +#include "Log.h" +#include "ScriptMgr.h" +#include "World.h" +#include +#include +#include +#include + +namespace +{ + bool sEnabled = true; + std::vector sEventIds; + uint32 sTick = 0; + uint32 sInterval = 600000; + + std::vector ParseIds(std::string raw) + { + std::vector out; + std::stringstream ss(raw); + std::string tok; + while (std::getline(ss, tok, ',')) + { + tok.erase(std::remove_if(tok.begin(), tok.end(), ::isspace), tok.end()); + if (!tok.empty()) + out.push_back(uint32(std::stoul(tok))); + } + return out; + } + + void ForceStart(uint32 id) + { + if (!sGameEventMgr->IsActiveEvent(id)) + { + sGameEventMgr->StartEvent(id, true); // force start + LOG_INFO("module", "mod-dmf-always: started event {}", id); + } + } + + void EnsureAll() + { + for (uint32 id : sEventIds) + ForceStart(id); + } +} + +class DMFAlways_Script : public WorldScript +{ +public: + DMFAlways_Script() : WorldScript("DMFAlways_Script") { } + + void OnAfterConfigLoad(bool) override + { + sEnabled = sConfigMgr->GetOption("ModDMFAlways.Enable", true); + sInterval = sConfigMgr->GetOption("ModDMFAlways.ReassertInterval", 60000); + + std::string ids = sConfigMgr->GetOption("ModDMFAlways.EventIDs", "4,71,376"); + sEventIds = ParseIds(ids); + + if (sEnabled) + { + LOG_INFO("module", "mod-dmf-always: enabled. Keeping events active: {}", ids); + } + else + { + LOG_INFO("module", "mod-dmf-always: disabled."); + } + } + + void OnStartup() override + { + if (!sEnabled) + return; + + EnsureAll(); + } + + void OnUpdate(uint32 diff) override + { + if (!sEnabled) + return; + + sTick += diff; + if (sTick >= sInterval) + { + sTick = 0; + EnsureAll(); + } + } +}; + +class DMFAlways_EventHook : public ScriptObject +{ +public: + DMFAlways_EventHook() : ScriptObject("DMFAlways_EventHook") { } + + void OnGameEventStart(uint16 eventId) override + { + if (!sEnabled) return; + if (std::find(sEventIds.begin(), sEventIds.end(), eventId) != sEventIds.end()) + EnsureAll(); + } + + void OnGameEventStop(uint16 eventId) override + { + if (!sEnabled) return; + if (std::find(sEventIds.begin(), sEventIds.end(), eventId) != sEventIds.end()) + { + ForceStart(eventId); + } + } +}; + +void AddSC_mod_dmf_always() +{ + new DMFAlways_Script(); + new DMFAlways_EventHook(); +} diff --git a/src/mod_dmf_always_loader.cpp b/src/mod_dmf_always_loader.cpp new file mode 100644 index 0000000..693b34a --- /dev/null +++ b/src/mod_dmf_always_loader.cpp @@ -0,0 +1,6 @@ +void AddSC_mod_dmf_always(); + +void Addmod_dmf_alwaysScripts() +{ + AddSC_mod_dmf_always(); +}