Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/main/java/net/fameless/forcebattle/ForceBattle.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import net.fameless.forcebattle.game.ObjectiveManager;
import net.fameless.forcebattle.game.Timer;
import net.fameless.forcebattle.gui.GUIListener;
import net.fameless.forcebattle.scoreboard.ScoreboardManager;
import net.fameless.forcebattle.tablist.TablistManager;
import net.fameless.forcebattle.util.BukkitUtil;
import net.fameless.forcebattle.util.ResourceUtil;
Expand Down Expand Up @@ -93,7 +94,7 @@ private void initCore() {
Command.createInstances();
BossbarManager.runTask();
TablistManager.startUpdating();
//ScoreboardManager.startUpdater();
ScoreboardManager.startUpdater();
PluginUpdater.checkForUpdate();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ public enum Setting {
NO_DUPLICATE_OBJECTIVES,
SIMPLIFIED_OBJECTIVES,
EXTRA_TEAM_OBJECTIVE,
SHOW_SCOREBOARD,

EXCLUDE_MUSIC_DISCS,
EXCLUDE_BANNER_PATTERNS,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,8 @@
}

//TODO better tablist
//TODO scoreboard which shows teammate obj
//TODO click im chat fixen
//TODO evtl /item => zeigt rezept an => wenn gui system done is
//TODO commands von cords ausführen
//TODO commands von cords ausführen (for spawn)

Check warning on line 80 in src/main/java/net/fameless/forcebattle/game/GameListener.java

View check run for this annotation

codefactor.io / CodeFactor

src/main/java/net/fameless/forcebattle/game/GameListener.java#L80

Resolve unexpected comment. (com.puppycrawl.tools.checkstyle.checks.TodoCommentCheck)

@EventHandler
public void onPlayerLogin(AsyncPlayerPreLoginEvent event) {
Expand Down
128 changes: 56 additions & 72 deletions src/main/java/net/fameless/forcebattle/game/NametagManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import net.fameless.forcebattle.configuration.SettingsManager;
import net.fameless.forcebattle.game.data.FBAdvancement;
import net.fameless.forcebattle.player.BattlePlayer;
import net.fameless.forcebattle.scoreboard.ScoreboardManager;
import net.fameless.forcebattle.util.BattleType;
import net.fameless.forcebattle.util.BukkitUtil;
import net.fameless.forcebattle.util.StringUtility;
Expand All @@ -17,92 +18,75 @@

public class NametagManager {

private static Scoreboard scoreboard = null;

private static Scoreboard getCustomScoreboard() {
if (scoreboard == null) {
scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
}
return scoreboard;
}

public static void runTask() {
Bukkit.getScheduler().runTaskTimer(ForceBattle.get(), () -> BattlePlayer.BATTLE_PLAYERS.forEach(NametagManager::updateNametag), 0, 3);
Bukkit.getScheduler().runTaskTimer(ForceBattle.get(), () ->
BattlePlayer.BATTLE_PLAYERS.forEach(NametagManager::updateNametag), 0, 3);
}

private static void updateNametag(@NotNull BattlePlayer battlePlayer) {
if (battlePlayer.isOffline()) {
Team team = getCustomScoreboard().getTeam(battlePlayer.getUuid().toString());
if (team != null) {
team.unregister();
}
for (Player target : Bukkit.getOnlinePlayers()) {
Team targetTeam = target.getScoreboard().getTeam(battlePlayer.getUuid().toString());
if (targetTeam != null && targetTeam.hasEntry(battlePlayer.getName())) {
targetTeam.removeEntry(battlePlayer.getName());
}
Player player = battlePlayer.getPlayer();
if (player == null) return;

Scoreboard scoreboard = ScoreboardManager.getOrCreateScoreboard(battlePlayer);

for (BattlePlayer targetPlayer : BattlePlayer.BATTLE_PLAYERS) {
Player target = targetPlayer.getPlayer();
if (target == null) continue;

Team team = scoreboard.getTeam(targetPlayer.getUuid().toString());
if (team == null) {
team = scoreboard.registerNewTeam(targetPlayer.getUuid().toString());
team.addEntry(targetPlayer.getName());
}
}

Team team = getCustomScoreboard().getTeam(battlePlayer.getUuid().toString());
if (team == null) {
team = getCustomScoreboard().registerNewTeam(battlePlayer.getUuid().toString());
}
if (!team.hasEntry(battlePlayer.getName())) {
team.addEntry(battlePlayer.getName());
}
battlePlayer.setScoreboard(getCustomScoreboard());
StringBuilder suffix = new StringBuilder(" ");

StringBuilder suffix = new StringBuilder(" ");
if (targetPlayer.isExcluded()) {
suffix.append(Caption.getAsLegacy("excluded"));
} else if (!ForceBattle.getTimer().isRunning()) {
suffix.append(Caption.getAsLegacy("waiting"));
} else {
var objective = targetPlayer.getObjective();
String objectiveString;

if (battlePlayer.isExcluded()) {
suffix.append(Caption.getAsLegacy("excluded"));
team.setSuffix(suffix.toString());
return;
}
if (BukkitUtil.convertObjective(BattleType.FORCE_ADVANCEMENT, objective.getObjectiveString()) instanceof FBAdvancement advancement) {
objectiveString = advancement.name;
} else {
objectiveString = StringUtility.formatName(objective.getObjectiveString());
}

if (!ForceBattle.getTimer().isRunning()) {
suffix.append(Caption.getAsLegacy("waiting"));
team.setSuffix(suffix.toString());
return;
}
if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES)) {
suffix.append(" ")
.append(ChatColor.GRAY)
.append(objective.getBattleType().getPrefix())
.append(ChatColor.DARK_GRAY)
.append(" » ")
.append(ChatColor.BLUE)
.append(objectiveString);
}

String objectiveString;
Objective objective = battlePlayer.getObjective();
if (BukkitUtil.convertObjective(BattleType.FORCE_ADVANCEMENT, objective.getObjectiveString()) instanceof FBAdvancement advancement) {
objectiveString = advancement.name;
} else {
objectiveString = StringUtility.formatName(objective.getObjectiveString());
}
if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES)
&& !SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) {
suffix.append(ChatColor.DARK_GRAY).append(" |");
}

if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES)) {
suffix
.append(" ")
.append(ChatColor.GRAY)
.append(objective.getBattleType().getPrefix())
.append(ChatColor.DARK_GRAY)
.append(" » ")
.append(ChatColor.BLUE)
.append(
objectiveString);
}
if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) {
suffix.append(" ").append(ChatColor.GRAY).append("Points")
.append(ChatColor.DARK_GRAY).append(" » ")
.append(ChatColor.BLUE).append(targetPlayer.getPoints());
}

