Alpha-systemv1.0.0

Configuration

A deep walkthrough of the config files that actually matter day-to-day. For the full punishment message templates and every individual message key, edit the files directly and reload — they're extensively commented in place.

File layout

plugins/Alpha-system/
  lang/
    messages.yml # every regular player-facing message
    deathmessages.yml # death message pools, by killer/cause — see below
  menus/
    players/warps.yml # /warp GUI layout
    staff/inventory.yml, enderchest.yml, confirm.yml # /invsee, /invedit GUIs
  config.yml # main config — features, every subsystem's settings, permission remaps
  punishments.yml # ban/mute/warn/jail message templates + kick screens (config+text combined)
  economy.yml # currency settings + economy messages (config+text combined)
  announcements.yml # auto-broadcast message pool + interval
  maintenance-state.yml # runtime — on/off + whitelist, not a template you edit
  socialspy-state.yml # runtime — per-player explicit toggle overrides
  alphasystem.db # sqlite database file (if database.type: sqlite)
Two different reload behaviors. config.yml layers the jar's bundled defaults underneath what's on disk, so a simple missing scalar key still falls back correctly. lang/messages.yml, punishments.yml, economy.yml, and announcements.yml have no such layering — every key you want to change must actually exist in the on-disk file. And nested sections in config.yml (like warn.escalation.rules) must be written out in full on disk too — a Bukkit quirk where getConfigurationSection() on a path that only exists in the bundled jar returns an empty section instead of falling back.

Features

A single top-level toggle map — set any entry to false to fully disable that subsystem (command included). Requires /as reload or a restart.

features:
  chat: true
  flyspeed: true
  gamemode: true
  heal: true
  feed: true
  god: true
  fly: true
  kill: true
  ping: true
  vanish: true
  invsee: true
  invedit: true
  enderchest: true
  tphere: true
  skull: true
  punish: true
  warps: true
  announcements: true
  chat-filter: true
  economy: true
  time: true
  alts: true
  hat: true
  tpsbar: true
  nv: true
  back: true
  freeze: true
  crafting: true
  anvil: true
  weather: true
  fixitem: true
  death-messages: true

Chat

chat:
  format-normal: true       # false if another plugin (TAB, etc.) handles normal chat format
  join-quit-messages: true  # false if another plugin (CMI, etc.) already formats join/quit

  delete-button:
    enabled: true
    icon: "&#FF0000[x] "
    hover: "&#808080ᴄʟɪᴄᴋ ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴛʜɪꜱ ᴍᴇꜱꜱᴀɢᴇ"
    remembered-messages: 200
    fallback-clear-lines: 100

remembered-messages caps how many recent messages (across chat, /sc, /mc, announcements, and private messages) stay eligible for deletion. fallback-clear-lines only matters when PacketEvents isn't installed — see Integrations → Chat deletion for what it actually does.

Chat filter

chat-filter:
  words:
    - "badword1"
    - "badword2"
  warn-reason: "Used a prohibited word in chat"
  staff-alert: "{prefix}&#FF0000{player} &#808080ᴜꜱᴇᴅ ᴀ ꜰɪʟᴛᴇʀᴇᴅ ᴡᴏʀᴅ ᴀɴᴅ ᴡᴀꜱ ᴀᴜᴛᴏ-ᴡᴀʀɴᴇᴅ&#555555. &#808080(&#C8A96E{server}&#808080)"

Case-insensitive substring match against the word list. A match deletes the message before it ever reaches chat, auto-issues a /warn (which can itself trigger warn escalation), and alerts staff holding permissions.chat-filter-alert — network-wide if database.type: mysql.

Database

database:
  type: sqlite   # sqlite | h2 | mysql
  sqlite-file: alphasystem.db
  h2-file: alphasystem_h2
  mysql:
    host: localhost
    port: 3306
    database: alphasystem
    username: root
    password: ""
    use-ssl: false
TypeWhen to use it
sqliteDefault. Zero-config, local file, single server.
h2Embedded, pure-Java, no native libraries — a SQLite alternative on hosts that block native code. Still single-server only.
mysqlRequired for cross-server punishment sync, network-wide maintenance mode, and shared alt-detection across a network. See Integrations → Network sync.

Jail

jail:
  world: ""
  x: 0.0
  y: 0.0
  z: 0.0
  yaw: 0.0
  pitch: 0.0
  notify-style: bossbar   # bossbar | actionbar | title | none

  bossbar:
    text: "&#FF9400ᴊᴀɪʟᴇᴅ &#808080— &#C8A96E{remaining} &#808080ʀᴇᴍᴀɪɴɪɴɢ"
    color: RED
  actionbar:
    text: "&#FF9400ʏᴏᴜ ᴀʀᴇ ᴊᴀɪʟᴇᴅ &#808080— &#C8A96E{remaining} &#808080ʀᴇᴍᴀɪɴɪɴɢ"
  title:
    title: "&#FF9400ᴊᴀɪʟᴇᴅ"
    subtitle: "&#808080{remaining} ʀᴇᴍᴀɪɴɪɴɢ"

