How can I filter out Female Chest UGCs?

Roblox already filters out any inappropriate UGC’s, but if you insist, you could raycast to see if there are any rounded shapes in the front, if there are, remove the accessory from the player.

1 Like

This is not always the case, you can see many inappropriate UGC’s slipping through the cracks and reporting doesn’t seem to change much.

1 Like

You should try using shapecast or maybe a hitbox infront of the chest area and if it collides with an accessory then, destroy that accessory. Could work? :man_shrugging:

3 Likes

I’ll try to make a script out of this idea

1 Like

This is a very problematic thing in roblox and it is very dissapointed it doesn’t get moderated as it should. My younger cousins play Roblox and I am sick of them joining games and keep seeing stuff like this :confused:

I believe Nikilis uploaded a script to remove accessories with a certain ID back when “tonks” and bushes were a thing. If it still works to this day you could use it.

2 Likes

Just check if a users accessories has some keywords like “woman”, “chest”, “3.0”, “shirt”, “top”, “1.0”, and remove them.

2 Likes

If it did then this monstrosity wouldn’t exist.

Tight White Crop Top - Roblox warning: inappropriate

Search any one of the words I listed above and you will be met with horrendously inappropriate outfits that oh my god is absolutely insane and it makes my brains vein pop.

3 Likes

I see no obvious easy solution to this. There’s always going to be false positives with whatever method you choose.

What you said here is probably the best:

My recomendation however is to forget about it and move onto something else. I think its more beneficial to allocate more resources into developing the main crux of your game.

2 Likes

Failed completely just because I can’t detect layered clothing because layered clothing is actually on top of the character not where it is on the character.

Okay, so. Just got back from the gym and made whatever this abomination is:
NOTE THIS DOESN’T WORK WITH LAYERED CLOTHING

local test_list = {Enum.AccessoryType.Back,Enum.AccessoryType.Front,Enum.AccessoryType.Unknown}

local min_accuracy = 0.8

local ray_params = RaycastParams.new()
ray_params.FilterType = Enum.RaycastFilterType.Include

for _,child in pairs(script.Parent.Victim:GetChildren()) do
	if child:IsA("Accessory") then
		test = false
		for _,acc_type in pairs(test_list) do
			if child.AccessoryType == acc_type then
				test = true
			end
		end
		if test then
			local fake_accessory = game:GetService("AssetService"):CreateMeshPartAsync(child.Handle.SpecialMesh.MeshId)
			fake_accessory.Name = "FakeAccessory"
			fake_accessory.Anchored = true
			fake_accessory.Parent = workspace
			fake_accessory.CFrame = script.Parent.FakeTorso.CFrame*script.Parent.Victim.Torso.CFrame:ToObjectSpace(child.Handle.CFrame)
			
			ray_params.FilterDescendantsInstances = {fake_accessory}
			
			local rays_hit = 0
			local rays_not_hit = 0
			local rays_should_have_hit = 0
			local rays_should_not_have_hit = 0
			
			for _,attachment in pairs(script.Parent.FakeTorso:GetChildren()) do
				local new_ray = workspace:Raycast(attachment.WorldPosition,attachment.WorldCFrame.LookVector,ray_params)
				if attachment.Name == "True" then
					rays_should_have_hit += 1
					if new_ray then
						print("W")
						rays_hit += 1
					end
				elseif attachment.Name == "False" then
					rays_should_not_have_hit += 1
					if not new_ray then
						rays_not_hit += 1
					end
				end
			end
			
			local precent = (rays_hit+rays_not_hit)/(rays_should_have_hit+rays_should_not_have_hit)
			
			if precent > min_accuracy then
				print(child.Name.." CONFIDENCE:"..tostring(math.round(precent*100)).."%")
			end
			
			fake_accessory:Destroy()
		end
	end
end

I create a “fake accessory” using MeshPart, which allows me to check if it’s a certain shape.
Obviously, knowing that not all Chest accessories are the same shape, we use a “minimum confidence” variable, which I found that a 0.8/80% works good for both 1.0 and 3.0 Chests. Granted, I’ll have to make a large scale test to check how much of the accessories it detects later.

1 Like

I made this thing in response to this post like an hour ago based off some other avatar related shenanigans i was doing a while ago:

