Super-Nostalgia-Zone/Shared/AssetUtil.lua

91 lines
2.0 KiB
Lua

local MarketplaceService = game:GetService("MarketplaceService")
local InsertService = game:GetService("InsertService")
local AssetUtil =
{
TextureCache = {};
NUM_FETCH_RETRIES = 4;
}
local assetTypes = {}
for _,assetType in pairs(Enum.AssetType:GetEnumItems()) do
assetTypes[assetType.Value] = assetType.Name
end
function AssetUtil:SafeCall(class, method, ...)
local success, response
local tries = 0
while not success do
success, response = pcall(class[method], class, ...)
if not success then
if response:find("400") then
success = true
response = false
else
tries = tries + 1
if tries > self.NUM_FETCH_RETRIES then
return false
end
end
end
end
return success, response
end
function AssetUtil:Import(assetId)
local success, model = self:SafeCall(InsertService, "LoadAsset", assetId)
if success then
local objects = model:GetChildren()
return true, unpack(objects)
end
return false
end
function AssetUtil:RequestImage(assetId)
assert(typeof(assetId) == "number")
assert(assetId == math.floor(assetId))
assert(assetId > 0)
if self.TextureCache[assetId] == nil then
local success, response = self:SafeCall(MarketplaceService, "GetProductInfo", assetId)
if success then
local result
if response then
local assetType = assetTypes[response.AssetTypeId]
if assetType == "Image" then -- No transformation needed!
result = "rbxassetid://" .. assetId
elseif assetType == "TeeShirt" then
local imported, shirtGraphic = self:Import(assetId)
if imported then
result = shirtGraphic.Graphic
end
elseif assetType == "Decal" or assetType == "Face" then
local imported, decal = self:Import(assetId)
if imported then
result = decal.Texture
end
end
else
result = ""
end
self.TextureCache[assetId] = result
end
end
return true, self.TextureCache[assetId]
end
return AssetUtil