package com.weem.epicinventor.network;
import com.weem.epicinventor.*;
import com.weem.epicinventor.actor.*;
import com.weem.epicinventor.actor.monster.*;
import com.weem.epicinventor.hud.*;
import com.weem.epicinventor.actor.oobaboo.*;
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.*;
public class TCPClient extends Thread {
private Registry registry;
private GameController gameController;
private Socket socket;
private String ip;
private int port;
private ObjectInputStream input;
private ObjectOutputStream output;
private TCPClientBlockManagerDataReceive blockManagerReceive;
protected int currentStartCollumn;
public boolean keepRunning = true;
public boolean readyForUpdates = false;
public ClientReceiveThread clientReceiveThread;
protected static int collumnChunkSize;
protected int udpPort = 5555;
public TCPClient(Registry r, GameController gc, String i, int p) {
registry = r;
gameController = gc;
ip = i;
port = p;
currentStartCollumn = 0;
collumnChunkSize = 50;
}
@Override
public void run() // read server messages and act on them.
{
doClient();
if (clientReceiveThread != null) {
clientReceiveThread.setRunning(false);
}
return;
}
private void doClient() {
Object data;
String[] parts;
gameController.setLoading(true);
registry.getHUDManager().loadHUD(HUDManager.HUDType.ScreenLoading);
try {
socket = new Socket(ip, port);
} catch (IOException e) {
gameController.setLoading(false);
registry.getHUDManager().unloadHUD("ScreenLoading");
gameController.showMessage("Error", "Couldn't connect to " + ip + ":" + port);
return;
}
gameController.setNetworkMode(true);
gameController.multiplayerMode = gameController.multiplayerMode.CLIENT;
try {
Game.loadingText = "Establishing Connection";
EIError.debugMsg("Creating output stream");
output = new ObjectOutputStream(socket.getOutputStream());
EIError.debugMsg("Creating input stream");
input = new ObjectInputStream(socket.getInputStream());
EIError.debugMsg("IO Created");
output.writeObject("send block manager");
data = input.readObject();
BlockManager bm = (BlockManager) data;
bm.resetBlockArray(registry.getBlockManager().getMapCols(), registry.getBlockManager().getMapRows());
bm.setTransient(registry);
gameController.setBlockManager(bm);
bm = null;
EIError.debugMsg("Block Manager set");
data = input.readObject();
parts = data.toString().split(" ");
if (parts.length == 2) {
EIError.debugMsg("Setting UDP port to: " + parts[1]);
udpPort = Integer.parseInt(parts[1]);
}
output.writeObject("send block manager chunk");
boolean sendMore = true;
for (int i = 0; i < 4; i++) {
data = input.readObject();
if(i == 3) {
sendMore = false;
}
blockManagerReceive = new TCPClientBlockManagerDataReceive(registry, this, output, data, currentStartCollumn, collumnChunkSize, false, sendMore);
currentStartCollumn += collumnChunkSize;
}
sendData("send placable manager");
Game.loadingText = "Getting World Data...";
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().length() == 8 && data.toString().substring(0, 4).equals("udp ")) {
parts = data.toString().split(" ");
if (parts.length == 2) {
EIError.debugMsg("Setting UDP port to: " + parts[1]);
udpPort = Integer.parseInt(parts[1]);
}
} else {
if (!data.toString().isEmpty()) {
gameController.showMessage("Success", "Message: " + data);
}
}
// } else if (data.getClass().equals(BlockManager.class)) {
// EIError.debugMsg("Setting Block Manager...");
// BlockManager bm = (BlockManager) data;
// bm.setTransient(registry);
// gameController.setBlockManager(bm);
// bm = null;
// EIError.debugMsg("Block Manager set");
// sendData("send placable manager");
// Game.loadingText = "Getting Building Data...";
} else if (data.getClass().equals(short[][].class)) {
blockManagerReceive = new TCPClientBlockManagerDataReceive(registry, this, output, data, currentStartCollumn, collumnChunkSize, true, true);
currentStartCollumn += collumnChunkSize;
// EIError.debugMsg("Setting Block Manager...");
// short[][] blockChunk = (short[][]) data;
// if (blockChunk.length >= collumnChunkSize) {
// registry.getBlockManager().setBlockCollumns(blockChunk, currentStartCollumn, currentStartCollumn + collumnChunkSize);
// if (currentStartCollumn == 0) {
// sendData("send placable manager");
// }
// currentStartCollumn += collumnChunkSize;
// EIError.debugMsg("Block Manager chunk " + currentStartCollumn + " " + currentStartCollumn + collumnChunkSize);
// output.writeObject("send block manager chunk");
// try {
// sleep(10);
// } catch (InterruptedException ex) {
// }
// } else {
// EIError.debugMsg("Block Manager set");
// }
// blockChunk = null;
// Game.loadingText = "Getting Building Data...";
} else if (data.getClass().equals(PlaceableManager.class)) {
EIError.debugMsg("Setting Placeable Manager...");
PlaceableManager pm = (PlaceableManager) data;
pm.setTransient(registry);
gameController.setPlaceableManager(pm);
pm = null;
registry.getPlayerManager().getCurrentPlayer().init();
EIError.debugMsg("Placeable Manager set");
sendData("send resource manager");
Game.loadingText = "Making Shinies...";
} else if (data.getClass().equals(ResourceManager.class)) {
EIError.debugMsg("Setting Resource Manager...");
ResourceManager rm = (ResourceManager) data;
rm.setTransient(registry);
gameController.setResourceManager(rm);
rm = null;
EIError.debugMsg("Resource Manager set");
sendData("send monster manager");
Game.loadingText = "Spawning Evil Bad Guys";
} else if (data.getClass().equals(MonsterManager.class)) {
EIError.debugMsg("Setting Monster Manager...");
MonsterManager mm = (MonsterManager) data;
mm.setTransient(registry);
gameController.setMonsterManager(mm);
mm = null;
EIError.debugMsg("Monster Manager set");
sendData("send player");
Game.loadingText = "Initializing Inventors";
} else if (data.getClass().equals(Player.class)) {
EIError.debugMsg("Adding Player...");
Player p = (Player) data;
p.setTransient(registry);
registry.getPlayerManager().registerPlayer(p);
EIError.debugMsg("Player Added");
if (registry.getPlayerManager().getPlayers().size() <= 2) {
EIError.debugMsg("Sending Player Data...");
sendData(registry.getPlayerManager().getCurrentPlayer());
EIError.debugMsg("Player Data Sent");
Game.loadingText = "Here we go!";
EIError.debugMsg("send block manager chunk");
gameController.setLoading(false);
registry.getHUDManager().unloadHUD("ScreenLoading");
registry.getBlockManager().updateResolution();
gameController.setIsInGame(true);
readyForUpdates = true;
try {
DatagramSocket socket = new DatagramSocket();
clientReceiveThread = new ClientReceiveThread(registry, gameController, socket, ip, udpPort);
clientReceiveThread.start();
System.out.println("Socket Created");
} catch (IOException e) {
e.printStackTrace();
}
output.writeObject("send block manager chunk");
}
} else if (data.getClass().equals(Resource.class)) {
Resource r = (Resource) data;
EIError.debugMsg("Adding Resource (" + r.getId() + ")...");
r.setTransient(registry, registry.getResourceManager());
registry.getResourceManager().registerResource(r);
EIError.debugMsg("Resource Added");
} 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(AggressiveSnake.class)) {
AggressiveSnake m = (AggressiveSnake) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(BlueThorn.class)) {
BlueThorn m = (BlueThorn) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(BossOrc.class)) {
BossOrc m = (BossOrc) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(SnailRider.class)) {
SnailRider m = (SnailRider) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(LionFly.class)) {
LionFly m = (LionFly) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(Orc.class)) {
Orc m = (Orc) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(Pig.class)) {
Pig m = (Pig) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(Porcupine.class)) {
Porcupine m = (Porcupine) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(RedOrc.class)) {
RedOrc m = (RedOrc) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(RockMonster.class)) {
RockMonster m = (RockMonster) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(Snail.class)) {
Snail m = (Snail) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(Snake.class)) {
Snake m = (Snake) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(SpiderWorm.class)) {
SpiderWorm m = (SpiderWorm) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(VineThorn.class)) {
VineThorn m = (VineThorn) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(ZombieWalrus.class)) {
ZombieWalrus m = (ZombieWalrus) data;
m.setTransient(registry, registry.getMonsterManager());
registry.getMonsterManager().registerMonster(m);
} else if (data.getClass().equals(AutoXBow.class)) {
AutoXBow p = (AutoXBow) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(BookShelf.class)) {
BookShelf p = (BookShelf) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(BladeTrap.class)) {
BladeTrap p = (BladeTrap) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(Box.class)) {
Box p = (Box) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(Chest.class)) {
Chest p = (Chest) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(CopperMine.class)) {
CopperMine p = (CopperMine) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(Crate.class)) {
Crate p = (Crate) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(EmeraldTeleporter.class)) {
EmeraldTeleporter p = (EmeraldTeleporter) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(Forge.class)) {
Forge p = (Forge) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(GoldMine.class)) {
GoldMine p = (GoldMine) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(IronMine.class)) {
IronMine p = (IronMine) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(ItemContainer.class)) {
ItemContainer p = (ItemContainer) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(LargeFarm.class)) {
LargeFarm p = (LargeFarm) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(LargeSafe.class)) {
LargeSafe p = (LargeSafe) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(LionFlyStatue.class)) {
LionFlyStatue p = (LionFlyStatue) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(MedicKit.class)) {
MedicKit p = (MedicKit) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(MediumSafe.class)) {
MediumSafe p = (MediumSafe) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(Pasture.class)) {
Pasture p = (Pasture) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(PlatinumMine.class)) {
PlatinumMine p = (PlatinumMine) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(PottedFlower.class)) {
PottedFlower p = (PottedFlower) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(RubyTeleporter.class)) {
RubyTeleporter p = (RubyTeleporter) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(SapphireTeleporter.class)) {
SapphireTeleporter p = (SapphireTeleporter) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(SawMill.class)) {
SawMill p = (SawMill) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(ScareCrow.class)) {
ScareCrow p = (ScareCrow) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(SilverMine.class)) {
SilverMine p = (SilverMine) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(SmallFarm.class)) {
SmallFarm p = (SmallFarm) data;
p.setTransient(registry);
} else if (data.getClass().equals(SmallSafe.class)) {
SmallSafe p = (SmallSafe) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(SteamEngine.class)) {
SteamEngine p = (SteamEngine) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(StoneMine.class)) {
StoneMine p = (StoneMine) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(ThornTrap.class)) {
ThornTrap p = (ThornTrap) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(TownBlock.class)) {
TownBlock p = (TownBlock) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(Building.class)) {
Building p = (Building) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(WeaponRack.class)) {
WeaponRack p = (WeaponRack) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(WindMill.class)) {
WindMill p = (WindMill) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} else if (data.getClass().equals(WorkBench.class)) {
WorkBench p = (WorkBench) data;
p.setTransient(registry);
registry.getPlaceableManager().registerPlaceable(p);
} 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(UpdateMonster.class)) {
UpdateMonster um = (UpdateMonster) data;
EIError.debugMsg("Updating Monster (" + um.id + ")...");
registry.getMonsterManager().processMonsterUpdate(um);
EIError.debugMsg("Monster Updated");
} else if (data.getClass().equals(UpdateRobot.class)) {
UpdateRobot ur = (UpdateRobot) data;
EIError.debugMsg("Updating Robot (" + ur.id + ")...");
registry.getPlayerManager().processRobotUpdate(ur);
EIError.debugMsg("Robot Updated");
} else if (data.getClass().equals(UpdateOobaboo.class)) {
UpdateOobaboo uo = (UpdateOobaboo) data;
EIError.debugMsg("Updating Oobaboo (" + uo.id + ")...");
registry.getPlayerManager().processOobabooUpdate(uo);
EIError.debugMsg("Oobaboo 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 if (data.getClass().equals(UpdateResource.class)) {
UpdateResource ur = (UpdateResource) data;
EIError.debugMsg("Updating Resource (" + ur.id + ")...");
registry.getResourceManager().processResourceUpdate(ur);
EIError.debugMsg("Resource Updated");
} else if (data.getClass().equals(UpdateProjectile.class)) {
UpdateProjectile up = (UpdateProjectile) data;
EIError.debugMsg("Updating Projectile...");
registry.getProjectileManager().processProjectileUpdate(up);
EIError.debugMsg("Projectile Updated");
} else {
System.out.println("ERROR DATA: " + data.getClass());
}
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());
}
if (clientReceiveThread != null) {
clientReceiveThread.setRunning(false);
}
readyForUpdates = false;
gameController.setNetworkMode(false);
gameController.showMessage("Error", "Server went offline");
gameController.saveAndQuit();
gameController.multiplayerMode = gameController.multiplayerMode.NONE;
return;
}
public void close() {
EIError.debugMsg("Closing");
if (clientReceiveThread != null) {
clientReceiveThread.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 (clientReceiveThread != null) {
clientReceiveThread.setRunning(false);
}
socket.close();
if (socket != null) {
socket.close();
}
keepRunning = false;
}
}
} catch (IOException e) {
EIError.debugMsg("Network IO Error - Sending");
}
return true;
}
}
}