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
124 changes: 91 additions & 33 deletions src/main/java/net/fameless/forcebattle/bossbar/BossbarManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import net.fameless.forcebattle.ForceBattle;
import net.fameless.forcebattle.caption.Caption;
import net.fameless.forcebattle.configuration.SettingsManager;
import net.fameless.forcebattle.game.Objective;
import net.fameless.forcebattle.game.Team;
import net.fameless.forcebattle.player.BattlePlayer;
import net.fameless.forcebattle.util.Format;
import net.kyori.adventure.bossbar.BossBar;
Expand All @@ -17,66 +19,122 @@

public class BossbarManager {

private static final HashMap<BattlePlayer, BossBar> lastBossbarMap = new HashMap<>();
private static final HashMap<BattlePlayer, BossBar> lastPlayerBarMap = new HashMap<>();
private static final HashMap<BattlePlayer, BossBar> lastTeamBarMap = new HashMap<>();

public static void runTask() {
TimerTask task = new TimerTask() {
@Override
public void run() {
boolean timerRunning = ForceBattle.getTimer().isRunning();

for (BattlePlayer battlePlayer : BattlePlayer.getOnlinePlayers()) {
if (battlePlayer.isExcluded()) {
hideBossBar(battlePlayer);
hideBossBars(battlePlayer);
continue;
}

BossBar playerBar = BossBar.bossBar(
getPlayerObjectiveTitle(battlePlayer),
1,
BossBar.Color.BLUE,
BossBar.Overlay.PROGRESS
);
updateBossBar(battlePlayer, playerBar, lastPlayerBarMap);

if (!timerRunning) {
hideBossBar(battlePlayer, lastTeamBarMap);
continue;
}

Component bossbarTitle = getBossbarTitle(battlePlayer);
BossBar bossBar = BossBar.bossBar(bossbarTitle, 1, BossBar.Color.BLUE, BossBar.Overlay.PROGRESS);
if (battlePlayer.isInTeam()) {
Team team = battlePlayer.getTeam();
Objective teamObjective = team.getObjective();

updateBossBar(battlePlayer, bossBar);
if (teamObjective != null) {
BossBar teamBar = BossBar.bossBar(
getTeamObjectiveTitle(team),
1,
BossBar.Color.PURPLE,
BossBar.Overlay.PROGRESS
);
updateBossBar(battlePlayer, teamBar, lastTeamBarMap);
} else {
hideBossBar(battlePlayer, lastTeamBarMap);
}
} else {
hideBossBar(battlePlayer, lastTeamBarMap);
}
}
}
};
new Timer("forcebattle/bossbar").scheduleAtFixedRate(task, 150, 150);
}

private static void hideBossBar(BattlePlayer battlePlayer) {
if (lastBossbarMap.containsKey(battlePlayer)) {
battlePlayer.getAudience().hideBossBar(lastBossbarMap.get(battlePlayer));
lastBossbarMap.remove(battlePlayer);
private static void hideBossBars(BattlePlayer battlePlayer) {
hideBossBar(battlePlayer, lastPlayerBarMap);
hideBossBar(battlePlayer, lastTeamBarMap);
}

private static void hideBossBar(BattlePlayer battlePlayer, HashMap<BattlePlayer, BossBar> map) {
if (map.containsKey(battlePlayer)) {
battlePlayer.getAudience().hideBossBar(map.get(battlePlayer));
map.remove(battlePlayer);
}
}

private static @NotNull Component getBossbarTitle(BattlePlayer battlePlayer) {
if (ForceBattle.getTimer().isRunning()) {
boolean isPlayerInTeam = battlePlayer.isInTeam();
int points = isPlayerInTeam ? battlePlayer.getTeam().getPoints() : battlePlayer.getPoints();

if (SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) {
return Caption.of(
"bossbar.format_hide_points",
TagResolver.resolver("battletype", Tag.inserting(Component.text(battlePlayer.getObjective().getBattleType().getPrefix()))),
TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(battlePlayer.getObjective().getObjectiveString()))))
);
}
private static @NotNull Component getPlayerObjectiveTitle(BattlePlayer battlePlayer) {
if (!ForceBattle.getTimer().isRunning()) return Caption.of("waiting");

Objective playerObjective = battlePlayer.getObjective();
if (playerObjective == null) return Caption.of("waiting");

boolean isPlayerInTeam = battlePlayer.isInTeam();
int points = isPlayerInTeam ? battlePlayer.getTeam().getPoints() : battlePlayer.getPoints();

if (SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) {
return Caption.of(
"bossbar.format_hide_points",
TagResolver.resolver("battletype", Tag.inserting(Component.text(playerObjective.getBattleType().getPrefix()))),
TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(playerObjective.getObjectiveString()))))
);
}

