Skip to content
  • 0 Unread 0
  • Recent
  • Popular
  • Users
  • Donate
Collapse

Plutonium

  1. Home
  2. BO2 Modding Releases & Resources
  3. [Release] [T6] [Zombies] ZPause - a synced co-op pause mod by Xep

[Release] [T6] [Zombies] ZPause - a synced co-op pause mod by Xep

Scheduled Pinned Locked Moved BO2 Modding Releases & Resources
5 Posts 2 Posters 268 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Xeptix Offline
    Xeptix Offline
    Xeptix
    wrote last edited by
    #1

    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.gsc into your T6 storage scripts folder:

    %localappdata%\Plutonium\storage\t6\scripts\zm\zpause.gsc
    

    On newer Plutonium builds the path is under raw:

    %localappdata%\Plutonium\storage\t6\raw\scripts\zm\zpause.gsc
    

    If 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_pause folder into your mods folder:

    %localappdata%\Plutonium\storage\t6\mods\zm_pause\scripts\zm\zpause.gsc
    

    Then 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 !pause or !p in chat
    Unpause only type !unpause, !resume or !u
    Pause / 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 5
    

    The 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 your config.cfg before the map
    loads is left alone.

    Dvar Default What it does
    zp_allow_short_words 0 Also accept bare p / u / pause in chat. Off by default so normal conversation can't pause the game.
    zp_button_combo 1 Enable the crouch + melee combo.
    zp_button_hold_time 0.3 How long the combo must be held.
    zp_countdown 3 Seconds of 3‑2‑1 before play resumes.
    zp_grace 2 Seconds of invulnerability after resuming.
    zp_cooldown 2 Minimum seconds between toggles.
    zp_max_pause_time 0 Auto-resume after N seconds. 0 = unlimited.
    zp_engine_freeze 1 Use disablezombies() / enablezombies().
    zp_drift_guard 1 Snap back any AI that still manages to move.
    zp_freeze_anims 1 Put zombies in a standing idle pose instead of looping their last animation.
    zp_godmode 1 Make players invulnerable while paused.
    zp_freeze_clock 1 Hold the match timer.
    zp_freeze_powerups 1 Stop ground powerups timing out.
    zp_freeze_effects 1 Hold insta-kill / double-points countdowns.
    zp_freeze_bleedout 1 Stop downed players bleeding out.
    zp_blackout 0 Black out everyone's screen while paused (anti-scouting).
    zp_show_hint 1 Tell 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 script maps\mp\gametypes_zm\_hostmigration.gsc does
    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.discardtime is 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 with ignoreall set — 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 plain wait() 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_game so nobody is left frozen at the scoreboard.

    Why not timescale?

    timescale 0 looks like the perfect pause — it would freeze everything, timers included.
    But GSC wait runs 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 plain wait(). 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_anims puts 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/pc against 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
    1 Reply Last reply
    1
    • GhostRider01250 Away
      GhostRider01250 Away
      GhostRider01250
      wrote last edited by
      #2

      thank you so much for this gift were gonna use it forever 👌XD

      1 Reply Last reply
      0
      • Xeptix Offline
        Xeptix Offline
        Xeptix
        wrote last edited by
        #3

        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. New zp_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_amount sets the
        strength — the perk buy uses 4, the default here is a light 1.5. It's the
        softer alternative to zp_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_sound zmb_zombie_go_inert
        zp_countdown_sound zmb_tombstone_timer_count
        zp_resume_sound zmb_zombie_end_inert

        All 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_inert and end_inert are what a
        zombie plays dropping dormant and waking back up, and zmb_tombstone_timer_count
        is the once-a-second tick from the tombstone timer. Set any of them to "" for
        silence — zp_countdown_sound was 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.gsc

        Mod 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

        1 Reply Last reply
        0
        • Xeptix Offline
          Xeptix Offline
          Xeptix
          wrote last edited by
          #4

          ZPause v1.2

          Big one. Latest version is always live on GitHub: https://github.com/Xeptix/ZPause

          Download: https://github.com/Xeptix/ZPause/releases/latest

          New — vote to pause

          Off by default. zp_vote 1 and a pause has to carry the room instead of any one
          player stopping the game.

          Calling a vote is the same action as pausing — !pause, or crouch + melee. The vote
          runs 30 seconds and everyone gets a tally on screen: the count, the clock, and every
          player with how they voted. Vote yes with the same input again or !yes; vote no with
          jump + melee or !no.

          The bar is whichever is higher, zp_vote_min or zp_vote_percent of the players in
          the game, then clamped to how many are actually present — so a lobby can't set a
          threshold nobody there can clear, and solo play skips the vote entirely. With the
          defaults that's 2 of 2, 2 of 3, 3 of 4.

          A vote ends the moment it's decided either way: enough yeses to pass, or enough noes
          that everyone left couldn't carry it. Disconnects take their vote with them. A failed
          vote locks out the next one briefly so it can't be spammed. The result holds on screen
          for a couple of seconds rather than vanishing into the chat feed.

          Resuming doesn't need a vote by default, so one AFK player can't strand everyone in a
          paused game — zp_vote_unpause 1 if you want both directions voted. zp_vote_hold 1
          freezes the game while the vote runs and puts it back if it fails.

          New — zombies shut up while paused

          A frozen horde standing next to you used to keep growling for the length of the pause.
          zp_silence_zombies is on by default and stops it at the source; normal noise comes
          straight back on resume.

          Fixed — button combos while down

          If you went down or bled out, the combos stopped working entirely. You can't crouch or
          melee from the floor, and once you're spectating the engine stops delivering those
          buttons to the server at all. Those states now fall back to zp_button_combo_dead
          (use + aim) and zp_vote_no_combo_dead (use + fire). Chat worked throughout and still
          does.

          zp_vote_alive_only, on by default, also keeps bled-out spectators out of the vote
          maths — otherwise two players with one dead is a threshold of two and only one person
          alive to answer it.

          Fixed — long sessions

          A long game could eventually die with exceeded maximum number of parent server script variables. Every HUD element the script built was leaving a slot behind when it was
          destroyed. Cleaned up, along with a smaller leak in the config handling.

          New — HUD

          • zp_hud_position and zp_vote_hud_position: top, center, middle, bottom,
            left or right. Left and right align their text to that edge. The pause banner
            stays exactly where it was; the vote tally sits at the top.
          • Button prompts show your actual binds. The HUD draws each combo as the buttons
            you personally have bound — a key on keyboard, a pad glyph on controller, and it
            follows rebound keys. Off with zp_hud_binds 0 for plain words.
          • The pause banner tells you who paused and how long it's been. With
            zp_max_pause_time set it counts down to the auto-resume instead.
          • Text has a black glow behind it so it stops washing out against bright skyboxes, and
            elements fade in rather than snapping. zp_hud_panel 1 adds a darkened slab behind
            the whole block if you want it heavier.

          48 settings in total, all documented in the README.

          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.gsc

          Mod version goes in mods\zm_pause\scripts\zm\. No game restart needed — end the
          current match and start a new one.

          Everything here runs on the host. Players joining your game install nothing and can
          pause, resume and vote exactly like you can, on a stock client.

          Full dvar list and the how-it-works writeup are in the README:
          https://github.com/Xeptix/ZPause

          1 Reply Last reply
          0
          • Xeptix Offline
            Xeptix Offline
            Xeptix
            wrote last edited by
            #5

            ZPause v1.3

            Packaging, not gameplay — v1.2 and v1.3 play identically, so there's no rush if you're
            already running it.

            Latest version is always live on GitHub: https://github.com/Xeptix/ZPause

            Download: https://github.com/Xeptix/ZPause/releases/latest

            New — drop-in install

            The download is a Plutonium folder now, laid out exactly like the one in
            %localappdata%. Copy it in, say yes to the merge, done. No more picking a path.

            Both script paths ship, so the "put it in both and only the one that exists gets read"
            step is gone — that's already done for you. The mod packaging comes along in the same
            tree at storage\t6\mods\zm_pause, and does nothing unless you pick zm_pause from
            the Mods menu, so having it sit there costs nothing.

            New — install.bat

            Optional. It copies that folder for you: lists what it's about to install, asks once, then
            copies. No deletes, no downloads, nothing else touched. Extract the zip first — running it
            from inside Windows' zip viewer won't work.

            Dragging the folder across yourself is identical, so skip it if you'd rather.

            New — ZPause is on three games now

            Black Ops and World at War ports are out, same version number and the same feature set
            allowing for what each engine can do:

            • Black Ops — https://github.com/Xeptix/ZPauseT5
            • World at War — https://github.com/Xeptix/ZPauseT4

            There's also ZPause [Treyarch Bundle] on the release page above — all three in one
            download, same drop-in layout.

            Neither older engine has a say callback for a script to bind to, so those two are
            button-only. No !pause over there; everything is on the combos.

            Also

            MIT licensed, and the license ships with the download. There's a build stamp in the script
            now too, but it only draws on development builds — a release carries an empty one.

            Install

            This one changes. The download is now a Plutonium folder that mirrors
            %localappdata%\Plutonium — copy it into %localappdata% and say yes to the merge, and
            everything lands where it belongs. install.bat in the zip will do it for you.

            Your old zpause.gsc gets replaced in place, so nothing to clean up first. If you'd
            rather keep doing it by hand, the file is in the same paths it always was.

            No game restart needed — end the current match and start a new one.

            Full dvar list and the how-it-works writeup are in the README:
            https://github.com/Xeptix/ZPause

            1 Reply Last reply
            0

            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
            Reply
            • Reply as topic
            Log in to reply
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes


            • Login

            • Don't have an account? Register

            • Login or register to search.
            • First post
              Last post
            0
            • Unread 0
            • Recent
            • Popular
            • Users
            • Donate