Implement some chat colors/messages, coin drops, lobby lifecycle
This commit is contained in:
		
							
								
								
									
										44
									
								
								TODO.md
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								TODO.md
									
									
									
									
									
								
							| @@ -12,18 +12,22 @@ | |||||||
| [X] Config reload | [X] Config reload | ||||||
| [X] Leave games | [X] Leave games | ||||||
| [X] Join games | [X] Join games | ||||||
| [ ] Lobby with instructions | [X] Drop back to lobby on game over | ||||||
| [ ] Drop back to lobby on game over | [X] Grist drops | ||||||
| [ ] Grist drops | [ ] Chat colors + clickables | ||||||
| [ ] Item shoppes | [ ] Title colors | ||||||
| [ ] Command tab completion | [ ] Command tab completion | ||||||
|  | [ ] Lobby with instructions | ||||||
|  | [ ] Item shoppes | ||||||
|  | [ ] Mob category AI | ||||||
|  | [ ] Indestructible weapons/armor | ||||||
|  | [ ] Never hungry | ||||||
|  |  | ||||||
| # Scaled waves | # Scaled waves | ||||||
|  |  | ||||||
| [ ] Limit ranged mobs and Ravagers to non-bomb-carrier state | [ ] Limit ranged mobs and Ravagers to non-bomb-carrier state | ||||||
| [ ] Weaker mobs, more of them | [ ] Weaker mobs, more of them | ||||||
| [ ] Mob categories | [ ] Mob AI categories | ||||||
| [ ] Spawnpoint categories |  | ||||||
|  |  | ||||||
| # UX | # UX | ||||||
|  |  | ||||||
| @@ -32,17 +36,19 @@ | |||||||
| [X] Stage titles | [X] Stage titles | ||||||
| [X] EXPLOSIONS | [X] EXPLOSIONS | ||||||
| [X] Bomb model | [X] Bomb model | ||||||
| [ ] Pretty bomb model | [X] "Player $X is ready" message in chat | ||||||
| [ ] "Player $X is ready" message in chat | [X] Clickable /ready in chat | ||||||
| [ ] Colored titles | [ ] Post-Round summary in chat | ||||||
| [ ] Clickable join links in /list | [ ] Clickable join links in /list | ||||||
|  | [ ] Sidebar | ||||||
|  | [ ] Coin pickup messages in action bar | ||||||
|  | [ ] Target catches on fire more it is lit | ||||||
|  | [ ] Colored titles | ||||||
| [ ] Clickable /leave action | [ ] Clickable /leave action | ||||||
| [ ] Clickable /ready in chat |  | ||||||
| [ ] Countdown while in warmup | [ ] Countdown while in warmup | ||||||
| [ ] Countdown shrinks w/ every /ready player | [ ] Countdown shrinks w/ every /ready player | ||||||
| [ ] Target catches on fire more it is lit |  | ||||||
| [ ] Sidebar |  | ||||||
| [ ] List of mobs in next wave | [ ] List of mobs in next wave | ||||||
|  | [ ] Pretty bomb model | ||||||
|  |  | ||||||
| # Social | # Social | ||||||
|  |  | ||||||
| @@ -71,6 +77,7 @@ | |||||||
| [X] Randomized spawn locations | [X] Randomized spawn locations | ||||||
| [X] Weighted distributions | [X] Weighted distributions | ||||||
| [X] Batch overlap | [X] Batch overlap | ||||||
|  | [ ] Spawnpoint categories | ||||||
| [ ] Scripted batch overlap/timings | [ ] Scripted batch overlap/timings | ||||||
| [ ] Scripted spawn locations | [ ] Scripted spawn locations | ||||||
| [ ] Scripted waypoint paths | [ ] Scripted waypoint paths | ||||||
| @@ -87,26 +94,29 @@ | |||||||
| [X] /join games | [X] /join games | ||||||
| [X] /ready | [X] /ready | ||||||
| [X] /leave games | [X] /leave games | ||||||
| [ ] /restart games |  | ||||||
| [X] Spectator mode on death | [X] Spectator mode on death | ||||||
| [X] Player readiness starts countdown | [X] Player readiness starts countdown | ||||||
| [ ] Game is automatically closed some time after game over | [X] Game is automatically closed some time after game over | ||||||
| [ ] Return to lobby on leave/close | [X] Return to lobby on leave/close | ||||||
|  | [X] Restore health+hunger on respawn/game start | ||||||
|  | [ ] /restart games | ||||||
| [ ] Instancing | [ ] Instancing | ||||||
| [ ] Restore health+hunger on respawn/game start |  | ||||||
| [ ] Respawn during games | [ ] Respawn during games | ||||||
| [ ] Player revival items | [ ] Player revival items | ||||||
|  | [ ] Clear inventory on join/leave | ||||||
|  |  | ||||||
| # Powerups | # Powerups | ||||||
|  |  | ||||||
|  | [ ] Enchantments | ||||||
|  | [ ] Better items | ||||||
| [ ] Coin pickup range | [ ] Coin pickup range | ||||||
| [ ] Coin boost | [ ] Coin boost | ||||||
| [ ] Knockback on weapons | [ ] Knockback on weapons | ||||||
| [ ] Damage boost | [ ] Damage boost | ||||||
| [ ] Speed boost | [ ] Speed boost | ||||||
| [ ] Health boost | [ ] Health boost | ||||||
| [ ] Repair barriers |  | ||||||
|  |  | ||||||
| # Fantasy | # Fantasy | ||||||
|  |  | ||||||
| [ ] Totems/turrets/stationary weapons | [ ] Totems/turrets/stationary weapons | ||||||
|  | [ ] Repair barriers | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -37,6 +37,12 @@ | |||||||
|             <version>1.18.2-R0.1-SNAPSHOT</version> |             <version>1.18.2-R0.1-SNAPSHOT</version> | ||||||
|             <scope>provided</scope> |             <scope>provided</scope> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>de.tr7zw</groupId> | ||||||
|  |             <artifactId>item-nbt-api-plugin</artifactId> | ||||||
|  |             <version>2.9.2</version> | ||||||
|  |             <scope>provided</scope> | ||||||
|  |         </dependency> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|      |      | ||||||
| </project> | </project> | ||||||
|   | |||||||
| @@ -9,9 +9,10 @@ import org.bukkit.entity.Player; | |||||||
| import org.bukkit.World; | import org.bukkit.World; | ||||||
| import org.bukkit.WorldCreator; | import org.bukkit.WorldCreator; | ||||||
|  |  | ||||||
| import org.bukkit.event.Listener; |  | ||||||
| import org.bukkit.event.player.PlayerQuitEvent; |  | ||||||
| import org.bukkit.event.EventHandler; | import org.bukkit.event.EventHandler; | ||||||
|  | import org.bukkit.event.Listener; | ||||||
|  | import org.bukkit.event.player.PlayerTeleportEvent; | ||||||
|  | import org.bukkit.event.player.PlayerQuitEvent; | ||||||
|  |  | ||||||
| import java.util.logging.Logger; | import java.util.logging.Logger; | ||||||
| import java.util.logging.Level; | import java.util.logging.Level; | ||||||
| @@ -76,6 +77,21 @@ public class Plugin extends JavaPlugin { | |||||||
|     getServer().getPluginManager().registerEvents(m_handler, this); |     getServer().getPluginManager().registerEvents(m_handler, this); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public void onDisable() { | ||||||
|  |     getLogger().info("Unloading games..."); | ||||||
|  |     for(GameRunner runner : m_runningGames.values()) { | ||||||
|  |       runner.requestTransition(GameRunner.Stage.Idle); | ||||||
|  |     } | ||||||
|  |     for(Player player : m_playerGames.keySet()) { | ||||||
|  |       m_playerGames.get(player).removePlayer(player); | ||||||
|  |       returnPlayerToLobby(player); | ||||||
|  |     } | ||||||
|  |     m_runningGames.clear(); | ||||||
|  |     m_playerGames.clear(); | ||||||
|  |     m_handler.clear(); | ||||||
|  |     m_arenas.clear(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   public void reloadArenas() { |   public void reloadArenas() { | ||||||
|     getLogger().info("Loading arenas..."); |     getLogger().info("Loading arenas..."); | ||||||
|     saveDefaultConfig(); |     saveDefaultConfig(); | ||||||
| @@ -87,6 +103,7 @@ public class Plugin extends JavaPlugin { | |||||||
|     } |     } | ||||||
|     for(Player player : m_playerGames.keySet()) { |     for(Player player : m_playerGames.keySet()) { | ||||||
|       m_playerGames.get(player).removePlayer(player); |       m_playerGames.get(player).removePlayer(player); | ||||||
|  |       returnPlayerToLobby(player); | ||||||
|     } |     } | ||||||
|     m_runningGames.clear(); |     m_runningGames.clear(); | ||||||
|     m_playerGames.clear(); |     m_playerGames.clear(); | ||||||
| @@ -133,6 +150,15 @@ public class Plugin extends JavaPlugin { | |||||||
|     return ret; |     return ret; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public void returnPlayerToLobby(Player p) { | ||||||
|  |     Configuration config = new Configuration(getConfig()); | ||||||
|  |     World lobby = getServer().getWorld(config.getLobbyName()); | ||||||
|  |     if (lobby == null) { | ||||||
|  |       lobby = new WorldCreator(config.getLobbyName()).generateStructures(false).createWorld(); | ||||||
|  |     } | ||||||
|  |     p.teleport(lobby.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   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)) { | ||||||
|   | |||||||
| @@ -49,7 +49,7 @@ public class JoinGameCommand implements TabExecutor { | |||||||
|       } |       } | ||||||
|       m_plugin.addPlayerToArena(arenaName, player); |       m_plugin.addPlayerToArena(arenaName, player); | ||||||
|     } else { |     } else { | ||||||
|       sender.sendMessage("Only players may use htis command."); |       sender.sendMessage("Only players may use this command."); | ||||||
|     } |     } | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ public class LeaveGameCommand implements CommandExecutor { | |||||||
|         return true; |         return true; | ||||||
|       } |       } | ||||||
|       runner.removePlayer(player); |       runner.removePlayer(player); | ||||||
|  |       m_plugin.returnPlayerToLobby(player); | ||||||
|     } else { |     } else { | ||||||
|       sender.sendMessage("Only players may use htis command."); |       sender.sendMessage("Only players may use htis command."); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -18,6 +18,11 @@ public class Configuration { | |||||||
|     m_root = rootConfig; |     m_root = rootConfig; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public String getLobbyName() { | ||||||
|  |     ConfigurationSection lobbyConf = m_root.getConfigurationSection("lobby"); | ||||||
|  |     return lobbyConf.getString("world"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   public Collection<String> getMapNames() { |   public Collection<String> getMapNames() { | ||||||
|     ConfigurationSection mapList = m_root.getConfigurationSection("maps"); |     ConfigurationSection mapList = m_root.getConfigurationSection("maps"); | ||||||
|     return mapList.getKeys(false); |     return mapList.getKeys(false); | ||||||
|   | |||||||
| @@ -5,8 +5,14 @@ import gg.malloc.defense.model.Game; | |||||||
| import gg.malloc.defense.model.Spawner; | import gg.malloc.defense.model.Spawner; | ||||||
| import gg.malloc.defense.model.Waypoint; | 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.BombCarrier; | ||||||
| import gg.malloc.defense.ui.BossBars; | import gg.malloc.defense.ui.BossBars; | ||||||
|  | import gg.malloc.defense.ui.Items; | ||||||
|  |  | ||||||
| import gg.malloc.defense.Plugin; | import gg.malloc.defense.Plugin; | ||||||
|  |  | ||||||
| @@ -31,6 +37,7 @@ import org.bukkit.attribute.Attribute; | |||||||
| import org.bukkit.attribute.AttributeModifier; | import org.bukkit.attribute.AttributeModifier; | ||||||
| import org.bukkit.entity.LivingEntity; | import org.bukkit.entity.LivingEntity; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
|  | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
| public class GameRunner { | public class GameRunner { | ||||||
|   Arena m_arena; |   Arena m_arena; | ||||||
| @@ -56,6 +63,7 @@ public class GameRunner { | |||||||
|  |  | ||||||
|   TickTask m_fuseTask; |   TickTask m_fuseTask; | ||||||
|   TickTask m_countdownTask; |   TickTask m_countdownTask; | ||||||
|  |   TickTask m_lobbyReturnTask; | ||||||
|   TickTask m_bombSmokeTask; |   TickTask m_bombSmokeTask; | ||||||
|   TickTask m_bombCrackleTask; |   TickTask m_bombCrackleTask; | ||||||
|  |  | ||||||
| @@ -91,14 +99,36 @@ public class GameRunner { | |||||||
|       if (m_warmupCountdown == 0) { |       if (m_warmupCountdown == 0) { | ||||||
|         requestTransition(Stage.Playing); |         requestTransition(Stage.Playing); | ||||||
|       } else { |       } else { | ||||||
|         m_bars.update(); |         BaseComponent[] message = new ComponentBuilder() | ||||||
|         broadcastMessage("Starting game in " + m_warmupCountdown); |           .append("Starting game in ").color(ChatColor.LIGHT_PURPLE) | ||||||
|  |           .append("" + m_warmupCountdown).color(ChatColor.AQUA).bold(true) | ||||||
|  |           .create(); | ||||||
|  |         broadcastMessage(message); | ||||||
|         m_warmupCountdown--; |         m_warmupCountdown--; | ||||||
|         m_bars.setCountdownProgress((double)m_warmupCountdown / 10.0); |         m_bars.setCountdownProgress((double)m_warmupCountdown / 10.0); | ||||||
|         m_bars.update(); |         m_bars.update(); | ||||||
|       } |       } | ||||||
|     }, 20); |     }, 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, () -> { |     m_bombSmokeTask = new TickTask(m_plugin, () -> { | ||||||
|       Location targetLoc = getLocation(m_arena.bombTarget()); |       Location targetLoc = getLocation(m_arena.bombTarget()); | ||||||
|       m_world.spawnParticle(Particle.SMOKE_LARGE, targetLoc, 35, 4, 2, 4); |       m_world.spawnParticle(Particle.SMOKE_LARGE, targetLoc, 35, 4, 2, 4); | ||||||
| @@ -111,6 +141,7 @@ public class GameRunner { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   int m_warmupCountdown = 0; |   int m_warmupCountdown = 0; | ||||||
|  |   int m_gameEndCountdown = 0; | ||||||
|  |  | ||||||
|   public void handleEntityRetargeting(EntityTargetEvent evt) { |   public void handleEntityRetargeting(EntityTargetEvent evt) { | ||||||
|     m_mobs.handleEntityRetarget(evt); |     m_mobs.handleEntityRetarget(evt); | ||||||
| @@ -129,12 +160,23 @@ public class GameRunner { | |||||||
|         m_world.strikeLightningEffect(getLocation(m_arena.bombTarget())); |         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.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); |         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); |         requestTransition(Stage.GameOver); | ||||||
|         m_bombSmokeTask.start(); |         m_bombSmokeTask.start(); | ||||||
|         m_bombCrackleTask.start(); |         m_bombCrackleTask.start(); | ||||||
|       } |       } | ||||||
|     } else if (evt.getEntity() instanceof Player) { |     } else if (evt.getEntity() instanceof Player) { | ||||||
|       Player player = (Player)evt.getEntity(); |       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) { |       if (m_players.contains(player) && player.getHealth() - evt.getFinalDamage() <= 0) { | ||||||
|         evt.setCancelled(true); |         evt.setCancelled(true); | ||||||
|         handlePlayerDeath(player); |         handlePlayerDeath(player); | ||||||
| @@ -151,6 +193,7 @@ public class GameRunner { | |||||||
|     m_players.requestTransitionForAll(PlayerManager.State.Idle); |     m_players.requestTransitionForAll(PlayerManager.State.Idle); | ||||||
|     m_fuseTask.stop(); |     m_fuseTask.stop(); | ||||||
|     m_countdownTask.stop(); |     m_countdownTask.stop(); | ||||||
|  |     m_lobbyReturnTask.stop(); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -162,7 +205,13 @@ public class GameRunner { | |||||||
|         } |         } | ||||||
|         m_players.setReady(p, false); |         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(); |     m_mobs.clear(); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
| @@ -171,8 +220,24 @@ public class GameRunner { | |||||||
|     setPlayerReady(p, !m_players.isReady(p)); |     setPlayerReady(p, !m_players.isReady(p)); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   void clearReadyState() { | ||||||
|  |     for(Player p : m_players.getPlayers()) { | ||||||
|  |       setPlayerReady(p, false); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   public void setPlayerReady(Player p, boolean isReady) { |   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()) { |     if (m_players.isEveryoneReady()) { | ||||||
|       requestTransition(Stage.Countdown); |       requestTransition(Stage.Countdown); | ||||||
|     } |     } | ||||||
| @@ -197,19 +262,15 @@ public class GameRunner { | |||||||
|     m_countdownTask.stop(); |     m_countdownTask.stop(); | ||||||
|     m_fuseTask.start(); |     m_fuseTask.start(); | ||||||
|     spawnNextBatch(); |     spawnNextBatch(); | ||||||
|     broadcastTitle("Wave " + m_waves.currentWaveNum()); |  | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   private boolean enterGameOver() { |   private boolean enterGameOver() { | ||||||
|     broadcastTitle("Game Over!"); |     m_gameEndCountdown = 60; | ||||||
|     broadcastMessage("The bomb blew up!"); |     m_lobbyReturnTask.start(); | ||||||
|     m_countdownTask.stop(); |     m_countdownTask.stop(); | ||||||
|     m_fuseTask.stop(); |     m_fuseTask.stop(); | ||||||
|     m_mobs.clear(); |     m_mobs.clear(); | ||||||
|     for(Player p : new ArrayList<Player>(m_players.getPlayers())) { |  | ||||||
|       removePlayer(p); |  | ||||||
|     } |  | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -218,7 +279,7 @@ public class GameRunner { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   private void spawnNextBatch() { |   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); |     Spawner spawner = new GameSpawner(m_world, m_arena, m_mobs, m_players); | ||||||
|     m_waves.currentWave().spawnBatch(spawner, m_waves.currentBatchNum()); |     m_waves.currentWave().spawnBatch(spawner, m_waves.currentBatchNum()); | ||||||
|     m_bars.update(); |     m_bars.update(); | ||||||
| @@ -228,7 +289,12 @@ public class GameRunner { | |||||||
|     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()) { | ||||||
|         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); |         requestTransition(Stage.GameOver); | ||||||
|       } else { |       } else { | ||||||
|         m_log.info("Remaining players " + m_players.remainingPlayers()); |         m_log.info("Remaining players " + m_players.remainingPlayers()); | ||||||
| @@ -239,11 +305,23 @@ 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 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(); |       m_bars.update(); | ||||||
|       if (m_mobs.remainingMobs() <= 3) { |       if (m_mobs.remainingMobs() <= 3) { | ||||||
|         m_log.info("Starting next batch!"); |         m_log.info("Starting next batch!"); | ||||||
|         if (m_waves.isLastBatch()) { |         if (m_waves.isLastBatch()) { | ||||||
|           if (m_waves.isLastWave()) { |           if (m_waves.isLastWave()) { | ||||||
|  |             BaseComponent[] message = new ComponentBuilder() | ||||||
|  |               .append("You Won!").color(ChatColor.LIGHT_PURPLE).bold(true) | ||||||
|  |               .create(); | ||||||
|  |             broadcastMessage(message); | ||||||
|             requestTransition(Stage.GameOver); |             requestTransition(Stage.GameOver); | ||||||
|           } else if (m_mobs.empty()) { |           } else if (m_mobs.empty()) { | ||||||
|             requestTransition(Stage.Warmup); |             requestTransition(Stage.Warmup); | ||||||
| @@ -262,7 +340,6 @@ public class GameRunner { | |||||||
|     if (m_stage == stage) { |     if (m_stage == stage) { | ||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
|     m_log.info("Game state: " + stage); |  | ||||||
|     switch(stage) { |     switch(stage) { | ||||||
|       case Idle: |       case Idle: | ||||||
|         return enterIdle(); |         return enterIdle(); | ||||||
| @@ -303,12 +380,28 @@ public class GameRunner { | |||||||
|       m_log.info("Game transition: " + m_stage + " -> " + stage); |       m_log.info("Game transition: " + m_stage + " -> " + stage); | ||||||
|       m_stage = stage; |       m_stage = stage; | ||||||
|       m_bars.update(); |       m_bars.update(); | ||||||
|  |       for(Player p : m_players.getPlayers()) { | ||||||
|  |         sendStageTitle(p); | ||||||
|  |       } | ||||||
|       return true; |       return true; | ||||||
|     } |     } | ||||||
|     m_log.severe("Failed to complete transition: " + m_stage + " -> " + stage); |     m_log.severe("Failed to complete transition: " + m_stage + " -> " + stage); | ||||||
|     return false; |     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) { |   public void addPlayer(Player p) { | ||||||
|     if (m_players.contains(p)) { |     if (m_players.contains(p)) { | ||||||
|       return; |       return; | ||||||
| @@ -319,7 +412,12 @@ public class GameRunner { | |||||||
|       if (m_players.requestTransition(p, PlayerManager.State.Playing)) { |       if (m_players.requestTransition(p, PlayerManager.State.Playing)) { | ||||||
|         p.teleport(m_world.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN); |         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) { |       if (m_stage == Stage.Idle) { | ||||||
|         requestTransition(Stage.Warmup); |         requestTransition(Stage.Warmup); | ||||||
|       } |       } | ||||||
| @@ -331,6 +429,12 @@ public class GameRunner { | |||||||
|     m_players.removePlayer(p); |     m_players.removePlayer(p); | ||||||
|     if (m_players.isEmpty()) { |     if (m_players.isEmpty()) { | ||||||
|       requestTransition(Stage.Idle); |       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()) { |     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); |     //m_log.fine("Respawning player " + player); | ||||||
|     player.setGameMode(Bukkit.getDefaultGameMode()); |     player.setGameMode(Bukkit.getDefaultGameMode()); | ||||||
|     player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); |     player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); | ||||||
|     player.setFoodLevel(10); |     player.setFoodLevel(20); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -109,6 +109,7 @@ public class PlayerManager { | |||||||
|     //m_log.info("Removing player " + player);  |     //m_log.info("Removing player " + player);  | ||||||
|     requestTransition(player, State.Idle); |     requestTransition(player, State.Idle); | ||||||
|     m_playerStates.remove(player); |     m_playerStates.remove(player); | ||||||
|  |     m_playerReadyStates.remove(player); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -15,23 +15,15 @@ public class BombCarrier { | |||||||
|  |  | ||||||
|   public LivingEntity inHand() { |   public LivingEntity inHand() { | ||||||
|     EntityEquipment equipment = m_entity.getEquipment(); |     EntityEquipment equipment = m_entity.getEquipment(); | ||||||
|     equipment.setItemInOffHand(makeBombHelmet()); |     equipment.setItemInOffHand(Items.makeBombHelmet()); | ||||||
|     //equipment.setItemInOffHandDropChance(0.0f); |     //equipment.setItemInOffHandDropChance(0.0f); | ||||||
|     return m_entity; |     return m_entity; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public LivingEntity onHead() { |   public LivingEntity onHead() { | ||||||
|     EntityEquipment equipment = m_entity.getEquipment(); |     EntityEquipment equipment = m_entity.getEquipment(); | ||||||
|     equipment.setHelmet(makeBombHelmet()); |     equipment.setHelmet(Items.makeBombHelmet()); | ||||||
|     //equipment.setHelmetDropChance(0.0f); |     //equipment.setHelmetDropChance(0.0f); | ||||||
|     return m_entity; |     return m_entity; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   static ItemStack makeBombHelmet() { |  | ||||||
|       ItemStack bombItem = new ItemStack(Material.CARVED_PUMPKIN); |  | ||||||
|       ItemMeta meta = bombItem.getItemMeta(); |  | ||||||
|       meta.setCustomModelData(33197); |  | ||||||
|       bombItem.setItemMeta(meta); |  | ||||||
|       return bombItem; |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -108,7 +108,10 @@ public class BossBars { | |||||||
|         m_gameBar.setColor(BarColor.RED); |         m_gameBar.setColor(BarColor.RED); | ||||||
|         m_gameBar.setProgress(1.0); |         m_gameBar.setProgress(1.0); | ||||||
|         m_gameBar.setTitle("Game Over!"); |         m_gameBar.setTitle("Game Over!"); | ||||||
|         m_waveBar.setVisible(false); |         m_waveBar.setVisible(true); | ||||||
|  |         m_waveBar.setColor(BarColor.BLUE); | ||||||
|  |         m_waveBar.setTitle("Returning to lobby..."); | ||||||
|  |         m_waveBar.setProgress(m_countdownProgress); | ||||||
|         m_bombBar.setVisible(false); |         m_bombBar.setVisible(false); | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,14 +1,29 @@ | |||||||
| package gg.malloc.defense.engine; | package gg.malloc.defense.ui; | ||||||
|  |  | ||||||
| import org.bukkit.inventory.ItemStack; | import org.bukkit.inventory.ItemStack; | ||||||
| import org.bukkit.inventory.meta.ItemMeta; | import org.bukkit.inventory.meta.ItemMeta; | ||||||
| import org.bukkit.Material; | import org.bukkit.Material; | ||||||
|  |  | ||||||
|  | import de.tr7zw.nbtapi.NBTItem; | ||||||
|  | import de.tr7zw.nbtapi.NBTCompound; | ||||||
|  |  | ||||||
| public class Items { | public class Items { | ||||||
|   static ItemStack makeBombHelmet() { |   public static ItemStack makeCoins() { | ||||||
|  |       ItemStack coinItem = new ItemStack(Material.IRON_NUGGET); | ||||||
|  |       ItemMeta meta = coinItem.getItemMeta(); | ||||||
|  |       meta.setCustomModelData(93197); | ||||||
|  |       coinItem.setItemMeta(meta); | ||||||
|  |  | ||||||
|  |       NBTItem nbt = new NBTItem(coinItem); | ||||||
|  |       nbt.addCompound("malloc").setInteger("coinValue", 1); | ||||||
|  |  | ||||||
|  |       return nbt.getItem(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   public static ItemStack makeBombHelmet() { | ||||||
|       ItemStack bombItem = new ItemStack(Material.CARVED_PUMPKIN); |       ItemStack bombItem = new ItemStack(Material.CARVED_PUMPKIN); | ||||||
|       ItemMeta meta = bombItem.getItemMeta(); |       ItemMeta meta = bombItem.getItemMeta(); | ||||||
|       meta.setCustomModelData(0); |       meta.setCustomModelData(33197); | ||||||
|       bombItem.setItemMeta(meta); |       bombItem.setItemMeta(meta); | ||||||
|       return bombItem; |       return bombItem; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | lobby: | ||||||
|  |   world: world | ||||||
| maps: | maps: | ||||||
|   quarry: |   quarry: | ||||||
|     target: |     target: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user