From ccda634b890598bd6a69be10d6e9bcf4892b1ef1 Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Thu, 11 Sep 2025 21:32:42 +0100 Subject: [PATCH] ability+effects runtime instances --- .../BaseAbilityInstance.cs.meta | 11 ---- .../Scripts/AbilitySystem/Base/BaseAbility.cs | 5 ++ .../Scripts/AbilitySystem/Base/BaseEffect.cs | 4 ++ .../AbilitySystem/ProjectileAbility.cs | 8 +++ Assets/Scripts/BuildManager/BuildManager.cs | 4 +- .../Scripts/Networking/NetworkedProjectile.cs | 9 --- Assets/Scripts/Player/AbilityKeyBinder.cs | 55 ++++++++++++++++--- 7 files changed, 67 insertions(+), 29 deletions(-) delete mode 100644 Assets/Scripts/AbilitySystem/AbilityInstance/BaseAbilityInstance.cs.meta diff --git a/Assets/Scripts/AbilitySystem/AbilityInstance/BaseAbilityInstance.cs.meta b/Assets/Scripts/AbilitySystem/AbilityInstance/BaseAbilityInstance.cs.meta deleted file mode 100644 index bdad3d02..00000000 --- a/Assets/Scripts/AbilitySystem/AbilityInstance/BaseAbilityInstance.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ecbc603708f7b784ab0a4bc2cce24156 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/AbilitySystem/Base/BaseAbility.cs b/Assets/Scripts/AbilitySystem/Base/BaseAbility.cs index c28680ca..3fc0aca5 100644 --- a/Assets/Scripts/AbilitySystem/Base/BaseAbility.cs +++ b/Assets/Scripts/AbilitySystem/Base/BaseAbility.cs @@ -31,6 +31,11 @@ public class BaseAbility : ScriptableObject private float finalManaCost; private float finalHealthCost; + public virtual BaseAbility CreateRuntimeInstance() + { + return Instantiate(this); + } + public virtual void Execute(Taggable user) { SpendResourcesNecessary(user); diff --git a/Assets/Scripts/AbilitySystem/Base/BaseEffect.cs b/Assets/Scripts/AbilitySystem/Base/BaseEffect.cs index e3f458e8..1bc00e3e 100644 --- a/Assets/Scripts/AbilitySystem/Base/BaseEffect.cs +++ b/Assets/Scripts/AbilitySystem/Base/BaseEffect.cs @@ -10,4 +10,8 @@ public class BaseEffect : ScriptableObject public virtual void ApplyEffect(Taggable user, List targets) { } + public virtual BaseEffect CreateRuntimeInstance() + { + return Instantiate(this); + } } diff --git a/Assets/Scripts/AbilitySystem/ProjectileAbility.cs b/Assets/Scripts/AbilitySystem/ProjectileAbility.cs index 13ae29f7..fbc93dc5 100644 --- a/Assets/Scripts/AbilitySystem/ProjectileAbility.cs +++ b/Assets/Scripts/AbilitySystem/ProjectileAbility.cs @@ -28,6 +28,14 @@ public class ProjectileAbility : BaseAbility private GameObject instantiatedProjectile; private NetworkedProjectile networkedProjectile; + /*public override BaseAbility CreateRuntimeInstance() + { + var instance = Instantiate(this); + instance.name = $"{name} (Runtime)"; + // Any special initialization for projectile abilities + return instance; + }*/ + public override void Execute(Taggable user) { base.Execute(user); diff --git a/Assets/Scripts/BuildManager/BuildManager.cs b/Assets/Scripts/BuildManager/BuildManager.cs index 7f68967e..3e83da45 100644 --- a/Assets/Scripts/BuildManager/BuildManager.cs +++ b/Assets/Scripts/BuildManager/BuildManager.cs @@ -60,7 +60,7 @@ public class BuildManager : MonoBehaviour if (buildData == null) { - SaveCurrentBuild(); + SaveCurrentBuild(true); } else { @@ -68,7 +68,7 @@ public class BuildManager : MonoBehaviour } } - private void SaveCurrentBuild() + private void SaveCurrentBuild(bool rebindAbility = false) { if (buildData == null) buildData = new BuildData(); diff --git a/Assets/Scripts/Networking/NetworkedProjectile.cs b/Assets/Scripts/Networking/NetworkedProjectile.cs index d5b9cf2d..b949a5e8 100644 --- a/Assets/Scripts/Networking/NetworkedProjectile.cs +++ b/Assets/Scripts/Networking/NetworkedProjectile.cs @@ -135,15 +135,6 @@ public class NetworkedProjectile : MonoBehaviour effect.ApplyEffect(ownerTag, new List { target }); } - try - { - target.GetComponentInChildren()?.SetTrigger("hurt"); - } - catch (System.Exception) - { - Debug.Log("No Hurt trigger"); - } - if (!canPierce) { diff --git a/Assets/Scripts/Player/AbilityKeyBinder.cs b/Assets/Scripts/Player/AbilityKeyBinder.cs index b0f2bdda..e524135e 100644 --- a/Assets/Scripts/Player/AbilityKeyBinder.cs +++ b/Assets/Scripts/Player/AbilityKeyBinder.cs @@ -10,12 +10,14 @@ public class AbilityKeyBinder : MonoBehaviour [SerializeField] private GameEventListener onLocalPlayerPermaDeath; [SerializeField] private GameEventListener onLocalPlayerRevived; [Space] - [SerializeField] private BaseAbility ability; + //[SerializeField] private BaseAbility ability; [SerializeField] private GameKey key; [SerializeField] private CastingStateController castingStateController; [SerializeField] private GameEvent_AbilityKeyBinder onAbilityKeyBinderSpawned; [SerializeField] private GameInputBinding gamepadBinding; // New field for gamepad binding + [SerializeField] private BaseAbility ability; + private Taggable userTag; private Mana mana; private Health health; @@ -34,6 +36,8 @@ public class AbilityKeyBinder : MonoBehaviour bool abilitySlotUnlocked = false; bool isComboAbility = false; ComboAbility combo; + List comboAbilities = new List(); + List effects = new List(); ComboState comboState = new ComboState(); float finalHealthCost; @@ -204,17 +208,33 @@ public class AbilityKeyBinder : MonoBehaviour public void BindAbility(BaseAbility ability) { - this.ability = ability; - if (ability is ComboAbility comboAbility) + if (this.ability != null && this.ability.name.ToLower().Contains("clone")) + Destroy(this.ability); + + this.ability = ability.CreateRuntimeInstance(); + + if (this.ability is ComboAbility comboAbility) { isComboAbility = true; combo = comboAbility; + for (int i = 0; i < combo.comboChain.Count; i++) + { + comboAbilities.Add(combo.comboChain[i].CreateRuntimeInstance()); + } + combo.comboChain = comboAbilities; abilityBindInstance.ForceUpdateOnComboAbility(GetCurrentAbility()); } else { isComboAbility = false; combo = null; + + for (int i = 0; i < ability.abilityEffects.Count; i++) + { + effects.Add(ability.abilityEffects[i].CreateRuntimeInstance()); + } + this.ability.abilityEffects = effects; + } onAbilityKeyBinderSpawned.Raise(this); } @@ -225,11 +245,32 @@ public class AbilityKeyBinder : MonoBehaviour abilityBindInstance.SetUnlocked(unlocked); } + private void OnDestroy() + { + if (isComboAbility) + { + for (int i = comboAbilities.Count - 1; i >= 0; i--) + { + Destroy(comboAbilities[i]); + } + } + else + { + if (this.ability != null && this.ability.name.ToLower().Contains("clone")) + Destroy(this.ability); + + for (int i = effects.Count - 1; i >= 0; i--) + { + Destroy(effects[i]); + } + } + + } private void AdvanceCombo() { comboState.currentComboIndex++; - comboState.currentComboIndex %= combo.comboChain.Count; + comboState.currentComboIndex %= comboAbilities.Count; abilityBindInstance.ForceUpdateOnComboAbility(GetCurrentAbility()); } @@ -247,14 +288,14 @@ public class AbilityKeyBinder : MonoBehaviour public BaseAbility GetCurrentAbility() { - if (combo.comboChain.Count == 0) return null; + if (comboAbilities.Count == 0) return null; int index = GetCurrentComboIndex(); - return combo.comboChain[index]; + return comboAbilities[index]; } public int GetComboLength() { - return combo.comboChain.Count; + return comboAbilities.Count; } public List GetComboChain()