Files
2026-07-09 21:33:33 +02:00

108 lines
3.9 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;
using VOID.Generic.Dict;
using VOID.Generic.Objects.Unit.Events;
using VOID.Generic.Objects.Weapon;
using VOID.Generic.Objects.Wearable.Events;
using VOID.ScriptableObjects.Abilities;
namespace VOID.Generic.Objects.Unit
{
[System.Serializable]
public class UnitObjectAbilityBook : ObjectComponent<UnitObject>
{
#region Initialize
protected override void SelfInitialize()
{
// Instantiate basic attack ability
_attackAbility = Object.Instantiate(_defaultAttackAbility);
_attackAbility.OnAddedToUnit(parent);
// Instantiate all abilities
_abilities.ToList().ForEach(ability =>
{
_abilities.Remove(ability);
var instantiatedAbility = Object.Instantiate(ability);
instantiatedAbility.OnAddedToUnit(parent);
_abilities.Add(instantiatedAbility);
});
}
protected override void EventInitialize()
{
parent.unitEvents.onEquipAfter.AddListener(OnWeaponEquip);
parent.unitEvents.onUnEquipAfter.AddListener(OnWeaponUnEquip);
}
#endregion
// Getters
public List<BasicAbility> abilities => _abilities;
public BasicAttackAbility attackAbility => _attackAbility;
public BasicAttackAbility defaultAttackAbility => _defaultAttackAbility;
[SerializeField, DisableInPlayMode] private List<BasicAbility> _abilities = new ();
[ReadOnly, ShowInInspector] private BasicAttackAbility _attackAbility;
[SerializeField, DisableInPlayMode] private BasicAttackAbility _defaultAttackAbility;
public void RemoveAbility(BasicAbility abilityToRemove)
{
var deletedCount = _abilities.RemoveAll(ability => ability == abilityToRemove);
if (deletedCount == 0) return;
var abilityRemovedEvent = new AbilityBookAbilityRemovedEvent
{
unit = parent,
abilityRemoved = abilityToRemove
};
parent.unitEvents.onAbilityRemoved.Invoke(abilityRemovedEvent);
Object.Destroy(abilityToRemove);
}
public void AddAbility(BasicAbility abilityToAdd)
{
abilityToAdd = Object.Instantiate(abilityToAdd);
_abilities.Add(abilityToAdd);
var abilityAddedEvent = new AbilityBookAbilityAddedEvent
{
unit = parent,
abilityAdded = abilityToAdd
};
abilityToAdd.OnAddedToUnit(parent);
parent.unitEvents.onAbilityAdded.Invoke(abilityAddedEvent);
}
private void OnWeaponEquip(EquipEvent equipEvent)
{
if (equipEvent.wearable is not WeaponObject weaponObject) return;
var attackAbilityToAdd = Object.Instantiate(weaponObject.weaponData.attackAbility);
_attackAbility = weaponObject.weaponData.attackAbility;
var attackAbilityChangeEvent = new AbilityBookAttackAbilityChangeEvent
{
unit = parent,
newAttackAbility = attackAbilityToAdd
};
attackAbilityToAdd.OnAddedToUnit(parent);
parent.unitEvents.onAttackAbilityChange.Invoke(attackAbilityChangeEvent);
}
private void OnWeaponUnEquip(UnEquipEvent unEquipEvent)
{
if (unEquipEvent.wearable is not WeaponObject) return;
var mainHandWeapon = parent.unitEquipment.GetEquipped(EquipmentSlotType.MainHand);
var offHandWeapon = parent.unitEquipment.GetEquipped(EquipmentSlotType.OffHand);
if (mainHandWeapon || offHandWeapon) return;
_attackAbility = _defaultAttackAbility;
}
}
}