From ecea277ab74e57794ff129c0acdbc0f63c729c81 Mon Sep 17 00:00:00 2001 From: rasmus Date: Tue, 28 Jan 2025 22:39:43 +0100 Subject: [PATCH 1/3] implement never type goals for multiple teams --- .../fd92b0e9e07895138b66a79af3d38ddbb4f5c5ed | 1 + .../bingo/bingo/tag/lockout_inflictable.json | 5 +++ .../github/gaming32/bingo/BingoCommand.java | 4 +++ .../gaming32/bingo/client/BingoClient.java | 24 ++++++------- .../github/gaming32/bingo/data/BingoTags.java | 2 ++ .../gaming32/bingo/data/goal/GoalHolder.java | 2 ++ .../gaming32/bingo/game/ActiveGoal.java | 6 +++- .../gaming32/bingo/game/BingoBoard.java | 11 +++--- .../github/gaming32/bingo/game/BingoGame.java | 10 ++++-- .../bingo/game/mode/BingoGameMode.java | 2 +- .../bingo/game/mode/BlackoutGameMode.java | 2 +- .../bingo/game/mode/LockoutGameMode.java | 36 ++++++++++++++----- .../resources/assets/bingo/lang/en_us.json | 1 + .../resources/assets/bingo/lang/ru_ru.json | 1 + 14 files changed, 76 insertions(+), 31 deletions(-) create mode 100644 common/src/main/generated/data/bingo/bingo/tag/lockout_inflictable.json diff --git a/common/src/main/generated/.cache/fd92b0e9e07895138b66a79af3d38ddbb4f5c5ed b/common/src/main/generated/.cache/fd92b0e9e07895138b66a79af3d38ddbb4f5c5ed index 5da160ec..08e59eb1 100644 --- a/common/src/main/generated/.cache/fd92b0e9e07895138b66a79af3d38ddbb4f5c5ed +++ b/common/src/main/generated/.cache/fd92b0e9e07895138b66a79af3d38ddbb4f5c5ed @@ -11,6 +11,7 @@ e0e1dcbc8d0051dfd2185f9902fef371ba7e7ff0 data/bingo/bingo/tag/build.json ec0fed5926df047e2433eb011817907108d7bf88 data/bingo/bingo/tag/end.json e3afeb62cdd4266a49147832aa67f9e14d2f7246 data/bingo/bingo/tag/finish.json f8ad1ef69be0bbac9da8bba2cf794b6a6519e50c data/bingo/bingo/tag/item.json +aae72d460b7547e879e02ee32031ab4aa1597a0e data/bingo/bingo/tag/lockout_inflictable.json ddddf8256baebcc4d250a5006d09d57acbb4ba8c data/bingo/bingo/tag/nether.json 8039ae633d3d0066f7387790117273e7f6f2c64e data/bingo/bingo/tag/never.json 70db5d2846993435adc1455b5d3829590162a48e data/bingo/bingo/tag/ocean.json diff --git a/common/src/main/generated/data/bingo/bingo/tag/lockout_inflictable.json b/common/src/main/generated/data/bingo/bingo/tag/lockout_inflictable.json new file mode 100644 index 00000000..1b695511 --- /dev/null +++ b/common/src/main/generated/data/bingo/bingo/tag/lockout_inflictable.json @@ -0,0 +1,5 @@ +{ + "difficulty_max": [ + 1.0 + ] +} \ No newline at end of file diff --git a/common/src/main/java/io/github/gaming32/bingo/BingoCommand.java b/common/src/main/java/io/github/gaming32/bingo/BingoCommand.java index 1a798203..bb6d4297 100644 --- a/common/src/main/java/io/github/gaming32/bingo/BingoCommand.java +++ b/common/src/main/java/io/github/gaming32/bingo/BingoCommand.java @@ -119,6 +119,7 @@ public class BingoCommand { ); }; + private static final CommandSwitch ALLOW_NEVER_GOALS_IN_LOCKOUT = CommandSwitch.storeTrue("--allow-never-goals-in-lockout"); private static final CommandSwitch REQUIRE_CLIENT = CommandSwitch.storeTrue("--require-client"); private static final CommandSwitch CONTINUE_AFTER_WIN = CommandSwitch.storeTrue("--continue-after-win"); private static final CommandSwitch INCLUDE_INACTIVE_TEAMS = CommandSwitch.storeTrue("--include-inactive-teams"); @@ -358,6 +359,7 @@ public Component getDisplayName() { { final CommandNode startCommand = bingoCommand.getChild("start"); + ALLOW_NEVER_GOALS_IN_LOCKOUT.addTo(startCommand); REQUIRE_CLIENT.addTo(startCommand); CONTINUE_AFTER_WIN.addTo(startCommand); INCLUDE_INACTIVE_TEAMS.addTo(startCommand); @@ -399,6 +401,7 @@ private static int startGame(CommandContext context, int tea final var excludedTags = EXCLUDE_TAG.get(context); final int size = SIZE.get(context); final var gamemode = GAMEMODE.get(context).value(); + final boolean allowNeverGoalsInLockout = ALLOW_NEVER_GOALS_IN_LOCKOUT.get(context); final boolean requireClient = REQUIRE_CLIENT.get(context); final boolean continueAfterWin = CONTINUE_AFTER_WIN.get(context); final boolean includeInactiveTeams = INCLUDE_INACTIVE_TEAMS.get(context); @@ -439,6 +442,7 @@ private static int startGame(CommandContext context, int tea gamemode::isGoalAllowed, requiredGoals, excludedTags, + allowNeverGoalsInLockout, requireClient, registries ); diff --git a/common/src/main/java/io/github/gaming32/bingo/client/BingoClient.java b/common/src/main/java/io/github/gaming32/bingo/client/BingoClient.java index db328bc4..93ca12bf 100644 --- a/common/src/main/java/io/github/gaming32/bingo/client/BingoClient.java +++ b/common/src/main/java/io/github/gaming32/bingo/client/BingoClient.java @@ -156,7 +156,7 @@ class TeamValue { int totalScore = 0; for (final BingoBoard.Teams state : clientGame.states()) { - if (state.any()) { + if (state.count() == 1) { totalScore++; teams[state.getFirstIndex()].score++; } @@ -243,20 +243,18 @@ public static void renderBingo(GuiGraphics graphics, boolean mouseHover, Positio renderer.renderDecorations(icon, minecraft.font, graphics, slotX, slotY); final BingoBoard.Teams state = clientGame.getState(sx, sy); boolean isGoalCompleted = state.and(clientTeam); + int incompleteColor = Objects.requireNonNullElse(goal.specialType().incompleteColor, 0); - final Integer color = switch (clientGame.renderMode()) { - case FANCY -> isGoalCompleted ? Integer.valueOf(0x55ff55) : goal.specialType().incompleteColor; - case ALL_TEAMS -> { - if (!state.any()) { - yield null; - } - final BingoBoard.Teams team = isGoalCompleted ? clientTeam : state; - final Integer maybeColor = clientGame.teams()[team.getFirstIndex()].getColor().getColor(); - yield maybeColor != null ? maybeColor : 0x55ff55; - } + final int[] colors = switch (clientGame.renderMode()) { + case FANCY -> new int[]{(isGoalCompleted ? 0x55ff55 : incompleteColor)}; + case ALL_TEAMS -> state.stream().map((team) -> clientGame.teams()[team].getColor().getColor()).toArray(); }; - if (color != null) { - graphics.fill(slotX, slotY, slotX + 16, slotY + 16, 0xA0000000 | color); + for (int i = 0; i < colors.length; ++i) { + int color = colors[i]; + int start = 16 * i / colors.length; + int end = 16 * (i + 1) / colors.length; + int base = (colors.length == 1) ? 0xA0000000 : 0x50000000; + graphics.fill(slotX + start, slotY, slotX + end, slotY + 16, base | color); } GoalProgress progress = clientGame.getProgress(sx, sy); diff --git a/common/src/main/java/io/github/gaming32/bingo/data/BingoTags.java b/common/src/main/java/io/github/gaming32/bingo/data/BingoTags.java index 5d1e37c4..a33cfaa8 100644 --- a/common/src/main/java/io/github/gaming32/bingo/data/BingoTags.java +++ b/common/src/main/java/io/github/gaming32/bingo/data/BingoTags.java @@ -12,6 +12,7 @@ public final class BingoTags { public static final ResourceKey END = createKey("end"); public static final ResourceKey FINISH = createKey("finish"); public static final ResourceKey ITEM = createKey("item"); + public static final ResourceKey LOCKOUT_INFLICTABLE = createKey("lockout_inflictable"); public static final ResourceKey NETHER = createKey("nether"); public static final ResourceKey NEVER = createKey("never"); public static final ResourceKey OCEAN = createKey("ocean"); @@ -36,6 +37,7 @@ public static void bootstrap(BootstrapContext context) { .build() ); context.register(ITEM, BingoTag.builder().difficultyMax(25, 25, 20, 20, 20).build()); + context.register(LOCKOUT_INFLICTABLE, BingoTag.builder().markerTag().build()); context.register(NETHER, BingoTag.builder().difficultyMax(0, 2, 5, 10, 15).build()); context.register(NEVER, BingoTag.builder() .difficultyMax(3, 3, 3, 2, 1) diff --git a/common/src/main/java/io/github/gaming32/bingo/data/goal/GoalHolder.java b/common/src/main/java/io/github/gaming32/bingo/data/goal/GoalHolder.java index 80bb3ad4..f4f1c1d4 100644 --- a/common/src/main/java/io/github/gaming32/bingo/data/goal/GoalHolder.java +++ b/common/src/main/java/io/github/gaming32/bingo/data/goal/GoalHolder.java @@ -1,5 +1,6 @@ package io.github.gaming32.bingo.data.goal; +import io.github.gaming32.bingo.data.BingoTags; import io.github.gaming32.bingo.game.ActiveGoal; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; @@ -26,6 +27,7 @@ public ActiveGoal build(RandomSource rand) { goal.buildRequiredCount(context), Optional.of(goal.getDifficulty()), goal.getRequirements(), + goal.getTags().stream().anyMatch(holder -> holder.is(BingoTags.LOCKOUT_INFLICTABLE)), goal.getSpecialType(), goal.getProgress() ); diff --git a/common/src/main/java/io/github/gaming32/bingo/game/ActiveGoal.java b/common/src/main/java/io/github/gaming32/bingo/game/ActiveGoal.java index a19da786..7f82d66e 100644 --- a/common/src/main/java/io/github/gaming32/bingo/game/ActiveGoal.java +++ b/common/src/main/java/io/github/gaming32/bingo/game/ActiveGoal.java @@ -45,6 +45,7 @@ public record ActiveGoal( int requiredCount, Optional> difficulty, AdvancementRequirements requirements, + Boolean isLockoutInflictable, BingoTag.SpecialType specialType, ProgressTracker progress ) { @@ -61,6 +62,7 @@ public record ActiveGoal( .fieldOf("difficulty") .forGetter(ActiveGoal::difficulty), AdvancementRequirements.CODEC.fieldOf("requirements").forGetter(ActiveGoal::requirements), + Codec.BOOL.fieldOf("isLockoutInflictable").forGetter(ActiveGoal::isLockoutInflictable), BingoTag.SpecialType.CODEC .optionalFieldOf("special_type", BingoTag.SpecialType.NONE) .forGetter(ActiveGoal::specialType), @@ -75,6 +77,7 @@ public record ActiveGoal( ComponentSerialization.TRUSTED_OPTIONAL_STREAM_CODEC, ActiveGoal::tooltip, ResourceLocation.STREAM_CODEC.apply(ByteBufCodecs::optional), ActiveGoal::tooltipIcon, GoalIcon.STREAM_CODEC, ActiveGoal::icon, + ByteBufCodecs.BOOL, ActiveGoal::isLockoutInflictable, BingoTag.SpecialType.STREAM_CODEC, ActiveGoal::specialType, ActiveGoal::forClient ); @@ -85,12 +88,13 @@ public static ActiveGoal forClient( Optional tooltip, Optional tooltipIcon, GoalIcon icon, + boolean isLockoutInflictable, BingoTag.SpecialType specialType ) { return new ActiveGoal( id, name, tooltip, tooltipIcon, icon, Map.of(), 1, Optional.empty(), AdvancementRequirements.EMPTY, - specialType, + isLockoutInflictable, specialType, EmptyProgressTracker.INSTANCE ); } diff --git a/common/src/main/java/io/github/gaming32/bingo/game/BingoBoard.java b/common/src/main/java/io/github/gaming32/bingo/game/BingoBoard.java index fa71a7f3..5ce422ac 100644 --- a/common/src/main/java/io/github/gaming32/bingo/game/BingoBoard.java +++ b/common/src/main/java/io/github/gaming32/bingo/game/BingoBoard.java @@ -36,7 +36,7 @@ import java.util.NavigableSet; import java.util.Queue; import java.util.Set; -import java.util.function.Predicate; +import java.util.function.BiPredicate; import java.util.stream.IntStream; public class BingoBoard { @@ -83,9 +83,10 @@ public static BingoBoard generate( int difficulty, int teamCount, RandomSource rand, - Predicate isAllowedGoal, + BiPredicate isAllowedGoal, Collection requiredGoals, HolderSet excludedTags, + boolean allowNeverGoalsInLockout, boolean allowsClientRequired, HolderLookup.Provider registries ) { @@ -98,6 +99,7 @@ public static BingoBoard generate( isAllowedGoal, requiredGoals, excludedTags, + allowNeverGoalsInLockout, allowsClientRequired ); for (int i = 0; i < size * size; i++) { @@ -122,9 +124,10 @@ public static GoalHolder[] generateGoals( int size, int difficulty, RandomSource rand, - Predicate isAllowedGoal, + BiPredicate isAllowedGoal, Collection requiredGoals, HolderSet excludedTags, + boolean allowNeverGoalsInLockout, boolean allowsClientRequired ) { final Queue requiredGoalQueue = new ArrayDeque<>(requiredGoals); @@ -176,7 +179,7 @@ public static GoalHolder[] generateGoals( final GoalHolder goalCandidate = possibleGoals.get(rand.nextInt(possibleGoals.size())); - if (!isAllowedGoal.test(goalCandidate)) { + if (!isAllowedGoal.test(goalCandidate, allowNeverGoalsInLockout)) { continue; } diff --git a/common/src/main/java/io/github/gaming32/bingo/game/BingoGame.java b/common/src/main/java/io/github/gaming32/bingo/game/BingoGame.java index c3c27bc8..3ce40fd9 100644 --- a/common/src/main/java/io/github/gaming32/bingo/game/BingoGame.java +++ b/common/src/main/java/io/github/gaming32/bingo/game/BingoGame.java @@ -540,7 +540,7 @@ private void updateTeamBoard(ServerPlayer player, ActiveGoal goal, boolean revok final boolean isLoss = isNever ^ revoke; board[index] = isLoss ? board[index].andNot(team) : board[index].or(team); notifyTeam(player, team, goal, player.server.getPlayerList(), index, isLoss); - if (!isLoss) { + if (!isLoss || isNever) { checkForWin(player.server.getPlayerList()); } } @@ -617,12 +617,16 @@ private void notifyTeam( teamComponent = teamComponent.copy().withStyle(playerTeam.getColor()); } final Component lockoutMessage = Bingo.translatable( - "bingo.goal_lost.lockout", + isLoss ? "bingo.goal_lost_other.lockout" : "bingo.goal_obtained.lockout", teamComponent, goal.name().copy().withStyle(ChatFormatting.GOLD) ); for (final ServerPlayer player : playerList.getPlayers()) { if (player.isAlliedTo(playerTeam)) continue; - player.playNotifySound(SoundEvents.RESPAWN_ANCHOR_DEPLETE.value(), SoundSource.MASTER, 0.5f, 1f); + player.playNotifySound( + isLoss ? SoundEvents.NOTE_BLOCK_CHIME.value() : SoundEvents.RESPAWN_ANCHOR_DEPLETE.value(), + SoundSource.MASTER, + 0.5f, 1f + ); player.sendSystemMessage(lockoutMessage); } } diff --git a/common/src/main/java/io/github/gaming32/bingo/game/mode/BingoGameMode.java b/common/src/main/java/io/github/gaming32/bingo/game/mode/BingoGameMode.java index e97391ee..5e6fd3cb 100644 --- a/common/src/main/java/io/github/gaming32/bingo/game/mode/BingoGameMode.java +++ b/common/src/main/java/io/github/gaming32/bingo/game/mode/BingoGameMode.java @@ -38,7 +38,7 @@ default CommandSyntaxException checkAllowedConfig(GameConfig config) { boolean canGetGoal(BingoBoard board, int index, BingoBoard.Teams team, boolean isNever); - default boolean isGoalAllowed(GoalHolder goal) { + default boolean isGoalAllowed(GoalHolder goal, boolean allowNeverGoalsInLockout) { return true; } diff --git a/common/src/main/java/io/github/gaming32/bingo/game/mode/BlackoutGameMode.java b/common/src/main/java/io/github/gaming32/bingo/game/mode/BlackoutGameMode.java index 62bb702c..efc641a3 100644 --- a/common/src/main/java/io/github/gaming32/bingo/game/mode/BlackoutGameMode.java +++ b/common/src/main/java/io/github/gaming32/bingo/game/mode/BlackoutGameMode.java @@ -34,7 +34,7 @@ public boolean canGetGoal(BingoBoard board, int index, BingoBoard.Teams team, bo } @Override - public boolean isGoalAllowed(GoalHolder goal) { + public boolean isGoalAllowed(GoalHolder goal, boolean allowNeverGoalsInLockout) { return goal.goal().getTags().stream().allMatch(g -> g.value().specialType() == BingoTag.SpecialType.NONE); } } diff --git a/common/src/main/java/io/github/gaming32/bingo/game/mode/LockoutGameMode.java b/common/src/main/java/io/github/gaming32/bingo/game/mode/LockoutGameMode.java index ab2b8ba7..c1739773 100644 --- a/common/src/main/java/io/github/gaming32/bingo/game/mode/LockoutGameMode.java +++ b/common/src/main/java/io/github/gaming32/bingo/game/mode/LockoutGameMode.java @@ -5,6 +5,7 @@ import io.github.gaming32.bingo.Bingo; import io.github.gaming32.bingo.data.BingoTag; import io.github.gaming32.bingo.data.goal.GoalHolder; +import io.github.gaming32.bingo.game.ActiveGoal; import io.github.gaming32.bingo.game.BingoBoard; import net.minecraft.ChatFormatting; import net.minecraft.world.scores.PlayerTeam; @@ -61,16 +62,23 @@ class TeamValue { } int totalHeld = 0; - for (final BingoBoard.Teams state : board.getStates()) { - if (state.any()) { - totalHeld++; - teams[state.getFirstIndex()].goalsHeld++; + boolean nonStalemateGoalsLeft = false; + for (int x = 0; x < board.getSize(); x++) { + for (int y = 0; y < board.getSize(); y++) { + BingoBoard.Teams state = board.getState(x, y); + if (state.count() == 1) { + totalHeld++; + teams[state.getFirstIndex()].goalsHeld++; + } else if (!nonStalemateGoalsLeft) { + ActiveGoal activeGoal = board.getGoal(x, y); + nonStalemateGoalsLeft = activeGoal.specialType() == BingoTag.SpecialType.NEVER && !activeGoal.isLockoutInflictable(); + } } } Arrays.sort(teams, Comparator.comparing(v -> -v.goalsHeld)); // Sort in reverse - final int totalGoals = board.getSize() * board.getSize(); + final int totalGoals = nonStalemateGoalsLeft ? board.getSize() * board.getSize() : totalHeld; if (totalGoals - totalHeld < teams[0].goalsHeld - teams[1].goalsHeld) { return teams[0].team; } @@ -91,12 +99,24 @@ class TeamValue { @Override public boolean canGetGoal(BingoBoard board, int index, BingoBoard.Teams team, boolean isNever) { - return !board.getStates()[index].any(); + if (!isNever) { + return !board.getStates()[index].any(); + } else { + return board.getStates()[index].count() > 1 && board.getStates()[index].and(team); + } } @Override - public boolean isGoalAllowed(GoalHolder goal) { - return goal.goal().getTags().stream().allMatch(g -> g.value().specialType() == BingoTag.SpecialType.NONE); + public boolean isGoalAllowed(GoalHolder goal, boolean allowNeverGoalsInLockout) { + return goal.goal().getTags().stream().allMatch((g) -> { + if (g.value().specialType() == BingoTag.SpecialType.NONE) { + return true; + } + if (g.value().specialType() == BingoTag.SpecialType.NEVER) { + return allowNeverGoalsInLockout; + } + return false; + }); } @Override diff --git a/common/src/main/resources/assets/bingo/lang/en_us.json b/common/src/main/resources/assets/bingo/lang/en_us.json index b495292f..c653229c 100644 --- a/common/src/main/resources/assets/bingo/lang/en_us.json +++ b/common/src/main/resources/assets/bingo/lang/en_us.json @@ -266,6 +266,7 @@ "bingo.goal_lost": "%s lost the goal %s for your team.", "bingo.goal_lost.single": "You lost the goal %s.", "bingo.goal_lost.lockout": "%s got the goal %s.", + "bingo.goal_lost_other.lockout": "%s lost the goal %s.", "bingo.duplicate_teams": "Cannot start a bingo with the same team twice (%s)!", "bingo.unknown_difficulty": "Unknown difficulty %s", "bingo.unknown_goal": "Unknown goal %s", diff --git a/common/src/main/resources/assets/bingo/lang/ru_ru.json b/common/src/main/resources/assets/bingo/lang/ru_ru.json index d2d403a3..cc765333 100644 --- a/common/src/main/resources/assets/bingo/lang/ru_ru.json +++ b/common/src/main/resources/assets/bingo/lang/ru_ru.json @@ -251,6 +251,7 @@ "bingo.goal_obtained": "%s получил цель %s для вашей команды.", "bingo.goal_lost": "%s потерял цель %s для вашей команды.", "bingo.goal_lost.lockout": "%s получил цель %s.", + "bingo.goal_lost_other.lockout": "%s потерял цель %s.", "bingo.duplicate_teams": "Нельзя дважды начинать игру в бинго с одной и той же командой (%s)!", "bingo.unknown_difficulty": "Неизвестная сложность %s", "bingo.unknown_goal": "Неизвестная цель %s", From 32630d6fe3b423285eac234a69b019ebc9b50aa9 Mon Sep 17 00:00:00 2001 From: rasmus Date: Tue, 28 Jan 2025 22:59:56 +0100 Subject: [PATCH 2/3] fix logic for detecting remaining lockout-inflictable goals --- .../io/github/gaming32/bingo/game/mode/LockoutGameMode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/io/github/gaming32/bingo/game/mode/LockoutGameMode.java b/common/src/main/java/io/github/gaming32/bingo/game/mode/LockoutGameMode.java index c1739773..599d851b 100644 --- a/common/src/main/java/io/github/gaming32/bingo/game/mode/LockoutGameMode.java +++ b/common/src/main/java/io/github/gaming32/bingo/game/mode/LockoutGameMode.java @@ -71,7 +71,7 @@ class TeamValue { teams[state.getFirstIndex()].goalsHeld++; } else if (!nonStalemateGoalsLeft) { ActiveGoal activeGoal = board.getGoal(x, y); - nonStalemateGoalsLeft = activeGoal.specialType() == BingoTag.SpecialType.NEVER && !activeGoal.isLockoutInflictable(); + nonStalemateGoalsLeft = activeGoal.specialType() != BingoTag.SpecialType.NEVER || activeGoal.isLockoutInflictable(); } } } From cb794bb05abc5adb3b280ea56c94529fbfcb8c68 Mon Sep 17 00:00:00 2001 From: rasmus Date: Fri, 31 Jan 2025 16:48:00 +0100 Subject: [PATCH 3/3] fix wrong translation key --- .../src/main/java/io/github/gaming32/bingo/game/BingoGame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/io/github/gaming32/bingo/game/BingoGame.java b/common/src/main/java/io/github/gaming32/bingo/game/BingoGame.java index 3ce40fd9..7ba62a51 100644 --- a/common/src/main/java/io/github/gaming32/bingo/game/BingoGame.java +++ b/common/src/main/java/io/github/gaming32/bingo/game/BingoGame.java @@ -617,7 +617,7 @@ private void notifyTeam( teamComponent = teamComponent.copy().withStyle(playerTeam.getColor()); } final Component lockoutMessage = Bingo.translatable( - isLoss ? "bingo.goal_lost_other.lockout" : "bingo.goal_obtained.lockout", + isLoss ? "bingo.goal_lost_other.lockout" : "bingo.goal_lost.lockout", teamComponent, goal.name().copy().withStyle(ChatFormatting.GOLD) ); for (final ServerPlayer player : playerList.getPlayers()) {