diff --git a/3D/MapScenes/TestLevel2.tscn b/3D/MapScenes/TestLevel2.tscn index d254e23f..45b65a8e 100644 --- a/3D/MapScenes/TestLevel2.tscn +++ b/3D/MapScenes/TestLevel2.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=431 format=4 uid="uid://cupulrjeeivxm"] +[gd_scene load_steps=432 format=4 uid="uid://cupulrjeeivxm"] [ext_resource type="Script" uid="uid://kno58homctew" path="res://addons/func_godot/src/map/func_godot_map.gd" id="1_amw6e"] [ext_resource type="Resource" uid="uid://cx41lsryg5wpm" path="res://3D/TrenchBroom/map_settings.tres" id="2_smtsr"] @@ -86,6 +86,7 @@ [ext_resource type="PackedScene" uid="uid://dtuxpu88vaini" path="res://3D/Scenes/Triggers/AlarmTrigger_3D.tscn" id="79_yyuc7"] [ext_resource type="Script" uid="uid://00rbjdb4mnb0" path="res://Scripts/Actors/EnemyMarker3D.cs" id="81_khac5"] [ext_resource type="Resource" uid="uid://ccym6mcq4fbul" path="res://Resources/Enemies/Fairy_Guard_3D.tres" id="82_jkdtm"] +[ext_resource type="Resource" uid="uid://4qxicyti4hwr" path="res://Resources/Enemies/Base_Fairy_3D.tres" id="87_yyuc7"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_arple"] albedo_texture = ExtResource("3_bryct") @@ -3551,6 +3552,14 @@ AutoSpawn = true Billboard = true PixelSize = 0.05 +[node name="Enemy_Fairy_Base" type="Marker3D" parent="Enemies"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.6389, 1.42644, 14.2033) +script = ExtResource("81_khac5") +Enemy = ExtResource("87_yyuc7") +AutoSpawn = true +Billboard = true +PixelSize = 0.05 + [node name="Enemy_Fairy_Guard2" type="Marker3D" parent="Enemies"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.9845, 1.42644, 13.3475) script = ExtResource("81_khac5") diff --git a/Scenes/Actors/Generic_Enemy_FSM_3D.tscn b/Scenes/Actors/Generic_Enemy_FSM_3D.tscn index bc44ff54..ab075e71 100644 --- a/Scenes/Actors/Generic_Enemy_FSM_3D.tscn +++ b/Scenes/Actors/Generic_Enemy_FSM_3D.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=32 format=3 uid="uid://bh3vxmqflijgj"] +[gd_scene load_steps=33 format=3 uid="uid://bh3vxmqflijgj"] [ext_resource type="Script" uid="uid://dwregubt4iila" path="res://Scripts/Components/FSM/Enemy/3D/EnemyProxy3D.cs" id="1_a3crc"] [ext_resource type="Resource" uid="uid://ccym6mcq4fbul" path="res://Resources/Enemies/Fairy_Guard_3D.tres" id="2_jgarc"] @@ -24,10 +24,11 @@ [ext_resource type="Script" uid="uid://dmawekjfas6k8" path="res://Scripts/Components/Actors/DamageReceiver3D.cs" id="17_tabhk"] [ext_resource type="Script" uid="uid://cqwvssstkrdmw" path="res://Scripts/Components/Actors/ActorResourceProvider.cs" id="18_4fnoq"] [ext_resource type="Script" uid="uid://dvln1783wvvuw" path="res://Scripts/Components/Actors/ShadowProvider.cs" id="19_4fnoq"] +[ext_resource type="Script" uid="uid://qrdor3gk6x37" path="res://Scripts/Components/FSM/Enemy/3D/GravityProvider.cs" id="25_qg061"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jgarc"] -radius = 0.264547 -height = 0.935884 +radius = 0.343 +height = 0.686 [sub_resource type="AtlasTexture" id="AtlasTexture_ad5n8"] atlas = ExtResource("11_2xi0r") @@ -68,6 +69,7 @@ EnemyFSM = NodePath("StateMachine") EnemyResource = ExtResource("2_jgarc") [node name="CollisionShape2D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.047, 0) shape = SubResource("CapsuleShape3D_jgarc") [node name="StateMachine" type="Node" parent="."] @@ -79,27 +81,30 @@ Storage = NodePath("../../Storage") DetectionProvider = NodePath("../../PlayerDetectionProvider") _moduleNodes = [NodePath("../../AnimationModule")] -[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "_moduleNodes")] +[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "GravityProvider", "_moduleNodes")] script = ExtResource("5_rg1hb") Storage = NodePath("../../Storage") PlayerDetection = NodePath("../../PlayerDetectionProvider") +GravityProvider = NodePath("../../GravityProvider") DebugEnabled = true _moduleNodes = [NodePath("../../DamageModule"), NodePath("../../AnimationModule")] -[node name="Alert" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "NavigationModule", "_moduleNodes")] +[node name="Alert" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "NavigationModule", "GravityProvider", "_moduleNodes")] script = ExtResource("6_jgarc") Storage = NodePath("../../Storage") PlayerDetection = NodePath("../../PlayerDetectionProvider") NavigationModule = NodePath("../../NavigationProvider") +GravityProvider = NodePath("../../GravityProvider") DebugEnabled = true _moduleNodes = [NodePath("../../DamageModule"), NodePath("../../AnimationModule")] -[node name="Shooting" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "EquippedWeapon", "NavigationModule", "_moduleNodes")] +[node name="Shooting" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "EquippedWeapon", "NavigationModule", "GravityProvider", "_moduleNodes")] script = ExtResource("7_rg1hb") Storage = NodePath("../../Storage") PlayerDetection = NodePath("../../PlayerDetectionProvider") EquippedWeapon = NodePath("../../Weapon") NavigationModule = NodePath("../../NavigationProvider") +GravityProvider = NodePath("../../GravityProvider") _moduleNodes = [NodePath("../../DamageModule"), NodePath("../../AnimationModule")] [node name="Dead" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage")] @@ -191,6 +196,11 @@ mesh = SubResource("QuadMesh_05pdu") script = ExtResource("19_4fnoq") CollisionMask = 1 +[node name="GravityProvider" type="Node" parent="."] +script = ExtResource("25_qg061") +Gravity = -20.0 +MaxFallSpeed = 50.0 + [connection signal="body_entered" from="PlayerDetectionProvider" to="PlayerDetectionProvider" method="_on_body_entered"] [connection signal="body_exited" from="PlayerDetectionProvider" to="PlayerDetectionProvider" method="_on_body_exited"] [connection signal="velocity_computed" from="NavigationAgent3D" to="NavigationProvider" method="_on_navigation_agent_3d_velocity_computed"] diff --git a/Scripts/Components/FSM/Enemy/3D/Alert.cs b/Scripts/Components/FSM/Enemy/3D/Alert.cs index ca1934c8..70b614e1 100644 --- a/Scripts/Components/FSM/Enemy/3D/Alert.cs +++ b/Scripts/Components/FSM/Enemy/3D/Alert.cs @@ -11,6 +11,7 @@ public partial class Alert : EnemyStateBase3D [Export] public EnemyStorage3D Storage { get; private set; } [Export] public PlayerDetection3D PlayerDetection { get; private set; } [Export] public NavigationProvider3D NavigationModule { get; private set; } + [Export] public GravityProvider GravityProvider { get; private set; } [Export] public bool DebugEnabled { get; set; } = false; private bool _isPlayerInRange = false; @@ -79,6 +80,12 @@ public partial class Alert : EnemyStateBase3D NavigationModule.Move(Storage.EnemyData.MovementSpeed); + // Calculate gravity + + MainObject.Velocity = new Vector3(MainObject.Velocity.X, GravityProvider.CalculateGravityVelocity(MainObject.Velocity.Y, delta), MainObject.Velocity.Z); + + MainObject.MoveAndSlide(); + //Storage.FacingDirection = MainObject.Velocity.SnapToCardinal().Normalized(); Storage.FacingDirection = MainObject.Velocity.ToVector2().Normalized(); Storage.AimingDirection = Storage.FacingDirection; diff --git a/Scripts/Components/FSM/Enemy/3D/GravityProvider.cs b/Scripts/Components/FSM/Enemy/3D/GravityProvider.cs new file mode 100644 index 00000000..8dc6d083 --- /dev/null +++ b/Scripts/Components/FSM/Enemy/3D/GravityProvider.cs @@ -0,0 +1,16 @@ +using Godot; + +namespace Cirno.Scripts.Components.FSM.Enemy._3D; + +public partial class GravityProvider : Node +{ + [Export] public float Gravity = -9.8f; + [Export] public float MaxFallSpeed = 20f; + + public float CalculateGravityVelocity(float frameVelocityY, double delta) + { + var velocityY = Mathf.Clamp(frameVelocityY + Gravity * (float)delta, -MaxFallSpeed, MaxFallSpeed); + + return velocityY; + } +} \ No newline at end of file diff --git a/Scripts/Components/FSM/Enemy/3D/GravityProvider.cs.uid b/Scripts/Components/FSM/Enemy/3D/GravityProvider.cs.uid new file mode 100644 index 00000000..33585391 --- /dev/null +++ b/Scripts/Components/FSM/Enemy/3D/GravityProvider.cs.uid @@ -0,0 +1 @@ +uid://qrdor3gk6x37 diff --git a/Scripts/Components/FSM/Enemy/3D/Idle.cs b/Scripts/Components/FSM/Enemy/3D/Idle.cs index a0482c54..06e58b91 100644 --- a/Scripts/Components/FSM/Enemy/3D/Idle.cs +++ b/Scripts/Components/FSM/Enemy/3D/Idle.cs @@ -10,6 +10,8 @@ public partial class Idle : EnemyStateBase3D [Export] public EnemyStorage3D Storage { get; private set; } [Export] public PlayerDetection3D PlayerDetection { get; private set; } + [Export] public GravityProvider GravityProvider { get; private set; } + [Export] public bool DebugEnabled { get; set; } = false; private bool _isPlayerInRange = false; @@ -84,6 +86,10 @@ public partial class Idle : EnemyStateBase3D DebugDraw3D.DrawText(MainObject.GlobalPosition - new Vector3(0,16,0), "Idle"); } + + MainObject.Velocity = new Vector3(MainObject.Velocity.X, GravityProvider.CalculateGravityVelocity(MainObject.Velocity.Y, delta), MainObject.Velocity.Z); + + MainObject.MoveAndSlide(); } public override void ProcessState(double delta) diff --git a/Scripts/Components/FSM/Enemy/3D/Init.cs b/Scripts/Components/FSM/Enemy/3D/Init.cs index 8ef54209..55cbf729 100644 --- a/Scripts/Components/FSM/Enemy/3D/Init.cs +++ b/Scripts/Components/FSM/Enemy/3D/Init.cs @@ -15,7 +15,7 @@ public partial class Init : EnemyStateBase3D //DamageReceiver.HealthProvider.MaxResource = StorageModule.Root.EnemyResource.MaxHealth; DetectionProvider.Initialize(MainObject); Storage.AiState = Storage.Root.StartingAiState; - + Storage.HomePosition = MainObject.GlobalPosition; // TODO: Hide wings // TODO: Hide aiming reticule diff --git a/Scripts/Components/FSM/Enemy/3D/NavigationProvider3D.cs b/Scripts/Components/FSM/Enemy/3D/NavigationProvider3D.cs index 7fcb5b6e..510731ee 100644 --- a/Scripts/Components/FSM/Enemy/3D/NavigationProvider3D.cs +++ b/Scripts/Components/FSM/Enemy/3D/NavigationProvider3D.cs @@ -58,7 +58,7 @@ public partial class NavigationProvider3D : Node _on_navigation_agent_3d_velocity_computed(newVelocity); } - _characterBody.MoveAndSlide(); + } public void _on_navigation_agent_3d_velocity_computed(Vector3 safeVelocity) diff --git a/Scripts/Components/FSM/Enemy/3D/Shooting.cs b/Scripts/Components/FSM/Enemy/3D/Shooting.cs index ebde7785..5d00c861 100644 --- a/Scripts/Components/FSM/Enemy/3D/Shooting.cs +++ b/Scripts/Components/FSM/Enemy/3D/Shooting.cs @@ -16,6 +16,8 @@ public partial class Shooting : EnemyStateBase3D [Export] public Weapon3D EquippedWeapon; [Export] public NavigationProvider3D NavigationModule { get; private set; } + [Export] public GravityProvider GravityProvider { get; private set; } + private bool _isPlayerInRange = false; private Vector3? _currentStrafeTarget = null; private float _strafeSpeed => Storage.EnemyData.StrafeSpeed; @@ -99,6 +101,11 @@ public partial class Shooting : EnemyStateBase3D NavigationModule.SetTarget(_currentStrafeTarget.Value); NavigationModule.Move(_strafeSpeed); } + + // Calculate gravity + MainObject.Velocity = new Vector3(MainObject.Velocity.X, GravityProvider.CalculateGravityVelocity(MainObject.Velocity.Y, delta), MainObject.Velocity.Z); + + MainObject.MoveAndSlide(); } private Vector3? CalculateStrafePosition()