# ZombieApocalypseSSS – Bug Fix Report (v4.3.2 → v4.3.3)
## Custom Items Retained
- **Bandage** – stops bleeding
- **Antivirus** – cures infection
- **Adrenaline** – speed/strength boost (60s cooldown, crash effect after)
- **ZombieCamo** – zombies ignore you for 60s
- **Radio** – detect next supply drop location (5min cooldown)
---
## Bug Fixes
| # | Severity | File | Description |
|---|----------|------|-------------|
| 33 | 🔴 | ZombieSpawnService | Zombie names encoded as `§c§lSCREAMER` → fixed to `§c§lSCREAMER`. Affected: SCREAMER, Stalker, Crawler, Feign Death, Boss. Names were rendering as garbage text on all servers. |
| 34 | 🔴 | ZombieApoc (onEnable) | `registerRecipes()` was never called — comment `RECIPES REMOVED` was accidentally left after feature re-enable. All 6 vanilla crafting recipes (bandage, antivirus, adrenaline, zombie camo, radio, turret) were silently unavailable. |
| 35 | 🔴 | BandageItem | `create()` read `custom-model-data` from `getPluginConfig()` (config.yml) instead of `getItemsConfig()` (items.yml). Bandages would always spawn without CustomModelData, breaking resource packs. |
| 36 | 🔴 | SurvivalGuideListener | `SurvivalGuideHolder.getInventory()` returned `null` — violates `InventoryHolder` contract. Fixed: holder stores and returns its own `Inventory` reference. |
| 37 | 🔴 | MilitaryCheckpoint | `spawnTowerSniper()` re-rolled random offset/height instead of using the cached `towerBase`/`towerHeight` computed in `cacheTowerPosition()`. Tower snipers could spawn anywhere except the actual tower. |
| 38 | 🟠 | AdrenalineItem | `onInteract()` lacked `RIGHT_CLICK_AIR / RIGHT_CLICK_BLOCK` guard. Item could trigger on `LEFT_CLICK_BLOCK` in edge cases. |
| 39 | 🟠 | ZombieApoc (TabComplete) | `/zapoc give camo` was listed in tab-complete but the switch-case expected `"zombie-camo"`. Fixed to `"zombie-camo"` in both places. |
| 40 | 🟠 | CrashedSupplyPlane | `setMaxHealth()` deprecated since Bukkit 1.16. All mob health now uses `Attribute.GENERIC_MAX_HEALTH.setBaseValue()`. Affected: pilot, supply guard, medic, soldier zombies. |
| 41 | 🟠 | MilitaryCheckpoint | Same `setMaxHealth()` deprecation fix for heavy soldiers, commanders, and tower snipers. |
| 42 | 🟠 | AbandonedHospital | `WHITE_BED` placement ignored required `BlockData` facing direction — bed failed silently. Replaced with `WHITE_WOOL` as visual equivalent. |
| 43 | 🟠 | RadioItem | Lore cooldown update only scanned main hand + off hand. If player moved radio to any other slot the cooldown label stayed stale forever. Fixed to scan full inventory. |
| 44 | 🟡 | Structure types (×5) | `isReplaceable()` and `isValidMobSpawn()` copy-pasted in 5 classes. Extracted to new `StructureHelper` utility class. |
| 45 | 🟡 | AbandonedHospital, AbandonedOutpostPro, SurvivorCamp | Structure zombies used vanilla `world.spawnEntity()` — bypassing custom AI, tier evolution, sun effects, and tracking. Now use `ZombieSpawnService.spawnCustomZombie()`. |
---
## New Utility Class
**`StructureHelper`** (`structure/StructureHelper.java`)
- `isReplaceable(Material)` — shared replaceable-block check
- `isValidMobSpawn(World, Location)` — 3-block column spawn validation
- `setBlockSafe(World/Location, Material)` — convenience block-place wrapper
## [4.3.3] - 2026-04-13 - Bug Purge & Structure Overhaul
### Fixed
- **Zombie name encoding** — SCREAMER, Stalker, Crawler, Feign Death, and Boss zombies displayed garbage text (`§c§lSCREAMER`) on all servers due to source-file encoding corruption. All names now render correctly.
- **Recipes never registered** — all 6 crafting recipes (Bandage, Antivirus, Adrenaline, Zombie Camo, Radio, Sentry Turret) were silently missing. `registerRecipes()` is now correctly called in `onEnable`.
- **Bandage CustomModelData** — `BandageItem.create()` read CMD from the wrong config file (`config.yml` instead of `items.yml`). Bandages now respect resource-pack model overrides.
- **SurvivalGuide GUI crash** — `SurvivalGuideHolder.getInventory()` returned `null`, violating the `InventoryHolder` contract. The holder now stores and returns a proper `Inventory` reference.
- **Tower sniper spawn position** — `MilitaryCheckpoint` snipers re-randomised their spawn offset on every call instead of using the cached tower position from `cacheTowerPosition()`. Snipers now always spawn on the tower platform they are supposed to guard.
- **AdrenalineItem left-click trigger** — added missing `RIGHT_CLICK_AIR / RIGHT_CLICK_BLOCK` guard; item could fire on left-click in edge cases.
- **`/zapoc give zombie-camo`** — tab-completion listed `"camo"` but execution expected `"zombie-camo"`. Both are now consistent.
- **`setMaxHealth()` deprecation** — replaced all deprecated `LivingEntity.setMaxHealth()` calls in `CrashedSupplyPlane` and `MilitaryCheckpoint` with `Attribute.GENERIC_MAX_HEALTH.setBaseValue()`.
- **AbandonedHospital beds** — `WHITE_BED` placement requires directional `BlockData` not set during procedural generation, causing silent failures. Replaced with `WHITE_WOOL` as a visual equivalent.
- **RadioItem stale cooldown lore** — cooldown label in item lore only updated when the radio was in the main hand or off hand. Now scans the full inventory so the label always reflects the real cooldown.
### Changed
- **Structure zombies now use plugin AI** — `AbandonedHospital`, `AbandonedOutpostPro`, and `SurvivorCamp` spawned plain vanilla zombies that bypassed custom AI, tier evolution, sun effects, and the tracking map. They now call `ZombieSpawnService.spawnCustomZombie()`, so all structure zombies scale with server difficulty like any other custom zombie. Thematic equipment (hospital gown, outpost guard gear, survivor leather) is applied on top of the custom zombie.
### Added
- **`StructureHelper` utility class** — `isReplaceable(Material)`, `isValidMobSpawn(World, Location)`, and `setBlockSafe()` were copy-pasted identically across 5 structure classes. This shared utility eliminates the duplication. All structure implementations now delegate to `StructureHelper`.
### Notes
- No config file changes required for this update. Existing `data.yml`, `campfires.yml`, and `turrets_data.yml` are fully compatible.
- This release is recommended for all servers running 4.3.x.
---
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }