Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
 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;
 }
Exemplo n.º 3
0
 new SectionProperties(Xml.Element(Namespaces.w + "sectPr") ?? throw new Exception("Document body does not have a sectPr element"));
Exemplo n.º 4
0
 new PageMargins(Xml.Element(XName.Get("pgMar", Namespaces.w.NamespaceName)) ?? throw new Exception("pgMar element is obligatory within sectPr"));