Initial commit
This commit is contained in:
		
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| test-server | ||||
| *.swp | ||||
| target | ||||
							
								
								
									
										42
									
								
								pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								pom.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
|          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|  | ||||
|     <groupId>gg.malloc.defense</groupId> | ||||
|     <artifactId>malloc-defense</artifactId> | ||||
|     <version>1.0-SNAPSHOT</version> | ||||
|  | ||||
|     <properties> | ||||
|         <maven.compiler.source>1.8</maven.compiler.source> | ||||
|         <maven.compiler.target>1.8</maven.compiler.target> | ||||
|         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
|     </properties> | ||||
|  | ||||
|     <repositories> | ||||
|         <repository> | ||||
|             <id>spigotmc-repo</id> | ||||
|             <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url> | ||||
|         </repository> | ||||
| 				<repository> | ||||
| 					<id>codemc-repo</id> | ||||
| 					<url>https://repo.codemc.org/repository/maven-public/</url> | ||||
| 					<layout>default</layout> | ||||
| 				</repository> | ||||
| 				<repository> | ||||
| 					<id>jitpack.io</id> | ||||
| 					<url>https://jitpack.io</url> | ||||
| 				</repository> | ||||
|     </repositories> | ||||
|  | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>org.spigotmc</groupId> | ||||
|             <artifactId>spigot-api</artifactId> | ||||
|             <version>1.18.2-R0.1-SNAPSHOT</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
|      | ||||
| </project> | ||||
							
								
								
									
										19
									
								
								src/main/java/gg/malloc/defense/DebuginfoCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/main/java/gg/malloc/defense/DebuginfoCommand.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| package gg.malloc.defense; | ||||
