FireClickDetector and FireProximityPrompt Exploit Detection

Hi, while browsing my pc files i founded a funny script that i made around 5 mounth ago and so today i will share and explain how it work with you ^^

I do not encourage exploiting or anything related to it even tho i found them funny with the level of acces and the abilities of them and the creativity people can get with them. (I love to see impresive stuff maked with exploit that dont ruin players experience)

ModuleScript Library here : Cool Detection - Roblox

In every script executors there are some customs functions that allow you to do stuffs and sometimes you can detect them

Those Two detection are indeed Serversided

Anti FireClick Click Detector

  • How it work

There are events fired on the instance of the ClickDetector and two of them are pretty cool and let us know when someone is Hovering the ClickDetector.
And so we just check if the player is/was Hovering the ClickDetector after firing it and if they dont wich happen when they use the fireclickdetector function it fire the callback

  • The exploiter script
fireclickdetector(workspace.Part.ClickDetector)
  • The way to Detect/Patch it
_G.AntiFireClickDetector = function(ClickDetector:instance, CallBack)
	if typeof(ClickDetector) == "Instance" then
		if ClickDetector:IsA("ClickDetector") then
			local Holding = {} -- to store players
			ClickDetector.MouseHoverEnter:Connect(function(plr)
				Holding[plr.Name] = true
			end)
			ClickDetector.MouseHoverLeave:Connect(function(plr)
				task.wait() -- otherwise it will instan kick
				Holding[plr.Name] = false
			end)

			ClickDetector.MouseClick:Connect(function(plr)
				if not Holding[plr.Name] then 
					CallBack(plr)
				end
			end)
		end
	end
end
  • In Another Script
repeat task.wait() until _G.AntiFireClickDetector ~= nil
_G.AntiFireClickDetector(script.Parent, function(plr)
	plr:kick("exploit detected : fireclickdetector")
end)
  • Using a module script (With the library) :
local module = require(<ModuleScript>)
module:AntiFireClickDetector(script.Parent, function(plr)
	plr:kick("exploit detected : fireclickdetector")
end)

ă…¤

Anti FireProximityPrompt

  • How it work

There are events fired on the instance of the ProximityPrompt and two of them are pretty cool and let us know when someone is holding the ProximityPrompt.
And so we just check if the player was holding the proximityprompt after firing it and if they dont wich happen when they use the fireproximityprompt function it fire the callback

  • The exploiter script
fireproximityprompt(workspace.Part.ProximityPrompt)
  • The way to Detect/Patch it
local function CanDetect(proximityprompt) -- yes cuz it wont work on proximity prompt that are instant xd
	if proximityprompt.HoldDuration >= 0.1 then
		proximityprompt:SetAttribute("IsSecurised", true)
	else
		proximityprompt:SetAttribute("IsSecurised", false)
	end
end
_G.AntiFireProximityPrompt = function(proximityPrompt, Callback)
	if typeof(proximityPrompt) == "Instance" then
		if proximityPrompt:IsA("ProximityPrompt") then	
			CanDetect(proximityPrompt)
			local Holding = {} -- to store players
			proximityPrompt.PromptButtonHoldBegan:Connect(function(plr)
				table.insert(Holding, plr.Name)
			end)
			proximityPrompt.PromptButtonHoldEnded:Connect(function(plr)
				task.wait() -- yes otherwise it will insta kick
				Holding[table.find(Holding, plr.Name)] = nil
			end)

			proximityPrompt.Triggered:Connect(function(plr)
				if proximityPrompt:GetAttribute("IsSecurised") == true then
					if not table.find(Holding, plr.Name) then
						Callback(plr)
					end
				end
			end)
			proximityPrompt:GetPropertyChangedSignal("HoldDuration"):Connect(function()
				CanDetect(proximityPrompt)
			end) -- yes in case it change :p
		end
	end
end
  • In Another Script
repeat task.wait() until _G.AntiFireProximityPrompt ~= nil
_G.AntiFireProximityPrompt(script.Parent, function(plr)
	plr:kick("exploit detected : fireproximityprompt")
end)
  • Using a module script (With the library) :
local module = require(<ModuleScript>)
module:AntiFireProximityPrompt(script.Parent, function(plr)
	plr:kick("exploit detected : fireproximityprompt")
end)

