From 8ea130bdf08aa41441a50652e5938570f9e0d0b1 Mon Sep 17 00:00:00 2001 From: Flerp Date: Sat, 15 Nov 2025 17:59:03 -0800 Subject: [PATCH] Initial Upload --- README.md | 0 conf/mod-server-idler.conf.dist | 24 +++++++++++ src/mod_server_idler.cpp | 74 +++++++++++++++++++++++++++++++++ src/mod_server_idler_loader.cpp | 8 ++++ 4 files changed, 106 insertions(+) create mode 100644 README.md create mode 100644 conf/mod-server-idler.conf.dist create mode 100644 src/mod_server_idler.cpp create mode 100644 src/mod_server_idler_loader.cpp diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/conf/mod-server-idler.conf.dist b/conf/mod-server-idler.conf.dist new file mode 100644 index 0000000..188ccf3 --- /dev/null +++ b/conf/mod-server-idler.conf.dist @@ -0,0 +1,24 @@ +# +# Server Idler configuration +# + +# ServerIdler.Enable +# Description: Enable/disable the server idler module. +# Default: 1 - (Enabled) +# 0 - (Disabled) +# +ServerIdler.Enable = 1 + +# ServerIdler.IntervalIdle +# Description: Map update interval (in milliseconds) when NO players are online. +# Important: Higher values = less CPU usage, but slower world updates. +# Default: 200 +# +ServerIdler.IntervalIdle = 200 + +# ServerIdler.IntervalActive +# Description: Map update interval (in milliseconds) when at least one player is online. +# Important: Typically matches or is close to your MapUpdateInterval in worldserver.conf. +# Default: 10 +# +ServerIdler.IntervalActive = 10 diff --git a/src/mod_server_idler.cpp b/src/mod_server_idler.cpp new file mode 100644 index 0000000..49ef23b --- /dev/null +++ b/src/mod_server_idler.cpp @@ -0,0 +1,74 @@ +#include "ScriptMgr.h" +#include "Config.h" +#include "World.h" +#include "Player.h" + +namespace +{ + bool sEnabled = true; + uint32 sIntervalIdle = 200u; + uint32 sIntervalActive = 10u; + uint32 sPlayersOnline = 0u; + + void ApplyInterval() + { + if (!sEnabled) + return; + + uint32 newInterval = (sPlayersOnline > 0) ? sIntervalActive : sIntervalIdle; + sWorld->setIntConfig(CONFIG_MAP_UPDATE_INTERVAL, newInterval); + } +} + +class ServerIdler_WorldScript : public WorldScript +{ +public: + ServerIdler_WorldScript() : WorldScript("ServerIdler_WorldScript") {} + + void OnAfterConfigLoad(bool) override + { + sEnabled = sConfigMgr->GetOption("ServerIdler.Enable", true); + sIntervalIdle = sConfigMgr->GetOption("ServerIdler.IntervalIdle", 200u); + sIntervalActive = sConfigMgr->GetOption("ServerIdler.IntervalActive", 10u); + + if (sIntervalIdle == 0u) + sIntervalIdle = 1u; + if (sIntervalActive == 0u) + sIntervalActive = 1u; + + sPlayersOnline = sWorld->GetPlayerCount(); + ApplyInterval(); + } +}; + +class ServerIdler_PlayerScript : public PlayerScript +{ +public: + ServerIdler_PlayerScript() : PlayerScript("ServerIdler_PlayerScript") {} + + void OnLogin(Player*) override + { + if (!sEnabled) + return; + + ++sPlayersOnline; + ApplyInterval(); + } + + void OnLogout(Player*) override + { + if (!sEnabled) + return; + + if (sPlayersOnline > 0) + --sPlayersOnline; + + ApplyInterval(); + } +}; + +void AddSC_server_idler() +{ + new ServerIdler_WorldScript(); + new ServerIdler_PlayerScript(); +} diff --git a/src/mod_server_idler_loader.cpp b/src/mod_server_idler_loader.cpp new file mode 100644 index 0000000..6ab5fab --- /dev/null +++ b/src/mod_server_idler_loader.cpp @@ -0,0 +1,8 @@ +#include "ScriptMgr.h" + +void AddSC_server_idler(); + +void Addmod_server_idlerScripts() +{ + AddSC_server_idler(); +}