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

@@ -0,0 +1,9 @@
using Godot;
namespace Movementtests.interfaces;
public interface IDamageMaker
{
[Export]
public RDamage GetDamageDealt { get; set; }
}

View File

@@ -0,0 +1 @@
uid://wdqo51131g5

View File

@@ -2,5 +2,5 @@ namespace Movementtests.interfaces;
public interface IDamageable public interface IDamageable
{ {
void TakeDamage(); void TakeDamage(RDamage damage);
} }

View File

@@ -1,11 +1,19 @@
[gd_scene load_steps=15 format=3 uid="uid://q7uc1h2jpbd2"] [gd_scene load_steps=19 format=3 uid="uid://q7uc1h2jpbd2"]
[ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://player_controller/PlayerController.tscn" id="1_62kkh"] [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"] [ext_resource type="Material" uid="uid://31aulub2nqov" path="res://assets/greybox/m_greybox.tres" id="2_3uydm"]
[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://resource_definitions/RDamage.cs" id="2_sysok"]
[ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/first_enemy.tscn" id="3_3uydm"] [ext_resource type="PackedScene" uid="uid://dxt0e2ugmttqq" path="res://scenes/enemies/first_enemy.tscn" id="3_3uydm"]
[ext_resource type="Script" uid="uid://b2vdwkiqauhk3" path="res://scenes/enemies/EnemyInitInputs.cs" id="4_nd7vd"] [ext_resource type="Script" uid="uid://b2vdwkiqauhk3" path="res://scenes/enemies/EnemyInitInputs.cs" id="4_nd7vd"]
[ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy.tscn" id="5_8fd2t"] [ext_resource type="PackedScene" uid="uid://cmlud1hwkd6sv" path="res://scenes/enemies/flying_enemy.tscn" id="5_8fd2t"]
[ext_resource type="Script" uid="uid://do0dic4r3ri0s" path="res://scenes/enemies/FlyingEnemyInputs.cs" id="6_7m3bq"] [ext_resource type="Script" uid="uid://do0dic4r3ri0s" path="res://scenes/enemies/FlyingEnemyInputs.cs" id="6_7m3bq"]
[ext_resource type="Resource" uid="uid://otfc2snh8umc" path="res://scenes/enemies/first_enemy_damage.tres" id="6_dmw1t"]
[ext_resource type="Resource" uid="uid://dgo65k2ceqfvy" path="res://scenes/enemies/flying_enemy_damage.tres" id="9_gp7s3"]
[sub_resource type="Resource" id="Resource_gp7s3"]
script = ExtResource("2_sysok")
DamageDealt = 3.0
metadata/_custom_type_script = "uid://jitubgv6judn"
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_0xm2m"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_0xm2m"]
sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1) sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
@@ -61,6 +69,7 @@ metadata/_custom_type_script = "uid://do0dic4r3ri0s"
[node name="Player" parent="." instance=ExtResource("1_62kkh")] [node name="Player" parent="." instance=ExtResource("1_62kkh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 7.5) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 7.5)
TutorialDone = true TutorialDone = true
GetDamageDealt = SubResource("Resource_gp7s3")
[node name="WorldEnvironment" type="WorldEnvironment" parent="."] [node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_1bvp3") environment = SubResource("Environment_1bvp3")
@@ -126,23 +135,28 @@ material = ExtResource("2_3uydm")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -16.83681) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -16.83681)
Target = NodePath("../Player") Target = NodePath("../Player")
Inputs = SubResource("Resource_8fd2t") Inputs = SubResource("Resource_8fd2t")
GetDamageDealt = ExtResource("6_dmw1t")
[node name="Enemy2" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")] [node name="Enemy2" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0, -16.83681) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3, 0, -16.83681)
Target = NodePath("../Player") Target = NodePath("../Player")
Inputs = SubResource("Resource_7m3bq") Inputs = SubResource("Resource_7m3bq")
GetDamageDealt = ExtResource("6_dmw1t")
[node name="Enemy3" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")] [node name="Enemy3" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("3_3uydm")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, -16.83681) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, -16.83681)
Target = NodePath("../Player") Target = NodePath("../Player")
Inputs = SubResource("Resource_sysok") Inputs = SubResource("Resource_sysok")
GetDamageDealt = ExtResource("6_dmw1t")
[node name="FlyingEnemy" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("5_8fd2t")] [node name="FlyingEnemy" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("5_8fd2t")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8, 7, -16) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8, 7, -16)
Target = NodePath("../Player") Target = NodePath("../Player")
Inputs = SubResource("Resource_caohq") Inputs = SubResource("Resource_caohq")
GetDamageDealt = ExtResource("9_gp7s3")
[node name="FlyingEnemy2" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("5_8fd2t")] [node name="FlyingEnemy2" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("5_8fd2t")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 7, -16) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 7, -16)
Target = NodePath("../Player") Target = NodePath("../Player")
Inputs = SubResource("Resource_dmw1t") Inputs = SubResource("Resource_dmw1t")
GetDamageDealt = ExtResource("9_gp7s3")

View File

@@ -7,7 +7,7 @@ using Movementtests.systems;
using Movementtests.player_controller.Scripts; using Movementtests.player_controller.Scripts;
using RustyOptions; using RustyOptions;
public partial class PlayerController : CharacterBody3D, IDamageable, IKnockbackable public partial class PlayerController : CharacterBody3D, IDamageable, IKnockbackable, IDamageMaker
{ {
// Enums // Enums
public enum AllowedInputs public enum AllowedInputs
@@ -59,6 +59,11 @@ public partial class PlayerController : CharacterBody3D, IDamageable, IKnockback
[Export] public Marker3D TutorialWeaponTarget; [Export] public Marker3D TutorialWeaponTarget;
[Export] public bool TutorialDone { get; set; } [Export] public bool TutorialDone { get; set; }
[ExportCategory("Combat")]
[ExportGroup("Damage")]
[Export]
public RDamage GetDamageDealt { get; set; }
[ExportCategory("Movement")] [ExportCategory("Movement")]
[ExportGroup("Ground")] [ExportGroup("Ground")]
[Export(PropertyHint.Range, "0,20,0.1,or_greater")] [Export(PropertyHint.Range, "0,20,0.1,or_greater")]
@@ -1571,26 +1576,6 @@ public partial class PlayerController : CharacterBody3D, IDamageable, IKnockback
DashIndicatorMesh.Visible = false; DashIndicatorMesh.Visible = false;
} }
///////////////////////////
// Hit Management ///////
///////////////////////////
public void OnInputHitPressed()
{
if (_aiming.Active && WeaponSystem.InHandState.Active)
{
ThrowWeapon();
}
if (!WeaponSystem.InHandState.Active) return;
var bodies = WeaponHitbox.GetOverlappingBodies();
foreach (var body in bodies)
{
if(body is IDamageable spawnable)
spawnable.TakeDamage();
}
}
/////////////////////////// ///////////////////////////
// Parry Management /////// // Parry Management ///////
/////////////////////////// ///////////////////////////
@@ -1741,9 +1726,29 @@ public partial class PlayerController : CharacterBody3D, IDamageable, IKnockback
DashIndicatorNode.LookAt(WeaponSystem.GlobalPosition); DashIndicatorNode.LookAt(WeaponSystem.GlobalPosition);
} }
} }
public void TakeDamage() public void TakeDamage(RDamage damage)
{ {
GD.Print("Ouch!"); GD.Print("Ouch", damage.DamageDealt);
}
///////////////////////////
// Hit Management ///////
///////////////////////////
public void OnInputHitPressed()
{
if (_aiming.Active && WeaponSystem.InHandState.Active)
{
ThrowWeapon();
}
if (!WeaponSystem.InHandState.Active) return;
var bodies = WeaponHitbox.GetOverlappingBodies();
foreach (var body in bodies)
{
if(body is IDamageable spawnable)
spawnable.TakeDamage(GetDamageDealt);
}
} }
} }

