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..6e16871 100644 --- a/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/buildlogic.java-conventions.gradle.kts @@ -14,16 +14,22 @@ repositories { mavenLocal() mavenCentral() maven("https://oss.sonatype.org/content/repositories/snapshots/") // Snapshots - maven("https://repo.pgm.fyi/snapshots/") // PGM-specific depdencies - maven("https://repo.papermc.io/repository/maven-public/") // Needed for bungeecord-chat + maven("https://repo.pgm.fyi/snapshots/") // PGM-specific dependencies + maven("https://repo.papermc.io/repository/maven-public/") + } dependencies { - compileOnly("dev.pgm.paper:paper-api:1.8_1.21.1-SNAPSHOT") - compileOnly("tc.oc.pgm:core:0.16-SNAPSHOT") - compileOnly("net.md-5:bungeecord-chat:1.20-R0.2-deprecated+build.18") + // Annotations + api("org.jspecify:jspecify:1.0.0") + compileOnly("org.jetbrains:annotations:26.1.0") compileOnly("org.incendo:cloud-annotations:2.0.0") - compileOnly("org.jetbrains:annotations:22.0.0") + + // Provided dependencies + compileOnly("dev.pgm.paper:paper-api:1.8_1.21.11-SNAPSHOT") + 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" @@ -31,26 +37,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 a4b76b9..f8e1ee3 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ 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..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,50 +22,75 @@ 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()); + List teamList = new ArrayList<>(); - 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 (" - + object.getClass().getName() - + ": " - + object.toString() - + ")! Skipping..."); + if (!(object instanceof Map rawTeam)) { + logger.warning("Invalid type in teams.yml (" + + object.getClass().getName() + + ": " + + object + + ")! 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()); + 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/api/teams/DefaultTeamRegistry.java b/src/main/java/dev/pgm/events/api/teams/DefaultTeamRegistry.java index 057790c..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 { @@ -47,20 +49,15 @@ 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 -> Audience.get(x) + .sendMessage(Component.text("Teams reloaded!", NamedTextColor.AQUA))); + }); + }); } } 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..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 ") @@ -54,27 +56,28 @@ 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); - 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,20 +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))); } } @@ -109,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 cef65ed..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,19 +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()); + String formatName = + ((FormatTournamentImpl) format).getFormatRound().settings().name(); + 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()); } } @@ -38,15 +42,18 @@ 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() + ")"; + + Audience audience = Audience.get(sender); + audience.sendMessage(Component.text("------- ", NamedTextColor.GOLD) + .append(Component.text(header, NamedTextColor.AQUA)) + .append(Component.text(" -------", NamedTextColor.GOLD))); - sender.sendMessage( - ChatColor.GOLD + "------- " + ChatColor.AQUA + header + ChatColor.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/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/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/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..07f46b5 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() { @@ -101,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/TournamentFormatImpl.java b/src/main/java/dev/pgm/events/format/TournamentFormatImpl.java index 1c262a2..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 { @@ -154,23 +156,18 @@ private void broadcastScore() { Bukkit.getScheduler() .scheduleSyncDelayedTask( EventsPlugin.get(), - new Runnable() { - - @Override - public void run() { - Bukkit.broadcastMessage(scores.condensed()); - } - }, + () -> 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 07fc9ab..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,21 +1,15 @@ package dev.pgm.events.format.rounds; -import net.md_5.bungee.api.chat.BaseComponent; +import net.kyori.adventure.text.Component; public interface RoundDescription { /** * The main round info, also contains hover information for scores in match, time and stuff like * that - * - * @return */ - BaseComponent roundInfo(); + Component 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/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/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/FormatRoundDescription.java b/src/main/java/dev/pgm/events/format/rounds/format/FormatRoundDescription.java index 054cb8d..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,22 +14,15 @@ public FormatRoundDescription(FormatRound formatRound) { } @Override - public BaseComponent roundInfo() { - 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())})); - else - component.setHoverEvent( - new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - new BaseComponent[] {new TextComponent(ChatColor.YELLOW + "Loading...")})); - - return component; + public Component roundInfo() { + Component base = Component.text( + formatRound.settings().name() + " - Best of " + formatRound.settings().bestOf()); + 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/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/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/replay/ReplayRound.java b/src/main/java/dev/pgm/events/format/rounds/replay/ReplayRound.java index a4d65a1..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 { @@ -29,18 +28,17 @@ 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) + .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/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/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..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 @@ -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) { @@ -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/single/SingleRoundDescription.java b/src/main/java/dev/pgm/events/format/rounds/single/SingleRoundDescription.java index 285c2df..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,48 +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.size() == 0) { - // draw - return drawString(); + if (teams.isEmpty()) { + 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/VetoController.java b/src/main/java/dev/pgm/events/format/rounds/veto/VetoController.java index 514c4c4..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 @@ -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 { @@ -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); @@ -122,7 +124,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..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 @@ -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; @@ -35,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 @@ -48,11 +47,11 @@ 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())); - 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 1f6d35e..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,126 +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.size() > 0) { - // 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/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..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 { @@ -40,19 +39,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) @@ -88,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); } @@ -101,7 +101,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; } @@ -135,7 +135,7 @@ public boolean validVetoNumber(int number) { public void randomVeto(Match match) { Optional picking = picking(); - if (!picking.isPresent()) { + if (picking.isEmpty()) { tryAutoVeto(match); return; } @@ -160,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/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/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/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/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/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 c61f1e2..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,51 +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()) - for (int i = 0; i < otherString.length() - target.length(); i++) target = " " + target; - - 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/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/listeners/PlayerJoinListen.java b/src/main/java/dev/pgm/events/listeners/PlayerJoinListen.java index 43d35e8..544413a 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/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/ColorTeamSetup.java b/src/main/java/dev/pgm/events/team/ColorTeamSetup.java index 11ef38d..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,14 +56,14 @@ 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); 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); } @@ -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 781bf36..a70333d 100644 --- a/src/main/java/dev/pgm/events/team/DefaultTeamManager.java +++ b/src/main/java/dev/pgm/events/team/DefaultTeamManager.java @@ -8,8 +8,9 @@ import java.util.Map; import java.util.Optional; import java.util.UUID; -import org.bukkit.ChatColor; -import org.jetbrains.annotations.Nullable; +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; import tc.oc.pgm.api.player.MatchPlayer; @@ -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(); diff --git a/src/main/java/dev/pgm/events/utils/Components.java b/src/main/java/dev/pgm/events/utils/Components.java index 63aa8d2..31a8a8a 100644 --- a/src/main/java/dev/pgm/events/utils/Components.java +++ b/src/main/java/dev/pgm/events/utils/Components.java @@ -23,11 +23,11 @@ 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)) - .hoverEvent( - Component.text("Click to run ", NamedTextColor.GREEN) - .append(Component.text(command, style))); + .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, payload)) + .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/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/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/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/MapFormatXMLParser.java b/src/main/java/dev/pgm/events/xml/MapFormatXMLParser.java index a051106..4d6b34c 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,21 +20,31 @@ 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; } - public static TournamentFormat parse(Element root) throws JDOMException { + public static TournamentFormat parse(Element root) { 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 ea23595..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; @@ -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!"); }; } @@ -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,8 +76,8 @@ 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) { + 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")); int numTeams = Integer.parseInt(element.getAttributeValue("teams", "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());