export target variables and made a targetable interface
This commit is contained in:
8
interfaces/ITargetable.cs
Normal file
8
interfaces/ITargetable.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.interfaces;
|
||||
|
||||
public interface ITargetable
|
||||
{
|
||||
Vector3 GetTargetGlobalPosition();
|
||||
}
|
||||
1
interfaces/ITargetable.cs.uid
Normal file
1
interfaces/ITargetable.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c7t7d18oi72pj
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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<PlayerUi>("UI");
|
||||
_closeEnemyDetector = GetNode<ShapeCast3D>("%CloseEnemyDetector");
|
||||
_closeEnemyDetector.TargetPosition = _closeEnemyDetector.TargetPosition.Normalized() * TargetingDistance;
|
||||
|
||||
// DashIndicator = GetNode<TextureRect>("%DashIndicator");
|
||||
PowerCooldownIndicator = GetNode<ColorRect>("%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));
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,8 @@ public partial class Enemy : CharacterBody3D,
|
||||
IKillable,
|
||||
IMoveable,
|
||||
ISpawnable,
|
||||
IKnockbackable
|
||||
IKnockbackable,
|
||||
ITargetable
|
||||
{
|
||||
// Signals and events
|
||||
public event Action<IDamageable, DamageRecord> 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<Node3D>("CTarget");
|
||||
if (target is null) return GlobalPosition;
|
||||
return target.GlobalPosition;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user