diff --git a/buildNumber.properties b/buildNumber.properties index 1396e376..d25d0aed 100644 --- a/buildNumber.properties +++ b/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Fri Aug 16 10:14:05 EDT 2024 -buildNumber=249 +#Fri Aug 16 15:43:29 EDT 2024 +buildNumber=252 diff --git a/docs/src/progress/currenttarget.md b/docs/src/progress/currenttarget.md index 73a5f59c..6ee71df6 100644 --- a/docs/src/progress/currenttarget.md +++ b/docs/src/progress/currenttarget.md @@ -21,8 +21,7 @@ + bug fixes Fix physics freakout for vertically aligned entities Fix entities running to edge of map causing audio engine to break - Fix placing terrain - Fix spawning item from non-local client + Fix attack animation mayyybe caching on non-local clients ?? Fix sword double-swing Fix broken rendering pipeline when creating new level @@ -31,4 +30,5 @@ Fix being unable to jump sometimes (usually when pick up sword) Fix server ground movement tree playing animation over falling animation Fix F2 menu not regaining controls when Xing menu instead of hitting F2 to close + Fix rotation not sending correctly on initialization of creatures on client Fix grass rendering distance diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 0b10cebf..dba7d7d5 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -591,6 +591,7 @@ Fix build tooling, scripts, etc Launcher fixes Fix inventory control state suggestions not working correctly Fix unequipping item hard crashing engine +Fix terrain editing hard crashing engine # TODO diff --git a/src/main/java/electrosphere/collision/CollisionEngine.java b/src/main/java/electrosphere/collision/CollisionEngine.java index 9802f084..bfb5ea8f 100644 --- a/src/main/java/electrosphere/collision/CollisionEngine.java +++ b/src/main/java/electrosphere/collision/CollisionEngine.java @@ -458,7 +458,7 @@ public class CollisionEngine { for(Collidable collidable : collidableList){ if(collidable.getParentTracksCollidable()){ Entity physicsEntity = collidable.getParent(); - DBody rigidBody = (DBody)physicsEntity.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); + DBody rigidBody = PhysicsEntityUtils.getDBody(physicsEntity); Matrix4d inverseTransform = new Matrix4d(); Vector4d rawPos = inverseTransform.transform(new Vector4d(PhysicsUtils.getRigidBodyPosition(rigidBody),1)); Vector3d newPosition = new Vector3d(rawPos.x,rawPos.y,rawPos.z); diff --git a/src/main/java/electrosphere/collision/PhysicsEntityUtils.java b/src/main/java/electrosphere/collision/PhysicsEntityUtils.java index acafdebb..a5c635a6 100644 --- a/src/main/java/electrosphere/collision/PhysicsEntityUtils.java +++ b/src/main/java/electrosphere/collision/PhysicsEntityUtils.java @@ -49,7 +49,7 @@ public class PhysicsEntityUtils { rigidBody, new Vector3d(physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ()) ); - collidable = new Collidable(rVal, Collidable.TYPE_CREATURE); + collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); ClientCollidableTree tree = new ClientCollidableTree(rVal,collidable,rigidBody); rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotate( @@ -72,7 +72,7 @@ public class PhysicsEntityUtils { new Vector3d(physicsTemplate.getDimension1(),physicsTemplate.getDimension2(),physicsTemplate.getDimension3()), Collidable.TYPE_CREATURE_BIT ); - collidable = new Collidable(rVal, Collidable.TYPE_CREATURE); + collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); ClientCollidableTree tree = new ClientCollidableTree(rVal,collidable,rigidBody); rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotateScale( @@ -121,7 +121,7 @@ public class PhysicsEntityUtils { rigidBody, new Vector3d(physicsTemplate.getOffsetX(), physicsTemplate.getOffsetY(), physicsTemplate.getOffsetZ()) ); - collidable = new Collidable(rVal, Collidable.TYPE_CREATURE); + collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); ServerCollidableTree tree = new ServerCollidableTree(rVal,collidable,rigidBody); rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotateScale( @@ -141,7 +141,7 @@ public class PhysicsEntityUtils { } break; case "CUBE": { rigidBody = CollisionBodyCreation.createCubeBody(realm.getCollisionEngine(),new Vector3d(physicsTemplate.getDimension1(),physicsTemplate.getDimension2(),physicsTemplate.getDimension3()),Collidable.TYPE_CREATURE_BIT); - collidable = new Collidable(rVal, Collidable.TYPE_CREATURE); + collidable = new Collidable(rVal, Collidable.TYPE_CREATURE, true); ServerCollidableTree tree = new ServerCollidableTree(rVal,collidable,rigidBody); rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotateScale( @@ -239,7 +239,7 @@ public class PhysicsEntityUtils { DTriMesh triMesh = collisionEngine.createTrimeshGeom(vertices,indices,Collidable.TYPE_STATIC_BIT); DBody body = collisionEngine.createDBody(triMesh); - Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(body, new Collidable(terrain,Collidable.TYPE_TERRAIN)); + Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(body, new Collidable(terrain,Collidable.TYPE_TERRAIN, false)); terrain.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, body); return body; @@ -259,7 +259,7 @@ public class PhysicsEntityUtils { CollisionBodyCreation.setGravityMode(Globals.clientSceneWrapper.getCollisionEngine(), terrainBody, false); - Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(terrainBody, new Collidable(terrain,Collidable.TYPE_TERRAIN)); + Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(terrainBody, new Collidable(terrain,Collidable.TYPE_TERRAIN, false)); terrain.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, terrainBody); return terrainBody; @@ -279,7 +279,7 @@ public class PhysicsEntityUtils { CollisionBodyCreation.setKinematic(terrainRealm.getCollisionEngine(), terrainBody); CollisionBodyCreation.setGravityMode(terrainRealm.getCollisionEngine(), terrainBody, false); - terrainRealm.getCollisionEngine().registerCollisionObject(terrainBody, new Collidable(terrain,Collidable.TYPE_TERRAIN)); + terrainRealm.getCollisionEngine().registerCollisionObject(terrainBody, new Collidable(terrain,Collidable.TYPE_TERRAIN, false)); terrain.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, terrainBody); return terrainBody; diff --git a/src/main/java/electrosphere/collision/collidable/Collidable.java b/src/main/java/electrosphere/collision/collidable/Collidable.java index 95330b3b..82e4a163 100644 --- a/src/main/java/electrosphere/collision/collidable/Collidable.java +++ b/src/main/java/electrosphere/collision/collidable/Collidable.java @@ -48,10 +48,16 @@ public class Collidable { public static final long TYPE_FOLIAGE_BIT = 0x80; - - public Collidable(Entity parent, String type){ + /** + * Constructor + * @param parent The parent entity + * @param type The type of collidable + * @param parentTracksCollidable true if the parent should have the same position as the collidable, false otherwise + */ + public Collidable(Entity parent, String type, boolean parentTracksCollidable){ this.parent = parent; this.type = type; + this.parentTracksCollidable = parentTracksCollidable; } public List getImpulses() { diff --git a/src/main/java/electrosphere/controls/CameraHandler.java b/src/main/java/electrosphere/controls/CameraHandler.java index e7575e24..d60daccc 100644 --- a/src/main/java/electrosphere/controls/CameraHandler.java +++ b/src/main/java/electrosphere/controls/CameraHandler.java @@ -140,7 +140,7 @@ public class CameraHandler { if(Globals.controlHandler.cameraIsThirdPerson()){ perspectiveVal = CameraHandler.CAMERA_PERSPECTIVE_THIRD; } - if(Globals.cameraHandler.getTrackPlayerEntity()){ + if(Globals.cameraHandler.getTrackPlayerEntity() && Globals.playerEntity != null){ Globals.clientConnection.queueOutgoingMessage( EntityMessage.constructupdateEntityViewDirMessage( Globals.clientSceneWrapper.mapClientToServerId(Globals.playerEntity.getId()), diff --git a/src/main/java/electrosphere/entity/state/attack/ClientAttackTree.java b/src/main/java/electrosphere/entity/state/attack/ClientAttackTree.java index 68c24670..030058ab 100644 --- a/src/main/java/electrosphere/entity/state/attack/ClientAttackTree.java +++ b/src/main/java/electrosphere/entity/state/attack/ClientAttackTree.java @@ -206,7 +206,9 @@ public class ClientAttackTree implements BehaviorTree { return state.getAudioData(); } }, - false + () -> { + this.setState(AttackTreeState.IDLE); + } ), }); } @@ -438,7 +440,7 @@ public class ClientAttackTree implements BehaviorTree { //checks if we have a next move and if we're in the specified range of frames when we're allowed to chain into it if( currentMove == null || - currentMove.getNextMoveId() == null || + currentMove.getNextMoveId() == null || currentMove.getNextMoveId().equals("") || frameCurrent < currentMove.getMoveChainWindowStart() || frameCurrent > currentMove.getMoveChainWindowEnd() diff --git a/src/main/java/electrosphere/entity/state/attack/ServerAttackTree.java b/src/main/java/electrosphere/entity/state/attack/ServerAttackTree.java index 0bb2bd51..7b0fa9fe 100644 --- a/src/main/java/electrosphere/entity/state/attack/ServerAttackTree.java +++ b/src/main/java/electrosphere/entity/state/attack/ServerAttackTree.java @@ -155,8 +155,8 @@ public class ServerAttackTree implements BehaviorTree { }, null, () -> { - this.setState(AttackTreeState.COOLDOWN); this.stateTransitionUtil.interrupt(AttackTreeState.ATTACK); + this.setState(AttackTreeState.COOLDOWN); } ), StateTransitionUtilItem.create( @@ -170,7 +170,10 @@ public class ServerAttackTree implements BehaviorTree { } }, null, - null + () -> { + this.setState(AttackTreeState.IDLE); + this.stateTransitionUtil.interrupt(AttackTreeState.COOLDOWN); + } ), }); } diff --git a/src/main/java/electrosphere/entity/state/hitbox/HitboxCollectionState.java b/src/main/java/electrosphere/entity/state/hitbox/HitboxCollectionState.java index d48630ce..93016ce2 100644 --- a/src/main/java/electrosphere/entity/state/hitbox/HitboxCollectionState.java +++ b/src/main/java/electrosphere/entity/state/hitbox/HitboxCollectionState.java @@ -173,7 +173,7 @@ public class HitboxCollectionState { rVal.body = CollisionBodyCreation.createBodyWithShapes(manager.getCollisionEngine(), geomArray); //register collidable with collision engine - Collidable collidable = new Collidable(entity, Collidable.TYPE_OBJECT); + Collidable collidable = new Collidable(entity, Collidable.TYPE_OBJECT, true); manager.getCollisionEngine().registerCollisionObject(rVal.body, collidable); //attach diff --git a/src/main/java/electrosphere/entity/state/physicssync/upright/ClientAlwaysUprightTree.java b/src/main/java/electrosphere/entity/state/physicssync/upright/ClientAlwaysUprightTree.java index c063a2ff..b07fab86 100644 --- a/src/main/java/electrosphere/entity/state/physicssync/upright/ClientAlwaysUprightTree.java +++ b/src/main/java/electrosphere/entity/state/physicssync/upright/ClientAlwaysUprightTree.java @@ -39,6 +39,7 @@ public class ClientAlwaysUprightTree implements BehaviorTree { Vector3d angularForce = new Vector3d(); //make sure rotation is vertical + body.setMaxAngularSpeed(0); // sourceRotation = sourceRotation.mul(0.001, 1, 0.001, 1).normalize(); EntityUtils.getPosition(parent).set(position); diff --git a/src/main/java/electrosphere/entity/state/physicssync/upright/ServerAlwaysUprightTree.java b/src/main/java/electrosphere/entity/state/physicssync/upright/ServerAlwaysUprightTree.java index 238b4df8..1db64112 100644 --- a/src/main/java/electrosphere/entity/state/physicssync/upright/ServerAlwaysUprightTree.java +++ b/src/main/java/electrosphere/entity/state/physicssync/upright/ServerAlwaysUprightTree.java @@ -42,7 +42,8 @@ public class ServerAlwaysUprightTree implements BehaviorTree { Vector3d angularForce = new Vector3d(); //make sure rotation is vertical - // sourceRotation = sourceRotation.mul(0.001, 1, 0.001, 1).normalize(); + body.setMaxAngularSpeed(0); + // sourceRotation = sourceRotation.mul(0.001, 0.001, 0.001, 1).normalize(); EntityUtils.getPosition(parent).set(position); EntityUtils.getRotation(parent).set(sourceRotation); diff --git a/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java b/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java index 838e3c4c..eb4f3588 100644 --- a/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java +++ b/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java @@ -29,7 +29,7 @@ public class CollisionObjUtils { DBody planeObject = CollisionBodyCreation.createPlaneBody(Globals.clientSceneWrapper.getCollisionEngine(),new Vector3d(scale),Collidable.TYPE_STATIC_BIT); PhysicsUtils.setRigidBodyTransform(Globals.clientSceneWrapper.getCollisionEngine(), position, rotation, planeObject); - Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE); + Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE, true); Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(planeObject, collidable); rVal.putData(EntityDataStrings.COLLISION_ENTITY_TYPE_PLANE, true); @@ -51,7 +51,7 @@ public class CollisionObjUtils { DBody planeObject = CollisionBodyCreation.createPlaneBody(realm.getCollisionEngine(),new Vector3d(scale),Collidable.TYPE_STATIC_BIT); PhysicsUtils.setRigidBodyTransform(realm.getCollisionEngine(), position, rotation, planeObject); - Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE); + Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE, true); realm.getCollisionEngine().registerCollisionObject(planeObject, collidable); rVal.putData(EntityDataStrings.COLLISION_ENTITY_TYPE_PLANE, true); @@ -74,7 +74,7 @@ public class CollisionObjUtils { DBody cubeObject = CollisionBodyCreation.createCubeBody(Globals.clientSceneWrapper.getCollisionEngine(),new Vector3d(scale),Collidable.TYPE_STATIC_BIT); PhysicsUtils.setRigidBodyTransform(Globals.clientSceneWrapper.getCollisionEngine(), position, rotation, cubeObject); - Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE); + Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE, true); Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(cubeObject, collidable); rVal.putData(EntityDataStrings.COLLISION_ENTITY_TYPE_CUBE, true); @@ -96,7 +96,7 @@ public class CollisionObjUtils { DBody cubeObject = CollisionBodyCreation.createCubeBody(realm.getCollisionEngine(),new Vector3d(scale),Collidable.TYPE_STATIC_BIT); PhysicsUtils.setRigidBodyTransform(realm.getCollisionEngine(), position, rotation, cubeObject); - Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE); + Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE, true); realm.getCollisionEngine().registerCollisionObject(cubeObject, collidable); rVal.putData(EntityDataStrings.COLLISION_ENTITY_TYPE_CUBE, true); @@ -117,7 +117,7 @@ public class CollisionObjUtils { float mass = 1.0f; DBody cubeObject = CollisionBodyCreation.createCylinderBody(Globals.clientSceneWrapper.getCollisionEngine(),scale.x,scale.y,Collidable.TYPE_STATIC_BIT); PhysicsUtils.setRigidBodyTransform(Globals.clientSceneWrapper.getCollisionEngine(), position, rotation, cubeObject); - Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE); + Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE, true); Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(cubeObject, collidable); rVal.putData(EntityDataStrings.COLLISION_ENTITY_TYPE_CYLINDER, true); @@ -138,7 +138,7 @@ public class CollisionObjUtils { float mass = 1.0f; DBody cubeObject = CollisionBodyCreation.createCylinderBody(realm.getCollisionEngine(),scale.x,scale.y,Collidable.TYPE_STATIC_BIT); PhysicsUtils.setRigidBodyTransform(realm.getCollisionEngine(), position, rotation, cubeObject); - Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE); + Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE, true); realm.getCollisionEngine().registerCollisionObject(cubeObject, collidable); rVal.putData(EntityDataStrings.COLLISION_ENTITY_TYPE_CYLINDER, true); @@ -233,7 +233,7 @@ public class CollisionObjUtils { public static void clientAttachCollisionObjectToEntity(Entity entity, DBody collisionObject, float mass, String collidableType){ Vector3d position = EntityUtils.getPosition(entity); Vector3f scale = EntityUtils.getScale(entity); - Collidable collidable = new Collidable(entity, collidableType); + Collidable collidable = new Collidable(entity, collidableType, true); Globals.clientSceneWrapper.getCollisionEngine().registerCollisionObject(collisionObject, collidable); entity.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, collisionObject); @@ -256,7 +256,7 @@ public class CollisionObjUtils { public static void serverAttachCollisionObjectToEntity(Entity entity, DBody collisionObject, float mass, String collidableType){ Vector3d position = EntityUtils.getPosition(entity); Vector3f scale = EntityUtils.getScale(entity); - Collidable collidable = new Collidable(entity, collidableType); + Collidable collidable = new Collidable(entity, collidableType, true); Realm realm = Globals.realmManager.getEntityRealm(entity); realm.getCollisionEngine().registerCollisionObject(collisionObject, collidable); diff --git a/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java b/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java index 0f0a8b9d..1fb3899c 100644 --- a/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java +++ b/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java @@ -118,7 +118,7 @@ public class ProceduralTree { ); CollisionBodyCreation.setOffsetPosition(Globals.clientSceneWrapper.getCollisionEngine(), rigidBody, new Vector3d(0,treeModel.getPhysicsBody().getOffsetY(),0)); CollisionBodyCreation.setKinematic(Globals.clientSceneWrapper.getCollisionEngine(), rigidBody); - Collidable collidable = new Collidable(trunkChild, Collidable.TYPE_OBJECT); + Collidable collidable = new Collidable(trunkChild, Collidable.TYPE_FOLIAGE_STATIC, true); trunkChild.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotateScale( 0,treeModel.getPhysicsBody().getOffsetY(),0, //translate @@ -384,7 +384,7 @@ public class ProceduralTree { ); CollisionBodyCreation.setOffsetPosition(realm.getCollisionEngine(), rigidBody, new Vector3d(0,treeModel.getPhysicsBody().getOffsetY(),0)); CollisionBodyCreation.setKinematic(realm.getCollisionEngine(), rigidBody); - Collidable collidable = new Collidable(trunkChild, Collidable.TYPE_FOLIAGE_STATIC); + Collidable collidable = new Collidable(trunkChild, Collidable.TYPE_FOLIAGE_STATIC, true); trunkChild.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); Matrix4d offsetTransform = new Matrix4d().translationRotateScale( 0,treeModel.getPhysicsBody().getOffsetY(),0, //translate diff --git a/src/main/java/electrosphere/menu/ingame/MenuGeneratorsInGame.java b/src/main/java/electrosphere/menu/ingame/MenuGeneratorsInGame.java index 271b4898..7e29a5cc 100644 --- a/src/main/java/electrosphere/menu/ingame/MenuGeneratorsInGame.java +++ b/src/main/java/electrosphere/menu/ingame/MenuGeneratorsInGame.java @@ -122,9 +122,11 @@ public class MenuGeneratorsInGame { }}); // } - div.addChild(Button.createButton("Open Level Editor Tools", () -> { - WindowUtils.replaceWindow(WindowStrings.LEVEL_EDTIOR_SIDE_PANEL,MenuGeneratorsLevelEditor.createLevelEditorSidePanel()); - })); + if(MenuGeneratorsInGame.shouldShowLevelEditor()){ + div.addChild(Button.createButton("Open Level Editor Tools", () -> { + WindowUtils.replaceWindow(WindowStrings.LEVEL_EDTIOR_SIDE_PANEL,MenuGeneratorsLevelEditor.createLevelEditorSidePanel()); + })); + } rVal.applyYoga(0,0); @@ -401,4 +403,12 @@ public class MenuGeneratorsInGame { return rVal; } + /** + * Checks if should show the level editor button + * @return True if should show button, false otherwise + */ + private static boolean shouldShowLevelEditor(){ + return Globals.server != null; + } + }