return Caption.of(
"bossbar.format",
TagResolver.resolver("battletype", Tag.inserting(Component.text(playerObjective.getBattleType().getPrefix()))),
TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(playerObjective.getObjectiveString())))),
TagResolver.resolver("pointstype", Tag.inserting(Component.text(isPlayerInTeam ? "Team-Points" : "Points"))),
TagResolver.resolver("points", Tag.inserting(Component.text(points)))
);
}

private static @NotNull Component getTeamObjectiveTitle(Team team) {
Objective teamObjective = team.getObjective();
if (teamObjective == null) return Component.empty();

if (SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS)) {
return Caption.of(
"bossbar.format",
TagResolver.resolver("battletype", Tag.inserting(Component.text(battlePlayer.getObjective().getBattleType().getPrefix()))),
TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(battlePlayer.getObjective().getObjectiveString())))),
TagResolver.resolver("pointstype", Tag.inserting(Component.text(isPlayerInTeam ? "Team-Points" : "Points"))),
TagResolver.resolver("points", Tag.inserting(Component.text(points)))
"bossbar.team_format_hide_points",
TagResolver.resolver("battletype", Tag.inserting(Component.text(teamObjective.getBattleType().getPrefix()))),
TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(teamObjective.getObjectiveString()))))
);
} else {
return Caption.of("waiting");
}

return Caption.of(
"bossbar.team_format",
TagResolver.resolver("battletype", Tag.inserting(Component.text(teamObjective.getBattleType().getPrefix()))),
TagResolver.resolver("objective", Tag.inserting(Component.text(Format.formatName(teamObjective.getObjectiveString())))),
TagResolver.resolver("pointstype", Tag.inserting(Component.text("Team-Points"))),
TagResolver.resolver("points", Tag.inserting(Component.text(team.getPoints())))
);
}

