Sync - Server Authoritive Movement Anticheat [ALPHA]

Hello i would like to introduce my anticheat that works by creating a copy of your character on server that replicates movement that the client sends to it. This system can have desyncs in difficult situations for roblox physics as of now because its in alpha and doesnt have any ping compensation (coming tmrw).
It also has action system to replicate your client sided stuff to server.
On the client:

local SyncClient = require(game.ReplicatedStorage.Sync.Client)
local ContextActionService = game:GetService("ContextActionService")

local bool = false

ContextActionService:BindAction("Sit", function()
	bool = not bool
	SyncClient.Actions.Send("Sit", bool)
	game:GetService("Players").LocalPlayer.Character.Humanoid.Sit = bool
end, true, Enum.KeyCode.X)

On the Server:

local SyncServer = require(game.ReplicatedStorage.Sync.Server)
SyncServer.Actions.OnAction("Sit", function(player, bool)
	local character = player.Character
	character.Humanoid.Sit = bool
end)

Showcase:

Test it here:

Get it here:
https://create.roblox.com/store/asset/108587961111801/Sync-Server-Authorative-Movement-Anticheat

Template place download link:
SYNC - Server Authorative Movement Anticheat.rbxl (102.1 KB)

Credits:
Blink - Networking (Secure blink fork by me)

10 Likes

It also has basic protection from exploiters by design. They cant require the module unless they know unc functions unlike some skids.
All of it is written in --!strict if you mind that…

1 Like

What makes this different/better than Roblox’s server authority stuff?

roblox’s makes it unable to do other stuff on the client

The Plug-n-Play aspect of it for example, my game fling hafd 75%+ of it working when i just added the require for modules and nothing else.

1 Like

Validation against NaN and infinity should probably be added.

local Blink = require(game:GetService('ReplicatedStorage').Sync.Blink.Client)

while task.wait() do
	Blink.MovementReplication.Fire({
		jumping = true,
		lastOrientation = CFrame.new(0 / 0, 0 / 0, 0 / 0),
		moveDirection = vector.create(0 / 0, 0 / 0, 0 / 0),
	})
end

2 Likes

Forgive me if I’m incorrect since I have not looked at the source code but does this have client-sided prediction? I can already see the input latency issues on high ping servers from a mile away.

I’d also recommend instead of sending direct values for moveDirection, jumping, etc you should just send the input they pressed and then the server and client handles it, if the server rejects the input request you can just interpolate the client back to its previous position that is saved around that timestamp.

incorrect. this doesnt even need client prediction. im sending move direction due to its crossplatformability.

can you elaborate on why it doesn’t need client prediction?