Fix sidebars, implement vault api, coin pickups, and player respawning
This commit is contained in:
		@@ -66,6 +66,7 @@ public class GameRunner {
 | 
			
		||||
  TickTask m_lobbyReturnTask;
 | 
			
		||||
  TickTask m_bombSmokeTask;
 | 
			
		||||
  TickTask m_bombCrackleTask;
 | 
			
		||||
  TickTask m_playerRespawnTask;
 | 
			
		||||
 | 
			
		||||
  BossBars m_bars;
 | 
			
		||||
  Sidebars m_sidebars;
 | 
			
		||||
@@ -94,6 +95,10 @@ public class GameRunner {
 | 
			
		||||
    validateGameRule(GameRule.SPECTATORS_GENERATE_CHUNKS, false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public GameState getState() {
 | 
			
		||||
    return m_state;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public GameRunner(Plugin plugin, Game game, Arena arena, World world) {
 | 
			
		||||
    m_plugin = plugin;
 | 
			
		||||
    m_game = game;
 | 
			
		||||
@@ -120,6 +125,19 @@ public class GameRunner {
 | 
			
		||||
      }
 | 
			
		||||
    }, 80);
 | 
			
		||||
 | 
			
		||||
    m_playerRespawnTask = new TickTask(m_plugin, () -> {
 | 
			
		||||
      m_players.tickRespawnCounters();
 | 
			
		||||
      for (Player p : m_players.getPlayers()) {
 | 
			
		||||
        if (m_players.readyToRespawn(p)) {
 | 
			
		||||
          if (m_players.requestTransition(p, PlayerManager.State.Playing)) {
 | 
			
		||||
            sendRespawnTitle(p);
 | 
			
		||||
            p.teleport(m_world.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      m_bars.update();
 | 
			
		||||
    }, 20);
 | 
			
		||||
 | 
			
		||||
    m_countdownTask = new TickTask(m_plugin, () -> {
 | 
			
		||||
      if (m_warmupCountdown == 0) {
 | 
			
		||||
        requestTransition(Stage.Playing);
 | 
			
		||||
@@ -176,6 +194,16 @@ public class GameRunner {
 | 
			
		||||
    m_mobs.handleEntityRetarget(evt);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void spendMoney(Player p, int amount) {
 | 
			
		||||
    m_players.addPlayerExpenses(p, amount);
 | 
			
		||||
    m_sidebars.update();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void depositCoins(int amount) {
 | 
			
		||||
    m_state.addPickedUpCoins(amount);
 | 
			
		||||
    m_sidebars.update();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void handleEntityDamage(EntityDamageEvent evt) {
 | 
			
		||||
    m_mobs.handleEntityDamage(evt);
 | 
			
		||||
    if (m_mobs.bombWasHit() && !m_bombFuse.isExploded()) {
 | 
			
		||||
@@ -229,6 +257,8 @@ public class GameRunner {
 | 
			
		||||
    m_fuseTask.stop();
 | 
			
		||||
    m_countdownTask.stop();
 | 
			
		||||
    m_lobbyReturnTask.stop();
 | 
			
		||||
    m_playerRespawnTask.stop();
 | 
			
		||||
    m_state.resetBalances();
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -253,6 +283,7 @@ public class GameRunner {
 | 
			
		||||
      .create();
 | 
			
		||||
    broadcastMessage(message);
 | 
			
		||||
    m_mobs.clear();
 | 
			
		||||
    m_playerRespawnTask.start();
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -288,6 +319,7 @@ public class GameRunner {
 | 
			
		||||
    m_warmupCountdown = 10;
 | 
			
		||||
    m_bars.setCountdownProgress(1.0);
 | 
			
		||||
    m_countdownTask.start();
 | 
			
		||||
    m_playerRespawnTask.start();
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -302,6 +334,7 @@ public class GameRunner {
 | 
			
		||||
    }
 | 
			
		||||
    m_countdownTask.stop();
 | 
			
		||||
    m_fuseTask.start();
 | 
			
		||||
    m_playerRespawnTask.start();
 | 
			
		||||
    spawnNextBatch();
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
@@ -311,7 +344,7 @@ public class GameRunner {
 | 
			
		||||
    m_lobbyReturnTask.start();
 | 
			
		||||
    m_countdownTask.stop();
 | 
			
		||||
    m_fuseTask.stop();
 | 
			
		||||
    //m_mobs.clear();
 | 
			
		||||
    m_playerRespawnTask.stop();
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -330,7 +363,8 @@ public class GameRunner {
 | 
			
		||||
  private void handlePlayerDeath(Player player) {
 | 
			
		||||
    if (m_players.requestTransition(player, PlayerManager.State.Dead)) {
 | 
			
		||||
      m_world.strikeLightningEffect(player.getLocation());
 | 
			
		||||
      if (!m_players.isAnyoneAlive()) {
 | 
			
		||||
      //if (!m_players.isAnyoneAlive()) {
 | 
			
		||||
      if (false) {
 | 
			
		||||
        BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
          .append("Everyone is ").color(ChatColor.LIGHT_PURPLE)
 | 
			
		||||
          .append("DEAD").color(ChatColor.RED).bold(true)
 | 
			
		||||
@@ -339,6 +373,14 @@ public class GameRunner {
 | 
			
		||||
        broadcastMessage(message);
 | 
			
		||||
        requestTransition(Stage.GameOver);
 | 
			
		||||
      } else {
 | 
			
		||||
        BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
          .append(player.getName())
 | 
			
		||||
          .append(" has ").color(ChatColor.LIGHT_PURPLE)
 | 
			
		||||
          .append("DIED!").color(ChatColor.RED).bold(true)
 | 
			
		||||
          .append(" :(").color(ChatColor.LIGHT_PURPLE)
 | 
			
		||||
          .create();
 | 
			
		||||
        broadcastMessage(message);
 | 
			
		||||
        sendDeathTitle(player);
 | 
			
		||||
        m_log.info("Remaining players " + m_players.remainingPlayers());
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
@@ -347,12 +389,15 @@ public class GameRunner {
 | 
			
		||||
  public void handleEntityDeath(Entity entity) {
 | 
			
		||||
    boolean wasCarrier = m_mobs.isBombCarrier(entity);
 | 
			
		||||
    if (m_mobs.killMob(entity)) {
 | 
			
		||||
      int COIN_STACK_SIZE = 5;
 | 
			
		||||
      int coinsToDrop = 60;
 | 
			
		||||
      while(coinsToDrop > 0) {
 | 
			
		||||
        int droppedCoins = Math.min(coinsToDrop, 5);
 | 
			
		||||
        int droppedCoins = Math.min(coinsToDrop, COIN_STACK_SIZE);
 | 
			
		||||
        ItemStack coins = Items.makeCoins();
 | 
			
		||||
        coins.setAmount(droppedCoins);
 | 
			
		||||
        coinsToDrop -= 64;
 | 
			
		||||
        coinsToDrop -= droppedCoins;
 | 
			
		||||
        m_state.addDroppedCoins(droppedCoins);
 | 
			
		||||
        m_sidebars.update();
 | 
			
		||||
        m_world.dropItem(entity.getLocation(), coins);
 | 
			
		||||
      }
 | 
			
		||||
      m_bars.update();
 | 
			
		||||
@@ -433,6 +478,14 @@ public class GameRunner {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void sendDeathTitle(Player p) {
 | 
			
		||||
    p.sendTitle(ChatColor.RED.toString() + "You died!", "Wait to respawn...");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void sendRespawnTitle(Player p) {
 | 
			
		||||
    p.sendTitle(ChatColor.AQUA.toString() + "Respawn", "");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void sendStageTitle(Player p) {
 | 
			
		||||
    switch(m_stage) {
 | 
			
		||||
      case Warmup:
 | 
			
		||||
@@ -451,6 +504,7 @@ public class GameRunner {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    p.getInventory().clear();
 | 
			
		||||
    m_sidebars.addPlayer(p);
 | 
			
		||||
    m_players.addPlayer(p);
 | 
			
		||||
    m_bars.addPlayer(p);
 | 
			
		||||
    if (m_stage == Stage.Idle || m_stage == Stage.Warmup) {
 | 
			
		||||
@@ -471,6 +525,7 @@ public class GameRunner {
 | 
			
		||||
 | 
			
		||||
  public void removePlayer(Player p) {
 | 
			
		||||
    p.getInventory().clear();
 | 
			
		||||
    m_sidebars.removePlayer(p);
 | 
			
		||||
    m_bars.removePlayer(p);
 | 
			
		||||
    m_players.removePlayer(p);
 | 
			
		||||
    if (m_players.isEmpty()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,8 @@ import gg.malloc.defense.model.Game;
 | 
			
		||||
import gg.malloc.defense.model.Progress;
 | 
			
		||||
import gg.malloc.defense.model.State;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
 | 
			
		||||
public class GameState implements State {
 | 
			
		||||
  GameRunner m_runner;
 | 
			
		||||
  WaveManager m_waves;
 | 
			
		||||
@@ -12,6 +14,9 @@ public class GameState implements State {
 | 
			
		||||
  BombFuse m_fuse;
 | 
			
		||||
  PlayerManager m_players;
 | 
			
		||||
 | 
			
		||||
  int m_coinsDropped;
 | 
			
		||||
  int m_coinsPickedUp;
 | 
			
		||||
 | 
			
		||||
  public GameState(GameRunner runner, WaveManager waves, Game game, MobManager mobs, BombFuse fuse, PlayerManager players) {
 | 
			
		||||
    m_runner = runner;
 | 
			
		||||
    m_waves = waves;
 | 
			
		||||
@@ -19,6 +24,47 @@ public class GameState implements State {
 | 
			
		||||
    m_mobs = mobs;
 | 
			
		||||
    m_fuse = fuse;
 | 
			
		||||
    m_players = players;
 | 
			
		||||
    m_coinsDropped = 0;
 | 
			
		||||
    m_coinsPickedUp = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public int getRemainingCoins() {
 | 
			
		||||
    return coinsDropped() - coinsPickedUp();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public int coinsDropped() {
 | 
			
		||||
    return m_coinsDropped;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public int coinsPickedUp() {
 | 
			
		||||
    return m_coinsPickedUp;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int INITIAL_BALANCE = 1500;
 | 
			
		||||
 | 
			
		||||
  public int getPlayerBalance(Player p) {
 | 
			
		||||
    return coinsPickedUp() - m_players.getPlayerExpenses(p) + INITIAL_BALANCE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void addDroppedCoins(int v) {
 | 
			
		||||
    m_coinsDropped += v;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void addPickedUpCoins(int v) {
 | 
			
		||||
    m_coinsPickedUp += v;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void resetBalances() {
 | 
			
		||||
    m_coinsDropped = 0;
 | 
			
		||||
    m_coinsPickedUp = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public Progress playerRespawnProgress(Player p) {
 | 
			
		||||
    return m_players.getRespawnProgress(p);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public Progress coinProgress() {
 | 
			
		||||
    return new StaticProgress(m_coinsPickedUp, m_coinsDropped);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public GameRunner.Stage getStage() {
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,8 @@ import java.util.Collection;
 | 
			
		||||
public class PlayerManager {
 | 
			
		||||
  HashMap<Player, State> m_playerStates = new HashMap<>();
 | 
			
		||||
  HashMap<Player, Boolean> m_playerReadyStates = new HashMap<>();
 | 
			
		||||
  HashMap<Player, Integer> m_playerExpenses = new HashMap<>();
 | 
			
		||||
  HashMap<Player, Integer> m_respawnCounters = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
  public enum State {
 | 
			
		||||
    Idle,
 | 
			
		||||
@@ -68,22 +70,22 @@ public class PlayerManager {
 | 
			
		||||
 | 
			
		||||
  // Respawn player
 | 
			
		||||
  public boolean enterPlaying(Player player) {
 | 
			
		||||
    //m_log.fine("Respawning player " + player);
 | 
			
		||||
    player.setGameMode(Bukkit.getDefaultGameMode());
 | 
			
		||||
    healPlayer(player);
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public boolean enterDead(Player player) {
 | 
			
		||||
    //m_log.info("Player has died in game" + player);
 | 
			
		||||
    player.setGameMode(GameMode.SPECTATOR);
 | 
			
		||||
    m_respawnCounters.put(player, 15);
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void addPlayer(Player player) {
 | 
			
		||||
    //m_log.info("Adding player " + player); 
 | 
			
		||||
    m_playerStates.put(player, State.Idle);
 | 
			
		||||
    m_playerReadyStates.put(player, false);
 | 
			
		||||
    m_playerExpenses.put(player, 0);
 | 
			
		||||
    m_respawnCounters.put(player, 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public boolean isReady(Player player) {
 | 
			
		||||
@@ -111,14 +113,53 @@ public class PlayerManager {
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
  
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public Progress getRespawnProgress(Player player) {
 | 
			
		||||
    return new StaticProgress(m_respawnCounters.get(player), 15);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public int getRespawnCounter(Player player) {
 | 
			
		||||
    if (m_respawnCounters.containsKey(player)) {
 | 
			
		||||
      return m_respawnCounters.get(player);
 | 
			
		||||
    } else {
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void tickRespawnCounters() {
 | 
			
		||||
    for(Player p : m_respawnCounters.keySet()) {
 | 
			
		||||
      if (m_respawnCounters.get(p) > 0) {
 | 
			
		||||
        m_respawnCounters.put(p, m_respawnCounters.get(p) - 1);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public boolean readyToRespawn(Player player) {
 | 
			
		||||
    return m_respawnCounters.get(player) == 0 && m_playerStates.get(player) == State.Dead;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void addPlayerExpenses(Player player, int amount) {
 | 
			
		||||
    if (m_playerExpenses.containsKey(player)) {
 | 
			
		||||
      m_playerExpenses.put(player, m_playerExpenses.get(player) + amount);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public int getPlayerExpenses(Player player) {
 | 
			
		||||
    if (m_playerExpenses.containsKey(player)) {
 | 
			
		||||
      return m_playerExpenses.get(player);
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public boolean removePlayer(Player player) {
 | 
			
		||||
    //m_log.info("Removing player " + player); 
 | 
			
		||||
    healPlayer(player);
 | 
			
		||||
    requestTransition(player, State.Idle);
 | 
			
		||||
    m_playerStates.remove(player);
 | 
			
		||||
    m_playerReadyStates.remove(player);
 | 
			
		||||
    m_playerExpenses.remove(player);
 | 
			
		||||
    m_respawnCounters.remove(player);
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user