local blacklistcreators = {"."}--Defaults filter everything.
local blacklistnames = {"."}
local blacklistdescriptors = {"."}
local function maincheck(info)
	local val = false
	local splitname = string.split(info["Name"],"%s%p")
	for r = 1, #splitname do
		for t = 1, #blacklistnames do
			if string.match(splitname[r],blacklistnames[t]) then
				val = true
			end
		end
	end
	for t = 1, #blacklistcreators do
		if string.match(info["Creator"]["Name"],blacklistcreators[t]) then
			val = true
		end
	end
	local splitdescription = string.split(info["Description"],"%s%p")
	for r = 1, #splitdescription do
		for t = 1, #blacklistdescriptors do
			if string.match(splitdescription[r],blacklistdescriptors[t]) then
				val = true
			end
		end
	end
	return val
end
local plydesc = script.Parent:WaitForChild("Humanoid"):WaitForChild("HumanoidDescription")
if tonumber(plydesc.Torso) and tonumber(plydesc.Torso) ~= 0 and maincheck(game:GetService("MarketplaceService"):GetProductInfo(tonumber(plydesc.Torso))) == true then
	plydesc.Torso = "0"
end
if tonumber(plydesc.Pants) and tonumber(plydesc.Pants) ~= 0 and maincheck(game:GetService("MarketplaceService"):GetProductInfo(tonumber(plydesc.Pants))) == true then
	plydesc.Pants = "14862393678" -- This id is just a random image i uploaded for a custom reflection cubemaps test.
end
if tonumber(plydesc.Shirt) and tonumber(plydesc.Shirt) ~= 0 and maincheck(game:GetService("MarketplaceService"):GetProductInfo(tonumber(plydesc.Shirt))) == true then
	plydesc.Shirt = "14858194613" -- same as other one
end
task.wait(0.05)--Extra wait to make sure the AccessoryDescriptions have loaded in.
local extradescs = plydesc:GetChildren()
for i = 1, #extradescs do
	if extradescs[i].ClassName == "AccessoryDescription" and maincheck(game:GetService("MarketplaceService"):GetProductInfo(tonumber(extradescs[i].AssetId))) == true then
		extradescs[i]:Destroy()
	end
end
script.Parent.Humanoid:ApplyDescriptionReset(plydesc)

Works with layered clothing, 2d clothing, accessories and torsos doesnt do anything with the shape though, You put it in StarterCharacterScripts as a script(RunContext: server or Legacy).

1 Like

Might be a bit too many attachments, but this is the system that I’ve decided on.
I use a singular raycast per attachment that is parallel to the torso that are in the shape of a chest.
I am not sure how many false positives this system may give with the “is air” and “is filled” system.
MUST BE AIR:
image
MUST BE FILLED:
image
BOTH:
image

1 Like

Here’s the final result of a slightly bigger test I did with a few different kinds of front accessories.
RESULTS:


ACCESSORIES USED:

As you can see, the system works surprisingly well once tweaked to work as necessary.
And it doesn’t limit you from only doing side checks eithers, since it uses the direction of the attachment! Of course, you still have to consider the performance impact, although I doubt that doing one check every time a character changes should cost too much. Especially since this is only done on Front, Back and Unknown accessories.

2 Likes

if you guys are so bothered about this. probs the best thing to do would be to use Pythonanywhere to create our own API, this would allow for 2 interaction - 1: submit asset id fro blacklisting, and 2 check where an item id is blacklisted.
I def could def put this together for you for free, but hostings costs would cost about $5 a month.
so basically when a player join you get all the asset ides for their stuff send them to pythonanywhere server and it tell you if someone has marked them to be blacklisted.

1 Like

Don’t know if anyone’s said this yet but the best way to make sure this doesn’t happen is to put a custom character creator in your game. A lot of people don’t like doing this for obvious reasons but unfortunately it’s the only way to totally control what people wear in your game.

If you don’t want to go full nuclear, you can have a script check a user’s hats and only remove items that are not uploaded by Roblox. However since everyone wears UGC now it’s likely to cause a lot of confusion and upset your players.

I’ve decided that I’d probably prefer this to be community driven.
To be more exact, players are able to submit inappropriate UGC items and using some sort of online hosted API the suggestions are sent to a select few moderators and they may either accept them or decline them, making so that we both avoid having false-positives using other methods and that we are able to blacklist a lot more inappropriate UGC items than just Chests.
If anyone is interested in helping with this I’d be glad to take suggestions, but ultimately, this is the approach I want to take. If roblox won’t moderate it’s platform, as developers, I feel like we should do something about it instead.

to be honest, the simplest method/s would be to let players decide if they want to see front/back accessories or just disable front/back accessories entirely

i doubt anyone would want to actively moderate some roblox melon reports