package Client;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Queue;
import Global_Package.Enums;
import clientMessages.AlterSpell;
import clientMessages.AlterUnit;
import clientMessages.ClientEventIn;
import clientMessages.DrawEffect;
import clientMessages.MoveSpell;
import clientMessages.MoveUnit;
import clientMessages.NewSpell;
import clientMessages.NewUnit;
import clientMessages.RemoveSpell;
import clientMessages.RemoveUnit;
public class ClientNetwork {
private Socket tcpOut;
private ObjectOutputStream out;
private ObjectInputStream in;
private int connectionID;
private DataIn p;
private String ip;
Queue<ClientEventIn> EventQue;
// private Queue<RenderEvent> firstTimePopulateEventQueue(){
// EventQue=new ConcurrentLinkedQueue();
// //talk network here.
// return EventQue;
//
// }
public ClientNetwork(String Ip,Queue<ClientEventIn> EvQ,boolean b, int baseChar) throws IOException, InterruptedException{
tcpOut=new Socket(Ip,557);
ip=Ip;
if(tcpOut.getRemoteSocketAddress() ==null){
//baddd i need real handling....
System.out.println("Boom!");
}
// set up I/O for out (TCP)
System.out.println("Connected to " + tcpOut.getInetAddress().getHostName());
out = new ObjectOutputStream(tcpOut.getOutputStream());
out.flush();
in = new ObjectInputStream(tcpOut.getInputStream());
out.writeByte(0); //send ID if reconnecting.....
out.flush();
connectionID=(int)in.read(); //get ID
System.out.println("ID:"+connectionID);
EventQue=EvQ;
//send char TYPE
out.writeInt(baseChar);
out.flush();
//??? state ???
// Join detected --> send current state.
p=new DataIn(tcpOut.getInetAddress(),b);
p.start();
System.out.print("Network rdy! \n");
}
private class DataIn extends Thread {
DatagramSocket socket;
DatagramPacket packet;
InetAddress address;
private ObjectInputStream inB;
private ObjectOutputStream outB;
Socket tcpIn;
final boolean isUdp;
int port = 13;
DataIn(InetAddress address, boolean b) throws UnknownHostException, IOException{
isUdp=b;
if(isUdp)
socket= new DatagramSocket(553); //receiving port
else{
// tcpIn=new Socket(ip,557);
// outB = new ObjectOutputStream(tcpIn.getOutputStream());
// outB.flush();
// outB.write(connectionID); //assocaites other tcp connection with this one (this is offical in stream...)
// inB=new ObjectInputStream(tcpIn.getInputStream());
}
}
public void run(){
int ID=0;
int OwnerID=0;
int type=0;
float x=0;
float y=0;
int property=0;
int newValue=0;
float theta=0;
while(true){ //make safe later
byte[] message = new byte[1024]; //Max message = 1024 (chat)
if(isUdp){
DatagramPacket packet=new DatagramPacket(message,message.length); //MSG IN
try {
socket.receive(packet);
} catch (IOException e) {
// Tshit go booom?
System.out.println("Packet error in recieving, gana slap my nuts?");
}
}else{
try {
in = new ObjectInputStream(tcpOut.getInputStream());
int i=in.read(message);
System.out.println(i);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Packet error in recieving, gana slap my nuts?");
}
}
//System.out.print(message[0]);
switch(message[0]){
case Enums.drawEffect://14 bytes
type=Enums.toInt(Enums.subarray(message,1,4));
x=Enums.toFloat(Enums.subarray(message,5,4));
y=Enums.toFloat(Enums.subarray(message,9,4));
theta=Enums.toFloat(Enums.subarray(message,13,4));
EventQue.add(new DrawEffect(type,x,y,theta));
break;
case Enums.newSpell://18 bytes
ID=Enums.toInt(Enums.subarray(message,1,4));
OwnerID=Enums.toInt(Enums.subarray(message,1,4));
type=Enums.toInt(Enums.subarray(message,9,4));
x=Enums.toFloat(Enums.subarray(message,13,4));
y=Enums.toFloat(Enums.subarray(message,17,4));
EventQue.add(new NewSpell(ID,OwnerID,type,x,y));
break;
case Enums.moveSpell://14 bytes
type=Enums.toInt(Enums.subarray(message,1,4));
x=Enums.toFloat(Enums.subarray(message,5,4));
y=Enums.toFloat(Enums.subarray(message,9,4));
EventQue.add(new MoveSpell(type,x,y));
break;
case Enums.newUnit://18 bytes
ID=Enums.toInt(Enums.subarray(message,1,4));
OwnerID=Enums.toInt(Enums.subarray(message,1,4));
type=Enums.toInt(Enums.subarray(message,9,4));
x=Enums.toFloat(Enums.subarray(message,13,4));
y=Enums.toFloat(Enums.subarray(message,17,4));
EventQue.add(new NewUnit(ID,OwnerID,type,x,y));
break;
case Enums.moveUnit://14 bytes
ID=Enums.toInt(Enums.subarray(message,1,4));
x=Enums.toFloat(Enums.subarray(message,5,4));
y=Enums.toFloat(Enums.subarray(message,9,4));
//System.out.println(x+","+y);
EventQue.add(new MoveUnit(ID,x,y));
break;
case Enums.removeSpell: //6 bytes
ID=Enums.toInt(Enums.subarray(message,1,4));
EventQue.add(new RemoveSpell(ID));
break;
case Enums.removeUnit://6 bytes
ID=Enums.toInt(Enums.subarray(message,1,4));
EventQue.add(new RemoveUnit(ID));
break;
case Enums.alterSpell://14 bytes
ID=Enums.toInt(Enums.subarray(message,1,4));
property=Enums.toInt(Enums.subarray(message,5,4));
newValue=Enums.toInt(Enums.subarray(message,9,4));
EventQue.add(new AlterSpell(ID,property,newValue));
break;
case Enums.alterUnit://14 bytes
ID=Enums.toInt(Enums.subarray(message,1,4));
property=Enums.toInt(Enums.subarray(message,5,4));
newValue=Enums.toInt(Enums.subarray(message,9,4));
EventQue.add(new AlterUnit(ID,property,newValue));
break;
case Enums.pushChat: //up to 1024?
//?
// EventQue.add(new PushChat(Enums.toString(Enums.subarray(message,1,message.length))));
break;
}
}
}
}
//out
public void pushPlayerMotion(int ID, int x, int y) throws IOException{
// first byte determines packet type
out.writeByte(Enums.sendMoveUnit);
out.flush();
out.writeInt(ID);
out.flush();
out.writeInt(x);
out.flush();
out.writeInt(y);
out.flush();
}
public void pushSpellCast(int type, int IDsource, int x, int y, int lvl, double theta) throws IOException{
// first byte determines packet type
out.writeByte(Enums.sendCastSpell);
out.flush();
out.writeInt(type);
out.flush();
out.writeInt(IDsource);
out.flush();
out.writeInt(lvl);
out.flush();
out.writeInt(x);
out.flush();
out.writeInt(y);
out.flush();
out.writeDouble(theta);
out.flush();
}
//1023 or less bytes or server will overflow >.>
public void pushChat(String text) throws IOException{
// first byte determines packet type
out.write(text.getBytes());
out.flush();
}
}