Startup update-check integration using ez-plugins/mc-plugin-update-notifier with chained sources: Modrinth public API as primary and GitHub public API as fallback. Modrinth queries loaders paper, folia, and spigot so the check works on all supported server software.
Operator join notification when an update is available, including clickable release URL output.
Faction create, disband, ally, truce, and enemy-declared events are broadcast to a Discord channel via DiscordSRV (pure reflection - no hard compile-time dependency).
Per-event toggles and Discord-markdown message templates are configurable in config.yml under integrations.discordsrv.events.*.
channel-id key routes messages to a specific text channel; leave empty to use DiscordSRV's main linked channel.
/f warp teleports now route through EssentialsX alongside /f home.
EssentialsX /back location is recorded before every teleport so players can return with /back.
Jailed players are blocked from /f home and /f warp with a message.
Detected EssentialsX version is logged at startup.
New messages.yml keys: home.teleported, home.teleport-failed, home.jailed, warp.teleported, warp.teleport-failed, warp.jailed.
Safe zones and war zones (factions.zones.safe-zone.enabled, factions.zones.war-zone.enabled):
Both zones are enabled by default. Disabling a zone causes its chunks to behave as Wilderness - protection, PvP rules, and power-loss suppression are all inactive.
New admin commands /fa safezone and /fa warzone let operators assign chunks to each zone in one-shot, square, or circle modes (with an optional remove sub-mode).
New permissions: factions.cmd.safezone, factions.cmd.warzone (default op).
When enabled, a faction can claim an enemy's chunk if the victim's land count exceeds their current maximum land (power-based). Border adjacency is waived for overclaims.
Optional guard factions.overclaiming.require-enemy-relation: true restricts overclaims to factions that have declared ENEMY relation.
Attacker receives a claim.overclaimed notification; all online victim members receive claim.overclaimed-victim showing remaining chunk count.
FactionChunkClaimEvent gains an optional overclaimedFromFaction field populated on overclaim so third-party plugins can observe the event.
New messages.yml keys: claim.overclaimed, claim.overclaimed-victim, claim.enemy-not-raidable.
Power and war improvements - six optional, independently toggleable features that improve PvP/raiding pacing. All are disabled by default:
F1 - Inactive member exclusion (factions.power.inactive-exclusion.enabled: false): members who have been offline longer than inactive-exclusion.days do not contribute to the faction's max-land calculation. Their stored power is unchanged; only the land-cap computation skips them, discouraging dead factions from holding territory indefinitely.
F2 - Death streak multiplier (factions.power.death-streak.enabled: false): consecutive deaths within a rolling window-seconds window each multiply the power loss by multiplier^streak. After the window expires the streak resets. A separate power.death-streak-penalty message is sent on streak deaths. Persisted in two new PlayerModel columns: last_death_at, death_streak.
F3 - Scaled kill rewards (factions.power.gain-on-kill.scale.enabled: false): kill power gain is multiplied by clamp(victimPower / killerPower, min-factor, max-factor). Rewarding high-risk kills and reducing farming incentive.
F4 - Raidable state broadcast (factions.raidable.broadcast.enabled: true): after each power tick, the engine detects factions that cross the raidable threshold and notifies members. Optional server-wide: true broadcasts to all online players. The raidable flag is persisted in a new FactionModel column: is_raidable.
F5 - Offline protection (factions.overclaiming.offline-protection.enabled: false): blocks overclaiming when all members of the defending faction are currently offline, preventing pure offline raiding.
F6 - War shield (factions.war.shield.enabled: false): a faction may be assigned a daily UTC protection window by an admin using the new /fa shield <faction> <start-hour> <duration-hours> command. During the window the faction's land cannot be overclaimed. Persisted in two new FactionModel columns: shield_start_hour, shield_duration_hours.
New admin command: /fa shield <faction> <clear|<start-hour (0-23)> <duration-hours>>.
New permission: factions.cmd.shield (default op, child of factions.admin).
New messages.yml keys: power.death-streak-penalty, raidable.*, shield.*, claim.enemy-offline-protected, claim.shield-active.
/f powerhistory [<player>] [<page>] (alias: phist): shows a paginated log of significant power changes (death, kill, and purchase events). Players can view their own history without any extra permission. Viewing another player's history requires factions.cmd.power.history.other (default op). All message templates are configurable in messages.yml under power.history-*.
TeamsAPI 1.8.0 power history provider: when TeamsAPI 1.8.0+ is present the plugin registers a TeamsPowerHistoryService implementation that exposes all recorded power-change events through the standard TeamsAPI surface. Consumer plugins can read player and team history, filter by time range, add external entries, and remove or clear records without touching the database directly. The provider is registered reflectively so servers running TeamsAPI 1.7.x or earlier start cleanly and the provider is silently skipped. New permissions: factions.cmd.power.history (default true), factions.cmd.power.history.other (default op).
Update notifier library is now explicitly relocated in shading: com.github.ezplugins.updater -> com.pvpindex.lib.updater, preventing runtime classpath conflicts.
Update check is disabled by default (factions.updates.enabled: false). Opt in by setting it to true.
factions.updates.modrinth-slug, factions.updates.github-owner, and factions.updates.github-repo are no longer exposed as config keys; the values are hardcoded in the plugin and the config entries are ignored if present.
EssentialsX interop now uses the compile-time EssentialsX API instead of reflection, making it resilient to future EssentialsX API changes and easier to diagnose when something breaks.
Plugin validates that the plugin named Essentials actually implements IEssentials before enabling the integration; logs a warning and falls back to noop if not.