FrontierBorder
The world border grows itself from combined player-hours — one predictable expansion a night.
What it does
The overworld starts small and earns its growth from how much everyone played. Once a day, at a configured local hour, FrontierBorder reads yesterday’s AFK-aware playtime from FrontierTab, matches the combined hours against a tier table, clamps the result by current world size, and animates the border outward (the Nether follows at 1/8 scale, the End optionally).
The distinctive choices: expansion is *scheduled* — one nightly event everyone can watch, sized by the previous full day — rather than a silent trickle, and thresholds scale with the number of active players so five people playing an hour each is harder to clear than one person playing five.
It also carries two small server-wide policies: it sets the JVM’s default timezone from server-timezone before any other plugin loads (so every plugin’s "midnight" is your local midnight even on hosts that run Java in UTC), and it can cancel enderman block grief without touching mobGriefing.
Requires & integrates with
- Required
- Paper 26.2+, Java 25+, FrontierTab — source of playtime; the plugin refuses to load without it.
- Optional
- None. A Discord webhook URL can be set for expansion announcements.
- Used by
- FrontierTab (reads
data.ymlplus config for theBorder: 1500 → 1750header element) · FrontierStatsAPI (servesdata.ymlon/api/border)
Heads up: this plugin will not enable without FrontierTabinstalled. Everything else listed as optional is genuinely optional — the feature simply doesn't appear.
Commands
All commands also work from console.
| Command | Who | What it does |
|---|---|---|
| /borderinfo | Everyone | Radius / max, center, total expansions, paused state, and tonight’s preview (yesterday’s hours, active players, blocks earned) or period progress in continuous mode |
| /border info | Admin | Same output as /borderinfo |
| /border expand <amount> | Admin | Grow the radius by <amount> blocks now (animated over expand-duration, clamped to max-radius); recorded as manual |
| /border set <radius> | Admin | Set the radius directly (instant), mirror to other dimensions, and reset the period counters so auto-expansion is re-armed |
| /border pause | Admin | Pause automatic expansion (playtime still accrues; flag persists across restarts) |
| /border resume | Admin | Resume automatic expansion |
| /border reset | Admin | Zero the period playtime counter and re-arm expansion for this period |
| /border autopregen [on|off] | Admin | Show or toggle automatic ring pre-generation after expansions (writes auto-pregen back to config.yml) |
| /border pregen | Admin | Pre-generate every chunk inside the current overworld border, with a broadcast progress bar every 10 s |
| /border cancelpregen | Admin | Stop a running pre-generation |
Permissions
Player features default to true, staff features to op. Every node follows frontier.<plugin>.<action>, so a LuckPerms setup is e.g. lp group default permission set frontier.shop.use true. Wildcards work: frontier.reputation.*.
| Node | Default | Grants |
|---|---|---|
| frontier.border.admin | op | /border and every subcommand |
| frontier.border.info | true | /borderinfo |
Config reference
File
plugins/FrontierBorder/config.yml
To apply changes
Restart required — no reload command. Only auto-pregen is written live, by /border autopregen.
| Key | Default | What it controls |
|---|---|---|
| server-timezone | system | IANA zone id (e.g. America/New_York) applied to the whole JVM at load; system leaves the host default alone; unknown ids are logged and ignored |
| reset-mode | daily | daily or weekly — the period model used by continuous mode and /border reset |
| reset-hour | 0 | Hour (0–23, server-local) the period counter resets |
| week-reset-day | SUNDAY | Day the weekly reset fires; only used when reset-mode: weekly |
| expansion-mode | scheduled | scheduled = one expansion per day at expansion-hour sized by yesterday’s playtime; continuous = top up toward the earned tier on every check |
| expansion-hour | 21 | Hour (0–23, server-local) the scheduled expansion fires (first check at or after this hour) |
| expansion-tiers | 5 tiers: 8h→500, 5h→400, 3h→300, 1.5h→200, 0.5h→100 | Combined player-hours → blocks; one entry per tier, fields hours, blocks; first match wins so list highest-hours first |
| world-size-caps | 3 caps: <4000→500, <7000→375, <10000→250 | Clamp on any single expansion by current radius; one entry per cap, fields below-radius, max-blocks; first match wins so list smallest radius first |
| check-interval-minutes | 10 | Scheduler period; also the precision of the expansion time |
| expand-duration | 60 | Seconds the border animates outward |
| announce-expansion | true | Chat broadcast plus sound to everyone online on expansion |
| broadcast-sound | ENTITY_PLAYER_LEVELUP | Any Bukkit Sound name; an invalid name is silent |
| discord-webhook-url | "" | POSTs an embed on every automatic expansion; empty = off |
| auto-pregen | false | Ring-pregenerate the new band after each automatic expansion (CPU-heavy; enable on the live server, not a test box) |
| prevent-enderman-grief | true | Cancel enderman block pickup and placement without touching the mobGriefing gamerule |
| Key | Default | What it controls |
|---|---|---|
| border.initial-radius | 1750 | Radius (not diameter) applied on first boot |
| border.max-radius | 10000 | Hard ceiling; expansion stops here |
| border.dimensions.nether | true | Mirror the overworld border into the Nether at 1/8 scale |
| border.dimensions.end | false | Mirror into the End at 1:1; false pushes the End border to the vanilla maximum (unbounded) |
| Key | Default | What it controls |
|---|---|---|
| scaling.enabled | true | Multiply tier hour thresholds by activePlayers^exponent (a lone player is never scaled) |
| scaling.exponent | 1.15 | Population-scaling exponent |
| scaling.min-active-seconds | 0 | Period playtime needed to count as an "active" player (0 = any participation) |
Good to know
- +Scheduled mode reads *yesterday’s* playtime, so a fresh server’s first expansion happens the day after people first play; a zero-playtime day simply doesn’t expand.
- +
plugins/FrontierBorder/data.ymlis the plugin’s public state (current-radius,total-expansions,paused,expansion-historywith{date, from, to, player-hours, active-players, triggered-by}) — safe to read from other tools. The plugin re-applies the border every boot and syncscurrent-radiusback if someone runs vanilla/worldborder set. - +
/border setalso zeroes the period counters. If you only want to correct the radius, use vanilla/worldborder setinstead — that is picked up without touching the schedule. - +
/border autopregencallssaveConfig(), which strips the comments from config.yml — hand-edit if you want to keep them. - +Both list keys are "first match wins": tiers highest-hours first, caps smallest-radius first, or you silently get the wrong number.
← Previous
FrontierStatsAPI
Embedded HTTP/JSON API (35 routes) serving every plugin’s data to a website or bot
Next →
FrontierTab
Tab-list header/footer with playtime, deaths, session, border, End status
Looking for something specific? Search the whole suite.