fine tuned wall jump and run again

This commit is contained in:
2026-02-13 12:31:51 +01:00
parent 22c4301244
commit 1caf202310
2 changed files with 55 additions and 15 deletions

View File

@@ -160,7 +160,7 @@ WallHugHorizontalDeceleration = 1.0
WallRunUpwardVelocityFactor = 0.5
MinimumWallRunUpwardSpeed = 4.0
WallRunAltitudeLossSpeed = 8.0
WallRunSpeedThreshold = 2.0
WallRunSpeedThreshold = 1.0
[node name="CHealth" parent="." unique_id=1244478698 instance=ExtResource("3_q7bng")]
RHealth = ExtResource("4_m8gvy")
@@ -1120,7 +1120,7 @@ delay_in_seconds = "0.0"
[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall" unique_id=342055859]
script = ExtResource("28_n7qhm")
to = NodePath("../../Jump/SimpleJump")
event = &"jump"
event = &"wall_jump"
delay_in_seconds = "0.0"
[node name="OnDash" type="Node" parent="StateChart/Root/Movement/OnWall" unique_id=43147957]

View File

@@ -245,7 +245,7 @@ public partial class PlayerController : CharacterBody3D,
public float MinimumWallRunHorizontalSpeed { get; set; } = 12f;
[Export(PropertyHint.Range, "1,20,0.1,or_greater")]
public float WallRunAltitudeLossSpeed { get; set; } = 10f;
[Export(PropertyHint.Range, "1,20,0.1,or_greater")]
[Export(PropertyHint.Range, "0,20,0.1,or_greater")]
public float WallRunSpeedThreshold { get; set; } = 8f;
///////////////////////////
@@ -1192,11 +1192,15 @@ public partial class PlayerController : CharacterBody3D,
// return;
var newWallNormal = WallHugSystem.WallHugNormal.UnwrapOr(Vector3.Up);
if (newWallNormal.AngleTo(_wallHugStartNormal) > Mathf.Pi/4) return;
// if (newWallNormal.AngleTo(_wallHugStartNormal) > Mathf.Pi/4) return;
_wallHugStartNormal = newWallNormal;
}
private float _timeOnWall;
public void OnWallStarted()
{
_timeOnWall = 0f;
if (_simpleDashCooldownTimer.IsStopped())
_canDash = true;
else
@@ -1212,6 +1216,7 @@ public partial class PlayerController : CharacterBody3D,
}
public void OnWallStopped()
{
_timeOnWall = 0f;
}
public void OnLeaveWallFromRun()
{
@@ -1221,8 +1226,12 @@ public partial class PlayerController : CharacterBody3D,
{
// _canDash = true;
// _canDashAirborne = true;
_timeOnWall += delta;
WallHug(delta);
if (IsInputTowardsWall(_wallHugStartNormal))
WallHug(delta);
else
MoveInAir(delta, IsGroundLike());
// if (ShouldStartWallRun())
// {
// _playerState.SendEvent("wall_run");
@@ -1230,7 +1239,7 @@ public partial class PlayerController : CharacterBody3D,
// }
if (isOnFloorCustom())
_playerState.SendEvent("grounded");
if (!WallHugSystem.IsWallHugging() || !IsInputTowardsWall(_wallHugStartNormal))
if (!WallHugSystem.IsWallHugging())
_playerState.SendEvent("start_falling");
}
public void HandleWallHanging(float delta)
@@ -1252,6 +1261,7 @@ public partial class PlayerController : CharacterBody3D,
{
// _canDash = false;
// _canDashAirborne = false;
_timeOnWall += delta;
// Find horizontal velocity projected on the current wall
var hvel = new Vector3(Velocity.X, 0, Velocity.Z);
@@ -1286,6 +1296,7 @@ public partial class PlayerController : CharacterBody3D,
public bool ShouldStartWallRun()
{
GD.Print(_wallHugStartNormal);
if (_wallHugStartNormal.Length() < Mathf.Epsilon)
{
// GD.Print("No wall normal");
@@ -1302,7 +1313,13 @@ public partial class PlayerController : CharacterBody3D,
var isThereInput = GetMoveInput().Length() > Mathf.Epsilon;
if (!isThereInput)
{
// GD.Print("Not a wall");
// GD.Print("No input");
return false;
}
if (!IsInputForwardOrTowardsWall())
{
// GD.Print("Input isn't forward or towards wall");
return false;
}
@@ -1322,14 +1339,14 @@ public partial class PlayerController : CharacterBody3D,
return false;
}
var isCoplanarEnough = Math.Abs(Velocity.Normalized().Dot(_wallHugStartNormal)) < 0.5;
var isCoplanarEnough = Math.Abs(Velocity.Normalized().Dot(_wallHugStartNormal)) < 0.9;
if (!isCoplanarEnough)
{
// GD.Print("Not coplanar enough");
return false;
}
var isGoingDownwards = Velocity.Normalized().Dot(Vector3.Down) > 0.5;
var isGoingDownwards = Velocity.Normalized().Dot(Vector3.Down) > 0.7;
if (isGoingDownwards)
{
// GD.Print("Going down");
@@ -1345,14 +1362,18 @@ public partial class PlayerController : CharacterBody3D,
return true;
}
public bool IsInputForwardOrTowardsWall()
{
return GetInputLocalHDirection().Z < -0.2f || IsInputTowardsWall(_wallHugStartNormal);
}
public bool CanKeepWallRun()
{
var isThereInput = GetMoveInput().Length() > Mathf.Epsilon;
if (!isThereInput) return false;
var isInputForward = GetInputLocalHDirection().Z < 0;
if (!isInputForward) return false;
if (!IsInputForwardOrTowardsWall()) return false;
var haveEnoughSpeed = Velocity.Length() > WallRunSpeedThreshold;
if (!haveEnoughSpeed) return false;
@@ -1370,6 +1391,7 @@ public partial class PlayerController : CharacterBody3D,
}
public void WallHang(float delta)
{
_timeOnWall += 1; // Consider we've already spent quite some time on wall
Velocity = Vector3.Zero;
GlobalPosition = _wallHugStartLocation;
}
@@ -1416,11 +1438,20 @@ public partial class PlayerController : CharacterBody3D,
_playerState.SendEvent("mantle");
return;
}
if (WallHugSystem.IsWallHugging())
if (_onWallRunning.Active || _onWallHanging.Active) // Always allow jumping out of wall run and hang
{
_playerState.SendEvent("wall_jump");
return;
}
if (_onWallHugging.Active && _isWallJumpAvailable) // Limit number of jumps doable when hugging
{
_playerState.SendEvent("wall_jump");
return;
}
// Regular jump
_playerState.SendEvent("jump");
}
@@ -1516,13 +1547,22 @@ public partial class PlayerController : CharacterBody3D,
SetHorizontalVelocity(currentHorizontalVelocity + wallJumpHorizontalVelocity);
}
public bool IsOnWallForLongEnough()
{
return _timeOnWall >= 0.1f;
}
public void OnJumpFromWall()
{
if (!IsFacingWall() || (!_isWallJumpAvailable && IsFacingWall()))
{
// if (!IsFacingWall() || (!_isWallJumpAvailable && IsFacingWall()))
// {
// ComputeJumpFromWallHSpeed(WallJumpStartVelocity);
// }
if (IsOnWallForLongEnough() || _onWallRunning.Active)
ComputeJumpFromWallHSpeed(WallJumpStartVelocity);
}
// OnJumpStarted(DoubleJumpStartVelocity);
// Remove the ability to dash straight away so you cannot scale up the wall
// _canDashAirborne = false;
_airborneDashCooldownTimer.Start();