All versions
0.2
Release
WorldPulse 0.23 weeks ago 20
Compatibility
Minecraft: Java Edition
1.21.x
Platform
Paper
Changes
Adds the World State layer and Automatic Reactions on top of v0.1's activity tracking. This version also replaces the fixed-window Pulse calculation with continuous decay.
Added
- Nature activity channel — a fifth Activity Pulse tracking tree felling, sapling/mangrove propagule planting, and fishing. Player-placed logs are excluded from felling credit, mirroring the existing Mining anti-exploit protection.
- World State layer — four new 0–100 scores computed every update tick:
- Threat — driven by sustained Combat Pulse and by player deaths in that world.
- Stability — smoothly tracks a target derived from Threat and from extreme Mining/Combat activity, rather than jumping instantly.
- Ecology — a running ecological balance driven by felling (down) and planting (up), with a gentle pull back toward a configurable healthy baseline over time. Unlike every other tracked value, it does not decay toward zero on its own.
- Civilization — driven by completed villager trades, building-material placement, and bed placement, plus the current online population and how much of the world has been explored.
- Automatic Reactions — chat announcements when a world's Threat rises above, or its Ecology/Stability falls below, a configurable threshold, with a matching recovery message once it settles back. Separate warning/safe thresholds (hysteresis) plus a cooldown prevent spam from a value hovering near the line. Toggleable per world.
/worldpulse statusnow also displays Threat, Stability, Ecology, and Civilization alongside the five Activity Pulse channels.world_state_snapshotstable — periodic, asynchronous World State snapshots saved alongside the existing Activity Pulse history.- New configuration sections:
pulse.decay-per-hour,world-state.*(per-score formula weights), andreactions.*(per-score warning/safe thresholds and cooldown), plus anaturetoggle and areactions.enabledtoggle per world.
Changed
- Pulse calculation now uses continuous exponential decay instead of a fixed rolling window. Every Activity Pulse channel (and most World State scores) updates each tick as
new = clamp(old × decayFactor + gain, 0, 100), so a value fades smoothly rather than dropping off a cliff when it exits a 15-minute window.pulse.window-minuteshas been removed in favor ofpulse.decay-per-hour. pulse.thresholds.*now represent points needed per hour of sustained activity to hold a Pulse near 100, rather than points needed within the old fixed window. Existing values carry over with the same names but a different effective meaning.- Scheduling for Activity Pulse, World State, and Reactions is now centralized in a single coordinator so all three update in a guaranteed, consistent order every tick.
world_statisticsgains anaturecolumn. Existing v0.1 databases are migrated automatically on first startup after updating — no manual steps required.
Technical
- World State and Reaction state live in memory only, updated on the same main-thread tick as Activity Pulse; database writes for both new and existing tables remain asynchronous and off the hot path.
- Anti-exploit block-placement tracking (previously Mining-only) is now shared via a common utility and reused by the new Nature channel.
Known Limitations (by design, addressed in later versions)
- Reactions are chat notifications only — no mob spawns, special loot, GUI, boss bars, titles, or sounds yet (planned for v0.3's Dynamic Events).
- No per-player statistics, profiles, or achievements yet (planned for v0.4).
- No PlaceholderAPI or DiscordSRV integration yet (planned for v1.0).
Requirements
- Paper (or a Paper fork) — Spigot/CraftBukkit is not supported
- Minecraft 1.21.x
- Java 21+
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:AYYKzcxe:2NFR74Yt"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:AYYKzcxe:2NFR74Yt"
}

