using Cal; using System; namespace ET { /// /// 监视hp数值变化,改变血条值 /// [NumericWatcher(NumericType.Hp)] public class NumericWatcher_Hp: INumericWatcher { public async ETTask Run(Entity entity, float old, float value) { try { if (!entity) return; Unit unit = entity.As(); NumericComponent num = unit.GetComponent(); int maxHp = num.GetAsInt(NumericType.MaxHp); if (value <= 0) { value = 0; } else { if (value > maxHp) { num.Set(NumericType.Hp, maxHp, false); value = maxHp; } } float times = CharacterHelper.GetCharacterPoint((float) old / maxHp, (float) value / maxHp, 0.1f); if (MathF.Abs(times) > 1) { ModifierContainerComponent modifierContainer = unit.GetComponent(); if (modifierContainer != null) { (SkillOptionBase[] optionList, ModifierLogic modifierLogic) = modifierContainer.GetSkillOptionBaseArr(ModifierEventCondition.当拥有modifier的单位生命值变化时); if (optionList != null) { foreach (SkillOptionBase item in optionList) { SkillOptionLogicBase skillOptionLogicBase = SkillOptionFactory.AcquireSkillOptionLogic(item); skillOptionLogicBase.HandleEvent(new ModifierSkillSender( modifierLogic.owner, unit, modifierLogic.skillConfigId, modifierLogic)); } (modifierLogic.dataOldX10000, modifierLogic.dataX10000) = (modifierLogic.dataX10000, modifierLogic.dataOldX10000); } } } if (unit.UnitType == UnitType.Monster) { BattleMgrCompnent.Instance.NotifyUnitHurt(unit, MathHelper.RoundToInt(value)).Coroutine(); } DelaySendSyncAttributeComponent.instance.Add(unit, NumericType.Hp, value); } catch (System.Exception e) { Log.Error(e); } await ETTask.CompletedTask; } } }