
ZombieApocalypseSSS
ZombieApocalypseSSS is a comprehensive Minecraft plugin that transforms your server into a thrilling zombie survival apocalypse. Featuring advanced zombie AI, evolving variants, player infection mechanics, psychological horror elements, and dynamic events
4.0
Compatibility
Changes
[4.0] - 2026-03-12 - Update Checker + Version Bump
β¨ New Features
- Modrinth Update Checker β The plugin now checks for new versions on Modrinth during server startup.
- Runs fully async; won't lag the main thread even if the network is slow.
- If an update is available: Prints a clear console notification showing current vs. latest version.
- Admins with the
zapoc.adminpermission receive a chat notification upon joining (delayed by 2 seconds to avoid being buried by other login messages). - Can be completely disabled via
update-checker: falseinconfig.yml. - Class:
UpdateChecker.javaβ implementsListenerto hook intoPlayerJoinEvent.
π Bug Fixes
-
Messages never loaded (Critical) β
loadConfig()calledsaveResource("messages_vi.yml"), but the file is located atlanguage/messages_vi.ymlinside the JAR.saveResourcethrew a startup exception, leavingmessagesConfigemptyβresulting in everygetMessage()call returningΒ§cMissing key: .... Fixed by using the correct sub-path and ensuring parent directories are created if missing. -
/zapoc panicspawned vanilla zombies β The command calledZombieSpawnService.transformZombie(z, "random"), but"random"is not a valid key in thezombieTypesmap. This causeddata == null, making the method return immediately without applying stats, AI, or types. All 15 panic zombies were plain vanilla. Fixed by callingZombieSpawnService.randomizeZombie(z). -
Supply drop interval ignored config β
WorldEventTask.calculateNextDrop()attempted to readplugin.getPluginConfig().getLong("supply-drop.interval")fromconfig.yml, but the key is actually defined inevents.yml. The interval always defaulted to the hardcoded 18,000 ticks. Fixed by reading fromplugin.getEventsConfig(). -
Sun effect settings ignored config β
ZombieBehaviorTask.handleSunEffect()attempted to readsun-effect.mode,sun-effect.light-threshold, and related keys fromplugin.getPluginConfig()(config.yml), but those keys reside insun-effect.yml. Sun slow/burn modes always used hardcoded defaults. Fixed by reading fromplugin.getSunEffectConfig().
β οΈ Minor Fixes
-
Bleeding tick check unreliable β
PlayerStatusTaskusedBukkit.getCurrentTick() % 40 == 0to throttle bleeding damage to every 2 seconds. Because the server tick counter and task invocation aren't perfectly aligned, the check fired inconsistently. Replaced with a localtickCountfield incremented on each run. -
canSpawnMutated()allowed 2 Mutated per chunk β The method returnedcount < 2despite a comment explicitly stating the design cap is 1 per chunk. Adjusted tocount < 1. -
ZombieApocRefactored.javaremoved β Cleaned up a dead-code class from a previous refactor attempt. It was never used as the main class and contained inverted command logic. Deleted entirely.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:pSQD27Eo:m5iqKIRA"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:pSQD27Eo:m5iqKIRA"
}
