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