Moderator progression controls
Commands and permissions
Grant the specific LuckPerms node to the staff group that needs each action:
/lp group moderator permission set mcprogression.admin.reset true
/lp group senior-mod permission set mcprogression.admin.reset.sync true
/mcpadmin reset <player> clears the player's profile, including skill XP, General XP, per-world totals, daily caps, discoveries, and General XP claims. It writes a durable reset marker so the next login will not restore historical statistics. Global source claims and CoreProtect event fingerprints are deliberately retained because they are not safely attributable to one player.
/mcpadmin reset-sync <online-player> clears the profile and rebuilds skill XP from that player's current Minecraft statistics. The player must be online because Bukkit exposes the statistic snapshot through the online player. The operation is synchronized as one profile replacement and is safe to run again; it replaces this plugin's profile rather than adding XP to it.
The mcprogression.admin root permission still grants access to the admin menu. Granting either leaf reset permission also allows /mcpadmin and its permission-checked reset action, so reset moderators do not need the broader admin permission.
XP investigation and reports
Grant mcprogression.admin.xp.history to staff who need /mcpadmin xp history <player> [days] [page], and mcprogression.admin.xp.report to staff who need /mcpadmin xp report [days]. These are separate read-only permissions. Player history shows daily action totals and older monthly snapshots; reports summarize awarded XP by McProgression Global Rank, LuckPerms primary group, and source action as recorded at award time. LuckPerms uses the player's primary group; if LuckPerms is absent or its user is not loaded, the snapshot is labeled unavailable.
History records aggregate awards by player, UTC date or month, action, Global Rank, and LuckPerms primary group. This avoids one permanent row for every XP event while preserving useful daily investigation and action totals. config.yml keeps daily snapshots for 30 days, rolls older entries into monthly snapshots, and retains 13 months of monthly data. Boundary months are included whole in a date-range report. Legacy XP totals are not backfilled into the history, and data older than the retention window expires.
Imported data and limits
First-join sync runs once for a UUID that has no McProgression profile. It estimates XP from supported block-mined counters mapped to configured Mining, Woodcutting, and Farming activities; configured mob kills; crafted-item counts when crafting-table accepts any material; and fish caught. Current configured XP rates and level curves apply, subject to each skill's maximum level. Unsupported statistics remain unassigned. General XP starts at zero, and LekkerLeveling's XP is not read.
These are lifetime aggregates, not a transaction history. The XP estimate cannot distinguish activity context or event timing, and crafted statistics count items rather than crafting actions. The player message and server log identify the result as estimated historical progression.
CoreProtect remains a separate, explicit preview/apply operation (/mcpadmin import preview|apply <player> <cutoff-ISO-8601>). Do not apply CoreProtect block rows on top of statistics-derived block XP for the same period: the sources overlap and CoreProtect's public API does not provide a stable event ID for cross-source deduplication. Review the cutoff and overlap policy before using that command. A reset-and-sync currently uses Minecraft statistics only; it does not replay CoreProtect rows.
WorldGuard region gates
WorldGuard is an optional soft dependency. Without it, McProgression loads normally and region rules remain inactive; dimension gates continue to work independently. Region gates are disabled by default. Enable regions.enabled in world-access.yml, then add entries under regions.rules with an exact Bukkit world name, a WorldGuard region ID, and all-of/any-of skill requirements. Region IDs are matched case-insensitively. Repeated denied-entry messages are throttled per player and region by regions.notice-cooldown-seconds (3 seconds by default).
Example:
regions:
enabled: true
rules:
protected_mines:
enabled: true
world: world
region: protected-mines
actions: [MOVE, TELEPORT, PORTAL, RESPAWN, JOIN]
all-of:
- skill: mining
level: 10
any-of: []
bypass-permission: mcprogression.bypass.region.protected_mines
Rules apply when the player enters a matching region; leaving the region is allowed. all-of is cumulative, while at least one requirement in a non-empty any-of list must pass. If WorldGuard cannot provide region data for a world that has enabled rules, entry checks in that world fail closed and a warning is logged once per world. Use a bypass permission or repair/reload WorldGuard region data to restore access. Dimension and region rules are independent checks and can both apply to one transition.
SQL persistence
Reset removes the player's flattened state keys from SQLite, MySQL, or PostgreSQL storage. The SQL diff writer now deletes keys removed from a snapshot in the same transaction as inserts and updates; without this, a reset would only appear to clear the in-memory YAML tree.