diff --git a/assets/opensb/scripts/opensb/util/modules.lua b/assets/opensb/scripts/opensb/util/modules.lua index 2ce7086..f1cd245 100644 --- a/assets/opensb/scripts/opensb/util/modules.lua +++ b/assets/opensb/scripts/opensb/util/modules.lua @@ -1,3 +1,5 @@ +-- Small helper to organize code for the same context into different Lua scripts without having to "hook" previously defined. + modules = setmetatable({}, {__call = function(this, path, names) for i, name in pairs(names) do require(path .. name .. ".lua") diff --git a/assets/opensb/scripts/opensb/worldserver/messages.lua b/assets/opensb/scripts/opensb/worldserver/messages.lua new file mode 100644 index 0000000..1c51eb4 --- /dev/null +++ b/assets/opensb/scripts/opensb/worldserver/messages.lua @@ -0,0 +1,12 @@ +local module = {} +modules.messages = module + +function module.init() + message.setHandler("keepAlive", function(_, _, time) + return world.setExpiryTime(tonumber(time) or 0) + end) +end + +function module.update() + +end \ No newline at end of file diff --git a/assets/opensb/scripts/opensb/worldserver/test.lua b/assets/opensb/scripts/opensb/worldserver/test.lua deleted file mode 100644 index eaaf08f..0000000 --- a/assets/opensb/scripts/opensb/worldserver/test.lua +++ /dev/null @@ -1,12 +0,0 @@ -local module = {} -modules.test = module - -function module.init() - message.setHandler("type", function() - return world.type() - end) -end - -function module.update() - -end \ No newline at end of file diff --git a/assets/opensb/scripts/opensb/worldserver/worldserver.lua b/assets/opensb/scripts/opensb/worldserver/worldserver.lua index a84fa9d..e66edbc 100644 --- a/assets/opensb/scripts/opensb/worldserver/worldserver.lua +++ b/assets/opensb/scripts/opensb/worldserver/worldserver.lua @@ -1,2 +1,2 @@ require "/scripts/opensb/util/modules.lua" -modules("/scripts/opensb/worldserver/", {"test"}) \ No newline at end of file +modules("/scripts/opensb/worldserver/", {"messages"}) \ No newline at end of file diff --git a/source/game/StarUniverseServer.cpp b/source/game/StarUniverseServer.cpp index 51f4cec..dd48085 100644 --- a/source/game/StarUniverseServer.cpp +++ b/source/game/StarUniverseServer.cpp @@ -151,6 +151,11 @@ List UniverseServer::activeWorlds() const { return m_worlds.keys(); } +bool UniverseServer::isWorldActive(WorldId const& worldId) const { + RecursiveMutexLocker locker(m_mainLock); + return m_worlds.contains(worldId); +} + List UniverseServer::clientIds() const { ReadLocker clientsLocker(m_clientsLock); return m_clients.keys(); @@ -1045,8 +1050,14 @@ void UniverseServer::handleWorldMessages() { auto it = m_pendingWorldMessages.begin(); while (it != m_pendingWorldMessages.end()) { auto& worldId = it->first; - if (auto worldPtr = triggerWorldCreation(worldId).value()) { - worldPtr->passMessages(move(it->second)); + if (auto worldResult = triggerWorldCreation(worldId)) { + auto& world = *worldResult; + + if (world) + world->passMessages(move(it->second)); + else for (auto& message : it->second) + message.promise.fail("Error creating world"); + it = m_pendingWorldMessages.erase(it); } else diff --git a/source/game/StarUniverseServer.hpp b/source/game/StarUniverseServer.hpp index 33b0838..806d16f 100644 --- a/source/game/StarUniverseServer.hpp +++ b/source/game/StarUniverseServer.hpp @@ -51,6 +51,7 @@ public: void setPause(bool pause); List activeWorlds() const; + bool isWorldActive(WorldId const& worldId) const; List clientIds() const; size_t numberOfClients() const; diff --git a/source/game/scripting/StarUniverseServerLuaBindings.cpp b/source/game/scripting/StarUniverseServerLuaBindings.cpp index 9101be5..ac513a2 100644 --- a/source/game/scripting/StarUniverseServerLuaBindings.cpp +++ b/source/game/scripting/StarUniverseServerLuaBindings.cpp @@ -18,7 +18,9 @@ LuaCallbacks LuaBindings::makeUniverseServerCallbacks(UniverseServer* universe) callbacks.registerCallbackWithSignature("isAdmin", bind(UniverseServerCallbacks::isAdmin, universe, _1)); callbacks.registerCallbackWithSignature("isPvp", bind(UniverseServerCallbacks::isPvp, universe, _1)); callbacks.registerCallbackWithSignature("setPvp", bind(UniverseServerCallbacks::setPvp, universe, _1, _2)); - callbacks.registerCallbackWithSignature, LuaEngine&, String, String, LuaVariadic>("sendWorldMessage", bind(UniverseServerCallbacks::sendWorldMessage, universe, _1, _2, _3, _4)); + callbacks.registerCallbackWithSignature("isWorldActive", bind(UniverseServerCallbacks::isWorldActive, universe, _1)); + callbacks.registerCallbackWithSignature("activeWorlds", bind(UniverseServerCallbacks::activeWorlds, universe)); + callbacks.registerCallbackWithSignature, String, String, LuaVariadic>("sendWorldMessage", bind(UniverseServerCallbacks::sendWorldMessage, universe, _1, _2, _3)); return callbacks; } @@ -108,7 +110,19 @@ void LuaBindings::UniverseServerCallbacks::setPvp(UniverseServer* universe, Conn universe->setPvp(client, setPvpTo); } -RpcThreadPromise LuaBindings::UniverseServerCallbacks::sendWorldMessage(UniverseServer* universe, LuaEngine& engine, String const& worldId, String const& message, LuaVariadic args) { +bool LuaBindings::UniverseServerCallbacks::isWorldActive(UniverseServer* universe, String const& worldId) { + return universe->isWorldActive(parseWorldId(worldId)); +} + +StringList LuaBindings::UniverseServerCallbacks::activeWorlds(UniverseServer* universe) { + StringList worlds; + for (WorldId& world : universe->activeWorlds()) + worlds.append(printWorldId(world)); + + return worlds; +} + +RpcThreadPromise LuaBindings::UniverseServerCallbacks::sendWorldMessage(UniverseServer* universe, String const& worldId, String const& message, LuaVariadic args) { return universe->sendWorldMessage(parseWorldId(worldId), message, JsonArray::from(move(args))); } diff --git a/source/game/scripting/StarUniverseServerLuaBindings.hpp b/source/game/scripting/StarUniverseServerLuaBindings.hpp index 5eb1674..0b6b21b 100644 --- a/source/game/scripting/StarUniverseServerLuaBindings.hpp +++ b/source/game/scripting/StarUniverseServerLuaBindings.hpp @@ -23,7 +23,9 @@ namespace LuaBindings { bool isAdmin(UniverseServer* universe, ConnectionId arg1); bool isPvp(UniverseServer* universe, ConnectionId arg1); void setPvp(UniverseServer* universe, ConnectionId arg1, Maybe arg2); - RpcThreadPromise sendWorldMessage(UniverseServer* universe, LuaEngine& engine, String const& worldId, String const& message, LuaVariadic args); + bool isWorldActive(UniverseServer* universe, String const& worldId); + StringList activeWorlds(UniverseServer* universe); + RpcThreadPromise sendWorldMessage(UniverseServer* universe, String const& worldId, String const& message, LuaVariadic args); } } }