diff --git a/module/team-colors/src/main/java/org/battleplugins/arena/module/teamcolors/TeamColors.java b/module/team-colors/src/main/java/org/battleplugins/arena/module/teamcolors/TeamColors.java index e9326b89..39f4fdd7 100644 --- a/module/team-colors/src/main/java/org/battleplugins/arena/module/teamcolors/TeamColors.java +++ b/module/team-colors/src/main/java/org/battleplugins/arena/module/teamcolors/TeamColors.java @@ -13,7 +13,9 @@ import org.battleplugins.arena.module.ArenaModule; import org.battleplugins.arena.module.ArenaModuleInitializer; import org.battleplugins.arena.options.ArenaOptionType; +import org.battleplugins.arena.options.NameTagOption; import org.battleplugins.arena.options.types.BooleanArenaOption; +import org.battleplugins.arena.options.types.EnumArenaOption; import org.battleplugins.arena.team.ArenaTeam; import org.battleplugins.arena.team.ArenaTeams; import org.bukkit.Bukkit; @@ -28,7 +30,8 @@ public class TeamColors implements ArenaModuleInitializer { public static final String ID = "team-colors"; - public static final ArenaOptionType TEAM_PREFIXES = ArenaOptionType.create("team-prefixes", BooleanArenaOption::new); + public static final ArenaOptionType TEAM_PREFIXES = ArenaOptionType.create("team-prefixes", + BooleanArenaOption::new); @EventHandler public void onJoin(ArenaJoinEvent event) { @@ -40,10 +43,17 @@ public void onJoin(ArenaJoinEvent event) { for (ArenaTeam team : event.getCompetition().getTeamManager().getTeams()) { // Register a new Bukkit team for each team in the competition Team bukkitTeam = event.getPlayer().getScoreboard().getTeam("ba-" + team.getName()); + if (bukkitTeam == null) { bukkitTeam = event.getPlayer().getScoreboard().registerNewTeam("ba-" + team.getName()); bukkitTeam.displayName(team.getFormattedName()); bukkitTeam.color(NamedTextColor.nearestTo(team.getTextColor())); + + NameTagOption visibilityOption = event.getCompetition().option(ArenaOptionType.NAME_TAG_VISIBILITY) + .map(EnumArenaOption::getOption) + .orElse(NameTagOption.ALWAYS); + bukkitTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, convertNameTagOption(visibilityOption)); + if (showTeamPrefixes(event.getCompetition(), team)) { bukkitTeam.prefix(Component.text("[" + team.getName() + "] ", team.getTextColor())); } @@ -57,6 +67,21 @@ public void onJoin(ArenaJoinEvent event) { }); } + private Team.OptionStatus convertNameTagOption(NameTagOption option) { + switch (option) { + case NEVER: + return Team.OptionStatus.NEVER; + case ALWAYS: + return Team.OptionStatus.ALWAYS; + case FOR_OWN_TEAM: + return Team.OptionStatus.FOR_OWN_TEAM; + case FOR_OTHER_TEAMS: + return Team.OptionStatus.FOR_OTHER_TEAMS; + default: + return Team.OptionStatus.ALWAYS; + } + } + @EventHandler public void onPhaseStart(ArenaPhaseStartEvent event) { if (!event.getArena().isModuleEnabled(ID)) { @@ -67,6 +92,11 @@ public void onPhaseStart(ArenaPhaseStartEvent event) { // Scoreboards may change when phases change, so update // team colors in player scoreboards when this happens if (event.getCompetition() instanceof LiveCompetition liveCompetition) { + + NameTagOption visibilityOption = liveCompetition.option(ArenaOptionType.NAME_TAG_VISIBILITY) + .map(EnumArenaOption::getOption) + .orElse(NameTagOption.ALWAYS); + for (ArenaPlayer arenaPlayer : liveCompetition.getPlayers()) { Player player = arenaPlayer.getPlayer(); for (ArenaTeam team : liveCompetition.getTeamManager().getTeams()) { @@ -75,12 +105,16 @@ public void onPhaseStart(ArenaPhaseStartEvent event) { bukkitTeam = player.getScoreboard().registerNewTeam("ba-" + team.getName()); bukkitTeam.displayName(team.getFormattedName()); bukkitTeam.color(NamedTextColor.nearestTo(team.getTextColor())); + + bukkitTeam.setOption(Team.Option.NAME_TAG_VISIBILITY, + convertNameTagOption(visibilityOption)); if (showTeamPrefixes(liveCompetition, team)) { bukkitTeam.prefix(Component.text("[" + team.getName() + "] ", team.getTextColor())); } } - for (ArenaPlayer teamPlayer : arenaPlayer.getCompetition().getTeamManager().getPlayersOnTeam(team)) { + for (ArenaPlayer teamPlayer : arenaPlayer.getCompetition().getTeamManager() + .getPlayersOnTeam(team)) { bukkitTeam.addPlayer(teamPlayer.getPlayer()); } } @@ -134,7 +168,8 @@ private void joinTeam(Player player, LiveCompetition competition, ArenaTeam a Team team = competitionPlayer.getScoreboard().getTeam("ba-" + arenaTeam.getName()); if (team == null) { - BattleArena.getInstance().warn("Team {} does not have a Bukkit team registered for {}!", arenaTeam.getName(), player.getName()); + BattleArena.getInstance().warn("Team {} does not have a Bukkit team registered for {}!", + arenaTeam.getName(), player.getName()); continue; } diff --git a/plugin/src/main/java/org/battleplugins/arena/competition/CompetitionListener.java b/plugin/src/main/java/org/battleplugins/arena/competition/CompetitionListener.java index accafc8b..10271bdc 100644 --- a/plugin/src/main/java/org/battleplugins/arena/competition/CompetitionListener.java +++ b/plugin/src/main/java/org/battleplugins/arena/competition/CompetitionListener.java @@ -79,8 +79,8 @@ public void onDeath(PlayerDeathEvent event, ArenaPlayer player) { return; } - // Check if the killer is in the same arena - if (killerPlayer.getCompetition().equals(this.competition)) { + // Check if the killer is in the same arena and is not the same player + if (killerPlayer.getCompetition().equals(this.competition) && !killerPlayer.equals(player)) { this.competition.getArena().getEventManager().callEvent(new ArenaKillEvent(killerPlayer, player)); } } diff --git a/plugin/src/main/java/org/battleplugins/arena/competition/victory/types/HighestStatCondition.java b/plugin/src/main/java/org/battleplugins/arena/competition/victory/types/HighestStatCondition.java index 03bec3fc..58740df4 100644 --- a/plugin/src/main/java/org/battleplugins/arena/competition/victory/types/HighestStatCondition.java +++ b/plugin/src/main/java/org/battleplugins/arena/competition/victory/types/HighestStatCondition.java @@ -11,6 +11,7 @@ import org.battleplugins.arena.stat.ArenaStats; import org.battleplugins.arena.stat.StatHolder; import org.battleplugins.arena.team.ArenaTeam; +import org.bukkit.Bukkit; import java.util.Set; import java.util.stream.Collectors; @@ -112,7 +113,7 @@ public Set identifyPotentialVictors() { // the victory based on whether the team won. If the player is to // win individually, their team should just contain them, or be empty. ArenaTeam team = player.getTeam(); - if (team == null || this.getCompetition().getArena().getTeams().isNonTeamGame()) { + if (team == null || this.getCompetition().getArena().getTeams().isNonTeamGame() || !this.teamStats) { return Stream.of(player); } diff --git a/plugin/src/main/java/org/battleplugins/arena/options/ArenaOptionType.java b/plugin/src/main/java/org/battleplugins/arena/options/ArenaOptionType.java index 5595ee32..8b59f24b 100644 --- a/plugin/src/main/java/org/battleplugins/arena/options/ArenaOptionType.java +++ b/plugin/src/main/java/org/battleplugins/arena/options/ArenaOptionType.java @@ -28,9 +28,11 @@ public final class ArenaOptionType { public static final ArenaOptionType KEEP_EXPERIENCE = new ArenaOptionType<>("keep-experience", BooleanArenaOption::new); public static final ArenaOptionType HUNGER_DEPLETE = new ArenaOptionType<>("hunger-deplete", BooleanArenaOption::new); public static final ArenaOptionType TEAM_SELECTION = new ArenaOptionType<>("team-selection", BooleanArenaOption::new); + public static final ArenaOptionType> DAMAGE_PLAYERS = new ArenaOptionType<>("damage-players", params -> new EnumArenaOption<>(params, DamageOption.class, "option")); public static final ArenaOptionType> DAMAGE_ENTITIES = new ArenaOptionType<>("damage-entities", params -> new EnumArenaOption<>(params, DamageOption.class, "option")); + public static final ArenaOptionType> NAME_TAG_VISIBILITY = new ArenaOptionType<>("name-tag-visibility", params -> new EnumArenaOption<>(params, NameTagOption.class, "option")); private final String name; private final Function, T> factory; diff --git a/plugin/src/main/java/org/battleplugins/arena/options/NametagOption.java b/plugin/src/main/java/org/battleplugins/arena/options/NametagOption.java new file mode 100644 index 00000000..eebad332 --- /dev/null +++ b/plugin/src/main/java/org/battleplugins/arena/options/NametagOption.java @@ -0,0 +1,8 @@ +package org.battleplugins.arena.options; + +public enum NameTagOption { + FOR_OTHER_TEAMS, + NEVER, + ALWAYS, + FOR_OWN_TEAM +} diff --git a/plugin/src/main/resources/arenas/deathmatch.yml b/plugin/src/main/resources/arenas/deathmatch.yml index a58a1651..7664d674 100644 --- a/plugin/src/main/resources/arenas/deathmatch.yml +++ b/plugin/src/main/resources/arenas/deathmatch.yml @@ -48,6 +48,7 @@ options: - keep-inventory{enabled=true} - keep-experience{enabled=true} - class-equip-only-selects{enabled=true} + - name-tag-visibility{option=NEVER} initial-phase: waiting phases: waiting: