
PvPIndex Battle
Official open free ELO platform with advanced battle system. Includes Sword PvP, Crystal PvP, Sumo and much more
107
2
107
2
Added
- Vault economy rewards (#15): battle winners now receive configurable currency payouts via the Vault API. Fully configured through
vault-rewards.ymlwith per-game-mode base amounts and an optional win streak multiplier. Vault is a soft dependency: if not installed, rewards are silently disabled. Closes #15. - New
vault-rewards.ymlconfiguration file. All settings live under a top-leveleconomy:key withenabled,rewards(per-mode amounts), andstreak_multiplier(enabled, increment, max, min_streak) sections. The bundled default ships witheconomy.enabled: falseso a fresh install does not pay out until opted in. - New
VaultRewardServiceinplatform-paperthat hooks into Vault, listens forPvPIndexBattleFinishEvent, and deposits rewards. - New
VaultRewardConfigrecord for parsing and validating reward configuration from theeconomysection. - New PlaceholderAPI placeholders:
%pvpindex_reward_last%(last reward received) and%pvpindex_streak%(current win streak). - New lang keys
reward.receivedandreward.received_streakin all 6 bundled locale files (en, de, nl, es, pl, zh). - Vault status line in the startup summary showing whether economy rewards are active.
Changed
- Console banner redesign: startup banner now displays a large ASCII art "PVP INDEX" with a Green-Yellow-Red gradient. Info line shows version, platform, and author (PVP Index).
- Shutdown message: updated to display "PVP INDEX has been disabled. Goodbye!" in red/grey styling.
- Paper 26.1.x adapter build: the
paper.26.1.xversion module now compiles against the stable Paper API26.1.2.build.57-stableusing the Java 25 toolchain, so the adapter builds cleanly across the supported 1.21.x to 26.1.x range. - Upgraded
maven-shade-pluginto3.6.2(bundles ASM 9.8+) so the relocated bStats and Jackson dependencies shade correctly against Java 25 bytecode.
Fixed
- Cross-server challenges from a lobby: challenging a player who was on a backend server (or behind another proxy) from a lobby silently timed out. Lobby servers relied on a player-location cache that went stale once a player moved to a non-lobby backend, so the challenge was routed to a node where the target was not present. The lobby now only uses the direct lobby-to-lobby Redis path when the cache confirms the target is on a live lobby node; otherwise it broadcasts the challenge over Redis to the proxies, which authoritatively resolve the target's current server and forward it. Challenges now work from any server to any server.
- Proxy challenge routing over Redis: Velocity proxies now handle inbound
CHALLENGE_SENDmessages over Redis (not only plugin messaging), resolving the target across all connected backends and forwarding the challenge. This removes the dependency on plugin messaging channels, which could break after a backend restarted independently of the proxy. - SMP challenge confirmation: accepting an SMP-mode challenge through the risk-confirmation dialog did nothing because closing the inventory cleared the pending GUI state before it was read. The mode and challenge target are now captured before the inventory closes.
- Return-to-origin after a cross-server battle: players transferred to another server for a battle were left waiting on the host server for two seconds before being returned, which looked like a double teleport. They are now sent straight back to the server they came from once the battle ends.
- Vault economy rewards (#15): battle winners now receive configurable currency payouts via the Vault API. Fully configured through
Added
- Vault economy rewards (#15): battle winners now receive configurable currency payouts via the Vault API. Fully configured through
vault-rewards.ymlwith per-game-mode base amounts and an optional win streak multiplier. Vault is a soft dependency: if not installed, rewards are silently disabled. Closes #15. - New
vault-rewards.ymlconfiguration file. All settings live under a top-leveleconomy:key withenabled,rewards(per-mode amounts), andstreak_multiplier(enabled, increment, max, min_streak) sections. The bundled default ships witheconomy.enabled: falseso a fresh install does not pay out until opted in. - New
VaultRewardServiceinplatform-paperthat hooks into Vault, listens forPvPIndexBattleFinishEvent, and deposits rewards. - New
VaultRewardConfigrecord for parsing and validating reward configuration from theeconomysection. - New PlaceholderAPI placeholders:
%pvpindex_reward_last%(last reward received) and%pvpindex_streak%(current win streak). - New lang keys
reward.receivedandreward.received_streakin all 6 bundled locale files (en, de, nl, es, pl, zh). - Vault status line in the startup summary showing whether economy rewards are active.
Changed
- Console banner redesign: startup banner now displays a large ASCII art "PVP INDEX" with a Green-Yellow-Red gradient. Info line shows version, platform, and author (PVP Index).
- Shutdown message: updated to display "PVP INDEX has been disabled. Goodbye!" in red/grey styling.
- Paper 26.1.x adapter build: the
paper.26.1.xversion module now compiles against the stable Paper API26.1.2.build.57-stableusing the Java 25 toolchain, so the adapter builds cleanly across the supported 1.21.x to 26.1.x range. - Upgraded
maven-shade-pluginto3.6.2(bundles ASM 9.8+) so the relocated bStats and Jackson dependencies shade correctly against Java 25 bytecode.
Fixed
- Cross-server challenges from a lobby: challenging a player who was on a backend server (or behind another proxy) from a lobby silently timed out. Lobby servers relied on a player-location cache that went stale once a player moved to a non-lobby backend, so the challenge was routed to a node where the target was not present. The lobby now only uses the direct lobby-to-lobby Redis path when the cache confirms the target is on a live lobby node; otherwise it broadcasts the challenge over Redis to the proxies, which authoritatively resolve the target's current server and forward it. Challenges now work from any server to any server.
- Proxy challenge routing over Redis: Velocity proxies now handle inbound
CHALLENGE_SENDmessages over Redis (not only plugin messaging), resolving the target across all connected backends and forwarding the challenge. This removes the dependency on plugin messaging channels, which could break after a backend restarted independently of the proxy. - SMP challenge confirmation: accepting an SMP-mode challenge through the risk-confirmation dialog did nothing because closing the inventory cleared the pending GUI state before it was read. The mode and challenge target are now captured before the inventory closes.
- Return-to-origin after a cross-server battle: players transferred to another server for a battle were left waiting on the host server for two seconds before being returned, which looked like a double teleport. They are now sent straight back to the server they came from once the battle ends.
- Vault economy rewards (#15): battle winners now receive configurable currency payouts via the Vault API. Fully configured through
Added
- Vault economy rewards (#15): battle winners now receive configurable currency payouts via the Vault API. Fully configured through
vault-rewards.ymlwith per-game-mode base amounts and an optional win streak multiplier. Vault is a soft dependency: if not installed, rewards are silently disabled. Closes #15. - New
vault-rewards.ymlconfiguration file. All settings live under a top-leveleconomy:key withenabled,rewards(per-mode amounts), andstreak_multiplier(enabled, increment, max, min_streak) sections. The bundled default ships witheconomy.enabled: falseso a fresh install does not pay out until opted in. - New
VaultRewardServiceinplatform-paperthat hooks into Vault, listens forPvPIndexBattleFinishEvent, and deposits rewards. - New
VaultRewardConfigrecord for parsing and validating reward configuration from theeconomysection. - New PlaceholderAPI placeholders:
%pvpindex_reward_last%(last reward received) and%pvpindex_streak%(current win streak). - New lang keys
reward.receivedandreward.received_streakin all 6 bundled locale files (en, de, nl, es, pl, zh). - Vault status line in the startup summary showing whether economy rewards are active.
Changed
- Console banner redesign: startup banner now displays a large ASCII art "PVP INDEX" with a Green-Yellow-Red gradient. Info line shows version, platform, and author (PVP Index).
- Shutdown message: updated to display "PVP INDEX has been disabled. Goodbye!" in red/grey styling.
- Paper 26.1.x adapter build: the
paper.26.1.xversion module now compiles against the stable Paper API26.1.2.build.57-stableusing the Java 25 toolchain, so the adapter builds cleanly across the supported 1.21.x to 26.1.x range. - Upgraded
maven-shade-pluginto3.6.2(bundles ASM 9.8+) so the relocated bStats and Jackson dependencies shade correctly against Java 25 bytecode.
Fixed
- Cross-server challenges from a lobby: challenging a player who was on a backend server (or behind another proxy) from a lobby silently timed out. Lobby servers relied on a player-location cache that went stale once a player moved to a non-lobby backend, so the challenge was routed to a node where the target was not present. The lobby now only uses the direct lobby-to-lobby Redis path when the cache confirms the target is on a live lobby node; otherwise it broadcasts the challenge over Redis to the proxies, which authoritatively resolve the target's current server and forward it. Challenges now work from any server to any server.
- Proxy challenge routing over Redis: Velocity proxies now handle inbound
CHALLENGE_SENDmessages over Redis (not only plugin messaging), resolving the target across all connected backends and forwarding the challenge. This removes the dependency on plugin messaging channels, which could break after a backend restarted independently of the proxy. - SMP challenge confirmation: accepting an SMP-mode challenge through the risk-confirmation dialog did nothing because closing the inventory cleared the pending GUI state before it was read. The mode and challenge target are now captured before the inventory closes.
- Return-to-origin after a cross-server battle: players transferred to another server for a battle were left waiting on the host server for two seconds before being returned, which looked like a double teleport. They are now sent straight back to the server they came from once the battle ends.
- Vault economy rewards (#15): battle winners now receive configurable currency payouts via the Vault API. Fully configured through
Fixed
- Flight exploit before battle (#28): players who jumped while flying before a battle were launched above the arena, causing the battle to be rejected. Flight and velocity are now neutralised before teleport, and again when applying pre-battle state.
- Explosions destroying arena blocks (#29): crystal, TNT, and other explosions could break blocks in arena worlds even when
allow_block_breakwasfalsein the game mode rules. AddedEntityExplodeEventandBlockExplodeEventlisteners that clear the block damage list when block breaking is disabled. Explosions still deal damage to players.
Fixed
- Flight exploit before battle (#28): players who jumped while flying before a battle were launched above the arena, causing the battle to be rejected. Flight and velocity are now neutralised before teleport, and again when applying pre-battle state.
- Explosions destroying arena blocks (#29): crystal, TNT, and other explosions could break blocks in arena worlds even when
allow_block_breakwasfalsein the game mode rules. AddedEntityExplodeEventandBlockExplodeEventlisteners that clear the block damage list when block breaking is disabled. Explosions still deal damage to players.
Fixed
- Flight exploit before battle (#28): players who jumped while flying before a battle were launched above the arena, causing the battle to be rejected. Flight and velocity are now neutralised before teleport, and again when applying pre-battle state.
- Explosions destroying arena blocks (#29): crystal, TNT, and other explosions could break blocks in arena worlds even when
allow_block_breakwasfalsein the game mode rules. AddedEntityExplodeEventandBlockExplodeEventlisteners that clear the block damage list when block breaking is disabled. Explosions still deal damage to players.
Added
- bStats integration: anonymous usage metrics via bStats (plugin ID
31131). Shaded and relocated tocom.pvpindex.shade.bstatsto avoid conflicts with other plugins. Provides server count, player count, and version distribution data.
- bStats integration: anonymous usage metrics via bStats (plugin ID
Added
- bStats integration: anonymous usage metrics via bStats (plugin ID
31131). Shaded and relocated tocom.pvpindex.shade.bstatsto avoid conflicts with other plugins. Provides server count, player count, and version distribution data.
- bStats integration: anonymous usage metrics via bStats (plugin ID
Added
- bStats integration: anonymous usage metrics via bStats (plugin ID
31131). Shaded and relocated tocom.pvpindex.shade.bstatsto avoid conflicts with other plugins. Provides server count, player count, and version distribution data.
- bStats integration: anonymous usage metrics via bStats (plugin ID
Added
- Configurable after-battle location: players can now be sent to a fixed lobby location or the world spawn after a battle ends, instead of always returning to their pre-battle position. Configured via
player_state.after_battle_locationin config.yml with three modes:RESTORE(default, existing behaviour),LOBBY(fixed coordinates), orWORLD_SPAWN. Closes #16. - New
AfterBattleLocationSettingsconfig record inplatform-paper. - New config section
player_state.after_battle_locationwithmode,world,x,y,z,yaw,pitchkeys. PlayerStateService.setAfterBattleLocation()method for runtime override of the post-battle teleport destination.
Changed
PlayerStateSnapshot.restore()andrestoreWithoutInventory()now accept an optionalLocationoverride parameter for the teleport destination.- Upgraded Jackson from
2.18.2to2.21.3and PlaceholderAPI from2.11.6to2.12.2. - Removed all em dashes from comments, config files, and documentation per coding standards.
- Corrected US English spellings to UK English throughout the codebase.
- Configurable after-battle location: players can now be sent to a fixed lobby location or the world spawn after a battle ends, instead of always returning to their pre-battle position. Configured via
Added
- Configurable after-battle location: players can now be sent to a fixed lobby location or the world spawn after a battle ends, instead of always returning to their pre-battle position. Configured via
player_state.after_battle_locationin config.yml with three modes:RESTORE(default, existing behaviour),LOBBY(fixed coordinates), orWORLD_SPAWN. Closes #16. - New
AfterBattleLocationSettingsconfig record inplatform-paper. - New config section
player_state.after_battle_locationwithmode,world,x,y,z,yaw,pitchkeys. PlayerStateService.setAfterBattleLocation()method for runtime override of the post-battle teleport destination.
Changed
PlayerStateSnapshot.restore()andrestoreWithoutInventory()now accept an optionalLocationoverride parameter for the teleport destination.- Upgraded Jackson from
2.18.2to2.21.3and PlaceholderAPI from2.11.6to2.12.2. - Removed all em dashes from comments, config files, and documentation per coding standards.
- Corrected US English spellings to UK English throughout the codebase.
- Configurable after-battle location: players can now be sent to a fixed lobby location or the world spawn after a battle ends, instead of always returning to their pre-battle position. Configured via
Added
- Configurable after-battle location: players can now be sent to a fixed lobby location or the world spawn after a battle ends, instead of always returning to their pre-battle position. Configured via
player_state.after_battle_locationin config.yml with three modes:RESTORE(default, existing behaviour),LOBBY(fixed coordinates), orWORLD_SPAWN. Closes #16. - New
AfterBattleLocationSettingsconfig record inplatform-paper. - New config section
player_state.after_battle_locationwithmode,world,x,y,z,yaw,pitchkeys. PlayerStateService.setAfterBattleLocation()method for runtime override of the post-battle teleport destination.
Changed
PlayerStateSnapshot.restore()andrestoreWithoutInventory()now accept an optionalLocationoverride parameter for the teleport destination.- Upgraded Jackson from
2.18.2to2.21.3and PlaceholderAPI from2.11.6to2.12.2. - Removed all em dashes from comments, config files, and documentation per coding standards.
- Corrected US English spellings to UK English throughout the codebase.
- Configurable after-battle location: players can now be sent to a fixed lobby location or the world spawn after a battle ends, instead of always returning to their pre-battle position. Configured via
Added
/pvpalias:/pvpnow works as an alias for/battle, making it easier for players to discover the command.- Leaderboard GUI (
/battle leaderboard [mode]): paginated inventory GUI showing player skulls ranked by Elo. Each skull displays wins, losses, K/D, streak, and best streak. Supports per-mode filtering (/battle leaderboard sword) or an overall view. Aliases:/battle lb,/battle top. Requiresdatabase.enabled: truein config.yml. - New
LeaderboardGuiclass inplatform-paperwith 28-entry pages, arrow-based pagination, and skull-per-player layout. - New lang keys
leaderboard.no_data,leaderboard.unknown_mode,leaderboard.errorin all bundled language files (en, de, nl, es, pl, zh).
Added
/pvpalias:/pvpnow works as an alias for/battle, making it easier for players to discover the command.- Leaderboard GUI (
/battle leaderboard [mode]): paginated inventory GUI showing player skulls ranked by Elo. Each skull displays wins, losses, K/D, streak, and best streak. Supports per-mode filtering (/battle leaderboard sword) or an overall view. Aliases:/battle lb,/battle top. Requiresdatabase.enabled: truein config.yml. - New
LeaderboardGuiclass inplatform-paperwith 28-entry pages, arrow-based pagination, and skull-per-player layout. - New lang keys
leaderboard.no_data,leaderboard.unknown_mode,leaderboard.errorin all bundled language files (en, de, nl, es, pl, zh).
Added
/pvpalias:/pvpnow works as an alias for/battle, making it easier for players to discover the command.- Leaderboard GUI (
/battle leaderboard [mode]): paginated inventory GUI showing player skulls ranked by Elo. Each skull displays wins, losses, K/D, streak, and best streak. Supports per-mode filtering (/battle leaderboard sword) or an overall view. Aliases:/battle lb,/battle top. Requiresdatabase.enabled: truein config.yml. - New
LeaderboardGuiclass inplatform-paperwith 28-entry pages, arrow-based pagination, and skull-per-player layout. - New lang keys
leaderboard.no_data,leaderboard.unknown_mode,leaderboard.errorin all bundled language files (en, de, nl, es, pl, zh).
Added
- Command blocking during battles: commands are now blocked by default while a player is in an active battle. Configurable via
battle_commandsin config.yml with a whitelist of allowed commands (/battle,/msg,/r,/reply,/tellby default). Players withpvpindex.battle.commands.bypasspermission can still use all commands. Closes #19. - New
BattleCommandBlockListenerinplatform-paperthat interceptsPlayerCommandPreprocessEventatLOWESTpriority. - New config section
battle_commandsinconfig.ymlwithblock_commandstoggle andallowed_commandswhitelist. - New permission
pvpindex.battle.commands.bypass(default: op) to bypass command blocking. - New lang key
battle.command_blockedin all bundled language files (en, de, nl, es, pl, zh).
- Command blocking during battles: commands are now blocked by default while a player is in an active battle. Configurable via
Added
- Command blocking during battles: commands are now blocked by default while a player is in an active battle. Configurable via
battle_commandsin config.yml with a whitelist of allowed commands (/battle,/msg,/r,/reply,/tellby default). Players withpvpindex.battle.commands.bypasspermission can still use all commands. Closes #19. - New
BattleCommandBlockListenerinplatform-paperthat interceptsPlayerCommandPreprocessEventatLOWESTpriority. - New config section
battle_commandsinconfig.ymlwithblock_commandstoggle andallowed_commandswhitelist. - New permission
pvpindex.battle.commands.bypass(default: op) to bypass command blocking. - New lang key
battle.command_blockedin all bundled language files (en, de, nl, es, pl, zh).
- Command blocking during battles: commands are now blocked by default while a player is in an active battle. Configurable via
Added
- Command blocking during battles: commands are now blocked by default while a player is in an active battle. Configurable via
battle_commandsin config.yml with a whitelist of allowed commands (/battle,/msg,/r,/reply,/tellby default). Players withpvpindex.battle.commands.bypasspermission can still use all commands. Closes #19. - New
BattleCommandBlockListenerinplatform-paperthat interceptsPlayerCommandPreprocessEventatLOWESTpriority. - New config section
battle_commandsinconfig.ymlwithblock_commandstoggle andallowed_commandswhitelist. - New permission
pvpindex.battle.commands.bypass(default: op) to bypass command blocking. - New lang key
battle.command_blockedin all bundled language files (en, de, nl, es, pl, zh).
- Command blocking during battles: commands are now blocked by default while a player is in an active battle. Configurable via
Added
- TeamsAPI guard: optional integration with TeamsAPI that prevents players on the same team from challenging each other. Disabled by default (
teams_guard.block_same_team: false). Requires TeamsAPI + a compatible team plugin on the server; if either is absent, the feature is silently skipped (fail-open). - New
TeamsGuardServiceclass inplatform-paper— encapsulates the same-team lookup with gracefulNoClassDefFoundErrorhandling so the plugin loads cleanly whether or not TeamsAPI is on the classpath. TeamsAPIadded tosoftdependinplugin.ymlso Paper loads it before PvPIndex Battles when both plugins are present.- New config section
teams_guardinconfig.yml. - New lang keys
challenge.same_teamandchallenge.same_team_targetin all bundled language files (en, de, nl, es, pl, zh). - JitPack repository added to parent
pom.xml;teams-api:1.5.0added as aprovideddependency inpvpindex-platform-paper.
Fixed
- Spigot/Paper/Folia compatibility: removed all Adventure API calls that are only available on Paper. The plugin now runs on plain Spigot without
NoSuchMethodErrorcrashes.player.sendMessage(Component)→player.sendMessage(String)player.showTitle(Title)→player.sendTitle(String, String, int, int, int)player.playSound(Sound)→player.playSound(Location, org.bukkit.Sound, float, float)Bukkit.createInventory(holder, size, Component)→ String overloadmeta.displayName(Component)/meta.lore(List<Component>)→setDisplayName/setLoreClickEvent/HoverEvent(Adventure) in challenge messages replaced with BungeeCord chat API (player.spigot().sendMessage(...))
- MiniMessage and
&-style colour codes are still fully supported for config authors: inputs are parsed internally via MiniMessage/LegacyAmpersand and serialised to§-prefixed legacy strings before being passed to Bukkit APIs. - Enchantment glint on active GUI tabs now uses
item.addUnsafeEnchantment(anItemStackmethod, notItemMeta), fixing a compile error against Paper API 1.21. - Removed references to
GameRulefields that do not exist on older Bukkit versions (FALL_DAMAGE,FIRE_DAMAGE,FREEZE_DAMAGE,DROWNING_DAMAGE).
- TeamsAPI guard: optional integration with TeamsAPI that prevents players on the same team from challenging each other. Disabled by default (
Added
- TeamsAPI guard: optional integration with TeamsAPI that prevents players on the same team from challenging each other. Disabled by default (
teams_guard.block_same_team: false). Requires TeamsAPI + a compatible team plugin on the server; if either is absent, the feature is silently skipped (fail-open). - New
TeamsGuardServiceclass inplatform-paper— encapsulates the same-team lookup with gracefulNoClassDefFoundErrorhandling so the plugin loads cleanly whether or not TeamsAPI is on the classpath. TeamsAPIadded tosoftdependinplugin.ymlso Paper loads it before PvPIndex Battles when both plugins are present.- New config section
teams_guardinconfig.yml. - New lang keys
challenge.same_teamandchallenge.same_team_targetin all bundled language files (en, de, nl, es, pl, zh). - JitPack repository added to parent
pom.xml;teams-api:1.5.0added as aprovideddependency inpvpindex-platform-paper.
Fixed
- Spigot/Paper/Folia compatibility: removed all Adventure API calls that are only available on Paper. The plugin now runs on plain Spigot without
NoSuchMethodErrorcrashes.player.sendMessage(Component)→player.sendMessage(String)player.showTitle(Title)→player.sendTitle(String, String, int, int, int)player.playSound(Sound)→player.playSound(Location, org.bukkit.Sound, float, float)Bukkit.createInventory(holder, size, Component)→ String overloadmeta.displayName(Component)/meta.lore(List<Component>)→setDisplayName/setLoreClickEvent/HoverEvent(Adventure) in challenge messages replaced with BungeeCord chat API (player.spigot().sendMessage(...))
- MiniMessage and
&-style colour codes are still fully supported for config authors: inputs are parsed internally via MiniMessage/LegacyAmpersand and serialised to§-prefixed legacy strings before being passed to Bukkit APIs. - Enchantment glint on active GUI tabs now uses
item.addUnsafeEnchantment(anItemStackmethod, notItemMeta), fixing a compile error against Paper API 1.21. - Removed references to
GameRulefields that do not exist on older Bukkit versions (FALL_DAMAGE,FIRE_DAMAGE,FREEZE_DAMAGE,DROWNING_DAMAGE).
- TeamsAPI guard: optional integration with TeamsAPI that prevents players on the same team from challenging each other. Disabled by default (
1
Совместимость
Сведения
Лицензия:
Опубликован:1 месяц назад
Обновлён:1 неделю назад
ID проекта:


