using System; using System.Collections; using System.Collections.Generic; using BITFALL.Entities.Inventory; using BITKit; using BITKit.Entities; using BITKit.UX; using UnityEngine; namespace BITFALL.Entities { public struct BleedingDamage:IDamageType { } [Serializable] public struct StopBleeding : IProperty { } public class EntityBleeding : EntityBehavior { [SerializeReference, SubclassSelector] private ITicker _ticker; [SerializeField] private bool isBleeding; [SerializeField] private int bleedingDamage; [Inject] private IHealth _health; [Inject] private IEntityInventory _inventory; [Inject] private IEntityOverride _override; [Inject(true)] private IUXPopup _popup; public override void OnAwake() { base.OnAwake(); _ticker.Add(OnTick); _health.OnSetAlive += OnSetAlive; _health.OnDamageRelease += OnDamageRelease; _inventory.OnUsedItem += OnUsedItem; } private void OnUsedItem(IBasicItem obj) { if (isBleeding is false) return; var asset = obj.GetAssetable(); if (asset.TryGetProperty(out _)) { isBleeding = false; _popup?.Popup("你停止了流血"); } } private void OnSetAlive(bool obj) { isBleeding = false; } private void OnDamageRelease(DamageMessage obj) { if (isBleeding) return; switch (obj.DamageType) { case BulletDamageMessage: case MeleeDamageMessage { Bleeding: true }: isBleeding = true; _popup?.Popup("你正在流血"); break; } } private void OnTick(float obj) { if (isBleeding is false) return; if (_health.IsAlive is false) return; if (_override.IsOvering) return; UnityEntity.Invoke( new DamageMessage() { Target = UnityEntity, Damage = bleedingDamage, DamageType = new BleedingDamage() } ); } } }