PATCH. Reverts 9830689 regression: nextNpcId was incorrectly lowered to 1000 (for CTF OOM fix), causing NPC IDs to collide with user units (1001, 1002) — player appeared on enemy team in Last Stand. Fix: nextNpcId stays 100000 for NPCs; CTF uses its own hardcoded flag IDs (7203, 7204 from PCAP). AllocateNpcId removed from GameInstance.
News
Release updates and server news. Newest first.
MINOR. Path graphs can now be overlaid on the 3D Map Viewer for realistic visualization. Gameserver adds map_name to path graph CSV; Map Viewer accepts optional pathgraph overlay; admin Path Graphs tab has "View on map" with overlay modal (darkened background, close button).
MINOR. MinIO extracted to dedicated submodule (git@gitlab.com:axedsteel/minio.git) with Config and baked-models self-contained. Server sanitised: removed GeoMapVisualizer (migrated to graphworker), Config (moved to minio), old Dockerfile, docker-compose, start.sh. Mesh Viewer UI: full-width search/tree, folder icons instead of arrows, load on tab switch.
PATCH. Mesh Viewer in admin Manage: dropdown selector for 3D models (glb/gltf) from MinIO, same UI pattern as Map Viewer. All Exteel meshes (Animations/*.ukx, StaticMeshes/*.usx) exported via umodel and baked into MinIO image at `models/` prefix. No upload step required.
PATCH. MinIO object storage with Config baked into a custom image; config-sync pulls to shared volume for gameserver. Map Viewer in admin Manage: dropdown selector from MinIO, full-page overlay with loading state, no file picker. Removed server/Config fallback and upload-config service.
MINOR. CTF is now fully playable end-to-end. Three issues fixed: flag bases were placed at wrong map positions (now use dedicated `*_ctf.spn` files per map with confirmed base coordinates); the top-of-screen capture HUD counter was not updating (now sends `0xBB S_CTF_CAPTURE_SCORE` after each capture); client OOM crash on match start caused by oversized flag unit IDs (NPC ID pool lowered from 100000 to 1000). `0x54` flag info packet corrected with proper team encoding per flag entry.
MINOR. Capture the Flag game mode wired up end-to-end (balanced team assignment, split spawns, flag pickup/capture/drop mechanics, 0xB9/0x3D packet support). `#dumpmech <name>` command (all users) exports current mech loadout to infra-redis; profile page "Loadout Exports" tab lets players download/delete JSON exports. Last Stand admin tools: `#skipstage` (cycle stage 0–10 with 40s countdown in LS_TEST/LS_SUSPEND), `#lsinit [next]` (replay or step-through match-start packet sequence). Admin panel health check improved (2-consecutive-failure threshold, data refetch without full reload, parallel server status fetch). New documentation: NPC encyclopedia with reference images, CTF packet analysis, LS full match wave/spawn analysis.
PATCH. Base destruction now triggers defeat-base (footer[0]=1) instead of defeat-life (footer[0]=2). Client-tested correct. Documented all match-end behaviours: Victory (0), base destroyed (1), defeat-life (2 reserved for future limited lives). Updated all Last Stand docs, engine protocol reference, exteel-status.
PATCH. Corrected 0x50 footer[0] mapping (client-tested): 0=victory, 1=defeat-base, 2=defeat-life. Victory was incorrectly using 1 (showed defeat-base). LastStand victory path now uses 0; base kill uses 2. Added `#end victory|defeat|defeat-life` admin command to trigger each end-screen combination directly. Match end packet documentation (GAME_MODES_LAST_STAND_MATCH_END_PACKETS.md) and debug logging.
PATCH. Documentation updates: Last Stand mechanics (4 waves: soldier, shooter, soldier, miniboss+drone), end-to-end investigation, constants, NPC spawn presets; analysis patching guide and engine protocol reference fixes; INDEX and CLIENT updates. client-builder: README rewrite (patch/rehash workflow, LIEF, l2encdec), new l2encdec/README for Exteel-specific usage. Server: LastStand.cs comment fix (wave 3 gunner→soldier). Project rule: TODO and Last Stand mode description updates.
PATCH. developer.dll now fully implements the original spec. Added: `CClientSocket::Connect/InitSocket/Reconnect` inline hooks with proper trampoline (prologue-aware length disassembly, `VirtualAlloc` executable stub); server address override reads `[Server] ServerAddr/ServerPort` from `developer.ini` and is applied at connect time. `CClientSocket::OnUserNetmessage/OnUserConnect/OnDisconnected` connection lifecycle hooks (disabled by default). `UGUIController::eventNotifyLevelChange` and `NativeMessage` GUI hooks (disabled by default). `ws2_32!connect` and `WSAConnect` IAT hooks with address override (disabled by default). `[Log] LogCategories` filter — comma-separated category whitelist, empty = log all. Fixed inline hook trampoline: previous version stored the patched address as the original function pointer (infinite recursion → stack overflow). New trampoline correctly copies N bytes covering complete instructions (measured with a minimal x86 length disassembler), appends a 5-byte JMP back to `addr+N`, and stores trampoline address as the original. Fixed `InitSocket` crash: first instruction is 6-byte `MOV EAX, FS:[0]`; copying only 5 bytes caused execution to land mid-instruction. Added `ws2_32.lib` to linker dependencies. Added `LogCategories` to INI, expanded all sections with new hook options.
C→S packet capture working — multi-module IAT scan hooks GF.DLL and all send() callers
MINOR. Last Stand defeat now shows "DEFEAT - LIFE" end screen when base is destroyed. Fixed 0x50 packet footer[0] for defeat (value=2). Per-player result always 1 (sidx must be 0–1; -1/2 crash). Added `#kill base` admin command to immediately destroy the base for testing. Death penalty and scoring carry over from v0.21.4.
client-builder: LIEF patch in container, no Python on WSL
PATCH. Last Stand: base destroyed ends match with defeat (-2000 penalty). Death penalty allows negative scores, sends DefensiveBattleScore. GameEnd per-player result and footer. KillUnit only updates killer scores when killer is a player (Owner != null).
Last Stand dev summary: detailed packet payloads (0x5E, 0x7E, 0x50, etc.)
MINOR. Last Stand base/aerogate HP scaling 5k–20k by player×wave; rescale on join/leave. NPC attack cooldown 5×. Arena LS spawn points updated.
MINOR. Last Stand base/aerogate HP scaling 5k–20k by player×wave; rescale on join/leave. NPC attack cooldown 5×. Arena LS spawn points updated.
MINOR. Last Stand base/aerogate HP scaling 5k–20k by player×wave; rescale on join/leave. NPC attack cooldown 5×. Arena LS spawn points updated.
PATCH. NPC combat redesign: 160° FOV (facing-based), target priority (base > aggro > closest), LOS broken by geomesh or 1500u → forget combat, chase 600u, path smoothing (more waypoints, no boost), turn rate 180°/s.
NPC combat: 160° FOV, base>aggro>closest, LOS reset, path smoothing
NPC LOS (3D geo), aggro drop 650u, Gun LOS safety
PATCH. NPC collision with players and each other, path AI aggro (20% damage trigger, LOS/leash revert), player repulsion when aggrod on leash, movement speed scaling (miniboss 0.6, common 0.8).
PATCH. Last Stand wave system refinements: 4 waves (soldier, shooter, soldier, miniboss+drone), NPC health scaling (0.1x–0.7x player avg), wave 1 blue/0.75 scale, default orange paint, miniboss 1x HP with soldier model, PreserveMaxHealth for wave NPCs.
PATCH. Fix client crash (`sidx>=0 && sidx<2` in BattleManager.cpp:2652) when multiple players join Last Stand. Three fixes:
PATCH. Fix client crash (`sidx>=0 && sidx<2` in BattleManager.cpp:2652) when multiple players join Last Stand. Three fixes:
PATCH. Fix client crash (`sidx>=0 && sidx<2` in BattleManager.cpp:2652) when multiple players join Last Stand. Three fixes:
PATCH. Fix client crash (`sidx>=0 && sidx<2` in BattleManager.cpp:2652) when multiple players join Last Stand. Three fixes:
Fix multi-player Last Stand crash: ScoreUpdate per-user padding corrected (10→9 bytes), filtered multicasts during loading, packet ordering fix.
Last Stand: rollback join-in-progress guard, add GeoObjectsHp (0x6A) to match burst
MINOR. Deathmatch "waiting for other players" fix. Lobby room list: 0x19 RequestSearchGame handled, push on leave/OnEnter, 10s periodic, empty rooms report 1 player for grace-period rejoin.
MINOR. Deathmatch "waiting for other players" fix. Lobby room list: 0x19 RequestSearchGame handled, push on leave/OnEnter, 10s periodic, empty rooms report 1 player for grace-period rejoin.
MINOR. Deathmatch "waiting for other players" fix. Lobby room list: 0x19 RequestSearchGame handled, push on leave/OnEnter, 10s periodic, empty rooms report 1 player for grace-period rejoin.
MINOR. Deathmatch "waiting for other players" fix. Lobby room list: 0x19 RequestSearchGame handled, push on leave/OnEnter, 10s periodic, empty rooms report 1 player for grace-period rejoin.
MINOR. Deathmatch "waiting for other players" fix. Lobby room list: 0x19 RequestSearchGame handled, push on leave/OnEnter, 10s periodic, empty rooms report 1 player for grace-period rejoin.
MINOR. Deathmatch "waiting for other players" fix. Lobby room list: 0x19 RequestSearchGame handled, push on leave/OnEnter, 10s periodic, empty rooms report 1 player for grace-period rejoin.
MINOR. Deathmatch "waiting for other players" fix. Lobby room list: 0x19 RequestSearchGame handled, push on leave/OnEnter, 10s periodic, empty rooms report 1 player for grace-period rejoin.
PATCH. init-letsencrypt IP address cert support (6-day short-lived profile). Deploy-templates and LETSENCRYPT_STAGING docs. docker-compose.arm.yml for local ARM64 dev.
MINOR. Publish to registry and stack-deploy. SSL compose and init script in stack-deploy. Build cache optimizations.
MINOR. Publish to registry and stack-deploy. Includes v0.17.1 (Let's Encrypt HTTPS), v0.17.0 (graphworker in deploy).
MINOR. Graphworker added to publish flow and deploy templates. Path Graphs Display now works in stack-deploy deployments.
MINOR. Admin guide updated with new screenshots, Path Graphing 2s correction, fixed capture paths. Publish script corrected for documentation/admin/ paths.
Publish to registry and stack-deploy. Includes v0.14.1 (appstatus redaction, status page CSS, publish cache).
Appstatus API redacts database tables for non-admin. Status page public with card styling. Publish script uses date-stable BUILD_TIME for Docker cache.
Architecture docs for graphworker, path graphing. Path graph: 2s poll, admin display, pathgraphs API.
Graphworker extracted to own GitLab repo, added as submodule.
Path graph: 2s poll, hover coords, single-point segments, higher-res SVG. Admin: graphworker in Infrastructure, delete/display via data attributes.
GameCreated result=1 for template-not-found (Capital City LS, CTF maps) triggers client 'Map doesn't exist' message.
Last Stand: stacked waves, early clear bonus, game start guard. Enemy counts stack across waves; +200 bonus for early clear.
Last Stand: sync match-start burst, 40s grace, wave transition fix. No more 'waiting for other players' stuck.
Last Stand PVE playable end-to-end: waves, HUD, scoring, victory. Full PVE HUD, TAB scoreboard, 'Victory' message.