# Joint Operations — Patched Executables v2 (September 2026)

Drop-in replacements for the stock v1.7.5.7 `jointops.exe`. Three server builds and one client build.
Everything from the July v1 pack is still in here; v2 adds the fixes below on top.

**Every patch in this pack is documented, with a script that reproduces it byte for byte from a retail exe:**
https://github.com/BadgerLove/jo-server-patches

---

## What's new in v2 — at a glance

| Fix | 32Hz server | 64Hz server | 125Hz server | Client |
|---|---|---|---|---|
| Admin-port crash fix (empty-server SYSDUMP) | NEW | NEW | NEW | — |
| Configurable spawn protection (`e_spawn_protection`) | NEW | NEW | NEW | — |
| 125 FPS lock, CPU drops to idle (`lock_framerate = 7`) | — | — | NEW | — |
| Vehicle weapon restore fix (20-year-old bug) | — | — | — | NEW |
| 2GB memory cap + LAA | v1 | v1 | v1 | NEW |
| Bigbuf 256KB network buffers | v1 | v1 | v1 | — |
| NWU hole-skip fix | — | v1 | v1 (tuned) | — |

Two of the new server fixes need one line each in `game.cfg`. Read **"Config lines you need"** below — it is the only setup there is.

---

## The files

### `jointops_32hz_2gb_v2.exe` — 32Hz server
**New in v2:** admin-port crash fix, configurable spawn protection.
Unchanged from v1: 2GB, LAA, bigbuf, ~16 packets/sec each way per player (hold-off 4). No NWU fix (not needed at this rate). Frame loop unchanged from v1.
Best for: slow hosts and high-ping player bases.

### `jointops_64hz_2gb_nwu_v2.exe` — 64Hz server
**New in v2:** admin-port crash fix, configurable spawn protection.
Unchanged from v1: 2GB, LAA, bigbuf, NWU hole-skip, ~31 packets/sec each way per player (hold-off 2, the retail cadence). Frame loop unchanged from v1.
Best for: the community standard. VPS or modest hardware.

### `jointops_125hz_2gb_nwu_v2.exe` — 125Hz server
**New in v2:** admin-port crash fix, configurable spawn protection, **125 FPS lock**.
Unchanged from v1: 2GB, LAA, bigbuf, NWU tuned for the fast rate, ~62 packets/sec each way per player (hold-off 1).
This is the exact build running on the FMJ dedicated server (see SHA-256 below).

The FPS lock replaces v1's "Sleep removed, 285 FPS, 100% of one core". The loop now runs a steady ~125 FPS and **sleeps between frames**, so CPU use drops from a pinned core to near idle. v1's note that `Sleep(1)` costs 15 ms was wrong: the real cap was a hardcoded 16 ms frame target plus a clock (`GetTickCount`) that can only see 15.6 ms steps. Both are fixed; the loop now reads a 1 ms clock and takes its target from `game.cfg`.
Requires `lock_framerate = 7` in `game.cfg` (see below). Best for: dedicated hardware, or honestly any box now that it idles.

### `jointops_LAA_2gb_vwfix.exe` — CLIENT (players)
**New:** a client build. Not for running a server.
- **Vehicle weapon restore fix.** Since 2004: get into a vehicle seat, get out, and you are holding the weapon you last *died* with instead of the one you had. Root cause was a stale weapon cache that the number-key/mouse-wheel switch never updated. Fixed at the dismount, four bytes. Works on any server, patched or not.
- **2GB memory cap + LAA.** The stock 512MB heap limit is raised to 2GB and the exe is Large Address Aware. Fewer SYSDUMPs, and you can alt-tab/minimise without the crash lottery.
Rename to `jointops.exe` in your game folder (keep a copy of the original). Grass/visual mods are not in this file.

---

## Config lines you need

Both keys are written into `game.cfg` by the server itself, so after the first start with a v2 exe you will find them there. Edit, save, restart the server. Values are read at startup only.

### 1. Spawn protection — all three servers

```
e_spawn_protection = 5
```

Seconds of post-respawn invulnerability ("CEASE FIRE"). Retail is a fixed ~10 s baked into the exe; now it is a config line.

- The server adds the line automatically on first start as `e_spawn_protection = 0`. `0` (or no line) = retail ~10 s, so nothing changes until you set it.
- `5` gives 5 seconds. Firing still ends protection early, as always.
- **The name must be exactly `e_spawn_protection`** including the leading `e_`. The config parser only looks at keys under their first letter, and this key lives under `e` (it reuses the slot of the client-only `enable_keyboardtips`). If the server writes it back as `= 0` after you set it, the key name was wrong.
- If you had an `enable_keyboardtips` line, it is now ignored. It did nothing on a dedicated server anyway.