private static void updateBossBar(BattlePlayer battlePlayer, BossBar bossBar) {
if (lastBossbarMap.containsKey(battlePlayer)) {
battlePlayer.getAudience().hideBossBar(lastBossbarMap.get(battlePlayer));
private static void updateBossBar(BattlePlayer battlePlayer, BossBar bossBar, HashMap<BattlePlayer, BossBar> map) {
if (map.containsKey(battlePlayer)) {
battlePlayer.getAudience().hideBossBar(map.get(battlePlayer));
}
battlePlayer.getAudience().showBossBar(bossBar);
lastBossbarMap.put(battlePlayer, bossBar);
map.put(battlePlayer, bossBar);
}

}
16 changes: 0 additions & 16 deletions src/main/java/net/fameless/forcebattle/caption/Caption.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.google.gson.JsonObject;
import lombok.Getter;
import net.fameless.forcebattle.ForceBattle;
import net.fameless.forcebattle.configuration.SettingsManager;
import net.fameless.forcebattle.event.LanguageChangeEvent;
import net.fameless.forcebattle.util.Format;
import net.kyori.adventure.text.Component;
Expand Down Expand Up @@ -47,21 +46,6 @@ private Caption() {
private static @NotNull String replaceDefaults(String input) {
input = input.replace("<prefix>", getString("prefix"))
.replace("<time>", Format.formatTime(ForceBattle.getTimer().getTime()))
.replace("<force-item-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.FORCE_ITEM) ? "active.true" : "active.false"))
.replace("<force-mob-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.FORCE_MOB) ? "active.true" : "active.false"))
.replace("<force-biome-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.FORCE_BIOME) ? "active.true" : "active.false"))
.replace("<force-advancement-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.FORCE_ADVANCEMENT) ? "active.true" : "active.false"))
.replace("<force-height-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.FORCE_HEIGHT) ? "active.true" : "active.false"))
.replace("<force-coords-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.FORCE_COORDS) ? "active.true" : "active.false"))
.replace("<force-structure-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.FORCE_STRUCTURE) ? "active.true" : "active.false"))
.replace("<chain-mode-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.CHAIN_MODE) ? "active.true" : "active.false"))
.replace("<backpacks-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.BACKPACK) ? "active.true" : "active.false"))
.replace("<hide-points-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS) ? "active.true" : "active.false"))
.replace("<hide-objectives-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES) ? "active.true" : "active.false"))
.replace("<no-duplicate-objectives-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.NO_DUPLICATE_OBJECTIVES) ? "active.true" :
"active.false"))
.replace("<no-simplified-objectives-active>", getString(SettingsManager.isEnabled(SettingsManager.Setting.SIMPLIFIED_OBJECTIVES) ? "active.true" :
"active.false"))
;
return input;
}
Expand Down
12 changes: 8 additions & 4 deletions src/main/java/net/fameless/forcebattle/command/JokerCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,15 @@ protected void executeCommand(final CommandCaller caller, final String[] args) {
switch (args[0]) {
case "add" -> {
switch (jokerType) {
case SKIP -> target.addSkip(amount);
case PLAYERSKIP -> target.addPlayerSkip(amount);
case TEAMSKIP -> target.addTeamSkip(amount);
case SWAP -> target.addSwap(amount);
}
}
case "remove" -> {
switch (jokerType) {
case SKIP -> target.removeSkip(amount);
case PLAYERSKIP -> target.removePlayerSkip(amount);
case TEAMSKIP -> target.removeTeamSkip(amount);
case SWAP -> target.removeSwap(amount);
}
}
Expand All @@ -80,7 +82,8 @@ protected List<String> tabComplete(final CommandCaller caller, final String[] ar
return StringUtil.copyPartialMatches(args[1], TabCompletions.getPlayerNamesTabCompletions(), new ArrayList<>());
}
if (args.length == 3) {
return StringUtil.copyPartialMatches(args[2], List.of(JokerType.SKIP.getIdentifier(), JokerType.SWAP.getIdentifier()), new ArrayList<>());
return StringUtil.copyPartialMatches(args[2], List.of(JokerType.PLAYERSKIP.getIdentifier(), JokerType.SWAP.getIdentifier(),
JokerType.TEAMSKIP.getIdentifier()), new ArrayList<>());
}
if (args.length == 4) {
return StringUtil.copyPartialMatches(args[3], List.of("amount"), new ArrayList<>());
Expand All @@ -89,7 +92,8 @@ protected List<String> tabComplete(final CommandCaller caller, final String[] ar
}

private enum JokerType {
SKIP,
PLAYERSKIP,
TEAMSKIP,
SWAP;

private final String IDENTIFIER = name().toLowerCase();
Expand Down
54 changes: 39 additions & 15 deletions src/main/java/net/fameless/forcebattle/command/SkipCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import net.fameless.forcebattle.command.framework.CallerType;
import net.fameless.forcebattle.command.framework.Command;
import net.fameless.forcebattle.command.framework.CommandCaller;
import net.fameless.forcebattle.game.Team;
import net.fameless.forcebattle.player.BattlePlayer;
import net.fameless.forcebattle.util.StringUtil;
import net.fameless.forcebattle.util.TabCompletions;
Expand Down Expand Up @@ -32,20 +33,37 @@ public SkipCommand() {
@Override
public void executeCommand(CommandCaller caller, String[] args) {
if (args.length > 0) {
@NotNull Optional<BattlePlayer> battlePlayerOpt = BattlePlayer.adapt(args[0]);
battlePlayerOpt.ifPresentOrElse(
battlePlayer -> {
if (battlePlayer.isOffline()) {
return;
}
battlePlayer.updateObjective(false, false);
battlePlayer.sendMessage(Caption.of("notification.skip_by_admin_target"));
caller.sendMessage(Caption.of(
"notification.skip_by_admin_player",
TagResolver.resolver("player", Tag.inserting(Component.text(battlePlayer.getName())))
));
}, () -> caller.sendMessage(Caption.of("command.no_such_player"))
);
switch (args[0]) {
case "player" -> {
@NotNull Optional<BattlePlayer> battlePlayerOpt = BattlePlayer.adapt(args[1]);
battlePlayerOpt.ifPresentOrElse(
battlePlayer -> {
if (battlePlayer.isOffline()) {
return;
}
battlePlayer.updateObjective(false, false);
battlePlayer.sendMessage(Caption.of("notification.skip_by_admin_target"));
caller.sendMessage(Caption.of(
"notification.skip_by_admin_player",
TagResolver.resolver("player", Tag.inserting(Component.text(battlePlayer.getName())))
));
}, () -> caller.sendMessage(Caption.of("command.no_such_player"))
);
}
case "team" -> {
@NotNull Optional<Team> teamOpt = Team.ofId(Integer.parseInt(args[1]));
teamOpt.ifPresentOrElse(
team -> {
team.updateObjective(null, false, false);
team.getPlayers().forEach(player -> player.sendMessage(Caption.of("notification.skip_by_admin_target")));
caller.sendMessage(Caption.of(
"notification.skip_by_admin_player",
TagResolver.resolver("player", Tag.inserting(Component.text(team.getId())))
));
}, () -> caller.sendMessage(Caption.of("command.no_such_team"))
);
}
}
} else {
sendUsage(caller);
}
Expand All @@ -54,7 +72,13 @@ public void executeCommand(CommandCaller caller, String[] args) {
@Override
public List<String> tabComplete(CommandCaller caller, String @NotNull [] args) {
if (args.length == 1) {
return StringUtil.copyPartialMatches(args[0], TabCompletions.getPlayerNamesTabCompletions(), new ArrayList<>());
return StringUtil.copyPartialMatches(args[0], List.of("player", "team"), new ArrayList<>());
} else if (args.length == 2) {
return switch (args[0]) {
case "player" -> StringUtil.copyPartialMatches(args[1], TabCompletions.getPlayerNamesTabCompletions(), new ArrayList<>());
case "team" -> StringUtil.copyPartialMatches(args[1], TabCompletions.getTeamIdTabCompletions(), new ArrayList<>());
default -> List.of();
};
}
return List.of();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import net.fameless.forcebattle.command.framework.CallerType;
import net.fameless.forcebattle.command.framework.Command;
import net.fameless.forcebattle.command.framework.CommandCaller;
import net.fameless.forcebattle.configuration.SettingsManager;
import net.fameless.forcebattle.game.Timer;
import net.fameless.forcebattle.util.Format;
import net.fameless.forcebattle.util.StringUtil;
Expand Down Expand Up @@ -43,6 +44,10 @@ public void executeCommand(CommandCaller caller, String[] args) {
timer.pause();
caller.sendMessage(Caption.of("command.timer_paused"));
} else {
if (SettingsManager.getActiveChallenges().isEmpty()) {
caller.sendMessage(Caption.of("error.no_battletype_selected"));
return;
}
timer.start();
caller.sendMessage(Caption.of("command.timer_started"));
}
Expand Down
Loading
Loading