91 lines
2.0 KiB
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
|