diff --git a/maps/GYMs/enemies.tscn b/maps/GYMs/enemies.tscn index f4974cd5..c2c87dc3 100644 --- a/maps/GYMs/enemies.tscn +++ b/maps/GYMs/enemies.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=23 format=3 uid="uid://q7uc1h2jpbd2"] +[gd_scene load_steps=21 format=3 uid="uid://q7uc1h2jpbd2"] [ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://player_controller/PlayerController.tscn" id="1_62kkh"] [ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/greybox/m_greybox.tres" id="2_3uydm"] @@ -6,7 +6,6 @@ [ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/grounded_enemy/grounded_enemy.tscn" id="3_3uydm"] [ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy/flying_enemy.tscn" id="5_8fd2t"] [ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://components/movement/RMovement.cs" id="5_ybosk"] -[ext_resource type="Script" uid="uid://b44cse62qru7j" path="res://components/knockback/RKnockback.cs" id="6_1hrkh"] [ext_resource type="PackedScene" uid="uid://c305mfrtumcyq" path="res://scenes/spawners/spawner.tscn" id="6_7m3bq"] [ext_resource type="Resource" uid="uid://bqq6uukbdfysr" path="res://scenes/enemies/grounded_enemy/grounded_enemy_movement.tres" id="7_caohq"] [ext_resource type="Script" uid="uid://baiapod3csndf" path="res://components/health/RHealth.cs" id="9_2e4ci"] @@ -43,10 +42,6 @@ ssil_radius = 8.4 sdfgi_use_occlusion = true glow_enabled = true -[sub_resource type="Resource" id="Resource_q21h6"] -script = ExtResource("6_1hrkh") -metadata/_custom_type_script = "uid://b44cse62qru7j" - [sub_resource type="Resource" id="Resource_5fa36"] script = ExtResource("5_ybosk") GravityModifier = 5.0 @@ -142,7 +137,6 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9, 3.5, 2.5) [node name="Enemy" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 13.5, 2.5, -8.336809) Target = NodePath("../Player") -RKnockback = SubResource("Resource_q21h6") RMovement = SubResource("Resource_5fa36") [node name="Enemy2" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")] diff --git a/player_controller/PlayerController.tscn b/player_controller/PlayerController.tscn index 7f16f62b..34eb1e71 100644 --- a/player_controller/PlayerController.tscn +++ b/player_controller/PlayerController.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=65 format=3 uid="uid://bei4nhkf8lwdo"] +[gd_scene load_steps=66 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="PackedScene" uid="uid://cf3rrgr1imvv4" path="res://scenes/path/path.tscn" id="2_6lejt"] @@ -99,6 +99,9 @@ height = 3.5 [sub_resource type="SphereShape3D" id="SphereShape3D_nob5r"] radius = 0.4 +[sub_resource type="SphereShape3D" id="SphereShape3D_ue7xq"] +radius = 1.5 + [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_2q0ik"] blend_mode = 1 @@ -355,6 +358,16 @@ collision_mask = 256 target_position = Vector3(0, -2, 0) collision_mask = 256 +[node name="SlidingEnemyDetector" type="Area3D" parent="."] +collision_layer = 0 +collision_mask = 16 +monitoring = false +monitorable = false + +[node name="CollisionShape3D" type="CollisionShape3D" parent="SlidingEnemyDetector"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("SphereShape3D_ue7xq") + [node name="InvincibilityTime" type="Timer" parent="."] one_shot = true diff --git a/player_controller/Scripts/PlayerController.cs b/player_controller/Scripts/PlayerController.cs index b1c51a3c..b667f7ce 100644 --- a/player_controller/Scripts/PlayerController.cs +++ b/player_controller/Scripts/PlayerController.cs @@ -67,7 +67,9 @@ public partial class PlayerController : CharacterBody3D, public RayCast3D DirectGroundDetector; public Area3D WeaponHitbox; public AudioStreamPlayer3D SfxPlayer; + public ShapeCast3D DashDamageDetector; + public Area3D SlidingEnemyDetector; // Inspector stuff [Export] public Marker3D TutorialWeaponTarget; @@ -393,6 +395,7 @@ public partial class PlayerController : CharacterBody3D, CeilingDetector = GetNode("CeilingDetector"); DirectGroundDetector = GetNode("DirectGroundDetector"); DashDamageDetector = GetNode("DashDamage"); + SlidingEnemyDetector = GetNode("SlidingEnemyDetector"); RayCast3D stairsBelowRayCast3D = GetNode("StairsBelowRayCast3D"); RayCast3D stairsAheadRayCast3D = GetNode("StairsAheadRayCast3D"); _headCollisionDetectors = new RayCast3D[NUM_OF_HEAD_COLLISION_DETECTORS]; @@ -547,6 +550,7 @@ public partial class PlayerController : CharacterBody3D, _weaponDash.StateExited += OnWeaponDashFinished; + SlidingEnemyDetector.BodyEntered += EnemyHitWhileSliding; _sliding.StateEntered += SlideStarted; _sliding.StateExited += SlideEnded; _slideCanceled.StateEntered += OnSlideCanceled; @@ -1413,8 +1417,11 @@ public partial class PlayerController : CharacterBody3D, public void SlideStarted() { _targetSpeed = Velocity.Length(); - SetupSlideCollision(); _audioStream!.SwitchToClipByName("glide"); + SetupSlideCollision(); + + SlidingEnemyDetector.Monitoring = true; + _isInvincible = true; } public bool CanStandUpFromSlide() @@ -1540,11 +1547,22 @@ public partial class PlayerController : CharacterBody3D, } public void SlideEnded() { - _audioStream!.SwitchToClipByName("footsteps"); + SlidingEnemyDetector.Monitoring = false; + _isInvincible = false; + SetupStandingCollision(); + _audioStream!.SwitchToClipByName("footsteps"); _targetSpeed = WalkSpeed; } + public void EnemyHitWhileSliding(Node enemy) + { + if(enemy is not IDamageable damageable) + return; + _hitEnemies.Add(damageable); + TriggerDamage(); + } + public void JumpFromGroundSlide() { _jumpStrengthMultiplier = GroundSlideJumpMultiplier + Velocity.Length()*GroundSlideJumpSpeedFactor; diff --git a/systems/weapon/WeaponSystem.cs b/systems/weapon/WeaponSystem.cs index 18750a24..4eb61c32 100644 --- a/systems/weapon/WeaponSystem.cs +++ b/systems/weapon/WeaponSystem.cs @@ -1,10 +1,12 @@ using System; using Godot; using GodotStateCharts; +using Movementtests.interfaces; +using Movementtests.systems.damage; namespace Movementtests.systems; -public partial class WeaponSystem : RigidBody3D +public partial class WeaponSystem : RigidBody3D, IDamageDealer { [Signal] public delegate void WeaponThrownEventHandler(); @@ -12,6 +14,8 @@ public partial class WeaponSystem : RigidBody3D [Signal] public delegate void WeaponRetrievedEventHandler(); + [Export] + public RDamage RDamage { get; set; } [Export(PropertyHint.Range, "0,100,1,or_greater")] public float ThrowForce { get; set; } = 1f; [Export(PropertyHint.Range, "0,0.2,0.01,or_greater")] @@ -107,6 +111,17 @@ public partial class WeaponSystem : RigidBody3D tween.Finished += ThrowWeaponOnCurve; } + public void PlantInEnemy(Node3D enemy) + { + GetTree().GetRoot().CallDeferred(Node.MethodName.RemoveChild, this); + enemy.CallDeferred(Node.MethodName.AddChild, this); + + if (enemy is IDamageable damageable) + { + damageable.TakeDamage(new DamageRecord(this, RDamage)); + } + } + public void RethrowWeapon() { _weaponState.SendEvent("throw"); @@ -130,8 +145,7 @@ public partial class WeaponSystem : RigidBody3D // WeaponLocationIndicatorMaterial.StencilColor = new Color(1f, 0.2f, 0.2f); if (PlantObject is Node3D node) { - GetTree().GetRoot().CallDeferred(Node.MethodName.RemoveChild, this); - node.CallDeferred(Node.MethodName.AddChild, this); + PlantInEnemy(node); } CallDeferred(Node3D.MethodName.SetGlobalPosition, PlantLocation); CallDeferred(Node3D.MethodName.LookAt, GlobalTransform.Origin + PlantNormal, Vector3.Up, true); diff --git a/systems/weapon/weapon.tscn b/systems/weapon/weapon.tscn index 76566e39..2738b145 100644 --- a/systems/weapon/weapon.tscn +++ b/systems/weapon/weapon.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=12 format=3 uid="uid://ckm3d6k08a72u"] +[gd_scene load_steps=14 format=3 uid="uid://ckm3d6k08a72u"] [ext_resource type="Script" uid="uid://iii3wfto4t5b" path="res://systems/weapon/WeaponSystem.cs" id="1_csqwk"] +[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://components/damage/RDamage.cs" id="2_m0v1h"] [ext_resource type="PackedScene" uid="uid://dbe5f0p6lvqtr" path="res://systems/tween_queue/tween_queue_system.tscn" id="2_x1nha"] [ext_resource type="Script" uid="uid://couw105c3bde4" path="res://addons/godot_state_charts/state_chart.gd" id="3_5owyf"] [ext_resource type="ArrayMesh" uid="uid://cho5fixitrbds" path="res://assets/swords/resources/sword23.tres" id="3_svc06"] @@ -8,6 +9,11 @@ [ext_resource type="Script" uid="uid://cytafq8i1y8qm" path="res://addons/godot_state_charts/atomic_state.gd" id="5_m0v1h"] [ext_resource type="Script" uid="uid://cf1nsco3w0mf6" path="res://addons/godot_state_charts/transition.gd" id="6_jpdh0"] +[sub_resource type="Resource" id="Resource_jpdh0"] +script = ExtResource("2_m0v1h") +DamageDealt = 2.0 +metadata/_custom_type_script = "uid://jitubgv6judn" + [sub_resource type="CylinderShape3D" id="CylinderShape3D_avini"] height = 1.0 radius = 0.1 @@ -43,6 +49,7 @@ continuous_cd = true contact_monitor = true max_contacts_reported = 1 script = ExtResource("1_csqwk") +RDamage = SubResource("Resource_jpdh0") [node name="TweenQueueSystem" parent="." instance=ExtResource("2_x1nha")]