fine tuned wall jump and run again
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user