Set the location with /setjail rather than editing coordinates by hand. Remember: no movement radius is enforced automatically — build a physical containment area around this point yourself.

Restart

restart:
  style: bossbar   # bossbar | actionbar | title
  duration-seconds: 60
  relaunch-process: true
  message: "&#FF0000ꜱᴇʀᴠᴇʀ ʀᴇꜱᴛᴀʀᴛɪɴɢ ɪɴ &#C8A96E{time}ꜱ"
  title: "&#FF0000ʀᴇꜱᴛᴀʀᴛɪɴɢ"
  subtitle: "&#808080{time} ꜱᴇᴄᴏɴᴅꜱ"
  kick-message: "&#FF0000ꜱᴇʀᴠᴇʀ ɪꜱ ʀᴇꜱᴛᴀʀᴛɪɴɢ&#555555. &#808080ᴡᴇ'ʟʟ ʙᴇ ʀɪɢʜᴛ ʙᴀᴄᴋ!"

  storm-effect:
    enabled: true
    interval-ticks: 60
    strikes-per-player: 1
    chance: 0.5

relaunch-process: true reconstructs the original java launch command (same binary, JVM flags, jar/args) and spawns a fresh process before this one shuts down — so /restart actually restarts rather than just stopping. Set it to false on a hosting panel that already auto-restarts on stop (or that kills child processes, which would break this anyway).

The storm-effect is purely cosmetic — rain, fog particles around each player, and lightning flashes 20-45 blocks out and well above ground level (never on top of a player, never real damage). Tuned for a noticeable-but-not-annoying pace by default; raise chance and lower interval-ticks for something more intense, or set enabled: false for a plain silent countdown.

Maintenance

maintenance:
  kick-message: "&#FF0000ꜱᴇʀᴠᴇʀ ɪꜱ ɴᴏᴡ ɪɴ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ&#555555. &#808080ᴡᴇ'ʟʟ ʙᴇ ʀɪɢʜᴛ ʙᴀᴄᴋ!"
  join-deny-message: "&#FF0000ꜱᴇʀᴠᴇʀ ɪꜱ ᴄᴜʀʀᴇɴᴛʟʏ ᴜɴᴅᴇʀ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ&#555555. &#808080ᴄʜᴇᴄᴋ ʙᴀᴄᴋ ꜱᴏᴏɴ&#555555!"
  motd: "&#FF0000ꜱᴇʀᴠᴇʀ ᴜɴᴅᴇʀ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ\n&#808080ᴡᴇ'ʟʟ ʙᴇ ʙᴀᴄᴋ ꜱʜᴏʀᴛʟʏ&#555555!"

These are templates only — the actual on/off state and bypass whitelist live in maintenance-state.yml, managed entirely through the /maintenance command. Leave motd blank to keep the normal server-list MOTD from server.properties even while maintenance is active.

Warps GUI

menus/players/warps.yml is a DeluxeMenus-style layout — fully custom items and click actions, not a fixed template:

title: "&#FF9400ᴡᴀʀᴘꜱ"
size: 27

item:
  material: COMPASS
  name: "&#C8A96E{warp}"
  lore:
    - "&8ᴄᴀᴛᴇɢᴏʀʏ: &7{visibility}"
    - " "
    - "&#808080ᴄʟɪᴄᴋ ᴛᴏ ᴛᴇʟᴇᴘᴏʀᴛ"
  actions:
    - "[warp] {warp}"
    - "[sound] ui.button.click"
    - "[close]"

locked-item:
  material: GRAY_DYE
  name: "&#808080{warp} &#555555(ʟᴏᴄᴋᴇᴅ)"

per-warp:
  spawn-shop:
    slot: 13
    material: EMERALD

filler:
  material: GRAY_STAINED_GLASS_PANE
  name: " "

Action types: [warp], [player] (run as the clicking player), [console], [message], [sound], [close]. {warp}, {visibility}, and {creator} are available in names/lore. per-warp.<name> overrides material/name/lore/actions/slot for one specific warp — anything not overridden falls back to item/locked-item.

bStats & update checker

bstats:
  enabled: true
  plugin-id: 0   # 0 = disabled until you set a real id

update-checker:
  enabled: true
  repo: "alpha-m19/alphacore-plugin"
  notify-ops-on-join: true

Both covered in depth in Integrations — in short: bstats.plugin-id stays 0 (metrics off) until you register the plugin at bstats.org and put the real id here, since a guessed id could send this server's data to someone else's project by mistake.

Reload vs. restart

/as reload re-reads config.yml, lang/messages.yml, lang/deathmessages.yml, punishments.yml, economy.yml, and announcements.yml from disk. It does not reload compiled Java — anything changed by updating the plugin jar itself needs a full server restart.