package com.weem.epicinventor.network;
import com.weem.epicinventor.*;
import com.weem.epicinventor.actor.*;
import com.weem.epicinventor.actor.monster.*;
import com.weem.epicinventor.actor.oobaboo.*;
import com.weem.epicinventor.hud.*;
import com.weem.epicinventor.placeable.*;
import com.weem.epicinventor.resource.*;
import com.weem.epicinventor.utility.*;
import com.weem.epicinventor.world.block.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPServer extends Thread {
private Registry registry;
private GameController gameController;
private Socket socket;
private ObjectInputStream input;
private ObjectOutputStream output;
private TCPServerBlockManagerDataSend blockManagerSend;
protected int currentStartCollumn;
public boolean keepRunning = true;
public boolean readyForUpdates = false;
public ServerReceiveThread serverReceiveThread;
protected static int collumnChunkSize;
protected int udpPort;
public TCPServer(Registry r, GameController gc, Socket s, int u) {
registry = r;
gameController = gc;
socket = s;
udpPort = u;
currentStartCollumn = 0;
collumnChunkSize = 50;
}
@Override
public void run() // read server messages and act on them.
{
try {
DatagramSocket socket = new DatagramSocket(udpPort);
serverReceiveThread = new ServerReceiveThread(registry, gameController, socket, udpPort);
serverReceiveThread.start();
} catch (IOException e) {
gameController.showMessage("Error", "Couldn't accept connection...");
return;
}
doServer();
if (serverReceiveThread != null) {
serverReceiveThread.setRunning(false);
}
return;
}
private void doServer() {
Object data;
String playerId = "";
if (socket != null) {
if (socket.isConnected()) {
try {
EIError.debugMsg("Creating output stream");
output = new ObjectOutputStream(socket.getOutputStream());
EIError.debugMsg("Creating input stream");
input = new ObjectInputStream(socket.getInputStream());
EIError.debugMsg("IO Created");
while (keepRunning && socket.isConnected()) {
data = input.readObject();
EIError.debugMsg("Received data: " + data.toString());
if (data.getClass().equals(String.class)) {
data = (String) data;
if (data.toString().equals("goodbye")) {
keepRunning = false;
} else if (data.toString().equals("send block manager")) {
EIError.debugMsg("Sending Block Manager Data...");
BlockManager bm = (BlockManager) (registry.getBlockManager().clone());
bm.clearBlockArray();
sendData(bm);
bm = null;
EIError.debugMsg("Block Manager Data Sent");
System.out.println("Setting new client UDP to: " + udpPort);
sendData("udp " + udpPort);
} else if (data.toString().equals("send block manager chunk")) {
//EIError.debugMsg("Received block man request (" + currentStartCollumn + ":" + collumnChunkSize);
blockManagerSend = new TCPServerBlockManagerDataSend(registry, this, currentStartCollumn, collumnChunkSize);
blockManagerSend.start();
currentStartCollumn += collumnChunkSize;
//EIError.debugMsg("Thread Made");
// EIError.debugMsg("Sending Block Manager Data...");
// //BlockManager bm = registry.getBlockManager();
// short[][] blockChunk = registry.getBlockManager().getBlockCollumns(currentStartCollumn, currentStartCollumn + collumnChunkSize);
// currentStartCollumn += collumnChunkSize;
// sendData(blockChunk);
// blockChunk = null;
// EIError.debugMsg("Block Manager Data Sent 0..200");
// try {
// sleep(10);
// } catch (InterruptedException ex) {
// }
} else if (data.toString().equals("send placable manager")) {
EIError.debugMsg("Sending Placeable Manager Data...");
PlaceableManager pm = registry.getPlaceableManager();
sendData(pm);
pm = null;
EIError.debugMsg("Placeable Manager Data Sent");
} else if (data.toString().equals("send resource manager")) {
EIError.debugMsg("Sending Resource Manager Data...");
ResourceManager rm = registry.getResourceManager();
sendData(rm);
rm = null;
EIError.debugMsg("Resource Manager Data Sent");
} else if (data.toString().equals("send monster manager")) {
EIError.debugMsg("Sending Monster Manager Data...");
MonsterManager mm = registry.getMonsterManager();
sendData(mm);
mm = null;
EIError.debugMsg("Monster Manager Data Sent");
} else if (data.toString().equals("send player")) {
HashMap<String, Player> players = new HashMap<String, Player>(registry.getPlayerManager().getPlayers());
try {
for (String key : players.keySet()) {
Player p = (Player) players.get(key);
if (p != null) {
EIError.debugMsg("Sending Player Data...");
sendData(p);
EIError.debugMsg("Player Data Sent");
}
}
} catch (ConcurrentModificationException concEx) {
//another thread was trying to modify players while iterating
//we'll continue and the new item can be grabbed on the next update
}
} else if (data.toString().length() >= 6 && data.toString().substring(0, 6).equals("place ")) {
String parts[] = data.toString().split(" ");
if (parts.length == 4) {
EIError.debugMsg("Adding placeable...");
registry.getPlaceableManager().loadPlaceable(parts[1], Integer.parseInt(parts[2]), Integer.parseInt(parts[3]), Placeable.State.Placed);
}
} else if (data.toString().length() >= 18 && data.toString().substring(0, 18).equals("send monster data:")) {
String id = data.toString().substring(19);
Monster monster = registry.getMonsterManager().getMonsterById(id);
if (monster != null) {
EIError.debugMsg("Sending Monster Data (" + monster.getId() + ")...");
sendData(monster);
EIError.debugMsg("Monster Data Sent");
}
} else if (data.toString().length() >= 18 && data.toString().substring(0, 18).equals("send oobaboo data:")) {
String id = data.toString().substring(19);
Player player = registry.getPlayerManager().getPlayerById(id);
if (player != null) {
EIError.debugMsg("Sending Oobaboo Data (" + player.getId() + ")...");
sendData(player.getOobaboo());
EIError.debugMsg("Oobaboo Data Sent");
}
} else if (data.toString().length() >= 20 && data.toString().substring(0, 20).equals("send placeable data:")) {
String id = data.toString().substring(21);
Placeable placeable = registry.getPlaceableManager().getPlaceableById(id);
if (placeable != null) {
EIError.debugMsg("Sending Placeable Data (" + placeable.getId() + ")...");
sendData(placeable);
EIError.debugMsg("Placeable Data Sent");
}
} else {
EIError.debugMsg("Other Data:" + data);
if (!data.toString().isEmpty()) {
gameController.showMessage("Success", "Message: " + data);
}
}
} else if (data.getClass().equals(Player.class)) {
EIError.debugMsg("Adding Player...");
Player p = (Player) data;
p.setTransient(registry);
registry.getPlayerManager().registerPlayer(p);
playerId = p.getId();
EIError.debugMsg("Player Added");
readyForUpdates = true;
} else if (data.getClass().equals(OobabooGatherer.class)) {
OobabooGatherer o = (OobabooGatherer) data;
registry.getPlayerManager().assignOobaboo(o);
} else if (data.getClass().equals(OobabooHealer.class)) {
OobabooHealer o = (OobabooHealer) data;
registry.getPlayerManager().assignOobaboo(o);
} else if (data.getClass().equals(OobabooWarrior.class)) {
OobabooWarrior o = (OobabooWarrior) data;
registry.getPlayerManager().assignOobaboo(o);
} else if (data.getClass().equals(UpdatePlayer.class)) {
UpdatePlayer up = (UpdatePlayer) data;
EIError.debugMsg("Updating Player (" + up.id + ")...");
registry.getPlayerManager().processPlayerUpdate(up);
EIError.debugMsg("Player Updated");
} else if (data.getClass().equals(UpdatePlaceable.class)) {
UpdatePlaceable up = (UpdatePlaceable) data;
EIError.debugMsg("Updating Placeable (" + up.id + ")...");
registry.getPlaceableManager().processPlaceableUpdate(up);
EIError.debugMsg("Placeable Updated");
} else {
EIError.debugMsg("Rec Data:" + data);
}
data = null;
}
} catch (IOException e) {
EIError.debugMsg("Network IO Error: " + e.getMessage());
} catch (ClassNotFoundException e) {
EIError.debugMsg("Network Class Error: " + e.getMessage());
} catch (Exception e) {
EIError.debugMsg("Network Error: " + e.getMessage());
e.printStackTrace();
}
}
}
if (serverReceiveThread != null) {
serverReceiveThread.setRunning(false);
}
try {
socket.close();
} catch (IOException e) {
EIError.debugMsg("Socket Close Error: " + e.getMessage());
}
readyForUpdates = false;
PlayerManager pm = registry.getPlayerManager();
if (pm != null) {
pm.removePlayer(playerId);
}
}
public void close() {
EIError.debugMsg("Closing");
if (serverReceiveThread != null) {
serverReceiveThread.setRunning(false);
}
if (socket != null) {
try {
sendData("goodbye");
socket.close();
} catch (IOException e) {
//oh well, ain't no thang
}
}
keepRunning = false;
socket = null;
}
public boolean sendData(Object data) {
if (output == null || !socket.isConnected()) {
return false;
}
synchronized (this) {
try {
output.flush();
output.writeObject(data);
output.flush();
//output.reset();
if (data.getClass().equals(String.class)) {
if (data.equals("goodbye")) {
if (serverReceiveThread != null) {
serverReceiveThread.setRunning(false);
}
socket.close();
if (socket != null) {
socket.close();
}
keepRunning = false;
}
}
} catch (IOException e) {
EIError.debugMsg("Network IO Error - Sending");
}
return true;
}
}
}