Implement first pass at config loading, /join, /leave commands, tab completion (broken)

This commit is contained in:
2022-05-10 21:35:25 +02:00
parent 75debe1905
commit a4b110773e
17 changed files with 410 additions and 110 deletions

View File

@@ -3,6 +3,7 @@ package gg.malloc.defense.engine;
import gg.malloc.defense.model.Arena;
import gg.malloc.defense.model.Game;
import gg.malloc.defense.model.Spawner;
import gg.malloc.defense.model.Waypoint;
import gg.malloc.defense.ui.BombCarrier;
import gg.malloc.defense.ui.BossBars;
@@ -60,9 +61,16 @@ public class GameRunner {
BossBars m_bars;
public GameRunner(Plugin plugin, Game game, Arena arena) {
World m_world;
Location getLocation(Waypoint waypoint) {
return new Location(m_world, waypoint.getX(), waypoint.getY(), waypoint.getZ());
}
public GameRunner(Plugin plugin, Game game, Arena arena, World world) {
m_plugin = plugin;
m_game = game;
m_world = world;
m_arena = arena;
m_stage = Stage.Idle;
m_mobs = new MobManager();
@@ -92,13 +100,13 @@ public class GameRunner {
}, 20);
m_bombSmokeTask = new TickTask(m_plugin, () -> {
Location targetLoc = m_arena.bombTarget().getLocation();
m_arena.getWorld().spawnParticle(Particle.SMOKE_LARGE, targetLoc, 35, 4, 2, 4);
m_arena.getWorld().spawnParticle(Particle.SMALL_FLAME, targetLoc, 30, 3, 2, 3);
Location targetLoc = getLocation(m_arena.bombTarget());
m_world.spawnParticle(Particle.SMOKE_LARGE, targetLoc, 35, 4, 2, 4);
m_world.spawnParticle(Particle.SMALL_FLAME, targetLoc, 30, 3, 2, 3);
}, 5);
m_bombCrackleTask = new TickTask(m_plugin, () -> {
Location targetLoc = m_arena.bombTarget().getLocation();
m_arena.getWorld().playSound(targetLoc, Sound.BLOCK_CAMPFIRE_CRACKLE, SoundCategory.NEUTRAL, 1.0f, 1.0f);
Location targetLoc = getLocation(m_arena.bombTarget());
m_world.playSound(targetLoc, Sound.BLOCK_CAMPFIRE_CRACKLE, SoundCategory.NEUTRAL, 1.0f, 1.0f);
}, 35);
}
@@ -115,12 +123,12 @@ public class GameRunner {
m_log.info("Target attacked!");
entityEvt.getDamager().setGlowing(true);
m_bombFuse.tickLit();
m_arena.getWorld().playSound(m_arena.bombTarget().getLocation(), Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR, 1.5f, 0.9f);
m_world.playSound(getLocation(m_arena.bombTarget()), Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR, 1.5f, 0.9f);
m_bars.update();
if (m_bombFuse.isExploded()) {
m_arena.getWorld().strikeLightningEffect(m_arena.bombTarget().getLocation());
m_arena.getWorld().playSound(m_arena.bombTarget().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, SoundCategory.NEUTRAL, 1.3f, 1.0f);
m_arena.getWorld().spawnParticle(Particle.EXPLOSION_HUGE, m_arena.bombTarget().getLocation(), 8, 5, 2, 5);
m_world.strikeLightningEffect(getLocation(m_arena.bombTarget()));
m_world.playSound(getLocation(m_arena.bombTarget()), Sound.ENTITY_GENERIC_EXPLODE, SoundCategory.NEUTRAL, 1.3f, 1.0f);
m_world.spawnParticle(Particle.EXPLOSION_HUGE, getLocation(m_arena.bombTarget()), 8, 5, 2, 5);
requestTransition(Stage.GameOver);
m_bombSmokeTask.start();
m_bombCrackleTask.start();
@@ -150,7 +158,7 @@ public class GameRunner {
m_waves.next();
for(Player p : m_players.getPlayers()) {
if (m_players.requestTransition(p, PlayerManager.State.Playing)) {
p.teleport(m_arena.getWorld().getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
p.teleport(m_world.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
}
m_players.setReady(p, false);
}
@@ -179,11 +187,11 @@ public class GameRunner {
private boolean enterPlaying() {
m_log.info("Starting wave " + m_waves.currentWaveNum());
m_mobs.spawnTarget(m_arena.bombTarget().getLocation());
m_mobs.spawnTarget(getLocation(m_arena.bombTarget()));
// TODO: Set helmet with custom model data
for(Player p : m_players.getPlayers()) {
if (m_players.requestTransition(p, PlayerManager.State.Playing)) {
p.teleport(m_arena.getWorld().getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
p.teleport(m_world.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
}
}
m_countdownTask.stop();
@@ -211,14 +219,14 @@ public class GameRunner {
private void spawnNextBatch() {
broadcastMessage("Spawning batch " + m_waves.currentBatchNum());
Spawner spawner = new GameSpawner(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_bars.update();
}
private void handlePlayerDeath(Player player) {
if (m_players.requestTransition(player, PlayerManager.State.Dead)) {
m_arena.getWorld().strikeLightningEffect(player.getLocation());
m_world.strikeLightningEffect(player.getLocation());
if (!m_players.isAnyoneAlive()) {
broadcastMessage("Everyone is dead :(");
requestTransition(Stage.GameOver);
@@ -273,7 +281,7 @@ public class GameRunner {
private boolean validateTransition(Stage from, Stage to) {
switch(from) {
case Idle:
return to == Stage.Warmup;
return !m_players.isEmpty() && to == Stage.Warmup;
case Warmup:
return to == Stage.Playing || to == Stage.Idle || to == Stage.Countdown ;
case Countdown:
@@ -309,7 +317,7 @@ public class GameRunner {
m_bars.addPlayer(p);
if (m_stage == Stage.Idle || m_stage == Stage.Warmup) {
if (m_players.requestTransition(p, PlayerManager.State.Playing)) {
p.teleport(m_arena.getWorld().getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
p.teleport(m_world.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
}
broadcastMessage(p.getName() + " has joined the game");
if (m_stage == Stage.Idle) {
@@ -337,8 +345,7 @@ public class GameRunner {
}
void broadcastMessage(String string) {
World world = m_arena.getWorld();
for(Player p : world.getPlayers()) {
for(Player p : m_world.getPlayers()) {
p.sendMessage(string);
}
}

View File

@@ -1,13 +1,15 @@
package gg.malloc.defense.engine;
import gg.malloc.defense.model.Spawner;
import gg.malloc.defense.model.Spawnpoint;
import gg.malloc.defense.model.Waypoint;
import gg.malloc.defense.model.Arena;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Mob;
import org.bukkit.World;
import org.bukkit.Location;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
@@ -20,8 +22,10 @@ public class GameSpawner implements Spawner {
MobManager m_manager;
PlayerManager m_players;
int m_spawnIdx = 0;
World m_world;
public GameSpawner(Arena arena, MobManager manager, PlayerManager players) {
public GameSpawner(World world, Arena arena, MobManager manager, PlayerManager players) {
m_world = world;
m_arena = arena;
m_manager = manager;
m_players = players;
@@ -38,10 +42,12 @@ public class GameSpawner implements Spawner {
@Override
public LivingEntity spawnMob(EntityType type) {
Spawnpoint[] spawnpoints = m_arena.spawnpoints();
Waypoint[] spawnpoints = m_arena.spawnpoints();
m_spawnIdx %= spawnpoints.length;
//m_log.fine("Spawning " + type + " at " + spawnpoints[m_spawnIdx]);
Entity newMob = m_arena.getWorld().spawnEntity(spawnpoints[m_spawnIdx].getLocation(), type);
Waypoint thisSpawner = spawnpoints[m_spawnIdx];
Location loc = new Location(m_world, thisSpawner.getX(), thisSpawner.getY(), thisSpawner.getZ());
Entity newMob = m_world.spawnEntity(loc, type);
LivingEntity livingMob = (LivingEntity)newMob;
livingMob.setRemoveWhenFarAway(false);
m_manager.addEntity(livingMob);