Implement some chat colors/messages, coin drops, lobby lifecycle
This commit is contained in:
		@@ -5,8 +5,14 @@ import gg.malloc.defense.model.Game;
 | 
			
		||||
import gg.malloc.defense.model.Spawner;
 | 
			
		||||
import gg.malloc.defense.model.Waypoint;
 | 
			
		||||
 | 
			
		||||
import net.md_5.bungee.api.chat.BaseComponent;
 | 
			
		||||
import net.md_5.bungee.api.chat.ClickEvent;
 | 
			
		||||
import net.md_5.bungee.api.ChatColor;
 | 
			
		||||
import net.md_5.bungee.api.chat.ComponentBuilder;
 | 
			
		||||
 | 
			
		||||
import gg.malloc.defense.ui.BombCarrier;
 | 
			
		||||
import gg.malloc.defense.ui.BossBars;
 | 
			
		||||
import gg.malloc.defense.ui.Items;
 | 
			
		||||
 | 
			
		||||
import gg.malloc.defense.Plugin;
 | 
			
		||||
 | 
			
		||||
@@ -31,6 +37,7 @@ import org.bukkit.attribute.Attribute;
 | 
			
		||||
import org.bukkit.attribute.AttributeModifier;
 | 
			
		||||
import org.bukkit.entity.LivingEntity;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
 | 
			
		||||
public class GameRunner {
 | 
			
		||||
  Arena m_arena;
 | 
			
		||||
@@ -56,6 +63,7 @@ public class GameRunner {
 | 
			
		||||
 | 
			
		||||
  TickTask m_fuseTask;
 | 
			
		||||
  TickTask m_countdownTask;
 | 
			
		||||
  TickTask m_lobbyReturnTask;
 | 
			
		||||
  TickTask m_bombSmokeTask;
 | 
			
		||||
  TickTask m_bombCrackleTask;
 | 
			
		||||
 | 
			
		||||
@@ -91,14 +99,36 @@ public class GameRunner {
 | 
			
		||||
      if (m_warmupCountdown == 0) {
 | 
			
		||||
        requestTransition(Stage.Playing);
 | 
			
		||||
      } else {
 | 
			
		||||
        m_bars.update();
 | 
			
		||||
        broadcastMessage("Starting game in " + m_warmupCountdown);
 | 
			
		||||
        BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
          .append("Starting game in ").color(ChatColor.LIGHT_PURPLE)
 | 
			
		||||
          .append("" + m_warmupCountdown).color(ChatColor.AQUA).bold(true)
 | 
			
		||||
          .create();
 | 
			
		||||
        broadcastMessage(message);
 | 
			
		||||
        m_warmupCountdown--;
 | 
			
		||||
        m_bars.setCountdownProgress((double)m_warmupCountdown / 10.0);
 | 
			
		||||
        m_bars.update();
 | 
			
		||||
      }
 | 
			
		||||
    }, 20);
 | 
			
		||||
 | 
			
		||||
    m_lobbyReturnTask = new TickTask(m_plugin, () -> {
 | 
			
		||||
      if (m_gameEndCountdown == 0) {
 | 
			
		||||
        for(Player p : new ArrayList<Player>(m_players.getPlayers())) {
 | 
			
		||||
          removePlayer(p);
 | 
			
		||||
          m_plugin.returnPlayerToLobby(p);
 | 
			
		||||
        }
 | 
			
		||||
        requestTransition(Stage.Idle);
 | 
			
		||||
      } else {
 | 
			
		||||
        BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
          .append("Game is ending in ").color(ChatColor.LIGHT_PURPLE)
 | 
			
		||||
          .append("" + m_gameEndCountdown).color(ChatColor.RED).bold(true)
 | 
			
		||||
          .create();
 | 
			
		||||
        broadcastMessage(message);
 | 
			
		||||
        m_gameEndCountdown--;
 | 
			
		||||
        m_bars.setCountdownProgress((double)m_gameEndCountdown / 30.0);
 | 
			
		||||
        m_bars.update();
 | 
			
		||||
      }
 | 
			
		||||
    }, 20);
 | 
			
		||||
 | 
			