Thanks for reading everything if you did it (hopefully you did it :slight_smile:

  • Honorable mension to @HlAMBACK he helped me fix my script and have a good AntiExploit (RoGuard)
7 Likes

Sadly, both of your scripts can get bypassed in seconds, exploiters got access to firesignal() which allows them to fire those events u use to check that. Instead what you want to do is Magnitude checks so they cant fire it being 5000 studs away.

Its not like everyone use firesignal for it anyway, ill check if i can detect it ^^

Hey, i come back to say that no it doesnt replicate and good for me, it doesnt get bypassed : p

1 Like

This still wouldn’t detect if an object is teleported near the player and the player clicks it manually or moves the mouse and grabs it as a player would. Therefore, a range/magnitude check should be added. This still doesn’t prevent the exploiter from using Roblox’s humanoid move-to functions.

firesignal(Prompt.PromptButtonHoldBegan)
fireproximityprompt(Prompt)

My script only detect fireproximityprompt and fireclickdetector not Magnitude just look at it…
and if oyu want it just do it yourself there are plenty of that forum.

thats the same script that my friend executed and it still doesnt replicate i already told you, do you want him to record his whole screen for you to understand ?

I can literally see that your “friend” got 2nd line empty, ofc it wont do anything


he executed this

I am just trying to give feedback. However, using move-to or tween cannot be fully detected, which slows down and makes exploiting less optimal. Exploiters will still use these methods, but with this resource, they will not be able to constantly server hop and activate the click detector or proximity prompt. Despite this, the methods mentioned can still be bypassed, and there may be other ways to do so as well. Anti-cheat is a perpetual problem, and the more people working on it, the better it will become. This resource can be beneficial for the community and for individuals who may not understand that adding a remote that can remove anything from the map is not a good idea.

And uhm how can it be bypassed ?

Things I said before, and possibly other things that I am unaware of, may lead to a workaround with the MouseHoverEnter event firing, or even something worse.

Tested with all the signals and it does still detect (firesignal isnt replicated when there is no NetworkOwnership on the client)

You could have made both of these scripts way simpler .
I would have added an extra layer to detect who is firing it but this is for learning and example so, yea.

task.wait(1) -- Server Init

-- > Declarations < --

local Debouncing = false

-- > Security Check < --
-- Could add an extra layer to make sure no false pos is to make a table for the player currently running said prompt
script.Parent.PromptButtonHoldBegan:Connect(function() -- Most exploits don't run this
	task.wait(script.Parent.HoldDuration - .1)
	Debouncing = true
end)

script.Parent.PromptButtonHoldEnded:Connect(function() -- Most exploits don't run this either
	task.wait(.1)
	Debouncing = false
end)

-- > Proximity Prompt Trigger < --

script.Parent.Triggered:Connect(function(player)
	if Debouncing then
		print('Ran from server!') -- Test
	else -- I wouldn't kick, but you can.
		player:Kick('BAC - You have been Banned @ [' .. os.date() .. '] ! Alpha-3B | Tampering with ProximityPrompts.') -- Test
	end
end)

and for Click Detector

-- > Declarations < --

local Entered

-- > Functions() < --

script.Parent.MouseHoverEnter:Connect(function()	
	Entered = true
end)
script.Parent.MouseHoverLeave:Connect(function()
	Entered = false
end)
-- Detector Part / Adds a Magnitude Detection also
script.Parent.MouseClick:Connect(function(player)
	if player.Character and player.Character:FindFirstChild("HumanoidRootPart") and (script.Parent.Parent.Position - player.Character.HumanoidRootPart.Position).Magnitude < script.Parent.MaxActivationDistance + 3 then
		if Entered then
			print('Player Pressed From Server!')
		else
			player:Kick("[BAC] : You have been Banned! @ " .. tostring(os.date()) .. " | Attempting to run ClickDetector from illegal executor!");
		end
	end
	if (script.Parent.Parent.Position - player.Character.HumanoidRootPart.Position).Magnitude > script.Parent.MaxActivationDistance + 5 then
		player:Kick("[BAC] : You have been Banned! @ " .. tostring(os.date()) .. " | Attempting to Run ClickDetector from illegal distance!");
	end
end)


1 Like

Also, you can detect firetouchinterest by getting the touching parts of it and checking if its nil. As exploits usually don’t add that extra bit of protection. (I would also add a Magnitude check on the TouchTransmitter). I knew it was about time someone wanna gonna release stuff like this so why not let the rest of the cats out the bag?

I myself made an anti-exploit for these two objects and you can find it in the link below. Yet, mine only checks for distance on ClickDetectors (on ProximityPrompt I don’t check since it doesn’t seem to trigger if you increase the distance from the client) and for ProximityPrompt it checks if is enabled.

The anti-exploit will also prevent dead players or players that are missing things like the Humanoid to trigger them, as many times the developer could interact with the player’s character.

Link: Anti-Exploit for ClickDetectors and ProximityPrompts

I found a bypass
In a server script:

  script.Parent.ClickDetector.MouseHoverEnter:Connect(function()
     print("Hovering")
  end)

In a local script:

local part = workspace.Coin --The BasePart with the click detector

workspace.CurrentCamera.FieldOfView = 1

workspace.CurrentCamera.CameraSubject = part

part.ClickDetector.MaxActivationDistance = math.huge

repeat workspace.CurrentCamera.CameraType = Enum.CameraType.Custom; task.wait(.1) until workspace.CurrentCamera.CameraType == Enum.CameraType.Custom -- Repeats are there to fix a bug. My camera type is fixed, even if I delete this script for some reason.

repeat workspace.CurrentCamera.CameraSubject = part; task.wait(.1) until workspace.CurrentCamera.CameraSubject == part

Output:

Not everyone will, but you can use metatables to make it appear as if MaxActivationDistance never changed, and change the camera subject to the next coin

Edit: I had this idea yesterday but had to sleep.

Imma just make a whole anticheat tbh, see you in 2 mounth or so ^^

  • ill fix this bypass thanks for sharing

Is this really a very reliable anti-cheat?