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

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/opensb/universe_server.config.patch15
-rw-r--r--source/frontend/StarClientCommandProcessor.cpp16
-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
6 files changed, 82 insertions, 13 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/frontend/StarClientCommandProcessor.cpp b/source/frontend/StarClientCommandProcessor.cpp
index da0cbd6..ec8d743 100644
--- a/source/frontend/StarClientCommandProcessor.cpp
+++ b/source/frontend/StarClientCommandProcessor.cpp
@@ -494,7 +494,7 @@ String ClientCommandProcessor::render(String const& path) {
return strf("^red;Invalid chest sheet type '{}'^reset;", sheet);
}
// recovery for custom chests made by a very old generator
- if (args.size() >= 2 && args[2].toLower() == "old" && assetPath.basePath.beginsWith("/items/armors/avian/avian-tier6separator/"))
+ if (args.size() > 2 && args[2].toLower() == "old" && assetPath.basePath.beginsWith("/items/armors/avian/avian-tier6separator/"))
assetPath.basePath = "/items/armors/avian/avian-tier6separator/old/" + assetPath.basePath.substr(41);
} else if (first.equals("legs")) {
assetPath.basePath = humanoid->legsArmorFrameset();
@@ -508,18 +508,22 @@ String ClientCommandProcessor::render(String const& path) {
} else if (first.equals("head")) {
outputSheet = false;
assetPath.basePath = humanoid->getHeadFromIdentity();
+ assetPath.subPath = String("normal");
assetPath.directives += identity.bodyDirectives;
} else if (first.equals("hair")) {
outputSheet = false;
assetPath.basePath = humanoid->getHairFromIdentity();
+ assetPath.subPath = String("normal");
assetPath.directives += identity.hairDirectives;
} else if (first.equals("facialhair")) {
outputSheet = false;
assetPath.basePath = humanoid->getFacialHairFromIdentity();
+ assetPath.subPath = String("normal");
assetPath.directives += identity.facialHairDirectives;
} else if (first.equals("facialmask")) {
outputSheet = false;
assetPath.basePath = humanoid->getFacialMaskFromIdentity();
+ assetPath.subPath = String("normal");
assetPath.directives += identity.facialMaskDirectives;
} else if (first.equals("frontarm")) {
assetPath.basePath = humanoid->getFrontArmFromIdentity();
@@ -531,11 +535,9 @@ String ClientCommandProcessor::render(String const& path) {
assetPath.basePath = humanoid->getFacialEmotesFromIdentity();
assetPath.directives += identity.emoteDirectives;
} else {
+ outputSheet = false;
outputName = "render";
}
-
- if (!outputSheet)
- assetPath.subPath = String("normal");
}
if (assetPath == AssetPath()) {
assetPath = AssetPath::split(path);
@@ -550,9 +552,9 @@ String ClientCommandProcessor::render(String const& path) {
AssetPath framePath = assetPath;
StringMap<pair<RectU, ImageConstPtr>> frames;
- auto imageFrames = assets->imageFrames(assetPath.basePath);
- for (auto& pair : imageFrames->frames)
- frames[pair.first] = make_pair(pair.second, ImageConstPtr());
+ if (auto imageFrames = assets->imageFrames(assetPath.basePath))
+ for (auto& pair : imageFrames->frames)
+ frames[pair.first] = make_pair(pair.second, ImageConstPtr());
if (frames.empty())
return "^red;Failed to save image^reset;";
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;
};
}