Yes! You finally learnt how to use Filtering Enabled now! But an issue exploiters can fire those remote events now. How can you stop that? Well, this tutorial is supposed to teach you how to protect your remote events.
A very easy method is making the server check for requirements example:
A buy button is clicked and it fires a remote. Instead of the local script checking for the requirements you make the server check the requirements instead. This can stop many exploits.
Use passwords on your remotes. The client will fire with an extra argument with the password Example:
remoteEvent:FireServer("Argument 1", "Argument 2", "PASSWORD HERE")
remoteEvent.OnServerEvent:Connect(function(arg1, arg2, password) if password=="PASSWORD HERE" then -- code here end end)
Hide your remotes. This is probably a last ditch effort but hiding your remotes so exploiters cannot find it or access it. There are various methods of hiding remotes that I do not know as of YET.
A remote spy is a local script that an exploiter runs to access all remote events arguments when fired. This can be used to detect passwords or understand how a remote would work so they can fire them without any errors or exploit detection.
A client is the player's Roblox window/application. Everything on the client cannot replicate over to the server unless they used remote events.
The server is the main hub for connections between clients and manages the game. If something happens on the server it will replicate to all the clients connected to it.