Tags
Creators
Details
All versions
1.6.12
Release
StaffModeration 1.6.123 months ago 9
Compatibility
Minecraft: Java Edition
1.21.x
Platforms
Bukkit
Folia
Paper
Purpur
Changes
StaffModeration v1.6.12 (Folia) — Changelog
🌏 Link Log Timezone (IP Geolocation)
- Added
GeoTimeUtil.java— resolves a player's real-world timezone from their connecting IP via ip-api.com geolocation (no API key required) - Link/unlink/daily-reward Discord log embeds now show the player's own local time instead of a fixed UTC timestamp
- Falls back to
settings.link-log-timezone(defaultUTC) indiscord.ymlif lookup fails, player is offline, or IP is private/loopback - Results are cached per-IP for the server session to avoid repeated lookups
🔑 Fixed Mismatched Link Reward Messages
- Fixed 4 separate spots where Discord/in-game messages hardcoded "1x Crimson Key + 1x Prime Key" regardless of what
link-reward-commandsinconfig.ymlactually ran:- In-game first-time link message
- Offline-then-join delayed reward message
/linkDiscord DM embed ("Link Reward" field)- Link log embed ("Rewards Got" field)
- All 4 now read from a single shared source (
describeLinkRewards()), parsing the actual configured commands (key/eco style) into human-readable text — so the message always matches what was really dispatched
🎮 Manage Player GUI — New Lore Format
- Rebuilt the "Manage Player" head lore to show:
NamePing: %ms%ms(live, updates every tick while menu is open)Location: %world%Logs→Kick: <count>/Ban: <count>/Report: <pending>/<total>, last reporter
- Added new
target_punishment_historySQLite table (DatabaseManager.java) tracking lifetime kick/ban counts per player (survives unbans/expiries, unlike the old active-bans-only list) - Added
ReportManagerhelpers:getReportCountAgainst(),getPendingReportCountAgainst(),getLatestReporterAgainst() - Folia-safe: live refresh task runs on the staff member's own entity scheduler, auto-cancels on menu close/logout
💬 Chat Code — Configurable Rewards
- Chat Code winner reward commands and win message are now fully configurable in
discord.ymlunderchat-code.reward-commands(key/money) andchat-code.win-message - Supports
%player%,%reward%,%key_type%,%amount%placeholders - Falls back to original
crate givekey/eco givecommands if unset
🤖 AI — Live Server Backend Awareness
- AI can now report TPS (1m/5m/15m), MSPT, online player count, server region, and per-player latency (min/avg/max) when asked about lag/performance
- All numbers pulled live from Bukkit/Paper APIs — never estimated or guessed
- Added
buildPerformanceContext()inDiscordManager.java
🧭 Universal Command Routing
- All standalone commands (kick, ban, mute, freeze, vanish, link, gmc, gms, gma, gmsp, report, invsee, chatcode, announce, and more) are now also reachable via
/sm <command>and/staffmod <command> - Delegates to the exact same executor instances — zero logic duplication, permissions stay identical
- Fixed permission gating: delegated commands check their own permission node instead of being blocked by
staffmod.use - Tab-completion also delegates to each command's own completer (player names, durations, reasons, etc. all still work correctly through
/sm)
📁 Config Changes
discord.yml
- Added
settings.link-log-timezone(default"UTC") - Added
chat-code.reward-commands.key/chat-code.reward-commands.money/chat-code.win-message - Added AI system-context note documenting TPS/MSPT/latency/region lookup usage
config.yml
- Added
settings.modrinth-slug(default""— must be set for/sm updateto work)
🗄️ Database Changes
- New table:
target_punishment_history(uuid, player_name, kick_count, ban_count)- Auto-created on plugin startup via
createTables() - Populated automatically on every kick (
KickManager) and ban (BanManager)
- Auto-created on plugin startup via
⚙️ Folia Compatibility
- All new code uses
plugin.getScheduler()(SchedulerAdapter) instead of rawBukkit.getScheduler()where region-thread safety matters - Manage GUI live-refresh task uses
runAtEntity/runAtEntityTimerpinned to the staff member's own thread - DB writes (
incrementKickCount,incrementBanCount) userunAsync - Verified safe on both Folia and Paper/Spigot (SchedulerAdapter auto-detects and falls back correctly)
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:L15sUXUh:x2OQccPf"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:L15sUXUh:x2OQccPf"
}

