reorganize engine bits into engine package, same with commands, reimplement player state as FSM
This commit is contained in:
		
							
								
								
									
										113
									
								
								src/main/java/gg/malloc/defense/engine/PlayerManager.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								src/main/java/gg/malloc/defense/engine/PlayerManager.java
									
									
									
									
									
										Normal 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();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user