Unified Quake 3 mod codebase that builds both baseq3 and missionpack (Team Arena) QVMs from a single source tree.
Based primarily on ec-/baseq3a with some additions from Kr3m/missionpackplus.
This mod would not be possible without their amazing work.
- new toolchain used (optimized q3lcc and q3asm)
- upstream security fixes
- floatfix
- fixed vote system
- fixed spawn system
- fixed in-game crosshair proportions
- fixed UI mouse sensitivity for high-resolution
- fixed not being able to gib after match end (right before showing the scores)
- fixed shotgun not gibbing unless aiming at the feet
- fixed server browser + faster scanning
- fixed grappling hook muzzle position visuals
- new demo UI (subfolders,filtering,sorting)
- updated serverinfo UI
- map rotation system
- unlagged weapons
- improved prediction
- damage-based hitsounds
- colored skins
- high-quality proportional font renderer
- single-line cvar declaration, improved cvar code readability and development efficiency
- single-line event (EV_*) declaration
- single-line mean of death (MOD_*) declaration
- Fixed UI scaling
- CPMA-style fullbright skins
Client
All of these settings are available in the options menu.
cg_damagePlums: Quake Live style colored damage numbers on hit (requires server support for clients)cg_damageEffect: Modern red-border damage indication, directionally-weightedcg_bloodParticles: Updated visuals replacing 5-frame blood spurt animation. Entry/exit wound blood particles splat on walls/floors. Going more for a "Mortal Kombat" style feel than hyper-realism, which seems era-appropriate.cg_followMode: Orbit camera for spectating and demo playback. Mouse orbits around the followed player, forward/back keys zoom in and out. When following, weapon next/prev and zoom keys adjust distance and toggle follow mode, respectively, toggling between first and third-person.- Playback of TV demos (TrinityVision, of course 😉). These
.tvdfiles are server-side recorded, and work like other MVD systems. Requires the client engine support. Currently, specific to trinity-engine
You can also set your own bindings. The default ones behave like this, but only in follow mode, so they don't override normal gameplay:
bind mouse2 followcam
bind mwheelup followzoomin
bind mwheeldown followzoomout
TVD playback supports timeline scrubbing. Hold the bound key and move the mouse left/right to select a position on the timeline. A vertical indicator and time label show the target position. Release the key to seek there, or press ESC to cancel.
bind mouse3 +tv_scrub
Other TVD playback binds:
bind leftarrow tv_backward # skip backward (cg_tvSkip seconds, default 10)
bind rightarrow tv_forward # skip forward
bind uparrow tv_next # next player
bind downarrow tv_prev # previous player
VR Support
- Independent head and torso tracking for VR clients, backwards-compatible with flatscreen players
- VR player head movement captured in demos for playback
- VR player icon displayed on the scoreboard
Server
- Support for clients with
cg_damagePlums g_movement: Selectable movement mode, synchronized to clients for prediction. Voteable (can usevq3/cpm/ql/qltthere). Accepts numeric or string values:0— Vanilla Quake 3 (default)1— CPMA/promode (higher ground accel/friction, strafe air control, double-jump)2— Quake Live (auto-hop, jump velocity 275)3— Quake Live Turbo (QL + strafe air control + ramp jump)
g_gameplay: Selectable gameplay mode, synchronized to clients for prediction. Voteable (can usevq3/cpm/qlthere). Accepts numeric or string values:0— Vanilla Quake 3 (default)1— CPMA (3-tiered armor, instant weapon switch, damage adjustments, etc)2— Quake Live (damage adjustments, cg_trueShotgun, etc)
g_teamDMSpawnThreshold: Set > 0 to include Team (CTF) spawns in maps with fewer deathmatch spawns than the value. Allows use of maps that are otherwise a telefrag-fest in Team DM.
In both g_movement and g_gameplay cases, values were determined by dumping cvars where possible, followed by community resources, then trial and error until things felt right. Bug reports of differences in behavior from the default settings for CPMA/Quake Live are greatly appreciated.
- GCC or compatible C compiler
- GNU Make
- 7-Zip (for pk3 packaging)
Install MSYS2 and from the MSYS2 terminal:
pacman -S mingw-w64-x86_64-gcc make p7zip# Debian/Ubuntu
sudo apt install build-essential p7zip-full
# Arch
sudo pacman -S base-devel p7zipgit clone --recursive git@github.com:ernie/trinity.git
cd trinityIf you already cloned without --recursive:
git submodule update --init --recursivemakeThis builds the compiler tools and both pk3 files. Output goes to dist/:
dist/pak8t.pk3(baseq3)dist/pak3t.pk3(missionpack)
make tools # Build compiler tools only
make qvms # Build QVMs only (requires tools)make clean # Clean QVM build artifacts
make clean-tools # Clean compiled tools
make clean-all # Clean everythingCopy the pk3 files from dist/ to your Quake 3 installation:
pak8t.pk3→baseq3/pak3t.pk3→missionpack/
trinity/
├── Makefile # Top-level build
├── code/
│ ├── cgame/ # Client (rendering, effects, HUD)
│ ├── game/ # Server (gameplay logic, AI)
│ ├── q3_ui/ # baseq3 UI
│ └── ui/ # missionpack (Team Arena) UI
├── assets/ # Game assets (menus, shaders, etc.)
├── build/ # QVM build system
├── tools/
│ ├── q3asm/ # Assembler (submodule)
│ └── q3lcc/ # Compiler (submodule)
├── dist/ # Build output (pk3 files)
└── ui/ # Menu definitions