All versions
1.4.0
Release
OPShield 1.4.06 months ago 20
Compatibility
Minecraft: Java Edition
1.21.x
Platforms
Paper
Purpur
Changes
[1.4.0] — 2026-04-14
Security hardening
- migrated password storage to
op_password_hashso plaintext is no longer kept in config after migration - added PBKDF2 password hashing for new stored credentials
- preserved backward compatibility for older SHA-256 hashes during migration
- made firewall execution explicitly unsafe and opt-in only via
allow_unsafe_firewall_exec - disabled auto-punishment by default to reduce accidental false positives on fresh installs
Logic fixes
- fixed IP-limit detection so it counts unique accounts inside a real rolling time window
- changed OP whitelist enforcement to apply to
/oponly - added lockout count decay after a configurable cooling-off period
- cleaned expired lockouts and expired IP flags automatically on a schedule
- localized shadow-ban fake success messages instead of hardcoding English strings in Java
Performance and maintainability
- replaced repeated async save spawns with a debounced persistent save loop
- replaced synchronous audit file writes with queued async flushes
- added basic audit log rotation
- cached
CommandMapreflection result instead of resolving it on every blocked command - split hashing and audit logging into dedicated helper classes
Permissions and command handling
- added
opshield.op - added
opshield.deop - added
opshield.admin - added
opshield.bypass - kept
/opshield reloadand/opshield unlock <player|ip>as admin management commands
Config changes
- added
op_password_hash - retained
op_passwordonly as a legacy migration input - added
broadcast_on_privilege_change - added
audit.* - added
security.lockout.track_ip - added
security.lockout.count_decay_hours - added
auto_punishment.window_seconds - added
auto_punishment.custom_command - added
auto_punishment.allow_unsafe_firewall_exec - added
ip_limit.auto_punish - added
ip_limit.flag_duration_minutes
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:lC31Z11v"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:Bv67n40d:lC31Z11v"
}

