[1.21.* - 26.1.*] PvPIndex Battles - 1v1 Battles | Global Leaderboard | 10+ Game Modes icon

[1.21.* - 26.1.*] PvPIndex Battles - 1v1 Battles | Global Leaderboard | 10+ Game Modes -----

Official open free ELO platform with advanced battle system




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_break was false in the game mode rules. Added EntityExplodeEvent and BlockExplodeEvent listeners that clear the block damage list when block breaking is disabled. Explosions still deal damage to players.
----------, Jun 5, 2026

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_location in config.yml with three modes: RESTORE (default, existing behaviour), LOBBY (fixed coordinates), or WORLD_SPAWN. Closes #16.
  • New AfterBattleLocationSettings config record in platform-paper.
  • New config section player_state.after_battle_location with mode, world, x, y, z, yaw, pitch keys.
  • PlayerStateService.setAfterBattleLocation() method for runtime override of the post-battle teleport destination.
Changed
  • PlayerStateSnapshot.restore() and restoreWithoutInventory() now accept an optional Location override parameter for the teleport destination.
  • Upgraded Jackson from 2.18.2 to 2.21.3 and PlaceholderAPI from 2.11.6 to 2.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.
----------, Jun 5, 2026

Added
  • /pvp alias: /pvp now 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. Requires database.enabled: true in config.yml.
  • New LeaderboardGui class in platform-paper with 28-entry pages, arrow-based pagination, and skull-per-player layout.
  • New lang keys leaderboard.no_data, leaderboard.unknown_mode, leaderboard.error in all bundled language files (en, de, nl, es, pl, zh).
----------, May 22, 2026

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 TeamsGuardService class in platform-paper — encapsulates the same-team lookup with graceful NoClassDefFoundError handling so the plugin loads cleanly whether or not TeamsAPI is on the classpath.
  • TeamsAPI added to softdepend in plugin.yml so Paper loads it before PvPIndex Battles when both plugins are present.
  • New config section teams_guard in config.yml.
  • New lang keys challenge.same_team and challenge.same_team_target in all bundled language files (en, de, nl, es, pl, zh).
  • JitPack repository added to parent pom.xml; teams-api:1.5.0 added as a provided dependency in pvpindex-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 NoSuchMethodError crashes.
    • 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 overload
    • meta.displayName(Component) / meta.lore(List<Component>) → setDisplayName / setLore
    • ClickEvent / 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 (an ItemStack method, not ItemMeta), fixing a compile error against Paper API 1.21.
  • Removed references to GameRule fields that do not exist on older Bukkit versions (FALL_DAMAGE, FIRE_DAMAGE, FREEZE_DAMAGE, DROWNING_DAMAGE).
----------, May 17, 2026

Added
  • Lobby mode: Paper servers can now connect directly to Redis for real-time global sync (lobby.enabled: true).
  • Global Player List: real-time player visibility across all lobbies via Redis pub/sub (replaces periodic proxy dumps).
  • Global Challenges: lobby-to-lobby challenge routing via Redis. 2-hop flow replaces the old 4-hop proxy-mediated routing.
  • Global Presence: real-time online/offline/in-battle/in-queue status across all regions via PRESENCE_UPDATE messages.
  • Global Invites: invite any player from any server with INVITE_SEND/INVITE_ACCEPT/INVITE_DECLINE messages.
  • Global Parties: create, join, and manage parties across all servers with Redis-synced state. Party-aware matchmaking. Commands: /party create, /party invite, /party join, /party leave, /party kick, /party disband.
  • Global Routing: smart region selection for cross-region battles (ROUTE_REQUEST/ROUTE_RESPONSE). Strategies: nearest, lowest latency, least loaded, shared server.
  • Optional Database Layer: persistent storage for stats, match history, ELO ratings, and player profiles.
    • MySQL/MariaDB support with HikariCP connection pooling.
    • SQLite support for single-server or development setups.
    • MongoDB support for complex data (stub; requires driver on classpath).
    • Configurable via database.* section in config.yml.
  • New Maven module: pvpindex-database with DatabaseProvider interface, repository abstractions, and implementations.
  • NetworkNode class with NodeType enum (PROXY, LOBBY, BACKEND) generalising the network module.
  • LobbyNetworkService orchestrates all Redis-based services on lobby Paper servers.
  • PlayerSyncService, ChallengeSyncService, PresenceService, InviteService, PartySyncService, RoutingService, TransferRequester in platform-paper network package.
  • DataService in platform-paper data package for database lifecycle management.
  • TransferRequester: lobbies request player transfers from proxy via Redis TRANSFER_REQUEST.
  • TRANSFER_REQUEST handler on Velocity and BungeeCord proxies. Executes player transfers requested by lobbies.
  • New NetworkMessageType entries: PRESENCE_UPDATE, INVITE_SEND/ACCEPT/DECLINE, PARTY_CREATE/JOIN/LEAVE/DISBAND/INVITE/KICK/UPDATE/CHAT, ROUTE_REQUEST/RESPONSE.
  • NetworkPlayerCache now supports incremental updates (addPlayer, removePlayer, updateServer) alongside bulk updates.
  • LobbySettings and DatabaseSettings config records.
  • New config sections: lobby.* (Redis connectivity for lobby servers) and database.* (optional persistence).
  • New docs: SETUP-LOBBY.md, SETUP-DATABASE.md, GLOBAL-FEATURES.md, SCALING.md.
