diff --git a/addons/player_controller/Scripts/FieldOfView.cs b/addons/player_controller/Scripts/FieldOfView.cs index 9884989..130e0af 100644 --- a/addons/player_controller/Scripts/FieldOfView.cs +++ b/addons/player_controller/Scripts/FieldOfView.cs @@ -29,7 +29,9 @@ public partial class FieldOfView: Node3D public void PerformFovAdjustment(FovParameters parameters) { float velocityClamped = Mathf.Clamp( - parameters.Velocity.Length(), 0.5f, parameters.SprintSpeed * 2.0f); + Mathf.Abs(parameters.Velocity.X) + Mathf.Abs(parameters.Velocity.Z), + 0.5f, + parameters.SprintSpeed * 2.0f); float targetFov = BaseFov + FovChangeFactor * velocityClamped; diff --git a/addons/player_controller/Scripts/PlayerController.cs b/addons/player_controller/Scripts/PlayerController.cs index 63186c7..fd1c1cb 100644 --- a/addons/player_controller/Scripts/PlayerController.cs +++ b/addons/player_controller/Scripts/PlayerController.cs @@ -24,6 +24,11 @@ public partial class PlayerController : CharacterBody3D [Export(PropertyHint.Range, "0,100,0.1,or_greater")] public float CrouchTransitionSpeed { get; set; } = 20.0f; + [Export(PropertyHint.Range, "0,5,0.1,or_greater")] + public float DoubleJumpSpeedFactor { get; set; } = 2f; + + private bool _canDoubleJump = true; + private float _currentSpeed; private const float DecelerationSpeedFactorFloor = 15.0f; @@ -115,6 +120,7 @@ public partial class PlayerController : CharacterBody3D if (isOnFloorCustom()) { _lastFrameWasOnFloor = Engine.GetPhysicsFrames(); + _canDoubleJump = true; } // Adding the gravity @@ -139,6 +145,15 @@ public partial class PlayerController : CharacterBody3D y: Gravity.CalculateJumpForce() * (float)delta, z: Velocity.Z); } + else if (Input.IsActionJustPressed("jump") && !isOnFloorCustom() + && !doesCapsuleHaveCrouchingHeight && !isPlayerDead && _canDoubleJump) + { + _canDoubleJump = false; + Velocity = new Vector3( + x: Velocity.X, + y: Gravity.CalculateJumpForce() * (float)delta * DoubleJumpSpeedFactor, + z: Velocity.Z); + } bool isHeadTouchingCeiling = IsHeadTouchingCeiling(); bool doesCapsuleHaveDefaultHeight = CapsuleCollider.IsDefaultHeight(); diff --git a/main.tscn b/main.tscn index 494d0cc..db67ca0 100644 --- a/main.tscn +++ b/main.tscn @@ -21,13 +21,16 @@ glow_enabled = true environment = SubResource("Environment_1bvp3") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] -transform = Transform3D(-0.866024, -0.433016, 0.250001, -0.320371, 0.864432, 0.387452, -0.383882, 0.255449, -0.887345, 0, 0, 0) +transform = Transform3D(-0.772218, 0.611111, 0.173844, 0.0446935, -0.220691, 0.974319, 0.633783, 0.760157, 0.143109, 0, 0, 0) shadow_enabled = true [node name="Player" parent="." instance=ExtResource("1_ig7tw")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.25692, 0.0273442, 30.8297) +WalkSpeed = 10.0 +SprintSpeed = 15.0 -[node name="Greybox" type="Node" parent="."] +[node name="Greybox" type="CSGCombiner3D" parent="."] +use_collision = true [node name="CSGBox3D" type="CSGBox3D" parent="Greybox"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.09619, -0.472656, -0.958893) @@ -35,57 +38,137 @@ use_collision = true size = Vector3(100, 1, 100) [node name="CSGBox3D2" type="CSGBox3D" parent="Greybox"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22.4157, 5, 14.9013) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -22, 5, 11.0613) use_collision = true -size = Vector3(10, 10, 50) +size = Vector3(10, 10, 57.8774) -[node name="CSGCombiner3D" type="CSGCombiner3D" parent="Greybox"] +[node name="Stairs" type="CSGCombiner3D" parent="Greybox"] use_collision = true -[node name="CSGBox3D5" type="CSGBox3D" parent="Greybox/CSGCombiner3D"] +[node name="CSGBox3D5" type="CSGBox3D" parent="Greybox/Stairs"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.0294, 0.5, 32.891) size = Vector3(3, 1, 3) -[node name="CSGBox3D6" type="CSGBox3D" parent="Greybox/CSGCombiner3D"] +[node name="CSGBox3D6" type="CSGBox3D" parent="Greybox/Stairs"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 1, 29.905) size = Vector3(3, 2, 3) -[node name="CSGBox3D7" type="CSGBox3D" parent="Greybox/CSGCombiner3D"] +[node name="CSGBox3D7" type="CSGBox3D" parent="Greybox/Stairs"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 1.5, 26.9138) size = Vector3(3, 3, 3) -[node name="CSGBox3D8" type="CSGBox3D" parent="Greybox/CSGCombiner3D"] +[node name="CSGBox3D8" type="CSGBox3D" parent="Greybox/Stairs"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 2, 23.9462) size = Vector3(3, 4, 3) -[node name="CSGBox3D9" type="CSGBox3D" parent="Greybox/CSGCombiner3D"] +[node name="CSGBox3D9" type="CSGBox3D" parent="Greybox/Stairs"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 2.5, 20.975) size = Vector3(3, 5, 3) -[node name="CSGBox3D10" type="CSGBox3D" parent="Greybox/CSGCombiner3D"] +[node name="CSGBox3D10" type="CSGBox3D" parent="Greybox/Stairs"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 3, 17.9825) size = Vector3(3, 6, 3) -[node name="CSGBox3D11" type="CSGBox3D" parent="Greybox/CSGCombiner3D"] +[node name="CSGBox3D11" type="CSGBox3D" parent="Greybox/Stairs"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 3.5, 15) size = Vector3(3, 7, 3) -[node name="CSGBox3D12" type="CSGBox3D" parent="Greybox/CSGCombiner3D"] +[node name="CSGBox3D12" type="CSGBox3D" parent="Greybox/Stairs"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 4, 12.018) size = Vector3(3, 8, 3) -[node name="CSGBox3D13" type="CSGBox3D" parent="Greybox/CSGCombiner3D"] +[node name="CSGBox3D13" type="CSGBox3D" parent="Greybox/Stairs"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.029, 4.5, 9.04904) size = Vector3(3, 9, 3) [node name="CSGBox3D3" type="CSGBox3D" parent="Greybox"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.01999, 4.9845, 6.27246) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.0524, 10.795, 6.27246) use_collision = true -size = Vector3(43.9793, 10, 2.62695) +size = Vector3(39.9961, 21.6211, 2.62695) [node name="CSGCylinder3D" type="CSGCylinder3D" parent="Greybox/CSGBox3D3"] -transform = Transform3D(4.2, 0, 0, 0, -6.11959e-08, -7, 0, 1.4, -3.0598e-07, 8, -5, -0.293446) +transform = Transform3D(4.2, 0, 0, 0, -6.11959e-08, -7, 0, 1.4, -3.0598e-07, 8.96759, -10.8105, -0.293446) operation = 2 radius = 1.0 height = 5.0 sides = 40 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Greybox/CSGBox3D3"] +transform = Transform3D(4.2, 0, 0, 0, -6.11959e-08, -7, 0, 1.4, -3.0598e-07, -11.9615, -10.8105, -0.293446) +operation = 2 +radius = 1.0 +height = 5.0 +sides = 40 + +[node name="CSGBox3D4" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 35.9586, 5, 15.3133) +use_collision = true +size = Vector3(25.9171, 10, 66.0572) + +[node name="CSGBox3D9" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.5038, 2.5, 7.30957) +size = Vector3(3, 5, 25.3809) + +[node name="CSGBox3D10" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 11.517, 1.29345, 21.5) +size = Vector3(3, 2.5, 22.978) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.45774, 10.7885, -6.46509) +use_collision = true +size = Vector3(2.15405, 21.577, 22.8794) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -7.80455, 10.8026, -16.8324) +use_collision = true +size = Vector3(2.15405, 21.6052, 18.459) + +[node name="CSGBox3D7" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 45.6363, 5, -30.4887) +use_collision = true +size = Vector3(6.8864, 10, 40.8848) + +[node name="CSGBox3D8" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 50.0149, 26.122, -0.963737) +use_collision = true +size = Vector3(2.14108, 52.2441, 99.9347) + +[node name="CSGBox3D11" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -28.1405, 26.122, -0.963737) +use_collision = true +size = Vector3(2.14108, 52.2441, 99.9347) + +[node name="CSGBox3D12" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 8.92915, 26.122, -49.9656) +use_collision = true +size = Vector3(2.14108, 52.2441, 99.9347) + +[node name="CSGBox3D13" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 10.7529, 26.122, 49.3889) +use_collision = true +size = Vector3(2.14108, 52.2441, 99.9347) + +[node name="CSGBox3D14" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.534, 10.8779, 27.1386) +use_collision = true +size = Vector3(1.10791, 1.71436, 25.7228) + +[node name="CSGBox3D15" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.9058, 10.795, 47.0594) +use_collision = true +size = Vector3(76.2239, 21.6211, 2.62695) + +[node name="CSGBox3D16" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.0259, 22.0567, -5.15678) +use_collision = true +size = Vector3(74.1406, 1, 25.474) + +[node name="CSGBox3D17" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -22.0327, 10.786, -16.8929) +use_collision = true +size = Vector3(2.03296, 2.20193, 10.1753) + +[node name="CSGBox3D18" type="CSGBox3D" parent="Greybox"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.534, 10.9583, -4.19618) +use_collision = true +size = Vector3(1.10791, 1.71436, 23.4043) diff --git a/scenes/player.tscn b/scenes/player.tscn index 3c7663e..e4319fd 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -6,3 +6,13 @@ [node name="HealthSystem" parent="." index="3"] ThresholdVelYForDamage = 0.0 + +[node name="Stamina" parent="." index="4"] +MaxRunTime = 1000.0 + +[node name="Gravity" parent="." index="8"] +AdditionalGravityPower = 4.02 + +[node name="Bobbing" parent="." index="9"] +BobbingFrequency = 1.41 +BobbingAmplitude = 0.05