Newcclosure is a very important function in Synapse X, which we will be explaining to make sure you use it correctly.
You may be asking, "why is
newcclosure so important?", and there is a simple answer - not using
newcclosure opens you up to a multitude of detection vectors.
Smart game script developers back at the time when metamethod hooks were first starting to be popular had a good idea of how to detect them - check the call-stack for suspicious environments that indicate metamethod hooks are present.
The general way to do this was via the
xpcall function and forcing an error within the original function that was called by the hook. An example of this technique is described below:
local Env = getfenv() xpcall(function() return game:_____() end, function() for i = 0, 10 do if getfenv(i) ~= Env then warn("Detected metamethod tampering!") end end end)
newcclosure will make sure that Synapse X functions are not on the
xpcall call-stack, protecting you from this attack.
There was also the method of checking error messages for changes - this was also popularly used back at the start of popularity for metatable hooks.
local OldErr, OldMsg = pcall(function() return game:____() end) while wait(1) do local Err, Msg = pcall(function() return game:____() end) if OldErr ~= Err or OldMsg ~= Msg then warn("Detected metamethod tampering!") end end
newcclosure will make sure this attack does not happen either.
In short, always use newcclosure for both metamethod hooks and function hooks, which we will now to go back to.
For now, lets go back to metamethod hook examples.