Q2PRO-X 1.6 Beta 5 by ly — Q2PRO-X 1.6 Beta 5 Live Item Timers Guide
The complete guide in HTML. The original DOCX is available from its documentation card.
Q2PRO-X 1.6 Beta 5 by ly
Q2PRO-X 1.6 Beta 5 Live Item Timers Guide
Project author: ly
Tracking item respawn in live play: authorization, the panel and audio
English edition • Q2PRO-X 1.6 Beta 5 by ly • 2026-10-10
Contents
The entries are links: click one to jump to that section.
Automatic timer position in beta 2
4. How an automatic timer starts
5. Where automatic timers are permitted
5.2. A remote server with an explicit decision
5.3. A remote server with no key
6. The complete decision order
8. The item catalog and its defaults
9. Where an interval comes from
10. The special Mega Health logic
12. World observation and identical items
14. The main console variables
16. Managing the permitting list through the API
17. How the API answer is protected
Automatic timers do not start, manual ones do
A dropped weapon I picked up made no timer
Mega did not start counting immediately
Everything cleared after I changed the spectated player
A manual stopwatch with no automation
Spectating a match with separate instances
Beta4: OpenTDM-X and timeouts
Live client timers support OpenTDM-X under OpenTDM rules; the mod itself is not bundled. Server authorization for automatic timers remains required. Automatic placement keeps timers below the mod HUD. OpenTDM/OpenTDM-X timeouts and resume countdown freeze manual/automatic timers, audio cues, ready display, interval learning and Mega Health waiting. Remaining time resumes with gameplay.
Automatic timer position in beta 2
With automatic vertical placement (-1), the starting Y position is 80 in HUD coordinates, below the OpenFFA/OpenTDM upper-right status block. This changes automatic placement only; explicit user coordinates are not overwritten.
1. What the system is for
Q2PRO-X live item timers count down to the expected respawn of an item in the game you are playing right now. The system is designed for ordinary play, local practice, spectating a match and manual timing by hand.
There are two kinds of timer:
The master switch cl_it is off by default. Until you enable live timers yourself, the system starts no countdowns and contacts no authorization service.
| A separate subject. Item timers inside demo recordings are a different system with their own settings. They are covered in the demo browser and player guide. |
|---|
2. A two-minute start
1. Open Main menu → Online Play Setup → Live Item Timers.
2. Enable Live item timers.
3. Leave Auto-start on own pickup enabled if you want it.
4. Set up the HUD, the sounds and the list of tracked items in the child pages.
5. Connect to a server and check the authorization result with it_info.
In the simplified multiplayer menu profile, the Item timers link sits directly among the network settings.
For a quick manual test:
cl_it 1; it_start rl 30; it_info active
A 30-second rocket-launcher timer appears on the HUD. A manual timer works on every server and does not depend on automatic-timer authorization.
3. Why this is not a cheat
The system is deliberately limited to data an ordinary client already legitimately holds during play.
A manual timer is an ordinary local stopwatch: you decide what to time and when. That is why server and site policy restrict only automatic starts, and never block it_start, manual binds, the HUD or the sounds of timers you started by hand.
It is worth understanding the boundary of this protection: a modified third-party client can remove any client-side check. The Q2PRO-X mechanism exists to give the official client a transparent fair-play policy; it does not replace server-side anti-cheat.
4. How an automatic timer starts
For an automatic start, every one of these conditions must hold at the same time:
1. cl_it is 1.
2. cl_it_auto_own is 1.
3. The item is permitted by its own cl_it_<id>_show.
4. Automatic timers are authorized for the current connection.
5. The client received confirmation of your own pickup.
6. A permanent BSP spawn of the same item type was found nearby.
If no permanent spawn is found, no automatic timer is created. That is deliberate safe behaviour for a weapon a player dropped by hand and for items that fell from a dead player.
The entity coordinate in the BSP is the map editor's original point: some items legitimately fall from it to the floor while the level starts. Q2PRO-X repeats that standard calculation and matches the pickup against the actual resting point instead. When the item has been visible in a snapshot, its last server position refines that point further. The trust radius is not widened by this, so the refinement does not permit automatic timers for ordinary dropped weapons.
Every automatic timer records the source AUTO. A manual timer records MANUAL. The manual timer has priority: an authorization refusal removes automatic timers only, and can never erase or overwrite a manual one.
5. Where automatic timers are permitted
5.1. Local play
On a local server, including a loopback connection, automatic timers are permitted immediately, both at deathmatch 0 and at deathmatch 1. No site request is made.
5.2. A remote server with an explicit decision
The client first reads sv_allow_timers from the remote server's serverinfo:
An explicit server refusal cannot be overridden by the site list. An explicit server permission is likewise not overridden by the site's global mode.
5.3. A remote server with no key
If the server sent no sv_allow_timers, the client asynchronously contacts:
https://q2pro-x.com/api/q2prox/v1/live-item-timers/authorization
https://quake2.pro/api/q2prox/v1/live-item-timers/authorization
The second address is a mirror, used when the first one is unreachable. Connecting to the game server continues meanwhile, without waiting for the HTTP answer. Until a valid permission arrives, automatic starts stay off.
5.4. Manual timers
Manual timers work in every case:
6. The complete decision order
| Priority | Condition | Automatic start |
|---|---|---|
| 1 | cl_it 0 | Disabled by the user |
| 2 | cl_it_auto_own 0 | Not requested; the network is not used |
| 3 | Local server | Permitted |
| 4 | sv_allow_timers 1 | Permitted conclusively |
| 5 | sv_allow_timers 0 | Forbidden conclusively |
| 6 | Invalid sv_allow_timers value | Forbidden |
| 7 | The key is absent | The site policy is consulted |
| 8 | Policy force:-1 | Forbidden |
| 9 | Policy force:1 | Permitted |
| 10 | force:0, the IP:port is in the list | Permitted |
| 11 | force:0, no match | Forbidden |
| 12 | No valid signed answer | Forbidden, safely |
The check is repeated for every new connection and reconnection. A decision from the previous server is never carried over to the next one.
7. The timer menu pages
7.1. Main page
Live Item Timers
| Type | Section | Row | Variable or target | What it does |
|---|---|---|---|---|
| Section | General | General | ||
| Toggle | General | Live item timers | cl_it | Master switch for live item respawn timers (manual + own-pickup). Applies immediately. |
| Toggle | General | Auto-start on own pickup | cl_it_auto_own | Auto-start only for your pickups at permanent BSP map spawns. Dropped/corpse items are ignored (no wallhack / hidden state); a dropped quad uses the time left that the server shows you: its spawn counts from the original take, or no timer. Applies immediately. |
| Toggle | General | Show HUD strip | cl_it_hud | Draw the on-screen countdown strip. Applies immediately. |
| Toggle | General | Reset on POV change | cl_it_reset_on_pov_change | When spectating, clear all timers after switching to another player's POV, entering free observer, or returning to play. Applies immediately. |
| Section | Sections | Sections | ||
| Navigation | Sections | HUD strip... | q2prox_lit_hud | HUD strip position, scale, opacity, warning window, unknown-item policy. |
| Navigation | Sections | Warning sound... | q2prox_lit_sound | Optional local warning sound (code path only; silent if the asset is missing). |
| Navigation | Sections | Tracked items... | q2prox_lit_items | Choose which items are tracked and shown. |
| Navigation | Sections | Respawn intervals... | q2prox_lit_intervals | Per-item fallback respawn intervals + global defaults. |
| Navigation | Sections | Instances & locations... | q2prox_lit_world | Per-instance timers by BSP spawn location: ordinals + world observation (PVS-only). |
| Navigation | Sections | Per-item HUD/sound/color... | q2prox_lit_advanced | Per-item HUD window, sound and color, by class. |
| Navigation | Sections | Manual timers & binds... | q2prox_lit_binds | Bind keys for manual timers (it_start / it_cancel / modifier). |
| Navigation | Sections | Print timer info | it_info | Print the catalog + active timers to the console. |
Reset on POV change deserves a separate note: it clears timers when the spectated player changes, when you move to free-look spectating, and when you return to play. It is on by default.
7.2. The HUD strip
Live Timers — HUD
| Type | Section | Row | Variable or target | What it does |
|---|---|---|---|---|
| Section | Strip | Strip | ||
| Toggle | Strip | Show HUD strip | cl_it_hud | Draw the on-screen countdown strip. Applies immediately. |
| Toggle | Strip | Show under menu | cl_it_hud_in_menu | Keep timer HUDs visible underneath an open menu. Menu opacity still applies; a fully opaque menu covers them. Applies immediately. |
| Slider | Strip | Strip scale | cl_it_hud_scale | HUD strip size multiplier. Applies immediately. |
| Slider | Strip | Strip opacity | cl_it_hud_alpha | HUD strip opacity. Applies immediately. |
| Slider | Strip | Max cells | cl_it_hud_max | Maximum number of timer cells shown at once (per strip). Applies immediately. |
| Toggle | Strip | Labels under icons | cl_it_hud_labels | Show the short English item code (RL, RG, RA, Q...) under each icon. Applies immediately. |
| Section | Position (single strip) | Position (single strip) | ||
| Slider | Position (single strip) | Position X (-1 = auto) | cl_it_hud_x | Horizontal position in HUD pixels; -1 = auto (right-aligned). Applies immediately. |
| Slider | Position (single strip) | Position Y (-1 = auto) | cl_it_hud_y | Vertical position in HUD pixels; -1 = auto (Y=80, below the server Frags/Rank/Time block). Applies immediately. |
| Section | Split by class | Split by class | ||
| Toggle | Split by class | Split by class | cl_it_hud_split | Split the strip into four separate HUDs by class (Armor / Powerups / Weapons / Other). Off = one combined strip (default). Scale, opacity and max cells stay common. Applies immediately. |
| Slider | Split by class | Armor X (-1 = auto) | cl_it_hud_armor_x | Armor HUD X (-1 = auto: stacks top-right below the panel above it). Applies immediately. |
| Slider | Split by class | Armor Y (-1 = auto) | cl_it_hud_armor_y | Armor HUD Y (-1 = auto stack). Applies immediately. |
| Slider | Split by class | Powerups X (-1 = auto) | cl_it_hud_pow_x | Powerups HUD X (-1 = auto stack). Applies immediately. |
| Slider | Split by class | Powerups Y (-1 = auto) | cl_it_hud_pow_y | Powerups HUD Y (-1 = auto stack). Applies immediately. |
| Slider | Split by class | Weapons X (-1 = auto) | cl_it_hud_wpn_x | Weapons HUD X (-1 = auto stack). Applies immediately. |
| Slider | Split by class | Weapons Y (-1 = auto) | cl_it_hud_wpn_y | Weapons HUD Y (-1 = auto stack). Applies immediately. |
| Slider | Split by class | Other X (-1 = auto) | cl_it_hud_misc_x | Other HUD X (-1 = auto stack). Applies immediately. |
| Slider | Split by class | Other Y (-1 = auto) | cl_it_hud_misc_y | Other HUD Y (-1 = auto stack). Applies immediately. |
| Section | Behavior | Behavior | ||
| Slider | Behavior | Warning window, s | cl_it_warn_s | Warning window: seconds before respawn when the cell turns red (and sound fires). Applies immediately. |
| Toggle | Behavior | Show all timers | cl_it_hud_show_all | Show every tracked timer from the start, ignoring per-item HUD windows. Off = a cell appears only within its item HUD window. Applies immediately. |
| Toggle | Behavior | Border blink | cl_it_hud_blink | Smoothly pulse the tile border (dimmer-style) inside the warning window, faster as respawn nears (5 Hz when ready), with a bloom glow. Common to all tiles. Applies immediately. |
| Toggle | Behavior | Icon pulse | cl_it_hud_icon_pulse | Independent: smoothly pulse the item icon (dimmer-style) with a bloom glow inside the warning window. Common to all tiles. Applies immediately. |
| Toggle | Behavior | Running border | cl_it_hud_border_run | Independent: a bright comet runs clockwise around the tile border inside the warning window, faster as respawn nears. Common to all tiles. Applies immediately. |
| List | Behavior | Unknown interval | cl_it_unknown_policy | What to do with an item that has no known respawn interval. Dynamic automatic Mega timing is handled separately. Applies immediately. [hide / show ?] |
cl_it_hud_in_menu 1, the default, keeps timers visible under an open menu. Menu opacity still applies: a fully opaque menu naturally covers the HUD.
The HUD can stay one combined strip or be split into four: armor, powerups, weapons and other items. Each strip has its own coordinates, while scale, opacity, the warning window and the cell limit stay common to all of them.
The extra warning effects are independent of each other:
7.3. Audio warning
Live Timers — Sound
| Type | Section | Row | Variable or target | What it does |
|---|---|---|---|---|
| Section | Warning | Warning | ||
| Toggle | Warning | Warning sound | cl_it_sound | Play a local warning sound when a timer enters the warning window. Optional asset (sound/q2prox/it/warn.wav); silent if missing. Applies immediately. |
| Slider | Warning | Volume | cl_it_sound_vol | Warning sound volume. Applies immediately. |
| Section | Mode & events | Mode & events | ||
| List | Mode & events | Sound mode | cl_it_sound_mode | Sound mode: off / generic cues / rich per-item voice with fallback. All sound files are optional; missing files silently skip. Applies immediately. [off / generic / rich] |
| Toggle | Mode & events | Countdown numbers | cl_it_sound_countdown | Per-second countdown number cues inside the sound window (optional assets). Applies immediately. |
| Toggle | Mode & events | Item-up sound | cl_it_sound_up | Play the item-up cue when a timer reaches respawn (optional asset). Applies immediately. |
A general warning sound, a per-second countdown and a separate item-respawn cue are supported. In rich mode, phrases for specific items may be used. Every WAV file is optional: a missing file is silently skipped and never breaks the game.
7.4. Tracked items
This page decides which item types take part in the system at all. A disabled type creates no automatic timer and is not shown on the HUD.
7.5. Respawn intervals
Live Timers — Intervals
| Type | Section | Row | Variable or target | What it does |
|---|---|---|---|---|
| Section | Global | Global | ||
| Slider | Global | Default interval, s | cl_it_default_s | Global fallback respawn seconds when a per-item interval is 0 (Mega excluded). Applies immediately. |
| Slider | Global | Fixed Mega fallback, s | cl_it_mh_fb_s | Fixed Mega override. 0 = Automatic stock behavior: wait at least 5 s until health reaches 100, then use the post-decay delay below. Applies immediately. |
| Slider | Global | Mega after decay, s | cl_it_mh_post_decay_s | Automatic stock Mega countdown after excess health reaches 100. Baseq2 uses 20 seconds. Applies immediately. |
| Slider | Global | READY hold, s | cl_it_ready_hold_s | Keep a READY cell on screen this many seconds after the countdown ends. Applies immediately. |
| Section | Armor | Armor | ||
| Slider | Armor | Green Armor, s | cl_it_ga_s | Green Armor fallback respawn seconds. Applies immediately. |
| Slider | Armor | Yellow Armor, s | cl_it_ya_s | Yellow Armor fallback respawn seconds. Applies immediately. |
| Slider | Armor | Red Armor, s | cl_it_ra_s | Red Armor fallback respawn seconds. Applies immediately. |
| Slider | Armor | Power Screen, s | cl_it_pws_s | Power Screen fallback respawn seconds. Applies immediately. |
| Slider | Armor | Power Shield, s | cl_it_pwh_s | Power Shield fallback respawn seconds. Applies immediately. |
| Section | Powerups | Powerups | ||
| Slider | Powerups | Quad Damage, s | cl_it_quad_s | Quad fallback respawn seconds. Applies immediately. |
| Slider | Powerups | Invulnerability, s | cl_it_inv_s | Invulnerability (Pentagram) fallback respawn seconds. Applies immediately. |
| Section | Weapons | Weapons | ||
| Slider | Weapons | Rocket Launcher, s | cl_it_rl_s | Rocket Launcher fallback respawn seconds. Applies immediately. |
| Slider | Weapons | Railgun, s | cl_it_rail_s | Railgun fallback respawn seconds. Applies immediately. |
| Slider | Weapons | BFG10K, s | cl_it_bfg_s | BFG10K fallback respawn seconds. Applies immediately. |
| Slider | Weapons | Grenade Launcher, s | cl_it_gl_s | Grenade Launcher fallback respawn seconds. Applies immediately. |
| Slider | Weapons | HyperBlaster, s | cl_it_hb_s | HyperBlaster fallback respawn seconds. Applies immediately. |
| Slider | Weapons | Chaingun, s | cl_it_cg_s | Chaingun fallback respawn seconds. Applies immediately. |
| Slider | Weapons | Shotgun, s | cl_it_sg_s | Shotgun fallback respawn seconds. Applies immediately. |
| Slider | Weapons | Super Shotgun, s | cl_it_ssg_s | Super Shotgun fallback respawn seconds. Applies immediately. |
| Slider | Weapons | Machinegun, s | cl_it_mg_s | Machinegun fallback respawn seconds. Applies immediately. |
| Slider | Weapons | Hand Grenades, s | cl_it_hg_s | Hand Grenades fallback respawn seconds. Applies immediately. |
| Section | Other | Other | ||
| Slider | Other | Mega: fixed, s | cl_it_mh_s | Per-item fixed Mega override. 0 = Fixed fallback above, then dynamic health-decay timing when both are 0. Applies immediately. |
This page sets the fallback intervals per item type, the general fallback and the special Mega Health logic. A specific mod or server may use different rules, so the values can be changed independently in each local Q2PRO-X profile.
7.6. Instances and locations
Live Timers — Instances
| Type | Section | Row | Variable or target | What it does |
|---|---|---|---|---|
| Section | How it works — no hidden data | How it works — no hidden data | ||
| Section | World observation (PVS) | World observation (PVS) | ||
| Toggle | World observation (PVS) | World observation | cl_it_world_observe | Use only item entities already received in the current POV's normal snapshot/PVS plus static BSP map spawns. It never reveals hidden items or starts a timer from PVS churn alone. Automatic start requires a confirmed current-POV pickup at a permanent map spawn. Applies immediately. |
| Toggle | World observation (PVS) | Instance ordinals | cl_it_ordinals | Show the BSP ordinal (1,2,...) on the HUD when a map has more than one of that item. Applies immediately. |
| Section | Learning & radii | Learning & radii | ||
| Toggle | Learning & radii | Per-instance learning | cl_it_learn | Learn a session-only interval from the SAME BSP spawn disappearing/reappearing. Dynamic Mega is excluded unless it has a fixed override. Applies immediately. |
| Slider | Learning & radii | BSP match radius | cl_it_bsp_match_radius | Match radius between a visible item and its BSP spawn record. Applies immediately. |
| Slider | Learning & radii | Cluster radius | cl_it_instance_cluster_radius | Merge radius for near-duplicate BSP spawn origins of the same item. Applies immediately. |
| Slider | Learning & radii | Own pickup radius | cl_it_own_touch_radius | How close a vanishing item must be to count as YOUR pickup of that exact instance (makes two identical items time separately). Applies immediately. |
| Slider | Learning & radii | Manual attach radius | cl_it_pickup_attach_radius | Manual it_start <id> <seconds>: how close a BSP spawn must be to attach that manual timer to the nearest instance. Applies immediately. |
| Section | Diagnostics | Diagnostics | ||
| Toggle | Diagnostics | World debug | cl_it_world_debug | Verbose world-observation logging to the console (BSP parse, ignored candidates). Applies immediately. |
| Navigation | Diagnostics | Print world info | it_info | Print the BSP spawn catalog + observed instances to the console. |
Here you enable PVS observation, ordinals for identical instances, interval learning and the matching radii against BSP points. The mode reveals no hidden data: it only helps to tell, for example, two different rocket launchers apart.
7.7. Per-item settings
For every type, five things are set separately:
Weapon settings are split across three child pages so the long list stays usable:
Inside each group, all five settings above are available for every item.
7.8. Manual timers and binds
Live Timers — Binds
| Type | Section | Row | Variable or target | What it does |
|---|---|---|---|---|
| Section | Modifier | Modifier | ||
| Key | Modifier | Cancel modifier (hold) | +it_mod | Hold this key so that a manual it_start acts as it_cancel for the same item. |
| Section | Manual timer start | Manual timer start | ||
| Key | Manual timer start | Start: Red Armor | it_start | Start / refresh the Red Armor timer (hold the modifier to cancel). |
| Key | Manual timer start | Start: Yellow Armor | it_start | Start / refresh the Yellow Armor timer (hold the modifier to cancel). |
| Key | Manual timer start | Start: Green Armor | it_start | Start / refresh the Green Armor timer (hold the modifier to cancel). |
| Key | Manual timer start | Start: Mega | it_start | Start / refresh the Mega timer (needs a fallback interval; see Intervals). |
| Key | Manual timer start | Start: Quad | it_start | Start / refresh the Quad timer (hold the modifier to cancel). |
| Key | Manual timer start | Start: Pentagram | it_start | Start / refresh the Pentagram timer (hold the modifier to cancel). |
| Key | Manual timer start | Start: Power Shield | it_start | Start / refresh the Power Shield timer (hold the modifier to cancel). |
| Key | Manual timer start | Start: Rocket Launcher | it_start | Start / refresh the Rocket Launcher timer (hold the modifier to cancel). |
| Key | Manual timer start | Start: Railgun | it_start | Start / refresh the Railgun timer (hold the modifier to cancel). |
| Key | Manual timer start | Start: BFG10K | it_start | Start / refresh the BFG10K timer (hold the modifier to cancel). |
| Section | Other | Other | ||
| Key | Other | Open timers menu | it_menu | Open this Live Item Timers menu. |
| Navigation | Other | Reset timers | it_reset | Clear all active timers and session-learned per-instance intervals. |
This page binds keys to it_start, it_cancel and the +it_mod modifier. Manual binds pass through no server or site authorization.
8. The item catalog and its defaults
| ID | Item | Fallback interval | Tracked by default |
|---|---|---|---|
| ga | Green armor | 20 s | Yes |
| ya | Yellow armor | 20 s | Yes |
| ra | Red armor | 20 s | Yes |
| mh | Mega Health | Dynamic | Yes |
| quad | Quad Damage | 60 s | Yes |
| inv | Invulnerability | 300 s | Yes |
| pws | Power Screen | 60 s | Yes |
| pwh | Power Shield | 60 s | Yes |
| rl | Rocket launcher | 30 s | Yes |
| rail | Railgun | 30 s | Yes |
| bfg | BFG10K | 30 s | Yes |
| sil | Silencer | 60 s | No |
| reb | Rebreather | 60 s | No |
| env | Environment suit | 60 s | No |
| adr | Adrenaline | 60 s | No |
| gl | Grenade launcher | 30 s | No |
| hb | Hyperblaster | 30 s | No |
| cg | Chaingun | 30 s | No |
| band | Bandolier | 60 s | No |
| pack | Ammo pack | 180 s | No |
| sg | Shotgun | 30 s | No |
| ssg | Super shotgun | 30 s | No |
| mg | Machinegun | 30 s | No |
| hg | Hand grenades | 30 s | No |
These values are honest fallbacks, not a promise about any mod's rules. An administrator or user should correct the intervals if the server uses different ones.
9. Where an interval comes from
For an ordinary item, the interval is chosen in this order:
1. The number of seconds passed explicitly to the manual command.
2. The interval learned this session for that specific BSP point, if learning is enabled.
3. The cl_it_<id>_s value for that item type.
4. The general fallback cl_it_default_s.
Every interval is safely clamped to at most 3600 seconds, so a mistaken huge variable cannot overflow the time.
Mega Health does not inherit the general fallback. It has its own logic, described next.
10. The special Mega Health logic
Stock Mega Health in baseq2 has no simple fixed interval measured from the pickup. After a pickup the game waits at least five seconds, then decays the excess health back towards 100, and only then schedules the item's return.
So the normal automatic mode of Q2PRO-X works like this:
1. Your own Mega pickup at a permanent BSP spawn is confirmed.
2. The client waits at least five seconds.
3. Once the current POV's health is no greater than 100, the cl_it_mh_post_decay_s countdown starts — 20 seconds by default.
cl_it_mh_fb_s 0 keeps this dynamic mode. A non-zero value sets a fixed fallback for servers or mods with different rules. You can also set cl_it_mh_s explicitly, or pass the seconds to a manual it_start.
11. Manual commands
11.1. Starting
it_start <id> [seconds|ordinal|nearest]
Examples:
it_start rl
it_start quad 60
it_start rail nearest
it_start ra 2
11.2. Cancelling
it_cancel <id|all> [ordinal]
Examples:
it_cancel rl
it_cancel rl 2
it_cancel all
While the bound +it_mod modifier is held, it_start cancels the timer it would have started instead of starting it.
11.3. Reset and information
it_reset
it_info
it_info active
it_info world
it_menu
11.4. Example binds
bind F5 "it_start rl 30"
bind F6 "it_start rail 30"
bind F7 "it_start quad 60"
bind F8 "it_cancel all"
bind ALT "+it_mod"
12. World observation and identical items
cl_it_world_observe is off by default. Once enabled, the system matches visible entities from the current snapshot/PVS against the map's static BSP points.
That gives three capabilities:
Observation never starts a timer merely because an object vanished. A disappearance can mean the item left PVS, a door closed, or the camera turned, so that event is not reliable enough.
A learned interval lives only until the end of the session and is never written to a config. It is accepted only within a sensible range around the configured fallback. For the dynamic Mega, learning is disabled until a fixed interval is set.
13. Spectator behaviour
With cl_it_reset_on_pov_change 1, which is the default, every timer is cleared when:
Even if you disable the timer reset, the internal pickup and PVS detectors still rebase on a POV change. That prevents a false automatic start from an event that belonged to the previously spectated player.
14. The main console variables
| Variable | Accepted values | Description |
|---|---|---|
| cl_it | 0=off (default) / 1=on | Master switch for Q2PRO-X live multiplayer item respawn timers (manual + own-pickup countdowns on a HUD strip). Honest by design: no wallhack, no hidden server state, no demo pre-scan. Manual it_start/bind timers work on EVERY server; only AUTOMATIC own-pickup starts are authorized (see cl_it_auto_own). Mod-local. |
| cl_it_auto_own | 0=off / 1=on (default) | Auto-start a timer when the current local/observed POV picks up a PERMANENT map item. A type-only STAT_PICKUP_STRING must resolve within cl_it_own_touch_radius of a same-type BSP spawn; confirmed world touches use that same catalog. Dropped/corpse items without a nearby map spawn are ignored. A dropped quad (used at once, with its remaining life in STAT_TIMER) never restarts the quad countdown: the spawn near you, or the map's only quad spawn, counts from the original take (30 s minus the time left); otherwise no timer. Automatic starts are authorized per connection: local server always allows; a remote server's serverinfo sv_allow_timers 1/0 is final; otherwise the signed q2pro-x.com/quake2.pro site policy decides. This NEVER gates manual it_start/bind timers. |
| cl_it_hud | 0=off / 1=on (default) | Draw the on-screen live-timer countdown strip. Respects scr_draw2d, HUD scale and common alpha. Menu-time visibility is controlled separately by cl_it_hud_in_menu. |
| cl_it_hud_in_menu | 0=hide in menu / 1=show under menu (default) | Keep live-timer HUD strips rendered underneath an open menu. The timer layer is composited before the menu, so cl_menu_alpha still applies naturally and a fully opaque menu covers it. |
| cl_it_reset_on_pov_change | 0=keep timers / 1=reset (default) | Clear all live item timers when the spectator view identity changes: another chase target, chase to free observer, observer back to play, or the reverse. Pickup/PVS edge detectors are always rebased on a POV change even when this option is off, so another player's stale pickup message cannot create a false timer. |
| cl_it_hud_x | -1=auto (default) / 0..hud_width | Horizontal HUD position of the timer strip, in HUD pixels. -1 = auto (right-aligned, 8 px horizontal margin), clamped to the visible HUD rect. |
| cl_it_hud_y | -1=auto (default) / 0..hud_height | Vertical HUD position of the timer strip, in HUD pixels. -1 = auto (Y=80, below the OpenFFA/OpenTDM Frags/Rank/Time block), clamped to the visible HUD rect. |
| cl_it_hud_scale | 0.3..4.0 / default 1.0 | Live-timer strip size multiplier. |
| cl_it_hud_alpha | 0..1 / default 1.0 | Live-timer strip opacity. |
| cl_it_hud_max | 1..20 / default 8 | Maximum number of timer cells drawn at once (soonest-first). |
| cl_it_hud_labels | 0=off (default) / 1=on | Draw a short English item code (RL, RG, RA, Q, MH, ...) under each HUD icon. |
| cl_it_hud_split | 0=combined (default) / 1=split by class | Split the timer HUD into four separate strips by class: Armor, Powerups, Weapons, Other. Off = one combined strip (default). Scale, opacity, warning window and max cells stay common to all strips; each strip has its own position cvars (auto or fixed). |
| cl_it_hud_show_all | 0=window only / 1=show all (default) | Show every tracked timer on the HUD from the moment it starts, ignoring each item's HUD show window. Off = a cell appears only once its remaining time is within that item's cl_it_<id>_hud_s window. |
| cl_it_hud_blink | 0=off (default) / 1=on | Smoothly pulse (dimmer-style) each tile's colored border once its timer enters the warning window, speeding up as respawn nears (1 Hz at the window edge up to 5 Hz when ready), with a bloom glow that grows as the border dims. Common to all tiles. |
| cl_it_hud_icon_pulse | 0=off (default) / 1=on | Independent of the border blink: smoothly pulse the item icon (dimmer-style, up to 5 Hz near respawn) with a bloom glow behind it that grows as the icon dims. Common to all tiles. |
| cl_it_hud_border_run | 0=off (default) / 1=on | Independent of the blink: a bright comet of blocks runs clockwise around each tile's border inside the warning window, faster as respawn nears. Common to all tiles. |
| cl_it_warn_s | 0..60 seconds / default 3 | Warning window: seconds before respawn when a cell turns red and the optional warning sound fires. |
| cl_it_ready_hold_s | 0..60 seconds / default 5 | Keep a READY cell on screen this many seconds after the countdown reaches zero. |
| cl_it_unknown_policy | 0=hide (default) / 1=show '?' | What to do with an item that has no known respawn interval: 0 hide it, 1 show a '?' cell. A default automatic Mega Health pickup is pending on its health-decay transition instead and does not create a fake unknown cell. |
| cl_it_default_s | 0=none / 1..300 seconds / default 30 | Global fallback respawn seconds used when a per-item interval is 0. Mega Health is excluded so it never fabricates a fixed countdown. |
| cl_it_mh_fb_s | 0=dynamic stock timing (default) / 1..300 seconds fixed | Fixed Mega Health fallback interval. 0 keeps the stock dynamic automatic path: after a trusted Mega pickup, wait at least five seconds and until POV health reaches 100, then start cl_it_mh_post_decay_s. A positive value overrides that behavior for mods with a fixed Mega interval. |
| cl_it_mh_post_decay_s | 1..300 seconds / default 20 | Automatic Mega Health respawn countdown after excess health has decayed/reached 100. Stock baseq2 schedules the hidden Mega 20 seconds after this transition. Used only by the dynamic automatic path; fixed per-item/fallback values and manual it_start remain fixed timers. |
| cl_it_sound | 0=off (default) / 1=on | Play an optional local warning sound when a timer enters the warning window. Code path only: the asset (sound/q2prox/it/warn.wav) is optional and playback silently skips if it is missing. |
| cl_it_sound_vol | 0..1 / default 1.0 | Warning sound volume. |
| cl_it_sound_mode | 0=off / 1=generic (default) / 2=rich | Sound mode: 0 off, 1 generic (shared soon/up/number cues), 2 rich (per-item voice files with fallback to generic). All sound assets are optional external WAVs under sound/q2x/tm/; missing files silently skip. |
| cl_it_sound_countdown | 0=off / 1=on (default) | Play a per-second number cue (q2x/tm/num/<n>.wav) for each remaining second inside an item's sound window. Optional assets; silent if missing. |
| cl_it_sound_up | 0=off / 1=on (default) | Play the 'item is up' cue (q2x/tm/sys/up.wav) when a timer reaches respawn. Optional asset; silent if missing. |
| cl_it_world_observe | 0=off (default) / 1=on | Use only item entities already received in the current POV's normal snapshot/PVS plus the static BSP map-spawn catalog, so identical map instances can be timed separately. This does not search for items, reveal anything through walls, read hidden server state, or pre-scan future/demo data. An item merely appearing or disappearing never starts a timer: automatic start still requires a confirmed pickup by the current POV at a permanent map spawn and normal automatic-timer authorization. Per-instance learning, when enabled separately, may refine the interval only after that same confirmed spawn is seen returning. Opt-in. |
| cl_it_ordinals | 0=off / 1=on (default) | Draw the BSP ordinal (1, 2, ...) on the HUD when the map has more than one instance of that item, so identical items are distinguishable. |
| cl_it_learn | 0=off (default) / 1=on (needs cl_it_world_observe) | Use per-instance respawn intervals learned from world observation: watching the SAME BSP spawn go hidden then visible again gives its real respawn time (session only, bounded 5-300 s). Requires cl_it_world_observe. Never learns from type-only own pickups. Dynamic Mega Health is excluded unless a fixed Mega override supplies a valid reference. Default off. |
| cl_it_bsp_match_radius | 8..512 / default 64 | Match radius (world units) between a visible item entity and its BSP spawn record. A visible item must be within this distance of a BSP spawn of the same type to become a trusted instance; unmatched items (dropped/corpse) are ignored. |
| cl_it_instance_cluster_radius | 8..512 / default 64 | Merge radius (world units) for near-duplicate BSP spawn origins of the same item type when building the spawn catalog. The catalog is built per map; changing this value takes effect after a map/reload. |
| cl_it_pickup_attach_radius | 16..2048 / default 200 | For the manual 'it_start <id> <seconds>' override: how close a BSP spawn must be to you for that manual timer to bind to the nearest concrete instance. Beyond it, the manual timer is class-level (no ordinal). |
| cl_it_own_touch_radius | 16..128 / default 64 | Trust radius for an automatic own pickup. A type-only STAT_PICKUP_STRING must occur this close to a same-type BSP map spawn, which rejects ordinary dropped/corpse items. With cl_it_world_observe, the same radius decides whether a vanishing visible instance was taken by your current POV. This also lets identical map items time separately. |
For every ID in the catalog, a family of variables is created automatically:
| Pattern | Purpose |
|---|---|
| cl_it_<id>_show | Whether the item type takes part in the system |
| cl_it_<id>_s | The fallback interval of that type |
| cl_it_<id>_hud | Whether the type is drawn on the HUD |
| cl_it_<id>_hud_s | How many seconds ahead its cell appears |
| cl_it_<id>_snd | Whether the type gets a sound |
| cl_it_<id>_snd_s | How many seconds ahead the sound starts |
| cl_it_<id>_color | The accent colour of the cell |
Two variables, cl_it_debug and cl_it_world_debug, are diagnostics and act for the current session only: they are not written to a config and are back at zero on the next launch.
15. Configuring a game server
For R1Q2 and Q2PRO, the decision is best published in serverinfo. The s flag is mandatory, otherwise the client cannot see the key through a standard status request.
Permit automatic timers:
set sv_allow_timers "1" s
Forbid automatic timers:
set sv_allow_timers "0" s
If the key is absent, the official Q2PRO-X client consults the site policy. If the server hides the standard status reply, the key cannot be read either, and the site policy is used.
This variable does not disable a user's manual stopwatch.
16. Managing the permitting list through the API
The site re-reads the text policy file on every request, so changing the list does not require restarting the Node process.
Format:
force:0
q2.playground.ru:27910;PG DM
203.0.113.10:27910;IPv4 example
[2001:db8::10]:27910;IPv6 example
Rules of the file:
The force modes:
force never overrides an explicit sv_allow_timers decision made by the game server.
In the accepted production layout, the configuration and the private key live outside the site's public directory. The recommended environment variables are:
Q2PROX_TIMER_AUTH_PRIVATE_KEY_FILE=C:/nodejs/Q2PRO-X-private/timer-auth-private-key-1.pem
Q2PROX_TIMER_AUTH_CONFIG=C:/nodejs/Q2PRO-X-private/timer-authorization-servers.txt
The private key must never be placed in a repository, a public directory, a client archive or a log.
17. How the API answer is protected
The protocol uses several independent layers:
Consequently two permitting answers are never byte-identical, and an intercepted old answer cannot legitimately be applied to a new request or a different server.
On any signature, nonce, address, port, time, format or TLS error, automatic starts are forbidden. The game connection and manual timers keep working.
18. Diagnostics
Start with one command:
it_info
It shows:
Further commands:
it_info active; it_info world
For a verbose log you can temporarily enable cl_it_debug 1 and cl_it_world_debug 1. Both act only until the end of the session and are never written to a config; to stop the output earlier, return them to 0.
19. Common situations
Automatic timers do not start, manual ones do
That is the normal sign of missing authorization, an unconfirmed permanent BSP point, or a disabled item type. Run it_info and check the decision source, cl_it_auto_own and cl_it_<id>_show.
A dropped weapon I picked up made no timer
That is by design. Automatic mode accepts only a pickup at a permanent map spawn. For a dropped weapon, use a manual it_start if you want a countdown.
The HUD is not visible
Check cl_it 1, cl_it_hud 1, the cell limit, the coordinates and the item's own cl_it_<id>_hud. With the menu open you also need cl_it_hud_in_menu 1 and a sufficiently transparent menu.
There is no sound
Check the mode, the volume and the item's own switch. Every sound file is optional; a missing file is a legitimate silent mode.
Mega did not start counting immediately
In dynamic mode that is correct. After your own pickup the client waits for the health to fall back to 100 and only then starts the 20-second stage.
Everything cleared after I changed the spectated player
That is the default cl_it_reset_on_pov_change 1, which protects you from mixing events belonging to different POVs. It can be disabled in the menu if you need that.
The site is unreachable
The game connection is never blocked. Automatic starts stay forbidden, manual timers keep working. An administrator can remove the dependency on the site entirely with an explicit sv_allow_timers 1 or 0 in serverinfo.
20. Suggested profiles
Ordinary online play
cl_it 1
cl_it_auto_own 1
cl_it_hud 1
cl_it_reset_on_pov_change 1
cl_it_world_observe 0
A manual stopwatch with no automation
cl_it 1
cl_it_auto_own 0
cl_it_hud 1
Spectating a match with separate instances
cl_it 1
cl_it_auto_own 1
cl_it_world_observe 1
cl_it_ordinals 1
cl_it_reset_on_pov_change 1
21. Summary
Q2PRO-X live timers combine a convenient HUD and a manual stopwatch with strict limits on automation. Manual mode stays available everywhere; automatic mode works only from your own confirmed pickup, and only after permission from the local server, from serverinfo, or from the signed site policy.
For a player the main diagnostic tool is it_info; for an administrator the simplest and most unambiguous control remains set sv_allow_timers "1|0" s.
Picking up a dropped quad
A quad dropped by a killed player does not start a fresh full respawn timer. The client uses the server-reported remaining duration to infer the original pickup time and count from there. It associates the timer with a nearby quad spawn or the map's sole quad spawn. No timer is created if the spawn or interval is unknown, the quad has already respawned, or the remaining duration cannot be determined reliably. This includes the dropped quad's final second and a pickup on top of an active quad that adds no visible time.
Pickup text, disappearance at the player's feet and a duration jump are reconciled as one event. Consecutive pickups with identical text are still recognised separately. A fresh quad from its spawn, including one collected while quad is already active, starts the timer normally. cl_it_world_debug 1 prints pickup details in the console.