zombiemod-1.5.1.jar
Curse Maven Snippet
What's new
# Changelog — Zombie Mode (English)
## [1.5.1] — 2026-08-30
> Major content release: **persistent meta-game** (Gobblegum Laboratory, Gem Workshop), a
> **client-side visual-effects engine** for Tower Defense (146 gems, Core, waves, fusions), rebuilt
> screens, dedicated sounds and a deep performance pass (draw calls, particles, caches).
> 1.5.0 was never shipped: everything is consolidated here.
---
### ✨ Gobblegum 2.0 — persistent progression & the Laboratory (Classic mode)
Gobblegums are no longer pure luck: every player has a **persistent profile**
(`world/data/zombiemod_progress.dat`) that carries over between games.
- **Kills are currency.** 1 zombie = 1 kill (mini-boss: 100, configurable). TD kills don't count
by default (`progression.countTdKills`).
- **Tiered unlocks.** 40 gums in 4 rarities — **Common** (0–3,000 kills), **Rare** (5,000–20,000),
**Epic** (25,000–60,000), **Legendary** (80,000–200,000) — tuned for 30–50 wave games
(≈ 5,000–8,000 kills). Locked gums never come out of the machine. Toast + sound in-game when a
threshold is crossed (automatic unlock computed from the kill total: changing a threshold in the
config applies immediately).
- **3 independent upgrade tracks per gum**, level 1→5, paid in **essence** (= unspent kills):
- ⏱ **Duration**: ×1.3 / ×1.7 / ×2.2, then **permanent** for the whole game at level 5 (charges
1 → 2 → 3 for Phoenix Up / Carpe Diem). Insta-Kill, Glass Cannon and Hyper Electric never become
permanent (×2.2 max); Insta-Kill lv. 5 also kills mini-bosses.
- ✦ **Chance**: proc chance per kill up to ×2.1 (Hyper Electric 2 % → 4.2 %).
- ⚡ **Power**: damage, radius, **chain jumps** (Lightning 6 → 10, Hyper Electric 20 → 35),
healing, points, multipliers, up to ×1.75.
A gum only shows the tracks that matter for it. Cost per track: Common 500 → 5,000, Rare
1,250 → 12,500, Epic 3,000 → 30,000, Legendary 7,500 → 75,000.
- **Pack.** Equip up to **10 unlocked gums**: the machine only draws from your pack (or from all
your unlocked gums if the pack is empty).
- **Gobblegum Laboratory** (new screen): **G key outside a game**, a lobby block
(`/zombiegum lab set`, F or right-click) or `/zombiegum lab`. Rarity grid with a per-track
segmented progress bar, lock + threshold, a **glowing green pixel arrow** (breathing halo) when an
upgrade is affordable, gold outline for packed gums; detail panel with **one row per track**
(aligned pips, level N → N+1 values, dedicated buy button), next-pip preview on hover, purchase
flash, live essence countdown, progress bar + track teaser for locked gums; filters (All /
Unlocked / Upgradable / Locked / Pack) + search (✕ button, Delete). Read-only in-game.
- **Admin**: `/zombiegum progress <player> show|addkills|setkills|reset|unlockall|maxall`.
- **Config** (`zombiemod.json → gobblegum`, version 6): `progression` block (toggle, costs per
rarity and per track, per-level multipliers, pack size, charges…) and `unlockKills` per gum.
`progression.enabled = false` restores the previous behaviour exactly.
### ◆ Gem Workshop — persistent Tower Defense progression
- **TD kills = fragments.** Monsters killed by your gems (credited to the placer, co-op included)
feed a counter **separate** from essence: 1 kill = 1 fragment, mini-boss = 100.
- **94 upgradable entries**: the **13 families** (T1→T5) and **each of the 81 combined gems** (grid
by rank, 7 per row), up to **4 tracks** level 1→5: ⚔ **Damage** ×1 → ×1.75 (poison, income, Core
heal included) · » **Fire rate** interval ×1 → ×0.76 · ◎ **Range** +0 → +2 blocks · ✦ **Special**
parameters ×1 → ×1.5 (caps kept) and **+1 chain jump** at levels 3 and 5. Cost per track:
families 400 → 4,000 fragments; combined ×1 (minor) … ×4 (mythic).
- **Applied live** to placed gems (firing, fire rate, auras, TAB DPS, income, range circle) via
`GemStatsResolver` with the placer's profile.
- **Purchases allowed between waves** (preparation phase) or outside a game; locked during a wave.
- **"Gem Workshop" screen**: same ergonomics as the Laboratory, values computed on the family's T5
gem, **animated 3D preview** of the real gem (entity rendered by `TowerRenderer`, rotating, hover =
faster). **Gobblegum · Gems · Codex tabs** on all three screens. Access: `/zombiegems`, the lab
block during a TD game, or the tabs.
- **Admin**: `/zombiegems progress <player> show|addkills|setkills|reset|maxall`.
- **Config** `zombietd_gems.json → progression`.
### 🎆 Gem visual-effects engine (client)
- **One shot = one packet** (`GemShotFxPacket`: gem, origin, targets, flags) instead of 50–70
`sendParticles` calls (70–100 particles) per shot. The client generates and renders the effects
itself in **one batch** (additive / translucent / textured, `client/fx/*`), **with no particle
entities at all**.
- **Stat-driven composition (`GemFxComposer`)**: targeting mode (chain / cone / area / single) + one
layer per present effect (crit, freeze, poison, burn, execute, shred, mark, bounty, knockback,
stun, lifesteal, Core heal, economy) + escalation by **tier T1→T5** (size, muzzle wave from T3,
rays and helix at T5) and by **band** (impact rays, seal from major, helix + spiral super,
pillar + shake mythic).
- **13 family signatures**: ⚡ re-rolled electric arcs with branches (Citrine), laser + prism and
crit burst (Diamond), lobbed fireball → flash + **shockwave** (Ruby), ice shard + crystals + frost
ring (Sapphire), bolt + **toxic cloud** (Emerald / Peridot), textured **flame cone** (Garnet),
spiralling coins (Amber), dark shard + shatter (Onyx), dark beam + execution rays (Obsidian),
double pulse (Quartz), soft beams + aura rings (Opal / Morganite).
- **63 dedicated compositions** for the 15 minor, 10 intermediate, 26 greater and 12 major gems,
each illustrating its real powers (Hailstorm: falling hail + frost; Searing: embers + fire arcs;
Mirage: ghost doubles + mark ring; Tempest: electric tornado; Cataclysm: fire cracks; Sanctuary:
sacred halo; Supernova: flash + double wave; Blizzard: crystal storm; Thunderlord: 3 sky bolts;
Executioner: shadow axe; Accelerator: speed lines; Abyss: sucking vortex…).
- **18 unique "apex" signatures** — supers: Eclipse (black sun), Singularity (black hole), Eternal
Storm (sky lightning), Venom Garden (field + vines), King's Treasure (coin fountain), Absolute Zero
(ice nova), Volcano Heart (lava pillar), Astre (comet), Oblivion (void rays), Genesis (pillar of
life), Acceleron (speed lines), Juggernaut (massive wave); mythics: Apocalypse (meteor rain),
Omniscience (triple prismatic helix + eye), Eternity (storm + lightning column), World Tree
(roots + pillar of life), Midas Crown (orbiting crown + coin rain), Absolute (stasis field).
- **Stat-driven specials**: mark (orbit ring), stun (electric cage), knockback (wave), lifesteal
(return beam), bounty (coins), death chain (flash + wave + arcs).
- **Fusion**: converging shards from the consumed gems, then a "birth" (pillar, flash, rays, large
wave, spiral) on a runic seal, scaled by rank.
- **Auras and ambience rendered client-side permanently** (`GemAuraRenderer`): rotating aura ring
(gold = fire rate, cyan = range, blue = slow, red = vulnerability), halo + orbiting sparks for
super/mythic gems, permanent runic seal for mythics, pulsing gold ring for **fusion-ready** gems.
Server emitters (up to 28 packets per ring every 7 ticks) are gone.
- **Animated textures** (`textures/fx/fire|lightning|frost.png`, generated by
`tools/gen_fx_textures.py`): scrolling flames, textured arc cores, frost crystals.
- **No server particles left** in the gem path: execute, stun, poison ticks, death chain and combos
all go through the client engine.
### 🏰 Core, waves, camera, sounds
- **The Core** (`CoreFxRenderer`): rotating **hexagonal shield** whose colour follows HP (green →
orange → red), energy ring, orbiting sparks; **red cracks** below 50 % then 25 % HP, faster pulse.
Events: **hit** (flash, edges, wave, shake), **heal** (green pillar + spiral, max once per 2 s),
**destruction** (seal, 12-block pillar, 4 chained waves, rays, arcs, spiral, heavy shake).
- **Waves (TD)**: giant shockwaves from the Core, pillar, **"WAVE N" hologram** (red "☠ BOSS
WAVE" + seal + shake for bosses). **Lane scan**: a bright head leaves the Core and **follows each
path to point 1**, sweep bar, ground reflection, fading trail, arrival ring; lanes staggered by
6 ticks. **Victory**: golden seal, 14-block pillar, 4 waves, "★ VICTORY ★" hologram, 6 fireworks.
- **Camera shake** (`CameraShake`, smoothed "trauma" model, distance falloff): mythic impacts,
fusions, Core hit/destroyed, boss waves, victory.
- **Dedicated sounds** (compositions of vanilla sounds, FR/EN subtitles): `gem_arc`, `gem_helix`,
`gem_pillar`, `gem_fusion` (+ charge), `core_hit`, `core_heal`, `core_death`, `wave_start_td`,
`wave_boss_td`, `wave_victory`. Shot sounds limited to one per gem per 4 ticks.
- **Green halo under the target**: when aiming at a tower/gem (24 blocks) or a free socket
(7 blocks), a pulsing halo (disc, ring, rotating dashed ring, corner marks, vertical marker) shows
**exactly what F will open**.
- **Client config** `config/zombiemod-client.toml → fx`: `quality` (0–3), `maxEffects`,
`maxDistance`, `auraRings`, `cameraShake`, `textured`.
### 🖥 Screens
- **Socket screen rebuilt** (`GemScreen` v2): **stays open after every action** (the server resends
the state, points update live). Luck block with progress bar, tier marks, expected tier and a
**+1** button you can click repeatedly; random draw; **family cards** (hover = 3D preview of the
*likely* gem for your luck, stats, effects); occupied socket: 3D preview of the placed gem,
**fusion cards** (hover = result + consumed ingredients), removal with refund.
- **Gem Codex**: the grid **scrolls** (wheel anywhere over the left half, scrollbar drag, ↑/↓,
PageUp/Down); off-screen icons ignore clicks/tooltips; tabs to the Laboratory / Workshop.
- Laboratory / Workshop: robust search (any character, caret, ✕, Delete; the G key no longer
closes the screen), kills/essence header never overlapping the title, track pips on a fixed
column (two lines when narrow), first grid cell no longer clipped, 7 cells per row max.
### ⚡ Performance
- **Screens**: in 1.20.1 every screen `fill()` is uploaded and drawn separately — the Workshop grid
issued ~5,000 draw calls per frame (83 % of render time in a spark profile). Grids and panels are
drawn in managed mode (`drawManaged`, 3 passes background / textures / overlays to keep the
order): a handful of GPU uploads per frame.
- Glow arrow: ~900 `fill` calls per icon → precomputed shape + halo (~30). Descriptions, keys,
tracks, "upgradable" states and entry data cached (no more per-frame scans of the 146-gem
registry).
- Gem shots: 1 packet and 0 particles instead of 50–70 packets / 100 particles; auras and ambience
without packets; effect budget, distance LOD, limited sounds.
- 3D preview: bounded animation counter (float precision), depth buffer cleared before entity
rendering, GUI batch flushed.
### 🔧 Fixes
- **Self-Medication**: the Regeneration effect expired after the initial duration on a
permanent/extended gum → now maintained while the gum is active.
- The **Gobblegum machine** also responds to the **F** key (the HUD advertised it).
- HUD: remaining charges (`×2`), permanent gums `∞`, level (`3★`) in front of the timer.
### 🧹 Technical
- `GobblegumType` carries rarity, category, threshold; `GumSettingsBase` replaces 12 duplicated
settings classes and the four 40-case `switch`es in `GobblegumManager`.
- `GumEffectResolver` / `GemStatsResolver`: single source of truth for per-level values (server and
client). `GumTrack` / `GemTrack`: upgrade tracks.
- Packets: `GobblegumConfigSyncPacket`, `GumProgressSyncPacket`, `GumLabActionPacket`,
`OpenGumLabPacket`, `GemProgressSyncPacket`, `GemLabActionPacket`, `OpenGemLabPacket`,
`GemShotFxPacket`. `TowerEntity` syncs the "fusion-ready" state.
- `PlayerProgressSavedData` (`zombiemod_progress.dat`): kills / essence, per-track gum levels,
pack, kills per gum, TD kills / fragments, per-entry gem levels — automatic migration of the
earlier formats.
- FR/EN descriptions for the 40 gums; `docs/gobblegum-progression-design.md`; `CHANGELOG.en.md`.
---
This mod has no additional files