diff options
Diffstat (limited to 'source/game')
-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 |
4 files changed, 58 insertions, 6 deletions
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; }; } |