Changed
  • Architecture: lobbies now handle all global features via Redis instead of routing through proxies. Proxies are simplified to authentication, routing, and player transfers.
  • Network module generalised: ProxyNode → NetworkNode with NodeType enum. ProxyNode kept as deprecated subclass.
  • NetworkRouter interface: added registerLocalNode(), getNode(), allNodes(), onlineNodes(), sendToNode(). Old proxy-specific methods deprecated.
  • DefaultNetworkRouter: refactored to use NetworkNode internally; backward-compatible with ProxyNode usage.
  • ChallengeManager: added setLobbyServices() for Redis-direct challenge routing. Supports three modes: lobby (Redis), proxy (plugin messaging), standalone (local).
  • Velocity ProxyMessageHandler: stripped all challenge routing logic. Now handles battle lifecycle, heartbeats, and TRANSFER_REQUEST only. Legacy challenge forwarding kept for backward compat.
  • BungeeCord BungeeProxyMessageHandler: same simplification as Velocity.
  • PvPIndexBattlesPlugin: added initialisation for LobbyNetworkService and DataService.
  • Plugin messaging reliability: lobbies no longer depend on proxy for challenge delivery (no dropped messages when no players online).
  • Challenge flow reduced from 4 hops (Paper→Proxy→Redis→Proxy→Paper) to 2 hops (Lobby→Redis→Lobby).
Fixed
  • Challenge "Player not found" after restart: lobby servers ignored proxy player list updates after restarting, leaving the network player cache empty for remote players. NetworkPlayerCache now merges incoming updates so remote players are visible within seconds of a restart.
  • Cross-proxy challenge lookup: challenges between players on different proxies (e.g. US to EU) failed with "Player not found" because the proxy only checked its own player list. Velocity and BungeeCord proxies now fall back to the Redis player registry for cross-proxy lookups.
  • Dead player teleport failure: after a battle, defeated players who were still dead could not be teleported, silently stranding them in deleted arena worlds. PlayerStateSnapshot now force-respawns dead players before attempting the teleport.
  • Cross-server return after battle: players transferred to another server for a battle were not returned to their original server afterwards. Proxies now track each player's origin server before transfer and automatically return them when the battle ends.
  • SMP loot phase cleanup on winner disconnect: if the winner disconnected during the SMP loot phase, the loser was left stranded with no boss bar and no timer. The plugin now ends the loot phase cleanly, restoring the loser and cancelling all timers.
  • Challenge accepted notification not delivered: accepting or declining a challenge from a backend server through a lobby produced no response on the challenger's side. Fixed routing of CHALLENGE_ACCEPT and CHALLENGE_DECLINE messages between Redis and plugin messaging on both Velocity and BungeeCord proxies.
  • TeleHop arena conflict: TeleHop's random respawn feature interfered with PvPIndex arena death handling by teleporting dead players before the plugin could process them. Added excluded-worlds support to TeleHop to skip arena worlds.
Deprecated
  • ProxyNode class. Use NetworkNode with NodeType.PROXY instead.
  • NetworkRouter.registerLocalProxy(). Use registerLocalNode().
  • NetworkRouter.getProxy(), allProxies(), onlineProxies(). Use node-generic equivalents.
  • Proxy-based challenge routing (kept as fallback for standalone/SMP servers without Redis).
  • Periodic NETWORK_PLAYER_LIST broadcast from proxy (kept as fallback for non-lobby backends).
Removed
  • PendingChallenge from platform-velocity (challenge state no longer lives on proxy).
  • BungeePendingChallenge from platform-bungeecord.
  • Cross-proxy challenge routing logic from both proxy message handlers.
----------, May 6, 2026

Resource Information
Author:
----------
Total Downloads: 59
First Release: May 5, 2026
Last Update: Jun 5, 2026
Category: ---------------
All-Time Rating:
0 ratings
Find more info at docs.pvpindex.com...
Version -----
Released: --------------------
Downloads: ------
Version Rating:
----------------------
-- ratings