public bool Update() { float playback_time = m_Creature.Character.PlaybackTime; float past_time = playback_time - StartTime; float percent = past_time / Duration; if (BuffContainer.Asset != null) { BuffContainer.Asset.OnUpdate(percent, AffectValuePercent); } bool is_finish = false; if (Action != null && Action.Update(playback_time) == false || Parent != null && Parent.IsFinish == true) { is_finish = true; } if (Action == null && Parent == null && past_time >= Duration && Duration != -1f) { is_finish = true; } if (IsFinish == true) { if (Action == null || is_finish == true) { return(false); } return(true); } if (BattleBase.Instance.IsBattleEnd == true) { return(true); } switch (ActionInfo.actionType) { case eActionType.dot_damage: case eActionType.dot_heal: if ((past_time - m_DotTime >= m_DotTick || is_finish == true)) { m_DotValue = Value * (past_time - m_LastUpdateTime); int hit_value = (int)m_DotValue; m_DotValue -= hit_value; m_LastUpdateTime = past_time; bool is_critical = false; if (BattleConfig.Instance.UseCritical && Skill.IsLeaderActive == false) { is_critical = MNS.Random.Instance.NextRange(1, 10000) <= Skill.Creature.GetValue(eStatType.CriticalChance); if (is_critical == false) { is_critical = ((m_Creature.IsTeam != Skill.Creature.IsTeam && (m_Creature.CanAction(Skill) == false || m_Creature.IsPlayingAction) || m_Creature.IsTeam == Skill.Creature.IsTeam && !(m_Creature.CanAction() == false || m_Creature.IsPlayingAction))); } } int critical_power = Skill.Creature.GetValue(eStatType.CriticalPower); eTextPushType push_type = is_critical ? eTextPushType.CriticalDot : eTextPushType.Dot; if (is_critical) { hit_value = hit_value * critical_power / 10000; } if (ActionInfo.actionType == eActionType.dot_damage) { if (m_Creature.InvokeImmune(eImmuneType.dot, Skill.Creature.Info.AttackType, Skill.Level) == false) { if (Skill.Creature != null) { Skill.Creature.AddDeal(-hit_value); } m_Creature.SetDamage(hit_value, true); TextManager.Instance.PushDamage(Skill.Creature.Info.AttackType == SharedData.eAttackType.physic, m_Creature, hit_value, push_type); float damage_percent = -hit_value / (float)m_Creature.Stat.MaxHP; m_Creature.AddMP(eMPFillType.Damage, damage_percent); if (Skill.IsDefault == true) { Skill.Creature.AddMP(eMPFillType.Deal, damage_percent); } ActionInfo.Fire(Skill, eActionType.dot_damage, hit_value); } } else { m_Creature.SetHeal(hit_value, true); TextManager.Instance.PushHeal(m_Creature, hit_value, push_type); if (Skill.IsDefault == true) { float heal_percent = hit_value / (float)m_Creature.Stat.MaxHP; Skill.Creature.AddMP(eMPFillType.Heal, heal_percent); } } m_DotTime += m_DotTick; } break; case eActionType.dot_damage_mana: case eActionType.dot_heal_mana: if ((past_time - m_DotTime >= m_DotTick || is_finish == true)) { m_DotValue = Value * (past_time - m_LastUpdateTime); int hit_value = (int)m_DotValue; m_DotValue -= hit_value; m_LastUpdateTime = past_time; bool is_critical = false; if (BattleConfig.Instance.UseCritical && Skill.IsLeaderActive == false) { is_critical = MNS.Random.Instance.NextRange(1, 10000) <= Skill.Creature.GetValue(eStatType.CriticalChance); if (is_critical == false) { is_critical = ((m_Creature.IsTeam != Skill.Creature.IsTeam && (m_Creature.CanAction(Skill) == false || m_Creature.IsPlayingAction) || m_Creature.IsTeam == Skill.Creature.IsTeam && !(m_Creature.CanAction() == false || m_Creature.IsPlayingAction))); } } int critical_power = Skill.Creature.GetValue(eStatType.CriticalPower); eTextPushType push_type = is_critical ? eTextPushType.CriticalDot : eTextPushType.Dot; if (is_critical) { hit_value = hit_value * critical_power / 10000; } if (ActionInfo.actionType == eActionType.dot_damage_mana) { if (m_Creature.InvokeImmune(eImmuneType.dot, Skill.Creature.Info.AttackType, Skill.Level) == false) { m_Creature.SetDamageMana(hit_value, true); TextManager.Instance.PushMana(m_Creature, hit_value, push_type); } } else { m_Creature.SetHealMana(hit_value, true); TextManager.Instance.PushMana(m_Creature, hit_value, push_type); } m_DotTime += m_DotTick; } break; } if (is_finish) { IsFinish = true; return(false); } return(true); }