mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 19:03:43 +00:00
feat: UGC server that makes and serves player models' meshes and icons
A new server (dUgcServer, started by master with enable_ugc_server=1) that takes unprocessed ugc and ugc_modular_build rows from the database and makes what the client downloads with UGCUSE3DSERVICES: an optimized NIF (hidden faces removed, ambient occlusion baked into vertex colors) and a 128px DDS icon for player models, rendered by a software rasterizer from the client's LDD brick primitives, and icons for cars and rockets assembled from their modules per ModularBuildComponent/ModuleComponent. It serves them, with the models' LXFML, over HTTP in the client's UGCC<dc>/3DOPTIMIZED and IMAGE128DDS layout with .gz and .checksum files, and keeps its folder under a size cap. Processing state lives in ugc.is_optimized plus new processed_at, process_attempts and process_error columns (and the same on ugc_modular_build). ServiceType::UGC is appended. NifFile moves to dCommon and records named node transforms for the modules' attach points. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -143,6 +143,42 @@ uint32_t StartDashboardServer() {
|
||||
return web_pid;
|
||||
}
|
||||
|
||||
uint32_t StartUgcServer() {
|
||||
if (Game::ShouldShutdown()) {
|
||||
LOG("Currently shutting down. UgcServer will not be restarted.");
|
||||
return 0;
|
||||
}
|
||||
auto ugc_path = BinaryPathFinder::GetBinaryDir() / "UgcServer";
|
||||
#ifdef _WIN32
|
||||
ugc_path.replace_extension(".exe");
|
||||
auto ugc_startup = startup;
|
||||
auto ugc_info = PROCESS_INFORMATION{};
|
||||
if (!CreateProcessW(ugc_path.wstring().data(), ugc_path.wstring().data(),
|
||||
nullptr, nullptr, false, 0, nullptr, nullptr,
|
||||
&ugc_startup, &ugc_info))
|
||||
{
|
||||
LOG("Failed to launch UgcServer");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// get pid and close unused handles
|
||||
auto ugc_pid = ugc_info.dwProcessId;
|
||||
CloseHandle(ugc_info.hProcess);
|
||||
CloseHandle(ugc_info.hThread);
|
||||
#else // *nix systems
|
||||
const auto ugc_pid = fork();
|
||||
if (ugc_pid < 0) {
|
||||
LOG("Failed to launch UgcServer");
|
||||
return 0;
|
||||
} else if (ugc_pid == 0) {
|
||||
// We are the child process
|
||||
execl(ugc_path.string().c_str(), ugc_path.string().c_str(), nullptr);
|
||||
}
|
||||
#endif
|
||||
LOG("UgcServer PID is %d", ugc_pid);
|
||||
return ugc_pid;
|
||||
}
|
||||
|
||||
uint32_t StartWorldServer(LWOMAPID mapID, uint16_t port, LWOINSTANCEID lastInstanceID, int maxPlayers, LWOCLONEID cloneID) {
|
||||
auto world_path = BinaryPathFinder::GetBinaryDir() / "WorldServer";
|
||||
#ifdef _WIN32
|
||||
|
||||
Reference in New Issue
Block a user