Network fixes & sync attack over network
This commit is contained in:
parent
ce6a6b9ad7
commit
61aace7b37
5
src/main/java/electrosphere/audio/AudioBuffer.java
Normal file
5
src/main/java/electrosphere/audio/AudioBuffer.java
Normal file
@ -0,0 +1,5 @@
|
||||
package electrosphere.audio;
|
||||
|
||||
public class AudioBuffer {
|
||||
|
||||
}
|
||||
@ -1,9 +1,5 @@
|
||||
package electrosphere.audio;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class AudioEngine {
|
||||
|
||||
}
|
||||
|
||||
@ -9,7 +9,6 @@ import electrosphere.entity.state.MovementTree;
|
||||
import electrosphere.entity.state.MovementTree.MovementTreeState;
|
||||
import electrosphere.main.Globals;
|
||||
import electrosphere.menu.MenuTransition;
|
||||
import electrosphere.net.client.ClientNetworkMessage;
|
||||
import electrosphere.net.parser.net.message.EntityMessage;
|
||||
import electrosphere.util.Utilities;
|
||||
import java.util.HashMap;
|
||||
|
||||
@ -29,6 +29,8 @@ public class AttackTree {
|
||||
|
||||
CopyOnWriteArrayList<EntityMessage> networkMessageQueue = new CopyOnWriteArrayList();
|
||||
|
||||
long lastUpdateTime = 0;
|
||||
|
||||
int frameCurrent;
|
||||
|
||||
int damageStartFrame = 1;
|
||||
@ -73,41 +75,41 @@ public class AttackTree {
|
||||
|
||||
public void simulate(){
|
||||
float velocity = CreatureUtils.getVelocity(parent);
|
||||
float acceleration = CreatureUtils.getAcceleration(parent);
|
||||
float maxNaturalVelocity = CreatureUtils.getMaxNaturalVelocity(parent);
|
||||
Actor entityActor = EntityUtils.getActor(parent);
|
||||
// Model entityModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(parent));
|
||||
Vector3f position = EntityUtils.getPosition(parent);
|
||||
Vector3f movementVector = CreatureUtils.getMovementVector(parent);
|
||||
Vector3f newPosition;
|
||||
|
||||
//parse attached network messages
|
||||
for(EntityMessage message : networkMessageQueue){
|
||||
networkMessageQueue.remove(message);
|
||||
// System.out.println("MOVE to " + message.getX() + " " + message.getY() + " " + message.getZ());
|
||||
long updateTime = message.gettime();
|
||||
switch(message.getMessageSubtype()){
|
||||
case ATTACKUPDATE:
|
||||
switch(message.gettreeState()){
|
||||
case 0:
|
||||
state = AttackTreeState.WINDUP;
|
||||
frameCurrent = 0;
|
||||
// System.out.println("Set state STARTUP");
|
||||
break;
|
||||
case 1:
|
||||
frameCurrent = damageStartFrame+1;
|
||||
state = AttackTreeState.ATTACK;
|
||||
// System.out.println("Set state MOVE");
|
||||
break;
|
||||
case 2:
|
||||
frameCurrent = damageEndFrame+1;
|
||||
state = AttackTreeState.COOLDOWN;
|
||||
// System.out.println("Set state SLOWDOWN");
|
||||
break;
|
||||
case 3:
|
||||
frameCurrent = 60;
|
||||
state = AttackTreeState.IDLE;
|
||||
// System.out.println("Set state IDLE");
|
||||
break;
|
||||
if(updateTime > lastUpdateTime){
|
||||
lastUpdateTime = updateTime;
|
||||
switch(message.gettreeState()){
|
||||
case 0:
|
||||
state = AttackTreeState.WINDUP;
|
||||
frameCurrent = 0;
|
||||
// System.out.println("Set state STARTUP");
|
||||
break;
|
||||
case 1:
|
||||
frameCurrent = damageStartFrame+1;
|
||||
state = AttackTreeState.ATTACK;
|
||||
// System.out.println("Set state MOVE");
|
||||
break;
|
||||
case 2:
|
||||
frameCurrent = damageEndFrame+1;
|
||||
state = AttackTreeState.COOLDOWN;
|
||||
// System.out.println("Set state SLOWDOWN");
|
||||
break;
|
||||
case 3:
|
||||
frameCurrent = 60;
|
||||
state = AttackTreeState.IDLE;
|
||||
// System.out.println("Set state IDLE");
|
||||
break;
|
||||
}
|
||||
}
|
||||
EntityUtils.getPosition(parent).set(message.getpositionX(),message.getpositionY(),message.getpositionZ());
|
||||
CreatureUtils.setMovementVector(parent, new Vector3f(message.getrotationX(),message.getrotationY(),message.getrotationZ()));
|
||||
@ -128,6 +130,37 @@ public class AttackTree {
|
||||
if(frameCurrent > damageStartFrame){
|
||||
state = AttackTreeState.ATTACK;
|
||||
}
|
||||
if(Globals.RUN_SERVER){
|
||||
Globals.server.broadcastMessage(
|
||||
EntityMessage.constructattackUpdateMessage(
|
||||
parent.getId(),
|
||||
System.currentTimeMillis(),
|
||||
position.x,
|
||||
position.y,
|
||||
position.z,
|
||||
movementVector.x,
|
||||
movementVector.y,
|
||||
movementVector.z,
|
||||
velocity,
|
||||
0
|
||||
)
|
||||
);
|
||||
} else if(Globals.RUN_CLIENT && parent.getId() == Globals.clientCharacterID){
|
||||
Globals.clientConnection.queueOutgoingMessage(
|
||||
EntityMessage.constructattackUpdateMessage(
|
||||
parent.getId(),
|
||||
System.currentTimeMillis(),
|
||||
position.x,
|
||||
position.y,
|
||||
position.z,
|
||||
movementVector.x,
|
||||
movementVector.y,
|
||||
movementVector.z,
|
||||
velocity,
|
||||
0
|
||||
)
|
||||
);
|
||||
}
|
||||
break;
|
||||
case ATTACK:
|
||||
if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){
|
||||
@ -146,6 +179,37 @@ public class AttackTree {
|
||||
if(frameCurrent > damageEndFrame){
|
||||
state = AttackTreeState.COOLDOWN;
|
||||
}
|
||||
if(Globals.RUN_SERVER){
|
||||
Globals.server.broadcastMessage(
|
||||
EntityMessage.constructattackUpdateMessage(
|
||||
parent.getId(),
|
||||
System.currentTimeMillis(),
|
||||
position.x,
|
||||
position.y,
|
||||
position.z,
|
||||
movementVector.x,
|
||||
movementVector.y,
|
||||
movementVector.z,
|
||||
velocity,
|
||||
1
|
||||
)
|
||||
);
|
||||
} else if(Globals.RUN_CLIENT && parent.getId() == Globals.clientCharacterID){
|
||||
Globals.clientConnection.queueOutgoingMessage(
|
||||
EntityMessage.constructattackUpdateMessage(
|
||||
parent.getId(),
|
||||
System.currentTimeMillis(),
|
||||
position.x,
|
||||
position.y,
|
||||
position.z,
|
||||
movementVector.x,
|
||||
movementVector.y,
|
||||
movementVector.z,
|
||||
velocity,
|
||||
1
|
||||
)
|
||||
);
|
||||
}
|
||||
break;
|
||||
case COOLDOWN:
|
||||
if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){
|
||||
@ -165,6 +229,37 @@ public class AttackTree {
|
||||
state = AttackTreeState.IDLE;
|
||||
frameCurrent = 0;
|
||||
}
|
||||
if(Globals.RUN_SERVER){
|
||||
Globals.server.broadcastMessage(
|
||||
EntityMessage.constructattackUpdateMessage(
|
||||
parent.getId(),
|
||||
System.currentTimeMillis(),
|
||||
position.x,
|
||||
position.y,
|
||||
position.z,
|
||||
movementVector.x,
|
||||
movementVector.y,
|
||||
movementVector.z,
|
||||
velocity,
|
||||
2
|
||||
)
|
||||
);
|
||||
} else if(Globals.RUN_CLIENT && parent.getId() == Globals.clientCharacterID){
|
||||
Globals.clientConnection.queueOutgoingMessage(
|
||||
EntityMessage.constructattackUpdateMessage(
|
||||
parent.getId(),
|
||||
System.currentTimeMillis(),
|
||||
position.x,
|
||||
position.y,
|
||||
position.z,
|
||||
movementVector.x,
|
||||
movementVector.y,
|
||||
movementVector.z,
|
||||
velocity,
|
||||
2
|
||||
)
|
||||
);
|
||||
}
|
||||
break;
|
||||
case IDLE:
|
||||
break;
|
||||
|
||||
@ -34,6 +34,7 @@ public class MovementTree {
|
||||
|
||||
CopyOnWriteArrayList<EntityMessage> networkMessageQueue = new CopyOnWriteArrayList();
|
||||
|
||||
long lastUpdateTime = 0;
|
||||
|
||||
|
||||
public MovementTree(Entity e){
|
||||
@ -71,6 +72,7 @@ public class MovementTree {
|
||||
//parse attached network messages
|
||||
for(EntityMessage message : networkMessageQueue){
|
||||
networkMessageQueue.remove(message);
|
||||
long updateTime = message.gettime();
|
||||
// System.out.println("MOVE to " + message.getX() + " " + message.getY() + " " + message.getZ());
|
||||
switch(message.getMessageSubtype()){
|
||||
case MOVE:
|
||||
@ -90,31 +92,34 @@ public class MovementTree {
|
||||
case SETFACING:
|
||||
break;
|
||||
case MOVEUPDATE:
|
||||
switch(message.gettreeState()){
|
||||
case 0:
|
||||
state = MovementTreeState.STARTUP;
|
||||
// System.out.println("Set state STARTUP");
|
||||
break;
|
||||
case 1:
|
||||
state = MovementTreeState.MOVE;
|
||||
System.out.println("Set state MOVE");
|
||||
break;
|
||||
case 2:
|
||||
state = MovementTreeState.SLOWDOWN;
|
||||
// System.out.println("Set state SLOWDOWN");
|
||||
break;
|
||||
case 3:
|
||||
state = MovementTreeState.IDLE;
|
||||
// System.out.println("Set state IDLE");
|
||||
break;
|
||||
if(updateTime > lastUpdateTime){
|
||||
lastUpdateTime = updateTime;
|
||||
switch(message.gettreeState()){
|
||||
case 0:
|
||||
state = MovementTreeState.STARTUP;
|
||||
// System.out.println("Set state STARTUP");
|
||||
break;
|
||||
case 1:
|
||||
state = MovementTreeState.MOVE;
|
||||
System.out.println("Set state MOVE");
|
||||
break;
|
||||
case 2:
|
||||
state = MovementTreeState.SLOWDOWN;
|
||||
// System.out.println("Set state SLOWDOWN");
|
||||
break;
|
||||
case 3:
|
||||
state = MovementTreeState.IDLE;
|
||||
// System.out.println("Set state IDLE");
|
||||
break;
|
||||
}
|
||||
// System.out.println(EntityUtils.getEntityPosition(parent));
|
||||
// System.out.println(message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ());
|
||||
EntityUtils.getPosition(parent).set(message.getpositionX(),message.getpositionY(),message.getpositionZ());
|
||||
CreatureUtils.setMovementVector(parent, new Vector3f(message.getrotationX(),message.getrotationY(),message.getrotationZ()));
|
||||
// EntityUtils.getEntityRotation(parent).set(message.getrotationX(), message.getrotationY(), message.getrotationZ(), message.getrotationW()).normalize();
|
||||
// velocity = message.getvelocity();
|
||||
break;
|
||||
}
|
||||
// System.out.println(EntityUtils.getEntityPosition(parent));
|
||||
// System.out.println(message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ());
|
||||
EntityUtils.getPosition(parent).set(message.getpositionX(),message.getpositionY(),message.getpositionZ());
|
||||
CreatureUtils.setMovementVector(parent, new Vector3f(message.getrotationX(),message.getrotationY(),message.getrotationZ()));
|
||||
// EntityUtils.getEntityRotation(parent).set(message.getrotationX(), message.getrotationY(), message.getrotationZ(), message.getrotationW()).normalize();
|
||||
// velocity = message.getvelocity();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -142,6 +142,14 @@ public class CreatureUtils {
|
||||
getEntityMovementTree(e).addNetworkMessage(em);
|
||||
}
|
||||
|
||||
public static AttackTree getEntityAttackTree(Entity e){
|
||||
return (AttackTree)e.getData(EntityDataStrings.ATTACK_TREE);
|
||||
}
|
||||
|
||||
public static void attachEntityMessageToAttackTree(Entity e, EntityMessage em){
|
||||
getEntityAttackTree(e).addNetworkMessage(em);
|
||||
}
|
||||
|
||||
public static String getType(Entity e){
|
||||
return (String)e.getData(EntityDataStrings.DATA_STRING_CREATURE_TYPE);
|
||||
}
|
||||
|
||||
@ -1,71 +0,0 @@
|
||||
package electrosphere.net.client;
|
||||
|
||||
import electrosphere.logger.LoggerInterface;
|
||||
import electrosphere.util.BufferUtils;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class ClientNetworkMessage {
|
||||
|
||||
byte[] bytesRaw;
|
||||
|
||||
public ClientNetworkMessage(byte[] bytes){
|
||||
bytesRaw = bytes;
|
||||
}
|
||||
|
||||
|
||||
public byte[] getRawBytes(){
|
||||
return bytesRaw;
|
||||
}
|
||||
|
||||
public static ClientNetworkMessage getMoveForwardMessage(){
|
||||
return new ClientNetworkMessage("test".getBytes());
|
||||
}
|
||||
|
||||
static final byte CATEGORY_ENTITY = 2;
|
||||
|
||||
static final byte ENTITY_CREATE = 0;
|
||||
static final byte ENTITY_DELETE = 1;
|
||||
static final byte ENTITY_MOVE = 2;
|
||||
static final byte ENTITY_SET_BEHAVIOR_TREE_STATE = 3;
|
||||
|
||||
static ByteBuffer integerCompactor;
|
||||
|
||||
static {
|
||||
integerCompactor = ByteBuffer.allocate(4);
|
||||
}
|
||||
|
||||
public static ClientNetworkMessage parseClientNetworkMessageFromByteQueue(CopyOnWriteArrayList<Byte> byteQueue){
|
||||
ClientNetworkMessage rVal = null;
|
||||
if(byteQueue.size() > 0){
|
||||
byte firstByte = byteQueue.get(0);
|
||||
switch(firstByte){
|
||||
case CATEGORY_ENTITY:
|
||||
if(byteQueue.size() >= 18){
|
||||
byte secondByte = byteQueue.get(1);
|
||||
switch(secondByte){
|
||||
case ENTITY_CREATE:
|
||||
byteQueue.remove(0);
|
||||
byteQueue.remove(0);
|
||||
int id = BufferUtils.popIntFromByteQueue(byteQueue);
|
||||
int type = BufferUtils.popIntFromByteQueue(byteQueue);
|
||||
LoggerInterface.loggerNetworking.INFO("Create entity id:" + id + " type:" + type);
|
||||
break;
|
||||
case ENTITY_DELETE:
|
||||
break;
|
||||
case ENTITY_MOVE:
|
||||
break;
|
||||
case ENTITY_SET_BEHAVIOR_TREE_STATE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
}
|
||||
@ -107,6 +107,9 @@ public class ClientProtocol {
|
||||
case MOVEUPDATE:
|
||||
CreatureUtils.attachEntityMessageToMovementTree(Globals.entityManager.getEntityFromId(message.getentityID()),message);
|
||||
break;
|
||||
case ATTACKUPDATE:
|
||||
CreatureUtils.attachEntityMessageToAttackTree(Globals.entityManager.getEntityFromId(message.getentityID()),message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -219,6 +219,13 @@ public class ServerConnectionHandler implements Runnable {
|
||||
networkParser.addOutgoingMessage(message);
|
||||
}
|
||||
break;
|
||||
case ATTACKUPDATE:
|
||||
if(((EntityMessage)message).getentityID()==playerCharacterID){
|
||||
//basically don't send the message if this is the player's character and it's a move update
|
||||
} else {
|
||||
networkParser.addOutgoingMessage(message);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
networkParser.addOutgoingMessage(message);
|
||||
break;
|
||||
|
||||
@ -47,6 +47,12 @@ public class ServerProtocol {
|
||||
CreatureUtils.attachEntityMessageToMovementTree(targetEntity,message);
|
||||
}
|
||||
break;
|
||||
case ATTACKUPDATE:
|
||||
targetEntity = Globals.entityManager.getEntityFromId(message.getentityID());
|
||||
if(targetEntity != null){
|
||||
CreatureUtils.attachEntityMessageToAttackTree(targetEntity,message);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user