### 2. Frame rate lock — 125Hz server ONLY

```
lock_framerate = 7
```

**`lock_framerate` is now the frame target in milliseconds, not an on/off switch.** `7` gives ~125 FPS (each Sleep overshoots by ~1 ms, which is why it is 7 and not 8).

| `lock_framerate` | Result |
|---|---|
| `0` | throttle off: unlimited FPS, one core at 100% (the old v1 behaviour) |
| `7` | **~125 FPS, CPU idle. Use this.** |
| `8` | ~112 FPS |
| `16` | retail 62.5 FPS |

**Warning for anyone with an old config:** `lock_framerate = 1` used to mean "on". On the v2 125Hz exe it means a 1 ms target, which is nearly unthrottled again. Set it to `7` explicitly.

This line only matters on the 125Hz build. The 32Hz and 64Hz builds ignore it as before.

---

## Admin-port crash fix (all servers) — what it is

If your **empty** server crashed with a SYSDUMP every one to four days, this was it. The remote-admin console on TCP 4000 (used by WolfRAT, server monitors, any admin tool) keeps a table of connected clients. When the table grew, the server allocated it correctly but copied only one sixteenth of the old contents, leaving garbage pointers that later crashed in either the command logger or the disconnect free. A populated server rarely lived long enough between map cycles to hit it; an empty one being polled by a monitor for days always did.

Four bytes fixed. The FMJ server has been on it since 7 September 2026 with its monitor and WolfRAT connected.

Companion note for tool authors: the server only reaps an admin slot when the socket *errors*, not on a polite close. Tools that poll port 4000 should close abortively (`SO_LINGER 0`). WolfRAT 2.5+ and JO Monitor 1.3+ already do; details in patch 01 of the repo.

---

## How to use

1. Pick the server build for your hardware and player base (or the client build if you are a player).
2. Back up your current `jointops.exe`.
3. Rename the chosen file to `jointops.exe` and drop it into the game folder.
4. Start the server once. Stop it. Open `game.cfg`.
5. Set `e_spawn_protection = 5` (or the seconds you want). On the 125Hz build also set `lock_framerate = 7`.
6. Start the server. Done.

Upgrading from v1: same steps. The v1 exe had no config keys of its own, so nothing to remove.

---

## Test status (honest version)

- 2GB, LAA, bigbuf, NWU and the packet-rate builds: running on community servers since July 2026.
- Admin-port crash fix, 125 FPS lock, configurable spawn protection: running on the FMJ dedicated server since 7 September 2026, with players, verified by packet capture and in play. Not weeks yet. If your server SYSDUMPs on v2, send the dump (EIP + code bytes) to the repo issues.
- Vehicle weapon fix: confirmed in play on every seat-exit case.

## SHA-256

```
6d4dfc8014bb04a7277a8424cced77baebc50b4f115c4482f42f42271116ba9e  jointops_32hz_2gb_v2.exe
90cbae5d9712cc1517106d2ba1e6d0b02b2bc17acbb3be78bb414f258b213554  jointops_64hz_2gb_nwu_v2.exe
68de37764e4a0411c39380253b3a30f988586455c21d8a698afe800338af036b  jointops_125hz_2gb_nwu_v2.exe
66f77b419d2b8634146cfa06056ee4cb85f8c5abece678c16465150cf79211b4  jointops_LAA_2gb_vwfix.exe
```

Rebuild them yourself: apply `patch_admin_crash.py`, `patch_fps_lock.py` (125 only) and `patch_spawn_protection_config.py` from the repo to the v1 server exes, and `patch_memory_2gb.py` to the LAA + vehicle-fix client. Same hashes out.

## Credits

- **Kattoor, Big Baked Bean, biggy, SPAGHETTI, DUZ (hunterz), 51.pl, Dmonic** — community 64Hz patch and binary analysis
- **Spaghetti** — NWU hole-skip fix, tick-rate stability analysis
- **Bone (вᴏɴᴇ-)** — LAN testing, stability verification
- **BadgerLove / FMJ Squad** — v2 patches: admin-port crash, FPS lock, configurable spawn protection, vehicle weapon fix
- **Patch library + scripts:** https://github.com/BadgerLove/jo-server-patches
- **Community site:** https://jointops2024.com
- **Discussion:** https://novahq.net/forum/showthread.php?t=62971
- **Downloads / tools (WolfRAT, JO Monitor):** https://fmj-squad.com