		||||
    m_bombSmokeTask = new TickTask(m_plugin, () -> {
 | 
			
		||||
      Location targetLoc = getLocation(m_arena.bombTarget());
 | 
			
		||||
      m_world.spawnParticle(Particle.SMOKE_LARGE, targetLoc, 35, 4, 2, 4);
 | 
			
		||||
@@ -111,6 +141,7 @@ public class GameRunner {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int m_warmupCountdown = 0;
 | 
			
		||||
  int m_gameEndCountdown = 0;
 | 
			
		||||
 | 
			
		||||
  public void handleEntityRetargeting(EntityTargetEvent evt) {
 | 
			
		||||
    m_mobs.handleEntityRetarget(evt);
 | 
			
		||||
@@ -129,12 +160,23 @@ public class GameRunner {
 | 
			
		||||
        m_world.strikeLightningEffect(getLocation(m_arena.bombTarget()));
 | 
			
		||||
        m_world.playSound(getLocation(m_arena.bombTarget()), Sound.ENTITY_GENERIC_EXPLODE, SoundCategory.NEUTRAL, 1.3f, 1.0f);
 | 
			
		||||
        m_world.spawnParticle(Particle.EXPLOSION_HUGE, getLocation(m_arena.bombTarget()), 8, 5, 2, 5);
 | 
			
		||||
        BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
          .append("The bomb blew up!").color(ChatColor.RED).bold(true)
 | 
			
		||||
          .create();
 | 
			
		||||
        broadcastMessage(message);
 | 
			
		||||
        requestTransition(Stage.GameOver);
 | 
			
		||||
        m_bombSmokeTask.start();
 | 
			
		||||
        m_bombCrackleTask.start();
 | 
			
		||||
      }
 | 
			
		||||
    } else if (evt.getEntity() instanceof Player) {
 | 
			
		||||
      Player player = (Player)evt.getEntity();
 | 
			
		||||
      if (evt instanceof EntityDamageByEntityEvent) {
 | 
			
		||||
        EntityDamageByEntityEvent entityEvt = (EntityDamageByEntityEvent)evt;
 | 
			
		||||
        if (entityEvt.getDamager() instanceof Player) {
 | 
			
		||||
          evt.setCancelled(true);
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (m_players.contains(player) && player.getHealth() - evt.getFinalDamage() <= 0) {
 | 
			
		||||
        evt.setCancelled(true);
 | 
			
		||||
        handlePlayerDeath(player);
 | 
			
		||||
@@ -151,6 +193,7 @@ public class GameRunner {
 | 
			
		||||
    m_players.requestTransitionForAll(PlayerManager.State.Idle);
 | 
			
		||||
    m_fuseTask.stop();
 | 
			
		||||
    m_countdownTask.stop();
 | 
			
		||||
    m_lobbyReturnTask.stop();
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -162,7 +205,13 @@ public class GameRunner {
 | 
			
		||||
        }
 | 
			
		||||
        m_players.setReady(p, false);
 | 
			
		||||
    }
 | 
			
		||||
    broadcastTitle("Warmup", "Prepare yourself for wave " + m_waves.currentWaveNum());
 | 
			
		||||
    BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
      .append("Click").color(ChatColor.LIGHT_PURPLE)
 | 
			
		||||
      .append("[Here]").color(ChatColor.GOLD)
 | 
			
		||||
      .event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/malloc-defense:ready"))
 | 
			
		||||
      .append(" when ready.").color(ChatColor.LIGHT_PURPLE)
 | 
			
		||||
      .create();
 | 
			
		||||
    broadcastMessage(message);
 | 
			
		||||
    m_mobs.clear();
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
@@ -171,8 +220,24 @@ public class GameRunner {
 | 
			
		||||
    setPlayerReady(p, !m_players.isReady(p));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void clearReadyState() {
 | 
			
		||||
    for(Player p : m_players.getPlayers()) {
 | 
			
		||||
      setPlayerReady(p, false);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void setPlayerReady(Player p, boolean isReady) {
 | 
			
		||||
    m_players.setReady(p, isReady);
 | 
			
		||||
    if (isReady != m_players.isReady(p)) {
 | 
			
		||||
      if (isReady) {
 | 
			
		||||
        BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
          .append(p.getName()).bold(true)
 | 
			
		||||
          .append(" is ready!").color(ChatColor.AQUA).italic(true)
 | 
			
		||||
          .create();
 | 
			
		||||
      }
 | 
			
		||||
      m_players.setReady(p, isReady);
 | 
			
		||||
    }
 | 
			
		||||
    m_bars.update();
 | 
			
		||||
    broadcastMessage(message);
 | 
			
		||||
    if (m_players.isEveryoneReady()) {
 | 
			
		||||
      requestTransition(Stage.Countdown);
 | 
			
		||||
    }
 | 
			
		||||
@@ -197,19 +262,15 @@ public class GameRunner {
 | 
			
		||||
    m_countdownTask.stop();
 | 
			
		||||
    m_fuseTask.start();
 | 
			
		||||
    spawnNextBatch();
 | 
			
		||||
    broadcastTitle("Wave " + m_waves.currentWaveNum());
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  private boolean enterGameOver() {
 | 
			
		||||
    broadcastTitle("Game Over!");
 | 
			
		||||
    broadcastMessage("The bomb blew up!");
 | 
			
		||||
    m_gameEndCountdown = 60;
 | 
			
		||||
    m_lobbyReturnTask.start();
 | 
			
		||||
    m_countdownTask.stop();
 | 
			
		||||
    m_fuseTask.stop();
 | 
			
		||||
    m_mobs.clear();
 | 
			
		||||
    for(Player p : new ArrayList<Player>(m_players.getPlayers())) {
 | 
			
		||||
      removePlayer(p);
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -218,7 +279,7 @@ public class GameRunner {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private void spawnNextBatch() {
 | 
			
		||||
    broadcastMessage("Spawning batch " + m_waves.currentBatchNum());
 | 
			
		||||
    m_log.info("Spawning batch " + m_waves.currentBatchNum());
 | 
			
		||||
    Spawner spawner = new GameSpawner(m_world, m_arena, m_mobs, m_players);
 | 
			
		||||
    m_waves.currentWave().spawnBatch(spawner, m_waves.currentBatchNum());
 | 
			
		||||
    m_bars.update();
 | 
			
		||||
@@ -228,7 +289,12 @@ public class GameRunner {
 | 
			
		||||
    if (m_players.requestTransition(player, PlayerManager.State.Dead)) {
 | 
			
		||||
      m_world.strikeLightningEffect(player.getLocation());
 | 
			
		||||
      if (!m_players.isAnyoneAlive()) {
 | 
			
		||||
        broadcastMessage("Everyone is dead :(");
 | 
			
		||||
        BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
          .append("Everyone is ").color(ChatColor.LIGHT_PURPLE)
 | 
			
		||||
          .append("DEAD").color(ChatColor.RED).bold(true)
 | 
			
		||||
          .append(" :(").color(ChatColor.LIGHT_PURPLE)
 | 
			
		||||
          .create();
 | 
			
		||||
        broadcastMessage(message);
 | 
			
		||||
        requestTransition(Stage.GameOver);
 | 
			
		||||
      } else {
 | 
			
		||||
        m_log.info("Remaining players " + m_players.remainingPlayers());
 | 
			
		||||
@@ -239,11 +305,23 @@ public class GameRunner {
 | 
			
		||||
  public void handleEntityDeath(Entity entity) {
 | 
			
		||||
    boolean wasCarrier = m_mobs.isBombCarrier(entity);
 | 
			
		||||
    if (m_mobs.killMob(entity)) {
 | 
			
		||||
      int coinsToDrop = 300;
 | 
			
		||||
      while(coinsToDrop > 0) {
 | 
			
		||||
        int droppedCoins = Math.min(coinsToDrop, 64);
 | 
			
		||||
        ItemStack coins = Items.makeCoins();
 | 
			
		||||
        coins.setAmount(droppedCoins);
 | 
			
		||||
        coinsToDrop -= 64;
 | 
			
		||||
        m_world.dropItem(entity.getLocation(), coins);
 | 
			
		||||
      }
 | 
			
		||||
      m_bars.update();
 | 
			
		||||
      if (m_mobs.remainingMobs() <= 3) {
 | 
			
		||||
        m_log.info("Starting next batch!");
 | 
			
		||||
        if (m_waves.isLastBatch()) {
 | 
			
		||||
          if (m_waves.isLastWave()) {
 | 
			
		||||
            BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
              .append("You Won!").color(ChatColor.LIGHT_PURPLE).bold(true)
 | 
			
		||||
              .create();
 | 
			
		||||
            broadcastMessage(message);
 | 
			
		||||
            requestTransition(Stage.GameOver);
 | 
			
		||||
          } else if (m_mobs.empty()) {
 | 
			
		||||
            requestTransition(Stage.Warmup);
 | 
			
		||||
@@ -262,7 +340,6 @@ public class GameRunner {
 | 
			
		||||
    if (m_stage == stage) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    m_log.info("Game state: " + stage);
 | 
			
		||||
    switch(stage) {
 | 
			
		||||
      case Idle:
 | 
			
		||||
        return enterIdle();
 | 
			
		||||
@@ -303,12 +380,28 @@ public class GameRunner {
 | 
			
		||||
      m_log.info("Game transition: " + m_stage + " -> " + stage);
 | 
			
		||||
      m_stage = stage;
 | 
			
		||||
      m_bars.update();
 | 
			
		||||
      for(Player p : m_players.getPlayers()) {
 | 
			
		||||
        sendStageTitle(p);
 | 
			
		||||
      }
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    m_log.severe("Failed to complete transition: " + m_stage + " -> " + stage);
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void sendStageTitle(Player p) {
 | 
			
		||||
    switch(m_stage) {
 | 
			
		||||
      case Warmup:
 | 
			
		||||
        p.sendTitle("Warmup", "Prepare yourself for wave " + m_waves.currentWaveNum(), 10, 70, 20);
 | 
			
		||||
        break;
 | 
			
		||||
      case Playing:
 | 
			
		||||
        p.sendTitle("Wave " + m_waves.currentWaveNum(), "", 10, 70, 20);
 | 
			
		||||
        break;
 | 
			
		||||
      case GameOver:
 | 
			
		||||
        p.sendTitle("Game over!", "", 10, 70, 20);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public void addPlayer(Player p) {
 | 
			
		||||
    if (m_players.contains(p)) {
 | 
			
		||||
      return;
 | 
			
		||||
@@ -319,7 +412,12 @@ public class GameRunner {
 | 
			
		||||
      if (m_players.requestTransition(p, PlayerManager.State.Playing)) {
 | 
			
		||||
        p.teleport(m_world.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
 | 
			
		||||
      }
 | 
			
		||||
      broadcastMessage(p.getName() + " has joined the game");
 | 
			
		||||
      BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
        .append(p.getName()).bold(true)
 | 
			
		||||
        .append("Has joined the game").color(ChatColor.AQUA)
 | 
			
		||||
        .create();
 | 
			
		||||
      broadcastMessage(message);
 | 
			
		||||
      sendStageTitle(p);
 | 
			
		||||
      if (m_stage == Stage.Idle) {
 | 
			
		||||
        requestTransition(Stage.Warmup);
 | 
			
		||||
      }
 | 
			
		||||
@@ -331,6 +429,12 @@ public class GameRunner {
 | 
			
		||||
    m_players.removePlayer(p);
 | 
			
		||||
    if (m_players.isEmpty()) {
 | 
			
		||||
      requestTransition(Stage.Idle);
 | 
			
		||||
    } else {
 | 
			
		||||
      BaseComponent[] message = new ComponentBuilder()
 | 
			
		||||
        .append(p.getName()).bold(true)
 | 
			
		||||
        .append("Has left the game").color(ChatColor.AQUA)
 | 
			
		||||
        .create();
 | 
			
		||||
      broadcastMessage(message);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -344,9 +448,9 @@ public class GameRunner {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void broadcastMessage(String string) {
 | 
			
		||||
  void broadcastMessage(BaseComponent[] component) {
 | 
			
		||||
    for(Player p : m_world.getPlayers()) {
 | 
			
		||||
      p.sendMessage(string);
 | 
			
		||||
      p.spigot().sendMessage(component);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ public class PlayerManager {
 | 
			
		||||
    //m_log.fine("Respawning player " + player);
 | 
			
		||||
    player.setGameMode(Bukkit.getDefaultGameMode());
 | 
			
		||||
    player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue());
 | 
			
		||||
    player.setFoodLevel(10);
 | 
			
		||||
    player.setFoodLevel(20);
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -109,6 +109,7 @@ public class PlayerManager {
 | 
			
		||||
    //m_log.info("Removing player " + player); 
 | 
			
		||||
    requestTransition(player, State.Idle);
 | 
			
		||||
    m_playerStates.remove(player);
 | 
			
		||||
    m_playerReadyStates.remove(player);
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user