Fix sidebars, implement vault api, coin pickups, and player respawning
This commit is contained in:
@@ -66,6 +66,7 @@ public class GameRunner {
|
||||
TickTask m_lobbyReturnTask;
|
||||
TickTask m_bombSmokeTask;
|
||||
TickTask m_bombCrackleTask;
|
||||
TickTask m_playerRespawnTask;
|
||||
|
||||
BossBars m_bars;
|
||||
Sidebars m_sidebars;
|
||||
@@ -94,6 +95,10 @@ public class GameRunner {
|
||||
validateGameRule(GameRule.SPECTATORS_GENERATE_CHUNKS, false);
|
||||
}
|
||||
|
||||
public GameState getState() {
|
||||
return m_state;
|
||||
}
|
||||
|
||||
public GameRunner(Plugin plugin, Game game, Arena arena, World world) {
|
||||
m_plugin = plugin;
|
||||
m_game = game;
|
||||
@@ -120,6 +125,19 @@ public class GameRunner {
|
||||
}
|
||||
}, 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, () -> {
|
||||
if (m_warmupCountdown == 0) {
|
||||
requestTransition(Stage.Playing);
|
||||
@@ -176,6 +194,16 @@ public class GameRunner {
|
||||
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) {
|
||||
m_mobs.handleEntityDamage(evt);
|
||||
if (m_mobs.bombWasHit() && !m_bombFuse.isExploded()) {
|
||||
@@ -229,6 +257,8 @@ public class GameRunner {
|
||||
m_fuseTask.stop();
|
||||
m_countdownTask.stop();
|
||||
m_lobbyReturnTask.stop();
|
||||
m_playerRespawnTask.stop();
|
||||
m_state.resetBalances();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -253,6 +283,7 @@ public class GameRunner {
|
||||
.create();
|
||||
broadcastMessage(message);
|
||||
m_mobs.clear();
|
||||
m_playerRespawnTask.start();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -288,6 +319,7 @@ public class GameRunner {
|
||||
m_warmupCountdown = 10;
|
||||
m_bars.setCountdownProgress(1.0);
|
||||
m_countdownTask.start();
|
||||
m_playerRespawnTask.start();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -302,6 +334,7 @@ public class GameRunner {
|
||||
}
|
||||
m_countdownTask.stop();
|
||||
m_fuseTask.start();
|
||||
m_playerRespawnTask.start();
|
||||
spawnNextBatch();
|
||||
return true;
|
||||
}
|
||||
@@ -311,7 +344,7 @@ public class GameRunner {
|
||||
m_lobbyReturnTask.start();
|
||||
m_countdownTask.stop();
|
||||
m_fuseTask.stop();
|
||||
//m_mobs.clear();
|
||||
m_playerRespawnTask.stop();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -330,7 +363,8 @@ public class GameRunner {
|
||||
private void handlePlayerDeath(Player player) {
|
||||
if (m_players.requestTransition(player, PlayerManager.State.Dead)) {
|
||||
m_world.strikeLightningEffect(player.getLocation());
|
||||
if (!m_players.isAnyoneAlive()) {
|
||||
//if (!m_players.isAnyoneAlive()) {
|
||||
if (false) {
|
||||
BaseComponent[] message = new ComponentBuilder()
|
||||
.append("Everyone is ").color(ChatColor.LIGHT_PURPLE)
|
||||
.append("DEAD").color(ChatColor.RED).bold(true)
|
||||
@@ -339,6 +373,14 @@ public class GameRunner {
|
||||
broadcastMessage(message);
|
||||
requestTransition(Stage.GameOver);
|
||||
} 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());
|
||||
}
|
||||
}
|
||||
@@ -347,12 +389,15 @@ public class GameRunner {
|
||||
public void handleEntityDeath(Entity entity) {
|
||||
boolean wasCarrier = m_mobs.isBombCarrier(entity);
|
||||
if (m_mobs.killMob(entity)) {
|
||||
int COIN_STACK_SIZE = 5;
|
||||
int coinsToDrop = 60;
|
||||
while(coinsToDrop > 0) {
|
||||
int droppedCoins = Math.min(coinsToDrop, 5);
|
||||
int droppedCoins = Math.min(coinsToDrop, COIN_STACK_SIZE);
|
||||
ItemStack coins = Items.makeCoins();
|
||||
coins.setAmount(droppedCoins);
|
||||
coinsToDrop -= 64;
|
||||
coinsToDrop -= droppedCoins;
|
||||
m_state.addDroppedCoins(droppedCoins);
|
||||
m_sidebars.update();
|
||||
m_world.dropItem(entity.getLocation(), coins);
|
||||
}
|
||||
m_bars.update();
|
||||
@@ -433,6 +478,14 @@ public class GameRunner {
|
||||
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) {
|
||||
switch(m_stage) {
|
||||
case Warmup:
|
||||
@@ -451,6 +504,7 @@ public class GameRunner {
|
||||
return;
|
||||
}
|
||||
p.getInventory().clear();
|
||||
m_sidebars.addPlayer(p);
|
||||
m_players.addPlayer(p);
|
||||
m_bars.addPlayer(p);
|
||||
if (m_stage == Stage.Idle || m_stage == Stage.Warmup) {
|
||||
@@ -471,6 +525,7 @@ public class GameRunner {
|
||||
|
||||
public void removePlayer(Player p) {
|
||||
p.getInventory().clear();
|
||||
m_sidebars.removePlayer(p);
|
||||
m_bars.removePlayer(p);
|
||||
m_players.removePlayer(p);
|
||||
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.State;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class GameState implements State {
|
||||
GameRunner m_runner;
|
||||
WaveManager m_waves;
|
||||
@@ -12,6 +14,9 @@ public class GameState implements State {
|
||||
BombFuse m_fuse;
|
||||
PlayerManager m_players;
|
||||
|
||||
int m_coinsDropped;
|
||||
int m_coinsPickedUp;
|
||||
|
||||
public GameState(GameRunner runner, WaveManager waves, Game game, MobManager mobs, BombFuse fuse, PlayerManager players) {
|
||||
m_runner = runner;
|
||||
m_waves = waves;
|
||||
@@ -19,6 +24,47 @@ public class GameState implements State {
|
||||
m_mobs = mobs;
|
||||
m_fuse = fuse;
|
||||
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() {
|
||||
|
||||
@@ -16,6 +16,8 @@ import java.util.Collection;
|
||||
public class PlayerManager {
|
||||
HashMap<Player, State> m_playerStates = 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 {
|
||||
Idle,
|
||||
@@ -68,22 +70,22 @@ public class PlayerManager {
|
||||
|
||||
// Respawn player
|
||||
public boolean enterPlaying(Player player) {
|
||||
//m_log.fine("Respawning player " + player);
|
||||
player.setGameMode(Bukkit.getDefaultGameMode());
|
||||
healPlayer(player);
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean enterDead(Player player) {
|
||||
//m_log.info("Player has died in game" + player);
|
||||
player.setGameMode(GameMode.SPECTATOR);
|
||||
m_respawnCounters.put(player, 15);
|
||||
return true;
|
||||
}
|
||||
|
||||
public void addPlayer(Player player) {
|
||||
//m_log.info("Adding player " + player);
|
||||
m_playerStates.put(player, State.Idle);
|
||||
m_playerReadyStates.put(player, false);
|
||||
m_playerExpenses.put(player, 0);
|
||||
m_respawnCounters.put(player, 0);
|
||||
}
|
||||
|
||||
public boolean isReady(Player player) {
|
||||
@@ -111,14 +113,53 @@ public class PlayerManager {
|
||||
}
|
||||
}
|
||||
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) {
|
||||
//m_log.info("Removing player " + player);
|
||||
healPlayer(player);
|
||||
requestTransition(player, State.Idle);
|
||||
m_playerStates.remove(player);
|
||||
m_playerReadyStates.remove(player);
|
||||
m_playerExpenses.remove(player);
|
||||
m_respawnCounters.remove(player);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user