Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErodeesFleurs <862959461@qq.com>2025-03-03 13:50:50 +0800
committerErodeesFleurs <862959461@qq.com>2025-03-03 13:50:50 +0800
commitfda2c7463ba4e01061819d495de2f3c27b6b1946 (patch)
tree679ab9bc158a465504f33664244048a77672c245
parent3893151fe217a684aba77669bab6ca3b828943e7 (diff)
make UniverseServer scri scriptable.
-rw-r--r--assets/opensb/universe_server.config.patch15
-rw-r--r--source/game/StarCommandProcessor.cpp3
-rw-r--r--source/game/StarCommandProcessor.hpp2
-rw-r--r--source/game/StarUniverseServer.cpp49
-rw-r--r--source/game/StarUniverseServer.hpp10
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;
};
}