Bug fixes:
- improve tournaments caching
- synchronize player storage on join/leave/removeAll/save concurrent DataSaver writes
- arena enter: fix wrong config path settings.require_empty_inventory → settings.general.*
- fix require_empty_inventory condition
- reset command available when tournament not FINISHED and not IN_PROGRESS
- local tournaments ID collision after deletions
- improve active tournamente lookup
- match: add TIMEOUT as winning cause with health-based resolution
- better use of bye fake team
Tournament logic:
- add configurable match timeout with health-based winner resolution
- add third_place_match and match_timeout_minutes config options
- fix third-place match result never pushed to web API
- add onMatchStart() hook; WebTournament pushes IN_PROGRESS state to bracket on match start
- Add match.serverId for server-side match ID
- add winning cause in create match API so bracket can shows KILL/TIMEOUT/FORFEIT
- fix start tournament race condition
- fix BYE seeding to interleave BYEs at front of bracket pairs
- fix third-place loser collection
Web bracket:
- add retry logic (3 attempts, 2s delay) for createMatch
- add endpoint for live IN_PROGRESS/COMPLETE bracket updates
- fix team loading when players are null
- wait for team loading before continue
- fix web join/leave thread
- Remove unused WebStartResponse and WebTeam dead code
Admin commands:
- set max team: validate input
- set max player per team: validate input
- batch tournament config writes
fix: world location validation in region checks
feat: update XSeries to fix sounds
feat: bump version to 2.2.91
Now those commands can be run from console:
- delete
- removeall
- reset
- setmaxplayer
- setmaxteams
- shuffle
- start
%ut_<arena>_round_team1%
%ut_<arena>_round_team2%
Fixed error using those placeholders when the tournament match is null
Now all messages in settings.yml uses MiniMessages
Update your file:
YAML:# Logic behind the matches in case one or both players are offline # at the time of the duel: if only one of the two players is offline, # the other wins directly if both are offline, a lot draws a winner settings: general: # If activated, teleports the player to the "exit" position teleport_after_duel: true # If activated, it saves the player's inventory before the duel and restores it after the duel save_and_restore_inventories: true # Require empty inventory before duel require_empty_inventory: false # If the player quit loses the duel, otherwise the duel ends when he dies (recommended default) handle_quit: true # The integration with placeholder api is automatic, therefore, it is advisable to leave the default value hook_in_papi: true starting_gamemode: SURVIVAL disable_hunger: true use_death_event: true no_team_name: "BYE" api_key: "" nametag: team1: "§7[§cR§7] §c" team2: "§7[§9B§7] §9" messages: # %tournament% Name of the tournament # %rounds% Number of rounds # %max_teams% Maximum number of teams # %max_players_per_team% Maximum number of players per team # %uuid% (WEB Only) UUID of the tournament # %url% (WEB Only) URL of the tournament # Examples: # "§7(%max_teams% teams, %max_players_per_team% players per team)" # "§7Bracket: §a%url%" tournament_starting: "<gold>The tournament is starting! <gray>(%tournament%) <gray>(%rounds% rounds)" # %player% Name of the player involved (winner) opponent_offline: "<red>The opponent is offline! %player% won by forfeit." # %player% Name of the player involved (winner) both_opponents_offline: "<red>Both players are offline. Random drawing of the winner..." # %player% Name of the player involved (winner) match_victory: "<red>%loser% <gray>lost against <green>%winner% <gray>(<red>%health%❤) <gray>in the duel." titles: # %round% Group number round_presentation: title: "§6§l%round%° Round" subtitle: "" fadeIn: 500 stay: 2000 fadeOut: 500 # %player1% Name of the first player involved # %player2% Name of the second player involved match_presentation: title: "§6§lDuel" subtitle: "§c%player1% §7vs §9%player2%" fadeIn: 500 stay: 2000 fadeOut: 500 match_starting: title: "§6§lStarting in" subtitle: "%seconds%" fadeIn: 200 stay: 800 fadeOut: 200 # %player% Name of the player involved (winner) match_victory: title: "§b§l%player% §7won" subtitle: "" fadeIn: 500 stay: 2000 fadeOut: 500 # %player% Name of the player involved (winner) third_place: title: "§6§l3° Place" subtitle: "" fadeIn: 500 stay: 2000 fadeOut: 500 # %player% Name of the player involved (winner) tournament_victory: title: "§d§l%player%" subtitle: "§fwon the tournament" fadeIn: 500 stay: 2000 fadeOut: 500 sounds: arena_join: "ENTITY_EXPERIENCE_ORB_PICKUP" arena_leave: "ENTITY_EXPERIENCE_ORB_PICKUP" match_starting: "ENTITY_EXPERIENCE_ORB_PICKUP" match_victory: "ENTITY_PLAYER_LEVELUP" tournament_victory: "ENTITY_ENDER_DRAGON_GROWL" events: # When a player enters the arena for his duel # %player% Name of the player involved arena_join: commands: [ ] # When a player leaves the arena for his duel # %player% Name of the player involved arena_leave: commands: [ ] commands: invite: not_supported: "<red>This command is not supported in this tournament</red>" player_not_found: "<red>Player not found</red>" invite_self: "<red>You can't invite yourself</red>" no_team: "<red>You are not in a team</red>" not_leader: "<red>You are not the leader of the team</red>" team_full: "<red>The team is already full</red>" already_in_team: "<red>Player is already in the team</red>" invite_error: "<red>An error occurred while inviting the player</red>" already_sent: "<red>Player %player% has already been invited</red>" invite_sent: "<green>Player %player% has been invited to the team</green>" invite_received: "<green>You have been invited to the team of %player%</green>" join: not_invited: "<red>No one has invited you in this team</red>" success: "<green>You signed up for the tournament</green>" success_team: "<green>You joined the team %team%</green>" leader: "<green>Player %player% joined your team</green>" no_team: "<red>Team not found</red>" full: "<red>The team is already full</red>" tournament_full: "<red>The tournament is already full</red>" already_participant: "<red>You are already registered for the tournament</red>" status_error: "<red>The tournament doesn't accept new registrations</red>" leave: not_participant: "<red>You are not registered for the tournament</red>" unsubscribe: "<green>You have unsubscribed from the tournament</green>"
