diff --git a/src/index.js b/src/index.js index b9d6f0b..d54d5bb 100644 --- a/src/index.js +++ b/src/index.js @@ -24,6 +24,7 @@ app.use("/render/game", require("./routes/render/game.js")) app.use("/render/texture", require("./routes/render/texture.js")) app.use("/render/user", require("./routes/render/user.js")) app.use("/render/texture", require("./routes/render/texture.js")) +app.use("/render/clothing", require("./routes/render/clothing.js")) app.use("*", require("./routes/index.js")) diff --git a/src/lib/classes/RenderJob.js b/src/lib/classes/RenderJob.js index 0d14dd3..18dc895 100644 --- a/src/lib/classes/RenderJob.js +++ b/src/lib/classes/RenderJob.js @@ -213,6 +213,48 @@ class RenderJob extends Job { if (!result) return false return result[0]?.OpenJobExResult?.LuaValue[0]?.value } + + async RenderClothing(id, three_d = false) { + this.id = randomUUID() + + const running = this.started + if (!running) { + const started = await this.Start() + if (!started) throw new Error("RCCService failed to start") + } + + if (!this.client) await this.CreateClient() + + if (three_d) logger.info(`${chalk.gray(`${chalk.gray(`[${this.id}]`)}`)} 3D Asset RenderJob started for ${id}`) + else logger.info(`${chalk.gray(`${chalk.gray(`[${this.id}]`)}`)} Asset RenderJob started for ${id}`) + + const result = await this.OpenJobEx({ + name: this.id, + script: await readFile(__dirname + "/../../lua/clothing.lua", { encoding: "utf-8" }), + arguments: { + LuaValue: [ + { type: "LUA_TSTRING", value: this.id }, + + { type: "LUA_TSTRING", value: "Clothing" }, + { type: "LUA_TSTRING", value: three_d ? "OBJ" : "PNG" }, + + { type: "LUA_TNUMBER", value: process.env.RENDER_ASSET_WIDTH }, + { type: "LUA_TNUMBER", value: process.env.RENDER_ASSET_HEIGHT }, + + { type: "LUA_TSTRING", value: process.env.BASE_URL }, + { type: "LUA_TNUMBER", value: id }, + ], + }, + }).catch((e) => false) + + if (three_d) logger.info(`${chalk.gray(`${chalk.gray(`[${this.id}]`)}`)} 3D Asset RenderJob finished for ${id}`) + else logger.info(`${chalk.gray(`${chalk.gray(`[${this.id}]`)}`)} Asset RenderJob finished for ${id}`) + + this.Stop() + + if (!result) return false + return result[0]?.OpenJobExResult?.LuaValue[0]?.value + } } module.exports = RenderJob diff --git a/src/lua/clothing.lua b/src/lua/clothing.lua new file mode 100644 index 0000000..5822030 --- /dev/null +++ b/src/lua/clothing.lua @@ -0,0 +1,24 @@ +local jobId, type, format, x, y, baseUrl, assetId = ... + +print(("[%s] Started RenderJob for type '%s' with assetId %d"):format(jobId, type, assetId)) + +game:GetService("ScriptInformationProvider"):SetAssetUrl(baseUrl .. "/asset/") +game:GetService("InsertService"):SetAssetUrl(baseUrl .. "/asset/?id=%d") +game:GetService("InsertService"):SetAssetVersionUrl(baseUrl .. "/Asset/?assetversionid=%d") +game:GetService("ContentProvider"):SetBaseUrl(baseUrl) +game:GetService("ScriptContext").ScriptsDisabled = true + +local Player = game.Players:CreateLocalPlayer(0) +Player.CharacterAppearance = ("%s/thumbnail/clothingcharapp/%d"):format(baseUrl, assetId) +Player:LoadCharacter(false) + +game:GetService("RunService"):Run() + +Player.Character.Animate.Disabled = true +Player.Character.Torso.Anchored = true + +print(("[%s] Rendering ..."):format(jobId)) +local result = game:GetService("ThumbnailGenerator"):Click(format, x, y, true) +print(("[%s] Done!"):format(jobId)) + +return result \ No newline at end of file diff --git a/src/routes/render/clothing.js b/src/routes/render/clothing.js new file mode 100644 index 0000000..1ffe37c --- /dev/null +++ b/src/routes/render/clothing.js @@ -0,0 +1,26 @@ +const express = require("express") +const app = express.Router() + +const RenderJob = require("../../lib/classes/RenderJob.js") + +app.get("/:id", async (request, response) => { + const { params, query } = request + const job = new RenderJob() + + const asset = await job.RenderClothing(params.id).catch((_) => _) + if (asset?.message) return response.status(500).json({ error: asset.message }) + + return response.end(asset) +}) + +app.get("/:id/3d", async (request, response) => { + const { params, query } = request + const job = new RenderJob() + + const three_d = await job.RenderClothing(params.id, true).catch((_) => _) + if (three_d?.message) return response.status(500).json({ error: three_d.message }) + + return response.json(JSON.parse(three_d)) +}) + +module.exports = app