Network fixes & sync attack over network

This commit is contained in:
austin 2021-07-05 15:17:49 -04:00
parent ce6a6b9ad7
commit 61aace7b37
10 changed files with 178 additions and 125 deletions

View File

@ -0,0 +1,5 @@
package electrosphere.audio;
public class AudioBuffer {
}

View File

@ -1,9 +1,5 @@
package electrosphere.audio;
/**
*
* @author amaterasu
*/
public class AudioEngine {
}

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;
}
}