From 61aace7b3754d854bf79db0081bce72a2e2ab60f Mon Sep 17 00:00:00 2001 From: austin Date: Mon, 5 Jul 2021 15:17:49 -0400 Subject: [PATCH] Network fixes & sync attack over network --- .../java/electrosphere/audio/AudioBuffer.java | 5 + .../java/electrosphere/audio/AudioEngine.java | 4 - .../controls/ControlHandler.java | 1 - .../entity/state/AttackTree.java | 145 +++++++++++++++--- .../entity/state/MovementTree.java | 53 ++++--- .../entity/types/creature/CreatureUtils.java | 8 + .../net/client/ClientNetworkMessage.java | 71 --------- .../net/client/ClientProtocol.java | 3 + .../net/server/ServerConnectionHandler.java | 7 + .../net/server/ServerProtocol.java | 6 + 10 files changed, 178 insertions(+), 125 deletions(-) create mode 100644 src/main/java/electrosphere/audio/AudioBuffer.java delete mode 100644 src/main/java/electrosphere/net/client/ClientNetworkMessage.java diff --git a/src/main/java/electrosphere/audio/AudioBuffer.java b/src/main/java/electrosphere/audio/AudioBuffer.java new file mode 100644 index 00000000..13ac9a41 --- /dev/null +++ b/src/main/java/electrosphere/audio/AudioBuffer.java @@ -0,0 +1,5 @@ +package electrosphere.audio; + +public class AudioBuffer { + +} diff --git a/src/main/java/electrosphere/audio/AudioEngine.java b/src/main/java/electrosphere/audio/AudioEngine.java index ef47e1c5..a78428f2 100644 --- a/src/main/java/electrosphere/audio/AudioEngine.java +++ b/src/main/java/electrosphere/audio/AudioEngine.java @@ -1,9 +1,5 @@ package electrosphere.audio; -/** - * - * @author amaterasu - */ public class AudioEngine { } diff --git a/src/main/java/electrosphere/controls/ControlHandler.java b/src/main/java/electrosphere/controls/ControlHandler.java index c68548f8..60a2c7ab 100644 --- a/src/main/java/electrosphere/controls/ControlHandler.java +++ b/src/main/java/electrosphere/controls/ControlHandler.java @@ -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; diff --git a/src/main/java/electrosphere/entity/state/AttackTree.java b/src/main/java/electrosphere/entity/state/AttackTree.java index 7cf0c14d..0b165126 100644 --- a/src/main/java/electrosphere/entity/state/AttackTree.java +++ b/src/main/java/electrosphere/entity/state/AttackTree.java @@ -29,6 +29,8 @@ public class AttackTree { CopyOnWriteArrayList 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; diff --git a/src/main/java/electrosphere/entity/state/MovementTree.java b/src/main/java/electrosphere/entity/state/MovementTree.java index c1ebeb44..8c30ba11 100644 --- a/src/main/java/electrosphere/entity/state/MovementTree.java +++ b/src/main/java/electrosphere/entity/state/MovementTree.java @@ -34,6 +34,7 @@ public class MovementTree { CopyOnWriteArrayList 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; } } diff --git a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java index 2629ed13..4b8eadaf 100644 --- a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java +++ b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java @@ -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); } diff --git a/src/main/java/electrosphere/net/client/ClientNetworkMessage.java b/src/main/java/electrosphere/net/client/ClientNetworkMessage.java deleted file mode 100644 index 6e963ff9..00000000 --- a/src/main/java/electrosphere/net/client/ClientNetworkMessage.java +++ /dev/null @@ -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 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; - } -} diff --git a/src/main/java/electrosphere/net/client/ClientProtocol.java b/src/main/java/electrosphere/net/client/ClientProtocol.java index c74dc3b1..983e70f8 100644 --- a/src/main/java/electrosphere/net/client/ClientProtocol.java +++ b/src/main/java/electrosphere/net/client/ClientProtocol.java @@ -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; } } diff --git a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java index a85fc117..44ce306d 100644 --- a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java +++ b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java @@ -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; diff --git a/src/main/java/electrosphere/net/server/ServerProtocol.java b/src/main/java/electrosphere/net/server/ServerProtocol.java index 811bff96..aa32ccd8 100644 --- a/src/main/java/electrosphere/net/server/ServerProtocol.java +++ b/src/main/java/electrosphere/net/server/ServerProtocol.java @@ -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; } }