reorganize engine bits into engine package, same with commands, reimplement player state as FSM

This commit is contained in:
2022-05-08 15:34:18 +02:00
parent 9e7ab2c0d4
commit a078f74b4b
11 changed files with 601 additions and 392 deletions

View File

@@ -0,0 +1,113 @@
package gg.malloc.defense.engine;
import org.bukkit.entity.Player;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.attribute.Attribute;
import org.bukkit.event.player.PlayerTeleportEvent;
import java.util.HashMap;
import java.util.Collection;
public class PlayerManager {
HashMap<Player, State> m_playerStates = new HashMap<>();
public enum State {
Idle,
Playing,
Dead
}
public boolean requestTransitionForAll(State toState) {
boolean allSuccess = true;
for (Player p : getPlayers()) {
allSuccess = allSuccess && requestTransition(p, toState);
}
return allSuccess;
}
public boolean requestTransition(Player player, State toState) {
State currentState = m_playerStates.get(player);
if (currentState == toState) {
return false;
}
boolean ret = false;
switch(toState) {
case Idle:
ret = enterIdle(player);break;
case Playing:
ret = enterPlaying(player);break;
case Dead:
ret = enterDead(player);break;
}
if (ret) {
m_playerStates.put(player, toState);
}
return ret;
}
public boolean enterIdle(Player player) {
// Reset player to non-game state, return control back to Minecraft
player.setGameMode(Bukkit.getDefaultGameMode());
return true;
}
// Respawn player
public boolean enterPlaying(Player player) {
//m_log.fine("Respawning player " + player);
player.setGameMode(Bukkit.getDefaultGameMode());
player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue());
player.setFoodLevel(10);
return true;
}
public boolean enterDead(Player player) {
//m_log.info("Player has died in game" + player);
player.setGameMode(GameMode.SPECTATOR);
return true;
}
public void addPlayer(Player player) {
//m_log.info("Adding player " + player);
m_playerStates.put(player, State.Idle);
}
public boolean removePlayer(Player player) {
//m_log.info("Removing player " + player);
requestTransition(player, State.Idle);
m_playerStates.remove(player);
return true;
}
public boolean isEmpty() {
return m_playerStates.size() == 0;
}
public boolean isAlive(Player player) {
return m_playerStates.get(player) == State.Playing;
}
public boolean isAnyoneAlive() {
for(Player p : m_playerStates.keySet()) {
if (m_playerStates.get(p) == State.Playing) {
return true;
}
}
return false;
}
public int remainingPlayers() {
int aliveCount = 0;
for(State s : m_playerStates.values()) {
if (s == State.Playing) {
aliveCount += 1;
}
}
return aliveCount;
}
Collection<Player> getPlayers() {
return m_playerStates.keySet();
}
}