Implement in-game sidebars

This commit is contained in:
2022-05-28 16:05:02 +02:00
parent 99197d92bb
commit f8b99d44bf
13 changed files with 292 additions and 50 deletions

View File

@@ -1,12 +1,7 @@
package gg.malloc.defense.ui;
import gg.malloc.defense.engine.GameRunner;
import gg.malloc.defense.engine.WaveManager;
import gg.malloc.defense.engine.PlayerManager;
import gg.malloc.defense.engine.MobManager;
import gg.malloc.defense.engine.BombFuse;
import gg.malloc.defense.model.Game;
import gg.malloc.defense.model.State;
import org.bukkit.boss.BossBar;
import org.bukkit.boss.BarStyle;
@@ -19,12 +14,7 @@ public class BossBars {
BossBar m_waveBar = Bukkit.createBossBar("Malloc Defense", BarColor.PURPLE, BarStyle.SOLID);
BossBar m_bombBar = Bukkit.createBossBar("Bomb Fuse", BarColor.RED, BarStyle.SOLID);
GameRunner m_runner;
MobManager m_mobs;
WaveManager m_waves;
PlayerManager m_players;
BombFuse m_fuse;
Game m_game;
State m_gameState;
double m_countdownProgress;
@@ -32,13 +22,8 @@ public class BossBars {
m_countdownProgress = v;
}
public BossBars(GameRunner runner, Game game, WaveManager waves, PlayerManager players, BombFuse fuse, MobManager mobs) {
m_runner = runner;
m_game = game;
m_waves = waves;
m_players = players;
m_fuse = fuse;
m_mobs = mobs;
public BossBars(State gameState) {
m_gameState = gameState;
m_gameBar.setVisible(true);
m_waveBar.setVisible(false);
m_bombBar.setVisible(false);
@@ -57,7 +42,7 @@ public class BossBars {
}
public void update() {
switch(m_runner.getStage()) {
switch(m_gameState.getStage()) {
case Idle:
m_gameBar.setProgress(1.0);
m_gameBar.setTitle("Waiting for players...");
@@ -66,18 +51,18 @@ public class BossBars {
m_bombBar.setVisible(false);
break;
case Warmup:
m_gameBar.setProgress(m_waves.progress());
m_gameBar.setTitle("Wave " + m_waves.currentWaveNum() + " / " + m_game.getWaveCount());
m_gameBar.setProgress(m_gameState.waveProgress().toDouble());
m_gameBar.setTitle("Wave " + m_gameState.waveProgress().value() + " / " + m_gameState.waveProgress().maximum());
m_gameBar.setColor(BarColor.PURPLE);
m_waveBar.setVisible(true);
m_waveBar.setColor(BarColor.BLUE);
m_waveBar.setTitle("Warmup - Waiting for players to get ready...");
m_waveBar.setProgress(m_players.readyProgress());
m_waveBar.setProgress(m_gameState.playerReadyProgress().toDouble());
m_bombBar.setVisible(false);
break;
case Countdown:
m_gameBar.setProgress(m_waves.progress());
m_gameBar.setTitle("Wave " + m_waves.currentWaveNum() + " / " + m_game.getWaveCount());
m_gameBar.setProgress(m_gameState.waveProgress().toDouble());
m_gameBar.setTitle("Wave " + m_gameState.waveProgress().value() + " / " + m_gameState.waveProgress().maximum());
m_gameBar.setColor(BarColor.PURPLE);
m_waveBar.setVisible(true);
m_waveBar.setColor(BarColor.YELLOW);
@@ -86,20 +71,20 @@ public class BossBars {
m_bombBar.setVisible(false);
break;
case Playing:
m_gameBar.setProgress(m_waves.progress());
m_gameBar.setTitle("Wave " + m_waves.currentWaveNum() + " / " + m_game.getWaveCount());
m_gameBar.setProgress(m_gameState.waveProgress().toDouble());
m_gameBar.setTitle("Wave " + m_gameState.waveProgress().value() + " / " + m_gameState.waveProgress().maximum());
m_gameBar.setColor(BarColor.PURPLE);
if (m_mobs.createdMobs() > 0) {
if (m_gameState.mobProgress().maximum() > 0) {
m_waveBar.setVisible(true);
m_waveBar.setColor(BarColor.GREEN);
m_waveBar.setTitle("Mobs remaining: " + m_mobs.remainingMobs());
m_waveBar.setProgress(m_mobs.progress());
m_waveBar.setTitle("Mobs remaining: " + (m_gameState.mobProgress().maximum() - m_gameState.mobProgress().value()));
m_waveBar.setProgress(m_gameState.mobProgress().toDouble());
} else {
m_waveBar.setVisible(false);
}
if (m_fuse.isLit()) {
if (m_gameState.fuseProgress().value() > 0) {
m_bombBar.setVisible(true);
m_bombBar.setProgress(1.0 - m_fuse.getProgress());
m_bombBar.setProgress(1.0 - m_gameState.fuseProgress().toDouble());
} else {
m_bombBar.setVisible(false);
}

View File

@@ -0,0 +1,87 @@
package gg.malloc.defense.ui;
import java.util.Collection;
import java.util.ArrayList;
import java.util.HashMap;
import gg.malloc.defense.model.State;
import org.bukkit.ChatColor;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Score;
import org.bukkit.scoreboard.Team;
import org.bukkit.scoreboard.Objective;
public class Sidebar {
Scoreboard m_scoreboard;
Objective m_objective;
ArrayList<String> m_rowKeys;
HashMap<Integer, String> m_rows;
ArrayList<Team> m_teams;
int m_size;
State m_state;
public Sidebar(State state, Scoreboard scoreboard) {
m_state = state;
m_scoreboard = scoreboard;
m_objective = m_scoreboard.registerNewObjective("text", "dummy", ChatColor.LIGHT_PURPLE + "" + ChatColor.BOLD + "Malloc Defense");
m_objective.setDisplaySlot(DisplaySlot.SIDEBAR);
m_rowKeys = new ArrayList<>();
m_rows = new HashMap<>();
m_teams = new ArrayList<>();
m_rowKeys.add(ChatColor.BLACK + "" + ChatColor.WHITE);
m_rowKeys.add(ChatColor.GOLD+ "" + ChatColor.WHITE);
m_rowKeys.add(ChatColor.WHITE+ "" + ChatColor.WHITE);
for(String key : m_rowKeys) {
Team team = m_scoreboard.registerNewTeam(key);
team.addEntry(key);
m_teams.add(team);
}
}
public void update() {
switch(m_state.getStage()) {
case Idle:
m_rows.put(0, ChatColor.LIGHT_PURPLE + "Waiting for players...");
m_size = 1;
break;
case Warmup:
m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum());
m_rows.put(1, ChatColor.AQUA + "Get ready!");
m_rows.put(2, ChatColor.AQUA + "Balance: ");
m_size = 3;
break;
case Countdown:
m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum());
m_rows.put(1, ChatColor.GOLD + "Wave incoming!");
m_rows.put(2, ChatColor.AQUA + "Balance: ");
m_size = 3;
break;
case Playing:
m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum());
m_rows.put(1, ChatColor.GREEN + "Mobs remaining: " + (m_state.mobProgress().maximum() - m_state.mobProgress().value()));
m_rows.put(2, ChatColor.AQUA + "Balance: ");
m_size = 3;
break;
case GameOver:
m_rows.put(0, ChatColor.RED + "Game over!");
m_size = 1;
}
for(int i = 0; i < Math.min(m_size, m_rowKeys.size()); i++) {
Score rowScore = m_objective.getScore(m_rowKeys.get(i));
rowScore.setScore(m_rowKeys.size() - i);
if (m_rows.containsKey(i)) {
m_teams.get(i).setPrefix(m_rows.get(i));
} else {
m_teams.get(i).setPrefix("");
}
}
}
public Scoreboard getScoreboard() {
return m_scoreboard;
}
}

View File

@@ -0,0 +1,35 @@
package gg.malloc.defense.ui;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.ScoreboardManager;
import java.util.HashMap;
import gg.malloc.defense.model.State;
public class Sidebars {
State m_state;
ScoreboardManager m_scoreboards;
HashMap<Player, Sidebar> m_sidebars = new HashMap<>();
public Sidebars(State state, ScoreboardManager scoreboards) {
m_state = state;
m_scoreboards = scoreboards;
}
public void addPlayer(Player player) {
m_sidebars.put(player, new Sidebar(m_state, m_scoreboards.getNewScoreboard()));
player.setScoreboard(m_sidebars.get(player).getScoreboard());
}
public void removePlayer(Player player) {
m_sidebars.remove(player);
player.setScoreboard(m_scoreboards.getMainScoreboard());
}
public void update() {
for(Player p : m_sidebars.keySet()) {
m_sidebars.get(p).update();
}
}
}