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.0Config.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.9Keybinds
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',
}