Fix sidebars, implement vault api, coin pickups, and player respawning
This commit is contained in:
		
							
								
								
									
										8
									
								
								TODO.md
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								TODO.md
									
									
									
									
									
								
							| @@ -21,7 +21,7 @@ | |||||||
| [X] Never hungry | [X] Never hungry | ||||||
| [X] Mobs don't drop bomb items | [X] Mobs don't drop bomb items | ||||||
| [ ] Execute commands on game/wave end | [ ] Execute commands on game/wave end | ||||||
| [ ] Player Respawning | [X] Player Respawning | ||||||
|  |  | ||||||
| # QOL | # QOL | ||||||
|  |  | ||||||
| @@ -33,7 +33,7 @@ | |||||||
| [ ] Leave game when leaving game world | [ ] Leave game when leaving game world | ||||||
| [ ] Bomb and target glow different colors | [ ] Bomb and target glow different colors | ||||||
| [ ] Play sound once bomb is close to / at target | [ ] Play sound once bomb is close to / at target | ||||||
| [ ] Expose coins under vault API | [X] Expose coins under vault API | ||||||
| [ ] Animations framework | [ ] Animations framework | ||||||
|  |  | ||||||
| # Malloc beta map | # Malloc beta map | ||||||
| @@ -60,7 +60,7 @@ | |||||||
| [ ] Post-Round summary in chat | [ ] Post-Round summary in chat | ||||||
| [X] Clickable join links in /list | [X] Clickable join links in /list | ||||||
| [X] Sidebar | [X] Sidebar | ||||||
| [ ] Coin pickup messages in action bar | [X] Coin pickup status in sidebar | ||||||
| [ ] Target catches on fire more it is lit | [ ] Target catches on fire more it is lit | ||||||
| [ ] Colored titles | [ ] Colored titles | ||||||
| [ ] Clickable /leave action | [ ] Clickable /leave action | ||||||
| @@ -123,7 +123,7 @@ | |||||||
| [X] Restore health+hunger on respawn/game start | [X] Restore health+hunger on respawn/game start | ||||||
| [ ] /restart games | [ ] /restart games | ||||||
| [ ] Instancing | [ ] Instancing | ||||||
| [ ] Respawn during games | [X] Respawn during games | ||||||
| [ ] Player revival items | [ ] Player revival items | ||||||
| [X] Clear inventory on join/leave | [X] Clear inventory on join/leave | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -43,6 +43,12 @@ | |||||||
|             <version>2.9.2</version> |             <version>2.9.2</version> | ||||||
|             <scope>provided</scope> |             <scope>provided</scope> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.github.MilkBowl</groupId> | ||||||
|  |             <artifactId>VaultAPI</artifactId> | ||||||
|  |             <version>1.7</version> | ||||||
|  |             <scope>provided</scope> | ||||||
|  |         </dependency> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|      |      | ||||||
| </project> | </project> | ||||||
|   | |||||||
							
								
								
									
										198
									
								
								src/main/java/gg/malloc/defense/GameEconomy.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								src/main/java/gg/malloc/defense/GameEconomy.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,198 @@ | |||||||
