using System; using System.Collections; using System.Collections.Generic; using BITFALL.Combat; using BITFALL.Entities.Equipment; using BITKit; using BITKit.Entities; using BITKit.Entities.Melee; using BITKit.Sensors; using Cysharp.Threading.Tasks; using UnityEngine; using IEntity = BITKit.Entities.IEntity; namespace BITFALL.Entities.Equipment { public class AIEquipController : MonoBehaviour,IEquipBase { [SerializeField] protected Optional overrideDamage; [SerializeField] protected AssetableItem assetableItem; [SerializeField] protected Optional ignoreTag; [SerializeReference,SubclassSelector] protected ISensor targetSensor; [SerializeReference, SubclassSelector] protected IMeleeService meleeService; protected AssetableEquip equip => assetableItem as AssetableEquip; protected Transform Transform { get; private set; } public bool IsEntered { get; set; } protected readonly IntervalUpdate meleeInterval = new(1); [Inject] public IHealth _health; public virtual void Entry() { } public virtual UniTask EntryAsync() { return UniTask.CompletedTask; } public virtual void Entered() { UnityEntity.AddListener(Constant.Animation.OnEvent, OnAnimationEvent); } public virtual void Exit() { } public virtual UniTask ExitAsync() { return UniTask.CompletedTask; } public virtual void Exited() { UnityEntity.RemoveListener(Constant.Animation.OnEvent, OnAnimationEvent); } protected virtual void OnAnimationEvent(string animationEventName) { switch (animationEventName) { case BITConstant.Player.Attack: case BITConstant.Player.Melee: meleeService.Melee(new MeleeCommand() { Damage = equip.MeleeDamage, Force = equip.MeleeForce, PlayerId = Entity.Id, Position = transform.position, Range = equip.MeleeRange, Forward = UnityEntity.transform.forward, IgnoreTags = ignoreTag.Allow ?ignoreTag.Value.GetTags():Array.Empty(), ForceHitStun = true, Limit = 1, }); break; } } public virtual void OnAwake() { Transform = transform; } public virtual void OnStart() { } public virtual void OnUpdate(float deltaTime) { } public string AddressablePath => assetableItem.AddressablePath; public IEntity Entity { get; set; } public Entity UnityEntity=>Entity as Entity; public IBasicItem Item { get; set; } public bool IsSupportItem(IBasicItem item) => item?.AddressablePath == AddressablePath; public void PlayAudio(string name) { } protected void RequestMelee() { if (meleeInterval.AllowUpdate is false) return; UnityEntity.Invoke(Constant.Animation.Play, BITConstant.Player.Melee); } } }