Skip to the content
Docs

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

lua
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.

ReliabilityLasts
100 %5 days
80–99 %24 hours
50–79 %2 hours
below 50 %not saved at all
KeyDefaultAllowedWhat it does
Config.Memory.CameraSeconds2592000 (30 days)secondsHow long a scan made with an active hidden camera lasts, whatever its %, as long as it reached MinSavePct.
Config.Memory.NeverShortentruetrue / falseA successful recognition restarts the timer from now with the new tier, but never shortens it.
Config.Memory.RefreshLookOnRecognizetruetrue / falseA successful recognition refreshes the remembered clothes and tattoos to what is seen now. The automatic label never changes.
Config.Memory.UpgradeOnRecognizetruetrue / falseAfter 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.SameLookMatch0.900.0–1.0From this match, two looks count as "the same look", so the stored clothes of one memory are refreshed instead of replaced.
Config.Memory.EraseLogMax200countMost 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:

lua
Config.Places = {
    { id = 'tattoo_vinewood', kind = 'tattoo', coords = vector3(322.62, 180.34, 103.59), radius = 15.0 },
    -- ...
}
FieldWhat it is
idYour own name for the place. Only admins see it.
kindWhat 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.
coordsThe middle of the place.
radiusMetres. 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.

KeyDefaultAllowedWhat it does
Config.Memory.Disguisestruetrue / falseMaster switch. false = one memory row per person and source, the old behaviour.
Config.Memory.DisguiseMatchFloorPct400–100How 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.DisguiseSubThresholdSavetruetrue / falseA 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.MaxDisguiseRows41–10Most 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–3600A 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

ValueBehaviour
'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.

KeyDefaultAllowedWhat it does
Config.Scene.Seconds600 (10 min)secondsHow long the live result lasts.
Config.Scene.LeaveDistance20.0metresFurther away than this counts as "left".
Config.Scene.LeaveGraceSeconds30secondsHow long they may stay away before the live result ends.
Config.Scene.HeartbeatMs2000msHow often the observer's game re-checks line of sight.
Config.Scene.ShowDistance10.0metresThe 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.

lua
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 },
},
LevelRecognitions neededRe-learning speed
stranger01.0×
acquaintance31.25×
familiar71.5×
close152.0×
KeyDefaultAllowedWhat it does
Config.Familiarity.CountCooldownHours6hoursOnly one successful recognition per pair counts in this many hours. Anti-farm.
Config.Familiarity.RequireFaceCapPct600–100The speed-up only applies while the person's face is at least this visible.
Config.Familiarity.KnownWellLevel'familiar'a level name · falseFrom 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

KeyDefaultAllowedWhat it does
Config.Identity.NameChangeIsNewfalsefalse · 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

KeyDefaultAllowedWhat 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.LabInNameApisfalsetrue / falseWhether Lab IDs also count for name display. They always count for proofs and HasRecognized.