Skip to content
Open
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -28,7 +30,8 @@
public class TeamColors implements ArenaModuleInitializer {
public static final String ID = "team-colors";

public static final ArenaOptionType<BooleanArenaOption> TEAM_PREFIXES = ArenaOptionType.create("team-prefixes", BooleanArenaOption::new);
public static final ArenaOptionType<BooleanArenaOption> TEAM_PREFIXES = ArenaOptionType.create("team-prefixes",
BooleanArenaOption::new);

@EventHandler
public void onJoin(ArenaJoinEvent event) {
Expand All @@ -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()));
}
Expand All @@ -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)) {
Expand All @@ -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()) {
Expand All @@ -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());
}
}
Expand Down Expand Up @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -112,7 +113,7 @@ public Set<ArenaPlayer> 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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@ public final class ArenaOptionType<T extends ArenaOption> {
public static final ArenaOptionType<BooleanArenaOption> KEEP_EXPERIENCE = new ArenaOptionType<>("keep-experience", BooleanArenaOption::new);
public static final ArenaOptionType<BooleanArenaOption> HUNGER_DEPLETE = new ArenaOptionType<>("hunger-deplete", BooleanArenaOption::new);
public static final ArenaOptionType<BooleanArenaOption> TEAM_SELECTION = new ArenaOptionType<>("team-selection", BooleanArenaOption::new);


public static final ArenaOptionType<EnumArenaOption<DamageOption>> DAMAGE_PLAYERS = new ArenaOptionType<>("damage-players", params -> new EnumArenaOption<>(params, DamageOption.class, "option"));
public static final ArenaOptionType<EnumArenaOption<DamageOption>> DAMAGE_ENTITIES = new ArenaOptionType<>("damage-entities", params -> new EnumArenaOption<>(params, DamageOption.class, "option"));
public static final ArenaOptionType<EnumArenaOption<NameTagOption>> NAME_TAG_VISIBILITY = new ArenaOptionType<>("name-tag-visibility", params -> new EnumArenaOption<>(params, NameTagOption.class, "option"));

private final String name;
private final Function<Map<String, String>, T> factory;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.battleplugins.arena.options;

public enum NameTagOption {
FOR_OTHER_TEAMS,
NEVER,
ALWAYS,
FOR_OWN_TEAM
}
1 change: 1 addition & 0 deletions plugin/src/main/resources/arenas/deathmatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down