Memory & Familiarity
On this page7
Two different things, often confused:
- Memory is what your character knows about someone. It expires.
- Familiarity is how well you know them. It makes scans faster, never more certain, and it survives memory expiry.
Memory lifetime
Tiers = {
{ minPct = 100, seconds = 432000 }, -- 5 days
{ minPct = 80, seconds = 86400 }, -- 24 hours
{ minPct = 50, seconds = 7200 }, -- 2 hours
},Checked from the top: the first line whose minPct the result reaches wins. A memory
is at full strength until it runs out, then it is gone — a hard cut, no fading.
| Reliability | Lasts |
|---|---|
| 100 % | 5 days |
| 80–99 % | 24 hours |
| 50–79 % | 2 hours |
| below 50 % | not saved at all |
| Key | Default | Allowed | What it does |
|---|---|---|---|
Config.Memory.CameraSeconds | 2592000 (30 days) | seconds | How long a scan made with an active hidden camera lasts, whatever its %, as long as it reached MinSavePct. |
Config.Memory.NeverShorten | true | true / false | A successful recognition restarts the timer from now with the new tier, but never shortens it. |
Config.Memory.RefreshLookOnRecognize | true | true / false | A successful recognition refreshes the remembered clothes and tattoos to what is seen now. The automatic label never changes. |
Config.Memory.UpgradeOnRecognize | true | true / false | After that refresh, reliability and tier are worked out again from the refreshed cues — so a better second meeting raises a weak memory straight to the tier it now earns. false = the tier comes from that scan's recall value instead. |
Config.Memory.SameLookMatch | 0.90 | 0.0–1.0 | From this match, two looks count as "the same look", so the stored clothes of one memory are refreshed instead of replaced. |
Config.Memory.EraseLogMax | 200 | count | Most erased entries kept in one admin log row. |
What "upgrade" means in practice
You see someone badly through a rainy window: 66 %, two-hour memory. Next day you
have a proper conversation with them in daylight. With UpgradeOnRecognize = true,
that two-hour memory becomes a 100 % / 5-day memory — the tier comes from the
refreshed memory, not from the old one. The timer is still never shortened.
The memory line
Players see a memory as where and when they first met the person, never as a
list of clothes: "Met him on Vinewood Blvd in the evening", "The guy from the
tattoo shop", "Heard of a woman seen in Davis". The line is written once, at the
first meeting, and never changes. The time is only the part of the day (morning,
afternoon, evening, night). From Config.Familiarity.KnownWellLevel on, the line
becomes "I know him well". A name the person introduced himself with still shows
next to it.
The old clothing words are still stored, and admins see them in the panel and in Discord next to the full detail (place, street, area, part of day and hour). A memory saved before this line existed keeps its clothing words.
A known place wins over the street. Config.Places lists them:
Config.Places = {
{ id = 'tattoo_vinewood', kind = 'tattoo', coords = vector3(322.62, 180.34, 103.59), radius = 15.0 },
-- ...
}| Field | What it is |
|---|---|
id | Your own name for the place. Only admins see it. |
kind | What the line calls it. Needs a label_place_<kind> text in locales/ (tattoo, barber, clothing, hospital, police, airport and pier ship). A kind with no text falls back to the street, and the boot log names it. |
coords | The middle of the place. |
radius | Metres. Where two places overlap, the one you are relatively nearest to wins. |
The shipped list covers the GTA V clothing, barber and tattoo shops, the hospitals,
the police stations, the airport terminal and the Del Perro pier. The place is worked
out by the server from where the scanner stood. Players only ever see the words of
the kind ("the tattoo shop"), never the id or the position.
Disguises
A disguised acquaintance is scanned, scored and reported exactly like a stranger — result Noted, an automatic label like "the hoodie guy", and a second memory row. Your memory of the real person is untouched.
| Key | Default | Allowed | What it does |
|---|---|---|---|
Config.Memory.Disguises | true | true / false | Master switch. false = one memory row per person and source, the old behaviour. |
Config.Memory.DisguiseMatchFloorPct | 40 | 0–100 | How similar a concealed person must still look to land on a disguise memory you already hold of them, instead of starting a new one. 0 = never start a second one; 100 = every visible difference is a new person. |
Config.Memory.DisguiseSubThresholdSave | true | true / false | A concealed scan that matched a disguise memory but stayed below the act line: true = refresh that memory anyway and show Noted with its label, exactly like meeting a new masked person. |
Config.Memory.MaxDisguiseRows | 4 | 1–10 | Most disguise memories per person you have met, across every source. A new one retires the disguise memory that would expire soonest; the real-face memory is never dropped. |
Config.Memory.EvictionJitterSeconds | { 60, 900 } | two values, each 0–3600 | A retired disguise memory gets a random extra lifetime in this range and is cleaned up later, so no entry in the picker vanishes at the exact moment of a scan. |
Config.Memory.MergeDisguises | 'transition' | 'transition' · 'recognized' · 'off' | When the two memories become one again. |
DisguiseMatchFloorPct is used only while the face is hidden. Once the face has
been seen, the scan always goes to the real person. The same outfit with a different
cap scores about 94 %, far above the default floor of 40.
MergeDisguises
| Value | Behaviour |
|---|---|
'transition' (default) | Only when a scan ended with the face visible and was saved or recognised — the mask came off in front of you. Every disguise memory matching the concealed look of that same scan is folded in. |
'recognized' | On any later face-visible recognition. Not recommended: the disguise entry then vanishes from the picker after a meeting where the mask never came off, which gives away the link. |
'off' | Never merge. The two memories simply run out on their own. |
The live scene
After a successful scan the result stays on the HUD and updates live while the person is around.
| Key | Default | Allowed | What it does |
|---|---|---|---|
Config.Scene.Seconds | 600 (10 min) | seconds | How long the live result lasts. |
Config.Scene.LeaveDistance | 20.0 | metres | Further away than this counts as "left". |
Config.Scene.LeaveGraceSeconds | 30 | seconds | How long they may stay away before the live result ends. |
Config.Scene.HeartbeatMs | 2000 | ms | How often the observer's game re-checks line of sight. |
Config.Scene.ShowDistance | 10.0 | metres | The HUD shows the live result of the nearest person within this distance. |
The live scene is also what nametag and chat scripts ask about by default — see
Config.Api below.
Familiarity
Knowing someone well makes re-learning them faster: a full scan of somebody whose memory ran out. It never changes the 2–3 second quick look of somebody you still remember, and it never adds a single percentage point.
Levels = {
{ name = 'stranger', at = 0, mult = 1.0 },
{ name = 'acquaintance', at = 3, mult = 1.25 },
{ name = 'familiar', at = 7, mult = 1.5 },
{ name = 'close', at = 15, mult = 2.0 },
},| Level | Recognitions needed | Re-learning speed |
|---|---|---|
| stranger | 0 | 1.0× |
| acquaintance | 3 | 1.25× |
| familiar | 7 | 1.5× |
| close | 15 | 2.0× |
| Key | Default | Allowed | What it does |
|---|---|---|---|
Config.Familiarity.CountCooldownHours | 6 | hours | Only one successful recognition per pair counts in this many hours. Anti-farm. |
Config.Familiarity.RequireFaceCapPct | 60 | 0–100 | The speed-up only applies while the person's face is at least this visible. |
Config.Familiarity.KnownWellLevel | 'familiar' | a level name · false | From this level on, the memory's line reads "I know him well" instead of where you met. Never on a disguise memory. false = never. |
Familiarity is per character pair: only recognitions of the real person count. While someone is disguised you do not know who they are, so there is nothing to grow familiar with.
Familiarity survives memory expiry. It is reset only by the death rule or by the other person's face implant.
Identity changes from other scripts
| Key | Default | Allowed | What it does |
|---|---|---|---|
Config.Identity.NameChangeIsNew | false | false · true · 'esx' | A character renamed by another script: false = same person (logged for admins). true = new person, everyone forgets them. 'esx' = only on ESX slot reuse. |
Answers given to other scripts
| Key | Default | Allowed | What it does |
|---|---|---|---|
Config.Api.RecognitionSource | 'scene' | 'scene' · 'scene_or_memory' | What counts as "A recognises B right now" for nametag and chat scripts. scene = only while a successful scan result is still live (up to 10 min). |
Config.Api.LabInNameApis | false | true / false | Whether Lab IDs also count for name display. They always count for proofs and HasRecognized. |