From 38cf88a9fb5729df4e241e53d708e6f687d95485 Mon Sep 17 00:00:00 2001 From: "BT (calcastor/mame)" <43831917+calcastor@users.noreply.github.com> Date: Sun, 5 Apr 2026 11:43:11 -0700 Subject: [PATCH 1/4] Cleanup Signed-off-by: BT (calcastor/mame) <43831917+calcastor@users.noreply.github.com> --- build.gradle.kts | 18 ++-- buildSrc/build.gradle.kts | 6 +- .../buildlogic.java-conventions.gradle.kts | 23 +++-- buildSrc/src/main/kotlin/extensions.kt | 11 +-- gradle.properties | 1 + gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 45633 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 12 +-- gradlew.bat | 93 ++++++++++++++++++ .../dev/pgm/events/api/teams/ConfigTeams.java | 35 +++---- .../events/api/teams/DefaultTeamRegistry.java | 24 ++--- .../pgm/events/commands/CommandException.java | 2 +- .../commands/TournamentAdminCommands.java | 29 +++--- .../commands/TournamentUserCommands.java | 6 +- .../providers/TournamentProvider.java | 2 +- .../rounds/format/FormatRoundDescription.java | 19 ++-- .../format/rounds/replay/ReplayRound.java | 13 ++- .../rounds/single/SingleRoundDescription.java | 7 +- .../format/rounds/veto/VetoController.java | 2 +- .../format/rounds/veto/VetoDescription.java | 16 +-- .../format/rounds/veto/VetoHistory.java | 2 +- .../events/format/rounds/veto/VetoRound.java | 25 +++-- .../rounds/veto/VetoTournamentImpl.java | 9 +- .../dev/pgm/events/ready/ReadyListener.java | 6 +- .../dev/pgm/events/ready/ReadyManager.java | 2 +- .../pgm/events/ready/ReadyManagerImpl.java | 2 +- .../dev/pgm/events/ready/ReadySystem.java | 2 +- .../pgm/events/team/DefaultTeamManager.java | 2 +- .../java/dev/pgm/events/utils/Components.java | 5 +- .../java/dev/pgm/events/utils/Response.java | 2 +- .../java/dev/pgm/events/xml/RoundParser.java | 4 +- 31 files changed, 227 insertions(+), 155 deletions(-) create mode 100644 gradle.properties create mode 100644 gradlew.bat diff --git a/build.gradle.kts b/build.gradle.kts index e07587a..d08e04d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -41,14 +41,20 @@ publishing { tasks { processResources { + val description = project.description + val version = project.version.toString() + val commitHash = project.latestCommitHash() + filesMatching(listOf("plugin.yml")) { expand( - "name" to project.name, - "description" to project.description, - "mainClass" to "dev.pgm.events.EventsPlugin", - "version" to project.version, - "commitHash" to project.latestCommitHash(), - "url" to "https://pgm.dev/" + mapOf( + "description" to description, + "apiVersion" to "1.21.11", + "mainClass" to "dev.pgm.events.EventsPlugin", + "version" to version, + "commitHash" to commitHash, + "url" to "https://pgm.dev/" + ) ) } } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 7afcf6e..7ec990c 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -9,7 +9,7 @@ repositories { } dependencies { - implementation("com.gradleup.shadow:shadow-gradle-plugin:8.3.0") - implementation("com.diffplug.spotless:spotless-plugin-gradle:7.0.0.BETA4") - implementation("de.skuzzle.restrictimports:restrict-imports-gradle-plugin:2.6.0") + implementation("com.gradleup.shadow:com.gradleup.shadow.gradle.plugin:9.4.1") + implementation("com.diffplug.gradle.spotless:com.diffplug.gradle.spotless.gradle.plugin:8.4.0") + implementation("de.skuzzle.restrictimports:de.skuzzle.restrictimports.gradle.plugin:3.0.0") } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts index 94c6609..c6b3d83 100644 --- a/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts @@ -14,16 +14,19 @@ repositories { mavenLocal() mavenCentral() maven("https://oss.sonatype.org/content/repositories/snapshots/") // Snapshots - maven("https://repo.pgm.fyi/snapshots/") // PGM-specific depdencies + maven("https://repo.pgm.fyi/snapshots/") // PGM-specific dependencies maven("https://repo.papermc.io/repository/maven-public/") // Needed for bungeecord-chat + } dependencies { - compileOnly("dev.pgm.paper:paper-api:1.8_1.21.1-SNAPSHOT") - compileOnly("tc.oc.pgm:core:0.16-SNAPSHOT") + api("org.jspecify:jspecify:1.0.0") + compileOnly("net.md-5:bungeecord-chat:1.20-R0.2-deprecated+build.18") + compileOnly("dev.pgm.paper:paper-api:1.8_1.21.11-SNAPSHOT") + compileOnly("tc.oc.pgm:core:0.16-SNAPSHOT") compileOnly("org.incendo:cloud-annotations:2.0.0") - compileOnly("org.jetbrains:annotations:22.0.0") + compileOnly("org.jetbrains:annotations:26.1.0") } group = "dev.pgm" @@ -31,26 +34,26 @@ version = "1.0.0-SNAPSHOT" description = "Manage PvP tournament events" tasks { - withType() { + withType { options.encoding = "UTF-8" } - withType() { + withType { options.encoding = "UTF-8" } } spotless { - ratchetFrom = "origin/master" java { removeUnusedImports() - palantirJavaFormat("2.47.0").style("GOOGLE").formatJavadoc(true) + trimTrailingWhitespace() + formatAnnotations() + palantirJavaFormat("2.90.0").style("GOOGLE").formatJavadoc(true) } } - restrictImports { group { - reason = "Use org.jetbrains.annotations to add annotations" + reason = "Use org.jspecify.annotations to add annotations, or org.jetbrains.annotations if needed" bannedImports = listOf("javax.annotation.**") } group { diff --git a/buildSrc/src/main/kotlin/extensions.kt b/buildSrc/src/main/kotlin/extensions.kt index a173b54..beb6f54 100644 --- a/buildSrc/src/main/kotlin/extensions.kt +++ b/buildSrc/src/main/kotlin/extensions.kt @@ -1,5 +1,4 @@ import org.gradle.api.Project -import java.io.ByteArrayOutputStream fun Project.latestCommitHash(): String { @@ -7,10 +6,8 @@ fun Project.latestCommitHash(): String { } fun Project.runGitCommand(args: List): String { - val byteOut = ByteArrayOutputStream() - exec { - commandLine = listOf("git") + args - standardOutput = byteOut - } - return byteOut.toString(Charsets.UTF_8.name()).trim() + return providers.exec { + commandLine("git") + args(args) + }.standardOutput.asText.get().trim() } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..5ad6974 --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +org.gradle.configuration-cache=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d66f5e68d973ea569d8e19de379189..f8e1ee3125fe0768e9a76ee977ac089eb657005e 100644 GIT binary patch delta 37538 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 }= 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 F{{RkpxF!Gq diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9355b41..23449a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6..adff685 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -173,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -206,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..c4bdd3a --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,93 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java b/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java index 9f12d3d..706756b 100644 --- a/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java +++ b/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java @@ -29,12 +29,11 @@ private static List parseTournamentTeams(File teamsFolder, File teamsFolder.listFiles((file) -> file.getName().toLowerCase().endsWith(".yml"))) { FileConfiguration config = YamlConfiguration.loadConfiguration(child); String teamName = config.getString("name"); - List players = - config.getStringList("players").stream() - .map(String::trim) - .map(UUID::fromString) - .map(x -> TournamentPlayer.create(x, true)) - .collect(Collectors.toList()); + List players = config.getStringList("players").stream() + .map(String::trim) + .map(UUID::fromString) + .map(x -> TournamentPlayer.create(x, true)) + .collect(Collectors.toList()); teamList.add(TournamentTeam.create(teamName, players)); } @@ -43,24 +42,22 @@ private static List parseTournamentTeams(File teamsFolder, File YamlConfiguration teamsConfig = YamlConfiguration.loadConfiguration(teamsFile); for (Object object : teamsConfig.getList("teams")) { if (!(object instanceof Map)) { - System.out.println( - "Invalid type in teams.yml (" - + object.getClass().getName() - + ": " - + object.toString() - + ")! Skipping..."); + System.out.println("Invalid type in teams.yml (" + + object.getClass().getName() + + ": " + + object.toString() + + ")! Skipping..."); continue; } Map team = (Map) object; String teamName = (String) team.get("name"); - List players = - ((List) team.get("players")) - .stream() - .map(String::trim) - .map(UUID::fromString) - .map(x -> TournamentPlayer.create(x, true)) - .collect(Collectors.toList()); + List players = ((List) team.get("players")) + .stream() + .map(String::trim) + .map(UUID::fromString) + .map(x -> TournamentPlayer.create(x, true)) + .collect(Collectors.toList()); teamList.add(TournamentTeam.create(teamName, players)); } diff --git a/src/main/java/dev/pgm/events/api/teams/DefaultTeamRegistry.java b/src/main/java/dev/pgm/events/api/teams/DefaultTeamRegistry.java index 057790c..68f1955 100644 --- a/src/main/java/dev/pgm/events/api/teams/DefaultTeamRegistry.java +++ b/src/main/java/dev/pgm/events/api/teams/DefaultTeamRegistry.java @@ -47,20 +47,14 @@ public List getTeams() { @Override public void reload() { - Bukkit.getScheduler() - .runTaskAsynchronously( - EventsPlugin.get(), - () -> { - List teams = tournamentTeamFetcher.getTeams(); - Bukkit.getScheduler() - .runTask( - EventsPlugin.get(), - () -> { - teams.forEach(x -> teamMap.put(x.getName(), x)); - Bukkit.getOnlinePlayers().stream() - .filter(x -> x.hasPermission("events.staff")) - .forEach(x -> x.sendMessage(ChatColor.AQUA + "Teams reloaded!")); - }); - }); + Bukkit.getScheduler().runTaskAsynchronously(EventsPlugin.get(), () -> { + List teams = tournamentTeamFetcher.getTeams(); + Bukkit.getScheduler().runTask(EventsPlugin.get(), () -> { + teams.forEach(x -> teamMap.put(x.getName(), x)); + Bukkit.getOnlinePlayers().stream() + .filter(x -> x.hasPermission("events.staff")) + .forEach(x -> x.sendMessage(ChatColor.AQUA + "Teams reloaded!")); + }); + }); } } diff --git a/src/main/java/dev/pgm/events/commands/CommandException.java b/src/main/java/dev/pgm/events/commands/CommandException.java index 2cf1485..1f210db 100644 --- a/src/main/java/dev/pgm/events/commands/CommandException.java +++ b/src/main/java/dev/pgm/events/commands/CommandException.java @@ -4,7 +4,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.util.ComponentMessageThrowable; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class CommandException extends RuntimeException implements ComponentMessageThrowable { diff --git a/src/main/java/dev/pgm/events/commands/TournamentAdminCommands.java b/src/main/java/dev/pgm/events/commands/TournamentAdminCommands.java index 4256a97..1df8359 100644 --- a/src/main/java/dev/pgm/events/commands/TournamentAdminCommands.java +++ b/src/main/java/dev/pgm/events/commands/TournamentAdminCommands.java @@ -54,7 +54,8 @@ public void register( for (TournamentPlayer player : team.getPlayers()) { Player bukkit = Bukkit.getPlayer(player.getUUID()); MatchPlayer mp = matchManager.getPlayer(bukkit); - if (bukkit != null && Integration.isVanished(bukkit)) Integration.setVanished(mp, false, false); + if (bukkit != null && Integration.isVanished(bukkit)) + Integration.setVanished(mp, false, false); } teamManager.addTeam(team); @@ -65,13 +66,12 @@ public void register( @CommandDescription("List all loaded teams") @Permission("events.staff") public void list(CommandSender sender, TournamentTeamRegistry registry) { - sender.sendMessage( - ChatColor.GOLD - + "------- " - + ChatColor.AQUA - + "Registered Teams" - + ChatColor.GOLD - + " -------"); + sender.sendMessage(ChatColor.GOLD + + "------- " + + ChatColor.AQUA + + "Registered Teams" + + ChatColor.GOLD + + " -------"); for (TournamentTeam team : registry.getTeams()) sender.sendMessage(ChatColor.AQUA + "- " + team.getName()); sender.sendMessage(ChatColor.YELLOW + "Run /tourney info to see player roster!"); @@ -87,13 +87,12 @@ public void info( TournamentTeam team = registry.getTeam(name); if (team == null) throw new CommandException("Team not found!"); - sender.sendMessage( - ChatColor.GOLD - + "------- " - + ChatColor.AQUA - + team.getName() - + ChatColor.GOLD - + " -------"); + sender.sendMessage(ChatColor.GOLD + + "------- " + + ChatColor.AQUA + + team.getName() + + ChatColor.GOLD + + " -------"); for (TournamentPlayer player : team.getPlayers()) { String playerName = player.getUUID().toString() + ChatColor.GRAY + " (player hasn't logged on)"; diff --git a/src/main/java/dev/pgm/events/commands/TournamentUserCommands.java b/src/main/java/dev/pgm/events/commands/TournamentUserCommands.java index cef65ed..1cfa160 100644 --- a/src/main/java/dev/pgm/events/commands/TournamentUserCommands.java +++ b/src/main/java/dev/pgm/events/commands/TournamentUserCommands.java @@ -18,7 +18,8 @@ public class TournamentUserCommands { @CommandDescription("Shows the current score in the tournament") public void currentScore(CommandSender sender, TournamentFormat format) { if (format instanceof FormatTournamentImpl) { - String formatName = ((FormatTournamentImpl) format).getFormatRound().settings().name(); + String formatName = + ((FormatTournamentImpl) format).getFormatRound().settings().name(); sender.sendMessage(ChatColor.YELLOW + "For " + formatName + ":"); sender.sendMessage(format.currentScore().condensed()); @@ -38,7 +39,8 @@ public void currentScore(CommandSender sender, TournamentFormat format) { public void rounds(CommandSender sender, TournamentFormat format) { String header = "Event Rounds"; if (format instanceof FormatTournamentImpl) - header += " (" + ((FormatTournamentImpl) format).getFormatRound().settings().name() + ")"; + header += + " (" + ((FormatTournamentImpl) format).getFormatRound().settings().name() + ")"; sender.sendMessage( ChatColor.GOLD + "------- " + ChatColor.AQUA + header + ChatColor.GOLD + " -------"); diff --git a/src/main/java/dev/pgm/events/commands/providers/TournamentProvider.java b/src/main/java/dev/pgm/events/commands/providers/TournamentProvider.java index e03bbd3..c694141 100644 --- a/src/main/java/dev/pgm/events/commands/providers/TournamentProvider.java +++ b/src/main/java/dev/pgm/events/commands/providers/TournamentProvider.java @@ -7,7 +7,7 @@ import java.util.Optional; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import tc.oc.pgm.lib.org.incendo.cloud.context.CommandContext; import tc.oc.pgm.lib.org.incendo.cloud.exception.CommandExecutionException; import tc.oc.pgm.lib.org.incendo.cloud.injection.ParameterInjector; diff --git a/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundDescription.java b/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundDescription.java index 054cb8d..7535c59 100644 --- a/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundDescription.java @@ -16,19 +16,16 @@ public FormatRoundDescription(FormatRound formatRound) { @Override public BaseComponent roundInfo() { - TextComponent component = - new TextComponent( - formatRound.settings().name() + " - Best of " + formatRound.settings().bestOf()); + TextComponent component = new TextComponent( + formatRound.settings().name() + " - Best of " + formatRound.settings().bestOf()); if (formatRound.formatTournament() != null) - component.setHoverEvent( - new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - new BaseComponent[] {new TextComponent(formatRound.formattedScore().condensed())})); + component.setHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + new BaseComponent[] {new TextComponent(formatRound.formattedScore().condensed())})); else - component.setHoverEvent( - new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - new BaseComponent[] {new TextComponent(ChatColor.YELLOW + "Loading...")})); + component.setHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + new BaseComponent[] {new TextComponent(ChatColor.YELLOW + "Loading...")})); return component; } diff --git a/src/main/java/dev/pgm/events/format/rounds/replay/ReplayRound.java b/src/main/java/dev/pgm/events/format/rounds/replay/ReplayRound.java index a4d65a1..a62cd26 100644 --- a/src/main/java/dev/pgm/events/format/rounds/replay/ReplayRound.java +++ b/src/main/java/dev/pgm/events/format/rounds/replay/ReplayRound.java @@ -29,13 +29,12 @@ public ReplayDescription describe() { @Override public void start(Match match) { setPhase(RoundPhase.RUNNING); - List rounds = - settings().referenceSettings().stream() - .map(x -> tournament().references().round(x.targetID())) - .filter(Optional::isPresent) - .map(Optional::get) - .filter(this::tiedRound) - .collect(Collectors.toList()); + List rounds = settings().referenceSettings().stream() + .map(x -> tournament().references().round(x.targetID())) + .filter(Optional::isPresent) + .map(Optional::get) + .filter(this::tiedRound) + .collect(Collectors.toList()); if (rounds.size() == 1) { // 1 round has been tied, therefore play it diff --git a/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java b/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java index 285c2df..6cd5e91 100644 --- a/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java @@ -46,10 +46,9 @@ private String winnersString() { return drawString(); } - String teamString = - teams.stream() - .map(x -> format.teamManager().formattedName(x)) - .collect(Collectors.joining(ChatColor.GRAY + ", ")); + String teamString = teams.stream() + .map(x -> format.teamManager().formattedName(x)) + .collect(Collectors.joining(ChatColor.GRAY + ", ")); teamString += " won"; return teamString; diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java index 514c4c4..aff89a2 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Optional; import java.util.Random; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class VetoController { diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java index 1f6d35e..0932624 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java @@ -31,10 +31,9 @@ public BaseComponent roundInfo() { case WAITING: TextComponent waiting = new TextComponent(ChatColor.GREEN + "Deciding veto order with veto decider"); - waiting.setHoverEvent( - new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - new BaseComponent[] {tournamentFormat.currentRound().describe().roundInfo()})); + waiting.setHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + new BaseComponent[] {tournamentFormat.currentRound().describe().roundInfo()})); return waiting; case RUNNING: TextComponent running = new TextComponent(ChatColor.GREEN + "Veto process is running now"); @@ -126,13 +125,8 @@ public List formatOptions(List options, VetoSetting for (int i = 0; i < options.size(); i++) { int vetoNumber = i + 1; VetoOption option = options.get(i); - ComponentBuilder comp = - new ComponentBuilder( - ChatColor.GOLD - + Integer.toString(vetoNumber) - + ". " - + ChatColor.AQUA - + option.name()); + ComponentBuilder comp = new ComponentBuilder( + ChatColor.GOLD + Integer.toString(vetoNumber) + ". " + ChatColor.AQUA + option.name()); /*comp.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[]{ new TextComponent(ChatColor.GRAY + "Click to " + actionWord(type)) diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoHistory.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoHistory.java index c6489fc..2fbd6d4 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoHistory.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoHistory.java @@ -3,7 +3,7 @@ import dev.pgm.events.format.rounds.veto.settings.VetoOption; import dev.pgm.events.format.rounds.veto.settings.VetoSettings; import dev.pgm.events.team.TournamentTeam; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class VetoHistory { diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java index a347174..daec460 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java @@ -40,19 +40,18 @@ public VetoDescription describe() { @Override public void load() { setPhase(RoundPhase.WAITING); - vetoDecider = - new VetoTournamentImpl( - tournament().teamManager(), - new TournamentRoundOptions( - false, - false, - false, - Duration.ofSeconds(20), - Duration.ofSeconds(30), - Duration.ofSeconds(40), - new BestOfCalculation<>(1)), - this, - tournament().references()); + vetoDecider = new VetoTournamentImpl( + tournament().teamManager(), + new TournamentRoundOptions( + false, + false, + false, + Duration.ofSeconds(20), + Duration.ofSeconds(30), + Duration.ofSeconds(40), + new BestOfCalculation<>(1)), + this, + tournament().references()); TournamentRound decider = settings().decider().newRound(vetoDecider); if (decider instanceof VetoSelectorRound) diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoTournamentImpl.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoTournamentImpl.java index cc57e0a..cbcce3a 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoTournamentImpl.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoTournamentImpl.java @@ -28,11 +28,10 @@ public VetoTournamentImpl( @Override public void onEnd(Match match, Optional winner) { // list in descending order of score - List vetoOrder = - this.scores().scores().stream() - .sorted(Comparator.comparingInt(Score::score).reversed()) - .map(Score::team) - .collect(Collectors.toList()); + List vetoOrder = this.scores().scores().stream() + .sorted(Comparator.comparingInt(Score::score).reversed()) + .map(Score::team) + .collect(Collectors.toList()); // unregister everything with this fake event unregisterAll(); diff --git a/src/main/java/dev/pgm/events/ready/ReadyListener.java b/src/main/java/dev/pgm/events/ready/ReadyListener.java index c54afe7..6ec0144 100644 --- a/src/main/java/dev/pgm/events/ready/ReadyListener.java +++ b/src/main/java/dev/pgm/events/ready/ReadyListener.java @@ -74,10 +74,8 @@ public void onPartyChange(PlayerPartyChangeEvent event) { && manager.canReady(event.getMatch()).isAllowed() && manager.canReady(playerTeam.get()).isAllowed()) { - TextComponent readyHint = - text("Mark your team as ready using ", NamedTextColor.GREEN) - .append( - command(Style.style(NamedTextColor.YELLOW, TextDecoration.UNDERLINED), "ready")); + TextComponent readyHint = text("Mark your team as ready using ", NamedTextColor.GREEN) + .append(command(Style.style(NamedTextColor.YELLOW, TextDecoration.UNDERLINED), "ready")); Bukkit.getScheduler() .scheduleSyncDelayedTask( diff --git a/src/main/java/dev/pgm/events/ready/ReadyManager.java b/src/main/java/dev/pgm/events/ready/ReadyManager.java index 35c4f89..56f2b47 100644 --- a/src/main/java/dev/pgm/events/ready/ReadyManager.java +++ b/src/main/java/dev/pgm/events/ready/ReadyManager.java @@ -1,7 +1,7 @@ package dev.pgm.events.ready; import dev.pgm.events.utils.Response; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import tc.oc.pgm.api.match.Match; import tc.oc.pgm.api.party.Party; import tc.oc.pgm.api.player.MatchPlayer; diff --git a/src/main/java/dev/pgm/events/ready/ReadyManagerImpl.java b/src/main/java/dev/pgm/events/ready/ReadyManagerImpl.java index 10972b7..84748e8 100644 --- a/src/main/java/dev/pgm/events/ready/ReadyManagerImpl.java +++ b/src/main/java/dev/pgm/events/ready/ReadyManagerImpl.java @@ -8,7 +8,7 @@ import java.time.Duration; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import tc.oc.pgm.api.match.Match; import tc.oc.pgm.api.match.MatchPhase; import tc.oc.pgm.api.party.Party; diff --git a/src/main/java/dev/pgm/events/ready/ReadySystem.java b/src/main/java/dev/pgm/events/ready/ReadySystem.java index f3bc4ba..276fd82 100644 --- a/src/main/java/dev/pgm/events/ready/ReadySystem.java +++ b/src/main/java/dev/pgm/events/ready/ReadySystem.java @@ -3,7 +3,7 @@ import java.sql.Timestamp; import java.time.Duration; import java.time.Instant; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class ReadySystem { diff --git a/src/main/java/dev/pgm/events/team/DefaultTeamManager.java b/src/main/java/dev/pgm/events/team/DefaultTeamManager.java index 781bf36..1005538 100644 --- a/src/main/java/dev/pgm/events/team/DefaultTeamManager.java +++ b/src/main/java/dev/pgm/events/team/DefaultTeamManager.java @@ -9,7 +9,7 @@ import java.util.Optional; import java.util.UUID; import org.bukkit.ChatColor; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import tc.oc.pgm.api.party.Competitor; import tc.oc.pgm.api.party.Party; import tc.oc.pgm.api.player.MatchPlayer; diff --git a/src/main/java/dev/pgm/events/utils/Components.java b/src/main/java/dev/pgm/events/utils/Components.java index 63aa8d2..d8f8097 100644 --- a/src/main/java/dev/pgm/events/utils/Components.java +++ b/src/main/java/dev/pgm/events/utils/Components.java @@ -25,9 +25,8 @@ public static Component command(Style style, String command, String... cmdArgs) return Component.text(command, style) .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, command)) - .hoverEvent( - Component.text("Click to run ", NamedTextColor.GREEN) - .append(Component.text(command, style))); + .hoverEvent(Component.text("Click to run ", NamedTextColor.GREEN) + .append(Component.text(command, style))); } private static String toArgument(String input) { diff --git a/src/main/java/dev/pgm/events/utils/Response.java b/src/main/java/dev/pgm/events/utils/Response.java index e268912..8be3b7b 100644 --- a/src/main/java/dev/pgm/events/utils/Response.java +++ b/src/main/java/dev/pgm/events/utils/Response.java @@ -3,7 +3,7 @@ import static net.kyori.adventure.text.Component.text; import net.kyori.adventure.text.Component; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public class Response { diff --git a/src/main/java/dev/pgm/events/xml/RoundParser.java b/src/main/java/dev/pgm/events/xml/RoundParser.java index ea23595..3e18917 100644 --- a/src/main/java/dev/pgm/events/xml/RoundParser.java +++ b/src/main/java/dev/pgm/events/xml/RoundParser.java @@ -29,8 +29,8 @@ public static TournamentRound parse(TournamentFormat format, Element round) { case "result-from" -> ResultFromParser.parse(format, round); case "format" -> FormatParser.parse(format, round); case "veto-selector" -> new VetoSelectorRound(format, new VetoSelectorSettings()); - default -> throw new IllegalArgumentException( - "Round " + round.getName() + " is not supported!"); + default -> + throw new IllegalArgumentException("Round " + round.getName() + " is not supported!"); }; } From 76bacca04119eafc3a8a66db0d1c74c8c7d16fe1 Mon Sep 17 00:00:00 2001 From: "BT (calcastor/mame)" <43831917+calcastor@users.noreply.github.com> Date: Sun, 5 Apr 2026 11:55:45 -0700 Subject: [PATCH 2/4] More cleanup Signed-off-by: BT (calcastor/mame) <43831917+calcastor@users.noreply.github.com> --- .../dev/pgm/events/api/teams/ConfigTeams.java | 4 +-- .../dev/pgm/events/commands/VetoCommands.java | 9 ++---- .../java/dev/pgm/events/config/AppData.java | 2 +- .../dev/pgm/events/format/RoundHolder.java | 3 +- .../events/format/TournamentFormatImpl.java | 10 +------ .../format/rounds/RoundDescription.java | 8 +---- .../events/format/rounds/RoundSettings.java | 1 - .../format/rounds/format/FormatRound.java | 2 +- .../rounds/format/FormatRoundSettings.java | 3 +- .../rounds/format/FormatTournamentImpl.java | 4 +-- .../format/rounds/replay/ReplayRound.java | 5 ++-- .../rounds/resultfrom/ResultFromRound.java | 2 +- .../format/rounds/single/SingleRound.java | 4 +-- .../rounds/single/SingleRoundDescription.java | 2 +- .../format/rounds/veto/VetoController.java | 2 +- .../format/rounds/veto/VetoCountdown.java | 2 +- .../format/rounds/veto/VetoDescription.java | 2 +- .../events/format/rounds/veto/VetoRound.java | 4 +-- .../vetoselector/VetoSelectorRound.java | 2 +- .../format/score/TwoTeamFormattedScore.java | 10 +++++-- .../events/listeners/PlayerJoinListen.java | 2 +- .../dev/pgm/events/team/ColorTeamSetup.java | 2 +- .../java/dev/pgm/events/utils/JoinUtils.java | 3 +- .../pgm/events/xml/MapFormatXMLParser.java | 29 ++++++++++--------- .../java/dev/pgm/events/xml/RoundParser.java | 2 +- 25 files changed, 52 insertions(+), 67 deletions(-) diff --git a/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java b/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java index 706756b..45662f3 100644 --- a/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java +++ b/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java @@ -24,7 +24,7 @@ public List getTeams() { private static List parseTournamentTeams(File teamsFolder, File teamsFile) { if (!teamsFolder.exists()) teamsFolder.mkdirs(); - List teamList = new ArrayList(); + List teamList = new ArrayList<>(); for (File child : teamsFolder.listFiles((file) -> file.getName().toLowerCase().endsWith(".yml"))) { FileConfiguration config = YamlConfiguration.loadConfiguration(child); @@ -45,7 +45,7 @@ private static List parseTournamentTeams(File teamsFolder, File System.out.println("Invalid type in teams.yml (" + object.getClass().getName() + ": " - + object.toString() + + object + ")! Skipping..."); continue; } diff --git a/src/main/java/dev/pgm/events/commands/VetoCommands.java b/src/main/java/dev/pgm/events/commands/VetoCommands.java index 8539c00..0a6c219 100644 --- a/src/main/java/dev/pgm/events/commands/VetoCommands.java +++ b/src/main/java/dev/pgm/events/commands/VetoCommands.java @@ -22,23 +22,20 @@ public void veto( TournamentTeamManager teamManager, TournamentFormat format, @Argument("map") Integer option) { - if (format.currentRound() == null || !(format.currentRound() instanceof VetoRound)) + if (format.currentRound() == null || !(format.currentRound() instanceof VetoRound vetoRound)) throw new CommandException("Veto round is not currently running!"); - if (!(sender instanceof Player)) + if (!(sender instanceof Player player)) throw new CommandException("Only players can run this command!"); - Player player = (Player) sender; Optional team = teamManager.tournamentTeamPlayer((player).getUniqueId()); - if (!team.isPresent()) - throw new CommandException("Only players on teams can run this command!"); + if (team.isEmpty()) throw new CommandException("Only players on teams can run this command!"); if (!team.get().canVeto(player)) throw new CommandException("You are not registered as a vetoer for this team!"); try { int num = option - 1; - VetoRound vetoRound = (VetoRound) format.currentRound(); if (!vetoRound.validVetoNumber(num)) throw new CommandException("That is not a valid veto number: " + (num + 1)); diff --git a/src/main/java/dev/pgm/events/config/AppData.java b/src/main/java/dev/pgm/events/config/AppData.java index bcc29f3..b3e4966 100644 --- a/src/main/java/dev/pgm/events/config/AppData.java +++ b/src/main/java/dev/pgm/events/config/AppData.java @@ -5,7 +5,7 @@ /** * Config options used around the plugin. * - *

Values are are stored in the `resources/config.yml` file. + *

Values are stored in the `resources/config.yml` file. */ public class AppData { diff --git a/src/main/java/dev/pgm/events/format/RoundHolder.java b/src/main/java/dev/pgm/events/format/RoundHolder.java index 51259ea..601a526 100644 --- a/src/main/java/dev/pgm/events/format/RoundHolder.java +++ b/src/main/java/dev/pgm/events/format/RoundHolder.java @@ -44,8 +44,7 @@ public TournamentRound nextRound(Match match) { rounds.get(currentRound).cleanup(match); } currentRound++; - TournamentRound round = rounds.get(currentRound); - return round; + return rounds.get(currentRound); } public TournamentRound currentRound() { diff --git a/src/main/java/dev/pgm/events/format/TournamentFormatImpl.java b/src/main/java/dev/pgm/events/format/TournamentFormatImpl.java index 1c262a2..2331653 100644 --- a/src/main/java/dev/pgm/events/format/TournamentFormatImpl.java +++ b/src/main/java/dev/pgm/events/format/TournamentFormatImpl.java @@ -153,15 +153,7 @@ private void broadcastScore() { FormattedScore scores = roundHolder.scores(teamManager).formattedScore(teamManager); Bukkit.getScheduler() .scheduleSyncDelayedTask( - EventsPlugin.get(), - new Runnable() { - - @Override - public void run() { - Bukkit.broadcastMessage(scores.condensed()); - } - }, - 3 * 20); + EventsPlugin.get(), () -> Bukkit.broadcastMessage(scores.condensed()), 3 * 20); } public void onEnd(Match match, Optional winner) { diff --git a/src/main/java/dev/pgm/events/format/rounds/RoundDescription.java b/src/main/java/dev/pgm/events/format/rounds/RoundDescription.java index 07fc9ab..59dd6dc 100644 --- a/src/main/java/dev/pgm/events/format/rounds/RoundDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/RoundDescription.java @@ -7,15 +7,9 @@ public interface RoundDescription { /** * The main round info, also contains hover information for scores in match, time and stuff like * that - * - * @return */ BaseComponent roundInfo(); - /** - * Small bit of info of current state of the round - * - * @return - */ + /** Small bit of info of current state of the round */ String roundStatus(); } diff --git a/src/main/java/dev/pgm/events/format/rounds/RoundSettings.java b/src/main/java/dev/pgm/events/format/rounds/RoundSettings.java index c937b3a..f6e8742 100644 --- a/src/main/java/dev/pgm/events/format/rounds/RoundSettings.java +++ b/src/main/java/dev/pgm/events/format/rounds/RoundSettings.java @@ -34,7 +34,6 @@ public boolean showInHistory() { * * @param format the tournament format * @param id the id of the new round to be created - * @return */ public abstract TournamentRound newRound(TournamentFormat format, String id); } diff --git a/src/main/java/dev/pgm/events/format/rounds/format/FormatRound.java b/src/main/java/dev/pgm/events/format/rounds/format/FormatRound.java index 0a56d93..9275a09 100644 --- a/src/main/java/dev/pgm/events/format/rounds/format/FormatRound.java +++ b/src/main/java/dev/pgm/events/format/rounds/format/FormatRound.java @@ -57,7 +57,7 @@ public void cleanup(Match match) { @Override public Map scores() { - Map scores = new HashMap(); + Map scores = new HashMap<>(); if (winner != null) scores.put(winner, 1); return scores; diff --git a/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundSettings.java b/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundSettings.java index 668e39d..26bf220 100644 --- a/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundSettings.java +++ b/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundSettings.java @@ -38,7 +38,6 @@ public TournamentRound newRound(TournamentFormat format) { @Override public TournamentRound newRound(TournamentFormat format, String id) { - return new FormatRoundSettings(id, name, new ArrayList(rounds), bestOf) - .newRound(format); + return new FormatRoundSettings(id, name, new ArrayList<>(rounds), bestOf).newRound(format); } } diff --git a/src/main/java/dev/pgm/events/format/rounds/format/FormatTournamentImpl.java b/src/main/java/dev/pgm/events/format/rounds/format/FormatTournamentImpl.java index f19d765..504a4d0 100644 --- a/src/main/java/dev/pgm/events/format/rounds/format/FormatTournamentImpl.java +++ b/src/main/java/dev/pgm/events/format/rounds/format/FormatTournamentImpl.java @@ -12,7 +12,7 @@ public class FormatTournamentImpl extends TournamentFormatImpl { - private FormatRound formatRound; + private final FormatRound formatRound; public FormatTournamentImpl( TournamentTeamManager teamManager, RoundReferenceHolder references, FormatRound formatRound) { @@ -32,7 +32,7 @@ public FormatTournamentImpl( @Override public void onEnd(Match match, Optional winner) { - formatRound.setWinner(match, winner.isPresent() ? winner.get() : null); + formatRound.setWinner(match, winner.orElse(null)); } public FormatRound getFormatRound() { diff --git a/src/main/java/dev/pgm/events/format/rounds/replay/ReplayRound.java b/src/main/java/dev/pgm/events/format/rounds/replay/ReplayRound.java index a62cd26..2f9fd45 100644 --- a/src/main/java/dev/pgm/events/format/rounds/replay/ReplayRound.java +++ b/src/main/java/dev/pgm/events/format/rounds/replay/ReplayRound.java @@ -8,7 +8,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; import tc.oc.pgm.api.match.Match; public class ReplayRound extends AbstractRound { @@ -34,12 +33,12 @@ public void start(Match match) { .filter(Optional::isPresent) .map(Optional::get) .filter(this::tiedRound) - .collect(Collectors.toList()); + .toList(); if (rounds.size() == 1) { // 1 round has been tied, therefore play it isReplaying = true; - TournamentRound toReplay = rounds.get(0); + TournamentRound toReplay = rounds.getFirst(); tournament().addRoundAfterCurrent(toReplay.settings(), settings().futureID()); } diff --git a/src/main/java/dev/pgm/events/format/rounds/resultfrom/ResultFromRound.java b/src/main/java/dev/pgm/events/format/rounds/resultfrom/ResultFromRound.java index 108b400..12e45bb 100644 --- a/src/main/java/dev/pgm/events/format/rounds/resultfrom/ResultFromRound.java +++ b/src/main/java/dev/pgm/events/format/rounds/resultfrom/ResultFromRound.java @@ -10,7 +10,7 @@ public class ResultFromRound extends AbstractRound { - private TournamentFormat format; + private final TournamentFormat format; public ResultFromRound(TournamentFormat format, ResultFromSettings settings) { super(format, settings); diff --git a/src/main/java/dev/pgm/events/format/rounds/single/SingleRound.java b/src/main/java/dev/pgm/events/format/rounds/single/SingleRound.java index 33b1281..89ead8f 100644 --- a/src/main/java/dev/pgm/events/format/rounds/single/SingleRound.java +++ b/src/main/java/dev/pgm/events/format/rounds/single/SingleRound.java @@ -24,8 +24,8 @@ public class SingleRound extends AbstractRound { private final Map scoreMap; - private String fullMapName = ""; - private RoundDescription roundDescription; + private final String fullMapName; + private final RoundDescription roundDescription; private RoundPhase roundPhase; public SingleRound(TournamentFormat format, SingleRoundOptions options) { diff --git a/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java b/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java index 6cd5e91..9b7d0f2 100644 --- a/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java @@ -41,7 +41,7 @@ public BaseComponent roundInfo() { private String winnersString() { Collection teams = singleRound.scores().keySet(); - if (teams.size() == 0) { + if (teams.isEmpty()) { // draw return drawString(); } diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java index aff89a2..d258b65 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java @@ -122,7 +122,7 @@ private void chooseFirst(VetoOption option, TournamentTeam selectingTeam) { if (round instanceof VetoRound) ((VetoRound) round).setSelectingTeam(selectingTeam); else if (round instanceof FormatRound) ((FormatRound) round).setSelectingTeam(selectingTeam); - toPlay.add(0, round); + toPlay.addFirst(round); } } diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java index 540b15d..8b82f88 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java @@ -48,7 +48,7 @@ public void onStart(Duration remaining, Duration total) { private void announceRemaining() { Optional teamOpt = controller.picking(); - if (!teamOpt.isPresent()) return; + if (teamOpt.isEmpty()) return; TournamentTeam team = teamOpt.get(); team.sendMessage(vetoRound.describe().optionsHeader(controller.currentType())); diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java index 0932624..246af08 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java @@ -57,7 +57,7 @@ private BaseComponent[] formattedVetosSoFar() { messages[i] = new TextComponent(fromHistory(i, true, history.get(i))); } - if (history.size() > 0) { + if (!history.isEmpty()) { // add last line with no new line after messages[vetoCount - 1] = new TextComponent(fromHistory(vetoCount - 1, false, history.get(vetoCount - 1))); diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java index daec460..dae427d 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java @@ -100,7 +100,7 @@ private void endVeto(Match match) { private void cycleVeto(Match match) { // cycle to next veto Optional picking = picking(); - if (!picking.isPresent()) { + if (picking.isEmpty()) { tryAutoVeto(match); return; } @@ -134,7 +134,7 @@ public boolean validVetoNumber(int number) { public void randomVeto(Match match) { Optional picking = picking(); - if (!picking.isPresent()) { + if (picking.isEmpty()) { tryAutoVeto(match); return; } diff --git a/src/main/java/dev/pgm/events/format/rounds/vetoselector/VetoSelectorRound.java b/src/main/java/dev/pgm/events/format/rounds/vetoselector/VetoSelectorRound.java index 7bfd4ab..a6d170b 100644 --- a/src/main/java/dev/pgm/events/format/rounds/vetoselector/VetoSelectorRound.java +++ b/src/main/java/dev/pgm/events/format/rounds/vetoselector/VetoSelectorRound.java @@ -30,7 +30,7 @@ public void start(Match match) { @Override public Map scores() { - Map scores = new HashMap(); + Map scores = new HashMap<>(); if (selectingTeam != null) scores.put(selectingTeam, 1); return scores; diff --git a/src/main/java/dev/pgm/events/format/score/TwoTeamFormattedScore.java b/src/main/java/dev/pgm/events/format/score/TwoTeamFormattedScore.java index c61f1e2..6b49f86 100644 --- a/src/main/java/dev/pgm/events/format/score/TwoTeamFormattedScore.java +++ b/src/main/java/dev/pgm/events/format/score/TwoTeamFormattedScore.java @@ -33,8 +33,12 @@ public String topLine() { } private String addPadding(String target, String otherString) { - if (target.length() < otherString.length()) - for (int i = 0; i < otherString.length() - target.length(); i++) target = " " + target; + if (target.length() < otherString.length()) { + StringBuilder targetBuilder = new StringBuilder(target); + for (int i = 0; i < otherString.length() - targetBuilder.length(); i++) + targetBuilder.insert(0, " "); + target = targetBuilder.toString(); + } return target; } @@ -62,7 +66,7 @@ public String condensed() { return teamManager.formattedName(topTwo.first.team()) + " " + ChatColor.WHITE - + +topTwo.first.score() + + topTwo.first.score() + ChatColor.GRAY + " - " + ChatColor.WHITE diff --git a/src/main/java/dev/pgm/events/listeners/PlayerJoinListen.java b/src/main/java/dev/pgm/events/listeners/PlayerJoinListen.java index 472009d..7862c4e 100644 --- a/src/main/java/dev/pgm/events/listeners/PlayerJoinListen.java +++ b/src/main/java/dev/pgm/events/listeners/PlayerJoinListen.java @@ -82,7 +82,7 @@ public void beforeLogin(PlayerLoginEvent event) { public void vanish(PlayerJoinEvent event) { if (!event.getPlayer().isOp() && event.getPlayer().hasPermission("events.spectate.vanish") - && !manager.playerTeam(event.getPlayer().getUniqueId()).isPresent()) + && manager.playerTeam(event.getPlayer().getUniqueId()).isEmpty()) Integration.setVanished(PGM.get().getMatchManager().getPlayer(event.getPlayer()), true, true); } diff --git a/src/main/java/dev/pgm/events/team/ColorTeamSetup.java b/src/main/java/dev/pgm/events/team/ColorTeamSetup.java index 11ef38d..67f7643 100644 --- a/src/main/java/dev/pgm/events/team/ColorTeamSetup.java +++ b/src/main/java/dev/pgm/events/team/ColorTeamSetup.java @@ -63,7 +63,7 @@ private void assignTeams(Collection teams) { continue; } - // no team with that colour, time to do a bit of soul searching and add the team to the cool + // no team with that colour, time to do a bit of soul-searching and add the team to the cool // list unassignedTeams.add(team); } diff --git a/src/main/java/dev/pgm/events/utils/JoinUtils.java b/src/main/java/dev/pgm/events/utils/JoinUtils.java index eff270c..6565502 100644 --- a/src/main/java/dev/pgm/events/utils/JoinUtils.java +++ b/src/main/java/dev/pgm/events/utils/JoinUtils.java @@ -18,8 +18,7 @@ public static Response canJoin(UUID uuid, Party party) { } public static boolean isPartyFull(Party party) { - if (party instanceof Team) { - Team team = (Team) party; + if (party instanceof Team team) { return team.getSize() >= team.getMaxPlayers(); } return false; diff --git a/src/main/java/dev/pgm/events/xml/MapFormatXMLParser.java b/src/main/java/dev/pgm/events/xml/MapFormatXMLParser.java index a051106..658f851 100644 --- a/src/main/java/dev/pgm/events/xml/MapFormatXMLParser.java +++ b/src/main/java/dev/pgm/events/xml/MapFormatXMLParser.java @@ -9,6 +9,7 @@ import java.io.File; import java.io.IOException; import java.time.Duration; +import org.jspecify.annotations.NonNull; import tc.oc.pgm.lib.org.jdom2.Document; import tc.oc.pgm.lib.org.jdom2.Element; import tc.oc.pgm.lib.org.jdom2.JDOMException; @@ -19,14 +20,12 @@ public class MapFormatXMLParser { public static TournamentFormat parse(String name) { File poolsFolder = new File(EventsPlugin.get().getDataFolder(), "formats"); File xmlFile = new File(poolsFolder, name + ".xml"); - Document document = null; + Document document; try { document = new SAXBuilder().build(xmlFile); Element root = document.getRootElement(); return parse(root); - } catch (JDOMException e) { - e.printStackTrace(); - } catch (IOException e) { + } catch (JDOMException | IOException e) { e.printStackTrace(); } return null; @@ -34,6 +33,18 @@ public static TournamentFormat parse(String name) { public static TournamentFormat parse(Element root) throws JDOMException { String bestOfArgs = root.getAttributeValue("best-of"); + TournamentFormat format = getTournamentFormat(bestOfArgs); + + if (!root.getName().equalsIgnoreCase("format")) + System.out.println( + "Expecting root element to be format. Got " + root.getName() + " instead!"); + + for (Element round : root.getChildren()) format.addRound(RoundParser.parse(format, round)); + + return format; + } + + private static @NonNull TournamentFormat getTournamentFormat(String bestOfArgs) { if (bestOfArgs == null) throw new IllegalArgumentException("No best-of specified on format!"); int bestOf = Integer.parseInt(bestOfArgs); @@ -45,15 +56,7 @@ public static TournamentFormat parse(Element root) throws JDOMException { Duration.ofSeconds(30), Duration.ofSeconds(40), new BestOfCalculation<>(bestOf)); - TournamentFormat format = new TournamentFormatImpl( + return new TournamentFormatImpl( EventsPlugin.get().getTeamManager(), options, new RoundReferenceHolder()); - - if (!root.getName().toLowerCase().equals("format")) - System.out.println( - "Expecting root element to be format. Got " + root.getName() + " instead!"); - - for (Element round : root.getChildren()) format.addRound(RoundParser.parse(format, round)); - - return format; } } diff --git a/src/main/java/dev/pgm/events/xml/RoundParser.java b/src/main/java/dev/pgm/events/xml/RoundParser.java index 3e18917..ce67810 100644 --- a/src/main/java/dev/pgm/events/xml/RoundParser.java +++ b/src/main/java/dev/pgm/events/xml/RoundParser.java @@ -77,7 +77,7 @@ public static VetoRound parse(TournamentFormat format, Element element) { private static List constructVetoList(Element element, int numOptions) { ArrayList vetos = new ArrayList(); - if (element.getChildren().size() == 0) { + if (element.getChildren().isEmpty()) { int until = Integer.parseInt(element.getAttributeValue("ban-until", "1")); int startingTeam = Integer.parseInt(element.getAttributeValue("starting-team", "2")); int numTeams = Integer.parseInt(element.getAttributeValue("teams", "2")); From b629f510a18d78f94324691455559e8ac8db95ed Mon Sep 17 00:00:00 2001 From: "BT (calcastor/mame)" <43831917+calcastor@users.noreply.github.com> Date: Sun, 5 Apr 2026 12:31:34 -0700 Subject: [PATCH 3/4] Adventure Signed-off-by: BT (calcastor/mame) <43831917+calcastor@users.noreply.github.com> --- .../buildlogic.java-conventions.gradle.kts | 13 +- .../events/api/teams/DefaultTeamRegistry.java | 7 +- .../commands/TournamentAdminCommands.java | 44 +++--- .../commands/TournamentUserCommands.java | 29 ++-- .../events/format/TournamentFormatImpl.java | 15 +- .../format/rounds/RoundDescription.java | 4 +- .../format/rounds/SimpleRoundDescription.java | 8 +- .../rounds/format/FormatRoundDescription.java | 27 ++-- .../reference/ReferenceDescription.java | 7 +- .../rounds/replay/ReplayDescription.java | 22 +-- .../resultfrom/ResultFromDescription.java | 7 +- .../rounds/single/SingleRoundDescription.java | 56 +++---- .../format/rounds/veto/VetoCountdown.java | 3 +- .../format/rounds/veto/VetoDescription.java | 144 +++++++----------- .../events/format/rounds/veto/VetoRound.java | 24 +-- .../vetoselector/VetoSelectorDescription.java | 10 +- .../events/format/score/FormattedScore.java | 8 +- .../format/score/TwoTeamFormattedScore.java | 68 ++++----- .../dev/pgm/events/team/ColorTeamSetup.java | 22 +-- .../pgm/events/team/DefaultTeamManager.java | 9 +- .../java/dev/pgm/events/team/TeamSetup.java | 4 +- .../dev/pgm/events/team/TournamentTeam.java | 13 +- .../events/team/TournamentTeamManager.java | 11 +- 23 files changed, 259 insertions(+), 296 deletions(-) diff --git a/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts index c6b3d83..6e16871 100644 --- a/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts @@ -15,18 +15,21 @@ repositories { mavenCentral() maven("https://oss.sonatype.org/content/repositories/snapshots/") // Snapshots maven("https://repo.pgm.fyi/snapshots/") // PGM-specific dependencies - maven("https://repo.papermc.io/repository/maven-public/") // Needed for bungeecord-chat + maven("https://repo.papermc.io/repository/maven-public/") } dependencies { + // Annotations api("org.jspecify:jspecify:1.0.0") + compileOnly("org.jetbrains:annotations:26.1.0") + compileOnly("org.incendo:cloud-annotations:2.0.0") - compileOnly("net.md-5:bungeecord-chat:1.20-R0.2-deprecated+build.18") + // Provided dependencies compileOnly("dev.pgm.paper:paper-api:1.8_1.21.11-SNAPSHOT") - compileOnly("tc.oc.pgm:core:0.16-SNAPSHOT") - compileOnly("org.incendo:cloud-annotations:2.0.0") - compileOnly("org.jetbrains:annotations:26.1.0") + compileOnly("tc.oc.pgm:core:0.16-SNAPSHOT") { isTransitive = false } + compileOnly("net.kyori:adventure-api:4.26.1") + compileOnly("com.google.guava:guava:17.0") } group = "dev.pgm" diff --git a/src/main/java/dev/pgm/events/api/teams/DefaultTeamRegistry.java b/src/main/java/dev/pgm/events/api/teams/DefaultTeamRegistry.java index 68f1955..0052ec0 100644 --- a/src/main/java/dev/pgm/events/api/teams/DefaultTeamRegistry.java +++ b/src/main/java/dev/pgm/events/api/teams/DefaultTeamRegistry.java @@ -6,8 +6,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; +import tc.oc.pgm.util.Audience; import tc.oc.pgm.util.StringUtils; public class DefaultTeamRegistry implements TournamentTeamRegistry { @@ -53,7 +55,8 @@ public void reload() { teams.forEach(x -> teamMap.put(x.getName(), x)); Bukkit.getOnlinePlayers().stream() .filter(x -> x.hasPermission("events.staff")) - .forEach(x -> x.sendMessage(ChatColor.AQUA + "Teams reloaded!")); + .forEach(x -> Audience.get(x) + .sendMessage(Component.text("Teams reloaded!", NamedTextColor.AQUA))); }); }); } diff --git a/src/main/java/dev/pgm/events/commands/TournamentAdminCommands.java b/src/main/java/dev/pgm/events/commands/TournamentAdminCommands.java index 1df8359..4b52df5 100644 --- a/src/main/java/dev/pgm/events/commands/TournamentAdminCommands.java +++ b/src/main/java/dev/pgm/events/commands/TournamentAdminCommands.java @@ -6,8 +6,9 @@ import dev.pgm.events.team.TournamentTeam; import dev.pgm.events.team.TournamentTeamManager; import dev.pgm.events.xml.MapFormatXMLParser; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -21,6 +22,7 @@ import tc.oc.pgm.lib.org.incendo.cloud.annotations.Command; import tc.oc.pgm.lib.org.incendo.cloud.annotations.CommandDescription; import tc.oc.pgm.lib.org.incendo.cloud.annotations.Permission; +import tc.oc.pgm.util.Audience; @Command("tourney|tournament|tm|events") public class TournamentAdminCommands { @@ -34,7 +36,7 @@ public void tourney( Match match, @Argument("format") @Greedy String pool) { manager.createTournament(match, MapFormatXMLParser.parse(pool)); - sender.sendMessage(ChatColor.GOLD + "Starting tournament."); + Audience.get(sender).sendMessage(Component.text("Starting tournament.", NamedTextColor.GOLD)); } @Command("register ") @@ -59,22 +61,23 @@ public void register( } teamManager.addTeam(team); - sender.sendMessage(ChatColor.YELLOW + "Added team " + team.getName() + "!"); + Audience.get(sender) + .sendMessage(Component.text("Added team " + team.getName() + "!", NamedTextColor.YELLOW)); } @Command("list") @CommandDescription("List all loaded teams") @Permission("events.staff") public void list(CommandSender sender, TournamentTeamRegistry registry) { - sender.sendMessage(ChatColor.GOLD - + "------- " - + ChatColor.AQUA - + "Registered Teams" - + ChatColor.GOLD - + " -------"); + Audience audience = Audience.get(sender); + audience.sendMessage(Component.text("------- ", NamedTextColor.GOLD) + .append(Component.text("Registered Teams", NamedTextColor.AQUA)) + .append(Component.text(" -------", NamedTextColor.GOLD))); for (TournamentTeam team : registry.getTeams()) - sender.sendMessage(ChatColor.AQUA + "- " + team.getName()); - sender.sendMessage(ChatColor.YELLOW + "Run /tourney info to see player roster!"); + audience.sendMessage( + Component.text("- ", NamedTextColor.AQUA).append(Component.text(team.getName()))); + audience.sendMessage( + Component.text("Run /tourney info to see player roster!", NamedTextColor.YELLOW)); } @Command("info ") @@ -87,19 +90,17 @@ public void info( TournamentTeam team = registry.getTeam(name); if (team == null) throw new CommandException("Team not found!"); - sender.sendMessage(ChatColor.GOLD - + "------- " - + ChatColor.AQUA - + team.getName() - + ChatColor.GOLD - + " -------"); + Audience audience = Audience.get(sender); + audience.sendMessage(Component.text("------- ", NamedTextColor.GOLD) + .append(Component.text(team.getName(), NamedTextColor.AQUA)) + .append(Component.text(" -------", NamedTextColor.GOLD))); for (TournamentPlayer player : team.getPlayers()) { - String playerName = - player.getUUID().toString() + ChatColor.GRAY + " (player hasn't logged on)"; + String playerName = player.getUUID().toString() + " (player hasn't logged on)"; OfflinePlayer offline = Bukkit.getOfflinePlayer(player.getUUID()); if (offline.getName() != null) playerName = offline.getName(); - sender.sendMessage(ChatColor.AQUA + "- " + playerName); + audience.sendMessage( + Component.text("- ", NamedTextColor.AQUA).append(Component.text(playerName))); } } @@ -108,6 +109,7 @@ public void info( @Permission("events.staff") public void clear(CommandSender sender, TournamentTeamManager teamManager) { teamManager.clear(); - sender.sendMessage(ChatColor.YELLOW + "Unregistered all teams!"); + Audience.get(sender) + .sendMessage(Component.text("Unregistered all teams!", NamedTextColor.YELLOW)); } } diff --git a/src/main/java/dev/pgm/events/commands/TournamentUserCommands.java b/src/main/java/dev/pgm/events/commands/TournamentUserCommands.java index 1cfa160..7d2064e 100644 --- a/src/main/java/dev/pgm/events/commands/TournamentUserCommands.java +++ b/src/main/java/dev/pgm/events/commands/TournamentUserCommands.java @@ -5,11 +5,12 @@ import dev.pgm.events.format.rounds.RoundDescription; import dev.pgm.events.format.rounds.format.FormatTournamentImpl; import java.util.Optional; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.ChatColor; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.CommandSender; import tc.oc.pgm.lib.org.incendo.cloud.annotations.Command; import tc.oc.pgm.lib.org.incendo.cloud.annotations.CommandDescription; +import tc.oc.pgm.util.Audience; @Command("tourney|tournament|tm|events") public class TournamentUserCommands { @@ -17,20 +18,22 @@ public class TournamentUserCommands { @Command("score") @CommandDescription("Shows the current score in the tournament") public void currentScore(CommandSender sender, TournamentFormat format) { + Audience audience = Audience.get(sender); if (format instanceof FormatTournamentImpl) { String formatName = ((FormatTournamentImpl) format).getFormatRound().settings().name(); - sender.sendMessage(ChatColor.YELLOW + "For " + formatName + ":"); - sender.sendMessage(format.currentScore().condensed()); + audience.sendMessage(Component.text("For " + formatName + ":", NamedTextColor.YELLOW)); + audience.sendMessage(format.currentScore().condensed()); Optional parentOptional = EventsPlugin.get().getTournamentManager().currentTournament(); if (parentOptional.isPresent()) { - sender.sendMessage(ChatColor.YELLOW + "Overall score (excluding " + formatName + "):"); - sender.sendMessage(parentOptional.get().currentScore().condensed()); + audience.sendMessage( + Component.text("Overall score (excluding " + formatName + "):", NamedTextColor.YELLOW)); + audience.sendMessage(parentOptional.get().currentScore().condensed()); } } else { - sender.sendMessage(format.currentScore().condensed()); + audience.sendMessage(format.currentScore().condensed()); } } @@ -42,13 +45,15 @@ public void rounds(CommandSender sender, TournamentFormat format) { header += " (" + ((FormatTournamentImpl) format).getFormatRound().settings().name() + ")"; - sender.sendMessage( - ChatColor.GOLD + "------- " + ChatColor.AQUA + header + ChatColor.GOLD + " -------"); + Audience audience = Audience.get(sender); + audience.sendMessage(Component.text("------- ", NamedTextColor.GOLD) + .append(Component.text(header, NamedTextColor.AQUA)) + .append(Component.text(" -------", NamedTextColor.GOLD))); + int round = 1; for (RoundDescription roundDescription : format.roundsInformation()) { - String roundString = ChatColor.GOLD + Integer.toString(round) + ". "; - TextComponent roundPart = new TextComponent(roundString); - sender.sendMessage(roundPart, roundDescription.roundInfo()); + audience.sendMessage( + Component.text(round + ". ", NamedTextColor.GOLD).append(roundDescription.roundInfo())); round++; } } diff --git a/src/main/java/dev/pgm/events/format/TournamentFormatImpl.java b/src/main/java/dev/pgm/events/format/TournamentFormatImpl.java index 2331653..fc5bd31 100644 --- a/src/main/java/dev/pgm/events/format/TournamentFormatImpl.java +++ b/src/main/java/dev/pgm/events/format/TournamentFormatImpl.java @@ -13,13 +13,15 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import tc.oc.pgm.api.PGM; import tc.oc.pgm.api.match.Match; +import tc.oc.pgm.util.Audience; import tc.oc.pgm.util.bukkit.Events; public class TournamentFormatImpl implements TournamentFormat { @@ -153,16 +155,19 @@ private void broadcastScore() { FormattedScore scores = roundHolder.scores(teamManager).formattedScore(teamManager); Bukkit.getScheduler() .scheduleSyncDelayedTask( - EventsPlugin.get(), () -> Bukkit.broadcastMessage(scores.condensed()), 3 * 20); + EventsPlugin.get(), + () -> Audience.PROVIDER.players().sendMessage(scores.condensed()), + 3 * 20); } public void onEnd(Match match, Optional winner) { if (tournamentRoundOptions.shouldAnnounceWinner()) { if (winner.isPresent()) { - Bukkit.broadcastMessage( - teamManager.formattedName(winner.get()) + ChatColor.GOLD + " wins this round!"); + match.sendMessage(teamManager + .formattedName(winner.get()) + .append(Component.text(" wins this round!", NamedTextColor.GOLD))); } else { - Bukkit.broadcastMessage(ChatColor.GRAY + "This round has ended in a draw!"); + match.sendMessage(Component.text("This round has ended in a draw!", NamedTextColor.GRAY)); } } diff --git a/src/main/java/dev/pgm/events/format/rounds/RoundDescription.java b/src/main/java/dev/pgm/events/format/rounds/RoundDescription.java index 59dd6dc..748c26b 100644 --- a/src/main/java/dev/pgm/events/format/rounds/RoundDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/RoundDescription.java @@ -1,6 +1,6 @@ package dev.pgm.events.format.rounds; -import net.md_5.bungee.api.chat.BaseComponent; +import net.kyori.adventure.text.Component; public interface RoundDescription { @@ -8,7 +8,7 @@ public interface RoundDescription { * The main round info, also contains hover information for scores in match, time and stuff like * that */ - BaseComponent roundInfo(); + Component roundInfo(); /** Small bit of info of current state of the round */ String roundStatus(); diff --git a/src/main/java/dev/pgm/events/format/rounds/SimpleRoundDescription.java b/src/main/java/dev/pgm/events/format/rounds/SimpleRoundDescription.java index 7897e12..d928f31 100644 --- a/src/main/java/dev/pgm/events/format/rounds/SimpleRoundDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/SimpleRoundDescription.java @@ -1,19 +1,19 @@ package dev.pgm.events.format.rounds; -import net.md_5.bungee.api.chat.BaseComponent; +import net.kyori.adventure.text.Component; public class SimpleRoundDescription implements RoundDescription { private final String status; - private final BaseComponent roundInfo; + private final Component roundInfo; - public SimpleRoundDescription(String status, BaseComponent roundInfo) { + public SimpleRoundDescription(String status, Component roundInfo) { this.status = status; this.roundInfo = roundInfo; } @Override - public BaseComponent roundInfo() { + public Component roundInfo() { return roundInfo; } diff --git a/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundDescription.java b/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundDescription.java index 7535c59..548cba2 100644 --- a/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundDescription.java @@ -1,10 +1,9 @@ package dev.pgm.events.format.rounds.format; import dev.pgm.events.format.rounds.RoundDescription; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; public class FormatRoundDescription implements RoundDescription { @@ -15,19 +14,15 @@ public FormatRoundDescription(FormatRound formatRound) { } @Override - public BaseComponent roundInfo() { - TextComponent component = new TextComponent( + public Component roundInfo() { + Component base = Component.text( formatRound.settings().name() + " - Best of " + formatRound.settings().bestOf()); - if (formatRound.formatTournament() != null) - component.setHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - new BaseComponent[] {new TextComponent(formatRound.formattedScore().condensed())})); - else - component.setHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - new BaseComponent[] {new TextComponent(ChatColor.YELLOW + "Loading...")})); - - return component; + if (formatRound.formatTournament() != null) { + return base.hoverEvent(HoverEvent.showText(formatRound.formattedScore().condensed())); + } else { + return base.hoverEvent( + HoverEvent.showText(Component.text("Loading...", NamedTextColor.YELLOW))); + } } @Override diff --git a/src/main/java/dev/pgm/events/format/rounds/reference/ReferenceDescription.java b/src/main/java/dev/pgm/events/format/rounds/reference/ReferenceDescription.java index 99f1152..3777960 100644 --- a/src/main/java/dev/pgm/events/format/rounds/reference/ReferenceDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/reference/ReferenceDescription.java @@ -1,8 +1,7 @@ package dev.pgm.events.format.rounds.reference; import dev.pgm.events.format.rounds.RoundDescription; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; +import net.kyori.adventure.text.Component; public class ReferenceDescription implements RoundDescription { @@ -13,8 +12,8 @@ public ReferenceDescription(ReferenceRound referenceRound) { } @Override - public BaseComponent roundInfo() { - return new TextComponent( + public Component roundInfo() { + return Component.text( "Reference round -> referencing: " + referenceRound.settings().targetID()); } diff --git a/src/main/java/dev/pgm/events/format/rounds/replay/ReplayDescription.java b/src/main/java/dev/pgm/events/format/rounds/replay/ReplayDescription.java index 5f30bca..3d265a4 100644 --- a/src/main/java/dev/pgm/events/format/rounds/replay/ReplayDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/replay/ReplayDescription.java @@ -2,9 +2,9 @@ import dev.pgm.events.format.rounds.RoundDescription; import dev.pgm.events.format.rounds.RoundPhase; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; public class ReplayDescription implements RoundDescription { @@ -15,15 +15,17 @@ public ReplayDescription(ReplayRound round) { } @Override - public BaseComponent roundInfo() { - if (round.phase() != RoundPhase.FINISHED) // haven't yet decided if we're gonna play if here - return new TextComponent(ChatColor.GRAY + "Replay tied round"); + public Component roundInfo() { + // haven't yet decided if we're gonna play if here + if (round.phase() != RoundPhase.FINISHED) + return Component.text("Replay tied round", NamedTextColor.GRAY); - if (round.shouldShowInHistory()) // not gonna replay - return new TextComponent( - "" + ChatColor.GRAY + ChatColor.STRIKETHROUGH + "Not replaying a round"); + // not gonna replay + if (round.shouldShowInHistory()) + return Component.text("Not replaying a round", NamedTextColor.GRAY) + .decorate(TextDecoration.STRIKETHROUGH); - return new TextComponent("Error replaying a round"); + return Component.text("Error replaying a round"); } @Override diff --git a/src/main/java/dev/pgm/events/format/rounds/resultfrom/ResultFromDescription.java b/src/main/java/dev/pgm/events/format/rounds/resultfrom/ResultFromDescription.java index 8c8a7b2..6efb467 100644 --- a/src/main/java/dev/pgm/events/format/rounds/resultfrom/ResultFromDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/resultfrom/ResultFromDescription.java @@ -1,8 +1,7 @@ package dev.pgm.events.format.rounds.resultfrom; import dev.pgm.events.format.rounds.RoundDescription; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; +import net.kyori.adventure.text.Component; public class ResultFromDescription implements RoundDescription { @@ -13,8 +12,8 @@ public ResultFromDescription(ResultFromRound resultFromRound) { } @Override - public BaseComponent roundInfo() { - return new TextComponent( + public Component roundInfo() { + return Component.text( "ResultFrom round -> using result from: " + resultFromRound.settings().targetID()); } diff --git a/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java b/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java index 9b7d0f2..43410f6 100644 --- a/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java @@ -4,10 +4,9 @@ import dev.pgm.events.format.rounds.RoundDescription; import dev.pgm.events.team.TournamentTeam; import java.util.Collection; -import java.util.stream.Collectors; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; +import java.util.List; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; public class SingleRoundDescription implements RoundDescription { @@ -15,47 +14,42 @@ public class SingleRoundDescription implements RoundDescription { private final SingleRound singleRound; private final TournamentFormat format; - private final String defString; - public SingleRoundDescription(String mapName, SingleRound singleRound, TournamentFormat format) { this.mapName = mapName; this.singleRound = singleRound; this.format = format; - this.defString = ChatColor.GRAY + "Match on " + ChatColor.GOLD + this.mapName + ChatColor.AQUA; } @Override - public BaseComponent roundInfo() { - switch (singleRound.phase()) { - case UNLOADED: - return new TextComponent(defString); - case WAITING: - return new TextComponent(defString + " - " + ChatColor.GRAY + "Waiting"); - case RUNNING: - return new TextComponent(defString + " - " + ChatColor.GREEN + "Running"); - case FINISHED: - return new TextComponent(defString + " - " + winnersString()); - } - return new TextComponent("NULL"); + public Component roundInfo() { + Component base = Component.text("Match on ", NamedTextColor.GRAY) + .append(Component.text(mapName, NamedTextColor.GOLD)); + return switch (singleRound.phase()) { + case UNLOADED -> base; + case WAITING -> base.append(Component.text(" - Waiting", NamedTextColor.GRAY)); + case RUNNING -> + base.append(Component.text(" - ", NamedTextColor.GRAY)) + .append(Component.text("Running", NamedTextColor.GREEN)); + case FINISHED -> + base.append(Component.text(" - ", NamedTextColor.GRAY)).append(winnersComponent()); + }; } - private String winnersString() { + private Component winnersComponent() { Collection teams = singleRound.scores().keySet(); if (teams.isEmpty()) { - // draw - return drawString(); + return Component.text("Draw", NamedTextColor.GRAY); } - String teamString = teams.stream() - .map(x -> format.teamManager().formattedName(x)) - .collect(Collectors.joining(ChatColor.GRAY + ", ")); + List teamNames = + teams.stream().map(x -> format.teamManager().formattedName(x)).toList(); - teamString += " won"; - return teamString; - } - - private String drawString() { - return ChatColor.GRAY + "Draw"; + Component result = Component.empty(); + for (int i = 0; i < teamNames.size(); i++) { + if (i > 0) result = result.append(Component.text(", ", NamedTextColor.GRAY)); + result = result.append(teamNames.get(i)); + } + return result.append(Component.text(" won")); } @Override diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java index 8b82f88..3c01077 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java @@ -6,7 +6,6 @@ import java.time.Duration; import java.util.Optional; import net.kyori.adventure.text.Component; -import net.md_5.bungee.api.chat.BaseComponent; import tc.oc.pgm.api.match.Match; import tc.oc.pgm.countdowns.MatchCountdown; @@ -52,7 +51,7 @@ private void announceRemaining() { TournamentTeam team = teamOpt.get(); team.sendMessage(vetoRound.describe().optionsHeader(controller.currentType())); - for (BaseComponent[] comp : + for (Component comp : vetoRound.describe().formatOptions(controller.remainingOptions(), controller.currentType())) team.sendMessage(comp); diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java index 246af08..5dd19aa 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoDescription.java @@ -7,11 +7,9 @@ import dev.pgm.events.team.TournamentTeam; import java.util.ArrayList; import java.util.List; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ComponentBuilder; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; public class VetoDescription implements RoundDescription { @@ -24,120 +22,96 @@ public VetoDescription(TournamentFormat format, VetoRound vetoRound) { } @Override - public BaseComponent roundInfo() { - switch (vetoRound.phase()) { - case UNLOADED: - return new TextComponent(ChatColor.GRAY + "Waiting to begin veto process"); - case WAITING: - TextComponent waiting = - new TextComponent(ChatColor.GREEN + "Deciding veto order with veto decider"); - waiting.setHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - new BaseComponent[] {tournamentFormat.currentRound().describe().roundInfo()})); - return waiting; - case RUNNING: - TextComponent running = new TextComponent(ChatColor.GREEN + "Veto process is running now"); - running.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, formattedVetosSoFar())); - return running; - case FINISHED: - TextComponent finished = new TextComponent(ChatColor.GRAY + "Veto process has concluded"); - finished.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, formattedVetosSoFar())); - return finished; - } - // not gonna get here - throw new IllegalStateException("New RoundPhase added without editing the veto settings!"); + public Component roundInfo() { + return switch (vetoRound.phase()) { + case UNLOADED -> Component.text("Waiting to begin veto process", NamedTextColor.GRAY); + case WAITING -> + Component.text("Deciding veto order with veto decider", NamedTextColor.GREEN) + .hoverEvent( + HoverEvent.showText(tournamentFormat.currentRound().describe().roundInfo())); + case RUNNING -> + Component.text("Veto process is running now", NamedTextColor.GREEN) + .hoverEvent(HoverEvent.showText(formattedVetosSoFar())); + case FINISHED -> + Component.text("Veto process has concluded", NamedTextColor.GRAY) + .hoverEvent(HoverEvent.showText(formattedVetosSoFar())); + }; } - private BaseComponent[] formattedVetosSoFar() { + private Component formattedVetosSoFar() { List history = vetoRound.vetoHistory(); - int vetoCount = history.size(); - - BaseComponent[] messages = new BaseComponent[vetoCount]; - for (int i = 0; i < history.size() - 1; i++) { - messages[i] = new TextComponent(fromHistory(i, true, history.get(i))); - } - - if (!history.isEmpty()) { - // add last line with no new line after - messages[vetoCount - 1] = - new TextComponent(fromHistory(vetoCount - 1, false, history.get(vetoCount - 1))); + Component result = Component.empty(); + for (int i = 0; i < history.size(); i++) { + if (i > 0) result = result.append(Component.newline()); + result = result.append(historyLine(i, history.get(i))); } - - return messages; + return result; } - private String fromHistory(int index, boolean newLine, VetoHistory history) { - String line = ChatColor.GOLD + Integer.toString(index + 1) + ". " + formatHistory(history); - if (newLine) { - line += "\n"; - } - return line; + private Component historyLine(int index, VetoHistory history) { + return Component.text(index + 1 + ". ", NamedTextColor.GOLD) + .append(formatHistoryComponent(history)); } - public String formatHistory(VetoHistory history) { - String prefix = ""; + public Component formatHistoryComponent(VetoHistory history) { + Component prefix; if (history.team() == null) { - prefix = ChatColor.GOLD + "RANDOM"; + prefix = Component.text("RANDOM", NamedTextColor.GOLD); } else { prefix = tournamentFormat.teamManager().formattedName(history.team()); } - prefix += ChatColor.GRAY + " has "; + prefix = prefix.append(Component.text(" has ", NamedTextColor.GRAY)); + Component action; if (history.vetoType() == VetoSettings.VetoType.BAN) { - prefix += ChatColor.RED + "BANNED "; + action = Component.text("BANNED ", NamedTextColor.RED); } else { - prefix += ChatColor.GREEN + "SELECTED "; + action = Component.text("SELECTED ", NamedTextColor.GREEN); } - return prefix + ChatColor.GOLD + history.optionChosen().name(); + return prefix + .append(action) + .append(Component.text(history.optionChosen().name(), NamedTextColor.GOLD)); } public String countdown(TournamentTeam picking, VetoSettings.VetoType type) { - return tournamentFormat.teamManager().formattedName(picking) - + ChatColor.GRAY - + " choose an option to " - + actionWord(type); + return picking.getName() + " choose an option to " + actionWord(type); } private String actionWord(VetoSettings.VetoType type) { - switch (type) { - case BAN: - return ChatColor.RED + "BAN"; - case CHOOSE_FIRST: - case CHOOSE_LAST: - return ChatColor.GREEN + "PLAY"; - } - return "NULL_ACTION"; + return switch (type) { + case BAN -> "BAN"; + case CHOOSE_FIRST, CHOOSE_LAST -> "PLAY"; + }; } - public String optionsHeader(VetoSettings.VetoType type) { - return ChatColor.GRAY + "Choose an option to " + actionWord(type); + public Component optionsHeader(VetoSettings.VetoType type) { + return Component.text("Choose an option to ", NamedTextColor.GRAY) + .append(actionComponent(type)); } - public BaseComponent commandPrompt(VetoSettings.VetoType type) { - return new TextComponent( - actionWord(type) + ChatColor.GRAY + " with: " + ChatColor.GOLD + "/veto "); + public Component commandPrompt(VetoSettings.VetoType type) { + return actionComponent(type) + .append(Component.text(" with: ", NamedTextColor.GRAY)) + .append(Component.text("/veto ", NamedTextColor.GOLD)); } - public List formatOptions(List options, VetoSettings.VetoType type) { - List comps = new ArrayList<>(options.size()); - + public List formatOptions(List options, VetoSettings.VetoType type) { + List comps = new ArrayList<>(options.size()); for (int i = 0; i < options.size(); i++) { - int vetoNumber = i + 1; - VetoOption option = options.get(i); - ComponentBuilder comp = new ComponentBuilder( - ChatColor.GOLD + Integer.toString(vetoNumber) + ". " + ChatColor.AQUA + option.name()); - - /*comp.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[]{ - new TextComponent(ChatColor.GRAY + "Click to " + actionWord(type)) - })); - comp.event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/events veto " + vetoNumber));*/ - comps.add(comp.create()); + comps.add(Component.text((i + 1) + ". ", NamedTextColor.GOLD) + .append(Component.text(options.get(i).name(), NamedTextColor.AQUA))); } - return comps; } + private Component actionComponent(VetoSettings.VetoType type) { + return switch (type) { + case BAN -> Component.text("BAN", NamedTextColor.RED); + case CHOOSE_FIRST, CHOOSE_LAST -> Component.text("PLAY", NamedTextColor.GREEN); + }; + } + @Override public String roundStatus() { return "NULL - VETO"; diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java index dae427d..fbd91aa 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoRound.java @@ -13,9 +13,8 @@ import java.util.List; import java.util.Optional; import java.util.Random; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Bukkit; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import tc.oc.pgm.api.match.Match; public class VetoRound extends AbstractRound { @@ -87,12 +86,14 @@ private void endVeto(Match match) { tournament().addRoundAfterCurrent(controller.toPlay()); // move the below formatting to the description class - Bukkit.broadcastMessage( - ChatColor.GOLD + "------ " + ChatColor.AQUA + "Veto Finished" + ChatColor.GOLD + " ------"); - for (int i = 0; i < controller.toPlay().size(); i++) - Bukkit.broadcast( - new TextComponent(ChatColor.GOLD + Integer.toString(i + 1) + ". "), - controller.toPlay().get(i).describe().roundInfo()); + match.sendMessage(Component.text("------ ", NamedTextColor.GOLD) + .append(Component.text("Veto Finished", NamedTextColor.AQUA)) + .append(Component.text(" ------", NamedTextColor.GOLD))); + + for (int i = 0; i < controller.toPlay().size(); i++) { + match.sendMessage(Component.text((i + 1) + ". ", NamedTextColor.GOLD) + .append(controller.toPlay().get(i).describe().roundInfo())); + } tournament().nextRound(match); } @@ -159,12 +160,11 @@ private void tryAutoVeto(Match match) { private void doVeto(Match match, TournamentTeam team, int pick) { match.getCountdown().cancelAll(VetoCountdown.class); VetoHistory history = controller.veto(team, pick); - if (history.shouldAnnounce()) Bukkit.broadcastMessage(description.formatHistory(history)); + if (history.shouldAnnounce()) match.sendMessage(description.formatHistoryComponent(history)); // maybe move this stuff away? if (!canVeto()) endVeto(match); - else // cycle veto - cycleVeto(match); + else cycleVeto(match); } public void veto(Match match, TournamentTeam team, int pick) { diff --git a/src/main/java/dev/pgm/events/format/rounds/vetoselector/VetoSelectorDescription.java b/src/main/java/dev/pgm/events/format/rounds/vetoselector/VetoSelectorDescription.java index 2e5199e..2dba2b4 100644 --- a/src/main/java/dev/pgm/events/format/rounds/vetoselector/VetoSelectorDescription.java +++ b/src/main/java/dev/pgm/events/format/rounds/vetoselector/VetoSelectorDescription.java @@ -1,8 +1,7 @@ package dev.pgm.events.format.rounds.vetoselector; import dev.pgm.events.format.rounds.RoundDescription; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; +import net.kyori.adventure.text.Component; public class VetoSelectorDescription implements RoundDescription { @@ -13,11 +12,8 @@ public VetoSelectorDescription(VetoSelectorRound vetoSelectorRound) { } @Override - public BaseComponent roundInfo() { - return new TextComponent( - "VetoSelector round -> veto picker: " + vetoSelectorRound.getSelectingTeam() == null - ? null - : vetoSelectorRound.getSelectingTeam().getName()); + public Component roundInfo() { + return Component.text(vetoSelectorRound.getSelectingTeam().getName()); } @Override diff --git a/src/main/java/dev/pgm/events/format/score/FormattedScore.java b/src/main/java/dev/pgm/events/format/score/FormattedScore.java index 5d92d44..c93bb51 100644 --- a/src/main/java/dev/pgm/events/format/score/FormattedScore.java +++ b/src/main/java/dev/pgm/events/format/score/FormattedScore.java @@ -1,10 +1,12 @@ package dev.pgm.events.format.score; +import net.kyori.adventure.text.Component; + public interface FormattedScore { - String topLine(); + Component topLine(); - String bottomLine(); + Component bottomLine(); - String condensed(); + Component condensed(); } diff --git a/src/main/java/dev/pgm/events/format/score/TwoTeamFormattedScore.java b/src/main/java/dev/pgm/events/format/score/TwoTeamFormattedScore.java index 6b49f86..b0bd9b0 100644 --- a/src/main/java/dev/pgm/events/format/score/TwoTeamFormattedScore.java +++ b/src/main/java/dev/pgm/events/format/score/TwoTeamFormattedScore.java @@ -4,7 +4,9 @@ import dev.pgm.events.team.TournamentTeamManager; import dev.pgm.events.utils.Pair; import java.util.Collection; -import org.bukkit.ChatColor; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; public class TwoTeamFormattedScore implements FormattedScore { @@ -23,55 +25,39 @@ public TwoTeamFormattedScore( } @Override - public String topLine() { - String firstName = teamManager.formattedName(topTwo.first.team()); - String secondName = teamManager.formattedName(topTwo.second.team()); - - firstName = addPadding(firstName, secondName); - secondName = addPadding(secondName, firstName); - return firstName + ChatColor.GRAY + " - " + secondName; - } - - private String addPadding(String target, String otherString) { - if (target.length() < otherString.length()) { - StringBuilder targetBuilder = new StringBuilder(target); - for (int i = 0; i < otherString.length() - targetBuilder.length(); i++) - targetBuilder.insert(0, " "); - target = targetBuilder.toString(); - } - - return target; + public Component topLine() { + return teamManager + .formattedName(topTwo.first.team()) + .append(Component.text(" - ", NamedTextColor.GRAY)) + .append(teamManager.formattedName(topTwo.second.team())); } @Override - public String bottomLine() { - String bott = ""; - bott += teamManager.teamColour(topTwo.first.team()); + public Component bottomLine() { + Component first = + Component.text(topTwo.first.score(), teamManager.teamColour(topTwo.first.team())); if (justWon.contains(topTwo.first.team())) { - bott += ChatColor.BOLD; - bott += ChatColor.UNDERLINE; + first = first.decorate(TextDecoration.BOLD).decorate(TextDecoration.UNDERLINED); } - bott += topTwo.first.score() + ChatColor.RESET.toString() + ChatColor.GRAY + " - "; - bott += teamManager.teamColour(topTwo.second.team()); + + Component second = + Component.text(topTwo.second.score(), teamManager.teamColour(topTwo.second.team())); if (justWon.contains(topTwo.second.team())) { - bott += ChatColor.BOLD; - bott += ChatColor.UNDERLINE; + second = second.decorate(TextDecoration.BOLD).decorate(TextDecoration.UNDERLINED); } - bott += topTwo.second.score(); - return bott; + + return first.append(Component.text(" - ", NamedTextColor.GRAY)).append(second); } @Override - public String condensed() { - return teamManager.formattedName(topTwo.first.team()) - + " " - + ChatColor.WHITE - + topTwo.first.score() - + ChatColor.GRAY - + " - " - + ChatColor.WHITE - + topTwo.second.score() - + " " - + teamManager.formattedName(topTwo.second.team()); + public Component condensed() { + return teamManager + .formattedName(topTwo.first.team()) + .append(Component.space()) + .append(Component.text(topTwo.first.score(), NamedTextColor.WHITE)) + .append(Component.text(" - ", NamedTextColor.GRAY)) + .append(Component.text(topTwo.second.score(), NamedTextColor.WHITE)) + .append(Component.space()) + .append(teamManager.formattedName(topTwo.second.team())); } } diff --git a/src/main/java/dev/pgm/events/team/ColorTeamSetup.java b/src/main/java/dev/pgm/events/team/ColorTeamSetup.java index 67f7643..8248cc3 100644 --- a/src/main/java/dev/pgm/events/team/ColorTeamSetup.java +++ b/src/main/java/dev/pgm/events/team/ColorTeamSetup.java @@ -2,14 +2,14 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.EnumMap; +import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; -import org.bukkit.ChatColor; +import net.kyori.adventure.text.format.NamedTextColor; import tc.oc.pgm.teams.Team; public class ColorTeamSetup implements TeamSetup { @@ -17,7 +17,7 @@ public class ColorTeamSetup implements TeamSetup { private final List currentTeams; // not active at the moment private final Set unassigned; - private final Map colorTeams = new EnumMap<>(ChatColor.class); + private final Map colorTeams = new HashMap<>(); // active at the moment private final Map assigned = new IdentityHashMap<>(); @@ -33,16 +33,16 @@ public Collection teams() { } @Override - public ChatColor colour(TournamentTeam tournamentTeam) { + public NamedTextColor colour(TournamentTeam tournamentTeam) { if (assigned.containsKey(tournamentTeam)) { - return assigned.get(tournamentTeam).getColor(); + return assigned.get(tournamentTeam).getTextColor(); } - for (ChatColor colour : colorTeams.keySet()) { - if (colorTeams.get(colour).equals(tournamentTeam)) { - return colour; + for (Map.Entry entry : colorTeams.entrySet()) { + if (entry.getValue().equals(tournamentTeam)) { + return entry.getKey(); } } - return ChatColor.WHITE; + return NamedTextColor.WHITE; } @Override @@ -56,7 +56,7 @@ private void assignTeams(Collection teams) { List unassignedTeams = new ArrayList<>(); for (Team team : teams) { - TournamentTeam colourTeam = colorTeams.get(team.getColor()); + TournamentTeam colourTeam = colorTeams.get(team.getTextColor()); if (colourTeam != null && !this.assigned.containsKey(colourTeam)) { // team with that colour, lets assign the assignTeam(team, colourTeam); @@ -106,7 +106,7 @@ private void assignLeftovers(List leftoverTeams) { private void reset() { for (TournamentTeam tournamentTeam : assigned.keySet()) { Team team = assigned.get(tournamentTeam); - TournamentTeam deleted = colorTeams.put(team.getColor(), tournamentTeam); + TournamentTeam deleted = colorTeams.put(team.getTextColor(), tournamentTeam); // there should never be a duplicate but just in case remove it here if (deleted != null && !deleted.equals(tournamentTeam)) { diff --git a/src/main/java/dev/pgm/events/team/DefaultTeamManager.java b/src/main/java/dev/pgm/events/team/DefaultTeamManager.java index 1005538..a70333d 100644 --- a/src/main/java/dev/pgm/events/team/DefaultTeamManager.java +++ b/src/main/java/dev/pgm/events/team/DefaultTeamManager.java @@ -8,7 +8,8 @@ import java.util.Map; import java.util.Optional; import java.util.UUID; -import org.bukkit.ChatColor; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.jspecify.annotations.Nullable; import tc.oc.pgm.api.party.Competitor; import tc.oc.pgm.api.party.Party; @@ -97,13 +98,13 @@ public Optional fromTournamentTeam(TournamentTeam tournamentTeam) { } @Override - public ChatColor teamColour(TournamentTeam tournamentTeam) { + public NamedTextColor teamColour(TournamentTeam tournamentTeam) { return getTeamSetup().colour(tournamentTeam); } @Override - public String formattedName(TournamentTeam tournamentTeam) { - return teamColour(tournamentTeam) + tournamentTeam.getName(); + public Component formattedName(TournamentTeam tournamentTeam) { + return Component.text(tournamentTeam.getName(), teamColour(tournamentTeam)); } @Override diff --git a/src/main/java/dev/pgm/events/team/TeamSetup.java b/src/main/java/dev/pgm/events/team/TeamSetup.java index 867edbc..fae6796 100644 --- a/src/main/java/dev/pgm/events/team/TeamSetup.java +++ b/src/main/java/dev/pgm/events/team/TeamSetup.java @@ -2,14 +2,14 @@ import java.util.Collection; import java.util.Map; -import org.bukkit.ChatColor; +import net.kyori.adventure.text.format.NamedTextColor; import tc.oc.pgm.teams.Team; public interface TeamSetup { Map setup(Collection teams); - ChatColor colour(TournamentTeam tournamentTeam); + NamedTextColor colour(TournamentTeam tournamentTeam); Collection teams(); } diff --git a/src/main/java/dev/pgm/events/team/TournamentTeam.java b/src/main/java/dev/pgm/events/team/TournamentTeam.java index 201e691..50c5d87 100644 --- a/src/main/java/dev/pgm/events/team/TournamentTeam.java +++ b/src/main/java/dev/pgm/events/team/TournamentTeam.java @@ -4,9 +4,10 @@ import java.util.Objects; import java.util.UUID; import java.util.function.Consumer; -import net.md_5.bungee.api.chat.BaseComponent; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import tc.oc.pgm.util.Audience; public interface TournamentTeam { @@ -19,15 +20,11 @@ default boolean containsPlayer(UUID player) { } default void sendMessage(String message) { - forEachPlayer(x -> x.sendMessage(message)); + sendMessage(Component.text(message)); } - default void sendMessage(BaseComponent component) { - forEachPlayer(x -> x.sendMessage(component)); - } - - default void sendMessage(BaseComponent... components) { - forEachPlayer(x -> x.sendMessage(components)); + default void sendMessage(Component component) { + forEachPlayer(p -> Audience.get(p).sendMessage(component)); } default void forEachPlayer(Consumer func) { diff --git a/src/main/java/dev/pgm/events/team/TournamentTeamManager.java b/src/main/java/dev/pgm/events/team/TournamentTeamManager.java index ca89b0c..5b622d5 100644 --- a/src/main/java/dev/pgm/events/team/TournamentTeamManager.java +++ b/src/main/java/dev/pgm/events/team/TournamentTeamManager.java @@ -3,7 +3,8 @@ import java.util.Collection; import java.util.Optional; import java.util.UUID; -import org.bukkit.ChatColor; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import tc.oc.pgm.api.party.Competitor; import tc.oc.pgm.teams.Team; @@ -33,13 +34,13 @@ public interface TournamentTeamManager { Optional fromTournamentTeam(TournamentTeam tournamentTeam); - ChatColor teamColour(TournamentTeam tournamentTeam); + NamedTextColor teamColour(TournamentTeam tournamentTeam); - default String formattedName(Competitor team) { - return tournamentTeam(team).map(this::formattedName).orElse("NULL"); + default Component formattedName(Competitor team) { + return tournamentTeam(team).map(this::formattedName).orElse(Component.text("NULL")); } - String formattedName(TournamentTeam tournamentTeam); + Component formattedName(TournamentTeam tournamentTeam); Collection teams(); From a518f963f045ce6134a501d55ace86a11c2bd3fe Mon Sep 17 00:00:00 2001 From: "BT (calcastor/mame)" <43831917+calcastor@users.noreply.github.com> Date: Sun, 5 Apr 2026 12:48:42 -0700 Subject: [PATCH 4/4] Further cleanup Signed-off-by: BT (calcastor/mame) <43831917+calcastor@users.noreply.github.com> --- build.gradle.kts | 4 +- buildSrc/build.gradle.kts | 4 +- .../buildlogic.java-conventions.gradle.kts | 2 +- buildSrc/src/main/kotlin/extensions.kt | 7 +- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 45633 -> 48462 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 2 +- gradlew.bat | 31 +++----- .../dev/pgm/events/api/teams/ConfigTeams.java | 74 ++++++++++++------ .../dev/pgm/events/format/RoundHolder.java | 10 +-- .../format/rounds/single/SingleRound.java | 5 +- .../format/rounds/veto/VetoController.java | 14 ++-- .../format/rounds/veto/VetoCountdown.java | 4 +- .../rounds/veto/settings/VetoSettings.java | 2 +- .../events/listeners/MatchLoadListener.java | 12 ++- .../java/dev/pgm/events/utils/Components.java | 3 +- src/main/java/dev/pgm/events/utils/Pair.java | 6 +- .../pgm/events/xml/MapFormatXMLParser.java | 2 +- .../java/dev/pgm/events/xml/RoundParser.java | 16 ++-- 20 files changed, 110 insertions(+), 94 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d08e04d..64612df 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -45,6 +45,8 @@ tasks { val version = project.version.toString() val commitHash = project.latestCommitHash() + inputs.property("commitHash", commitHash) + filesMatching(listOf("plugin.yml")) { expand( mapOf( @@ -52,7 +54,7 @@ tasks { "apiVersion" to "1.21.11", "mainClass" to "dev.pgm.events.EventsPlugin", "version" to version, - "commitHash" to commitHash, + "commitHash" to commitHash.get(), "url" to "https://pgm.dev/" ) ) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 7ec990c..bf1de44 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -9,7 +9,7 @@ repositories { } dependencies { - implementation("com.gradleup.shadow:com.gradleup.shadow.gradle.plugin:9.4.1") - implementation("com.diffplug.gradle.spotless:com.diffplug.gradle.spotless.gradle.plugin:8.4.0") + implementation("com.gradleup.shadow:com.gradleup.shadow.gradle.plugin:9.4.2") + implementation("com.diffplug.gradle.spotless:com.diffplug.gradle.spotless.gradle.plugin:8.6.0") implementation("de.skuzzle.restrictimports:de.skuzzle.restrictimports.gradle.plugin:3.0.0") } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts index 6e16871..5d41cc5 100644 --- a/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts @@ -50,7 +50,7 @@ spotless { removeUnusedImports() trimTrailingWhitespace() formatAnnotations() - palantirJavaFormat("2.90.0").style("GOOGLE").formatJavadoc(true) + palantirJavaFormat("2.93.0").style("GOOGLE").formatJavadoc(true) } } diff --git a/buildSrc/src/main/kotlin/extensions.kt b/buildSrc/src/main/kotlin/extensions.kt index beb6f54..45c09a9 100644 --- a/buildSrc/src/main/kotlin/extensions.kt +++ b/buildSrc/src/main/kotlin/extensions.kt @@ -1,13 +1,14 @@ import org.gradle.api.Project +import org.gradle.api.provider.Provider -fun Project.latestCommitHash(): String { +fun Project.latestCommitHash(): Provider { return runGitCommand(listOf("rev-parse", "--short", "HEAD")) } -fun Project.runGitCommand(args: List): String { +fun Project.runGitCommand(args: List): Provider { return providers.exec { commandLine("git") args(args) - }.standardOutput.asText.get().trim() + }.standardOutput.asText.map { it.trim() } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 5ad6974..c978528 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -org.gradle.configuration-cache=true +//org.gradle.configuration-cache=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f8e1ee3125fe0768e9a76ee977ac089eb657005e..b1b8ef56b44f16b14dc800fa8103a6d89abb526f 100644 GIT binary patch delta 39839 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 Nq7gt%)$b|i{{Upf@NED9 delta 37062 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 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -65,7 +65,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line @@ -73,21 +73,10 @@ goto fail @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java b/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java index 45662f3..5212b48 100644 --- a/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java +++ b/src/main/java/dev/pgm/events/api/teams/ConfigTeams.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.stream.Collectors; +import java.util.logging.Logger; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -22,27 +22,28 @@ public List getTeams() { } private static List parseTournamentTeams(File teamsFolder, File teamsFile) { - if (!teamsFolder.exists()) teamsFolder.mkdirs(); + Logger logger = EventsPlugin.get().getLogger(); + if (!teamsFolder.exists() && !teamsFolder.mkdirs()) { + logger.warning("Failed to create teams folder: " + teamsFolder.getPath()); + } List teamList = new ArrayList<>(); - for (File child : - teamsFolder.listFiles((file) -> file.getName().toLowerCase().endsWith(".yml"))) { - FileConfiguration config = YamlConfiguration.loadConfiguration(child); - String teamName = config.getString("name"); - List players = config.getStringList("players").stream() - .map(String::trim) - .map(UUID::fromString) - .map(x -> TournamentPlayer.create(x, true)) - .collect(Collectors.toList()); - teamList.add(TournamentTeam.create(teamName, players)); + File[] teamFiles = teamsFolder.listFiles(f -> f.getName().toLowerCase().endsWith(".yml")); + if (teamFiles != null) { + for (File child : teamFiles) { + FileConfiguration config = YamlConfiguration.loadConfiguration(child); + String teamName = config.getString("name"); + List players = parsePlayers(config.getStringList("players"), logger); + teamList.add(TournamentTeam.create(teamName, players)); + } } if (teamsFile.exists()) { YamlConfiguration teamsConfig = YamlConfiguration.loadConfiguration(teamsFile); for (Object object : teamsConfig.getList("teams")) { - if (!(object instanceof Map)) { - System.out.println("Invalid type in teams.yml (" + if (!(object instanceof Map rawTeam)) { + logger.warning("Invalid type in teams.yml (" + object.getClass().getName() + ": " + object @@ -50,19 +51,46 @@ private static List parseTournamentTeams(File teamsFolder, File continue; } - Map team = (Map) object; - String teamName = (String) team.get("name"); - List players = ((List) team.get("players")) - .stream() - .map(String::trim) - .map(UUID::fromString) - .map(x -> TournamentPlayer.create(x, true)) - .collect(Collectors.toList()); + Object nameObj = rawTeam.get("name"); + Object playersObj = rawTeam.get("players"); - teamList.add(TournamentTeam.create(teamName, players)); + if (!(nameObj instanceof String teamName)) { + logger.warning("Team entry in teams.yml is missing a valid 'name'. Skipping..."); + continue; + } + + if (!(playersObj instanceof List rawPlayers)) { + logger.warning( + "Team '" + nameObj + "' in teams.yml is missing a valid 'players' list. Skipping..."); + continue; + } + + List playerStrings = new ArrayList<>(); + for (Object p : rawPlayers) { + if (p instanceof String s) { + playerStrings.add(s); + } else { + logger.warning( + "Non-string player entry in team '" + nameObj + "': " + p + ". Skipping entry..."); + } + } + + teamList.add(TournamentTeam.create(teamName, parsePlayers(playerStrings, logger))); } } return teamList; } + + private static List parsePlayers(List uuids, Logger logger) { + List players = new ArrayList<>(); + for (String raw : uuids) { + try { + players.add(TournamentPlayer.create(UUID.fromString(raw.trim()), true)); + } catch (IllegalArgumentException e) { + logger.warning("Invalid UUID '" + raw + "' in team config. Skipping..."); + } + } + return players; + } } diff --git a/src/main/java/dev/pgm/events/format/RoundHolder.java b/src/main/java/dev/pgm/events/format/RoundHolder.java index 601a526..07f46b5 100644 --- a/src/main/java/dev/pgm/events/format/RoundHolder.java +++ b/src/main/java/dev/pgm/events/format/RoundHolder.java @@ -100,13 +100,5 @@ public void addRoundAfterCurrent(TournamentRound round) { rounds.add(currentRound + 1, round); } - private static class ScoreResult { - private final Map scoreMap; - private final int scoringRounds; - - public ScoreResult(Map scoreMap, int scoringRounds) { - this.scoreMap = scoreMap; - this.scoringRounds = scoringRounds; - } - } + private record ScoreResult(Map scoreMap, int scoringRounds) {} } diff --git a/src/main/java/dev/pgm/events/format/rounds/single/SingleRound.java b/src/main/java/dev/pgm/events/format/rounds/single/SingleRound.java index 89ead8f..fc6b85a 100644 --- a/src/main/java/dev/pgm/events/format/rounds/single/SingleRound.java +++ b/src/main/java/dev/pgm/events/format/rounds/single/SingleRound.java @@ -55,8 +55,9 @@ public void load() { public void start(Match match) { this.roundPhase = RoundPhase.WAITING; // cycle to the map, start in 10 seconds - if (settings().cycleCountdown() != null) - match.getModule(CycleMatchModule.class).startCountdown(settings().cycleCountdown()); + var cmm = match.getModule(CycleMatchModule.class); + if (cmm != null && settings().cycleCountdown() != null) + cmm.startCountdown(settings().cycleCountdown()); } @Override diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java index d258b65..03af214 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java @@ -36,11 +36,13 @@ public VetoController( } public boolean hasMoreVetoing() { - if (options.size() == 1) // only one map left - return false; + // only one map left + if (options.size() == 1) return false; - for (int i = vetoIndex; i < settings.vetoList().size(); i++) - if (settings.vetoList().get(i).team > 0) return true; // teams still get to vote + for (int i = vetoIndex; i < settings.vetoList().size(); i++) { + // teams still get to vote + if (settings.vetoList().get(i).team > 0) return true; + } return true; } @@ -68,8 +70,8 @@ public void completeVetos() { } public VetoHistory veto(@Nullable TournamentTeam team, int choice) { - if (!hasMoreVetoing()) // maybe throw an exception? - return null; + // maybe throw an exception? + if (!hasMoreVetoing()) return null; VetoSettings.Veto veto = settings.vetoList().get(vetoIndex); VetoOption vetoOption = options.remove(choice); diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java index 3c01077..89a2e20 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/VetoCountdown.java @@ -34,9 +34,9 @@ public void onTick(Duration remaining, Duration total) { long secondsLeft = remaining.getSeconds(); long origSeconds = total.getSeconds(); + // announce it if ((secondsLeft <= 10 && secondsLeft % 5 == 0) - || (secondsLeft % 30 == 0 && origSeconds - secondsLeft > 20)) // announce it - announceRemaining(); + || (secondsLeft % 30 == 0 && origSeconds - secondsLeft > 20)) announceRemaining(); } @Override diff --git a/src/main/java/dev/pgm/events/format/rounds/veto/settings/VetoSettings.java b/src/main/java/dev/pgm/events/format/rounds/veto/settings/VetoSettings.java index 2585e34..b2b9993 100644 --- a/src/main/java/dev/pgm/events/format/rounds/veto/settings/VetoSettings.java +++ b/src/main/java/dev/pgm/events/format/rounds/veto/settings/VetoSettings.java @@ -76,7 +76,7 @@ public enum VetoType { public static class Veto { public final VetoType vetoType; public final int team; - public Duration vetoDuration; + public final Duration vetoDuration; public final boolean shouldAnnounce; public Veto(VetoType vetoType, int team, Duration vetoDuration, boolean shouldAnnounce) { diff --git a/src/main/java/dev/pgm/events/listeners/MatchLoadListener.java b/src/main/java/dev/pgm/events/listeners/MatchLoadListener.java index f31df00..336fa9a 100644 --- a/src/main/java/dev/pgm/events/listeners/MatchLoadListener.java +++ b/src/main/java/dev/pgm/events/listeners/MatchLoadListener.java @@ -18,14 +18,12 @@ public MatchLoadListener(TournamentTeamManager teamManager) { @EventHandler public void onLoad(MatchLoadEvent event) { - if (!event - .getMatch() - .hasModule( - TeamMatchModule - .class)) // shouldn't really ever happen, maybe ffa? just ignore that game - return; + var tmm = event.getMatch().getModule(TeamMatchModule.class); + if (tmm == null) return; + + Collection teams = tmm.getTeams(); + if (teams.isEmpty()) return; - Collection teams = event.getMatch().getModule(TeamMatchModule.class).getTeams(); teamManager.setupTeams(teams); } } diff --git a/src/main/java/dev/pgm/events/utils/Components.java b/src/main/java/dev/pgm/events/utils/Components.java index d8f8097..31a8a8a 100644 --- a/src/main/java/dev/pgm/events/utils/Components.java +++ b/src/main/java/dev/pgm/events/utils/Components.java @@ -23,8 +23,9 @@ public static Component command(Style style, String command, String... cmdArgs) for (String arg : cmdArgs) builder.append(" ").append(Components.toArgument(arg)); command = builder.toString(); + var payload = ClickEvent.Payload.string(command); return Component.text(command, style) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, command)) + .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, payload)) .hoverEvent(Component.text("Click to run ", NamedTextColor.GREEN) .append(Component.text(command, style))); } diff --git a/src/main/java/dev/pgm/events/utils/Pair.java b/src/main/java/dev/pgm/events/utils/Pair.java index 793b4f4..33a1785 100644 --- a/src/main/java/dev/pgm/events/utils/Pair.java +++ b/src/main/java/dev/pgm/events/utils/Pair.java @@ -2,8 +2,8 @@ public class Pair { - public T first; - public U second; + public final T first; + public final U second; public Pair(T first, U second) { this.first = first; @@ -11,6 +11,6 @@ public Pair(T first, U second) { } public static Pair create(T first, U second) { - return new Pair(first, second); + return new Pair<>(first, second); } } diff --git a/src/main/java/dev/pgm/events/xml/MapFormatXMLParser.java b/src/main/java/dev/pgm/events/xml/MapFormatXMLParser.java index 658f851..4d6b34c 100644 --- a/src/main/java/dev/pgm/events/xml/MapFormatXMLParser.java +++ b/src/main/java/dev/pgm/events/xml/MapFormatXMLParser.java @@ -31,7 +31,7 @@ public static TournamentFormat parse(String name) { return null; } - public static TournamentFormat parse(Element root) throws JDOMException { + public static TournamentFormat parse(Element root) { String bestOfArgs = root.getAttributeValue("best-of"); TournamentFormat format = getTournamentFormat(bestOfArgs); diff --git a/src/main/java/dev/pgm/events/xml/RoundParser.java b/src/main/java/dev/pgm/events/xml/RoundParser.java index ce67810..d0bbc2b 100644 --- a/src/main/java/dev/pgm/events/xml/RoundParser.java +++ b/src/main/java/dev/pgm/events/xml/RoundParser.java @@ -16,7 +16,7 @@ import dev.pgm.events.format.rounds.vetoselector.VetoSelectorSettings; import java.time.Duration; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.List; import tc.oc.pgm.lib.org.jdom2.Element; @@ -56,7 +56,7 @@ public static VetoRound parse(TournamentFormat format, Element element) { String id = element.getAttributeValue("id", "veto"); Element order = element.getChild("order"); if (order == null) throw new IllegalArgumentException("Order element is missing from veto!"); - Duration vetoTime = Duration.ofSeconds(30); + Duration vetoTime; try { vetoTime = Duration.ofSeconds(Long.parseLong(order.getAttributeValue("time", "30"))); } catch (NumberFormatException e) { @@ -65,7 +65,7 @@ public static VetoRound parse(TournamentFormat format, Element element) { } TournamentRound decider = - RoundParser.parse(format, element.getChild("decider").getChildren().get(0)); + RoundParser.parse(format, element.getChild("decider").getChildren().getFirst()); List options = constructVetoOptions(format, element.getChild("options")); List vetoList = constructVetoList(order, options.size()); @@ -76,7 +76,7 @@ public static VetoRound parse(TournamentFormat format, Element element) { } private static List constructVetoList(Element element, int numOptions) { - ArrayList vetos = new ArrayList(); + ArrayList vetos = new ArrayList<>(); if (element.getChildren().isEmpty()) { int until = Integer.parseInt(element.getAttributeValue("ban-until", "1")); int startingTeam = Integer.parseInt(element.getAttributeValue("starting-team", "2")); @@ -126,15 +126,15 @@ private static VetoSettings.Veto parseVeto(Element element) { } private static List constructVetoOptions(TournamentFormat format, Element element) { - ArrayList options = new ArrayList(); + ArrayList options = new ArrayList<>(); for (Element child : element.getChildren()) { RoundSettings round = RoundParser.parse(format, child).settings(); String defaultName = "Name not defined in XML!"; if (round instanceof SingleRoundOptions) defaultName = ((SingleRoundOptions) round).map(); - options.add( - new VetoOption(Arrays.asList(round), child.getAttributeValue("name", defaultName))); + options.add(new VetoOption( + Collections.singletonList(round), child.getAttributeValue("name", defaultName))); } return options; @@ -161,7 +161,7 @@ public static FormatRound parse(TournamentFormat format, Element element) { if (bestOfArgs == null) throw new IllegalArgumentException("No best-of specified on format!"); int bestOf = Integer.parseInt(bestOfArgs); - List rounds = new ArrayList(); + List rounds = new ArrayList<>(); for (Element child : element.getChildren()) { TournamentRound round = RoundParser.parse(format, child); rounds.add(round.settings());