if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES) && !SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) {
suffix.append(ChatColor.DARK_GRAY).append(" |");
}
var teamData = targetPlayer.getTeam();
if (teamData != null) {
suffix.append(ChatColor.DARK_GRAY).append(" | ").append(ChatColor.GRAY)
.append("Team").append(ChatColor.DARK_GRAY).append(" » ")
.append(ChatColor.BLUE).append(teamData.getId());
}
}

if (!SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) {
suffix.append(" ").append(ChatColor.GRAY).append("Points").append(ChatColor.DARK_GRAY).append(" » ")
.append(ChatColor.BLUE).append(battlePlayer.getPoints());
team.setSuffix(suffix.toString());
}

net.fameless.forcebattle.game.Team playerTeam = battlePlayer.getTeam();
if (playerTeam != null) {
suffix.append(ChatColor.DARK_GRAY).append(" | ").append(ChatColor.GRAY).append("Team").append(ChatColor.DARK_GRAY).append(" » ")
.append(ChatColor.BLUE).append(playerTeam.getId());
}
String formattedSuffix = suffix.toString();
team.setSuffix(formattedSuffix);
player.setScoreboard(scoreboard);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ public enum SettingButton {
"gui.simplified_objectives_name", "gui.simplified_objectives_lore", "notification.simplified_objectives_changed"),
EXTRA_TEAM_OBJECTIVE(33, Material.ALLAY_SPAWN_EGG, SettingsManager.Setting.EXTRA_TEAM_OBJECTIVE, false,
"gui.extra_team_objective_name", "gui.extra_team_objective_lore", "notification.extra_team_objective_changed"),
SHOW_SCOREBOARD(34, Material.ARMOR_STAND, SettingsManager.Setting.SHOW_SCOREBOARD, false,
"gui.show_scoreboard_name", "gui.show_scoreboard_lore", "notification.show_scoreboard_changed"),

RESET(35, Material.BARRIER, null, false, ChatColor.RED + "RESET", null, null);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package net.fameless.forcebattle.scoreboard;

