bugfixes
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
This commit is contained in:
parent
bf35da4529
commit
3511d8f81d
@ -1437,6 +1437,9 @@ GriddedDataCellTrackingData created
|
|||||||
Reduce allocations in GriddedDataCellManager methods that loop cells
|
Reduce allocations in GriddedDataCellManager methods that loop cells
|
||||||
Implement max distance for queueing for simulation
|
Implement max distance for queueing for simulation
|
||||||
Client hitbox body destruction based on distance from player (for performance)
|
Client hitbox body destruction based on distance from player (for performance)
|
||||||
|
ServerEntityUtils move entity function properly transfers entity tags now
|
||||||
|
Fix ServerAttackTree freezing bug
|
||||||
|
Fix visually attaching item on server creating item at 0,0,0 on init (thereby creating a new datacell if its not nearby)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -97,9 +97,9 @@ public class StateTransitionUtil {
|
|||||||
LoggerInterface.loggerEngine.DEBUG("Skipping state " + stateEnum + " because there is not a state registered to that enum value!");
|
LoggerInterface.loggerEngine.DEBUG("Skipping state " + stateEnum + " because there is not a state registered to that enum value!");
|
||||||
} else {
|
} else {
|
||||||
if(this.isServer){
|
if(this.isServer){
|
||||||
simulateServerState(this.parent,state);
|
this.simulateServerState(this.parent,state);
|
||||||
} else {
|
} else {
|
||||||
simulateClientState(this.parent,state);
|
this.simulateClientState(this.parent,state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,6 +32,11 @@ public class Scene {
|
|||||||
*/
|
*/
|
||||||
Map<String,Set<Entity>> tagEntityMap;
|
Map<String,Set<Entity>> tagEntityMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The map of entity -> tags that entity is registered to
|
||||||
|
*/
|
||||||
|
Map<Entity,List<String>> entityTagMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The list of behavior trees
|
* The list of behavior trees
|
||||||
*/
|
*/
|
||||||
@ -50,6 +55,7 @@ public class Scene {
|
|||||||
entityIdMap = new HashMap<Integer,Entity>();
|
entityIdMap = new HashMap<Integer,Entity>();
|
||||||
tagEntityMap = new HashMap<String,Set<Entity>>();
|
tagEntityMap = new HashMap<String,Set<Entity>>();
|
||||||
behaviorTreeList = new LinkedList<BehaviorTree>();
|
behaviorTreeList = new LinkedList<BehaviorTree>();
|
||||||
|
entityTagMap = new HashMap<Entity,List<String>>();
|
||||||
tagEntityMap.put(EntityTags.BONE_ATTACHED, new HashSet<Entity>());
|
tagEntityMap.put(EntityTags.BONE_ATTACHED, new HashSet<Entity>());
|
||||||
tagEntityMap.put(EntityTags.COLLIDABLE, new HashSet<Entity>());
|
tagEntityMap.put(EntityTags.COLLIDABLE, new HashSet<Entity>());
|
||||||
tagEntityMap.put(EntityTags.SPRINTABLE, new HashSet<Entity>());
|
tagEntityMap.put(EntityTags.SPRINTABLE, new HashSet<Entity>());
|
||||||
@ -95,6 +101,16 @@ public class Scene {
|
|||||||
newEntityList.add(e);
|
newEntityList.add(e);
|
||||||
tagEntityMap.put(tag,newEntityList);
|
tagEntityMap.put(tag,newEntityList);
|
||||||
}
|
}
|
||||||
|
if(this.entityTagMap.containsKey(e)){
|
||||||
|
List<String> tagList = this.entityTagMap.get(e);
|
||||||
|
if(!tagList.contains(tag)){
|
||||||
|
tagList.add(tag);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
List<String> tagList = new LinkedList<String>();
|
||||||
|
tagList.add(tag);
|
||||||
|
this.entityTagMap.put(e, tagList);
|
||||||
|
}
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,6 +137,10 @@ public class Scene {
|
|||||||
public void removeEntityFromTag(Entity e, String tag){
|
public void removeEntityFromTag(Entity e, String tag){
|
||||||
lock.lock();
|
lock.lock();
|
||||||
tagEntityMap.get(tag).remove(e);
|
tagEntityMap.get(tag).remove(e);
|
||||||
|
if(this.entityTagMap.containsKey(e)){
|
||||||
|
List<String> tagList = this.entityTagMap.get(e);
|
||||||
|
tagList.remove(tag);
|
||||||
|
}
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,9 +153,30 @@ public class Scene {
|
|||||||
for(String key : tagEntityMap.keySet()){
|
for(String key : tagEntityMap.keySet()){
|
||||||
tagEntityMap.get(key).remove(e);
|
tagEntityMap.get(key).remove(e);
|
||||||
}
|
}
|
||||||
|
this.entityTagMap.remove(e);
|
||||||
entityIdMap.remove(e.getId());
|
entityIdMap.remove(e.getId());
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts all tags this entity is registered to
|
||||||
|
* @param e The entity
|
||||||
|
* @return The list of tags this entity is registered to
|
||||||
|
*/
|
||||||
|
public List<String> extractTags(Entity e){
|
||||||
|
return this.entityTagMap.get(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers an entity to a collection of tags
|
||||||
|
* @param e The entity
|
||||||
|
* @param tags The list of tags
|
||||||
|
*/
|
||||||
|
public void registerEntityToTags(Entity e, List<String> tags){
|
||||||
|
for(String tag : tags){
|
||||||
|
this.registerEntityToTag(e, tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively deregisters an entity and all entities attached via AttachUtils
|
* Recursively deregisters an entity and all entities attached via AttachUtils
|
||||||
|
|||||||
@ -129,9 +129,9 @@ public class ServerAttackTree implements BehaviorTree {
|
|||||||
},
|
},
|
||||||
() -> {
|
() -> {
|
||||||
if(currentMoveCanHold && stillHold){
|
if(currentMoveCanHold && stillHold){
|
||||||
setState(AttackTreeState.HOLD);
|
this.setState(AttackTreeState.HOLD);
|
||||||
} else {
|
} else {
|
||||||
setState(AttackTreeState.ATTACK);
|
this.setState(AttackTreeState.ATTACK);
|
||||||
}
|
}
|
||||||
this.stateTransitionUtil.interrupt(AttackTreeState.WINDUP);
|
this.stateTransitionUtil.interrupt(AttackTreeState.WINDUP);
|
||||||
}
|
}
|
||||||
@ -227,7 +227,7 @@ public class ServerAttackTree implements BehaviorTree {
|
|||||||
currentWeapon = null;
|
currentWeapon = null;
|
||||||
attackingPoint = null;
|
attackingPoint = null;
|
||||||
//figure out attack type we should be doing
|
//figure out attack type we should be doing
|
||||||
String attackType = getAttackType();
|
String attackType = this.getAttackType();
|
||||||
//if we can attack, setup doing so
|
//if we can attack, setup doing so
|
||||||
if(this.canAttack(attackType)){
|
if(this.canAttack(attackType)){
|
||||||
this.setAttackMoveTypeActive(attackType);
|
this.setAttackMoveTypeActive(attackType);
|
||||||
|
|||||||
@ -25,6 +25,7 @@ import electrosphere.engine.Globals;
|
|||||||
import electrosphere.entity.Entity;
|
import electrosphere.entity.Entity;
|
||||||
import electrosphere.entity.EntityDataStrings;
|
import electrosphere.entity.EntityDataStrings;
|
||||||
import electrosphere.entity.EntityTags;
|
import electrosphere.entity.EntityTags;
|
||||||
|
import electrosphere.entity.EntityUtils;
|
||||||
import electrosphere.entity.ServerEntityUtils;
|
import electrosphere.entity.ServerEntityUtils;
|
||||||
import electrosphere.net.synchronization.enums.FieldIdEnums;
|
import electrosphere.net.synchronization.enums.FieldIdEnums;
|
||||||
import electrosphere.server.datacell.Realm;
|
import electrosphere.server.datacell.Realm;
|
||||||
@ -116,6 +117,7 @@ public class ServerToolbarState implements BehaviorTree {
|
|||||||
public void visuallyEquipCurrentSlot(){
|
public void visuallyEquipCurrentSlot(){
|
||||||
RelationalInventoryState toolbarInventory = InventoryUtils.getToolbarInventory(parent);
|
RelationalInventoryState toolbarInventory = InventoryUtils.getToolbarInventory(parent);
|
||||||
RelationalInventoryState equipInventoryState = InventoryUtils.getEquipInventory(parent);
|
RelationalInventoryState equipInventoryState = InventoryUtils.getEquipInventory(parent);
|
||||||
|
Vector3d parentPos = EntityUtils.getPosition(parent);
|
||||||
Entity inInventoryEntity = toolbarInventory.getItemSlot(selectedSlot + "");
|
Entity inInventoryEntity = toolbarInventory.getItemSlot(selectedSlot + "");
|
||||||
if(inInventoryEntity != null){
|
if(inInventoryEntity != null){
|
||||||
boolean targetHasWhitelist = ItemUtils.hasEquipList(inInventoryEntity);
|
boolean targetHasWhitelist = ItemUtils.hasEquipList(inInventoryEntity);
|
||||||
@ -123,7 +125,7 @@ public class ServerToolbarState implements BehaviorTree {
|
|||||||
//hydrate inventory item
|
//hydrate inventory item
|
||||||
String itemType = ItemUtils.getType(inInventoryEntity);
|
String itemType = ItemUtils.getType(inInventoryEntity);
|
||||||
Realm realm = Globals.realmManager.getEntityRealm(parent);
|
Realm realm = Globals.realmManager.getEntityRealm(parent);
|
||||||
realWorldItem = ItemUtils.serverSpawnBasicItem(realm,new Vector3d(0,0,0),itemType);
|
realWorldItem = ItemUtils.serverSpawnBasicItem(realm,new Vector3d(parentPos),itemType);
|
||||||
//bind in world with in inventory
|
//bind in world with in inventory
|
||||||
ItemUtils.setRealWorldEntity(inInventoryEntity, realWorldItem);
|
ItemUtils.setRealWorldEntity(inInventoryEntity, realWorldItem);
|
||||||
|
|
||||||
|
|||||||
@ -274,7 +274,7 @@ public class ItemUtils {
|
|||||||
String idleAnim = (String)item.getData(EntityDataStrings.ANIM_IDLE);
|
String idleAnim = (String)item.getData(EntityDataStrings.ANIM_IDLE);
|
||||||
if(!actor.isPlayingAnimation(idleAnim)){
|
if(!actor.isPlayingAnimation(idleAnim)){
|
||||||
actor.playAnimation(idleAnim,AnimationPriorities.getValue(AnimationPriorities.INTERACTION));
|
actor.playAnimation(idleAnim,AnimationPriorities.getValue(AnimationPriorities.INTERACTION));
|
||||||
actor.incrementAnimationTime(0.0001);
|
actor.incrementAnimationTime(Globals.timekeeper.getSimFrameTime());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
package electrosphere.renderer.pipelines.debug;
|
package electrosphere.renderer.pipelines.debug;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.joml.Matrix4d;
|
import org.joml.Matrix4d;
|
||||||
import org.joml.Quaterniond;
|
import org.joml.Quaterniond;
|
||||||
import org.joml.Quaternionf;
|
import org.joml.Quaternionf;
|
||||||
@ -128,7 +131,8 @@ public class DebugContentPipeline implements RenderPipeline {
|
|||||||
int serverIdForClientEntity = Globals.clientSceneWrapper.mapClientToServerId(Globals.playerEntity.getId());
|
int serverIdForClientEntity = Globals.clientSceneWrapper.mapClientToServerId(Globals.playerEntity.getId());
|
||||||
Entity serverPlayerEntity = EntityLookupUtils.getEntityById(serverIdForClientEntity);
|
Entity serverPlayerEntity = EntityLookupUtils.getEntityById(serverIdForClientEntity);
|
||||||
Realm playerRealm = Globals.realmManager.getEntityRealm(serverPlayerEntity);
|
Realm playerRealm = Globals.realmManager.getEntityRealm(serverPlayerEntity);
|
||||||
for(HitboxCollectionState hitboxState : playerRealm.getHitboxManager().getAllHitboxes()){
|
List<HitboxCollectionState> hitboxStates = new LinkedList<HitboxCollectionState>(playerRealm.getHitboxManager().getAllHitboxes());
|
||||||
|
for(HitboxCollectionState hitboxState : hitboxStates){
|
||||||
for(DGeom geom : hitboxState.getGeometries()){
|
for(DGeom geom : hitboxState.getGeometries()){
|
||||||
if(geom instanceof DSphere){
|
if(geom instanceof DSphere){
|
||||||
DSphere sphereView = (DSphere)geom;
|
DSphere sphereView = (DSphere)geom;
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import electrosphere.net.server.player.Player;
|
|||||||
import electrosphere.server.pathfinding.navmesh.NavMesh;
|
import electrosphere.server.pathfinding.navmesh.NavMesh;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -202,11 +203,14 @@ public class ServerDataCell {
|
|||||||
if(newCell == null){
|
if(newCell == null){
|
||||||
throw new Error("Passed null newCell! " + newCell);
|
throw new Error("Passed null newCell! " + newCell);
|
||||||
}
|
}
|
||||||
//swap which holds the entity
|
if(oldCell == null){
|
||||||
if(oldCell != null){
|
throw new Error("Passed null oldCell! " + oldCell);
|
||||||
oldCell.getScene().deregisterEntity(entity);
|
|
||||||
}
|
}
|
||||||
|
//swap which holds the entity
|
||||||
|
List<String> tags = oldCell.getScene().extractTags(entity);
|
||||||
|
oldCell.getScene().deregisterEntity(entity);
|
||||||
newCell.getScene().registerEntity(entity);
|
newCell.getScene().registerEntity(entity);
|
||||||
|
newCell.getScene().registerEntityToTags(entity, tags);
|
||||||
//update entity data cell mapper
|
//update entity data cell mapper
|
||||||
Globals.entityDataCellMapper.updateEntityCell(entity, newCell);
|
Globals.entityDataCellMapper.updateEntityCell(entity, newCell);
|
||||||
//send the entity to new players that should care about it
|
//send the entity to new players that should care about it
|
||||||
@ -224,15 +228,13 @@ public class ServerDataCell {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//delete the entity for players that dont care about it
|
//delete the entity for players that dont care about it
|
||||||
if(oldCell != null){
|
for(Player player : oldCell.activePlayers){
|
||||||
for(Player player : oldCell.activePlayers){
|
if(
|
||||||
if(
|
!newCell.containsPlayer(player) &&
|
||||||
!newCell.containsPlayer(player) &&
|
(player.getPlayerEntity() == null || player.getPlayerEntity() != entity)
|
||||||
(player.getPlayerEntity() == null || player.getPlayerEntity() != entity)
|
){
|
||||||
){
|
//if the player isn't also in the new cell, delete the entity
|
||||||
//if the player isn't also in the new cell, delete the entity
|
player.addMessage(EntityMessage.constructDestroyMessage(entity.getId()));
|
||||||
player.addMessage(EntityMessage.constructDestroyMessage(entity.getId()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,6 +37,7 @@ import electrosphere.server.datacell.ServerDataCell;
|
|||||||
import electrosphere.server.datacell.interfaces.DataCellManager;
|
import electrosphere.server.datacell.interfaces.DataCellManager;
|
||||||
import electrosphere.server.datacell.interfaces.VoxelCellManager;
|
import electrosphere.server.datacell.interfaces.VoxelCellManager;
|
||||||
import electrosphere.server.datacell.physics.PhysicsDataCell;
|
import electrosphere.server.datacell.physics.PhysicsDataCell;
|
||||||
|
import electrosphere.server.datacell.utils.EntityLookupUtils;
|
||||||
import electrosphere.server.fluid.manager.ServerFluidChunk;
|
import electrosphere.server.fluid.manager.ServerFluidChunk;
|
||||||
import electrosphere.server.fluid.manager.ServerFluidManager;
|
import electrosphere.server.fluid.manager.ServerFluidManager;
|
||||||
import electrosphere.server.terrain.manager.ServerTerrainManager;
|
import electrosphere.server.terrain.manager.ServerTerrainManager;
|
||||||
|
|||||||
@ -348,7 +348,7 @@ public class PoseActor {
|
|||||||
* Applies an animation mask to the PoseModel
|
* Applies an animation mask to the PoseModel
|
||||||
* @param model The posemodel to apply the mask to
|
* @param model The posemodel to apply the mask to
|
||||||
*/
|
*/
|
||||||
void applyAnimationMasks(PoseModel model){
|
private void applyAnimationMasks(PoseModel model){
|
||||||
List<String> bonesUsed = new LinkedList<String>();
|
List<String> bonesUsed = new LinkedList<String>();
|
||||||
List<String> currentAnimationMask = new LinkedList<String>();
|
List<String> currentAnimationMask = new LinkedList<String>();
|
||||||
for(ActorAnimationMask mask : animationQueue){
|
for(ActorAnimationMask mask : animationQueue){
|
||||||
@ -375,7 +375,7 @@ public class PoseActor {
|
|||||||
* Calculates all node transforms for the PoseModel based on bone rotators and the static morph of this PoseActor
|
* Calculates all node transforms for the PoseModel based on bone rotators and the static morph of this PoseActor
|
||||||
* @param model The PoseModel to calculate transforms for
|
* @param model The PoseModel to calculate transforms for
|
||||||
*/
|
*/
|
||||||
void calculateNodeTransforms(PoseModel model){
|
private void calculateNodeTransforms(PoseModel model){
|
||||||
model.updateNodeTransform(boneRotators,staticMorph);
|
model.updateNodeTransform(boneRotators,staticMorph);
|
||||||
for(Bone bone : model.getBones()){
|
for(Bone bone : model.getBones()){
|
||||||
//store position
|
//store position
|
||||||
|
|||||||
@ -182,7 +182,7 @@ public class PoseModel {
|
|||||||
*/
|
*/
|
||||||
public void updateNodeTransform(Map<String,ActorBoneRotator> boneRotators, ActorStaticMorph staticMorph){
|
public void updateNodeTransform(Map<String,ActorBoneRotator> boneRotators, ActorStaticMorph staticMorph){
|
||||||
if(this.rootAnimNode != null){
|
if(this.rootAnimNode != null){
|
||||||
updateNodeTransform(this.rootAnimNode,boneRotators,staticMorph);
|
this.updateNodeTransform(this.rootAnimNode,boneRotators,staticMorph);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,7 +199,7 @@ public class PoseModel {
|
|||||||
* @param boneRotators The bone rotators
|
* @param boneRotators The bone rotators
|
||||||
* @param staticMorph The static morph
|
* @param staticMorph The static morph
|
||||||
*/
|
*/
|
||||||
void updateNodeTransform(AnimNode n, Map<String,ActorBoneRotator> boneRotators, ActorStaticMorph staticMorph){
|
private void updateNodeTransform(AnimNode n, Map<String,ActorBoneRotator> boneRotators, ActorStaticMorph staticMorph){
|
||||||
//grab parent transform if exists
|
//grab parent transform if exists
|
||||||
Matrix4d parentTransform = new Matrix4d();
|
Matrix4d parentTransform = new Matrix4d();
|
||||||
if(n.parent != null){
|
if(n.parent != null){
|
||||||
@ -238,7 +238,7 @@ public class PoseModel {
|
|||||||
Iterator<AnimNode> node_iterator = n.children.iterator();
|
Iterator<AnimNode> node_iterator = n.children.iterator();
|
||||||
while(node_iterator.hasNext()){
|
while(node_iterator.hasNext()){
|
||||||
AnimNode current_node = node_iterator.next();
|
AnimNode current_node = node_iterator.next();
|
||||||
updateNodeTransform(current_node,boneRotators,staticMorph);
|
this.updateNodeTransform(current_node,boneRotators,staticMorph);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -39,7 +39,7 @@ public class MicroSimulation {
|
|||||||
//update actor animations
|
//update actor animations
|
||||||
Set<Entity> poseableEntities = dataCell.getScene().getEntitiesWithTag(EntityTags.POSEABLE);
|
Set<Entity> poseableEntities = dataCell.getScene().getEntitiesWithTag(EntityTags.POSEABLE);
|
||||||
if(poseableEntities != null){
|
if(poseableEntities != null){
|
||||||
for(Entity currentEntity : dataCell.getScene().getEntitiesWithTag(EntityTags.POSEABLE)){
|
for(Entity currentEntity : poseableEntities){
|
||||||
//fetch actor
|
//fetch actor
|
||||||
PoseActor currentPoseActor = EntityUtils.getPoseActor(currentEntity);
|
PoseActor currentPoseActor = EntityUtils.getPoseActor(currentEntity);
|
||||||
//increment animations
|
//increment animations
|
||||||
@ -66,7 +66,6 @@ public class MicroSimulation {
|
|||||||
for(Entity collidable : collidables){
|
for(Entity collidable : collidables){
|
||||||
ServerCollidableTree.getServerCollidableTree(collidable).simulate((float)Globals.timekeeper.getSimFrameTime());
|
ServerCollidableTree.getServerCollidableTree(collidable).simulate((float)Globals.timekeeper.getSimFrameTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
//update actor transform caches
|
//update actor transform caches
|
||||||
poseableEntities = dataCell.getScene().getEntitiesWithTag(EntityTags.POSEABLE);
|
poseableEntities = dataCell.getScene().getEntitiesWithTag(EntityTags.POSEABLE);
|
||||||
if(poseableEntities != null){
|
if(poseableEntities != null){
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user