Jar
you can place this in server-files/java and rename the existing jar to a back-up, then restart the server to help with this issue
getZombieList, ZombiesCountBeforeDelete via SandboxOptions$ZombieConfig, canBeDeletedUnnoticed, removeFromWorld/removeFromSquare, a zombiesCulled statistic counter
ZombieCountOptimiser is the engine's population-capping safeguard.
Every tick it counts the live zombies (startCount + incrementZombie per zombie), and once the loaded count passes your ZombiesCountBeforeDelete value , deleteZombies() quietly removes surplus zombies that can go "unnoticed" — ones that are outside, off-screen, far from players, and not reanimated players — deleting them from the world and tallying a culled stat.
In the update jar, startCount, incrementZombie, and deleteZombies are all stubbed to nothing.
The counting never runs and the cull pass never fires, so the engine no longer auto-despawns zombies when crowds exceed the cap. canBeDeletedUnnoticed/isOutside are left in but nothing calls them anymore.
So the "update" jar is a binary patch whose sole purpose is to kill vanilla zombie culling ,which ties directly to everything you've been chasing.
In the attached jar, startCount, incrementZombie, and deleteZombies are all stubbed to nothing. The counting never runs and the cull pass never fires, so the engine no longer auto-despawns zombies when crowds exceed the cap. canBeDeletedUnnoticed/isOutside are left in but nothing calls them anymore.
also ZombiesCountBeforeDelete sandbox setting becomes dead with this jar, since the code that reads it is stubbed. Tuning that number might not do anything anymore.
I`m curently testing this on a MP hosted server and looks like it`s actually keeping the zombies. Hope it will also respawn after players kill them as expected