New features:
• Cross-world ender pearl blocking can be limited to specific worlds viaenderpearl.prevent_cross_world_throw_worlds(pearls thrown only in those worlds cannot teleport you to another world; leave empty and useprevent_cross_worldfor global behavior)
Improvements:
• Ender pearl throw world is recorded for cross-world checks even when the pearl cooldown path is skipped, so restrictions stay consistent
New features:
• Added option to completely disable ender pearls in specific worlds viaenderpearl.disabled_worlds
• Added option to disable ender pearls in WorldGuard regions (e.g. PvP arenas) viaenderpearl.disabled_regions
• Added optional cross-world teleportation prevention for ender pearls viaenderpearl.prevent_cross_world(disabled by default)
New features:
• Safezone support for claim/plot plugins: GriefPrevention, Towny, Residence, PlotSquared, Lands, GriefDefender, KingdomsX, HuskTowns, and HuskClaims, combat-tagged players can no longer enter those claims (same behaviour as WorldGuard PVP-deny regions)
• New config sectionsafezone_protection.claim_plugins: each plugin can be toggled on or off; optional long form withenabledandblock_own(allow entering own claim in combat where the plugin supports it)
Bug fixes:
• Fixed "Must use teleportAsync while in region threading" errors on Folia when using teleport-related commands or features
Technical:
• All player and entity teleports now use teleportAsync and schedule follow-up actions (messages, sounds, cooldowns) on the correct region or global scheduler for full Folia compatibility
New features:
• World whitelist/blacklist – restrict PerfCombat to specific worlds or exclude worlds (mode: all | whitelist | blacklist)
• Combat tag, command blocking, item restrictions, pearl cooldown, kill-on-quit, and safezone are disabled in excluded worlds
- added message-display-mode: choose where combat messages appear (chat | actionbar | both)
- Empty messages in messages.yml ("") are no longer sent
added API
• Obtain via Bukkit.getServicesManager().getRegistration(PerfCombatAPI.class)
• isInCombat(UUID), getRemainingCombatTimeMillis(UUID), getCombatOpponents(UUID)
• isInSafezone(Location), tag(Player, Player), removeTag(UUID)
• isCommandBlocked(Player, String), isItemBlocked(Player, Material)
• loadStatsAsync(UUID, Consumer<CombatStats>) – kills, deaths, killstreaks
• Events: CombatTagEvent (Cancellable), CombatEndEvent
