diff --git a/interfaces/ITargetable.cs b/interfaces/ITargetable.cs new file mode 100644 index 00000000..89cf11a6 --- /dev/null +++ b/interfaces/ITargetable.cs @@ -0,0 +1,8 @@ +using Godot; + +namespace Movementtests.interfaces; + +public interface ITargetable +{ + Vector3 GetTargetGlobalPosition(); +} \ No newline at end of file diff --git a/interfaces/ITargetable.cs.uid b/interfaces/ITargetable.cs.uid new file mode 100644 index 00000000..a4997c20 --- /dev/null +++ b/interfaces/ITargetable.cs.uid @@ -0,0 +1 @@ +uid://c7t7d18oi72pj diff --git a/player_controller/PlayerController.tscn b/player_controller/PlayerController.tscn index 1fe62036..7c00a0ba 100644 --- a/player_controller/PlayerController.tscn +++ b/player_controller/PlayerController.tscn @@ -446,6 +446,7 @@ layout_mode = 2 [node name="EnemyTarget" type="TextureRect" parent="UI"] unique_name_in_owner = true +modulate = Color(0.9882353, 0, 0.10980392, 1) layout_mode = 1 anchors_preset = 8 anchor_left = 0.5 diff --git a/player_controller/PlayerUi.cs b/player_controller/PlayerUi.cs index 23b87e3a..26b7691e 100644 --- a/player_controller/PlayerUi.cs +++ b/player_controller/PlayerUi.cs @@ -29,8 +29,10 @@ public partial class PlayerUi : Control var (state, position) = targetProperties; var visible = state != TargetState.NoTarget; + var modulation = state == TargetState.TargetInRange ? new Color("ffffff") : new Color("fc001c"); _enemyTarget.SetVisible(visible); - _enemyTarget.SetPosition(position); + _enemyTarget.SetPosition(position - _enemyTarget.Size / 2); + _enemyTarget.SetModulate(modulation); } diff --git a/player_controller/Scripts/PlayerController.cs b/player_controller/Scripts/PlayerController.cs index 19f24627..f03d2cc0 100644 --- a/player_controller/Scripts/PlayerController.cs +++ b/player_controller/Scripts/PlayerController.cs @@ -71,16 +71,18 @@ public partial class PlayerController : CharacterBody3D, [Export] public Marker3D TutorialWeaponTarget; [Export] public bool TutorialDone { get; set; } + // Combat stuff [ExportCategory("Combat")] [ExportGroup("Damage")] - [Export] - public RDamage RDamage { get; set; } + [Export] public RDamage RDamage { get; set; } + [Export] public RKnockback RKnockback { get; set; } + [Export] public RHealth RHealth { get; set; } - [Export] - public RKnockback RKnockback { get; set; } + [Export(PropertyHint.Range, "0,20,0.1,or_greater")] + public float TargetingDistance { get; set; } = 10.0f; - [Export] - public RHealth RHealth { get; set; } + [Export(PropertyHint.Range, "0,20,0.1,or_greater")] + public float TargetInRangeDistance { get; set; } = 5.0f; // Movement stuff [ExportCategory("Movement")] @@ -355,6 +357,7 @@ public partial class PlayerController : CharacterBody3D, // General use stuff PlayerUi = GetNode("UI"); _closeEnemyDetector = GetNode("%CloseEnemyDetector"); + _closeEnemyDetector.TargetPosition = _closeEnemyDetector.TargetPosition.Normalized() * TargetingDistance; // DashIndicator = GetNode("%DashIndicator"); PowerCooldownIndicator = GetNode("%DashCooldownIndicator"); @@ -1831,15 +1834,18 @@ public partial class PlayerController : CharacterBody3D, PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen)); return; } + var collidedObject = _closeEnemyDetector.GetCollider(0); - if (collidedObject is not Node3D target) + if (collidedObject is not ITargetable target) { PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen)); return; } - enemyTargetState = PlayerUi.TargetState.TargetInRange; - positionOnScreen = _camera.UnprojectPosition(target.GlobalPosition); + var targetPos = target.GetTargetGlobalPosition(); + var targetDistance = targetPos.DistanceTo(GlobalPosition); + enemyTargetState = targetDistance > TargetInRangeDistance ? PlayerUi.TargetState.TargetInRange : PlayerUi.TargetState.TargetTooFar; + positionOnScreen = _camera.UnprojectPosition(targetPos); PlayerUi.SetEnemyTargetProperties(new PlayerUi.TargetProperties(enemyTargetState, positionOnScreen)); } diff --git a/scenes/enemies/Enemy.cs b/scenes/enemies/Enemy.cs index 1b2da965..b7d80fbd 100644 --- a/scenes/enemies/Enemy.cs +++ b/scenes/enemies/Enemy.cs @@ -10,7 +10,8 @@ public partial class Enemy : CharacterBody3D, IKillable, IMoveable, ISpawnable, - IKnockbackable + IKnockbackable, + ITargetable { // Signals and events public event Action DamageTaken; @@ -156,4 +157,11 @@ public partial class Enemy : CharacterBody3D, if (CKnockback is null) return Vector3.Zero; return CKnockback.ComputeKnockback(); } + + public Vector3 GetTargetGlobalPosition() + { + var target = GetNode("CTarget"); + if (target is null) return GlobalPosition; + return target.GlobalPosition; + } } diff --git a/scenes/enemies/grounded_enemy/grounded_enemy.tscn b/scenes/enemies/grounded_enemy/grounded_enemy.tscn index b7a0fb0c..6bc10910 100644 --- a/scenes/enemies/grounded_enemy/grounded_enemy.tscn +++ b/scenes/enemies/grounded_enemy/grounded_enemy.tscn @@ -38,18 +38,14 @@ albedo_color = Color(0.06469653, 0.06469653, 0.06469653, 1) [sub_resource type="BoxShape3D" id="BoxShape3D_4yfjf"] size = Vector3(1, 2, 1.5) -[node name="GroundedEnemy" type="CharacterBody3D" node_paths=PackedStringArray("CHealth", "CDamage", "CKnockback", "CMovement")] +[node name="GroundedEnemy" type="CharacterBody3D"] collision_layer = 16 collision_mask = 273 script = ExtResource("1_r6506") -CHealth = NodePath("CHealth") RHealth = ExtResource("2_w4lm8") DeathEffects = Array[Object]([]) -CDamage = NodePath("CDamageable") RDamage = ExtResource("2_bn56u") -CKnockback = NodePath("CKnockback") RKnockback = ExtResource("11_8k3xb") -CMovement = NodePath("CMovement") RMovement = ExtResource("4_na24f") [node name="CHealth" type="Node" parent="."] @@ -68,6 +64,9 @@ WallInFrontRayCast = NodePath("../WallInFrontRayCast") [node name="CKnockback" parent="." instance=ExtResource("10_jqqi6")] +[node name="CTarget" type="Marker3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) + [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) shape = SubResource("CapsuleShape3D_62kkh")