public DamageTrackerTimer(DamageTracker damageTracker) : base(TickSpeed, TickSpeed) { m_DamageTracker = damageTracker; Priority = TimerPriority.TwoFiftyMS; }
protected override void OnTick() { if (m_Index++ == m_Poison.m_Count) { m_Mobile.SendLocalizedMessage(502136); // The poison seems to have worn off. m_Mobile.Poison = null; Stop(); return; } double damage; damage = 1 + ((double)m_Mobile.HitsMax * m_Poison.m_Scalar); double minimum = m_Poison.m_Minimum; double maximum = m_Poison.m_Maximum; PlayerMobile pm_From = m_From as PlayerMobile; BaseCreature bc_From = m_From as BaseCreature; PlayerMobile pm_Target = m_Mobile as PlayerMobile; BaseCreature bc_Target = m_Mobile as BaseCreature; if (bc_Target != null) { bc_Target.m_TakenDamageFromPoison = true; } if (pm_From != null && bc_Target != null) { double poisonDamageScalar = 1.0; DungeonArmor.PlayerDungeonArmorProfile poisonerDungeonArmor = new DungeonArmor.PlayerDungeonArmorProfile(pm_From, null); if (poisonerDungeonArmor.MatchingSet && !poisonerDungeonArmor.InPlayerCombat) { poisonDamageScalar = poisonerDungeonArmor.DungeonArmorDetail.PoisonDamageInflictedScalar; } minimum = (double)minimum * 1.5 * poisonDamageScalar; maximum = (double)maximum * 1.5 * poisonDamageScalar; } if (bc_From != null && pm_Target != null) { double poisonDamageScalar = 1.0; DungeonArmor.PlayerDungeonArmorProfile defenderDungeonArmor = new DungeonArmor.PlayerDungeonArmorProfile(pm_Target, null); if (defenderDungeonArmor.MatchingSet && !defenderDungeonArmor.InPlayerCombat) { poisonDamageScalar = defenderDungeonArmor.DungeonArmorDetail.PoisonDamageReceivedScalar; } if (bc_From.Controlled && bc_From.ControlMaster is PlayerMobile) { minimum = (double)minimum * bc_From.PvPAbilityDamageScalar; maximum = (double)maximum * bc_From.PvPAbilityDamageScalar; } minimum *= defenderDungeonArmor.DungeonArmorDetail.PoisonDamageReceivedScalar; maximum *= defenderDungeonArmor.DungeonArmorDetail.PoisonDamageReceivedScalar; } if (damage < minimum) { damage = minimum; } else if (damage > maximum) { damage = maximum; } int finalDamage = (int)(Math.Round(damage)); if (finalDamage < 1) { finalDamage = 1; } m_LastDamage = finalDamage; if (m_From != null) { m_From.DoHarmful(m_Mobile, true); } int finalAdjustedDamage = AOS.Damage(m_Mobile, m_From, finalDamage, 0, 0, 0, 100, 0); int displayedDamage = DamageTracker.AdjustDisplayedDamage(m_From, m_Mobile, finalAdjustedDamage); if (pm_From != null) { DamageTracker.RecordDamage(pm_From, pm_From, m_Mobile, DamageTracker.DamageType.PoisonDamage, displayedDamage); } if ((m_Index % m_Poison.m_MessageInterval) == 0) { m_Mobile.OnPoisoned(m_From, m_Poison, m_Poison); } }