# Evil Curse Fix (evilcursefix)
**Mod Summary**
A defensive patch mod for the modpack "CLOSING SONG EZHOU 1.3.1" (Minecraft 1.20.1 / Forge 47.4.0).
It fixes crash loops, null-pointer failures, recursive event re-entry and version-skew
incompatibilities between the modpack's third-party mods — without modifying any of them.
## What it does
All fixes are applied at runtime through Mixin injection. No third-party mod file is
ever changed; removing this mod fully reverts every patch.
| Area | Fixes |
|---|---|
| **Fatal crashes** | EventBus error-logging path (log4j `MessageSupplier` classloading conflict), Apotheosis loot conversion crashes on curios items with no affix pool |
| **Recursion / stack overflow** | Reflective-damage loops between tcc / Spudiversity (5 handlers) / Goety robes / RankHandler / SlashBlade `doSlash` / YakumoBlade `Highfrequency` / time_slow armor piercing — each guarded with thread-local re-entrancy checks |
| **Null-pointer crashes** | Vanilla & mod villager trades, SlashBlade `EntityDrive` save, Goety `Owned.isAlliedTo(null)`, AttributeMap missing-attribute-supplier accessors, empty-player GUI/LightTexture rendering |
| **Version-skew APIs** | traveloptics ↔ Cataclysm laser constructor & ring particle data, maid spell ↔ Goety `WandUtil.getStats`, Virtual Witch Arrangement learn-spell packets |
| **Concurrency** | flame_chase_artifacts attribute-map `ConcurrentModificationException` guard |
| **Performance** | curios `TagKey` intern-storm cache (lock-free), cached reflective method handles on damage hot paths, re-entrancy guards that stop duplicate damage chains |
| **Diagnostics** | Built-in watchdog thread: 60 s status summaries (memory / TPS / FPS) and automatic full thread-stack dumps when the server or render thread stalls ≥ 30 s; `LivingHurtEvent` latency probe with per-30 s stats and slow-event stack traces |
## Requirements
- Minecraft 1.20.1, Forge 47+
- All third-party mod targets are **optional**: if a target mod is absent, its patch is
silently skipped (a WARN is logged) and everything else keeps working.
## Installation
1. Put `evilcursefix-<version>.jar` into the instance's `mods/` folder.
2. If an older `ezfix-*.jar` is present, remove it (same functionality, new mod id).
3. Launch the game. Watch for `[ezfix-monitor]` lines in `latest.log` to confirm the
watchdog is active.
## File / artifact naming
- Mod id: `evilcursefix`
- Display name: `Evil Curse Fix`
- Jar: `evilcursefix-<version>.jar`
- Internal Java packages keep the historical `com.example.ezfix` namespace
(implementation detail only; invisible to the end user).

