SyntaxGameServer/RCCService2020/internalscripts/thumbnails/modules/BundleLoader.lua

128 lines
3.6 KiB
Lua

local BundleLoader = {}
local AssetService = game:GetService("AssetService")
local ThumbnailGenerator = game:GetService("ThumbnailGenerator")
local MannequinUtility = require(ThumbnailGenerator:GetThumbnailModule("MannequinUtility"))
local ScaleUtility = require(ThumbnailGenerator:GetThumbnailModule("ScaleUtility"))
local ARTIST_INTENT_FOLDER = "R15ArtistIntent"
local ASSET_URL = "asset/?id="
local function constructAssetUrl(baseUrl, assetId)
return baseUrl ..ASSET_URL.. tostring(assetId)
end
function BundleLoader.LoadBundleAssets(baseUrl, bundleId)
local bundleInfo = AssetService:GetBundleDetailsSync(bundleId)
local contentIdsList = {}
for _, itemInfo in pairs(bundleInfo.Items) do
if itemInfo.Type == "Asset" then
local assetId = itemInfo.Id
local assetUrl = constructAssetUrl(baseUrl, assetId)
contentIdsList[#contentIdsList + 1] = assetUrl
end
end
local objectsList = game:GetObjectsList(contentIdsList)
local results = {}
for _, objects in pairs(objectsList) do
local assetFolder = Instance.new("Folder")
for _, object in pairs(objects) do
object.Parent = assetFolder
end
results[#results + 1] = assetFolder
end
return results
end
local function addPartsToCharacter(character, folder)
for _, part in pairs(folder:GetChildren()) do
local existingPart = character:FindFirstChild(part.Name)
part.Parent = character
if existingPart then
existingPart:Destroy()
end
end
end
local function addMeshHeadToCharacter(character, mesh)
local head = character:FindFirstChild("Head")
if not head then
return
end
local existingMesh = head:FindFirstChild("Mesh")
if existingMesh then
existingMesh:Destroy()
end
for _, child in pairs(mesh:GetChildren()) do
if child:IsA("Vector3Value") and string.find(child.Name, "Attachment") then
local attachment = head:FindFirstChild(child.Name)
if not attachment then
attachment = Instance.new("Attachment")
end
attachment.Name = child.Name
attachment.Position = child.Value
attachment.Parent = head
end
end
mesh.Parent = head
end
local function addFaceToCharacter(character, face)
local head = character:FindFirstChild("Head")
if not head then
return
end
local existingFace = head:FindFirstChild("face")
if existingFace then
existingFace:Destroy()
end
face.Parent = head
end
function BundleLoader.LoadBundleCharacter(baseUrl, bundleId)
local bundleAssets = BundleLoader.LoadBundleAssets(baseUrl, bundleId)
local character = MannequinUtility.LoadR15Mannequin()
local scaleType = ScaleUtility.GetObjectsScaleType(bundleAssets)
for _, loadedAsset in pairs(bundleAssets) do
for _, item in pairs(loadedAsset:GetChildren()) do
if item:IsA("Folder") and item.Name == ARTIST_INTENT_FOLDER then
addPartsToCharacter(character, item)
elseif not item:IsA("Folder") then
if item:IsA("DataModelMesh") then
addMeshHeadToCharacter(character, item)
elseif item:IsA("Decal") then
addFaceToCharacter(character, item)
else
item.Parent = character
end
end
end
end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if humanoid then
ScaleUtility.CreateProportionScaleValues(humanoid, scaleType)
humanoid:BuildRigFromAttachments()
end
return character
end
return BundleLoader