From ab4b64942d44d62a5b75dcfd033ed8d3469acafb Mon Sep 17 00:00:00 2001 From: austin Date: Thu, 8 Aug 2024 11:46:24 -0400 Subject: [PATCH] jump sfx, walk audio fix --- docs/src/progress/currenttarget.md | 2 -- docs/src/progress/renderertodo.md | 7 +++++ .../groundmove/ClientGroundMovementTree.java | 29 +++++++++++++++++-- .../state/movement/jump/ClientJumpTree.java | 29 ++++++++++++++++++- .../state/movement/jump/ServerJumpTree.java | 4 +-- .../ClientSynchronizationManager.java | 8 +++++ 6 files changed, 72 insertions(+), 7 deletions(-) diff --git a/docs/src/progress/currenttarget.md b/docs/src/progress/currenttarget.md index fd07ac80..ea945273 100644 --- a/docs/src/progress/currenttarget.md +++ b/docs/src/progress/currenttarget.md @@ -19,8 +19,6 @@ Things that feel bad: Sound effect on hit -Sound effect on walk -Sound effect on jump Sound effect on block Allow block hotboxes to block damage Server packet on damage collision diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 37d48061..7e980a5c 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -510,6 +510,13 @@ Audio on block state transitions Strafe/backpedal movement speed multipliers Properly equipping/unequipping 2hand items +(08/08/2024) +Client surface-audio system +Sound effects on footstep +New sound effects for movement +Jump sound effects +Don't play walking audio when entity is jumping + # TODO diff --git a/src/main/java/electrosphere/entity/state/movement/groundmove/ClientGroundMovementTree.java b/src/main/java/electrosphere/entity/state/movement/groundmove/ClientGroundMovementTree.java index 0a9f2e79..d083d6fd 100644 --- a/src/main/java/electrosphere/entity/state/movement/groundmove/ClientGroundMovementTree.java +++ b/src/main/java/electrosphere/entity/state/movement/groundmove/ClientGroundMovementTree.java @@ -24,6 +24,7 @@ import electrosphere.entity.state.client.firstPerson.FirstPersonTree; import electrosphere.entity.state.movement.FallTree; import electrosphere.entity.state.movement.SprintTree; import electrosphere.entity.state.movement.jump.ClientJumpTree; +import electrosphere.entity.state.movement.jump.ClientJumpTree.JumpState; import electrosphere.net.parser.net.message.EntityMessage; import electrosphere.net.synchronization.annotation.SyncedField; import electrosphere.net.synchronization.annotation.SynchronizableEnum; @@ -464,7 +465,12 @@ public class ClientGroundMovementTree implements BehaviorTree { private void playFootstepAudio(int voxelType, double animationTime, Vector3d position){ Float firstOffset = this.groundMovementData.getFootstepFirstAudioOffset(); Float secondOffset = this.groundMovementData.getFootstepSecondAudioOffset(); - if(!this.playedFootstepFirst && firstOffset != null && animationTime > firstOffset){ + if( + this.shouldPlayFootsteps() && + !this.playedFootstepFirst && + firstOffset != null && + animationTime > firstOffset + ){ this.playedFootstepFirst = true; if(parent == Globals.playerEntity && !Globals.controlHandler.cameraIsThirdPerson()){ Globals.movementAudioService.playAudio(ClientVoxelSampler.getVoxelTypeBeneathEntity(parent), InteractionType.STEP_BARE_REG); @@ -472,7 +478,12 @@ public class ClientGroundMovementTree implements BehaviorTree { Globals.movementAudioService.playAudioPositional(ClientVoxelSampler.getVoxelTypeBeneathEntity(parent), InteractionType.STEP_BARE_REG, position); } } - if(!this.playedFootstepSecond && secondOffset != null && animationTime > secondOffset){ + if( + this.shouldPlayFootsteps() && + !this.playedFootstepSecond && + secondOffset != null && + animationTime > secondOffset + ){ this.playedFootstepSecond = true; if(parent == Globals.playerEntity && !Globals.controlHandler.cameraIsThirdPerson()){ Globals.movementAudioService.playAudio(ClientVoxelSampler.getVoxelTypeBeneathEntity(parent), InteractionType.STEP_BARE_REG); @@ -485,6 +496,20 @@ public class ClientGroundMovementTree implements BehaviorTree { } } + /** + * Checks if this entity should play footstep sound effects + * @return true if should play footsteps, false otherwise + */ + private boolean shouldPlayFootsteps(){ + if(ClientJumpTree.getClientJumpTree(parent) != null){ + ClientJumpTree jumpTree = ClientJumpTree.getClientJumpTree(parent); + if(jumpTree.getState() != JumpState.INACTIVE){ + return false; + } + } + return true; + } + /** *

