Compatibility
Minecraft: Java Edition
Platforms
Details
Fssentials is a production-ready moderation and admin utilities plugin for Paper (Folia-aware). This document enumerates every feature implemented in the current codebase so server operators can configure, use, and extend the plugin confidently.
High-level Overview
- Folia-friendly scheduler utilities for safe async/global/entity dispatch (
FoliaScheduler). - Full-featured punishment system with persistent YAML storage and temporary punishments.
- IP-locking (per-account allowed IP entries + login-blocking) with admin commands and bypass permission.
- Maintenance subsystem with whitelist, MOTD sets, scheduling/timers and join notifications.
- Broadcast/announcement system using MiniMessage titles with optional configurable sound.
- Vanish and admin protections for hidden staff members.
- Inventory viewing and editing (InvSee) with Folia-safe snapshot/restore behavior.
- Central
MessageServicefor configurable chat messages and prefix handling.
Features (exhaustive)
Punishment System
- Supported punishment types:
KICK,BAN,MUTE,WARN,NOTE,IP_BAN. - Supports permanent and temporary punishments. Temporary durations parse via
TimeParserand server-configurable time-layout tokens (e.g.#default). - Each punishment stores: id, type, target UUID/name/ip, actor, reason, createdAt, expiresAt, active flag and silent flag.
- Storage: persisted to
punishments.ymlviaYamlPunishmentStoragewhenstorage.persistence-enabledis true. - Management: create, deactivate (unpunish), change reason, delete record, list history, view active punishments, page helper utilities (
PunishmentManager). - Expiration: scheduled expiration runs on Folia async scheduler and notifies staff when punishments expire.
Commands (handled by CommandRouter):
kick <player> <reason...>— immediate kick with enforcement message.ban <player> <reason...>— permanent ban (kicks online target).mute <player> <reason...>— mute (blocks chat viaPunishmentListener).warn <player> <reason...>— adds a warn record; notifies target if online.note <player> <note...>— internal note record.banip <player|ip> <reason...>— IP ban (kicks matching IPs).tempban/tempmute/tempwarn/tempipban <player|ip> <duration> <reason...>— temporary punishments.unban/unmute/unwarn/unnote/unpunish <id|player>— remove punishments.change-reason <id> <new reason>— edit a punishment's reason.warns <player>/notes <player>— list warns/notes.check <player>— show UUID, IP, ban/mute status, counts.banlist [page]— list active bans (paginated).history <player> [page]— view player's punishment history (paginated).
Notes:
- Commands support a
-sprefix to make an action silent (announce only to staff with the configured silent notify permission). - Reason layouts can be referenced with
@layoutKeyto reuse predefined layouts fromconfig.yml(layouts.). - Time-layout tokens (e.g.
#default) map to values intime-layoutsconfig.
IP Locking
- Per-account IP lock storage in
ip-locks.yml(IpLockManager). - Admin commands to
set,remove,change, andcheckan account's allowed IP. - Normalizes IPs using Java networking APIs; invalid inputs are rejected.
- Login flow hooks: pre-login collects attempted IP and if mismatch is found the player is kicked (unless they have bypass permission).
- Configurable:
ip-lock.enabled,ip-lock.log-blocked-attempts,ip-lock.kick-message.
Maintenance Mode
- Enable/disable maintenance mode programmatically or via commands.
- Whitelist management (add/remove/list) for players allowed during maintenance.
- MOTD sets: multiple message sets supported and editable using
/maintenance motdandsetmotd. - Scheduling/timers:
starttimer,endtimer,schedule,aborttimerto schedule enable/disable automatically (MaintenanceTimer). - Join notifications: staff with
notifypermission receive join-attempt notifications during maintenance. - Configurable messages and bypass/notify permissions via
MaintenanceConfig.
Maintenance commands (via maintenance command):
maintenance on|off|reloadmaintenance add <player>/remove <player>/whitelistmaintenance starttimer <minutes>/endtimer <minutes>/schedule <startMinutes> <durationMinutes>/aborttimermaintenance motd/maintenance setmotd <index> <line> <message>
Broadcast / Announcements
/broadcast <title> [subtitle]— sends a full-screen title to all players using MiniMessage formatting.- Supports splitting title/subtitle by
|or heuristics; configurable sound (announcements.sound.*in config).
Vanish & Admin Tools
- Toggle vanish with
/vanish(visibility handled byVanishService). AdminToolsListenerprotects vanished staff from being interacted with or damaged.- Vanish state is reapplied on join for session-owned vanished players.
InvSee (Inventory View/Edit)
/invsee <player>opens a 54-slot GUI snapshot of the target player's inventory (usesInvseeInventoryHolder).- Snapshot and restore are Folia-safe: inventory cloning happens on the target's entity scheduler and GUI open on the viewer's entity scheduler.
- Viewer edits are written back on close (invsee allows editing of player storage, armor, off-hand slots as described in the GUI layout).
Message Service & Localization
MessageServiceloadsmessages.ymlfrom the plugin folder; messages use aprefixand support placeholder replacement viaMessageService.get(key, placeholders).- Error/usage/enforcement messages are all configurable in
messages.ymlandconfig.yml.
Folia Scheduler Compatibility
FoliaSchedulercentralizes Folia-friendly task dispatch:runAsync,runAsyncTimer,runGlobal,runAtEntity.- All file I/O and long-running work is dispatched async; player-specific operations run on the player's entity scheduler.
Storage Files Created/Used
punishments.yml— persisted punishment records (viaYamlPunishmentStorage).ip-locks.yml— per-account IP lock entries.messages.yml— plugin messages loaded byMessageService(copied from plugin jar to data folder on first run).
Commands (complete list registered at runtime)
kick,ban,mute,warn,note,baniptempban,tempmute,tempwarn,tempipbanunban,unmute,unwarn,unnote,unpunishchange-reason,warns,notes,check,banlist,historyfssentials,systemprefs,vanish,offlinetp,playerlist,punishment,invseemaintenance(separately registered with its own executor)broadcast,iplock(separately registered)
Refer to plugin.yml for the exact help/usage lines; fssentials command prints configurable help-lines from config.yml.
Permissions (used in code)
fssentials.punish.kick— kick playersfssentials.punish.ban/fssentials.punish.tempban— ban playersfssentials.punish.mute/fssentials.punish.tempmute— mute playersfssentials.punish.warn/fssentials.punish.tempwarn— warn playersfssentials.punish.banip/fssentials.punish.tempipban— IP banfssentials.punish.unpunish— remove punishmentsfssentials.punish.change-reason— edit punishment reasonfssentials.view.banlist/fssentials.view.history/fssentials.view.check/fssentials.view.playerlist— view lists/check infofssentials.invsee— view and edit player inventoriesfssentials.vanish— toggle vanishfssentials.admin.reload— reload pluginfssentials.admin.systemprefs— view system prefsfssentials.maintenance.admin— full maintenance administration- maintenance bypass/notify permissions are configurable (defaults shown in
MaintenanceConfig). - IP-locking bypass permission:
plugin.iplock.bypass(constant inIpLockManager).
Note: the plugin uses permission checks liberally; ensure your server's permission system maps the nodes to the desired roles.




