some damage interfacing

This commit is contained in:
2026-01-17 11:02:17 +01:00
parent 5908494977
commit b1e78df6c7
13 changed files with 122 additions and 52 deletions

View File

@@ -5,7 +5,7 @@ using System;
public partial class EnemyInitInputs : Resource
{
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float Speed = 5.0f;
public float Speed;
public EnemyInitInputs()
{

View File

@@ -4,13 +4,16 @@ using Movementtests.interfaces;
[GlobalClass]
public partial class FirstEnemy : CharacterBody3D, IDamageable, IKillable, IKnockbackable
public partial class FirstEnemy : CharacterBody3D, IDamageable, IKillable, IKnockbackable, IDamageMaker
{
[Export]
public Node3D Target { get; set; }
[Export]
public EnemyInitInputs Inputs;
[Export]
public RDamage GetDamageDealt { get; set; }
private RayCast3D _wallInFrontRayCast;
private Area3D _damageBox;
@@ -22,11 +25,6 @@ public partial class FirstEnemy : CharacterBody3D, IDamageable, IKillable, IKnoc
_damageBox.BodyEntered += OnDamageBoxTriggered;
}
public void OnDamageBoxTriggered(Node3D body)
{
if(body is IDamageable damageable) damageable.TakeDamage();
}
public override void _PhysicsProcess(double delta)
{
var target = Target.GlobalPosition;
@@ -48,8 +46,13 @@ public partial class FirstEnemy : CharacterBody3D, IDamageable, IKillable, IKnoc
MoveAndSlide();
}
public void TakeDamage()
public void OnDamageBoxTriggered(Node3D body)
{
GD.Print("Emotional daaamaaage!");
if(body is IDamageable damageable) damageable.TakeDamage(GetDamageDealt);
}
public void TakeDamage(RDamage damage)
{
GD.Print("Emotional daaamaaage!", damage.DamageDealt);
}
}

View File

@@ -3,13 +3,16 @@ using System;
using Movementtests.interfaces;
[GlobalClass]
public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKnockbackable
public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKnockbackable, IDamageMaker
{
[Export]
public Node3D Target { get; set; }
[Export]
public FlyingEnemyInputs Inputs;
public FlyingEnemyInputs Inputs { get; set; }
[Export]
public RDamage GetDamageDealt { get; set; }
private RayCast3D _groundDistanceRaycast;
private Area3D _damageBox;
@@ -20,7 +23,7 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKno
public override void _Ready()
{
_groundDistanceRaycast = GetNode<RayCast3D>("GroundDistance");
_groundDistanceRaycast.TargetPosition = new Vector3(0, -Inputs.TargetHeight, 0);
_groundDistanceRaycast.TargetPosition = new Vector3(0, 0, 0);
_damageBox = GetNode<Area3D>("DamageBox");
_damageBox.BodyEntered += OnDamageBoxTriggered;
@@ -28,26 +31,20 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKno
_randomDirection = new Vector3(GD.RandRange(-1, 1), 1, GD.RandRange(-1, 1)).Normalized();
}
public void OnDamageBoxTriggered(Node3D body)
{
if(body is IDamageable damageable) damageable.TakeDamage();
}
public override void _PhysicsProcess(double delta)
{
var spaceState = GetWorld3D().DirectSpaceState;
var target = Target.GlobalPosition;
var direction = (target - GlobalPosition).Normalized();
Vector3 velocity = Velocity;
var targetPlane = new Vector3(target.X, GlobalPosition.Y, target.Z);
LookAt(targetPlane);
LookAt(target);
// Check if we have a direct line of sight to the player
if (!_movingToDesiredHeight)
{
velocity = direction * Inputs.Speed;
var spaceState = GetWorld3D().DirectSpaceState;
var query = PhysicsRayQueryParameters3D.Create(GlobalPosition, target, _groundDistanceRaycast.CollisionMask);
var result = spaceState.IntersectRay(query);
if (result.Count > 0)
@@ -60,11 +57,12 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKno
{
velocity = _randomDirection * Inputs.Speed;
if (!_groundDistanceRaycast.IsColliding())
var groundQuery = PhysicsRayQueryParameters3D.Create(GlobalPosition, GlobalPosition+Vector3.Down*Inputs.TargetHeight, _groundDistanceRaycast.CollisionMask);
var groundResult = spaceState.IntersectRay(groundQuery);
if (groundResult.Count == 0)
{
velocity.Y = 0;
var spaceState = GetWorld3D().DirectSpaceState;
var query = PhysicsRayQueryParameters3D.Create(GlobalPosition, target, _groundDistanceRaycast.CollisionMask);
var result = spaceState.IntersectRay(query);
if (result.Count == 0)
@@ -78,8 +76,13 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKno
MoveAndSlide();
}
public void TakeDamage()
public void OnDamageBoxTriggered(Node3D body)
{
GD.Print("Oh no I'm falling");
if(body is IDamageable damageable) damageable.TakeDamage(GetDamageDealt);
}
public void TakeDamage(RDamage damage)
{
GD.Print("Oh no I'm falling!", damage.DamageDealt);
}
}

View File

@@ -5,10 +5,10 @@ using System;
public partial class FlyingEnemyInputs : Resource
{
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float Speed = 5.0f;
public float Speed;
[Export(PropertyHint.Range, "0,100,1,or_greater")]
public float TargetHeight = 50.0f;
public float TargetHeight;
public FlyingEnemyInputs()
{

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="RDamage" load_steps=2 format=3 uid="uid://otfc2snh8umc"]
[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://resource_definitions/RDamage.cs" id="1_y415a"]
[resource]
script = ExtResource("1_y415a")
DamageDealt = 2.0
metadata/_custom_type_script = "uid://jitubgv6judn"

View File

@@ -0,0 +1,8 @@
[gd_resource type="Resource" script_class="RDamage" load_steps=2 format=3 uid="uid://dgo65k2ceqfvy"]
[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://resource_definitions/RDamage.cs" id="1_h6law"]
[resource]
script = ExtResource("1_h6law")
DamageDealt = 1.0
metadata/_custom_type_script = "uid://jitubgv6judn"