[Release] [T6] [Zombies] ZPause - a synced co-op pause mod by Xep
-
ZPause
Synced co-op pause for Black Ops II Zombies (Plutonium T6)
by Xep
Any player can pause. Any player can unpause. The state lives on
level, so it's
identical for everyone — there's no per-client state that can desync.- Zombies stop where they are, and stop spawning
- Players are locked and can't be hurt
- The match clock, powerup timers, effect countdowns and bleedout all hold
- Resumes on a 3‑2‑1 countdown with a short grace period
Requirements
Plutonium T6 (Black Ops II), zombies. No other mods or dependencies.
Download & Source
Latest Version Download:
github dot com/Xeptix/ZPause/releases/tag/public/latest
GitHub Source Code:
github dot com/Xeptix/ZPause
Install
Two packagings of the same file are included. Plutonium only lets you enable one mod
at a time, so the script version is usually the better choice — it coexists with whatever
mod you're running.Script version (recommended)
Drop
zpause.gscinto your T6 storage scripts folder:%localappdata%\Plutonium\storage\t6\scripts\zm\zpause.gscOn newer Plutonium builds the path is under
raw:%localappdata%\Plutonium\storage\t6\raw\scripts\zm\zpause.gscIf you aren't sure which your build uses, put it in both — only the one that exists will
be read.Mod version
Copy the
zm_pausefolder into your mods folder:%localappdata%\Plutonium\storage\t6\mods\zm_pause\scripts\zm\zpause.gscThen pick zm_pause from the in-game Mods menu. The folder name must keep its
zm_
prefix or it won't show up in the zombies mod list.You don't need to restart the game to reload a script — just end the current game and
start a new one.
Usage
Action Input Pause / unpause type !pauseor!pin chatUnpause only type !unpause,!resumeor!uPause / unpause hold crouch + melee together for ~0.3s The button combo keeps working while you're frozen —
freezecontrols()blocks movement
and weapon use, but button state still reaches the server. That's what lets a frozen
player resume without opening chat.Resuming runs a 3‑2‑1 countdown with everything still frozen, then releases the whole
game at once and gives players 2 seconds of invulnerability so nobody eats a hit from a
zombie that was mid‑swing.
Configuration
Every setting is at the top of the file under
zp_load_config(), and each one is also a
dvar of the same name. The script creates each dvar with its default on load, so you can
set them straight from the console:zp_countdown 5The config is re-read at the start of every pause, so a change takes effect on the next
pause — no map restart needed. Anything already set in yourconfig.cfgbefore the map
loads is left alone.Dvar Default What it does zp_allow_short_words0Also accept bare p/u/pausein chat. Off by default so normal conversation can't pause the game.zp_button_combo1Enable the crouch + melee combo. zp_button_hold_time0.3How long the combo must be held. zp_countdown3Seconds of 3‑2‑1 before play resumes. zp_grace2Seconds of invulnerability after resuming. zp_cooldown2Minimum seconds between toggles. zp_max_pause_time0Auto-resume after N seconds. 0= unlimited.zp_engine_freeze1Use disablezombies()/enablezombies().zp_drift_guard1Snap back any AI that still manages to move. zp_freeze_anims1Put zombies in a standing idle pose instead of looping their last animation. zp_godmode1Make players invulnerable while paused. zp_freeze_clock1Hold the match timer. zp_freeze_powerups1Stop ground powerups timing out. zp_freeze_effects1Hold insta-kill / double-points countdowns. zp_freeze_bleedout1Stop downed players bleeding out. zp_blackout0Black out everyone's screen while paused (anti-scouting). zp_show_hint1Tell players how to pause when they spawn. zp_countdown_sound""Sound alias to play on each countdown tick. Empty = silent.
How it works
Treyarch already shipped a working full-game pause in T6 zombies. It's what runs
during a host migration. The stock scriptmaps\mp\gametypes_zm\_hostmigration.gscdoes
exactly this:disablezombies( 1 ); // engine-level AI freeze flag_clear( "spawn_zombies" ); // the spawner's own gate player freezecontrols( 1 ); // lock players player enableinvulnerability(); // nobody can be hurt locktimer(); // hold level.discardtime so the clock stops…and the exact inverse to resume. ZPause uses that recipe rather than inventing one, so
the spawner, the round counter and the match clock are all stopped the way the game
expects:disablezombies()/enablezombies()are engine builtins — the same calls host
migration uses.flag_clear("spawn_zombies")is the flag_zm.gsc's spawn loop actually blocks on,
so spawning stops at the source instead of being fought.level.discardtimeis subtracted from the match clock, so pushing it forward by the
elapsed time holds the timer still.
On top of that, ZPause covers what host migration never has to because it only lasts a few
seconds:- An AI enforcer that re-freezes anything appearing mid-pause, keeps
ignoreall
pinned, and snaps back any AI that drifts. It's a safety net — if the engine freeze does
its job it never fires, so there's no jitter. - The stuck-zombie watchdog.
round_spawn_failsafe()kills any zombie that hasn't
moved 24 units in 30 seconds (15 on Origins and Mob of the Dead), assuming it's stuck
outside the playspace. A paused zombie trips it every time, and the "put it back in the
spawn queue" compensation is skipped for anything withignoreallset — so those
zombies are gone for good, counted as killed, and the round advances while everyone's
away. ZPause keeps the barrier-chunk timestamp fresh, which all three variants honour,
so the watchdog loops harmlessly instead of firing and still works normally afterwards. - Ground powerups.
powerup_timeout()is a plainwait()and can't be paused, so the
thread is cut and restarted on resume. - Insta-kill / double points. Their HUD countdowns are held still. The 30s
wait()
driving the real effect keeps running underneath, so on resume a bounded thread holds
the effect on until the frozen countdown genuinely runs out, then forces it off —
without that, the effect would stick on for the rest of the game. - Bleedout is pinned so a downed player doesn't bleed out.
- Late joiners and respawns are frozen on spawn, and everything is torn down on
end_gameso nobody is left frozen at the scoreboard.
Why not
timescale?timescale 0looks like the perfect pause — it would freeze everything, timers included.
But GSCwaitruns on server time, so the unpause loop freezes with it and the game can
never be resumed. The server also only runs a frame once enough scaled time accumulates,
so snapshots stop going out and clients drop with Connection Interrupted. Slow motion
(timescale 0.05) avoids the disconnects but isn't a pause.
Notes
- Round transitions. Pausing between rounds doesn't stop the next round from
beginning — its delay is a plainwait(). No zombies spawn until you resume. - Ground powerups get a fresh timer on resume rather than their exact remaining time,
so you'll never lose a Max Ammo to a pause. - Zombies stand idle rather than freeze solid.
zp_freeze_animsputs them in the
game's dormant-zombie pose so they don't run on the spot, but it's an idle animation
rather than a hard freeze. A true animation freeze isn't reachable from server-side GSC,
and the same applies to player animations. - Scripted boss sequences (Brutus spawn-ins, Panzers, ghosts, the Avogadro) are held
in place, but a scripted move already underway can still finish. - Not held: magic box close timer, teleporter cooldowns, trap durations, and Easter
egg step timers.
Testing
Tested in live co-op games, including on custom map ports.
It's also compile-checked with gsc-tool 1.4.10 targeting
t6/pcagainst the stock
script tree, and round-tripped through compile → decompile. Every external function it
calls exists in the stock T6 script corpus.
Credits
- Xep — author
- Treyarch —
_hostmigration.gsc, the pause recipe this is built on - plutoniummod/t6-scripts — stock T6 script reference
- hima_simple — earliest BO2 zombies pause script
- DED2SIN — Plutonium pause script building on it
- MufaDOOM — BO2 co-op pause mod
- Resxt — Plutonium T6 chat command conventions
-
thank you so much for this gift were gonna use it forever
XD -
ZPause v1.1
Latest version is always live on GitHub: https://github.com/Xeptix/ZPause/releases
Fixed — players unfreezing mid-pause
On Ascension, pausing while you're in the lander let you walk around the paused
game once the lander came down and opened. Map scripts that carry you somewhere
lock your controls for the ride and release them when it ends, and that release
lands in the middle of the pause.freezecontrols()can't be read back, so the
fix re-asserts the freeze on a tick rather than testing it, and re-pins godmode
along the way. Newzp_control_guard, on by default. It covers any ride script
that does this, not just the lander.New — screen blur
zp_blur(on by default) blurs everyone's screen while paused, using the same
post-process the game runs when you buy a perk.zp_blur_amountsets the
strength — the perk buy uses4, the default here is a light1.5. It's the
softer alternative tozp_blackout, which is still there and still off by
default.New — pause and resume sounds
Three sound dvars now instead of one:
Dvar Default zp_pause_soundzmb_zombie_go_inertzp_countdown_soundzmb_tombstone_timer_countzp_resume_soundzmb_zombie_end_inertAll stock aliases played by core zombies scripts, so they work on every map. A
custom sound would have to ship as a fastfile and be installed by every player
rather than just the host, so ZPause uses the game's own audio instead. The
defaults are what the game uses them for:go_inertandend_inertare what a
zombie plays dropping dormant and waking back up, andzmb_tombstone_timer_count
is the once-a-second tick from the tombstone timer. Set any of them to""for
silence —zp_countdown_soundwas silent by default before, so set it back if
you preferred that. The README lists other aliases worth trying.Install
Unchanged — overwrite your existing
zpause.gsc:%localappdata%\Plutonium\storage\t6\scripts\zm\zpause.gsc, or on newer builds
%localappdata%\Plutonium\storage\t6\raw\scripts\zm\zpause.gscMod version goes in
mods\zm_pause\scripts\zm\. You don't need to restart the
game — end the current match and start a new one.Full dvar list and the how-it-works writeup are in the README on GitHub:
https://github.com/Xeptix/ZPause
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login