import net.fameless.forcebattle.ForceBattle;
import net.fameless.forcebattle.configuration.SettingsManager;
import net.fameless.forcebattle.game.Team;
import net.fameless.forcebattle.player.BattlePlayer;
import net.fameless.forcebattle.util.BattleType;
import net.fameless.forcebattle.util.StringUtility;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
Expand All @@ -13,79 +15,121 @@
import java.util.HashMap;
import java.util.Map;


public class ScoreboardManager {

private static final Map<BattlePlayer, Scoreboard> SCOREBOARDS = new HashMap<>();
private static final Map<BattlePlayer, Map<Integer, String>> LAST_LINES = new HashMap<>();

public static void startUpdater() {
Bukkit.getLogger().info("[ForceBattle] Scoreboard updater started.");

Bukkit.getScheduler().runTaskTimer(ForceBattle.get(), ScoreboardManager::updateAll, 1L, 1L);
Bukkit.getScheduler().runTaskTimer(ForceBattle.get(), ScoreboardManager::updateAll, 20L, 20L);
}

public static void updateAll() {
for (BattlePlayer battlePlayer : BattlePlayer.getOnlinePlayers()) {
if (battlePlayer.isExcluded() || !ForceBattle.getTimer().isRunning()) {
boolean shouldHaveScoreboard = !battlePlayer.isExcluded() && ForceBattle.getTimer().isRunning();

if (shouldHaveScoreboard && SettingsManager.isEnabled(SettingsManager.Setting.SHOW_SCOREBOARD)) {
updateScoreboard(battlePlayer);
} else if (SCOREBOARDS.containsKey(battlePlayer) && !SettingsManager.isEnabled(SettingsManager.Setting.SHOW_SCOREBOARD)) {
removeScoreboard(battlePlayer);
continue;
}
updateScoreboard(battlePlayer);
}
}

public static Scoreboard getOrCreateScoreboard(BattlePlayer player) {
return SCOREBOARDS.computeIfAbsent(player, p -> Bukkit.getScoreboardManager().getNewScoreboard());
}

public static void updateScoreboard(BattlePlayer player) {
Scoreboard scoreboard = SCOREBOARDS.computeIfAbsent(player,
p -> Bukkit.getScoreboardManager().getNewScoreboard());
Scoreboard scoreboard = getOrCreateScoreboard(player);

Objective obj = scoreboard.getObjective("fb_info");
if (obj == null) {
obj = scoreboard.registerNewObjective("fb_info", "dummy",
ChatColor.GOLD + "" + ChatColor.BOLD + "ForceBattle");
obj.setDisplaySlot(DisplaySlot.SIDEBAR);
}

scoreboard.getEntries().forEach(scoreboard::resetScores);
Map<Integer, String> last = LAST_LINES.computeIfAbsent(player, p -> new HashMap<>());
Map<Integer, String> newLines = new HashMap<>();

int line = 15;

var selfObjective = player.getObjective();
if (selfObjective != null) {
obj.getScore(ChatColor.YELLOW + "Your Objective:").setScore(line--);
obj.getScore(ChatColor.WHITE + StringUtility.formatName(selfObjective.getObjectiveString())).setScore(line--);
newLines.put(line--, ChatColor.YELLOW + "Your Objective:");
newLines.put(line--, ChatColor.WHITE + getObjectiveDisplay(selfObjective));
} else {
obj.getScore(ChatColor.GRAY + "No current objective").setScore(line--);
newLines.put(line--, ChatColor.GRAY + "No current objective");
}

obj.getScore(" ").setScore(line--);
newLines.put(line--, " ");

if (player.isInTeam()) {
Team team = player.getTeam();
obj.getScore(ChatColor.AQUA + "Your Team: " + ChatColor.WHITE + team.getId()).setScore(line--);

var teamObjective = team.getObjective();
if (teamObjective != null && SettingsManager.isEnabled(SettingsManager.Setting.EXTRA_TEAM_OBJECTIVE)) {
newLines.put(line--, ChatColor.YELLOW + "Team Objective:");
newLines.put(line--, ChatColor.WHITE + getObjectiveDisplay(teamObjective));
newLines.put(line--, " ");
}

if (team.getPlayers().size() > 1) {
newLines.put(line--, ChatColor.YELLOW + "Teammates:");
}

for (BattlePlayer teammate : team.getPlayers()) {
if (teammate.equals(player)) continue;

newLines.put(line--, ChatColor.GRAY + "• " + ChatColor.AQUA + teammate.getName());

var teammateObjective = teammate.getObjective();
String objName = teammateObjective != null
? StringUtility.formatName(teammateObjective.getObjectiveString())
? getObjectiveDisplay(teammateObjective)
: "None";

String display = ChatColor.GRAY + "• " + ChatColor.YELLOW + teammate.getName() +
ChatColor.WHITE + ": " +
(objName.length() > 16 ? objName.substring(0, 13) + "..." : objName);
newLines.put(line--, ChatColor.WHITE + " " +
(objName.length() > 24 ? objName.substring(0, 21) + "..." : objName));
}
}

obj.getScore(display).setScore(line--);
for (var entry : last.entrySet()) {
if (!newLines.containsValue(entry.getValue())) {
scoreboard.resetScores(entry.getValue());
}
}

for (var entry : newLines.entrySet()) {
if (!entry.getValue().equals(last.get(entry.getKey()))) {
obj.getScore(entry.getValue()).setScore(entry.getKey());
}
} else {
obj.getScore(ChatColor.GRAY + "Not in a team").setScore(line--);
}

player.getPlayer().setScoreboard(scoreboard);
LAST_LINES.put(player, newLines);

if (player.getPlayer().getScoreboard() != scoreboard) {
player.getPlayer().setScoreboard(scoreboard);
}
}

Check notice on line 116 in src/main/java/net/fameless/forcebattle/scoreboard/ScoreboardManager.java

View check run for this annotation

codefactor.io / CodeFactor

src/main/java/net/fameless/forcebattle/scoreboard/ScoreboardManager.java#L44-L116

Complex Method
private static String getObjectiveDisplay(net.fameless.forcebattle.game.Objective objective) {
String icon = switch (objective.getBattleType()) {
case BattleType.FORCE_ITEM -> "✦";
case BattleType.FORCE_MOB -> "☠";
case BattleType.FORCE_ADVANCEMENT -> "★";
case BattleType.FORCE_HEIGHT -> "⛰";
case BattleType.FORCE_COORDS -> "⚑";
case BattleType.FORCE_STRUCTURE -> "⌂";
case BattleType.FORCE_BIOME -> "☀";
};
return icon + " " + StringUtility.formatName(objective.getObjectiveString());
}

public static void removeScoreboard(BattlePlayer player) {
player.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());
SCOREBOARDS.remove(player);
Bukkit.getLogger().info("[ForceBattle] Removed scoreboard for " + player.getName());
LAST_LINES.remove(player);
}
}
3 changes: 3 additions & 0 deletions src/main/resources/languages/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
"gui.simplified_objectives_lore" : "<br><gray>Click to toggle simplified objectives.<br><br><blue>Current Status<dark_gray>: <state>",
"gui.extra_team_objective_name" : "<blue>Extra Team Objective",
"gui.extra_team_objective_lore" : "<br><gray>Click to toggle the extra team objective.<br><br><blue>Current Status<dark_gray>: <state>",
"gui.show_scoreboard_name" : "<blue>Show Scoreboard",
"gui.show_scoreboard_lore" : "<br><gray>Click to toggle the scoreboard.<br><br><blue>Current Status<dark_gray>: <state>",
"gui.exclude_music_discs_name" : "<blue>Exclude Music Discs",
"gui.exclude_music_discs_lore" : "<br><gray>Click to toggle excluding Music Discs.<br><br><blue>Current Status<dark_gray>: <state>",
"gui.exclude_banner_patterns_name" : "<blue>Exclude Banner Patterns",
Expand Down Expand Up @@ -75,6 +77,7 @@
"notification.no_duplicate_objectives_changed" : "<prefix><blue>No duplicate objectives <gray>has been set to <blue><state>!",
"notification.simplified_objectives_changed" : "<prefix><blue>Simplified objectives <gray>have been set to <blue><state>!",
"notification.extra_team_objective_changed" : "<prefix><blue>Extra team objective <gray>has been set to <blue><state>!",
"notification.show_scoreboard_changed" : "<prefix><blue>Show scoreboard <gray>has been set to <blue><state>!",
"notification.exclude_music_discs_changed" : "<prefix><blue>Exclude Music Discs <gray>has been set to <blue><state>!",
"notification.exclude_banner_patterns_changed" : "<prefix><blue>Exclude Banner Patterns <gray>has been set to <blue><state>!",
"notification.exclude_armor_templates_changed" : "<prefix><blue>Exclude Armor Templates <gray>has been set to <blue><state>!",
Expand Down
Loading