163 lines
5.9 KiB
Java
163 lines
5.9 KiB
Java
package electrosphere.net.client;
|
|
|
|
import electrosphere.entity.types.creature.CreatureUtils;
|
|
import electrosphere.entity.Entity;
|
|
import electrosphere.entity.EntityUtils;
|
|
import electrosphere.main.Globals;
|
|
import electrosphere.main.Main;
|
|
import electrosphere.net.message.EntityMessage;
|
|
import electrosphere.net.message.NetworkMessage;
|
|
import electrosphere.net.message.PlayerMessage;
|
|
import electrosphere.net.raw.NetworkParser;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.OutputStream;
|
|
import java.math.BigInteger;
|
|
import java.net.Socket;
|
|
import java.net.SocketException;
|
|
import java.security.spec.RSAKeyGenParameterSpec;
|
|
import java.util.Properties;
|
|
import java.util.Random;
|
|
import java.util.concurrent.CopyOnWriteArrayList;
|
|
import java.util.concurrent.Semaphore;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
import javax.crypto.spec.SecretKeySpec;
|
|
import org.apache.commons.crypto.stream.CryptoInputStream;
|
|
import org.apache.commons.crypto.stream.CryptoOutputStream;
|
|
|
|
/**
|
|
*
|
|
* @author amaterasu
|
|
*/
|
|
public class ClientNetworking implements Runnable{
|
|
|
|
|
|
Socket socket;
|
|
// CryptoInputStream inputStream;
|
|
// CryptoOutputStream outputStream;
|
|
InputStream inputStream;
|
|
OutputStream outputStream;
|
|
boolean initialized;
|
|
NetworkParser parser;
|
|
|
|
public ClientNetworking(String address, int port){
|
|
try {
|
|
this.socket = new Socket(address,port);
|
|
} catch (IOException ex) {
|
|
System.err.println("Failed to connect!");
|
|
ex.printStackTrace();
|
|
System.exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
public void run(){
|
|
initialized = false;
|
|
// final SecretKeySpec key = new SecretKeySpec(("1234567890123456").getBytes(),"AES");
|
|
// final Properties properties = new Properties();
|
|
// final RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(4096, BigInteger.probablePrime(4000, new Random()));
|
|
// try {
|
|
// inputStream = new CryptoInputStream("AES/ECB/PKCS5Padding",properties,socket.getInputStream(),key,spec);
|
|
// } catch (IOException ex) {
|
|
// ex.printStackTrace();
|
|
// System.exit(1);
|
|
// }
|
|
// try {
|
|
// outputStream = new CryptoOutputStream("AES/ECB/PKCS5Padding",properties,socket.getOutputStream(),key,spec);
|
|
// } catch (IOException ex) {
|
|
// ex.printStackTrace();
|
|
// System.exit(1);
|
|
// }
|
|
try {
|
|
inputStream = socket.getInputStream();
|
|
outputStream = socket.getOutputStream();
|
|
parser = new NetworkParser(inputStream,outputStream);
|
|
} catch (IOException ex) {
|
|
Logger.getLogger(ClientNetworking.class.getName()).log(Level.SEVERE, null, ex);
|
|
}
|
|
initialized = true;
|
|
while(Main.isRunning()){
|
|
//attempt poll incoming messages
|
|
parser.readMessagesIn();
|
|
//outgoing messages
|
|
parser.pushMessagesOut();
|
|
}
|
|
}
|
|
|
|
|
|
public void parseMessages(){
|
|
if(initialized){
|
|
while(parser.hasIncomingMessaage()){
|
|
NetworkMessage message = parser.popIncomingMessage();
|
|
System.out.println("New message " + message.getType());
|
|
//do something
|
|
handleMessage(message);
|
|
}
|
|
}
|
|
}
|
|
|
|
void handleMessage(NetworkMessage message){
|
|
switch(message.getType()){
|
|
case ENTITY_MESSAGE:
|
|
handleEntityMessage((EntityMessage)message);
|
|
break;
|
|
case PLAYER_MESSAGE:
|
|
handlePlayerMessage((PlayerMessage)message);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void handleEntityMessage(EntityMessage message){
|
|
System.out.println(message.getEntityMessageType());
|
|
switch(message.getEntityMessageType()){
|
|
case CREATE:
|
|
System.out.println("Spawn ID " + message.getEntityType());
|
|
Entity newlySpawnedEntity = CreatureUtils.spawnBasicCreature(message.getEntityType(), 0.005f, 0.025f);
|
|
EntityUtils.getEntityScale(newlySpawnedEntity).set(0.005f);
|
|
EntityUtils.getEntityPosition(newlySpawnedEntity).set(10 - 0.5f,Globals.terrainManager.getHeightAtPosition(10, 10),10 - 0.5f);
|
|
EntityUtils.setEntityID(newlySpawnedEntity, message.getId());
|
|
break;
|
|
case DESTROY:
|
|
break;
|
|
case MOVE:
|
|
//literally just adding this to scope so I can use `` Entity target; `` again
|
|
if(message.getId() != -1){
|
|
Entity target = Globals.entityManager.getEntityFromId(message.getId());
|
|
EntityUtils.getEntityPosition(target).set(message.getX(),message.getY(),message.getZ());
|
|
}
|
|
// CreatureUtils.attachEntityMessageToMovementTree(Globals.entityManager.getEntityFromId(message.getId()),message);
|
|
break;
|
|
case SET_BEHAVIOR_TREE:
|
|
break;
|
|
case SET_PROPERTY:
|
|
if(message.getPropertyType() == 0){
|
|
Entity target = Globals.entityManager.getEntityFromId(message.getId());
|
|
if(target != null){
|
|
CreatureUtils.setControllerPlayerId(target, message.getPropertyValue());
|
|
if(message.getPropertyValue() == Main.playerId){
|
|
Globals.playerCharacter = target;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void handlePlayerMessage(PlayerMessage message){
|
|
switch(message.getPlayerMessageType()){
|
|
case SET_PLAYER_ID:
|
|
Main.playerId = message.getId();
|
|
System.out.println("Player ID is " + Main.playerId);
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void queueOutgoingMessage(NetworkMessage message){
|
|
parser.addOutgoingMessage(message);
|
|
}
|
|
|
|
}
|