Why is there a need to update IDs? First accounts IDs and now assets.
how does one of these asset ids look like?
Many reasons, including leak accounts abusing it to leak events and partnerships
I’m surprised this took this long given this was a massive security risk beforehand.
While I support this change,
can we PLEASE have an API to get an image from a texture-based asset
because otherwise every hack we’ve come up with will break with this update.
Most players don’t know the difference between the image and decal IDs. Not everyone is a developer. Having to explain the instructions of getting the image id should not be the way this is done.
Are there any plans to stop creating decal assets, especially since the decal instance expects an image id, not a decal id, making the decal web asset rather redundant.
It seems rather wasteful to take up two asset ids for every image uploaded to the site, with one asset being completely useless — even if the maximum asset id limit is never reached.
This, unfortunately, isn’t easy to do. Getting an image ID from a decal ID isn’t something you can easily instruct players to do. It also requires players to know the difference between decals and images in the first-place which isn’t something all players (and seemingly even some developers given that Studio has the ability to do automatic conversion for it) understand fully.
As far as I know, iterating over IDs has never been the process for this? Instead, there are some other APIs that are used to get these IDs, and hence, that would be mostly unaffected by this? Perhaps I’m wrong, and this is the process?
Not at all. If you insert the Decal using InsertService, you can pull its image ID from the Decal’s Texture.
local MarketplaceService = game:GetService("MarketplaceService")
local InsertService = game:GetService("InsertService")
local assetCacheMap = {}
local function getImageId(contentId: number)
if assetCacheMap[contentId] then
return assetCacheMap[contentId]
end
local productInfo = MarketplaceService:GetProductInfo(contentId)
if productInfo.AssetTypeId == 1 then
assetCacheMap[contentId] = contentId
return contentId
end
if productInfo.AssetTypeId ~= 13 then
error("Not a valid Decal or Image ID")
end
local model = InsertService:LoadAsset(contentId)
local decal = model:FindFirstChildWhichIsA("Decal")
if not decal then
model:Destroy()
model = nil
error(`Failed to insert Decal<{contentId}>`)
end
local textureId = tonumber(decal.Texture:match("(%d+)$"))
model:Destroy()
model = nil
if not textureId then
error(`Something went wrong with Decal<{contentId}>`)
end
assetCacheMap[contentId] = textureId
return textureId
end
return getImageId
if anyones wondering how to get an image id from decals
https://assetdelivery.roblox.com/v1/asset?id=PASTEIDHERE
open the file it downloads with notepad or something and it should be there
This does not work for decals you dont own, and you cant do it on the client.
RE the decal → image ID trick:
We’re aware of this consideration. While this may have been an issue in the past when it was just id minus 1 or 2, we evaluated that it’s unlikely to be an issue now: The gap between image and decal id has grown so large that it doesn’t seem feasible to use this trick in practice.
If you’re aware of some tool / place which actually still does this let us know. We double checked with some obvious candidates and they use other techniques, not ID guessing.
Is it feasible to share some of those methods with us
I’ve seen a method floating around that involves pinging MarketplaceService.GetProductInfo
loads of times until ID - n
hits a match on the image creator and name.
I’m surprised this works given that GetProductInfo surely has a rate limit.
i bet the api enpoint for product info enjoys this
While this works for manual cases, it is unfortunately infeasible for many cases mentioned in this thread:
-
In terms of automation, it is currently impossible to make a request to a Roblox domain so developers without a proxy can not use this. Using a public proxy comes with the risks of using a public proxy.
-
Asking players to do this themselves is infeasible as many may be on mobile, which doesn’t have the ability to open the returned files.
Despite it obviously not being ideal, this is still a method regularly used by creators around the platform and is the best suggestion to give to someone who doesn’t have their own proxy to use.
This is the process. It will affect them a lot.
Do you have any specific example though? This is what we were worried about but as I noted above, some of the obvious candidates aren’t actually doing that.
Does this apply to user ids for new players?
Highly appreciated change, particularly with the recent revival of official Roblox events; sucks to see things get leaked super early on, leading to speculation and possible let down.
A bit unfortunate that you’re either having to trust an unknown third party proxy (which could go down any time, without notice), or figure things out yourself for such a silly problem.
I also wonder how impacted current methods will be if more stringent asset privacy features are rolled out, limiting the ability to parse the XML from assetdelivery.
Given Roblox Studio is capable of converting a Decal ID to Image ID, I imagine that code is not that far away from being put into something like AssetService:GetDecalImageAsync(...)
or even rbxassetid://
working with Decal IDs and translating them to the proper Image asset.
I won’t pretend to understand reasons why there may be resistance to this, but it doesn’t seem that crazy to lend a hand here instead of leaving developers to do crazy external requests to get an image.
This benefits nobody but bad actors hiding their files