Damage dealing through meta attribute and custom exec
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 30s
Create tag and build when new code gets to main / Export (push) Successful in 6m8s

This commit is contained in:
2026-05-03 10:47:56 +02:00
parent 631935fdc8
commit 99f383be00
29 changed files with 453 additions and 143 deletions

View File

@@ -26,6 +26,7 @@ using Movementtests.systems;
using Movementtests.player_controller.Scripts;
using Movementtests.managers;
using Movementtests.tools;
using Movementtests.tools.calculators;
using RustyOptions;
using Node = Godot.Node;
@@ -457,7 +458,7 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
// General use stuff
Attributes = new EntityAttributes([.. ForgeUtils.CollectAttributeList(this)]);
HealthAttribute = Attributes["PlayerAttributeSet.Health"];
HealthAttribute = Attributes["CharacterAttributeSet.Health"];
ManaAttribute = Attributes["PlayerAttributeSet.Mana"];
Tags = new(BaseTags.GetTagContainer());
@@ -666,6 +667,8 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
#endregion
// Forge events
HealthAttribute.OnValueChanged += OnHealthChanged;
var weaponLeftToken = WeaponSystem.Events.Subscribe(WeaponSystem.WeaponStartedFlyingEventTag, OnWeaponLeft);
var weaponLandedToken = WeaponSystem.Events.Subscribe(WeaponSystem.WeaponStoppedFlyingEventTag, OnWeaponLanded);
}
@@ -725,7 +728,7 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
});
}
Events.Subscribe(Tag.RequestTag(TagsManager, "events.combat.damage"), OnDamageReceived);
Events.Subscribe<DamageDone>(Tag.RequestTag(TagsManager, "events.combat.damage"), OnDamageReceived);
Events.Subscribe(Tag.RequestTag(TagsManager, "events.combat.death"), OnDeath);
#endregion
@@ -2642,9 +2645,19 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
}
// Forge Damage handling
public void OnDamageReceived(EventData data)
private void OnHealthChanged(EntityAttribute healthAttribute, int i)
{
if (healthAttribute.CurrentValue > HealthAttribute.Min) return;
var tagsManager = TagsManager;
Events.Raise(new EventData
{
EventTags = Tag.RequestTag(tagsManager, "events.combat.death").GetSingleTagContainer()!,
});
}
public void OnDamageReceived(EventData<DamageDone> data)
{
var newHealth = HealthAttribute.CurrentValue + data.EventMagnitude;
CuesManager.ExecuteCue(
Tag.RequestTag(TagsManager, "cues.resources.health"),
this,
@@ -2657,16 +2670,6 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
{"test", "hello"}
})
);
if (newHealth > HealthAttribute.Min) return;
var tagsManager = TagsManager;
Events.Raise(new EventData
{
EventTags = Tag.RequestTag(tagsManager, "events.combat.death").GetSingleTagContainer()!,
Source = data.Source,
Target = data.Target
});
}
public void OnExecute(IForgeEntity? target, CueParameters? parameters)
@@ -2674,7 +2677,7 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
if (target == null || !parameters.HasValue) return;
float magnitude = parameters.Value.Magnitude;
if (magnitude >= 0) return;
if (magnitude <= 0) return;
HeadSystem.OnGetHit();
_audioStream.SwitchToClipByName("damage_taken");