more encapsulated effect application

This commit is contained in:
2026-04-01 10:00:22 +02:00
parent 42ff38f39b
commit 1d298b3080
2 changed files with 28 additions and 11 deletions

View File

@@ -1,5 +1,6 @@
using System;
using Gamesmiths.Forge.Abilities;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Cues;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Effects.Components;
@@ -70,4 +71,25 @@ public class ExplodingSwordThrowBehavior<TPayload>(Node3D owner, PackedScene? ex
public void OnEnded(AbilityBehaviorContext context)
{
}
}
}
public class FlyingSwordBehavior(IForgeEntity owner, EffectData effectData) : IAbilityBehavior
{
private ActiveEffectHandle? _effectHandle;
public void OnStarted(AbilityBehaviorContext context)
{
GD.Print("This is applying the periodic effect to the flying weapon");
_effectHandle = owner.EffectsManager.ApplyEffect(new Effect(effectData, new EffectOwnership(owner, owner)));
context.AbilityHandle.CommitAbility();
}
public void OnEnded(AbilityBehaviorContext context)
{
GD.Print("This is removing the periodic effect from the flying weapon");
if (_effectHandle is not null)
owner.EffectsManager.RemoveEffect(_effectHandle);
context.InstanceHandle.End();
}
}

View File

@@ -242,9 +242,7 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer, IForgeEntity
Events.Subscribe<WeaponEventPayload>(WeaponStoppedFlyingEventTag, data =>
{
GD.Print("This is removing the periodic effect to the flying weapon");
GD.Print(data.Payload.Message);
if (_flyingWeaponEffectHandle is { IsValid: true }) EffectsManager.RemoveEffect(_flyingWeaponEffectHandle);
_weaponFlyingAbility.Cancel();
});
}
private ActiveEffectHandle? _flyingWeaponEffectHandle;
@@ -266,15 +264,12 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer, IForgeEntity
abilityTags: WeaponFlyingAbilityTag.GetSingleTagContainer(),
instancingPolicy: AbilityInstancingPolicy.PerEntity,
abilityTriggerData: AbilityTriggerData.ForEvent<WeaponEventPayload>(WeaponStartedFlyingEventTag),
behaviorFactory: () => new ClosureBehavior<WeaponEventPayload>((ctx, payload) =>
{
GD.Print("This is applying the periodic effect to the flying weapon");
GD.Print(payload.Message);
_flyingWeaponEffectHandle = EffectsManager.ApplyEffect(new Effect(flyingWeaponEffectData, new EffectOwnership(this, this)));
}));
Abilities.GrantAbilityPermanently(weaponHandToFlyingAbilityData, 1, LevelComparison.None, this);
behaviorFactory: () => new FlyingSwordBehavior(this, flyingWeaponEffectData));
_weaponFlyingAbility = Abilities.GrantAbilityPermanently(weaponHandToFlyingAbilityData, 1, LevelComparison.None, this);
}
private AbilityHandle _weaponFlyingAbility;
public void GrantNewAbilityForWeaponFly(RExplodingSword ability)
{
var weaponFlyingAbilityData = new AbilityData(