diff --git a/forge/abilities/RExplodingSword.cs b/forge/abilities/RExplodingSword.cs index 14db21a9..a0f776d9 100644 --- a/forge/abilities/RExplodingSword.cs +++ b/forge/abilities/RExplodingSword.cs @@ -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(Node3D owner, PackedScene? ex public void OnEnded(AbilityBehaviorContext context) { } -} \ No newline at end of file +} + + + +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(); + } +} diff --git a/scenes/player_controller/components/weapon/WeaponSystem.cs b/scenes/player_controller/components/weapon/WeaponSystem.cs index a44222c6..754ccb0f 100644 --- a/scenes/player_controller/components/weapon/WeaponSystem.cs +++ b/scenes/player_controller/components/weapon/WeaponSystem.cs @@ -242,9 +242,7 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer, IForgeEntity Events.Subscribe(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(WeaponStartedFlyingEventTag), - behaviorFactory: () => new ClosureBehavior((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(