Configuration defaults: Values shown for operator-configurable settings are the bundled defaults, and can be changed in the module’s configuration or definitions. The server’s active settings take precedence, so costs, speeds, ranges, durations, chances, effects, recipes, limits and enabled features may differ. Command examples illustrate syntax; fixed mechanics and validation bounds are not configuration defaults.
Core owns moderation, AFK, staff elevation, player utilities, spawn/teleport safety, nicknames, signs, vanish, audit history and the suite item registry. Carbon owns chat and Economy owns money. See installation for the combined JAR and preserved data folders.
Moderation mode setup
Moderators retain their ordinary RP/job groups at all times. /modmode attaches moderation.activated-group as a transient LuckPerms inheritance node; it does not change their primary group and is never written to LuckPerms storage. /modmode off, logout, plugin shutdown, or disabling the feature removes the node.
Create the activated group and grant the actual staff capabilities to it. Grant only core.modmode to the moderator's permanent/base staff role:
/lp creategroup mod-active
/lp group moderator permission set core.modmode true
/lp group mod-active permission set core.utilities true
/lp group mod-active permission set core.utilities.others true
/lp group mod-active permission set core.warn true
/lp group mod-active permission set core.kick true
/lp group mod-active permission set core.mute true
/lp group mod-active permission set core.unmute true
/lp group mod-active permission set core.history true
/lp group mod-active permission set core.history.reason true
/lp group mod-active permission set core.punish true
/lp group mod-active permission set core.punish.offense.* true
/lp group mod-active permission set core.notify true
core.utilities is the convenient self-utility preset that makes /fly, /gmc, /heal, /feed, /speed, /tp, /ec, /workbench, /anvil, and similar commands available while mod mode is active. core.utilities.others adds other-player targeting and read-only /invsee. Grant individual nodes instead when a staff tier should receive only part of that set.
Add senior-only nodes such as core.ban, core.unban, core.punish.direct, or staff-target overrides only to the appropriate activated senior group. You can change activated-group to that group name; changing it requires a restart so an active session can never silently swap privilege sets during reload.
For Carbon 3, the current official permission model uses carbon.spy and carbon.channel.<channel>.see / .speak. For a channel whose Carbon key is staff:
/lp group mod-active permission set carbon.spy true
/lp group mod-active permission set carbon.channel true
/lp group mod-active permission set carbon.channel.staff true
/lp group mod-active permission set carbon.channel.staff.see true
/lp group mod-active permission set carbon.channel.staff.speak true
With integrations.carbon.auto-enable-spy: true, entering mod mode enables Carbon spy through Carbon's API. Exiting restores the exact spy state from before that session. Removing the transient group also removes access to configured staff channels. Use the actual keys from your Carbon channel configuration.
The plugin independently rejects every command listed under moderation.gated-commands unless the player is active. This prevents a stray permanent Core permission from bypassing mode. core.modmode.bypass is intended only for owner/automation accounts. Console is always exempt.
An action-bar reminder is displayed while active. Successful entry and exit are broadcast using editable MiniMessage templates. By default, every five minutes the moderator receives a chat reminder with their elapsed session time, while other online staff with core.modmode.reminder.notify receive a separate administrative notice. Public broadcasts, both reminder layers, their intervals, and their audiences are configurable under moderation; the text is in messages.yml.
Exiting also restores the pre-session game mode, god state, plugin flight state, flight allowance, current flying state, walk speed, fly speed, and Carbon spy state. One-shot actions such as teleports, heals, and punishments are intentionally not reversed.
Punishment schedules
Each offense has a stable lowercase key, display metadata, an individual permission, a rolling lookback, and ordered steps:
offenses:
spam:
display-name: '<yellow>Spam / Flooding'
icon: PAPER
slot: 10
permission: core.punish.offense.spam
lookback: 90d
description:
- '<gray>Repeated or disruptive messages.'
steps:
- type: WARN
reason: 'Spam / flooding'
- type: MUTE
duration: 15m
reason: 'Repeated spam / flooding'
- type: BAN
duration: 1d
reason: 'Chronic spam / flooding'
Supported action types are WARN, KICK, MUTE, and BAN. Durations support compounds such as 1d12h, with s, m, h, d, w, mo, and y. Use permanent only for mutes and bans. The hard safety maximum is ten years.
Ladder calculation and insertion happen in one database transaction. When a GUI confirmation specifies an expected step, any concurrent advancement makes that GUI stale. Configure exhausted ladders globally with repeat-last or deny.
Warning rules count non-revoked warnings in a rolling window. The highest matching threshold is selected, and its cooldown is claimed transactionally so concurrent warnings cannot double-trigger it.
/removewarn <case-id> <reason> removes only a warning; /removepunishment <case-id> <reason> handles any case. Removal is a transactional soft delete: the case disappears from history, warning thresholds, offense ladders, mute checks, and ban enforcement, while removal actor/time/reason remain in storage and an audit event is written. Removing one ban never pardons a different active ban.
AFK
/afk toggles your own state. /afk status, /afk <player> status, and /afk <player> <on|off> provide status and staff control. Automatic AFK is based on configurable movement, final Paper chat, interaction, and command activity signals. Core observes chat without formatting, rerouting, or cancelling it, so Carbon remains the chat owner.
AFK state is intentionally session-only. It is cleared on disconnect and is never used as authentication or punishment evidence. Configure automatic timing, manual-AFK clearing, movement tolerance, broadcasts, action-bar reminders, and optional kick timing under afk. The kick is disabled by default. Use core.afk.auto.bypass and core.afk.kick.bypass for service accounts or staff who must remain connected.
Sudo
/sudo <player> <command...> executes a command as an online player. It does not provide a chat/message impersonation form. Three independent checks apply:
- The actor needs
core.sudo and, by default, active mod mode. - The command needs
core.sudo.command.<root>. For example, /sudo Alex gamemode creative requires core.sudo.command.gamemode. - The command root must pass
sudo.allowed-command-roots and sudo.blocked-command-roots. An empty allowlist delegates selection entirely to granular permissions; the blocklist always wins.
Namespaces cannot bypass policy: minecraft:op is also checked as op. /core, /skylines, /vcore, and /mcskylines are checked against their actual subcommand, so /skylines gamemode ... still requires .command.gamemode. Recursive sudo and changing mod mode through any of those aliases are always rejected. Protected targets require core.sudo.target.protected; self-targeting requires both configuration opt-in and core.sudo.self.
The target is notified before execution by default. Audit records contain the normalized command root and result, not arguments, avoiding accidental storage of passwords or other sensitive command data. The target's own command permissions still apply.
Signs
Players with core.sign.format may use colors (named or hex), bold, italic, underline, strikethrough, reset, and the enabled gradient/rainbow options on placed signs or through /editsign [front|back] <1-4> [text]. The same permission enables configurable Bukkit legacy forms such as &a, &l, &r, &#RRGGBB, &x&F&F&0&0&F&F, and their section-sign equivalents. Operators receive this through core.admin. Formatting markup does not count toward signs.max-visible-characters-per-line; visible Unicode code points do. Click, hover, insertion, font, keybind, translation, selector, score, NBT, and newline tags are not registered and cannot create interactive signs.
/editsign changes the side the player is looking at unless front or back is supplied. Omitting text clears that line. Plain-text changes made through /editsign or the normal sign editor retain the line's existing color and decorations; supplying formatting or reset markup replaces them. Waxed signs and region bypass each have separate permissions. By default, the target sign must be in a WorldGuard region where the player is an owner or member. Property synchronizes landlords and active tenants as those WorldGuard owners/members, so rented properties work without database coupling. The check fails closed when WorldGuard is unavailable.
Vanish and smite
/vanish [player] [on|off] uses Bukkit's plugin-scoped hide/show API and never applies an invisibility potion, so it produces no invisibility particles. It is session-only, preserves hides owned by other plugins, suppresses a vanished player's real quit message when configured, and updates visibility when mod mode changes. Successful transitions can send editable fake vanilla-style quit/join messages to ordinary players. Core also removes the player from each affected viewer's Paper player list and publishes the conventional plugin-owned vanished=true metadata used by TAB's layout/global-list compatibility. Only tab entries actually removed by Core are candidates for restoration.
core.vanish.see sees Core-vanished players; by default those viewers do not receive the fake quit/join messages. Other-player and protected-target controls are separate nodes. The fake-message audience, individual messages, tab-list removal, and TAB metadata integration are configurable under vanish.
If TAB's Layout or Global Playerlist is enabled, grant tab.seevanished to the same senior staff who receive core.vanish.see; TAB uses its own permission when deciding who may see metadata-marked vanished players.
/smite <player> uses a visual lightning effect, so it cannot ignite blocks or apply uncontrolled lightning area damage. Direct damage and self-target policy are configured under smite; ordinary Bukkit damage events still run so protection plugins can cancel the damage.
Utility commands and aliases
/skylines give <item> [player] [amount] gives to the command executor when the player is omitted. Console must specify an online player. A numeric second argument is treated as the self-give amount. Examples: /skylines give health:first_aid_kit, /skylines give narcotics:calming_herb 8, /skylines give robberies:breaching_charge, and /skylines give vehicles:part/engine Alex 2. Vanilla Minecraft materials are deliberately excluded. Unqualified names resolve only when unique; tab completion shows the authoritative namespaced keys.
The command requires skylines.give, with skylines.give.others, skylines.give.bypass-limit, and granular skylines.give.item.<namespace>.<item> nodes. Slashes in item keys become dots in permission nodes. core.give... compatibility nodes are also accepted. Operators receive all of them through core.admin. Core validates provider ownership, fresh one-unit results, serialized item size, amount limits, target state, permissions, and inventory capacity before mutating the inventory. Giving is audited; full inventories fail atomically by default.
Suite modules register factories, not cached item stacks. Their providers consult the module's live config for every creation, so reloading the module is sufficient. Core is deliberately not reloaded as a side effect, avoiding reload cycles and stale service references. Database-issued or owner-bound objects such as Economy cards and vehicle title vouchers are excluded from the generic registry.
- Game modes:
/gamemode or /gm, with /gmc, /gms, /gma, and /gmsp shortcuts. Each shortcut accepts an optional player when the actor has core.gamemode.others. - Teleport:
/teleport, /tp, or /tele; /tphere, /tph, or /teleporthere. - Back:
/back returns to the location before the last successful Core teleport or to the last death location. A successful /back swaps the saved location, so the command can be used again to return. Locations and cooldowns are session-only and clear on logout/restart. - Inventory:
/clearinventory or /ci; /enderchest, /ec, or /echest; /invsee or /inventorysee. - Workstations:
/workbench, /wb, or /craft; /anvil. - Diagnostics:
/ping [player].
Inspecting another inventory or ender chest is read-only by default. Modification requires the separate .modify permission, and protected targets require the corresponding .protected permission. Opens and destructive inventory clears are written to Core's audit table.
Configuration files
config.yml — feature switches, storage safety, AFK policy, sudo policy, state behavior, teleport policy, mute command roots, spawn behavior, hooks, and retentionpunishments.yml — offense ladders, lookback windows, warning thresholds, durations, and reasonsguis.yml — inventory sizes, slots, materials, MiniMessage names, and loremessages.yml — all user-visible text and MiniMessage formattingspawn.yml — atomically saved spawn coordinates; normally managed with /setspawndata.db — authoritative punishment, state, player identity, trigger, and audit databackups/ — timestamped startup database backups
Reload validates complete candidate files before replacing live policy. Invalid enum values, durations, materials, duplicate/out-of-range slots, unsafe database paths, unsupported config versions, and missing required nodes reject the reload.
Compatibility
- Carbon: Core does not register messaging, reply, channel, or chat-format commands. Mutes cancel Paper's final async chat event and only the command roots listed under
mute.blocked-command-roots (default: /me). Mod mode uses Carbon's API solely to snapshot/enable/restore spy state; channel capability still comes from the transient LuckPerms group. - WorldGuard / Property: staff teleport destinations check
ENTRY; sign edits require WorldGuard owner/member status by default. WorldGuard bypass is honored. Property landlords and tenants work through their synchronized WorldGuard domains. - LuckPerms: normal Bukkit permission checks work automatically. When installed, LuckPerms evaluates
core.punishment.immune and the legacy core.bypass.target alias for offline players. security.protected-uuids provides an independent fallback. - CoreProtect: Core does not write fake block interactions into CoreProtect. Moderation and administrative actions use their own audit table, while CoreProtect remains authoritative for block inspection and rollback.
- Other ban tools: Core mirrors active database bans to Paper's native profile ban list. Its database record remains authoritative; use
/unban so both stores are updated. - Other spawn plugins: when
spawn.use-for-respawn is enabled, Core applies its destination at HIGHEST so earlier general-purpose plugins cannot silently replace it. Disable this setting when another plugin should own death respawns. Set respawn-only-without-bed: true only when beds and respawn anchors should take precedence.
Every shortcut also has a namespaced form such as /core:fly. If another plugin claims /fly, use /core fly or the namespaced form, or disable the shortcut under commands.enabled.
Optional LuckPerms startup
Core starts without LuckPerms when that optional integration is unavailable. Online permission checks and configured protected UUIDs still apply; offline LuckPerms protection and transient moderation-group grants require LuckPerms. Other modules that declare LuckPerms as required remain unavailable without it.
Being pushed, knocked back, falling, or riding a moving vehicle no longer clears AFK. Movement activity comes from player directional/jump/sneak input or deliberately changing view orientation. Existing AFK activity switches and manual/automatic AFK preferences still apply. Chat, interaction and commands retain their configured activity behavior. This changes activity detection, not physical movement protection.
Forced-open door service
dev.serverplugins.core.api.ForcedOpenDoors is an optional Bukkit service for main-thread door queries. Active Justice registers its persistent breach provider; isForcedOpen(Block) recognizes either door half. Lock queries the live service for manual toggles and delayed closing, so it does not need a hard dependency on Justice. A missing provider means no active forced-open policy; it is not a generic lock-permission bypass. Ownership, breach persistence and mining cleanup remain with the provider. Integrations must call this world/block query on the server thread and resolve the current provider rather than caching a disabled module.
God and flight can persist when configured. Self and other-player actions use distinct permissions; target protection and moderation-mode gates still apply. Teleports use WorldGuard entry/safe-destination checks, track back locations and enforce cooldowns. Spawn configuration controls first/every join, respawn and void rescue. Set the destination in-game with /setspawn rather than hand-editing coordinates.
Inventory/ender-chest viewing can be read-only; modification needs separate nodes. Protected targets have additional override checks. Clearing inventory changes real items. Virtual crafting/anvil interfaces and latency display are separate utilities.
Shared item issuance
/skylines give <namespace:item> [player] [amount] issues only registered suite items, not arbitrary renamed vanilla materials. Use Tab to discover enabled module IDs. Self issuance needs skylines.give, another player needs skylines.give.others, and configured per-item checks use skylines.give.item.<namespace>.<item>. Amounts are positive and bounded; elevated limits require a distinct bypass node. Disabled modules cannot supply unregistered items.
Nicknames and records
Persistent nicknames are display metadata, not account/UUID changes. Clearing a nickname restores the player's normal display. History is paginated; viewing reasons is separately controlled. Seen reports saved identity/login state. Alts correlates shared network addresses and does not prove that accounts have the same human owner. All punishment removals retain an audit trail rather than deleting evidence.
SQLite and MySQL storage
Core validates its MySQL session before each queued database operation and replaces closed or invalid connections using the startup database settings. Once MySQL is reachable again, later operations recover without a plugin reload or server restart. An operation that has already started is never automatically replayed, because a lost response can follow a successful write. If connection recovery fails or the login query exceeds database.query-timeout-ms, the existing security.fail-closed-on-database-error setting still controls login denial.
SQLite remains the default, including for existing config files without database.type. Set database.type: MYSQL and configure database.mysql.host, port, database, username, and password to use a pre-created MySQL database. MySQL 8+ and MariaDB use InnoDB transactions and the bundled Connector/J driver. Core tables have a core_ prefix and Property tables have a property_ prefix, so both can share the Economy database without overlapping its tables.
database.mysql.use-ssl: true requires encrypted transport. For a local database without TLS, explicitly set it to false. allow-public-key-retrieval defaults to false; enable it only when the configured MySQL authentication needs it. Connection/backend changes require a server restart. Switching backends does not copy or delete existing records: a fresh remote database starts empty. Keep the existing SQLite files if you might switch back. SQLite file, busy-timeout, startup backup and integrity-check settings apply only to SQLite; arrange server-side backups for MySQL. The configuration schema remains config-version: 1.
Flight after gamemode changes and death
With /fly enabled, Core reapplies flight permission after vanilla resets player abilities during a gamemode change or respawn. If the player was flying before a mode change, active flight resumes; respawn restores permission without forcing flight, so double-jump works without toggling /fly again. Restoration reads the current command flag, so a later /fly off wins. Creative/spectator retain their native flight even when the command flag is off. The existing states.fly.disable-on-gamemode-change: true option still disables the command flag when entering Survival or Adventure; its default is false. states.fly.persist continues to control storage across reconnects/restarts. Moderation-mode exit still restores the pre-session ability snapshot.
Custody local-chat moderation
Core's normal-chat mute veto runs before Justice's local routing stage. Cuffed, ziptied or incapacitated players retain local speech, while an active Core mute still prevents delivery. Carbon's channel permission, mute and moderation rules remain active. Explicit local command aliases are normalized by Justice; this does not grant access to other muted commands.
Reading command syntax
Configuration defaults: Values shown for operator-configurable settings are the bundled defaults, and can be changed in the module’s configuration or definitions. The server’s active settings take precedence, so costs, speeds, ranges, durations, chances, effects, recipes, limits and enabled features may differ. Command examples illustrate syntax; fixed mechanics and validation bounds are not configuration defaults.
<argument> is required; [argument] is optional. Replace the placeholder, including its brackets, with your value. Choices separated by a vertical bar mean choose one. ... accepts the remaining words. Do not type quotation marks around multiword names unless the command specifically requires them. A bare command has no required arguments. Examples use sample players/IDs: substitute entries from your server and use Tab for configured IDs.
player means a username; operational actions usually require that player online. amount and price are currency values such as 25.00, unless the row specifies items, levels, or units. reason, memo, message, name, and statement accept text where supported. duration uses the module's duration format (for example 10m, 2h, or 7d); it is not a bare number of minutes unless stated. id is the exact identifier displayed by that system, not its friendly name. Permissions and ownership/state/location checks both apply.
Core command routing
Every direct command in the root table also works as /core <command> <same arguments> (or /skylines). For example /core tempban Alex 1d Repeated misconduct is the same operation as /tempban Alex 1d Repeated misconduct. The words utilities and moderation in the old root help are category labels, not callable branches.
| Syntax | Arguments and behavior | Permission |
|---|
/core help | Help; no arguments | No additional node |
/core status | Core/service status; no arguments | core.status |
/core reload | Validate all candidate Core settings before replacement; database changes require restart | core.reload |
/core give <namespace:item> [player] [amount] | Genuine item ID; player defaults to self, amount defaults to one | skylines.give, others/per-item nodes as above |
Utility arguments and safeguards
For god, fly, vanish and afk, omitting state toggles it; explicit on/off sets it. afk status inspects. Optional player means self, so console must supply a target where supported. Changing another player generally needs the matching core.<feature>.others node. /modmode status inspects without toggling.
/speed accepts 1–10 or reset; optional walk/fly chooses movement type. /teleport Alex takes you to Alex; /teleport Alex Sam moves Alex to Sam. /tphere Alex brings Alex to you. /back uses the recorded previous teleport/death location. /editsign takes a line number 1–4, optional front/back side, and remaining text; omit text to clear. Waxed/region-protected signs need specific overrides.
/nick off clears self; /nick Alex off clears another player. /sudo Alex command arguments requests an actual authorized command, with a granular core.sudo.command.<root> permission and configured allow/deny policy; it does not impersonate chat. /invsee Alex needs an online target. Smite's damage/visual policy is configured, not implied by the name.
Moderation arguments
player identifies the subject; reason is required remaining text for warn/kick/ban/mute and case removal. Temporary ban/mute additionally require a duration, e.g. /tempmute Alex 30m Flooding. /punish Alex opens the offense GUI; /punish Alex spam chooses configured offense ID spam, subject to its permission and current ladder. Unban/unmute have optional reasons. case-id is the numeric record shown in history, not a player name; page selects a history page. /removewarn accepts only warning cases. Configured ladder steps, warning thresholds, target immunity and mode requirements still apply.
Root commands and aliases
These are the registered command entry points. The subcommand tables above describe their complete operations. Alias names use the same arguments as their root.
| Syntax | Purpose | Permission / aliases |
|---|
/modmode [on|off|status] | Toggle transient moderation permissions while retaining normal RP/job groups. | core.modmode |
/core <help|give|reload|status|utilities|moderation> | MC Skylines administration, utilities, and shared item commands. | Checked by operation; aliases: /skylines, /vcore, /mcskylines |
/afk [player] [on|off|status] | Toggle or inspect AFK status. | core.afk.self |
/sudo <player> <command...> | Make an online player execute an authorized command. | core.sudo |
/god [player] [on|off] | Toggle invulnerability. | core.god.self; aliases: /godmode |
/fly [player] [on|off] | Toggle flight. | core.fly.self; aliases: /flight |
/gamemode <survival|creative|adventure|spectator> [player] | Change a player's game mode. | core.gamemode.self; aliases: /gm |
/gmc [player] | Switch to creative mode. | core.gamemode.self |
/gms [player] | Switch to survival mode. | core.gamemode.self |
/gma [player] | Switch to adventure mode. | core.gamemode.self |
/gmsp [player] | Switch to spectator mode. | core.gamemode.self |
/heal [player] | Restore a player's health. | core.heal.self |
/feed [player] | Restore a player's hunger. | core.feed.self |
/speed <1-10|reset> [walk|fly] [player] | Set walk or flight speed. | core.speed.self |
/teleport <destination>|<player> <destination> | Teleport to a player or move one player to another. | core.teleport.self; aliases: /tp, /tele |
/tphere <player> | Teleport a player to you. | core.teleport.others; aliases: /tph, /teleporthere |
/back | Return to your previous Core teleport or death location. | core.back |
/clearinventory [player] | Clear your own or another player's inventory. | core.clearinventory.self; aliases: /ci |
/enderchest [player] | Open your own or inspect another player's ender chest. | core.enderchest.self; aliases: /ec, /echest |
/invsee <player> | Inspect an online player's inventory. | core.invsee; aliases: /inventorysee |
/workbench | Open a virtual crafting table. | core.workbench; aliases: /wb, /craft |
/anvil | Open a virtual anvil. | core.anvil |
/ping [player] | View your own or another player's latency. | core.ping.self |
/spawn [player] | Teleport to the configured spawn. | Checked by operation |
/setspawn | Set the server spawn. | core.setspawn |
/editsign [front|back] <1-4> [text] | Edit one visible sign line with safe MiniMessage formatting. | core.sign.edit |
/vanish [player] [on|off] | Hide yourself or another player without potion particles. | core.vanish.self |
/smite <player> | Strike a player with configured lightning and damage. | core.smite |
/nick [player] <nickname|off> | Set, inspect, or clear a persistent nickname. | core.nick.self; aliases: /nickname |
/punish <player> [offense] | Open the punishment menu or apply a configured offense. | core.punish |
/warn <player> <reason> | Warn a player and evaluate warning thresholds. | core.warn |
/kick <player> <reason> | Remove a player from the server. | core.kick |
/ban <player> <reason> | Permanently ban a player. | core.ban |
/tempban <player> <duration> <reason> | Temporarily ban a player. | core.ban |
/unban <player> [reason] | Revoke an active ban. | core.unban |
/mute <player> <reason> | Permanently mute a player. | core.mute |
/tempmute <player> <duration> <reason> | Temporarily mute a player. | core.mute |
/unmute <player> [reason] | Revoke an active mute. | core.unmute |
/history <player> [page] | View a player's punishment history. | core.history |
/seen <player> | Show when a player was last online. | core.seen |
/alts <player> | Find accounts which have used the same network addresses. | core.alts |
/removepunishment <case-id> <reason> | Soft-remove an audited punishment case from a player's record. | core.removepunishment; aliases: /removecase |
/removewarn <case-id> <reason> | Soft-remove an audited warning case from a player's record. | core.removewarn; aliases: /delwarn |