|  | ||||
| import org.bukkit.command.Command; | ||||
| import org.bukkit.command.CommandExecutor; | ||||
| import org.bukkit.command.CommandSender; | ||||
|  | ||||
| public class DebuginfoCommand implements CommandExecutor { | ||||
|   Plugin m_plugin; | ||||
|  | ||||
|   public DebuginfoCommand(Plugin plugin) { | ||||
|     m_plugin = plugin; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean onCommand(CommandSender sender, Command command, String s, String[] args) { | ||||
|     m_plugin.debuginfo(); | ||||
|     return true; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										46
									
								
								src/main/java/gg/malloc/defense/GameEventHandler.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/main/java/gg/malloc/defense/GameEventHandler.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| package gg.malloc.defense; | ||||
|  | ||||
| import org.bukkit.event.EventHandler; | ||||
| import org.bukkit.event.Listener; | ||||
| import org.bukkit.event.entity.EntityDeathEvent; | ||||
| import org.bukkit.event.entity.EntityDamageEvent; | ||||
| import org.bukkit.event.entity.PlayerQuitEvent; | ||||
| import org.bukkit.event.entity.EntityCombustEvent; | ||||
| import org.bukkit.entity.Player; | ||||
|  | ||||
| public class GameEventHandler implements Listener { | ||||
|   Plugin m_plugin; | ||||
|  | ||||
|   public GameEventHandler(Plugin plugin) { | ||||
|     m_plugin = plugin; | ||||
|   } | ||||
|  | ||||
|   @EventHandler | ||||
|   public void onEntityDeath(EntityDeathEvent evt) { | ||||
|     GameRunner runner = m_plugin.getRunnerForWorld(evt.getEntity().getLocation().getWorld()); | ||||
|     runner.handleEntityDeath(evt.getEntity()); | ||||
|   } | ||||
|  | ||||
|   @EventHandler | ||||
|   public void onPlayerQuit(PlayerQuitEvent evt) { | ||||
|     GameRunner runner = m_plugin.getRunnerForWorld(evt.getPlayer().getLocation().getWorld()); | ||||
|     runner.removePlayer(evt.getEntity()); | ||||
|   } | ||||
|  | ||||
|   @EventHandler | ||||
|   public void onEntityCombust(EntityCombustEvent evt) { | ||||
|     evt.setCancelled(true); | ||||
|   } | ||||
|  | ||||
|   @EventHandler | ||||
|   public void onEntityDamage(EntityDamageEvent evt) { | ||||
|     if (evt.getEntity() instanceof Player) { | ||||
|       Player player = (Player)evt.getEntity(); | ||||
|       if (player.getHealth() - evt.getFinalDamage() <= 0) { | ||||
|         GameRunner runner = m_plugin.getRunnerForWorld(evt.getEntity().getLocation().getWorld()); | ||||
|         evt.setCancelled(true); | ||||
|         runner.handlePlayerDeath(player); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										294
									
								
								src/main/java/gg/malloc/defense/GameRunner.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								src/main/java/gg/malloc/defense/GameRunner.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,294 @@ | ||||
| package gg.malloc.defense; | ||||
|  | ||||
| import gg.malloc.defense.model.Game; | ||||
| import gg.malloc.defense.model.Arena; | ||||
| import gg.malloc.defense.model.Spawnpoint; | ||||
| import gg.malloc.defense.model.Spawner; | ||||
| import gg.malloc.defense.model.Wave; | ||||
| import java.util.ArrayList; | ||||
|  | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.World; | ||||
| import org.bukkit.event.player.PlayerTeleportEvent; | ||||
| import org.bukkit.scheduler.BukkitTask; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.LivingEntity; | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.boss.BarColor; | ||||
| import org.bukkit.boss.BarStyle; | ||||
| import org.bukkit.boss.BossBar; | ||||
| import org.bukkit.GameMode; | ||||
| import org.bukkit.attribute.Attribute; | ||||
|  | ||||
| public class GameRunner { | ||||
|   ArrayList<Entity> m_spawnedMobs = new ArrayList<Entity>(); | ||||
|   int m_killedMobs = 0; | ||||
|   Arena m_arena; | ||||
|   Game m_game; | ||||
|   State m_state; | ||||
|   ArrayList<Player> m_players = new ArrayList<>(); | ||||
|   ArrayList<Player> m_livingPlayers = new ArrayList<>(); | ||||
|   Plugin m_plugin; | ||||
|  | ||||
|   BossBar m_gameBar = Bukkit.createBossBar("Malloc Defense", BarColor.PURPLE, BarStyle.SOLID); | ||||
|   BukkitTask m_countdownTask; | ||||
|  | ||||
|   int m_currentWaveNum = 0; | ||||
|   int m_currentBatch = 0; | ||||
|   Wave m_currentWave = null; | ||||
|  | ||||
|   enum State { | ||||
|     Idle, | ||||
|     Warmup, | ||||
|     Playing, | ||||
|     GameOver | ||||
|   } | ||||
|  | ||||
|   public GameRunner(Plugin plugin, Game game, Arena arena) { | ||||
|     m_plugin = plugin; | ||||
|     m_game = game; | ||||
|     m_arena = arena; | ||||
|     m_state = State.Idle; | ||||
|     m_gameBar.setVisible(true); | ||||
|   } | ||||
|  | ||||
|   int m_warmupCountdown = 0; | ||||
|  | ||||
|   private void countdownTick() { | ||||
|     if (m_warmupCountdown == 0) { | ||||
|       requestTransition(State.Playing); | ||||
|     } else { | ||||
|       m_gameBar.setProgress((double)m_warmupCountdown / (double)30); | ||||
|       broadcastMessage("Starting game in " + m_warmupCountdown); | ||||
|       m_warmupCountdown--; | ||||
|       m_countdownTask = m_plugin.getServer().getScheduler().runTaskLater(m_plugin, () -> { | ||||
|         countdownTick(); | ||||
|       }, 20); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private void clearMobs() { | ||||
|     for(Entity e : m_spawnedMobs) { | ||||
|       e.remove(); | ||||
|     } | ||||
|     m_spawnedMobs.clear(); | ||||
|   } | ||||
|  | ||||
|   private boolean enterIdle() { | ||||
|     broadcastMessage("Game state: Idle"); | ||||
|     m_currentWaveNum = 0; | ||||
|     m_gameBar.setColor(BarColor.PURPLE); | ||||
|     m_gameBar.setProgress(1.0); | ||||
|     m_gameBar.setTitle("Idle"); | ||||
|     if (m_countdownTask != null) { | ||||
|       m_countdownTask.cancel(); | ||||
|       m_countdownTask = null; | ||||
|     } | ||||
|     clearMobs(); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   private boolean enterWarmup() { | ||||
|     broadcastMessage("Game state: Warmup"); | ||||
|     m_currentWaveNum += 1; | ||||
|     m_currentWave = m_game.getWave(m_currentWaveNum); | ||||
|     m_gameBar.setColor(BarColor.YELLOW); | ||||
|     m_gameBar.setProgress(1.0); | ||||
|     m_gameBar.setTitle("Warmup"); | ||||
|     m_warmupCountdown = 30; | ||||
|     for(Player p : m_players) { | ||||
|       m_livingPlayers.add(p); | ||||
|     } | ||||
|     clearMobs(); | ||||
|     countdownTick(); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   private boolean enterPlaying() { | ||||
|     broadcastMessage("Game state: Playing"); | ||||
|     broadcastMessage("Starting wave " + m_currentWaveNum); | ||||
|     m_currentBatch = 1; | ||||
|     m_gameBar.setColor(BarColor.GREEN); | ||||
|     m_gameBar.setProgress(0.0); | ||||
|     m_gameBar.setTitle("Playing"); | ||||
|     spawnNextBatch(); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   private boolean enterGameOver() { | ||||
|     broadcastMessage("Game state: Game Over!"); | ||||
|     m_gameBar.setColor(BarColor.RED); | ||||
|     m_gameBar.setProgress(1.0); | ||||
|     m_gameBar.setTitle("Game Over!"); | ||||
|     if (m_countdownTask != null) { | ||||
|       m_countdownTask.cancel(); | ||||
|       m_countdownTask = null; | ||||
|     } | ||||
|     for(Player p : m_players) { | ||||
|       p.setGameMode(GameMode.ADVENTURE); | ||||
|     } | ||||
|     clearMobs(); | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   private void updateMobBar() { | ||||
|     m_gameBar.setTitle("Mobs remaining: " + (m_currentWave.totalMobCount() - m_killedMobs)); | ||||
|     m_gameBar.setProgress(m_killedMobs / m_currentWave.totalMobCount()); | ||||
|   } | ||||
|  | ||||
|   private void spawnNextBatch() { | ||||
|     broadcastMessage("Spawning batch " + m_currentBatch); | ||||
|     Spawner spawner = new GameSpawner(m_arena.spawnpoints()[0]); | ||||
|     m_currentWave.spawnBatch(spawner, m_currentBatch); | ||||
|     updateMobBar(); | ||||
|   } | ||||
|  | ||||
|   public void handlePlayerDeath(Player player) { | ||||
|     if (m_livingPlayers.contains(player)) { | ||||
|       m_livingPlayers.remove(player); | ||||
|       player.setGameMode(GameMode.SPECTATOR); | ||||
|       if (m_livingPlayers.size() == 0) { | ||||
|         broadcastMessage("Everyone is dead :("); | ||||
|         requestTransition(State.GameOver); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   public void handleEntityDeath(Entity entity) { | ||||
|     if (m_spawnedMobs.contains(entity)) { | ||||
|       broadcastMessage("Killed game entity " + entity); | ||||
|       m_spawnedMobs.remove(entity); | ||||
|       m_killedMobs += 1; | ||||
|       updateMobBar(); | ||||
|       if (m_spawnedMobs.size() == 0) { | ||||
|         broadcastMessage("Batch complete!"); | ||||
|         if (m_currentBatch >= m_currentWave.batchCount()) { | ||||
|           if (m_currentWaveNum >= m_game.getWaveCount()) { | ||||
|             requestTransition(State.GameOver); | ||||
|           } else { | ||||
|             requestTransition(State.Warmup); | ||||
|           } | ||||
|         } else { | ||||
|           m_currentBatch += 1; | ||||
|           spawnNextBatch(); | ||||
|         } | ||||
|       } else { | ||||
|         broadcastMessage("Entities remaining: " + m_spawnedMobs.size()); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private boolean syncPlayer(Player player) { | ||||
|     World playerWorld = player.getLocation().getWorld(); | ||||
|     World gameWorld = m_arena.getWorld(); | ||||
|     m_gameBar.addPlayer(player); | ||||
|     if (m_livingPlayers.contains(player)) { | ||||
|       player.setGameMode(GameMode.ADVENTURE); | ||||
|       player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); | ||||
|     } else { | ||||
|       player.setGameMode(GameMode.SPECTATOR); | ||||
|     } | ||||
|     if (playerWorld != gameWorld) { | ||||
|       return player.teleport(gameWorld.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN); | ||||
|     } else { | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private boolean attemptTransition(State state) { | ||||
|     if (m_state == state) { | ||||
|       return false; | ||||
|     } | ||||
|     switch(state) { | ||||
|       case Idle: | ||||
|         return enterIdle(); | ||||
|       case Warmup: | ||||
|         return enterWarmup(); | ||||
|       case Playing: | ||||
|         return enterPlaying(); | ||||
|       case GameOver: | ||||
|         return enterGameOver(); | ||||
|     } | ||||
|     return false; | ||||
|   } | ||||
|    | ||||
|   private boolean validateTransition(State from, State to) { | ||||
|     switch(from) { | ||||
|       case Idle: | ||||
|         return to == State.Warmup; | ||||
|       case Warmup: | ||||
|         return to == State.Playing || to == State.Idle || to == State.GameOver; | ||||
|       case Playing: | ||||
|         return to == State.Warmup || to == State.GameOver || to == State.Idle; | ||||
|       case GameOver: | ||||
|         return to == State.Idle; | ||||
|     } | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   public boolean requestTransition(State state) { | ||||
|     if (!validateTransition(m_state, state)) { | ||||
|       return false; | ||||
|     } | ||||
|     if (attemptTransition(state)) { | ||||
|       m_state = state; | ||||
|       for(Player p : m_players) { | ||||
|         syncPlayer(p); | ||||
|       } | ||||
|       return true; | ||||
|     } | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   public boolean addPlayer(Player p) { | ||||
|     if (m_state == State.Idle || m_state == State.Warmup) { | ||||
|       m_players.add(p); | ||||
|       broadcastMessage("Added player " + p + " to game"); | ||||
|       syncPlayer(p); | ||||
|       if (m_state == State.Idle) { | ||||
|         requestTransition(State.Warmup); | ||||
|       } | ||||
|       return true; | ||||
|     } else { | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   public void removePlayer(Player p) { | ||||
|     m_gameBar.removePlayer(p); | ||||
|     m_players.remove(p); | ||||
|     m_livingPlayers.remove(p); | ||||
|     if (m_players.size() == 0) { | ||||
|       requestTransition(State.Idle); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   void broadcastMessage(String string) { | ||||
|     World world = m_arena.getWorld(); | ||||
|     for(Player p : world.getPlayers()) { | ||||
|       p.sendMessage(string); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   void registerSpawnedMob(Entity entity) { | ||||
|     m_spawnedMobs.add(entity); | ||||
|   } | ||||
|  | ||||
|   private class GameSpawner implements Spawner { | ||||
|     Spawnpoint m_spawnpoint; | ||||
|  | ||||
|     public GameSpawner(Spawnpoint spawnpoint) { | ||||
|       m_spawnpoint = spawnpoint; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Entity spawnMob(EntityType type) { | ||||
|       Entity newMob = m_arena.getWorld().spawnEntity(m_spawnpoint.getLocation(), type); | ||||
|       LivingEntity livingMob = (LivingEntity)newMob; | ||||
|       livingMob.setRemoveWhenFarAway(false); | ||||
|       registerSpawnedMob(newMob); | ||||
|       return newMob; | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										23
									
								
								src/main/java/gg/malloc/defense/InitGameCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/main/java/gg/malloc/defense/InitGameCommand.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| package gg.malloc.defense; | ||||
|  | ||||
| import org.bukkit.command.Command; | ||||
| import org.bukkit.command.CommandExecutor; | ||||
| import org.bukkit.command.CommandSender; | ||||
| import org.bukkit.entity.Player; | ||||
|  | ||||
| public class InitGameCommand implements CommandExecutor { | ||||
|   Plugin m_plugin; | ||||
|  | ||||
|   public InitGameCommand(Plugin plugin) { | ||||
|     m_plugin = plugin; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean onCommand(CommandSender sender, Command command, String s, String[] args) { | ||||
|     String worldName = args[0]; | ||||
|     GameRunner runner = m_plugin.getRunnerForWorld(m_plugin.getServer().getWorld(worldName)); | ||||
|     Player player= m_plugin.getServer().getPlayer(args[1]); | ||||
|     runner.addPlayer(player); | ||||
|     return true; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										34
									
								
								src/main/java/gg/malloc/defense/MemoryArena.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/main/java/gg/malloc/defense/MemoryArena.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| package gg.malloc.defense; | ||||
|  | ||||
| import gg.malloc.defense.model.Arena; | ||||
| import gg.malloc.defense.model.Spawnpoint; | ||||
|  | ||||
| import org.bukkit.World; | ||||
|  | ||||
| public class MemoryArena implements Arena { | ||||
|  | ||||
|   Spawnpoint[] m_spawnpoints; | ||||
|   World m_world; | ||||
|   String m_name; | ||||
|  | ||||
|   public MemoryArena(String name, World world, Spawnpoint[] spawnpoints) { | ||||
|     m_world = world; | ||||
|     m_spawnpoints = spawnpoints; | ||||
|     m_name = name; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public String name() { | ||||
|     return m_name; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public Spawnpoint[] spawnpoints() { | ||||
|     return m_spawnpoints; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public World getWorld() { | ||||
|     return m_world; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										82
									
								
								src/main/java/gg/malloc/defense/Plugin.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/main/java/gg/malloc/defense/Plugin.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| package gg.malloc.defense; | ||||
|  | ||||
| import org.bukkit.plugin.java.JavaPlugin; | ||||
| import org.bukkit.plugin.RegisteredServiceProvider; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.bukkit.World; | ||||
| import org.bukkit.plugin.PluginLogger; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
|  | ||||
| import gg.malloc.defense.model.Arena; | ||||
| import gg.malloc.defense.model.Spawnpoint; | ||||
| import gg.malloc.defense.model.Game; | ||||
|  | ||||
| import gg.malloc.defense.games.LinearGame; | ||||
|  | ||||
| public class Plugin extends JavaPlugin { | ||||
|   ArrayList<Arena> m_arenas = new ArrayList<>(); | ||||
|   ArrayList<Game> m_games = new ArrayList<>(); | ||||
|   HashMap<World, GameRunner> m_runningGames = new HashMap<>(); | ||||
|  | ||||
|   private class TestSpawn implements Spawnpoint { | ||||
|     Location m_location; | ||||
|  | ||||
|     public TestSpawn(Location location) { | ||||
|       m_location = location; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Location getLocation() { | ||||
|       return m_location; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getName() { | ||||
|       return "Mob Spawner"; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getID() { | ||||
|       return "mob-spawner"; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   PluginLogger m_log = new PluginLogger(this); | ||||
|  | ||||
|   public void debuginfo() { | ||||
|     m_log.info("Debug Info:"); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void onEnable() { | ||||
|     getLogger().info("Malloc Defense registered"); | ||||
|     setupTestGame(); | ||||
|     getCommand("setstage").setExecutor(new SetStageCommand(this)); | ||||
|     getCommand("initgame").setExecutor(new InitGameCommand(this)); | ||||
|     getCommand("debuginfo").setExecutor(new DebuginfoCommand(this)); | ||||
|     getServer().getPluginManager().registerEvents(new GameEventHandler(this), this); | ||||
|   } | ||||
|  | ||||
|   public GameRunner getRunnerForWorld(World world) { | ||||
|     GameRunner ret; | ||||
|     if (m_runningGames.containsKey(world)) { | ||||
|       ret = m_runningGames.get(world); | ||||
|     } else { | ||||
|       ret = new GameRunner(this, m_games.get(0), m_arenas.get(0)); | ||||
|       m_runningGames.put(world, ret); | ||||
|     } | ||||
|     return ret; | ||||
|   } | ||||
|  | ||||
|   void setupTestGame() { | ||||
|     World testWorld = getServer().getWorld("world"); | ||||
|     Spawnpoint[] spawnpoints = new Spawnpoint[1]; | ||||
|     spawnpoints[0] = new TestSpawn(testWorld.getSpawnLocation()); | ||||
|     m_arenas.add(new MemoryArena("Test Arena", testWorld, spawnpoints)); | ||||
|     m_games.add(new LinearGame()); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										38
									
								
								src/main/java/gg/malloc/defense/SetStageCommand.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/main/java/gg/malloc/defense/SetStageCommand.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| package gg.malloc.defense; | ||||
|  | ||||
| import org.bukkit.command.Command; | ||||
| import org.bukkit.command.CommandExecutor; | ||||
| import org.bukkit.command.CommandSender; | ||||
| import org.bukkit.World; | ||||
|  | ||||
| public class SetStageCommand implements CommandExecutor { | ||||
|   Plugin m_plugin; | ||||
|  | ||||
|   public SetStageCommand(Plugin plugin) { | ||||
|     m_plugin = plugin; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public boolean onCommand(CommandSender sender, Command command, String s, String[] args) { | ||||
|     World world = m_plugin.getServer().getWorld(args[1]); | ||||
|     GameRunner runner = m_plugin.getRunnerForWorld(world); | ||||
|     String stateName = args[0].toLowerCase(); | ||||
|     boolean ret = false; | ||||
|     if (stateName.equals("idle")) { | ||||
|       ret = runner.requestTransition(GameRunner.State.Idle); | ||||
|     } else if (stateName.equals("warmup")) { | ||||
|       ret = runner.requestTransition(GameRunner.State.Warmup); | ||||
|     } else if (stateName.equals("playing")) { | ||||
|       ret = runner.requestTransition(GameRunner.State.Playing); | ||||
|     } else if (stateName.equals("gameover")) { | ||||
|       ret = runner.requestTransition(GameRunner.State.GameOver); | ||||
|     } else { | ||||
|       sender.sendMessage("Unknown state " + stateName); | ||||
|       return false; | ||||
|     } | ||||
|     if (!ret) { | ||||
|       sender.sendMessage("Could not set state to " + stateName); | ||||
|     } | ||||
|     return ret; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										54
									
								
								src/main/java/gg/malloc/defense/games/LinearGame.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/main/java/gg/malloc/defense/games/LinearGame.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| package gg.malloc.defense.games; | ||||
|  | ||||
| import gg.malloc.defense.model.Wave; | ||||
| import gg.malloc.defense.model.Game; | ||||
| import gg.malloc.defense.model.Spawner; | ||||
|  | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.EntityType; | ||||
|  | ||||
| public class LinearGame implements Game { | ||||
|   private class ZombieWave implements Wave { | ||||
|     int m_batches; | ||||
|     int m_zombiesPerBatch; | ||||
|  | ||||
|     public ZombieWave(int zombiesPerBatch, int batches) { | ||||
|       m_batches = batches; | ||||
|       m_zombiesPerBatch = zombiesPerBatch; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int totalMobCount() { | ||||
|       int ret = 0; | ||||
|       for(int i = 1; i <= m_batches; i++) { | ||||
|         ret += i * m_zombiesPerBatch; | ||||
|       } | ||||
|       return ret; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int batchCount() { | ||||
|       return m_batches; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void spawnBatch(Spawner spawner, int batch) { | ||||
|       int zombiesToSpawn = batch * m_zombiesPerBatch; | ||||
|       for(int i = 0; i < zombiesToSpawn; i++) { | ||||
|         Entity newMob = spawner.spawnMob(EntityType.ZOMBIE); | ||||
|         newMob.setCustomName("Zombie " + i + "/" + zombiesToSpawn); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public int getWaveCount() { | ||||
|     return 10; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public Wave getWave(int waveNumber) { | ||||
|     return new ZombieWave(waveNumber, 2); | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										9
									
								
								src/main/java/gg/malloc/defense/model/Arena.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/main/java/gg/malloc/defense/model/Arena.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| package gg.malloc.defense.model; | ||||
|  | ||||
| import org.bukkit.World; | ||||
|  | ||||
| public interface Arena { | ||||
|   World getWorld(); | ||||
|   String name(); | ||||
|   Spawnpoint[] spawnpoints(); | ||||
| } | ||||
							
								
								
									
										6
									
								
								src/main/java/gg/malloc/defense/model/Game.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/main/java/gg/malloc/defense/model/Game.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| package gg.malloc.defense.model; | ||||
|  | ||||
| public interface Game { | ||||
|   int getWaveCount(); | ||||
|   Wave getWave(int waveNumber); | ||||
| } | ||||
							
								
								
									
										8
									
								
								src/main/java/gg/malloc/defense/model/Spawner.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/main/java/gg/malloc/defense/model/Spawner.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| package gg.malloc.defense.model; | ||||
|  | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.bukkit.entity.Entity; | ||||
|  | ||||
| public interface Spawner { | ||||
|   Entity spawnMob(EntityType type); | ||||
| } | ||||
							
								
								
									
										9
									
								
								src/main/java/gg/malloc/defense/model/Spawnpoint.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/main/java/gg/malloc/defense/model/Spawnpoint.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| package gg.malloc.defense.model; | ||||
|  | ||||
| import org.bukkit.Location; | ||||
|  | ||||
| public interface Spawnpoint { | ||||
|   Location getLocation(); | ||||
|   String getName(); | ||||
|   String getID(); | ||||
| } | ||||
							
								
								
									
										7
									
								
								src/main/java/gg/malloc/defense/model/Wave.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/main/java/gg/malloc/defense/model/Wave.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package gg.malloc.defense.model; | ||||
|  | ||||
| public interface Wave { | ||||
|   int batchCount(); | ||||
|   int totalMobCount(); | ||||
|   void spawnBatch(Spawner spawner, int batch); | ||||
| } | ||||
							
								
								
									
										12
									
								
								src/main/resources/plugin.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/main/resources/plugin.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| name: Malloc-Defense | ||||
| version: 1.0 | ||||
| api-version: 1.18 | ||||
| main: gg.malloc.defense.Plugin | ||||
| depend:  [] | ||||
| commands: | ||||
|   setstage: | ||||
|     description: Sets a game stage | ||||
|   initgame: | ||||
|     description: Adds a player to a game | ||||
|   debuginfo: | ||||
|     description: Unknowable powers | ||||
		Reference in New Issue
	
	Block a user