All versions
1.5.0
Release
OPShield 1.5.06 months ago 12
Compatibility
Minecraft: Java Edition
1.21.x
Platforms
Paper
Purpur
Changes
[1.5.0] — 2026-04-19
Bug fixes
Medium severity
sensitiveCommandHistorynow persisted todata.yml— the auto-punishment rolling window survived previously only in memory, allowing players to bypass the threshold by timing restarts or crashes. Timestamps are now written on every dirty flush and restored on startup; stale entries outside the configured window are discarded automatically on load.- Shadow-ban level escalation is now enforced —
playerShadowBanLevelwas incremented and stored but never acted upon. A new config keyshadow_ban.auto_punish_level(default3) defines the threshold at which the level triggers realauto_punishmentand then resets. Requiresauto_punishment.enabled: true. - Firewall script no longer blocks the main thread —
executeFirewallBlockpreviously calledRuntime.getRuntime().exec()synchronously, which could freeze the server if the script was slow. It now runs asynchronously viaProcessBuilderwith a configurable hard timeout (auto_punishment.firewall_timeout_seconds, default10). The player is kicked immediately on the main thread; the OS script executes in the background.
Low severity
unlockIdentifier()now clearssensitiveCommandHistory— previously,/opshield unlockcleared all other tracking maps but leftsensitiveCommandHistoryintact, causing inconsistent state after a manual unlock.getMsgPlain()replaced fragile color-strip logic — manualreplace('&X', "")calls missed several color codes and decorators. Now uses Adventure'sPlainTextComponentSerializerfor correct, future-proof plain-text extraction.- Multi-file audit log rotation —
AuditLoggerpreviously kept only one backup file (audit.log.1), permanently overwriting it on every rotation. Rotation now shifts files:audit.log.1→audit.log.2→ … →audit.log.N. Controlled byaudit.log_retention(default3). - Config validation for
auto_punishment.command— an unrecognized mode with nocustom_commandset now prints a clear console warning on load and reload instead of silently falling back to a potentially unexpected behaviour.
New config keys
| Key | Default | Description |
|---|---|---|
shadow_ban.auto_punish_level |
3 |
Shadow-ban level threshold that triggers auto-punishment |
audit.log_retention |
3 |
Number of rotated audit log backup files to keep |
auto_punishment.firewall_timeout_seconds |
10 |
Max seconds before a hung firewall script is force-killed |
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:Bv67n40d:EzT2H73J"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:Bv67n40d:EzT2H73J"
}

