used DI for forge managers where possible

This commit is contained in:
2026-04-28 16:34:10 +02:00
parent ec44306d48
commit 24f057c15f
8 changed files with 129 additions and 112 deletions

View File

@@ -39,6 +39,10 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
#region Dependencies
[Dependency]
public InventoryManager InventoryManager => this.DependOn<InventoryManager>();
[Dependency]
public TagsManager TagsManager => this.DependOn<TagsManager>();
[Dependency]
public CuesManager CuesManager => this.DependOn<CuesManager>();
#endregion
#region Utils
@@ -73,27 +77,31 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
#endregion
#region Publics
#region Nodes
[Node("HeadSystem")] public required HeadSystem HeadSystem { get; set; }
[Node("StairsSystem")] public required StairsSystem StairsSystem { get; set; }
[Node("HeadSystem/MantleSystem")] public required MantleSystem MantleSystem { get; set; }
[Node("DashSystem")] public required DashSystem DashSystem { get; set; }
[Node("HeadSystem")] public required HeadSystem HeadSystem { get; set; }
[Node("StairsSystem")] public required StairsSystem StairsSystem { get; set; }
[Node("HeadSystem/MantleSystem")] public required MantleSystem MantleSystem { get; set; }
[Node("DashSystem")] public required DashSystem DashSystem { get; set; }
[Node("StandingCollider")] public required CollisionShape3D StandingCollider { get; set; }
[Node("SlideCollider")] public required CollisionShape3D SlideCollider { get; set; }
[Node("WeaponSystem")] public required WeaponSystem WeaponSystem { get; set; }
[Node("WallHugSystem")] public required WallHugSystem WallHugSystem { get; set; }
[Node("UI")] public required PlayerUi PlayerUi { get; set; }
[Node("GroundDetector")] public required ShapeCast3D GroundDetector { get; set; }
[Node("CeilingDetector")] public required ShapeCast3D CeilingDetector { get; set; }
[Node("DirectGroundDetector")] public required RayCast3D DirectGroundDetector { get; set; }
[Node("%WeaponHitbox")] public required Area3D WeaponHitbox { get; set; }
[Node("WeaponSystem")] public required WeaponSystem WeaponSystem { get; set; }
[Node("WallHugSystem")] public required WallHugSystem WallHugSystem { get; set; }
[Node("UI")] public required PlayerUi PlayerUi { get; set; }
[Node("GroundDetector")] public required ShapeCast3D GroundDetector { get; set; }
[Node("CeilingDetector")] public required ShapeCast3D CeilingDetector { get; set; }
[Node("DirectGroundDetector")] public required RayCast3D DirectGroundDetector { get; set; }
[Node("%WeaponHitbox")] public required Area3D WeaponHitbox { get; set; }
[Node("SFXPlayer")] public required AudioStreamPlayer3D SfxPlayer { get; set; }
[Node("DashDamage")] public required ShapeCast3D DashDamageDetector { get; set; }
[Node("SlidingEnemyDetector")] public required Area3D SlidingEnemyDetector { get; set; }
[Node("%CloseEnemyDetector")] public required ShapeCast3D CloseEnemyDetector { get; set; }
[Node("AimAssistRayCast")] public required RayCast3D AimAssistRayCast { get; set; }
[Node("HeadSystem/CameraSmooth/Camera3D")] public required Camera3D Camera { get; set; }
#endregion
#region Publics
public EntityAttributes Attributes { get; set; } = null!;
public EntityTags Tags { get; set; } = null!;
@@ -423,7 +431,6 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
InvincibleTag.GetTag().GetSingleTagContainer()!
)
]);
GD.Print("Applying invincibility");
_invincibleEffect = EffectsManager.ApplyEffect(new Effect(invincibility,
new EffectOwnership(this, this)));
@@ -432,7 +439,6 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
if (_invincibleEffect == null) return;
EffectsManager.RemoveEffect(_invincibleEffect);
GD.Print("Removing effect");
_invincibleEffect = null;
}
@@ -447,16 +453,6 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
LoadSettings();
// General use stuff
PlayerUi = GetNode<PlayerUi>("UI");
CloseEnemyDetector = GetNode<ShapeCast3D>("%CloseEnemyDetector");
CloseEnemyDetector.TargetPosition = CloseEnemyDetector.TargetPosition.Normalized() * TargetingDistance;
AimAssistRayCast = GetNode<RayCast3D>("AimAssistRayCast");
AimAssistRayCast.TargetPosition = AimAssistRayCast.TargetPosition.Normalized() * (TargetingDistance*1.5f);
#region Forge
var tagsManager = ForgeManagers.Instance.TagsManager;
var cuesManager = ForgeManagers.Instance.CuesManager;
List<AttributeSet> attributeSetList = [];
foreach (Node node in GetChildren())
{
@@ -471,59 +467,21 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
}
}
Attributes = new EntityAttributes([.. attributeSetList]);
Tags = new(BaseTags.GetTagContainer());
EffectsManager = new EffectsManager(this, cuesManager);
Abilities = new(this);
Events = new();
HealthAttribute = Attributes["PlayerAttributeSet.Health"];
ManaAttribute = Attributes["PlayerAttributeSet.Mana"];
cuesManager.RegisterCue(Tag.RequestTag(tagsManager, "cues.resources.health"), this);
Tags = new(BaseTags.GetTagContainer());
Abilities = new(this);
Events = new();
PlayerUi.Init(HealthAttribute, ManaAttribute);
CloseEnemyDetector.TargetPosition = CloseEnemyDetector.TargetPosition.Normalized() * TargetingDistance;
AimAssistRayCast.TargetPosition = AimAssistRayCast.TargetPosition.Normalized() * (TargetingDistance*1.5f);
if (EmpoweredActionAbility != null)
{
_empoweredActionHandle = Abilities.GrantAbilityPermanently(
EmpoweredActionAbility.GetAbilityData(),
abilityLevel: 1,
levelOverridePolicy: LevelComparison.None,
sourceEntity: this);
}
foreach (var defaultGrantedAbility in DefaultGrantedAbilities)
{
Abilities.GrantAbilityPermanently(
defaultGrantedAbility.GetAbilityData(),
abilityLevel: 1,
levelOverridePolicy: LevelComparison.None,
sourceEntity: this);
}
// Apply all default effects
foreach (var effect in DefaultPermanentEffects)
{
EffectsManager.ApplyEffect(new Effect(effect.GetEffectData(), new EffectOwnership(this, this)));
}
// Subscribe default empowered actions effects to the Empowered Action Used event
foreach (var effect in EmpoweredActionEffects)
{
Events.Subscribe<EmpoweredActionPayload>(EmpoweredActionUsed.GetTag(), data =>
{
EffectsManager.ApplyEffect(new Effect(effect.GetEffectData(), new EffectOwnership(this, this)));
});
}
Events.Subscribe(Tag.RequestTag(ForgeManagers.Instance.TagsManager, "events.combat.damage"), OnDamageReceived);
Events.Subscribe(Tag.RequestTag(ForgeManagers.Instance.TagsManager, "events.combat.death"), OnDeath);
PlayerUi.Initialize(HealthAttribute, ManaAttribute);
#endregion
// DashIndicator = GetNode<TextureRect>("%DashIndicator");
TargetSpeed = WalkSpeed;
SfxPlayer = GetNode<AudioStreamPlayer3D>("SFXPlayer");
_audioStream = (SfxPlayer.GetStreamPlayback() as AudioStreamPlaybackInteractive)!;
// Camera stuff
@@ -544,7 +502,6 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
_playerRadius = playerShape.Radius;
// Combat stuff
WeaponHitbox = GetNode<Area3D>("%WeaponHitbox");
WeaponHitbox.Monitoring = false;
WeaponHitbox.BodyEntered += RegisterHitEnnemy;
@@ -728,6 +685,47 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
public void OnResolved()
{
#region Forge
EffectsManager = new EffectsManager(this, CuesManager);
CuesManager.RegisterCue(Tag.RequestTag(TagsManager, "cues.resources.health"), this);
if (EmpoweredActionAbility != null)
{
_empoweredActionHandle = Abilities.GrantAbilityPermanently(
EmpoweredActionAbility.GetAbilityData(),
abilityLevel: 1,
levelOverridePolicy: LevelComparison.None,
sourceEntity: this);
}
foreach (var defaultGrantedAbility in DefaultGrantedAbilities)
{
Abilities.GrantAbilityPermanently(
defaultGrantedAbility.GetAbilityData(),
abilityLevel: 1,
levelOverridePolicy: LevelComparison.None,
sourceEntity: this);
}
// Apply all default effects
foreach (var effect in DefaultPermanentEffects)
{
EffectsManager.ApplyEffect(new Effect(effect.GetEffectData(), new EffectOwnership(this, this)));
}
// Subscribe default empowered actions effects to the Empowered Action Used event
foreach (var effect in EmpoweredActionEffects)
{
Events.Subscribe<EmpoweredActionPayload>(EmpoweredActionUsed.GetTag(), data =>
{
EffectsManager.ApplyEffect(new Effect(effect.GetEffectData(), new EffectOwnership(this, this)));
});
}
Events.Subscribe(Tag.RequestTag(TagsManager, "events.combat.damage"), OnDamageReceived);
Events.Subscribe(Tag.RequestTag(TagsManager, "events.combat.death"), OnDeath);
#endregion
// Initialize weapon with inventory abilities
WeaponSystem.RemoveAllEventAbilities();
foreach (var (weaponEvent, abilities) in InventoryManager.WeaponEventsInventory)
@@ -757,7 +755,7 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
{
var target = data.Target;
var tagsManager = ForgeManagers.Instance.TagsManager;
var tagsManager = TagsManager;
var weaponLeftTag = Tag.RequestTag(tagsManager, "abilities.weapon.left").GetSingleTagContainer();
if (weaponLeftTag == null) return;
Abilities.TryActivateAbilitiesByTag(weaponLeftTag, target, out var landedFailures);
@@ -770,7 +768,7 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
var magnitude = data.EventMagnitude;
var weaponLandPayload = data.Payload;
var tagsManager = ForgeManagers.Instance.TagsManager;
var tagsManager = TagsManager;
var weaponLandTag = Tag.RequestTag(tagsManager, "abilities.weapon.land").GetSingleTagContainer();
if (weaponLandTag == null) return;
@@ -2337,11 +2335,6 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
// private float _oldMana = 100;
public override void _Process(double delta)
{
if (Engine.GetProcessFrames() % 60 == 0)
{
GD.Print(_invincibleEffect);
GD.Print(Tags.CombinedTags.Count);
}
EffectsManager.UpdateEffects(delta);
}
@@ -2644,7 +2637,7 @@ public partial class PlayerController : CharacterBody3D, IForgeEntity, ICueHandl
var newHealth = HealthAttribute.CurrentValue + data.EventMagnitude;
if (newHealth > HealthAttribute.Min) return;
var tagsManager = ForgeManagers.Instance.TagsManager;
var tagsManager = TagsManager;
Events.Raise(new EventData
{
EventTags = Tag.RequestTag(tagsManager, "events.combat.death").GetSingleTagContainer()!,