GenZeeDocs

Configuration

Every option in Universal Targeting's shared/config.lua.

Every setting below lives in shared/config.lua, which stays readable in the escrowed release. Restart universal_targeting after changing it. These are the defaults shipped with version 1.1.0.

Interaction modes

Config.Modes

Universal Targeting's core idea: the PLAYER picks how they interact, the server only decides which modes are allowed. Every registered interaction works identically in all modes.

  • 'eye' - third-eye raycast (hold key, aim, pick an option)
  • 'radial' - radial ring of the interactions around you
  • 'prompts' - floating world-space keypress prompts on nearby targets
  • 'context' - entity-anchored context list (Lyre-style)
Config.Modes = { 'eye', 'radial', 'prompts', 'context' }

Config.DefaultMode

Mode used before the player makes a choice (and the fallback when their saved choice is no longer in Config.Modes).

Config.DefaultMode = 'eye'

Config.DefaultInteractDistance

Fallback interact range (meters) for registered options that don't set their own distance (ox_target parity: 2.0).

Config.DefaultInteractDistance = 2.0

Config.BoneMatchRadius

Options declaring bones match when the aim/hit point is within this many meters of one of their bones (eye and context modes).

Config.BoneMatchRadius = 0.9

Keybinds

Defaults only - players rebind in GTA Settings > Key Bindings

Config.Keybinds = {
    -- Third-eye / interact key (used by the eye, prompts and context modes).
    interact = 'LMENU', -- left alt
    -- Radial menu toggle (ox_lib muscle memory).
    radial = 'Z',
}

Third-eye mode

Config.Eye

Config.Eye = {
    -- How far the eye raycast reaches (meters). Individual options still
    -- gate on their own `distance`.
    rayDistance = 10.0,
    -- Outline the entity under the cursor when it has usable options.
    outline = true,
    outlineColor = { 217, 164, 65, 255 },
}

Config.Keys

Raw control ids for named keys (per-option prompt keys, scroll keys).

Config.Keys = {
    ['ESC'] = 322, ['F1'] = 288, ['F2'] = 289, ['F3'] = 170, ['F5'] = 166, ['F6'] = 167, ['F7'] = 168, ['F8'] = 169, ['F9'] = 56, ['F10'] = 57,
    ['~'] = 243, ['1'] = 157, ['2'] = 158, ['3'] = 160, ['4'] = 164, ['5'] = 165, ['6'] = 159, ['7'] = 161, ['8'] = 162, ['9'] = 163, ['-'] = 84, ['='] = 83, ['BACKSPACE'] = 177,
    ['TAB'] = 37, ['Q'] = 44, ['W'] = 32, ['E'] = 38, ['R'] = 45, ['T'] = 245, ['Y'] = 246, ['U'] = 303, ['P'] = 199, ['['] = 39, [']'] = 40, ['ENTER'] = 18,
    ['CAPS'] = 137, ['A'] = 34, ['S'] = 8, ['D'] = 9, ['F'] = 23, ['G'] = 47, ['H'] = 74, ['K'] = 311, ['L'] = 182,
    ['LEFTSHIFT'] = 21, ['Z'] = 20, ['X'] = 73, ['C'] = 26, ['V'] = 0, ['B'] = 29, ['N'] = 249, ['M'] = 244, [','] = 82, ['.'] = 81,
    ['LEFTCTRL'] = 36, ['LEFTALT'] = 19, ['SPACE'] = 22, ['RIGHTCTRL'] = 70,
    ['HOME'] = 213, ['PAGEUP'] = 10, ['PAGEDOWN'] = 11, ['DEL'] = 178,
    ['LEFT'] = 174, ['RIGHT'] = 175, ['UP'] = 172, ['DOWN'] = 173,
    ['TOP'] = 172, -- legacy alias for UP (old configs)
}

Prompts mode

World-space keypress prompts rendered through DUI sprites (no NUI focus). Every in-range prompt shows a dot; the closest one you LOOK AT expands into the option card.

Config.Prompts = {
    -- Dots appear on interactables within this range...
    viewDistance = 10.0,
    -- ...capped at this many prompt points at once (nearest win).
    maxPrompts = 10,
    -- Default confirm key per option (options may set their own `key`).
    key = 'E',
    -- Default hold-to-confirm duration in ms (options may set `holdTime`).
    holdTime = 1000,
    -- true = pressing the key triggers instantly, no hold progress.
    -- This is the SERVER DEFAULT; players can override it in /targeting
    -- (Mode page > Prompt Confirm) - saved client-side, so it follows them.
    instant = false,
    -- Line-of-sight check: hide prompts behind geometry. Options can also
    -- request it individually via `checkVisibility` when this is off.
    checkVisibility = true,
    -- Cycle the highlighted option (mouse wheel also works) - shared with
    -- the third-eye option list. Keys must exist in Config.Keys - invalid
    -- names fall back with a console warning.
    scrollUpKey = 'UP',
    scrollDownKey = 'DOWN',
    -- The option card only shows while the prompt sits in this
    -- center-screen band (you must look at the target).
    gaze = { minX = 0.37, maxX = 0.63, minY = 0.25, maxY = 0.75 },
    -- Loop cadences (ms): entity/zone rescans and anchor/LOS refreshes.
    ticks = { scan = 1500, anchors = 400 },
}

Context mode

