Zeno Rpchatid
On this page4
ESX only; the code is escrowed, but two functions live in its open config file and that is all we need:
Config.GetCharacterName(source, ESX)Config.IsPlayerMasked(source)— on the server it readsPlayer(source).state.rp_masked, on the client it checks drawable slot 1.
Both are about the target, not the viewer, so zeno can be told "this face is covered" but cannot (yet) ask "does A recognise B?".
We do not ship or modify their code. You paste this into their config file.
1. Set our selector
-- 5code-recognition/config.lua
Config.NametagSystem = 'zeno-rpchatid'This value deliberately makes our bridge do nothing except print a reminder: zeno asks us, we never push to them.
2. Edit their Config.IsPlayerMasked
Replace the body with ours. Keep both branches — the same file is loaded on the server and on the client:
-- zeno-rpchatid / config.lua (THEIR file — your edit)
Config.IsPlayerMasked = function(source)
if IsDuplicityVersion() then
-- server: any player, viewer-independent
return exports['5code-recognition']:IsFaceHidden(source) == true
end
-- client: my own face
return exports['5code-recognition']:IsFaceHidden() == true
endOur answer uses tiered face coverage (Config.FaceCoverage), not "is drawable 1
non-zero": a full mask and a bandana count as hidden, a cap and sunglasses do
not. It fails closed — a player nobody has read yet counts as masked.
3. Do not write their rp_masked state bag
Their own client writes that bag every tick and would overwrite anything we put
there, so the result would flicker. Our bridge never touches it — that is why
'zeno-rpchatid' is a snippet-only driver.
4. Optional: per-viewer names in their chat
zeno already swaps names per viewer, but only from its own "mutual greet" data.
Until they add a hook, the closest you can get without touching their escrowed
code is to send your own proximity messages from your server and use
GetRecognizers / GetRecognitionLabel — see
chat-default.md.