package net.fe.network;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import net.fe.FEMultiplayer;
import net.fe.Party;
import net.fe.Player;
import net.fe.Session;
import net.fe.network.message.ClientInit;
import net.fe.network.message.EndGame;
import net.fe.network.message.JoinLobby;
import net.fe.network.message.QuitMessage;
import net.fe.network.message.SessionUpdate;
public class Client {
private Socket serverSocket;
private ObjectOutputStream out;
private ObjectInputStream in;
private Thread serverIn;
private Session session;
private boolean open = false;
private boolean closeRequested = false;
public byte winner = -1;
byte id;
public volatile ArrayList<Message> messages;
public Client(String ip, int port) {
messages = new ArrayList<Message>();
session = new Session();
try {
System.out.println("CLIENT: Connecting to server: "+ip+":"+port);
serverSocket = new Socket(ip, port);
System.out.println("CLIENT: Successfully connected!");
out = new ObjectOutputStream(serverSocket.getOutputStream());
out.flush();
in = new ObjectInputStream(serverSocket.getInputStream());
System.out.println("CLIENT: I/O streams initialized");
open = true;
serverIn = new Thread() {
public void run() {
try {
Message message;
while((message = (Message)in.readObject()) != null) {
processInput(message);
}
in.close();
out.close();
serverSocket.close();
} catch (IOException e) {
System.out.println("CLIENT: EXIT");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
};
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
serverIn.start();
}
private void processInput(Message message) {
if(message instanceof ClientInit) {
id = ((ClientInit)message).clientID;
this.session = ((ClientInit)message).session;
FEMultiplayer.getLocalPlayer().setClientID(id);
if(id >= 2) {
FEMultiplayer.getLocalPlayer().getParty().setColor(Party.TEAM_RED);
}
System.out.println("CLIENT: Recieved ID "+id+" from server");
// Send a join lobby request
sendMessage(new JoinLobby(id, FEMultiplayer.getLocalPlayer()));
} else if (message instanceof QuitMessage) {
if(message.origin == id && closeRequested) {
close();
}
} else if(message instanceof EndGame) {
winner = (byte) ((EndGame)message).winner;
} else if(message instanceof SessionUpdate) {
Session update = ((SessionUpdate)message).session;
for(Player p : update.getPlayers()) {
if(!session.getPlayerMap().containsKey(p.getID())) {
session.addPlayer(p);
}
}
session.setMap(update.getMap());
session.setMaxUnits(update.getMaxUnits());
session.setObjective(update.getObjective());
session.setPickMode(update.getPickMode());
}
messages.add(message);
}
public ArrayList<Message> getMessages() {
return messages;
}
private void close() {
try {
in.close();
out.close();
serverSocket.close();
open = false;
} catch (IOException e) {
e.printStackTrace();
}
}
public void quit() {
sendMessage(new QuitMessage(id));
// simple security to prevent clients closing other clients
closeRequested = true;
}
public void sendMessage(Message message) {
try {
message.origin = id;
out.writeObject(message);
// System.out.println("CLIENT: Sent message ["+message.toString()+"]");
} catch (IOException e) {
System.err.println("CLIENT Unable to send message!");
}
}
public boolean isOpen() {
return open;
}
public byte getID() {
return id;
}
public Session getSession() {
return session;
}
}