View File

@@ -0,0 +1,18 @@
using Godot;
using System;
[GlobalClass]
public partial class RDamage : Resource
{
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float DamageDealt;
public RDamage()
{
DamageDealt = 1.0f;
}
public RDamage(float damageDealt)
{
DamageDealt = damageDealt;
}
}

View File

@@ -0,0 +1 @@
uid://jitubgv6judn

View File

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

View File

@@ -4,13 +4,16 @@ using Movementtests.interfaces;
[GlobalClass] [GlobalClass]
public partial class FirstEnemy : CharacterBody3D, IDamageable, IKillable, IKnockbackable public partial class FirstEnemy : CharacterBody3D, IDamageable, IKillable, IKnockbackable, IDamageMaker
{ {
[Export] [Export]
public Node3D Target { get; set; } public Node3D Target { get; set; }
[Export] [Export]
public EnemyInitInputs Inputs; public EnemyInitInputs Inputs;
[Export]
public RDamage GetDamageDealt { get; set; }
private RayCast3D _wallInFrontRayCast; private RayCast3D _wallInFrontRayCast;
private Area3D _damageBox; private Area3D _damageBox;
@@ -22,11 +25,6 @@ public partial class FirstEnemy : CharacterBody3D, IDamageable, IKillable, IKnoc
_damageBox.BodyEntered += OnDamageBoxTriggered; _damageBox.BodyEntered += OnDamageBoxTriggered;
} }
public void OnDamageBoxTriggered(Node3D body)
{
if(body is IDamageable damageable) damageable.TakeDamage();
}
public override void _PhysicsProcess(double delta) public override void _PhysicsProcess(double delta)
{ {
var target = Target.GlobalPosition; var target = Target.GlobalPosition;
@@ -48,8 +46,13 @@ public partial class FirstEnemy : CharacterBody3D, IDamageable, IKillable, IKnoc
MoveAndSlide(); 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; using Movementtests.interfaces;
[GlobalClass] [GlobalClass]
public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKnockbackable public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKnockbackable, IDamageMaker
{ {
[Export] [Export]
public Node3D Target { get; set; } public Node3D Target { get; set; }
[Export] [Export]
public FlyingEnemyInputs Inputs; public FlyingEnemyInputs Inputs { get; set; }
[Export]
public RDamage GetDamageDealt { get; set; }
private RayCast3D _groundDistanceRaycast; private RayCast3D _groundDistanceRaycast;
private Area3D _damageBox; private Area3D _damageBox;
@@ -20,7 +23,7 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKno
public override void _Ready() public override void _Ready()
{ {
_groundDistanceRaycast = GetNode<RayCast3D>("GroundDistance"); _groundDistanceRaycast = GetNode<RayCast3D>("GroundDistance");
_groundDistanceRaycast.TargetPosition = new Vector3(0, -Inputs.TargetHeight, 0); _groundDistanceRaycast.TargetPosition = new Vector3(0, 0, 0);
_damageBox = GetNode<Area3D>("DamageBox"); _damageBox = GetNode<Area3D>("DamageBox");
_damageBox.BodyEntered += OnDamageBoxTriggered; _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(); _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) public override void _PhysicsProcess(double delta)
{ {
var spaceState = GetWorld3D().DirectSpaceState;
var target = Target.GlobalPosition; var target = Target.GlobalPosition;
var direction = (target - GlobalPosition).Normalized(); var direction = (target - GlobalPosition).Normalized();
Vector3 velocity = Velocity; Vector3 velocity = Velocity;
var targetPlane = new Vector3(target.X, GlobalPosition.Y, target.Z); LookAt(target);
LookAt(targetPlane);
// Check if we have a direct line of sight to the player // Check if we have a direct line of sight to the player
if (!_movingToDesiredHeight) if (!_movingToDesiredHeight)
{ {
velocity = direction * Inputs.Speed; velocity = direction * Inputs.Speed;
var spaceState = GetWorld3D().DirectSpaceState;
var query = PhysicsRayQueryParameters3D.Create(GlobalPosition, target, _groundDistanceRaycast.CollisionMask); var query = PhysicsRayQueryParameters3D.Create(GlobalPosition, target, _groundDistanceRaycast.CollisionMask);
var result = spaceState.IntersectRay(query); var result = spaceState.IntersectRay(query);
if (result.Count > 0) if (result.Count > 0)
@@ -60,11 +57,12 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKno
{ {
velocity = _randomDirection * Inputs.Speed; 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; velocity.Y = 0;
var spaceState = GetWorld3D().DirectSpaceState;
var query = PhysicsRayQueryParameters3D.Create(GlobalPosition, target, _groundDistanceRaycast.CollisionMask); var query = PhysicsRayQueryParameters3D.Create(GlobalPosition, target, _groundDistanceRaycast.CollisionMask);
var result = spaceState.IntersectRay(query); var result = spaceState.IntersectRay(query);
if (result.Count == 0) if (result.Count == 0)
@@ -78,8 +76,13 @@ public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKno
MoveAndSlide(); 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 public partial class FlyingEnemyInputs : Resource
{ {
[Export(PropertyHint.Range, "0,10,0.1,or_greater")] [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")] [Export(PropertyHint.Range, "0,100,1,or_greater")]
public float TargetHeight = 50.0f; public float TargetHeight;
public FlyingEnemyInputs() 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"