Automatically generated

*

diff --git a/src/main/java/electrosphere/entity/state/movement/jump/ClientJumpTree.java b/src/main/java/electrosphere/entity/state/movement/jump/ClientJumpTree.java index b36196b8..461e4c5c 100644 --- a/src/main/java/electrosphere/entity/state/movement/jump/ClientJumpTree.java +++ b/src/main/java/electrosphere/entity/state/movement/jump/ClientJumpTree.java @@ -8,6 +8,8 @@ import electrosphere.net.synchronization.ServerSynchronizationManager; import org.ode4j.math.DVector3C; import org.ode4j.ode.DBody; +import electrosphere.audio.movement.MovementAudioService.InteractionType; +import electrosphere.client.terrain.sampling.ClientVoxelSampler; import electrosphere.collision.PhysicsEntityUtils; import electrosphere.engine.Globals; import electrosphere.entity.Entity; @@ -43,7 +45,7 @@ public class ClientJumpTree implements BehaviorTree { AWAITING_LAND, } - @SyncedField + @SyncedField(serverSendTransitionPacket = true) JumpState state = JumpState.INACTIVE; @SyncedField @@ -293,4 +295,29 @@ public class ClientJumpTree implements BehaviorTree { ); } + /** + *

(Initially) Automatically Generated

+ *

+ * Performs a state transition on a client state variable. + * Will be triggered when a server performs a state change. + *

+ * @param newState The new value of the state + */ + public void transitionState(JumpState newState){ + this.setState(newState); + switch(newState){ + case INACTIVE: { + } break; + case ACTIVE: { + if(parent == Globals.playerEntity && !Globals.controlHandler.cameraIsThirdPerson()){ + Globals.movementAudioService.playAudio(ClientVoxelSampler.getVoxelTypeBeneathEntity(parent), InteractionType.JUMP); + } else { + Globals.movementAudioService.playAudioPositional(ClientVoxelSampler.getVoxelTypeBeneathEntity(parent), InteractionType.JUMP, EntityUtils.getPosition(parent)); + } + } break; + case AWAITING_LAND: { + } break; + } + } + } diff --git a/src/main/java/electrosphere/entity/state/movement/jump/ServerJumpTree.java b/src/main/java/electrosphere/entity/state/movement/jump/ServerJumpTree.java index 87caef86..038bf714 100644 --- a/src/main/java/electrosphere/entity/state/movement/jump/ServerJumpTree.java +++ b/src/main/java/electrosphere/entity/state/movement/jump/ServerJumpTree.java @@ -29,7 +29,7 @@ Behavior tree for movement in an entity */ public class ServerJumpTree implements BehaviorTree { - @SyncedField + @SyncedField(serverSendTransitionPacket = true) JumpState state = JumpState.INACTIVE; @SyncedField @@ -146,7 +146,7 @@ public class ServerJumpTree implements BehaviorTree { public void setState(JumpState state){ this.state = state; int value = ClientJumpTree.getJumpStateEnumAsShort(state); - DataCellSearchUtils.getEntityDataCell(parent).broadcastNetworkMessage(SynchronizationMessage.constructUpdateClientStateMessage(parent.getId(), BehaviorTreeIdEnums.BTREE_SERVERJUMPTREE_ID, FieldIdEnums.TREE_SERVERJUMPTREE_SYNCEDFIELD_STATE_ID, value)); + DataCellSearchUtils.getEntityDataCell(parent).broadcastNetworkMessage(SynchronizationMessage.constructServerNotifyBTreeTransitionMessage(parent.getId(), BehaviorTreeIdEnums.BTREE_SERVERJUMPTREE_ID, FieldIdEnums.TREE_SERVERJUMPTREE_SYNCEDFIELD_STATE_ID, value)); } /** diff --git a/src/main/java/electrosphere/net/synchronization/ClientSynchronizationManager.java b/src/main/java/electrosphere/net/synchronization/ClientSynchronizationManager.java index a24b52ee..3e5e42e4 100644 --- a/src/main/java/electrosphere/net/synchronization/ClientSynchronizationManager.java +++ b/src/main/java/electrosphere/net/synchronization/ClientSynchronizationManager.java @@ -242,6 +242,14 @@ public class ClientSynchronizationManager { } break; } } break; + case BehaviorTreeIdEnums.BTREE_SERVERJUMPTREE_ID: { + switch(message.getfieldId()){ + case FieldIdEnums.TREE_SERVERJUMPTREE_SYNCEDFIELD_STATE_ID:{ + ClientJumpTree tree = ClientJumpTree.getClientJumpTree(entity); + tree.transitionState(ClientJumpTree.getJumpStateShortAsEnum((short)message.getbTreeValue())); + } break; + } + } break; } }