diff options
author | ErodeesFleurs <862959461@qq.com> | 2025-03-03 13:50:50 +0800 |
---|---|---|
committer | ErodeesFleurs <862959461@qq.com> | 2025-03-03 13:50:50 +0800 |
commit | fda2c7463ba4e01061819d495de2f3c27b6b1946 (patch) | |
tree | 679ab9bc158a465504f33664244048a77672c245 | |
parent | 3893151fe217a684aba77669bab6ca3b828943e7 (diff) |
make UniverseServer scri scriptable.
-rw-r--r-- | assets/opensb/universe_server.config.patch | 15 | ||||
-rw-r--r-- | source/game/StarCommandProcessor.cpp | 3 | ||||
-rw-r--r-- | source/game/StarCommandProcessor.hpp | 2 | ||||
-rw-r--r-- | source/game/StarUniverseServer.cpp | 49 | ||||
-rw-r--r-- | source/game/StarUniverseServer.hpp | 10 |
5 files changed, 73 insertions, 6 deletions
diff --git a/assets/opensb/universe_server.config.patch b/assets/opensb/universe_server.config.patch index 55d39cc..01bc783 100644 --- a/assets/opensb/universe_server.config.patch +++ b/assets/opensb/universe_server.config.patch @@ -3,5 +3,20 @@ "op" : "add", "path" : "/commandProcessorScripts/-", "value" : "/scripts/opensb/servercommands/servercommands.lua" + }, + { + "op" : "add", + "path" : "/luaGcPause", + "value" : 1.2 + }, + { + "op" : "add", + "path" : "/luaGcStepMultiplier", + "value" : 1.2 + }, + { + "op" : "add", + "path" : "/scriptContexts", + "value" : {} } ]
\ No newline at end of file diff --git a/source/game/StarCommandProcessor.cpp b/source/game/StarCommandProcessor.cpp index 74fc33a..98393dc 100644 --- a/source/game/StarCommandProcessor.cpp +++ b/source/game/StarCommandProcessor.cpp @@ -24,13 +24,12 @@ namespace Star { -CommandProcessor::CommandProcessor(UniverseServer* universe) +CommandProcessor::CommandProcessor(UniverseServer* universe, LuaRootPtr luaRoot) : m_universe(universe) { auto assets = Root::singleton().assets(); m_scriptComponent.addCallbacks("universe", LuaBindings::makeUniverseServerCallbacks(m_universe)); m_scriptComponent.addCallbacks("CommandProcessor", makeCommandCallbacks()); m_scriptComponent.setScripts(jsonToStringList(assets->json("/universe_server.config:commandProcessorScripts"))); - auto luaRoot = make_shared<LuaRoot>(); luaRoot->luaEngine().setNullTerminated(false); m_scriptComponent.setLuaRoot(luaRoot); m_scriptComponent.init(); diff --git a/source/game/StarCommandProcessor.hpp b/source/game/StarCommandProcessor.hpp index a62cfc9..85d1487 100644 --- a/source/game/StarCommandProcessor.hpp +++ b/source/game/StarCommandProcessor.hpp @@ -12,7 +12,7 @@ STAR_CLASS(CommandProcessor); class CommandProcessor { public: - CommandProcessor(UniverseServer* universe); + CommandProcessor(UniverseServer* universe, LuaRootPtr luaRoot); String adminCommand(String const& command, String const& argumentString); String userCommand(ConnectionId clientId, String const& command, String const& argumentString); diff --git a/source/game/StarUniverseServer.cpp b/source/game/StarUniverseServer.cpp index fde8ca6..f32f650 100644 --- a/source/game/StarUniverseServer.cpp +++ b/source/game/StarUniverseServer.cpp @@ -45,7 +45,9 @@ UniverseServer::UniverseServer(String const& storageDir) m_assetsDigest = assets->digest(); } - m_commandProcessor = make_shared<CommandProcessor>(this); + startLuaScripts(); + + m_commandProcessor = make_shared<CommandProcessor>(this, m_luaRoot); m_chatProcessor = make_shared<ChatProcessor>(); m_chatProcessor->setCommandHandler(bind(&CommandProcessor::userCommand, m_commandProcessor.get(), _1, _2, _3)); @@ -76,11 +78,13 @@ UniverseServer::UniverseServer(String const& storageDir) m_maxPlayers = configuration->get("maxPlayers").toUInt(); - for (auto const& pair : assets->json("/universe_server.config:speciesShips").iterateObject()) + auto universeConfig = assets->json("/universe_server.config"); + + for (auto const& pair : universeConfig.get("speciesShips").iterateObject()) m_speciesShips[pair.first] = jsonToStringList(pair.second); m_teamManager = make_shared<TeamManager>(); - m_workerPool.start(assets->json("/universe_server.config:workerPoolThreads").toUInt()); + m_workerPool.start(universeConfig.getUInt("workerPoolThreads")); m_connectionServer = make_shared<UniverseConnectionServer>(bind(&UniverseServer::packetsReceived, this, _1, _2, _3)); m_pause = make_shared<atomic<bool>>(false); @@ -88,6 +92,7 @@ UniverseServer::UniverseServer(String const& storageDir) UniverseServer::~UniverseServer() { stop(); + stopLua(); join(); m_workerPool.stop(); @@ -538,6 +543,7 @@ void UniverseServer::run() { LogMap::set("universe_time", m_universeClock->time()); try { + updateLua(); processUniverseFlags(); removeTimedBan(); sendPendingChat(); @@ -1810,6 +1816,9 @@ void UniverseServer::acceptConnection(UniverseConnection connection, Maybe<HostA make_shared<ServerInfoPacket>(players, static_cast<uint16_t>(m_maxPlayers)) }); } + + for (auto& p : m_scriptContexts) + p.second->invoke("acceptConnection", clientId); } WarpToWorld UniverseServer::resolveWarpAction(WarpAction warpAction, ConnectionId clientId, bool deploy) const { @@ -1911,6 +1920,9 @@ void UniverseServer::doDisconnection(ConnectionId clientId, String const& reason make_shared<ServerInfoPacket>(players, static_cast<uint16_t>(m_maxPlayers)) }); } + + for (auto& p : m_scriptContexts) + p.second->invoke("doDisconnection", clientId); } } @@ -2296,4 +2308,35 @@ SkyParameters UniverseServer::celestialSkyParameters(CelestialCoordinate const& return SkyParameters(); } +void UniverseServer::startLuaScripts() { + auto assets = Root::singleton().assets(); + auto universeConfig = assets->json("/universe_server.config"); + + m_luaRoot = make_shared<LuaRoot>(); + m_luaRoot->tuneAutoGarbageCollection(universeConfig.getFloat("luaGcPause"), universeConfig.getFloat("luaGcStepMultiplier")); + + + for (auto& p : universeConfig.getObject("scriptContexts")) { + auto scriptComponent = make_shared<ScriptComponent>(); + scriptComponent->setLuaRoot(m_luaRoot); + scriptComponent->addCallbacks("universe", LuaBindings::makeUniverseServerCallbacks(this)); + scriptComponent->setScripts(jsonToStringList(p.second.toArray())); + + m_scriptContexts.set(p.first, scriptComponent); + scriptComponent->init(); + } +} + +void UniverseServer::updateLua() { + for (auto& p : m_scriptContexts) + p.second->update(); } + +void UniverseServer::stopLua() { + for (auto& p : m_scriptContexts) + p.second->uninit(); + + m_scriptContexts.clear(); +} + +}
\ No newline at end of file diff --git a/source/game/StarUniverseServer.hpp b/source/game/StarUniverseServer.hpp index a87194f..f3db6fc 100644 --- a/source/game/StarUniverseServer.hpp +++ b/source/game/StarUniverseServer.hpp @@ -143,6 +143,10 @@ private: void saveSettings(); void loadSettings(); + void startLuaScripts(); + void updateLua(); + void stopLua(); + // Either returns the default configured starter world, or a new randomized // starter world, or if a randomized world is not yet available, starts a job // to find a randomized starter world and returns nothing until it is ready. @@ -255,6 +259,12 @@ private: Map<WorldId, List<WorldServerThread::Message>> m_pendingWorldMessages; List<TimeoutBan> m_tempBans; + + LuaRootPtr m_luaRoot; + + typedef LuaUpdatableComponent<LuaBaseComponent> ScriptComponent; + typedef shared_ptr<ScriptComponent> ScriptComponentPtr; + StringMap<ScriptComponentPtr> m_scriptContexts; }; } |