Super-Nostalgia-Zone/Shared/ReplicatedStorage/AssetUtil.lua

78 lines
1.9 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