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;
|
package electrosphere.audio;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author amaterasu
|
|
||||||
*/
|
|
||||||
public class AudioEngine {
|
public class AudioEngine {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import electrosphere.entity.state.MovementTree;
|
|||||||
import electrosphere.entity.state.MovementTree.MovementTreeState;
|
import electrosphere.entity.state.MovementTree.MovementTreeState;
|
||||||
import electrosphere.main.Globals;
|
import electrosphere.main.Globals;
|
||||||
import electrosphere.menu.MenuTransition;
|
import electrosphere.menu.MenuTransition;
|
||||||
import electrosphere.net.client.ClientNetworkMessage;
|
|
||||||
import electrosphere.net.parser.net.message.EntityMessage;
|
import electrosphere.net.parser.net.message.EntityMessage;
|
||||||
import electrosphere.util.Utilities;
|
import electrosphere.util.Utilities;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|||||||
@ -29,6 +29,8 @@ public class AttackTree {
|
|||||||
|
|
||||||
CopyOnWriteArrayList<EntityMessage> networkMessageQueue = new CopyOnWriteArrayList();
|
CopyOnWriteArrayList<EntityMessage> networkMessageQueue = new CopyOnWriteArrayList();
|
||||||
|
|
||||||
|
long lastUpdateTime = 0;
|
||||||
|
|
||||||
int frameCurrent;
|
int frameCurrent;
|
||||||
|
|
||||||
int damageStartFrame = 1;
|
int damageStartFrame = 1;
|
||||||
@ -73,41 +75,41 @@ public class AttackTree {
|
|||||||
|
|
||||||
public void simulate(){
|
public void simulate(){
|
||||||
float velocity = CreatureUtils.getVelocity(parent);
|
float velocity = CreatureUtils.getVelocity(parent);
|
||||||
float acceleration = CreatureUtils.getAcceleration(parent);
|
|
||||||
float maxNaturalVelocity = CreatureUtils.getMaxNaturalVelocity(parent);
|
|
||||||
Actor entityActor = EntityUtils.getActor(parent);
|
Actor entityActor = EntityUtils.getActor(parent);
|
||||||
// Model entityModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(parent));
|
|
||||||
Vector3f position = EntityUtils.getPosition(parent);
|
Vector3f position = EntityUtils.getPosition(parent);
|
||||||
Vector3f movementVector = CreatureUtils.getMovementVector(parent);
|
Vector3f movementVector = CreatureUtils.getMovementVector(parent);
|
||||||
Vector3f newPosition;
|
|
||||||
|
|
||||||
//parse attached network messages
|
//parse attached network messages
|
||||||
for(EntityMessage message : networkMessageQueue){
|
for(EntityMessage message : networkMessageQueue){
|
||||||
networkMessageQueue.remove(message);
|
networkMessageQueue.remove(message);
|
||||||
// System.out.println("MOVE to " + message.getX() + " " + message.getY() + " " + message.getZ());
|
// System.out.println("MOVE to " + message.getX() + " " + message.getY() + " " + message.getZ());
|
||||||
|
long updateTime = message.gettime();
|
||||||
switch(message.getMessageSubtype()){
|
switch(message.getMessageSubtype()){
|
||||||
case ATTACKUPDATE:
|
case ATTACKUPDATE:
|
||||||
switch(message.gettreeState()){
|
if(updateTime > lastUpdateTime){
|
||||||
case 0:
|
lastUpdateTime = updateTime;
|
||||||
state = AttackTreeState.WINDUP;
|
switch(message.gettreeState()){
|
||||||
frameCurrent = 0;
|
case 0:
|
||||||
// System.out.println("Set state STARTUP");
|
state = AttackTreeState.WINDUP;
|
||||||
break;
|
frameCurrent = 0;
|
||||||
case 1:
|
// System.out.println("Set state STARTUP");
|
||||||
frameCurrent = damageStartFrame+1;
|
break;
|
||||||
state = AttackTreeState.ATTACK;
|
case 1:
|
||||||
// System.out.println("Set state MOVE");
|
frameCurrent = damageStartFrame+1;
|
||||||
break;
|
state = AttackTreeState.ATTACK;
|
||||||
case 2:
|
// System.out.println("Set state MOVE");
|
||||||
frameCurrent = damageEndFrame+1;
|
break;
|
||||||
state = AttackTreeState.COOLDOWN;
|
case 2:
|
||||||
// System.out.println("Set state SLOWDOWN");
|
frameCurrent = damageEndFrame+1;
|
||||||
break;
|
state = AttackTreeState.COOLDOWN;
|
||||||
case 3:
|
// System.out.println("Set state SLOWDOWN");
|
||||||
frameCurrent = 60;
|
break;
|
||||||
state = AttackTreeState.IDLE;
|
case 3:
|
||||||
// System.out.println("Set state IDLE");
|
frameCurrent = 60;
|
||||||
break;
|
state = AttackTreeState.IDLE;
|
||||||
|
// System.out.println("Set state IDLE");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EntityUtils.getPosition(parent).set(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()));
|
CreatureUtils.setMovementVector(parent, new Vector3f(message.getrotationX(),message.getrotationY(),message.getrotationZ()));
|
||||||
@ -128,6 +130,37 @@ public class AttackTree {
|
|||||||
if(frameCurrent > damageStartFrame){
|
if(frameCurrent > damageStartFrame){
|
||||||
state = AttackTreeState.ATTACK;
|
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;
|
break;
|
||||||
case ATTACK:
|
case ATTACK:
|
||||||
if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){
|
if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){
|
||||||
@ -146,6 +179,37 @@ public class AttackTree {
|
|||||||
if(frameCurrent > damageEndFrame){
|
if(frameCurrent > damageEndFrame){
|
||||||
state = AttackTreeState.COOLDOWN;
|
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;
|
break;
|
||||||
case COOLDOWN:
|
case COOLDOWN:
|
||||||
if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){
|
if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){
|
||||||
@ -165,6 +229,37 @@ public class AttackTree {
|
|||||||
state = AttackTreeState.IDLE;
|
state = AttackTreeState.IDLE;
|
||||||
frameCurrent = 0;
|
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;
|
break;
|
||||||
case IDLE:
|
case IDLE:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -34,6 +34,7 @@ public class MovementTree {
|
|||||||
|
|
||||||
CopyOnWriteArrayList<EntityMessage> networkMessageQueue = new CopyOnWriteArrayList();
|
CopyOnWriteArrayList<EntityMessage> networkMessageQueue = new CopyOnWriteArrayList();
|
||||||
|
|
||||||
|
long lastUpdateTime = 0;
|
||||||
|
|
||||||
|
|
||||||
public MovementTree(Entity e){
|
public MovementTree(Entity e){
|
||||||
@ -71,6 +72,7 @@ public class MovementTree {
|
|||||||
//parse attached network messages
|
//parse attached network messages
|
||||||
for(EntityMessage message : networkMessageQueue){
|
for(EntityMessage message : networkMessageQueue){
|
||||||
networkMessageQueue.remove(message);
|
networkMessageQueue.remove(message);
|
||||||
|
long updateTime = message.gettime();
|
||||||
// System.out.println("MOVE to " + message.getX() + " " + message.getY() + " " + message.getZ());
|
// System.out.println("MOVE to " + message.getX() + " " + message.getY() + " " + message.getZ());
|
||||||
switch(message.getMessageSubtype()){
|
switch(message.getMessageSubtype()){
|
||||||
case MOVE:
|
case MOVE:
|
||||||
@ -90,31 +92,34 @@ public class MovementTree {
|
|||||||
case SETFACING:
|
case SETFACING:
|
||||||
break;
|
break;
|
||||||
case MOVEUPDATE:
|
case MOVEUPDATE:
|
||||||
switch(message.gettreeState()){
|
if(updateTime > lastUpdateTime){
|
||||||
case 0:
|
lastUpdateTime = updateTime;
|
||||||
state = MovementTreeState.STARTUP;
|
switch(message.gettreeState()){
|
||||||
// System.out.println("Set state STARTUP");
|
case 0:
|
||||||
break;
|
state = MovementTreeState.STARTUP;
|
||||||
case 1:
|
// System.out.println("Set state STARTUP");
|
||||||
state = MovementTreeState.MOVE;
|
break;
|
||||||
System.out.println("Set state MOVE");
|
case 1:
|
||||||
break;
|
state = MovementTreeState.MOVE;
|
||||||
case 2:
|
System.out.println("Set state MOVE");
|
||||||
state = MovementTreeState.SLOWDOWN;
|
break;
|
||||||
// System.out.println("Set state SLOWDOWN");
|
case 2:
|
||||||
break;
|
state = MovementTreeState.SLOWDOWN;
|
||||||
case 3:
|
// System.out.println("Set state SLOWDOWN");
|
||||||
state = MovementTreeState.IDLE;
|
break;
|
||||||
// System.out.println("Set state IDLE");
|
case 3:
|
||||||
break;
|
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);
|
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){
|
public static String getType(Entity e){
|
||||||
return (String)e.getData(EntityDataStrings.DATA_STRING_CREATURE_TYPE);
|
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:
|
case MOVEUPDATE:
|
||||||
CreatureUtils.attachEntityMessageToMovementTree(Globals.entityManager.getEntityFromId(message.getentityID()),message);
|
CreatureUtils.attachEntityMessageToMovementTree(Globals.entityManager.getEntityFromId(message.getentityID()),message);
|
||||||
break;
|
break;
|
||||||
|
case ATTACKUPDATE:
|
||||||
|
CreatureUtils.attachEntityMessageToAttackTree(Globals.entityManager.getEntityFromId(message.getentityID()),message);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -219,6 +219,13 @@ public class ServerConnectionHandler implements Runnable {
|
|||||||
networkParser.addOutgoingMessage(message);
|
networkParser.addOutgoingMessage(message);
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
networkParser.addOutgoingMessage(message);
|
networkParser.addOutgoingMessage(message);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -47,6 +47,12 @@ public class ServerProtocol {
|
|||||||
CreatureUtils.attachEntityMessageToMovementTree(targetEntity,message);
|
CreatureUtils.attachEntityMessageToMovementTree(targetEntity,message);
|
||||||
}
|
}
|
||||||
break;
|
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