public override void Damage(double damage, Xml.Element element = Xml.Element.None, Xml.DamageType damageType = Xml.DamageType.Direct, Xml.DamageFlags damageFlags = Xml.DamageFlags.None, Creature attacker = null, bool onDeath = true) { return; }
public virtual void Damage(double damage, Xml.Element element = Xml.Element.None, Xml.DamageType damageType = Xml.DamageType.Direct, Xml.DamageFlags damageFlags = Xml.DamageFlags.None, Creature attacker = null, bool onDeath = true) { if (this is Monster ms && !Condition.Alive) { return; } if (attacker is User && this is Monster) { if (FirstHitter == null || !World.UserConnected(FirstHitter.Name) || ((DateTime.Now - LastHitTime).TotalSeconds > Constants.MONSTER_TAGGING_TIMEOUT)) { FirstHitter = attacker; } if (attacker != FirstHitter && !((FirstHitter as User).Group?.Members.Contains(attacker) ?? false)) { return; } } LastHitTime = DateTime.Now; if (damageType != Xml.DamageType.Direct) { double armor = Stats.Ac * -1 + 100; var elementTable = Game.World.WorldData.Get <Xml.ElementTable>("ElementTable"); var multiplier = elementTable.Source.First(x => x.Element == element).Target.FirstOrDefault(x => x.Element == Stats.BaseDefensiveElement).Multiplier; var reduction = damage * (armor / (armor + 50)); damage = (damage - reduction) * multiplier; } if (attacker != null) { _mLastHitter = attacker.Id; } var normalized = (uint)damage; if (normalized > Stats.Hp && damageFlags.HasFlag(Xml.DamageFlags.Nonlethal)) { normalized = Stats.Hp - 1; } else if (normalized > Stats.Hp) { normalized = Stats.Hp; } OnDamage(attacker, normalized); if (AbsoluteImmortal) { return; } if (damageType == Xml.DamageType.Physical && (AbsoluteImmortal || PhysicalImmortal)) { return; } if (damageType == Xml.DamageType.Magical && (AbsoluteImmortal || MagicalImmortal)) { return; } Stats.Hp -= normalized; SendDamageUpdate(this); // TODO: Separate this out into a control message if (Stats.Hp == 0 && onDeath) { if (this is Monster) { Condition.Alive = false; } OnDeath(); } }
/// <summary> /// Deal damage to the current player. /// </summary> /// <param name="damage">Integer amount of damage to deal.</param> /// <param name="element">Element of the damage (e.g. fire, air)</param> /// <param name="damageType">Type of damage (direct, magical, etc)</param> public void Damage(int damage, Xml.ElementType element = Xml.ElementType.None, Xml.DamageType damageType = Xml.DamageType.Direct) { Monster.Damage(damage, element, damageType); }