package server;
import common.Constants;
import common.messages.*;
import java.net.InetSocketAddress;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
class ServerGameEngine implements Constants {
public static Logger logger = Logger.getLogger(SERVER_LOGGER_NAME);
private Queue<Byte> avaliableUserIDs;
private Vector<PlayerInfo> playerInfo;
private final byte INIT = 1;
private final byte MAX_PLAYERS = 64;
public ServerGameEngine (long gamestarttime){
avaliableUserIDs = new LinkedList<Byte>();
// Populate the set with the avaliable userIds
for(byte i = INIT; i <= MAX_PLAYERS; i++)
avaliableUserIDs.offer(i);
playerInfo = new Vector<PlayerInfo>();
}
/**
* Processes a PlayerJoin message.
* @param message The message for login.
* @return The id that is assigned to the player.
*/
public synchronized byte processPlayerJoin(PlayerJoinMessage message) {
byte playerId = message.getPlayerId();
// Don't process if we are out of avaliable user IDs
if(avaliableUserIDs.size() == 0 || nameInUse(message.getName())) {
playerId = -2;
}
else {
playerId = avaliableUserIDs.poll();
playerInfo.add(new PlayerInfo(playerId,
message.getAddress(),
message.getName()));
logger.log(Level.INFO, message.getName() + " has joined the game with ID " + playerId);
logger.log(Level.INFO,"Avaliable Player IDs: " + avaliableUserIDs.size());
}
return playerId;
}
/**
* Processes a PlayerJoin message.
* @param message The message for logout.
*/
public synchronized void processPlayerLeave(PlayerLeaveMessage message) {
byte playerId = message.getPlayerId();
for(int i = 0; i < playerInfo.size() ; i++) {
if(playerInfo.get(i).getPlayerId() == playerId) {
PlayerInfo info = playerInfo.remove(i);
avaliableUserIDs.offer(playerId);
logger.log(Level.INFO,info.getName() + " has left the game");
logger.log(Level.INFO,"Avaliable Player IDs: " + avaliableUserIDs.size());
break;
}
}
}
public String getPlayerName(byte playerId) {
for(PlayerInfo player : playerInfo) {
if(player.getPlayerId() == playerId)
return player.getName();
}
return null;
}
public InetSocketAddress getAddress(byte playerId) {
for(PlayerInfo player : playerInfo) {
if(player.getPlayerId() == playerId)
return player.getAddress();
}
return null;
}
public boolean nameInUse(String name) {
for(PlayerInfo player : playerInfo) {
if(player.getName().equals(name))
return true;
}
return false;
}
}
class PlayerInfo implements Comparable {
private byte playerId;
private InetSocketAddress address;
private String name;
public PlayerInfo(byte playerId, InetSocketAddress address, String name) {
this.playerId = playerId;
this.address = address;
this.name = name;
}
public int compareTo(Object o) {
if(o instanceof PlayerInfo)
return new Byte(playerId).compareTo(((PlayerInfo )o).getPlayerId());
if(o instanceof Byte)
return new Byte(playerId).compareTo((Byte)o);
return 0;
}
public byte getPlayerId() {
return playerId;
}
public InetSocketAddress getAddress() {
return address;
}
public String getName() {
return name;
}
}