simple slam and changed wall hugging to only work when input is towards the wall

This commit is contained in:
2026-01-13 09:43:58 +01:00
parent 0e3e258fd3
commit 80e533d98e
3 changed files with 68 additions and 14 deletions

View File

@@ -128,6 +128,10 @@ public partial class PlayerController : CharacterBody3D
public float PostDashSpeed { get; set; } = 100f;
[Export(PropertyHint.Range, "0,1,0.01,or_greater")]
public float TimeScaleAimInAir { get; set; } = 0.05f;
// Slam
[ExportSubgroup("Slam")]
[Export(PropertyHint.Range, "0,100,1,or_greater")]
public float SlamSpeed { get; set; } = 50.0f;
// Sliding and gliding
[ExportGroup("Slide")]
@@ -254,12 +258,14 @@ public partial class PlayerController : CharacterBody3D
private StateChartState _sliding;
private StateChartState _groundSliding;
private StateChartState _airGliding;
private StateChartState _slamming;
private StateChartState _onWall;
private StateChartState _onWallHugging;
private StateChartState _onWallHanging;
private StateChartState _onWallRunning;
private Transition _onJumpFromWall;
private Transition _onJumpFromWallFalling;
private Transition _onLeaveWallFromRun;
public override void _Ready()
@@ -322,6 +328,7 @@ public partial class PlayerController : CharacterBody3D
_sliding = StateChartState.Of(GetNode("StateChart/Root/Movement/Sliding"));
_groundSliding = StateChartState.Of(GetNode("StateChart/Root/Movement/Sliding/GroundSlide"));
_airGliding = StateChartState.Of(GetNode("StateChart/Root/Movement/Sliding/AirGlide"));
_slamming = StateChartState.Of(GetNode("StateChart/Root/Movement/Slamming"));
// _actionHanging = StateChartState.Of(GetNode("StateChart/Root/Actions/Hanging"));
_powerExpired = StateChartState.Of(GetNode("StateChart/Root/PowerReserve/Expired"));
@@ -336,6 +343,7 @@ public partial class PlayerController : CharacterBody3D
_doubleJump = StateChartState.Of(GetNode("StateChart/Root/Movement/Jump/DoubleJump"));
_mantling = StateChartState.Of(GetNode("StateChart/Root/Movement/Mantling"));
_onJumpFromWall = Transition.Of(GetNode("StateChart/Root/Movement/OnWall/OnJump"));
_onJumpFromWallFalling = Transition.Of(GetNode("StateChart/Root/Movement/Airborne/Falling/OnWallJump"));
_onWall = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall"));
_onWallHugging = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Hugging"));
_onWallHanging = StateChartState.Of(GetNode("StateChart/Root/Movement/OnWall/Hanging"));
@@ -414,6 +422,10 @@ public partial class PlayerController : CharacterBody3D
_groundSliding.StatePhysicsProcessing += HandleGroundSlide;
_airGliding.StatePhysicsProcessing += HandleAirGlide;
_slamming.StateEntered += SlamStarted;
_slamming.StateExited += SlamEnded;
_slamming.StatePhysicsProcessing += HandleSlam;
_simpleDashCooldownTimer.Timeout += DashCooldownTimeout;
_airborneDashCooldownTimer.Timeout += AirborneDashCooldownTimeout;
@@ -424,6 +436,7 @@ public partial class PlayerController : CharacterBody3D
_onWallRunning.StatePhysicsProcessing += HandleWallRunning;
_onJumpFromWall.Taken += OnJumpFromWall;
_onJumpFromWallFalling.Taken += OnJumpFromWall;
_onLeaveWallFromRun.Taken += OnLeaveWallFromRun;
}
@@ -528,7 +541,7 @@ public partial class PlayerController : CharacterBody3D
Velocity = new Vector3(horizontalVelocity.X, Velocity.Y, horizontalVelocity.Z);
}
private void HandleStairs(float delta)
private void MoveSlideAndHandleStairs(float delta)
{
StairsSystem.UpStairsCheckParams upStairsCheckParams = new StairsSystem.UpStairsCheckParams
{
@@ -638,7 +651,7 @@ public partial class PlayerController : CharacterBody3D
}
// If all else fail and we go down, we hug
if (Velocity.Y < 0 && !_coyoteEnabled.Active)
if (Velocity.Y < 0 && IsInputTowardsWall(wallNormal))
{
_playerState.SendEvent("wall_hug");
}
@@ -876,6 +889,11 @@ public partial class PlayerController : CharacterBody3D
///////////////////////////
// On wall management //
///////////////////////////
public bool IsInputTowardsWall(Vector3 wallNormal)
{
return wallNormal.Dot(GetInputGlobalHDirection()) < -0.5;
}
public void HandleOnWall(float delta)
{
if (IsTryingToMantle()) _playerState.SendEvent("mantle");
@@ -914,10 +932,8 @@ public partial class PlayerController : CharacterBody3D
WallHug(delta);
if (isOnFloorCustom())
_playerState.SendEvent("grounded");
if (!WallHugSystem.IsWallHugging())
{
if (!WallHugSystem.IsWallHugging() || !IsInputTowardsWall(_wallHugStartNormal))
_playerState.SendEvent("start_falling");
}
}
public void HandleWallHanging(float delta)
{
@@ -1001,7 +1017,7 @@ public partial class PlayerController : CharacterBody3D
_playerState.SendEvent("mantle");
return;
}
_playerState.SendEvent("jump");
}
@@ -1198,7 +1214,20 @@ public partial class PlayerController : CharacterBody3D
///////////////////////////
public void OnInputSlamPressed()
{
GD.Print("Slam pressed");
_playerState.SendEvent("slam");
}
public void SlamStarted()
{
SetHorizontalVelocity(Vector2.Zero);
SetVerticalVelocity(-SlamSpeed);
}
public void HandleSlam(float delta)
{
if (isOnFloorCustom()) _playerState.SendEvent("grounded");
}
public void SlamEnded()
{
}
///////////////////////////
@@ -1438,7 +1467,7 @@ public partial class PlayerController : CharacterBody3D
LookAround(delta);
CameraModifications((float) delta);
HandleStairs((float) delta);
MoveSlideAndHandleStairs((float) delta);
MantleSystem.ProcessMantle(_grounded.Active);
if (WeaponSystem.InHandState.Active)
RotateWeaponWithPlayer();