|  | package gg.malloc.defense; | ||||||
|  |  | ||||||
|  | import net.milkbowl.vault.economy.AbstractEconomy; | ||||||
|  | import net.milkbowl.vault.economy.Economy; | ||||||
|  | import net.milkbowl.vault.economy.EconomyResponse; | ||||||
|  | import net.milkbowl.vault.economy.EconomyResponse.ResponseType; | ||||||
|  |  | ||||||
|  | import org.bukkit.plugin.ServicesManager; | ||||||
|  | import org.bukkit.plugin.ServicePriority; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.OfflinePlayer; | ||||||
|  |  | ||||||
|  | import gg.malloc.defense.engine.GameRunner; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.ArrayList; | ||||||
|  |  | ||||||
|  | public class GameEconomy extends AbstractEconomy { | ||||||
|  |  | ||||||
|  |   Plugin m_plugin; | ||||||
|  |  | ||||||
|  |   public GameEconomy(Plugin plugin) { | ||||||
|  |     m_plugin = plugin; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public void register() { | ||||||
|  |     ServicesManager manager = m_plugin.getServer().getServicesManager(); | ||||||
|  |     manager.register(Economy.class, this, m_plugin, ServicePriority.Highest); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse withdrawPlayer(String playerName, double amount) { | ||||||
|  |     GameRunner runner = m_plugin.getRunnerForPlayer(playerName); | ||||||
|  |     if (runner != null) { | ||||||
|  |       Player p = m_plugin.getServer().getPlayer(playerName); | ||||||
|  |       if (!has(playerName, amount)) { | ||||||
|  |         int newBalance = runner.getState().getPlayerBalance(p); | ||||||
|  |         return new EconomyResponse(amount, newBalance, ResponseType.FAILURE, "Not enough money!"); | ||||||
|  |       } else { | ||||||
|  |         runner.spendMoney(p, (int)Math.floor(amount)); | ||||||
|  |         int newBalance = runner.getState().getPlayerBalance(p); | ||||||
|  |         return new EconomyResponse(amount, newBalance, ResponseType.SUCCESS, ""); | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       return new EconomyResponse(0, 0, ResponseType.FAILURE, "Not in a game!"); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse depositPlayer(String playerName, double amount) { | ||||||
|  |     GameRunner runner = m_plugin.getRunnerForPlayer(playerName); | ||||||
|  |     if (runner != null) { | ||||||
|  |       Player p = m_plugin.getServer().getPlayer(playerName); | ||||||
|  |       runner.spendMoney(p, -(int)Math.floor(amount)); | ||||||
|  |       int newBalance = runner.getState().getPlayerBalance(p); | ||||||
|  |       return new EconomyResponse(amount, newBalance, ResponseType.SUCCESS, ""); | ||||||
|  |     } else { | ||||||
|  |       return new EconomyResponse(0, 0, ResponseType.FAILURE, "Not in a game!"); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public double getBalance(String playerName) { | ||||||
|  |     GameRunner runner = m_plugin.getRunnerForPlayer(playerName); | ||||||
|  |     if (runner != null) { | ||||||
|  |       Player p = m_plugin.getServer().getPlayer(playerName); | ||||||
|  |       return runner.getState().getPlayerBalance(p); | ||||||
|  |     } else { | ||||||
|  |       return 0.0; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public double getBalance(String playerName, String worldName) { | ||||||
|  |     return getBalance(playerName); | ||||||
|  |   } | ||||||
|  |   @Override | ||||||
|  |   public boolean isEnabled() { | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public String getName() { | ||||||
|  |     return "Malloc Defense"; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public boolean hasBankSupport() { | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public int fractionalDigits() { | ||||||
|  |     return 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public String format(double amount) { | ||||||
|  |     return amount + " grist"; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public String currencyNamePlural() { | ||||||
|  |     return "Grist"; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public String currencyNameSingular() { | ||||||
|  |     return "Grist"; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public boolean hasAccount(String playerName) { | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public boolean hasAccount(String playerName, String worldName) { | ||||||
|  |     return hasAccount(playerName); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public boolean has(String playerName, double amount) { | ||||||
|  |     return getBalance(playerName) >= amount; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public boolean has(String playerName, String worldName, double amount) { | ||||||
|  |     return has(playerName, amount); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse withdrawPlayer(String playerName, String worldName, double amount) { | ||||||
|  |     return withdrawPlayer(playerName, amount); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse depositPlayer(String playerName, String worldName, double amount) { | ||||||
|  |     return depositPlayer(playerName, amount); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private static final EconomyResponse NO_IMPL_RESPONSE = new EconomyResponse(0, 0, ResponseType.NOT_IMPLEMENTED, "Not implemented."); | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse createBank(String name, String player) { | ||||||
|  |     return NO_IMPL_RESPONSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse deleteBank(String name) { | ||||||
|  |     return NO_IMPL_RESPONSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse bankBalance(String name) { | ||||||
|  |     return NO_IMPL_RESPONSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse bankHas(String name, double amount) { | ||||||
|  |     return NO_IMPL_RESPONSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse bankWithdraw(String name, double amount) { | ||||||
|  |     return NO_IMPL_RESPONSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse bankDeposit(String name, double amount) { | ||||||
|  |     return NO_IMPL_RESPONSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse isBankOwner(String name, String player) { | ||||||
|  |     return NO_IMPL_RESPONSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public EconomyResponse isBankMember(String name, String player) { | ||||||
|  |     return NO_IMPL_RESPONSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public boolean createPlayerAccount(String name) { | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public boolean createPlayerAccount(String name, String worldName) { | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Override | ||||||
|  |   public List<String> getBanks() { | ||||||
|  |     return new ArrayList<String>(); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -14,10 +14,16 @@ import org.bukkit.event.entity.EntityCombustEvent; | |||||||
| import org.bukkit.event.entity.EntityTargetEvent; | import org.bukkit.event.entity.EntityTargetEvent; | ||||||
| import org.bukkit.event.entity.FoodLevelChangeEvent; | import org.bukkit.event.entity.FoodLevelChangeEvent; | ||||||
| import org.bukkit.event.player.PlayerQuitEvent; | import org.bukkit.event.player.PlayerQuitEvent; | ||||||
|  | import org.bukkit.event.player.PlayerPickupItemEvent; | ||||||
| import org.bukkit.event.world.LootGenerateEvent; | import org.bukkit.event.world.LootGenerateEvent; | ||||||
|  | import org.bukkit.Sound; | ||||||
|  | import org.bukkit.SoundCategory; | ||||||
| import org.bukkit.inventory.ItemStack; | import org.bukkit.inventory.ItemStack; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
|  | import de.tr7zw.nbtapi.NBTItem; | ||||||
|  | import de.tr7zw.nbtapi.NBTCompound; | ||||||
|  |  | ||||||
| public class GameEventHandler implements Listener { | public class GameEventHandler implements Listener { | ||||||
|   Collection<GameRunner> m_runners; |   Collection<GameRunner> m_runners; | ||||||
|  |  | ||||||
| @@ -78,4 +84,25 @@ public class GameEventHandler implements Listener { | |||||||
|   public void onFoodLevelChange(FoodLevelChangeEvent evt) { |   public void onFoodLevelChange(FoodLevelChangeEvent evt) { | ||||||
|     evt.setCancelled(true); |     evt.setCancelled(true); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   @EventHandler | ||||||
|  |   public void onItemPickup(PlayerPickupItemEvent evt) { | ||||||
|  |     NBTItem nbt = new NBTItem(evt.getItem().getItemStack()); | ||||||
|  |     if (nbt.hasKey("malloc")) { | ||||||
|  |       NBTCompound mallocData = nbt.getCompound("malloc"); | ||||||
|  |       if (mallocData.hasKey("coinValue")) { | ||||||
|  |         evt.setCancelled(true); | ||||||
|  |         Player player = evt.getPlayer(); | ||||||
|  |         int coinValue = mallocData.getInteger("coinValue") * evt.getItem().getItemStack().getAmount(); | ||||||
|  |         player.getWorld().playSound(evt.getPlayer(), Sound.BLOCK_CHAIN_PLACE, SoundCategory.PLAYERS, (float)1.0, (float)1.0); | ||||||
|  |         evt.getItem().remove(); | ||||||
|  |         for(GameRunner runner : m_runners) { | ||||||
|  |           if (runner.getPlayers().contains(player)) { | ||||||
|  |             runner.depositCoins(coinValue); | ||||||
|  |             return; | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -48,6 +48,7 @@ public class Plugin extends JavaPlugin { | |||||||
|   HashMap<String, GameRunner> m_runningGames = new HashMap<>(); |   HashMap<String, GameRunner> m_runningGames = new HashMap<>(); | ||||||
|   HashMap<Player, GameRunner> m_playerGames = new HashMap<>(); |   HashMap<Player, GameRunner> m_playerGames = new HashMap<>(); | ||||||
|   GameEventHandler m_handler = new GameEventHandler(); |   GameEventHandler m_handler = new GameEventHandler(); | ||||||
|  |   GameEconomy m_economy = new GameEconomy(this); | ||||||
|  |  | ||||||
|   public Collection<String> arenaNames() { |   public Collection<String> arenaNames() { | ||||||
|     return m_arenas.keySet(); |     return m_arenas.keySet(); | ||||||
| @@ -75,6 +76,9 @@ public class Plugin extends JavaPlugin { | |||||||
|  |  | ||||||
|     getServer().getPluginManager().registerEvents(new PlayerQuitHandler(), this); |     getServer().getPluginManager().registerEvents(new PlayerQuitHandler(), this); | ||||||
|     getServer().getPluginManager().registerEvents(m_handler, this); |     getServer().getPluginManager().registerEvents(m_handler, this); | ||||||
|  |  | ||||||
|  |     getLogger().info("Registering economy"); | ||||||
|  |     m_economy.register(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void onDisable() { |   public void onDisable() { | ||||||
| @@ -159,6 +163,14 @@ public class Plugin extends JavaPlugin { | |||||||
|     p.teleport(lobby.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN); |     p.teleport(lobby.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public GameRunner getRunnerForPlayer(String playerName) { | ||||||
|  |     return getRunnerForPlayer(getServer().getPlayer(playerName)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public void removePlayerFromGames(Player player) { | ||||||
|  |     m_playerGames.get(player).removePlayer(player); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   public GameRunner getRunnerForPlayer(Player p) { |   public GameRunner getRunnerForPlayer(Player p) { | ||||||
|     GameRunner ret = null; |     GameRunner ret = null; | ||||||
|     if (m_playerGames.containsKey(p)) { |     if (m_playerGames.containsKey(p)) { | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ public class LeaveGameCommand implements CommandExecutor { | |||||||
|         return true; |         return true; | ||||||
|       } |       } | ||||||
|       runner.removePlayer(player); |       runner.removePlayer(player); | ||||||
|  |       m_plugin.removePlayerFromGames(player); | ||||||
|       m_plugin.returnPlayerToLobby(player); |       m_plugin.returnPlayerToLobby(player); | ||||||
|     } else { |     } else { | ||||||
|       sender.sendMessage("Only players may use this command."); |       sender.sendMessage("Only players may use this command."); | ||||||
|   | |||||||
| @@ -66,6 +66,7 @@ public class GameRunner { | |||||||
|   TickTask m_lobbyReturnTask; |   TickTask m_lobbyReturnTask; | ||||||
|   TickTask m_bombSmokeTask; |   TickTask m_bombSmokeTask; | ||||||
|   TickTask m_bombCrackleTask; |   TickTask m_bombCrackleTask; | ||||||
|  |   TickTask m_playerRespawnTask; | ||||||
|  |  | ||||||
|   BossBars m_bars; |   BossBars m_bars; | ||||||
|   Sidebars m_sidebars; |   Sidebars m_sidebars; | ||||||
| @@ -94,6 +95,10 @@ public class GameRunner { | |||||||
|     validateGameRule(GameRule.SPECTATORS_GENERATE_CHUNKS, false); |     validateGameRule(GameRule.SPECTATORS_GENERATE_CHUNKS, false); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public GameState getState() { | ||||||
|  |     return m_state; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   public GameRunner(Plugin plugin, Game game, Arena arena, World world) { |   public GameRunner(Plugin plugin, Game game, Arena arena, World world) { | ||||||
|     m_plugin = plugin; |     m_plugin = plugin; | ||||||
|     m_game = game; |     m_game = game; | ||||||
| @@ -120,6 +125,19 @@ public class GameRunner { | |||||||
|       } |       } | ||||||
|     }, 80); |     }, 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, () -> { |     m_countdownTask = new TickTask(m_plugin, () -> { | ||||||
|       if (m_warmupCountdown == 0) { |       if (m_warmupCountdown == 0) { | ||||||
|         requestTransition(Stage.Playing); |         requestTransition(Stage.Playing); | ||||||
| @@ -176,6 +194,16 @@ public class GameRunner { | |||||||
|     m_mobs.handleEntityRetarget(evt); |     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) { |   public void handleEntityDamage(EntityDamageEvent evt) { | ||||||
|     m_mobs.handleEntityDamage(evt); |     m_mobs.handleEntityDamage(evt); | ||||||
|     if (m_mobs.bombWasHit() && !m_bombFuse.isExploded()) { |     if (m_mobs.bombWasHit() && !m_bombFuse.isExploded()) { | ||||||
| @@ -229,6 +257,8 @@ public class GameRunner { | |||||||
|     m_fuseTask.stop(); |     m_fuseTask.stop(); | ||||||
|     m_countdownTask.stop(); |     m_countdownTask.stop(); | ||||||
|     m_lobbyReturnTask.stop(); |     m_lobbyReturnTask.stop(); | ||||||
|  |     m_playerRespawnTask.stop(); | ||||||
|  |     m_state.resetBalances(); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -253,6 +283,7 @@ public class GameRunner { | |||||||
|       .create(); |       .create(); | ||||||
|     broadcastMessage(message); |     broadcastMessage(message); | ||||||
|     m_mobs.clear(); |     m_mobs.clear(); | ||||||
|  |     m_playerRespawnTask.start(); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -288,6 +319,7 @@ public class GameRunner { | |||||||
|     m_warmupCountdown = 10; |     m_warmupCountdown = 10; | ||||||
|     m_bars.setCountdownProgress(1.0); |     m_bars.setCountdownProgress(1.0); | ||||||
|     m_countdownTask.start(); |     m_countdownTask.start(); | ||||||
|  |     m_playerRespawnTask.start(); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -302,6 +334,7 @@ public class GameRunner { | |||||||
|     } |     } | ||||||
|     m_countdownTask.stop(); |     m_countdownTask.stop(); | ||||||
|     m_fuseTask.start(); |     m_fuseTask.start(); | ||||||
|  |     m_playerRespawnTask.start(); | ||||||
|     spawnNextBatch(); |     spawnNextBatch(); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
| @@ -311,7 +344,7 @@ public class GameRunner { | |||||||
|     m_lobbyReturnTask.start(); |     m_lobbyReturnTask.start(); | ||||||
|     m_countdownTask.stop(); |     m_countdownTask.stop(); | ||||||
|     m_fuseTask.stop(); |     m_fuseTask.stop(); | ||||||
|     //m_mobs.clear(); |     m_playerRespawnTask.stop(); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -330,7 +363,8 @@ public class GameRunner { | |||||||
|   private void handlePlayerDeath(Player player) { |   private void handlePlayerDeath(Player player) { | ||||||
|     if (m_players.requestTransition(player, PlayerManager.State.Dead)) { |     if (m_players.requestTransition(player, PlayerManager.State.Dead)) { | ||||||
|       m_world.strikeLightningEffect(player.getLocation()); |       m_world.strikeLightningEffect(player.getLocation()); | ||||||
|       if (!m_players.isAnyoneAlive()) { |       //if (!m_players.isAnyoneAlive()) { | ||||||
|  |       if (false) { | ||||||
|         BaseComponent[] message = new ComponentBuilder() |         BaseComponent[] message = new ComponentBuilder() | ||||||
|           .append("Everyone is ").color(ChatColor.LIGHT_PURPLE) |           .append("Everyone is ").color(ChatColor.LIGHT_PURPLE) | ||||||
|           .append("DEAD").color(ChatColor.RED).bold(true) |           .append("DEAD").color(ChatColor.RED).bold(true) | ||||||
| @@ -339,6 +373,14 @@ public class GameRunner { | |||||||
|         broadcastMessage(message); |         broadcastMessage(message); | ||||||
|         requestTransition(Stage.GameOver); |         requestTransition(Stage.GameOver); | ||||||
|       } else { |       } 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()); |         m_log.info("Remaining players " + m_players.remainingPlayers()); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| @@ -347,12 +389,15 @@ public class GameRunner { | |||||||
|   public void handleEntityDeath(Entity entity) { |   public void handleEntityDeath(Entity entity) { | ||||||
|     boolean wasCarrier = m_mobs.isBombCarrier(entity); |     boolean wasCarrier = m_mobs.isBombCarrier(entity); | ||||||
|     if (m_mobs.killMob(entity)) { |     if (m_mobs.killMob(entity)) { | ||||||
|  |       int COIN_STACK_SIZE = 5; | ||||||
|       int coinsToDrop = 60; |       int coinsToDrop = 60; | ||||||
|       while(coinsToDrop > 0) { |       while(coinsToDrop > 0) { | ||||||
|         int droppedCoins = Math.min(coinsToDrop, 5); |         int droppedCoins = Math.min(coinsToDrop, COIN_STACK_SIZE); | ||||||
|         ItemStack coins = Items.makeCoins(); |         ItemStack coins = Items.makeCoins(); | ||||||
|         coins.setAmount(droppedCoins); |         coins.setAmount(droppedCoins); | ||||||
|         coinsToDrop -= 64; |         coinsToDrop -= droppedCoins; | ||||||
|  |         m_state.addDroppedCoins(droppedCoins); | ||||||
|  |         m_sidebars.update(); | ||||||
|         m_world.dropItem(entity.getLocation(), coins); |         m_world.dropItem(entity.getLocation(), coins); | ||||||
|       } |       } | ||||||
|       m_bars.update(); |       m_bars.update(); | ||||||
| @@ -433,6 +478,14 @@ public class GameRunner { | |||||||
|     return false; |     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) { |   void sendStageTitle(Player p) { | ||||||
|     switch(m_stage) { |     switch(m_stage) { | ||||||
|       case Warmup: |       case Warmup: | ||||||
| @@ -451,6 +504,7 @@ public class GameRunner { | |||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     p.getInventory().clear(); |     p.getInventory().clear(); | ||||||
|  |     m_sidebars.addPlayer(p); | ||||||
|     m_players.addPlayer(p); |     m_players.addPlayer(p); | ||||||
|     m_bars.addPlayer(p); |     m_bars.addPlayer(p); | ||||||
|     if (m_stage == Stage.Idle || m_stage == Stage.Warmup) { |     if (m_stage == Stage.Idle || m_stage == Stage.Warmup) { | ||||||
| @@ -471,6 +525,7 @@ public class GameRunner { | |||||||
|  |  | ||||||
|   public void removePlayer(Player p) { |   public void removePlayer(Player p) { | ||||||
|     p.getInventory().clear(); |     p.getInventory().clear(); | ||||||
|  |     m_sidebars.removePlayer(p); | ||||||
|     m_bars.removePlayer(p); |     m_bars.removePlayer(p); | ||||||
|     m_players.removePlayer(p); |     m_players.removePlayer(p); | ||||||
|     if (m_players.isEmpty()) { |     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.Progress; | ||||||
| import gg.malloc.defense.model.State; | import gg.malloc.defense.model.State; | ||||||
|  |  | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
| public class GameState implements State { | public class GameState implements State { | ||||||
|   GameRunner m_runner; |   GameRunner m_runner; | ||||||
|   WaveManager m_waves; |   WaveManager m_waves; | ||||||
| @@ -12,6 +14,9 @@ public class GameState implements State { | |||||||
|   BombFuse m_fuse; |   BombFuse m_fuse; | ||||||
|   PlayerManager m_players; |   PlayerManager m_players; | ||||||
|  |  | ||||||
|  |   int m_coinsDropped; | ||||||
|  |   int m_coinsPickedUp; | ||||||
|  |  | ||||||
|   public GameState(GameRunner runner, WaveManager waves, Game game, MobManager mobs, BombFuse fuse, PlayerManager players) { |   public GameState(GameRunner runner, WaveManager waves, Game game, MobManager mobs, BombFuse fuse, PlayerManager players) { | ||||||
|     m_runner = runner; |     m_runner = runner; | ||||||
|     m_waves = waves; |     m_waves = waves; | ||||||
| @@ -19,6 +24,47 @@ public class GameState implements State { | |||||||
|     m_mobs = mobs; |     m_mobs = mobs; | ||||||
|     m_fuse = fuse; |     m_fuse = fuse; | ||||||
|     m_players = players; |     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() { |   public GameRunner.Stage getStage() { | ||||||
|   | |||||||
| @@ -16,6 +16,8 @@ import java.util.Collection; | |||||||
| public class PlayerManager { | public class PlayerManager { | ||||||
|   HashMap<Player, State> m_playerStates = new HashMap<>(); |   HashMap<Player, State> m_playerStates = new HashMap<>(); | ||||||
|   HashMap<Player, Boolean> m_playerReadyStates = 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 { |   public enum State { | ||||||
|     Idle, |     Idle, | ||||||
| @@ -68,22 +70,22 @@ public class PlayerManager { | |||||||
|  |  | ||||||
|   // Respawn player |   // Respawn player | ||||||
|   public boolean enterPlaying(Player player) { |   public boolean enterPlaying(Player player) { | ||||||
|     //m_log.fine("Respawning player " + player); |  | ||||||
|     player.setGameMode(Bukkit.getDefaultGameMode()); |     player.setGameMode(Bukkit.getDefaultGameMode()); | ||||||
|     healPlayer(player); |     healPlayer(player); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public boolean enterDead(Player player) { |   public boolean enterDead(Player player) { | ||||||
|     //m_log.info("Player has died in game" + player); |  | ||||||
|     player.setGameMode(GameMode.SPECTATOR); |     player.setGameMode(GameMode.SPECTATOR); | ||||||
|  |     m_respawnCounters.put(player, 15); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void addPlayer(Player player) { |   public void addPlayer(Player player) { | ||||||
|     //m_log.info("Adding player " + player);  |  | ||||||
|     m_playerStates.put(player, State.Idle); |     m_playerStates.put(player, State.Idle); | ||||||
|     m_playerReadyStates.put(player, false); |     m_playerReadyStates.put(player, false); | ||||||
|  |     m_playerExpenses.put(player, 0); | ||||||
|  |     m_respawnCounters.put(player, 0); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public boolean isReady(Player player) { |   public boolean isReady(Player player) { | ||||||
| @@ -111,14 +113,53 @@ public class PlayerManager { | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     return true; |     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) { |   public boolean removePlayer(Player player) { | ||||||
|     //m_log.info("Removing player " + player);  |  | ||||||
|     healPlayer(player); |     healPlayer(player); | ||||||
|     requestTransition(player, State.Idle); |     requestTransition(player, State.Idle); | ||||||
|     m_playerStates.remove(player); |     m_playerStates.remove(player); | ||||||
|     m_playerReadyStates.remove(player); |     m_playerReadyStates.remove(player); | ||||||
|  |     m_playerExpenses.remove(player); | ||||||
|  |     m_respawnCounters.remove(player); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,6 +4,9 @@ public interface Progress { | |||||||
|  |  | ||||||
|   int value(); |   int value(); | ||||||
|   int maximum(); |   int maximum(); | ||||||
|  |   default int remaining() { | ||||||
|  |     return maximum() - value(); | ||||||
|  |   } | ||||||
|   default double toDouble() { |   default double toDouble() { | ||||||
|     return Math.min(maximum(), Math.max(0.0, value())) / maximum(); |     return Math.min(maximum(), Math.max(0.0, value())) / maximum(); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -2,6 +2,8 @@ package gg.malloc.defense.model; | |||||||
|  |  | ||||||
| import gg.malloc.defense.engine.GameRunner; | import gg.malloc.defense.engine.GameRunner; | ||||||
|  |  | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
| public interface State { | public interface State { | ||||||
|   GameRunner.Stage getStage(); |   GameRunner.Stage getStage(); | ||||||
|  |  | ||||||
| @@ -9,4 +11,8 @@ public interface State { | |||||||
|   Progress waveProgress(); |   Progress waveProgress(); | ||||||
|   Progress mobProgress(); |   Progress mobProgress(); | ||||||
|   Progress playerReadyProgress(); |   Progress playerReadyProgress(); | ||||||
|  |   Progress coinProgress(); | ||||||
|  |  | ||||||
|  |   Progress playerRespawnProgress(Player p); | ||||||
|  |   int getPlayerBalance(Player p); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,6 +2,9 @@ package gg.malloc.defense.ui; | |||||||
|  |  | ||||||
| import gg.malloc.defense.model.Game; | import gg.malloc.defense.model.Game; | ||||||
| import gg.malloc.defense.model.State; | import gg.malloc.defense.model.State; | ||||||
|  | import gg.malloc.defense.model.Progress; | ||||||
|  |  | ||||||
|  | import java.util.HashMap; | ||||||
|  |  | ||||||
| import org.bukkit.boss.BossBar; | import org.bukkit.boss.BossBar; | ||||||
| import org.bukkit.boss.BarStyle; | import org.bukkit.boss.BarStyle; | ||||||
| @@ -13,6 +16,7 @@ public class BossBars { | |||||||
|   BossBar m_gameBar = Bukkit.createBossBar("Malloc Defense", BarColor.PURPLE, BarStyle.SOLID); |   BossBar m_gameBar = Bukkit.createBossBar("Malloc Defense", BarColor.PURPLE, BarStyle.SOLID); | ||||||
|   BossBar m_waveBar = Bukkit.createBossBar("Malloc Defense", BarColor.PURPLE, BarStyle.SOLID); |   BossBar m_waveBar = Bukkit.createBossBar("Malloc Defense", BarColor.PURPLE, BarStyle.SOLID); | ||||||
|   BossBar m_bombBar = Bukkit.createBossBar("Bomb Fuse", BarColor.RED, BarStyle.SOLID); |   BossBar m_bombBar = Bukkit.createBossBar("Bomb Fuse", BarColor.RED, BarStyle.SOLID); | ||||||
|  |   HashMap<Player, BossBar> m_respawnBars = new HashMap<>(); | ||||||
|  |  | ||||||
|   State m_gameState; |   State m_gameState; | ||||||
|  |  | ||||||
| @@ -33,12 +37,20 @@ public class BossBars { | |||||||
|     m_gameBar.addPlayer(p); |     m_gameBar.addPlayer(p); | ||||||
|     m_waveBar.addPlayer(p); |     m_waveBar.addPlayer(p); | ||||||
|     m_bombBar.addPlayer(p); |     m_bombBar.addPlayer(p); | ||||||
|  |     BossBar respawnBar = Bukkit.createBossBar("Respawn", BarColor.BLUE, BarStyle.SOLID); | ||||||
|  |     respawnBar.addPlayer(p); | ||||||
|  |     respawnBar.setVisible(false); | ||||||
|  |     m_respawnBars.put(p, respawnBar); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void removePlayer(Player p) { |   public void removePlayer(Player p) { | ||||||
|     m_gameBar.removePlayer(p); |     m_gameBar.removePlayer(p); | ||||||
|     m_waveBar.removePlayer(p); |     m_waveBar.removePlayer(p); | ||||||
|     m_bombBar.removePlayer(p); |     m_bombBar.removePlayer(p); | ||||||
|  |     if (m_respawnBars.containsKey(p)) { | ||||||
|  |       m_respawnBars.get(p).removePlayer(p); | ||||||
|  |       m_respawnBars.remove(p); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void update() { |   public void update() { | ||||||
| @@ -100,5 +112,15 @@ public class BossBars { | |||||||
|         m_bombBar.setVisible(false); |         m_bombBar.setVisible(false); | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |     for (Player p : m_respawnBars.keySet()) { | ||||||
|  |       Progress respawnProgress = m_gameState.playerRespawnProgress(p); | ||||||
|  |       if (respawnProgress.value() > 0) { | ||||||
|  |         m_respawnBars.get(p).setVisible(true); | ||||||
|  |         m_respawnBars.get(p).setProgress(respawnProgress.toDouble()); | ||||||
|  |         m_respawnBars.get(p).setTitle("Respawning in " + respawnProgress.value()); | ||||||
|  |       } else { | ||||||
|  |         m_respawnBars.get(p).setVisible(false); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ import org.bukkit.scoreboard.DisplaySlot; | |||||||
| import org.bukkit.scoreboard.Score; | import org.bukkit.scoreboard.Score; | ||||||
| import org.bukkit.scoreboard.Team; | import org.bukkit.scoreboard.Team; | ||||||
| import org.bukkit.scoreboard.Objective; | import org.bukkit.scoreboard.Objective; | ||||||
|  | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
| public class Sidebar { | public class Sidebar { | ||||||
|   Scoreboard m_scoreboard; |   Scoreboard m_scoreboard; | ||||||
| @@ -19,12 +20,14 @@ public class Sidebar { | |||||||
|   ArrayList<String> m_rowKeys; |   ArrayList<String> m_rowKeys; | ||||||
|   HashMap<Integer, String> m_rows; |   HashMap<Integer, String> m_rows; | ||||||
|   ArrayList<Team> m_teams; |   ArrayList<Team> m_teams; | ||||||
|  |   Player m_player; | ||||||
|   int m_size; |   int m_size; | ||||||
|  |  | ||||||
|   State m_state; |   State m_state; | ||||||
|  |  | ||||||
|   public Sidebar(State state, Scoreboard scoreboard) { |   public Sidebar(State state, Scoreboard scoreboard, Player player) { | ||||||
|     m_state = state; |     m_state = state; | ||||||
|  |     m_player = player; | ||||||
|     m_scoreboard = scoreboard; |     m_scoreboard = scoreboard; | ||||||
|     m_objective = m_scoreboard.registerNewObjective("text", "dummy", ChatColor.LIGHT_PURPLE + "" + ChatColor.BOLD + "Malloc Defense"); |     m_objective = m_scoreboard.registerNewObjective("text", "dummy", ChatColor.LIGHT_PURPLE + "" + ChatColor.BOLD + "Malloc Defense"); | ||||||
|     m_objective.setDisplaySlot(DisplaySlot.SIDEBAR); |     m_objective.setDisplaySlot(DisplaySlot.SIDEBAR); | ||||||
| @@ -34,6 +37,7 @@ public class Sidebar { | |||||||
|     m_rowKeys.add(ChatColor.BLACK + "" + ChatColor.WHITE); |     m_rowKeys.add(ChatColor.BLACK + "" + ChatColor.WHITE); | ||||||
|     m_rowKeys.add(ChatColor.GOLD+ "" + ChatColor.WHITE); |     m_rowKeys.add(ChatColor.GOLD+ "" + ChatColor.WHITE); | ||||||
|     m_rowKeys.add(ChatColor.WHITE+ "" + ChatColor.WHITE); |     m_rowKeys.add(ChatColor.WHITE+ "" + ChatColor.WHITE); | ||||||
|  |     m_rowKeys.add(ChatColor.BLACK+ "" + ChatColor.BLACK); | ||||||
|     for(String key : m_rowKeys) { |     for(String key : m_rowKeys) { | ||||||
|       Team team = m_scoreboard.registerNewTeam(key); |       Team team = m_scoreboard.registerNewTeam(key); | ||||||
|       team.addEntry(key); |       team.addEntry(key); | ||||||
| @@ -50,20 +54,23 @@ public class Sidebar { | |||||||
|       case Warmup: |       case Warmup: | ||||||
|         m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum()); |         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(1, ChatColor.AQUA + "Get ready!"); | ||||||
|         m_rows.put(2, ChatColor.AQUA + "Balance: "); |         m_rows.put(2, ChatColor.AQUA + "Balance: " + m_state.getPlayerBalance(m_player)); | ||||||
|         m_size = 3; |         m_rows.put(3, ChatColor.AQUA + "Coins remaining: " + m_state.coinProgress().remaining()); | ||||||
|  |         m_size = 4; | ||||||
|         break; |         break; | ||||||
|       case Countdown: |       case Countdown: | ||||||
|         m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum()); |         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(1, ChatColor.GOLD + "Wave incoming!"); | ||||||
|         m_rows.put(2, ChatColor.AQUA + "Balance: "); |         m_rows.put(2, ChatColor.AQUA + "Balance: " + m_state.getPlayerBalance(m_player)); | ||||||
|         m_size = 3; |         m_rows.put(3, ChatColor.AQUA + "Coins remaining: " + m_state.coinProgress().remaining()); | ||||||
|  |         m_size = 4; | ||||||
|         break; |         break; | ||||||
|       case Playing: |       case Playing: | ||||||
|         m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum()); |         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(1, ChatColor.GREEN + "Mobs remaining: " + m_state.mobProgress().remaining()); | ||||||
|         m_rows.put(2, ChatColor.AQUA + "Balance: "); |         m_rows.put(2, ChatColor.AQUA + "Balance: " + m_state.getPlayerBalance(m_player)); | ||||||
|         m_size = 3; |         m_rows.put(3, ChatColor.AQUA + "Coins remaining: " + m_state.coinProgress().remaining()); | ||||||
|  |         m_size = 4; | ||||||
|         break; |         break; | ||||||
|       case GameOver: |       case GameOver: | ||||||
|         m_rows.put(0, ChatColor.RED + "Game over!"); |         m_rows.put(0, ChatColor.RED + "Game over!"); | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ public class Sidebars { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   public void addPlayer(Player player) { |   public void addPlayer(Player player) { | ||||||
|     m_sidebars.put(player, new Sidebar(m_state, m_scoreboards.getNewScoreboard())); |     m_sidebars.put(player, new Sidebar(m_state, m_scoreboards.getNewScoreboard(), player)); | ||||||
|     player.setScoreboard(m_sidebars.get(player).getScoreboard()); |     player.setScoreboard(m_sidebars.get(player).getScoreboard()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ name: Malloc-Defense | |||||||
| version: 1.0 | version: 1.0 | ||||||
| api-version: 1.18 | api-version: 1.18 | ||||||
| main: gg.malloc.defense.Plugin | main: gg.malloc.defense.Plugin | ||||||
| depend:  [] | depend:  [Vault] | ||||||
| commands: | commands: | ||||||
|   ready: |   ready: | ||||||
|     description: Mark yourself as ready for the next wave |     description: Mark yourself as ready for the next wave | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user