Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fffd8c947b | |||
| a1d57d6a1a | |||
| 941205af2b | |||
| 6c2ad89687 | |||
| 59494f9e98 | |||
| 510246c341 |
@@ -54,27 +54,12 @@ jobs:
|
|||||||
- name: Import resources and build solution
|
- name: Import resources and build solution
|
||||||
run: |
|
run: |
|
||||||
godot --headless --editor --build-solutions --quit --import --path $PWD
|
godot --headless --editor --build-solutions --quit --import --path $PWD
|
||||||
|
|
||||||
- name: Build Windows
|
- name: Build Windows
|
||||||
run: |
|
run: |
|
||||||
mkdir -v -p build/windows
|
mkdir -v -p build/windows
|
||||||
godot --headless --verbose --build-solutions --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe
|
godot --headless --verbose --build-solutions --export-release "Windows Desktop" build/windows/${{ env.GAME_NAME }}.exe
|
||||||
zip -r Windows.zip build/windows
|
zip -r Windows.zip build/windows
|
||||||
- name: Build Windows ARM
|
|
||||||
run: |
|
|
||||||
mkdir -v -p build/windowsArm
|
|
||||||
godot --headless --verbose --build-solutions --export-release "Windows ARM" build/windowsArm/${{ env.GAME_NAME }}.exe
|
|
||||||
zip -r WindowsArm.zip build/windowsArm
|
|
||||||
# - name: Linux Build
|
|
||||||
# run: |
|
|
||||||
# mkdir -v -p build/linux
|
|
||||||
# godot --headless --verbose --export-release "Linux/X11" build/linux/${{ env.GAME_NAME }}.x86_64
|
|
||||||
# zip -r Linux.zip build/linux
|
|
||||||
- name: Mac Build
|
|
||||||
run: |
|
|
||||||
mkdir -v -p build/mac
|
|
||||||
godot --headless --verbose --export-release "macOS" build/mac/${{ env.GAME_NAME }}.zip
|
|
||||||
zip -r Mac.zip build/mac
|
|
||||||
|
|
||||||
- name: Upload to Itch
|
- name: Upload to Itch
|
||||||
uses: KikimoraGames/itch-publish@v0.0.3
|
uses: KikimoraGames/itch-publish@v0.0.3
|
||||||
with:
|
with:
|
||||||
@@ -84,6 +69,12 @@ jobs:
|
|||||||
buildNumber: ${{ needs.BumpTag.outputs.tag_name }}
|
buildNumber: ${{ needs.BumpTag.outputs.tag_name }}
|
||||||
gameData: Windows.zip
|
gameData: Windows.zip
|
||||||
buildChannel: windows
|
buildChannel: windows
|
||||||
|
|
||||||
|
- name: Build Windows ARM
|
||||||
|
run: |
|
||||||
|
mkdir -v -p build/windowsArm
|
||||||
|
godot --headless --verbose --build-solutions --export-release "Windows ARM" build/windowsArm/${{ env.GAME_NAME }}.exe
|
||||||
|
zip -r WindowsArm.zip build/windowsArm
|
||||||
- name: Upload to Itch
|
- name: Upload to Itch
|
||||||
uses: KikimoraGames/itch-publish@v0.0.3
|
uses: KikimoraGames/itch-publish@v0.0.3
|
||||||
with:
|
with:
|
||||||
@@ -93,15 +84,27 @@ jobs:
|
|||||||
buildNumber: ${{ needs.BumpTag.outputs.tag_name }}
|
buildNumber: ${{ needs.BumpTag.outputs.tag_name }}
|
||||||
gameData: WindowsArm.zip
|
gameData: WindowsArm.zip
|
||||||
buildChannel: windows-arm
|
buildChannel: windows-arm
|
||||||
# - name: Upload to Itch
|
|
||||||
# uses: KikimoraGames/itch-publish@v0.0.3
|
- name: Linux Build
|
||||||
# with:
|
run: |
|
||||||
# butlerApiKey: ${{ secrets.BUTLER_TOKEN }}
|
mkdir -v -p build/linux
|
||||||
# itchUsername: ${{ env.ITCHIO_USERNAME }}
|
godot --headless --verbose --export-release "Linux/X11" build/linux/${{ env.GAME_NAME }}.x86_64
|
||||||
# itchGameId: ${{ env.ITCHIO_GAMEID }}
|
zip -r Linux.zip build/linux
|
||||||
# buildNumber: ${{ needs.BumpTag.outputs.tag_name }}
|
- name: Upload to Itch
|
||||||
# gameData: Linux.zip
|
uses: KikimoraGames/itch-publish@v0.0.3
|
||||||
# buildChannel: linux
|
with:
|
||||||
|
butlerApiKey: ${{ secrets.BUTLER_TOKEN }}
|
||||||
|
itchUsername: ${{ env.ITCHIO_USERNAME }}
|
||||||
|
itchGameId: ${{ env.ITCHIO_GAMEID }}
|
||||||
|
buildNumber: ${{ needs.BumpTag.outputs.tag_name }}
|
||||||
|
gameData: Linux.zip
|
||||||
|
buildChannel: linux
|
||||||
|
|
||||||
|
- name: Mac Build
|
||||||
|
run: |
|
||||||
|
mkdir -v -p build/mac
|
||||||
|
godot --headless --verbose --export-release "macOS" build/mac/${{ env.GAME_NAME }}.zip
|
||||||
|
zip -r Mac.zip build/mac
|
||||||
- name: Upload to Itch
|
- name: Upload to Itch
|
||||||
uses: KikimoraGames/itch-publish@v0.0.3
|
uses: KikimoraGames/itch-publish@v0.0.3
|
||||||
with:
|
with:
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,7 @@
|
|||||||
[gd_scene load_steps=47 format=3 uid="uid://bei4nhkf8lwdo"]
|
[gd_scene load_steps=48 format=3 uid="uid://bei4nhkf8lwdo"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://bbbrf5ckydfna" path="res://player_controller/Scripts/PlayerController.cs" id="1_poq2x"]
|
[ext_resource type="Script" uid="uid://bbbrf5ckydfna" path="res://player_controller/Scripts/PlayerController.cs" id="1_poq2x"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://cf3rrgr1imvv4" path="res://scenes/path/path.tscn" id="2_6lejt"]
|
||||||
[ext_resource type="Resource" uid="uid://bl5crtu1gkrtr" path="res://systems/inputs/base_mode/base_mode.tres" id="3_cresl"]
|
[ext_resource type="Resource" uid="uid://bl5crtu1gkrtr" path="res://systems/inputs/base_mode/base_mode.tres" id="3_cresl"]
|
||||||
[ext_resource type="Resource" uid="uid://cpdaw41ah5gic" path="res://systems/inputs/base_mode/rotate_y.tres" id="4_rxwoh"]
|
[ext_resource type="Resource" uid="uid://cpdaw41ah5gic" path="res://systems/inputs/base_mode/rotate_y.tres" id="4_rxwoh"]
|
||||||
[ext_resource type="Resource" uid="uid://ccrb5xsnphc8" path="res://systems/inputs/base_mode/rotate_floorplane.tres" id="5_4u7i3"]
|
[ext_resource type="Resource" uid="uid://ccrb5xsnphc8" path="res://systems/inputs/base_mode/rotate_floorplane.tres" id="5_4u7i3"]
|
||||||
@@ -62,21 +63,22 @@ blend_mode = 1
|
|||||||
[node name="Player" type="CharacterBody3D"]
|
[node name="Player" type="CharacterBody3D"]
|
||||||
script = ExtResource("1_poq2x")
|
script = ExtResource("1_poq2x")
|
||||||
WalkSpeed = 7.5
|
WalkSpeed = 7.5
|
||||||
AccelerationAir = 2.0
|
AccelerationAir = 0.8
|
||||||
DecelerationAir = 0.1
|
DecelerationAir = 0.02
|
||||||
Weight = 5.0
|
Weight = 4.0
|
||||||
MantleTime = 0.2
|
MantleTime = 0.3
|
||||||
|
MantlePath = ExtResource("2_6lejt")
|
||||||
CoyoteTime = 0.3
|
CoyoteTime = 0.3
|
||||||
SimpleJumpStartVelocity = 8.0
|
InputBufferFrames = 5
|
||||||
|
SimpleJumpStartVelocity = 6.0
|
||||||
SimpleJumpHangTimeInFrames = 1
|
SimpleJumpHangTimeInFrames = 1
|
||||||
SimpleJumpGravityLesseningFactor = 2.5
|
SimpleJumpGravityLesseningFactor = 2.0
|
||||||
DoubleJumpStartVelocity = 15.0
|
|
||||||
DoubleJumpHangTimeInFrames = 3
|
DoubleJumpHangTimeInFrames = 3
|
||||||
DoubleJumpGravityLesseningFactor = 1.5
|
DoubleJumpGravityLesseningFactor = 1.5
|
||||||
MegaJumpStartVelocity = 30.0
|
MegaJumpStartVelocity = 30.0
|
||||||
MegaJumpHangTimeInFrames = 12
|
MegaJumpHangTimeInFrames = 12
|
||||||
MegaJumpGravityLesseningFactor = 1.2
|
MegaJumpGravityLesseningFactor = 1.2
|
||||||
WallJumpStartVelocity = 12.0
|
WallJumpStartVelocity = 8.0
|
||||||
MaxNumberOfEmpoweredActions = 3
|
MaxNumberOfEmpoweredActions = 3
|
||||||
SimpleDashStrength = 15.0
|
SimpleDashStrength = 15.0
|
||||||
PoweredDashStrength = 30.0
|
PoweredDashStrength = 30.0
|
||||||
@@ -234,6 +236,11 @@ transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0, 0
|
|||||||
mesh = SubResource("CylinderMesh_nodcl")
|
mesh = SubResource("CylinderMesh_nodcl")
|
||||||
|
|
||||||
[node name="DashCooldown" type="Timer" parent="."]
|
[node name="DashCooldown" type="Timer" parent="."]
|
||||||
|
wait_time = 0.8
|
||||||
|
one_shot = true
|
||||||
|
|
||||||
|
[node name="AirborneDashCooldown" type="Timer" parent="."]
|
||||||
|
wait_time = 0.5
|
||||||
one_shot = true
|
one_shot = true
|
||||||
|
|
||||||
[node name="PowerCooldown" type="Timer" parent="."]
|
[node name="PowerCooldown" type="Timer" parent="."]
|
||||||
@@ -607,7 +614,7 @@ default_state = NodePath("../CoyoteEnabled")
|
|||||||
|
|
||||||
[node name="OnWallRun" type="Node" parent="StateChart/Root/Movement/Airborne"]
|
[node name="OnWallRun" type="Node" parent="StateChart/Root/Movement/Airborne"]
|
||||||
script = ExtResource("28_n7qhm")
|
script = ExtResource("28_n7qhm")
|
||||||
to = NodePath("../../OnWall/RunningCoyoteEnabled")
|
to = NodePath("../../OnWall/Running")
|
||||||
event = &"wall_run"
|
event = &"wall_run"
|
||||||
delay_in_seconds = "0.0"
|
delay_in_seconds = "0.0"
|
||||||
|
|
||||||
@@ -670,7 +677,7 @@ script = ExtResource("27_34snm")
|
|||||||
|
|
||||||
[node name="OnWallHug" type="Node" parent="StateChart/Root/Movement/Airborne/Falling"]
|
[node name="OnWallHug" type="Node" parent="StateChart/Root/Movement/Airborne/Falling"]
|
||||||
script = ExtResource("28_n7qhm")
|
script = ExtResource("28_n7qhm")
|
||||||
to = NodePath("../../../OnWall/HuggingCoyoteEnabled")
|
to = NodePath("../../../OnWall/Hugging")
|
||||||
event = &"wall_hug"
|
event = &"wall_hug"
|
||||||
delay_in_seconds = "0.0"
|
delay_in_seconds = "0.0"
|
||||||
|
|
||||||
@@ -734,7 +741,7 @@ script = ExtResource("27_34snm")
|
|||||||
|
|
||||||
[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/Hugging"]
|
[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/Hugging"]
|
||||||
script = ExtResource("28_n7qhm")
|
script = ExtResource("28_n7qhm")
|
||||||
to = NodePath("../../../Jump/SimpleJump")
|
to = NodePath("../../../Jump/DoubleJump")
|
||||||
event = &"jump"
|
event = &"jump"
|
||||||
delay_in_seconds = "0.0"
|
delay_in_seconds = "0.0"
|
||||||
|
|
||||||
@@ -743,7 +750,7 @@ script = ExtResource("27_34snm")
|
|||||||
|
|
||||||
[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/Hanging"]
|
[node name="OnJump" type="Node" parent="StateChart/Root/Movement/OnWall/Hanging"]
|
||||||
script = ExtResource("28_n7qhm")
|
script = ExtResource("28_n7qhm")
|
||||||
to = NodePath("../../../Jump/SimpleJump")
|
to = NodePath("../../../Jump/DoubleJump")
|
||||||
event = &"jump"
|
event = &"jump"
|
||||||
delay_in_seconds = "0.0"
|
delay_in_seconds = "0.0"
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
// Timers
|
// Timers
|
||||||
private Timer _timeScaleAimInAirTimer;
|
private Timer _timeScaleAimInAirTimer;
|
||||||
private Timer _simpleDashCooldownTimer;
|
private Timer _simpleDashCooldownTimer;
|
||||||
|
private Timer _airborneDashCooldownTimer;
|
||||||
private Timer _powerCooldownTimer;
|
private Timer _powerCooldownTimer;
|
||||||
|
|
||||||
[Export] public Marker3D TutorialWeaponTarget;
|
[Export] public Marker3D TutorialWeaponTarget;
|
||||||
@@ -82,12 +83,14 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
[Export(PropertyHint.Range, "0,1,0.01,or_greater")]
|
[Export(PropertyHint.Range, "0,1,0.01,or_greater")]
|
||||||
public float MantleTime { get; set; } = 0.1f;
|
public float MantleTime { get; set; } = 0.1f;
|
||||||
[Export]
|
[Export]
|
||||||
public PackedScene MantlePath { get; set; } = GD.Load<PackedScene>("res://scenes/path/Path.tscn");
|
public PackedScene MantlePath { get; set; }
|
||||||
|
|
||||||
// Jump
|
// Jump
|
||||||
[ExportGroup("Jump")]
|
[ExportGroup("Jump")]
|
||||||
[Export(PropertyHint.Range, "0,1,0.01")]
|
[Export(PropertyHint.Range, "0,1,0.01")]
|
||||||
public float CoyoteTime { get; set; } = 0.2f;
|
public float CoyoteTime { get; set; } = 0.2f;
|
||||||
|
[Export(PropertyHint.Range, "0,10,1,or_greater")]
|
||||||
|
public int InputBufferFrames { get; set; } = 3;
|
||||||
|
|
||||||
// Simple jump
|
// Simple jump
|
||||||
[ExportSubgroup("Simple jump")]
|
[ExportSubgroup("Simple jump")]
|
||||||
@@ -228,6 +231,8 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
private Transition _onLeaveWallFromRunCoyote;
|
private Transition _onLeaveWallFromRunCoyote;
|
||||||
private Transition _onLeaveWallFromRun;
|
private Transition _onLeaveWallFromRun;
|
||||||
|
|
||||||
|
private int _currentJumpBufferFrames = 0;
|
||||||
|
|
||||||
private float _playerHeight;
|
private float _playerHeight;
|
||||||
private float _playerRadius;
|
private float _playerRadius;
|
||||||
private bool _isJumpInputPressed;
|
private bool _isJumpInputPressed;
|
||||||
@@ -327,6 +332,7 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
_powerCooldownTimer = GetNode<Timer>("PowerCooldown");
|
_powerCooldownTimer = GetNode<Timer>("PowerCooldown");
|
||||||
_timeScaleAimInAirTimer = GetNode<Timer>("TimeScaleAimInAir");
|
_timeScaleAimInAirTimer = GetNode<Timer>("TimeScaleAimInAir");
|
||||||
_simpleDashCooldownTimer = GetNode<Timer>("DashCooldown");
|
_simpleDashCooldownTimer = GetNode<Timer>("DashCooldown");
|
||||||
|
_airborneDashCooldownTimer = GetNode<Timer>("AirborneDashCooldown");
|
||||||
|
|
||||||
///////////////////////////
|
///////////////////////////
|
||||||
// Initialize components //
|
// Initialize components //
|
||||||
@@ -398,6 +404,7 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
_aimedDash.StateExited += OnAimedDashFinished;
|
_aimedDash.StateExited += OnAimedDashFinished;
|
||||||
|
|
||||||
_simpleDashCooldownTimer.Timeout += DashCooldownTimeout;
|
_simpleDashCooldownTimer.Timeout += DashCooldownTimeout;
|
||||||
|
_airborneDashCooldownTimer.Timeout += AirborneDashCooldownTimeout;
|
||||||
|
|
||||||
_onWall.StateEntered += OnWallStarted;
|
_onWall.StateEntered += OnWallStarted;
|
||||||
_onWall.StateExited += OnWallStopped;
|
_onWall.StateExited += OnWallStopped;
|
||||||
@@ -463,16 +470,31 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
|
|
||||||
if (_simpleDashCooldownTimer.IsStopped())
|
if (_simpleDashCooldownTimer.IsStopped())
|
||||||
_simpleDashCooldownTimer.Start();
|
_simpleDashCooldownTimer.Start();
|
||||||
|
|
||||||
|
if (_currentJumpBufferFrames > 0)
|
||||||
|
{
|
||||||
|
_currentJumpBufferFrames = 0;
|
||||||
|
PerformJump();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DashCooldownTimeout()
|
public void DashCooldownTimeout()
|
||||||
{
|
{
|
||||||
_canDash = true;
|
_canDash = true;
|
||||||
}
|
}
|
||||||
|
public void AirborneDashCooldownTimeout()
|
||||||
|
{
|
||||||
|
_canDashAirborne = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsPlayerInputtingForward()
|
||||||
|
{
|
||||||
|
return GetMoveInput().Z < -0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsTryingToMantle()
|
public bool IsTryingToMantle()
|
||||||
{
|
{
|
||||||
return MantleSystem.IsMantlePossible && GetMoveInput().Z < -0.5f && _isJumpInputPressed;
|
return MantleSystem.IsMantlePossible && IsPlayerInputtingForward() && _isJumpInputPressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void HandleGrounded(float delta)
|
public void HandleGrounded(float delta)
|
||||||
@@ -485,15 +507,17 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
|
|
||||||
public void HandleAirborne(float delta)
|
public void HandleAirborne(float delta)
|
||||||
{
|
{
|
||||||
|
|
||||||
MoveInAir(delta);
|
MoveInAir(delta);
|
||||||
if (isOnFloorCustom())
|
if (isOnFloorCustom())
|
||||||
_playerState.SendEvent("grounded");
|
_playerState.SendEvent("grounded");
|
||||||
|
|
||||||
if (IsTryingToMantle()) _playerState.SendEvent("mantle");
|
if (IsTryingToMantle()) _playerState.SendEvent("mantle");
|
||||||
|
|
||||||
if (!WallHugSystem.IsWallHugging())
|
if (!WallHugSystem.IsWallHugging())
|
||||||
|
{
|
||||||
|
_isWallJumpAvailable = true; // reset wall jump if we left the wall
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Going upwards, we stay simply airborne
|
// Going upwards, we stay simply airborne
|
||||||
if (Velocity.AngleTo(Vector3.Up) < Math.PI / 4)
|
if (Velocity.AngleTo(Vector3.Up) < Math.PI / 4)
|
||||||
@@ -625,7 +649,13 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
// Jump
|
// Jump
|
||||||
public void OnInputJumpStarted()
|
public void OnInputJumpStarted()
|
||||||
{
|
{
|
||||||
|
_currentJumpBufferFrames = InputBufferFrames;
|
||||||
_isJumpInputPressed = true;
|
_isJumpInputPressed = true;
|
||||||
|
PerformJump();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PerformJump()
|
||||||
|
{
|
||||||
if (MantleSystem.IsMantlePossible)
|
if (MantleSystem.IsMantlePossible)
|
||||||
{
|
{
|
||||||
_playerState.SendEvent("mantle");
|
_playerState.SendEvent("mantle");
|
||||||
@@ -638,13 +668,15 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_onWallHuggingCoyoteEnabled.Active || _onWallRunningCoyoteEnabled.Active)
|
if (_onWall.Active && !_isWallJumpAvailable && IsFacingWall()) return;
|
||||||
{
|
|
||||||
if (!_isWallJumpAvailable) return;
|
|
||||||
}
|
|
||||||
_playerState.SendEvent("jump");
|
_playerState.SendEvent("jump");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsFacingWall()
|
||||||
|
{
|
||||||
|
return _wallHugStartNormal.Dot(GetGlobalForwardFacingVector()) < -0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
public void OnInputJumpOngoing()
|
public void OnInputJumpOngoing()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -667,7 +699,7 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
public void OnDoubleJumpStarted()
|
public void OnDoubleJumpStarted()
|
||||||
{
|
{
|
||||||
_canDash = true;
|
_canDash = true;
|
||||||
_canDashAirborne = true;
|
// _canDashAirborne = true;
|
||||||
OnJumpStarted(DoubleJumpStartVelocity);
|
OnJumpStarted(DoubleJumpStartVelocity);
|
||||||
}
|
}
|
||||||
public void OnMegaJumpStarted()
|
public void OnMegaJumpStarted()
|
||||||
@@ -699,7 +731,14 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
|
|
||||||
public void OnJumpFromWall()
|
public void OnJumpFromWall()
|
||||||
{
|
{
|
||||||
ComputeJumpFromWallHSpeed(WallJumpStartVelocity);
|
if (!IsFacingWall())
|
||||||
|
{
|
||||||
|
ComputeJumpFromWallHSpeed(WallJumpStartVelocity);
|
||||||
|
}
|
||||||
|
// Remove the ability to dash straight away so you cannot scale up the wall
|
||||||
|
_canDashAirborne = false;
|
||||||
|
_airborneDashCooldownTimer.Start();
|
||||||
|
_isWallJumpAvailable = false;
|
||||||
}
|
}
|
||||||
public void OnMegajumpFromWall()
|
public void OnMegajumpFromWall()
|
||||||
{
|
{
|
||||||
@@ -847,8 +886,8 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
SetVerticalVelocity(Velocity.Y - 2.0f);
|
SetVerticalVelocity(Velocity.Y - 2.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move back to Airborne state management when starting to go down again
|
// Move back to Airborne state when starting to go down again or if input isn't held anymore (buffered jump)
|
||||||
if (_framesSinceJumpAtApex > hangFrames)
|
if (_framesSinceJumpAtApex > hangFrames || !_isJumpInputPressed)
|
||||||
_playerState.SendEvent("jump_ended");
|
_playerState.SendEvent("jump_ended");
|
||||||
}
|
}
|
||||||
public void HandleSimpleJump(float delta)
|
public void HandleSimpleJump(float delta)
|
||||||
@@ -1361,12 +1400,19 @@ public partial class PlayerController : CharacterBody3D
|
|||||||
{
|
{
|
||||||
WeaponRoot.SetRotation(HeadSystem.Rotation);
|
WeaponRoot.SetRotation(HeadSystem.Rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Vector3 GetGlobalForwardFacingVector()
|
||||||
|
{
|
||||||
|
return Transform.Basis * HeadSystem.Transform.Basis * Vector3.Forward;
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////
|
///////////////////////////
|
||||||
// Processes //////////////
|
// Processes //////////////
|
||||||
///////////////////////////
|
///////////////////////////
|
||||||
public override void _PhysicsProcess(double delta)
|
public override void _PhysicsProcess(double delta)
|
||||||
{
|
{
|
||||||
|
if (_currentJumpBufferFrames > 0) _currentJumpBufferFrames -= 1;
|
||||||
|
|
||||||
LookAround(delta);
|
LookAround(delta);
|
||||||
CameraModifications((float) delta);
|
CameraModifications((float) delta);
|
||||||
HandleStairs((float) delta);
|
HandleStairs((float) delta);
|
||||||
|
|||||||
@@ -57,13 +57,15 @@ public partial class MantleSystem: Node3D
|
|||||||
IsMantlePossible = false;
|
IsMantlePossible = false;
|
||||||
if (!isColliding) return;
|
if (!isColliding) return;
|
||||||
|
|
||||||
// Check if collide with wall
|
// Check if face something wall-like that should be climbable
|
||||||
var collisionNormal = isGrounded ? _groundedWallDetect.GetCollisionNormal(0) : _inAirWallDetect.GetCollisionNormal(0);
|
var collisionNormal = isGrounded ? _groundedWallDetect.GetCollisionNormal(0) : _inAirWallDetect.GetCollisionNormal(0);
|
||||||
if (collisionNormal.Y > 0.9f) return;
|
if (collisionNormal.Y > 0.7f) return;
|
||||||
|
|
||||||
|
var spaceState = GetWorld3D().DirectSpaceState;
|
||||||
MantleCurve = new Curve3D();
|
MantleCurve = new Curve3D();
|
||||||
MantleCurve.AddPoint(Vector3.Zero);
|
MantleCurve.AddPoint(Vector3.Zero);
|
||||||
var hasFirstProfileHit = false;
|
var hasFirstProfileHit = false;
|
||||||
|
var previousProfilePoint = GlobalPosition;
|
||||||
foreach (var wallProfileShapecast in _wallProfileShapecasts)
|
foreach (var wallProfileShapecast in _wallProfileShapecasts)
|
||||||
{
|
{
|
||||||
// Haven't met the wall yet
|
// Haven't met the wall yet
|
||||||
@@ -74,22 +76,31 @@ public partial class MantleSystem: Node3D
|
|||||||
// Got to the other side of the wall, we stop there
|
// Got to the other side of the wall, we stop there
|
||||||
if (!wallProfileShapecast.IsColliding())
|
if (!wallProfileShapecast.IsColliding())
|
||||||
{
|
{
|
||||||
MantleCurve.AddPoint(ToLocal(globalTargetPosition));
|
// MantleCurve.AddPoint(ToLocal(globalTargetPosition));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
var profilePoint = wallProfileShapecast.GetCollisionPoint(0);
|
var profilePoint = wallProfileShapecast.GetCollisionPoint(0);
|
||||||
var profileNormal = wallProfileShapecast.GetCollisionNormal(0);
|
var profileNormal = wallProfileShapecast.GetCollisionNormal(0);
|
||||||
|
var shape = wallProfileShapecast.Shape as SphereShape3D;
|
||||||
|
var shapeRadius = shape == null ? 0.125f : shape.Radius;
|
||||||
|
var centerOfShape = profilePoint + profileNormal * shapeRadius;
|
||||||
|
|
||||||
// Check if we collided parallel to a wall
|
// Check if we collided parallel to a wall
|
||||||
var isCollisionSameAsTarget = globalTargetPosition.IsEqualApprox(profilePoint);
|
var isCollisionSameAsTarget = globalTargetPosition.IsEqualApprox(centerOfShape);
|
||||||
var isCollidingWithWall = profileNormal.Y < 0.1f;
|
var isCollidingWithWall = profileNormal.Y < 0.1f;
|
||||||
if (isCollisionSameAsTarget || isCollidingWithWall) continue;
|
if (isCollisionSameAsTarget || isCollidingWithWall) continue;
|
||||||
|
|
||||||
|
// Check if the path from the previous point makes us go through a wall
|
||||||
|
var query = PhysicsRayQueryParameters3D.Create(previousProfilePoint, centerOfShape, wallProfileShapecast.CollisionMask);
|
||||||
|
var result = spaceState.IntersectRay(query);
|
||||||
|
if (result.Count > 0) break; // We are going through a wall, we stop there
|
||||||
|
|
||||||
// We have a valid collision
|
// We have a valid collision
|
||||||
if (!hasFirstProfileHit) FirstMantleProfilePoint = profilePoint;
|
if (!hasFirstProfileHit) FirstMantleProfilePoint = centerOfShape;
|
||||||
hasFirstProfileHit = true;
|
hasFirstProfileHit = true;
|
||||||
MantleCurve.AddPoint(ToLocal(profilePoint));
|
previousProfilePoint = centerOfShape;
|
||||||
|
MantleCurve.AddPoint(ToLocal(centerOfShape));
|
||||||
}
|
}
|
||||||
if (MantleCurve.PointCount == 1) return;
|
if (MantleCurve.PointCount == 1) return;
|
||||||
|
|
||||||
|
|||||||
@@ -58,47 +58,47 @@ collision_mask = 2
|
|||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -0.5)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -0.5)
|
||||||
enabled = false
|
enabled = false
|
||||||
shape = SubResource("SphereShape3D_i32qj")
|
shape = SubResource("SphereShape3D_i32qj")
|
||||||
target_position = Vector3(0, -2.375, 0)
|
target_position = Vector3(0, -2.125, 0)
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
|
|
||||||
[node name="ShapeCast2" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
[node name="ShapeCast2" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -0.75)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -0.75)
|
||||||
enabled = false
|
enabled = false
|
||||||
shape = SubResource("SphereShape3D_i32qj")
|
shape = SubResource("SphereShape3D_i32qj")
|
||||||
target_position = Vector3(0, -2.375, 0)
|
target_position = Vector3(0, -2.125, 0)
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
|
|
||||||
[node name="ShapeCast3" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
[node name="ShapeCast3" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1)
|
||||||
enabled = false
|
enabled = false
|
||||||
shape = SubResource("SphereShape3D_i32qj")
|
shape = SubResource("SphereShape3D_i32qj")
|
||||||
target_position = Vector3(0, -2.375, 0)
|
target_position = Vector3(0, -2.125, 0)
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
|
|
||||||
[node name="ShapeCast4" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
[node name="ShapeCast4" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.25)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.25)
|
||||||
enabled = false
|
enabled = false
|
||||||
shape = SubResource("SphereShape3D_i32qj")
|
shape = SubResource("SphereShape3D_i32qj")
|
||||||
target_position = Vector3(0, -2.375, 0)
|
target_position = Vector3(0, -2.125, 0)
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
|
|
||||||
[node name="ShapeCast5" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
[node name="ShapeCast5" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.5)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.5)
|
||||||
enabled = false
|
enabled = false
|
||||||
shape = SubResource("SphereShape3D_i32qj")
|
shape = SubResource("SphereShape3D_i32qj")
|
||||||
target_position = Vector3(0, -2.375, 0)
|
target_position = Vector3(0, -2.125, 0)
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
|
|
||||||
[node name="ShapeCast6" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
[node name="ShapeCast6" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.75)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -1.75)
|
||||||
enabled = false
|
enabled = false
|
||||||
shape = SubResource("SphereShape3D_i32qj")
|
shape = SubResource("SphereShape3D_i32qj")
|
||||||
target_position = Vector3(0, -2.375, 0)
|
target_position = Vector3(0, -2.125, 0)
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
|
|
||||||
[node name="ShapeCast7" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
[node name="ShapeCast7" type="ShapeCast3D" parent="WallProfileShapeCasts"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -2)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -2)
|
||||||
enabled = false
|
enabled = false
|
||||||
shape = SubResource("SphereShape3D_i32qj")
|
shape = SubResource("SphereShape3D_i32qj")
|
||||||
target_position = Vector3(0, -2.375, 0)
|
target_position = Vector3(0, -2.125, 0)
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
|
|||||||
Reference in New Issue
Block a user