Fix sidebars, implement vault api, coin pickups, and player respawning

This commit is contained in:
2022-05-28 19:28:03 +02:00
parent f8b99d44bf
commit a299b167de
15 changed files with 446 additions and 22 deletions

View File

@@ -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()) {

View File

@@ -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() {

View File

@@ -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;
}