So someone sent me this on Discord today. Basically what they’re doing is teleporting these orbs that spawn in for my sledding mini game to their self and it gives you money Everytime you touch one. I thought there’s no way this client script is making this filter over to the server and actually give you the money, but it is. I have no clue how to go about fixing this, any help?
Is the touch script handled from the server or the client?
And FilteringEnabled is definitely on?
Yes, it’s definitely on and the Touched script is server-side.
Physics ownership? I may be wrong.
I thought that too, however when I give the server the physics ownership and you try to sled it makes it so that when you bump into one of the orbs it stops you dead in your tracks until the orb disappears instead of pushing it with the sled. Maybe I need to make the sled’s physics be controlled by the server too? This might cause a stutter in movement and a very bad experience though, right?
How about anchoring the orbs and setting cancollide to false? Touched will still register and you don’t have to worry about physics ownership.
Or is there a specific reason why the orbs are unanchored?
anchoring them is really not an option if you actually see how it works. They slide down the ramp with you when they spawn in.
As long as you want to use the physics engine, the issue of trusting players with physics ownership persists. I guess you could try to cframe lerp the orbs down the hill on the server and replicate the same behavior onto the client so both sides see it smooth.
In my opinion just have nodes at which orbs can spawn at and keep then there to be collected along the way.
I’ve had this issue in my game where players would teleport to spawned-in entities. I’ve found that a good solution is first to make sure there’s no obvious way to reference said objects. Let the instances keep their default names, so that models are called “Model” and parts are called “Part”. Also directly insert them into the workspace itself instead of any sort of subcategory. The idea is to make it impossible for an exploiter to recognize what is and isn’t one of your orbs unless they compare the Properties of each and every part individually.
Obviously this won’t be 100% effective, but after I did this in my game, I stopped receiving reports of players teleporting to spawned objects.
That method works as well, and I suggest actively changing the parts’ names (just on the client in it’s main script)
Server-sided position check upon touch, if the client positions all orbs to themselves in an FE game they are not actually nearby on the server. (and thus magnitude can give it away) If the opposite occurs (player teleporting to orbs), add in a check for player position over-time and if a player moved too much teleport them back.
I don’t think you understand physics ownership. The server is the one checking, so there would not be a detected magnitude difference. Checking magnitude is bad in general since bad ping on a client can trigger a false alarm.
It has nothing to do with physics ownership what the distance of two parts is, that merely affects whether the client or the server calculates the physics for the part (and thus the delay between interacting with it for a particular client)
The client does the moving of the orbs to the player in the sketched scenario, in FE this means the orbs did not move on the server and thus a server-sided magnitude check will reveal that the player is not actually near an orb
This does not make much sense. You can always account for a slight delay using common sense, no one will check for a distance of exactly zero. However if the distance is 100+ within a single frame, you can safely assume things happened
I agree, you should try checking the position of the item on the client and having the server compare that position to the position of the item on the server, since if you’re using FE, they will not be moved serverside, and there will be a considerable difference in expected position.
So basically .Touched will fire server-side, but the position will still be the old position? If that’s the case, I’m not sure why Roblox would allow that to happen. Haha. I’ll try to do that and see what happens.
Keep a log of the parts velocity and position over the past 10 or so Stepped. You can use this to see if a part randomly decided to go across the map without any velocity in that dirrction.
Touched event with a client-owned part is triggered by the client. The server listens for the client to trigger
Touched can trigger on the client from the part being moved on the client only, and it will fire for the server too. In other words,
Touched can fire on the server when parts don’t actually touch. Clients can spoof the
You need to check if the character is close enough to fire
Touched on the server. The easiest way to do this is magnitude checks on
Touched (on the server). If the client touches a money giver but is too far away to use it, then they obviously shouldn’t be given any money.
Here's an example of the client firing
Place file: ClientTouched.rbxl (12.7 KB)
The two scripts in the game:
workspace.Part.Touched:Connect(function(hit) print("Touched:",hit) end)
while true do wait(1) workspace.Part.CFrame = script.Parent.HumanoidRootPart.CFrame end
Once you fix this problem, you will also need to look out for players teleporting to money givers. You can fix this by comparing the character’s current and last position every step (on the server). If they move too far then they must have teleported, so temporarily don’t give them any money and respawn them.
You could always put the Sleds/Characters in one collision group, the orbs in another collision group, and the hill in the default collision group. Both the sleds and the orbs will be able to connect with the hill’s default collision group, but you could make the orbs and sleds/characters not able to connect with one another. I believe touched will still run if you set it up like this?
This means you will not need to run any physics against one another, and you don’t have to anchor them.
You could force control of the orbs to the server and set their collision group to a orbs group. Then you can set the collision group of the sled and player to it’s own group. Then set the two collision groups to not collide with each other. This should stop the orbs from slowing the sled down, while also making server distance check not be fooled by client teleporting orbs.
You can save the position of the orb once it spawns in the Workspace, only if the orb isn’t scripted to move by itself then the following code is guaranteed to work.
-- In the Orb Spawning Script -- function SpawnOrb() local NewOrbPosition local Orb = game.ServerStorage:WaitForChild("Orb"):Clone() -- Clone the orb from where it's stored. Orb.Parent = game.Workspace.Orbs -- "Orbs" is the folder that will hold the spawned orbs. Orb.Position = Vector3.new(0, 10, 0) -- Just an example. NewOrbPosition = Orb.Position game:GetService("RunService").RenderStepped:Connect(function() if Orb and Orb.Position ~= NewOrbPosition then Orb.Position = NewOrbPosition warn("Something or someone tried to move an Orb: ".. NewOrbPosition) -- This is optional, it's just to warn any game dev/admin on the server that something or someone suspiciously tried to move the Orb and it prints out the original position where the orb spawned in. end end) end