state collection work
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
This commit is contained in:
parent
438766d052
commit
263d6680ee
@ -533,6 +533,9 @@ Ability to serialize/deserialize a creature with equipped items
|
||||
- Send to client
|
||||
- Receive from server
|
||||
|
||||
(08/11/2024)
|
||||
Sending initial synchronized state on player connect to chunk
|
||||
|
||||
|
||||
# TODO
|
||||
|
||||
|
||||
@ -3,6 +3,8 @@ package electrosphere.entity.types.creature;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import electrosphere.net.synchronization.transport.StateCollection;
|
||||
|
||||
/**
|
||||
* The template used to construct the creature on the client
|
||||
*/
|
||||
@ -23,6 +25,11 @@ public class CreatureTemplate {
|
||||
*/
|
||||
private CreatureEquipData equipData = new CreatureEquipData();
|
||||
|
||||
/**
|
||||
* The collection of synchronized values
|
||||
*/
|
||||
private StateCollection stateCollection;
|
||||
|
||||
/**
|
||||
* Creates the creature template
|
||||
* @param creatureType The type of creature
|
||||
@ -77,6 +84,22 @@ public class CreatureTemplate {
|
||||
return this.equipData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the state collection for the creature
|
||||
* @return The collection of synchronized values
|
||||
*/
|
||||
public StateCollection getStateCollection(){
|
||||
return this.stateCollection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the synchronized values for this creature
|
||||
* @param stateCollection The synchronized values
|
||||
*/
|
||||
public void setStateCollection(StateCollection stateCollection){
|
||||
this.stateCollection = stateCollection;
|
||||
}
|
||||
|
||||
/**
|
||||
* A visual attribute of a creature (ie how wide is their nose, what type of hairstyle do they have, etc)
|
||||
*/
|
||||
|
||||
@ -65,6 +65,7 @@ import electrosphere.net.NetUtils;
|
||||
import electrosphere.net.parser.net.message.EntityMessage;
|
||||
import electrosphere.net.parser.net.message.NetworkMessage;
|
||||
import electrosphere.net.server.player.Player;
|
||||
import electrosphere.net.synchronization.transport.StateCollection;
|
||||
import electrosphere.renderer.actor.Actor;
|
||||
import electrosphere.renderer.actor.ActorBoneRotator;
|
||||
import electrosphere.renderer.actor.ActorStaticMorph;
|
||||
@ -845,6 +846,7 @@ public class CreatureUtils {
|
||||
equipData.setSlotItem(point, new EquippedItem(item.getId(),ItemUtils.getType(item)));
|
||||
}
|
||||
}
|
||||
template.setStateCollection(StateCollection.getStateCollection(e));
|
||||
return template;
|
||||
}
|
||||
|
||||
|
||||
@ -25,6 +25,7 @@ import electrosphere.game.data.creature.type.ViewModelData;
|
||||
import electrosphere.logger.LoggerInterface;
|
||||
import electrosphere.net.parser.net.message.EntityMessage;
|
||||
import electrosphere.net.parser.net.message.EntityMessage.EntityMessageType;
|
||||
import electrosphere.net.synchronization.transport.StateCollection;
|
||||
import electrosphere.net.template.ClientProtocolTemplate;
|
||||
import electrosphere.util.Utilities;
|
||||
|
||||
@ -110,6 +111,10 @@ public class EntityProtocol implements ClientProtocolTemplate<EntityMessage> {
|
||||
Globals.clientSceneWrapper.mapIdToId(itemInInventory.getId(), itemDefinition.getEntityId());
|
||||
}
|
||||
}
|
||||
//apply state synchronization if present
|
||||
if(template != null && template.getStateCollection() != null && template.getStateCollection().getValues() != null){
|
||||
StateCollection.applyStateCollection(newlySpawnedEntity, template.getStateCollection());
|
||||
}
|
||||
} break;
|
||||
case SPAWNITEM: {
|
||||
LoggerInterface.loggerNetworking.DEBUG("Spawn Item " + message.getentityID() + " at " + message.getpositionX() + " " + message.getpositionY() + " " + message.getpositionZ());
|
||||
|
||||
@ -0,0 +1,261 @@
|
||||
package electrosphere.net.synchronization.transport;
|
||||
|
||||
|
||||
import electrosphere.entity.state.equip.ClientEquipState;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.state.attack.ClientAttackTree;
|
||||
import electrosphere.entity.state.attack.ServerAttackTree;
|
||||
import electrosphere.entity.state.block.ClientBlockTree;
|
||||
import electrosphere.entity.state.block.ServerBlockTree;
|
||||
import electrosphere.entity.state.equip.ServerEquipState;
|
||||
import electrosphere.entity.state.gravity.ClientGravityTree;
|
||||
import electrosphere.entity.state.gravity.ServerGravityTree;
|
||||
import electrosphere.entity.state.idle.ClientIdleTree;
|
||||
import electrosphere.entity.state.idle.ServerIdleTree;
|
||||
import electrosphere.entity.state.life.ClientLifeTree;
|
||||
import electrosphere.entity.state.life.ServerLifeTree;
|
||||
import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree;
|
||||
import electrosphere.entity.state.movement.groundmove.ServerGroundMovementTree;
|
||||
import electrosphere.entity.state.movement.jump.ClientJumpTree;
|
||||
import electrosphere.entity.state.movement.jump.ServerJumpTree;
|
||||
import electrosphere.net.synchronization.enums.BehaviorTreeIdEnums;
|
||||
import electrosphere.net.synchronization.enums.FieldIdEnums;
|
||||
|
||||
/**
|
||||
* A collection of values for synchronized variables.
|
||||
* Used to transport data from server to client on initially loading a given entity.
|
||||
*/
|
||||
public class StateCollection {
|
||||
|
||||
/**
|
||||
* The synchronized values
|
||||
*/
|
||||
List<SynchronizedFieldValue> values = new LinkedList<SynchronizedFieldValue>();
|
||||
|
||||
/**
|
||||
* Get the synchronized field's values
|
||||
* @return The values
|
||||
*/
|
||||
public List<SynchronizedFieldValue> getValues(){
|
||||
return values;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a given value
|
||||
* @param value The value
|
||||
*/
|
||||
public void setValue(SynchronizedFieldValue value){
|
||||
this.values.add(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p> Automatically generated </p>
|
||||
* <p>
|
||||
* Gets the state collection for the given entity
|
||||
* </p>
|
||||
* @param entity The entity
|
||||
* @return The state collection
|
||||
*/
|
||||
public static StateCollection getStateCollection(Entity entity){
|
||||
StateCollection collection = new StateCollection();
|
||||
for(int treeId : Globals.entityValueTrackingService.getEntityTrees(entity)){
|
||||
switch(treeId){
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERATTACKTREE_ID: {
|
||||
ServerAttackTree tree = ServerAttackTree.getServerAttackTree(entity);
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERATTACKTREE_ID,FieldIdEnums.TREE_SERVERATTACKTREE_SYNCEDFIELD_STATE_ID,ClientAttackTree.getAttackTreeStateEnumAsShort(tree.getState())));
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERATTACKTREE_ID,FieldIdEnums.TREE_SERVERATTACKTREE_SYNCEDFIELD_DRIFTSTATE_ID,ClientAttackTree.getAttackTreeDriftStateEnumAsShort(tree.getDriftState())));
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERATTACKTREE_ID,FieldIdEnums.TREE_SERVERATTACKTREE_SYNCEDFIELD_CURRENTMOVEID_ID,tree.getCurrentMoveId()));
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERBLOCKTREE_ID: {
|
||||
ServerBlockTree tree = ServerBlockTree.getServerBlockTree(entity);
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERBLOCKTREE_ID,FieldIdEnums.TREE_SERVERBLOCKTREE_SYNCEDFIELD_STATE_ID,ClientBlockTree.getBlockStateEnumAsShort(tree.getState())));
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERBLOCKTREE_ID,FieldIdEnums.TREE_SERVERBLOCKTREE_SYNCEDFIELD_CURRENTBLOCKVARIANT_ID,tree.getCurrentBlockVariant()));
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVEREQUIPSTATE_ID: {
|
||||
ServerEquipState tree = ServerEquipState.getServerEquipState(entity);
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERGRAVITY_ID: {
|
||||
ServerGravityTree tree = ServerGravityTree.getServerGravityTree(entity);
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERGRAVITY_ID,FieldIdEnums.TREE_SERVERGRAVITY_SYNCEDFIELD_STATE_ID,ClientGravityTree.getGravityTreeStateEnumAsShort(tree.getState())));
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERIDLE_ID: {
|
||||
ServerIdleTree tree = ServerIdleTree.getServerIdleTree(entity);
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERIDLE_ID,FieldIdEnums.TREE_SERVERIDLE_SYNCEDFIELD_STATE_ID,ClientIdleTree.getIdleTreeStateEnumAsShort(tree.getState())));
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERLIFETREE_ID: {
|
||||
ServerLifeTree tree = ServerLifeTree.getServerLifeTree(entity);
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERLIFETREE_ID,FieldIdEnums.TREE_SERVERLIFETREE_SYNCEDFIELD_STATE_ID,ClientLifeTree.getLifeStateEnumEnumAsShort(tree.getState())));
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERGROUNDMOVEMENTTREE_ID: {
|
||||
ServerGroundMovementTree tree = ServerGroundMovementTree.getServerGroundMovementTree(entity);
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERGROUNDMOVEMENTTREE_ID,FieldIdEnums.TREE_SERVERGROUNDMOVEMENTTREE_SYNCEDFIELD_FACING_ID,ClientGroundMovementTree.getMovementRelativeFacingEnumAsShort(tree.getFacing())));
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERJUMPTREE_ID: {
|
||||
ServerJumpTree tree = ServerJumpTree.getServerJumpTree(entity);
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERJUMPTREE_ID,FieldIdEnums.TREE_SERVERJUMPTREE_SYNCEDFIELD_STATE_ID,ClientJumpTree.getJumpStateEnumAsShort(tree.getState())));
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERJUMPTREE_ID,FieldIdEnums.TREE_SERVERJUMPTREE_SYNCEDFIELD_CURRENTFRAME_ID,tree.getCurrentFrame()));
|
||||
collection.setValue(new SynchronizedFieldValue(BehaviorTreeIdEnums.BTREE_SERVERJUMPTREE_ID,FieldIdEnums.TREE_SERVERJUMPTREE_SYNCEDFIELD_CURRENTJUMPFORCE_ID,tree.getCurrentJumpForce()));
|
||||
} break;
|
||||
|
||||
}
|
||||
}
|
||||
return collection;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p> Automatically generated </p>
|
||||
* <p>
|
||||
* Applies the state collection to the given entity
|
||||
* </p>
|
||||
* @param entity The entity
|
||||
* @param collection The state collection
|
||||
*/
|
||||
public static void applyStateCollection(Entity entity, StateCollection collection){
|
||||
for(SynchronizedFieldValue syncedValue : collection.getValues()){
|
||||
switch(syncedValue.getBehaviorTreeId()){
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERATTACKTREE_ID: {
|
||||
ClientAttackTree tree = ClientAttackTree.getClientAttackTree(entity);
|
||||
switch(syncedValue.getFieldId()){
|
||||
case(FieldIdEnums.TREE_SERVERATTACKTREE_SYNCEDFIELD_STATE_ID): {
|
||||
tree.setState(ClientAttackTree.getAttackTreeStateShortAsEnum(((Double)syncedValue.getValue()).shortValue()));
|
||||
} break;
|
||||
case(FieldIdEnums.TREE_SERVERATTACKTREE_SYNCEDFIELD_DRIFTSTATE_ID): {
|
||||
tree.setDriftState(ClientAttackTree.getAttackTreeDriftStateShortAsEnum(((Double)syncedValue.getValue()).shortValue()));
|
||||
} break;
|
||||
case(FieldIdEnums.TREE_SERVERATTACKTREE_SYNCEDFIELD_CURRENTMOVEID_ID): {
|
||||
tree.setCurrentMoveId((String)syncedValue.getValue());
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERBLOCKTREE_ID: {
|
||||
ClientBlockTree tree = ClientBlockTree.getClientBlockTree(entity);
|
||||
switch(syncedValue.getFieldId()){
|
||||
case(FieldIdEnums.TREE_SERVERBLOCKTREE_SYNCEDFIELD_STATE_ID): {
|
||||
tree.setState(ClientBlockTree.getBlockStateShortAsEnum(((Double)syncedValue.getValue()).shortValue()));
|
||||
} break;
|
||||
case(FieldIdEnums.TREE_SERVERBLOCKTREE_SYNCEDFIELD_CURRENTBLOCKVARIANT_ID): {
|
||||
tree.setCurrentBlockVariant((String)syncedValue.getValue());
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVEREQUIPSTATE_ID: {
|
||||
ClientEquipState tree = ClientEquipState.getClientEquipState(entity);
|
||||
switch(syncedValue.getFieldId()){
|
||||
}
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERGRAVITY_ID: {
|
||||
ClientGravityTree tree = ClientGravityTree.getClientGravityTree(entity);
|
||||
switch(syncedValue.getFieldId()){
|
||||
case(FieldIdEnums.TREE_SERVERGRAVITY_SYNCEDFIELD_STATE_ID): {
|
||||
tree.setState(ClientGravityTree.getGravityTreeStateShortAsEnum(((Double)syncedValue.getValue()).shortValue()));
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERIDLE_ID: {
|
||||
ClientIdleTree tree = ClientIdleTree.getClientIdleTree(entity);
|
||||
switch(syncedValue.getFieldId()){
|
||||
case(FieldIdEnums.TREE_SERVERIDLE_SYNCEDFIELD_STATE_ID): {
|
||||
tree.setState(ClientIdleTree.getIdleTreeStateShortAsEnum(((Double)syncedValue.getValue()).shortValue()));
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERLIFETREE_ID: {
|
||||
ClientLifeTree tree = ClientLifeTree.getClientLifeTree(entity);
|
||||
switch(syncedValue.getFieldId()){
|
||||
case(FieldIdEnums.TREE_SERVERLIFETREE_SYNCEDFIELD_STATE_ID): {
|
||||
tree.setState(ClientLifeTree.getLifeStateEnumShortAsEnum(((Double)syncedValue.getValue()).shortValue()));
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERGROUNDMOVEMENTTREE_ID: {
|
||||
ClientGroundMovementTree tree = ClientGroundMovementTree.getClientGroundMovementTree(entity);
|
||||
switch(syncedValue.getFieldId()){
|
||||
case(FieldIdEnums.TREE_SERVERGROUNDMOVEMENTTREE_SYNCEDFIELD_FACING_ID): {
|
||||
tree.setFacing(ClientGroundMovementTree.getMovementRelativeFacingShortAsEnum(((Double)syncedValue.getValue()).shortValue()));
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case BehaviorTreeIdEnums.BTREE_SERVERJUMPTREE_ID: {
|
||||
ClientJumpTree tree = ClientJumpTree.getClientJumpTree(entity);
|
||||
switch(syncedValue.getFieldId()){
|
||||
case(FieldIdEnums.TREE_SERVERJUMPTREE_SYNCEDFIELD_STATE_ID): {
|
||||
tree.setState(ClientJumpTree.getJumpStateShortAsEnum(((Double)syncedValue.getValue()).shortValue()));
|
||||
} break;
|
||||
case(FieldIdEnums.TREE_SERVERJUMPTREE_SYNCEDFIELD_CURRENTFRAME_ID): {
|
||||
tree.setCurrentFrame(((Double)syncedValue.getValue()).intValue());
|
||||
} break;
|
||||
case(FieldIdEnums.TREE_SERVERJUMPTREE_SYNCEDFIELD_CURRENTJUMPFORCE_ID): {
|
||||
tree.setCurrentJumpForce(((Double)syncedValue.getValue()).floatValue());
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* The value of a single synchronized field
|
||||
*/
|
||||
public static class SynchronizedFieldValue {
|
||||
|
||||
/**
|
||||
* The behavior tree this field is on
|
||||
*/
|
||||
int behaviorTreeId;
|
||||
|
||||
/**
|
||||
* The id of the field
|
||||
*/
|
||||
int fieldId;
|
||||
|
||||
/**
|
||||
* The value of the field
|
||||
*/
|
||||
Object value;
|
||||
|
||||
/**
|
||||
* Creates a synchronized value
|
||||
* @param behaviorTreeId The behavior tree id of the field
|
||||
* @param fieldId The field id of the field
|
||||
* @param value The value of the field currently
|
||||
*/
|
||||
public SynchronizedFieldValue(int behaviorTreeId, int fieldId, Object value){
|
||||
this.behaviorTreeId = behaviorTreeId;
|
||||
this.fieldId = fieldId;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the behavior tree this field is in
|
||||
* @return the id of the behavior tree
|
||||
*/
|
||||
public int getBehaviorTreeId(){
|
||||
return behaviorTreeId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the id of the field
|
||||
* @return The id
|
||||
*/
|
||||
public int getFieldId(){
|
||||
return fieldId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current value for this field
|
||||
* @return The current value
|
||||
*/
|
||||
public Object getValue(){
|
||||
return value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user