Config.Context = {
    -- Range for indicator dots while the interact key is held. Every dot
    -- shown is clickable: view range IS the interact range in this mode
    -- (per-option `distance` values do not re-gate the menu here).
    scanDistance = 6.0,
    maxTargets = 12,
    -- A pinned menu lets go when the player walks this far from its target.
    releaseDistance = 6.0,
    -- Click forgiveness: a click also lands when the cursor is within this
    -- screen-space radius of a dot (fraction of screen height), so players
    -- don't need pinpoint aim on the dot itself.
    dotHitRadius = 0.035,
    -- Virtual cursor speed. Context mode NEVER shows the game's mouse
    -- pointer: it freezes the camera, reads the (disabled) look input and
    -- moves its own reactive cursor. This scales mouse movement to cursor
    -- movement ON TOP of the player's in-game look sensitivity, so keep it
    -- small - 0.08 is a comfortable baseline, 0.25 already feels twitchy.
    -- Players fine-tune it themselves with the Look page's "Cursor
    -- sensitivity" slider (0.2x - 3x of this value).
    cursorSpeed = 0.08,
    -- true = per-option `distance` values gate the menu here too (strict
    -- ox_target behavior for servers bridging scripts that rely on tight
    -- ranges, e.g. cuffing at 1m). false = anything showing a dot is
    -- interactable (this suite's default feel).
    respectOptionDistance = false,
}

Interaction visuals

Per-surface looks so servers can style each mark independently. Every shape is REACTIVE: it has an idle state and a "hot" state (over something interactable) with its own lock-on move.

  • shape: 'crosshair' | 'ring' | 'dot' | 'diamond' | 'brackets'
  • (reticle/cursor); the world marker supports
  • 'dot' | 'ring' | 'diamond' | 'square'
  • color: '#rrggbb' accent override for that surface (nil = theme accent)
  • scale: size multiplier (1.0 = stock)
Config.Styles = {
    reticle = { shape = 'crosshair', color = nil, scale = 1.0 }, -- third-eye center mark
    cursor  = { shape = 'ring',      color = nil, scale = 1.0 }, -- context-mode cursor
    marker  = { shape = 'dot',       color = nil, scale = 1.0 }, -- world indicator dots (context/prompts)
}

Radial mode

Config.RadialTargeting = {
    -- The interact key gathers everything interactable within this range.
    scanDistance = 4.0,
    maxTargets = 7,
}

Theme

Standalone theme tokens (mirrors web/src/lib/theme.ts ThemePatch keys). Defaults match the Universal UI gold dark-glass look so the suite reads as one product when installed together - but nothing here requires it.

Config.Theme = {
    accent = '#d9a441',
    uiScale = 0.8,
    -- performanceMode = true,  -- freeze ambient animation / drop blur
}

Settings menu

Pages shown in /targeting. Server owners toggle pages off here; the Theme page also hides itself automatically when Universal UI runs alongside with merged theming (setr universal:mergedTheme, handled by universal_bridge) - the suite theme is managed there instead. With Universal Pause + universal_bridge running, the same settings also appear as a "Targeting" page in the pause menu's Settings (Universal Hub), following these toggles. Nothing to configure: the bridge finds it.

Config.Settings = {
    pages = {
        mode = true,
        theme = true,
        -- Look page: players pick their own reticle / cursor / marker shape,
        -- color and size (plus cursor sensitivity) on top of Config.Styles.
        look = true,
    },
    -- Show the "Targeting Settings" entry on the Z radial.
    radialShortcut = true,
    -- Player accent choices offered on the Theme page.
    accents = { '#d9a441', '#7f5af0', '#3b82f6', '#2dd4bf', '#ef4444', '#ec4899' },
}

Locale

Player-facing strings (patch for translation).

Config.Locale = {
    back = 'Back',
    close = 'Close',
    select = 'select',
    settings = 'Targeting Settings',
    settingsHint = 'Choose how YOU want to interact with the world.',
    -- Universal Hub page (Universal Pause's settings, when the suite runs)
    hubPage = 'Targeting',
    modeLabel = 'Interaction mode',
    lookColorHint = 'The first swatch follows your theme accent.',
    lookResetButton = 'Reset',
    keyInteract = 'Interact',
    keyRadial = 'Radial menu',
    pageMode = 'Mode',
    pageTheme = 'Theme',
    pageLook = 'Look',
    themeAccent = 'Accent',
    themeScale = 'UI scale',
    -- Look page
    lookReticle = 'Third-eye reticle',
    lookCursor = 'Context cursor',
    lookMarker = 'World markers',
    lookShape = 'Shape',
    lookColor = 'Color',
    lookSize = 'Size',
    lookAccent = 'Theme accent',
    lookSensitivity = 'Cursor sensitivity',
    lookReset = 'Reset to server default',
    lookPreviewHint = 'Hover a shape to see it react',
    shapeCrosshair = 'Crosshair',
    shapeRing = 'Ring',
    shapeDot = 'Dot',
    shapeDiamond = 'Diamond',
    shapeBrackets = 'Brackets',
    shapeSquare = 'Square',
    promptStyleLabel = 'Prompt Confirm',
    promptHold = 'Hold to confirm',
    promptInstant = 'Instant press',
    modeEye = 'Third Eye',
    modeEyeDesc = 'Hold the interact key, aim with the camera, scroll and click.',
    modeRadial = 'Dial',
    modeRadialDesc = 'Press the interact key for a smooth dial of everything nearby.',
    modePrompts = 'Prompts',
    modePromptsDesc = 'Interactions float in the world. Walk up, scroll, press E.',
    modeContext = 'Context',
    modeContextDesc = 'Hold the interact key, click a target, pick from its menu.',
    -- Generic target labels (radial mode submenus)
    vehicle = 'Vehicle',
    ped = 'Ped',
    player = 'Player',
    object = 'Object',
    zone = 'Zone',
}

On this page