public void RefreshAttackers() { if (Attackers.Count >= 1) { foreach (var attacker in Attackers) { if (attacker.Value?.Player != null && attacker.Value.LastRefresh.AddSeconds(10) > DateTime.Now) { if (attacker.Value.FadedToGray && MainAttacker == attacker.Value.Player) { attacker.Value.Player.SendPacket($"0|n|USH|{Id}"); attacker.Value.FadedToGray = false; } if (!attacker.Value.FadedToGray && MainAttacker != attacker.Value.Player) { attacker.Value.Player.SendPacket($"0|n|LSH|{Id}|{Id}"); attacker.Value.FadedToGray = true; } continue; } Attacker removedAttacker; Attackers.TryRemove(attacker.Key, out removedAttacker); } } if (MainAttacker != null) { if (!Attackers.ContainsKey(MainAttacker.Id)) { MainAttacker = null; } } }
public bool Damage(Character attacker, uint amount) { lock (this) { amount = Math.Min(amount, Health); //does the victim knows its attacker? if (Attackers.ContainsKey(attacker)) { //if so then add to his established dmg bill Attackers[attacker] += amount; } else { //if not so then add him as new attacker Attackers.Add(attacker, amount); } Health -= amount; //decrease health by amount dealt ShowHpTo(attacker); //show monster's remaining hp bar to attacker if (Health <= 0) //??? { return(true); } return(false); } }
public bool Damage(GameCharacter attacker, uint amount) { lock (this) { var originalAmount = amount; amount = Math.Min(amount, Health); if (Attackers.ContainsKey(attacker)) { Attackers[attacker] += amount; } else { Attackers.Add(attacker, amount); } Health -= amount; return(Health <= 0); } }
public virtual void Damage(double dmg, Character attacker = null, int sound = 0, DamageType damageType = DamageType.RawDamage, DamageFlags flags = DamageFlags.None) { if (LifeStatus != LifeStatus.Alive) { return; } RemoveStatus("Morph"); var realDamage = dmg; if ((flags & DamageFlags.CanBeAbsorbed) == DamageFlags.CanBeAbsorbed) { if (AbsorbingAbsoluteDamage) { CurrentAbsoluteDamageAbsorbed += dmg; if (MaximumAbsoluteDamageAbsorbed <= CurrentAbsoluteDamageAbsorbed) { RemoveStatus("AbsoluteAbsorb"); } realDamage = 0; SpellAnimation(AbsoluteAbsorbAnimation, 100); } else if (AbsorbingPhysicalDamage && damageType == DamageType.Physical) { CurrentPhysicalDamageAbsorbed += dmg; if (MaximumPhysicalDamageAbsorbed <= CurrentPhysicalDamageAbsorbed) { RemoveStatus("PhysicalAbsorb"); } realDamage = 0; SpellAnimation(PhysicalAbsorbAnimation, 100); } else if (AbsorbingMagicalDamage && damageType == DamageType.Magical) { CurrentMagicalDamageAbsorbed += dmg; if (MaximumMagicalDamageAbsorbed <= CurrentMagicalDamageAbsorbed) { RemoveStatus("MagicalAbsorb"); } realDamage = 0; SpellAnimation(MagicalAbsorbAnimation, 100); } } if (damageType == DamageType.Physical) { realDamage *= ArmorProtection * (1d - PhysicalProtection); } else if (damageType == DamageType.Magical) { realDamage -= (realDamage * (MagicResistance / 100d)); realDamage *= (1d - MagicalProtection); } if (Map.Flags.HasFlag(MapFlags.PlayerKill)) { dmg *= 0.75; } if (attacker != null) { if (!Enemies.Contains(attacker)) { Enemies.Add(attacker); } if (!attacker.Enemies.Contains(this)) { attacker.Enemies.Add(this); } LastAttacker = attacker; } if ((flags & DamageFlags.CanBeRedirected) == DamageFlags.CanBeRedirected) { if (RedirectingPhysicalDamage && damageType == DamageType.Physical) { if (PhysicalRedirectTarget != null && PhysicalRedirectTarget != this && WithinRange(PhysicalRedirectTarget, 12)) { var yourDamage = realDamage * PhysicalRedirectPercent; realDamage -= yourDamage; PhysicalRedirectTarget.Damage(yourDamage, null, 0, DamageType.RawDamage, DamageFlags.None); } if (--PhysicalRedirectCount == 0) { RemoveStatus("PhysicalRedirect"); } } if (RedirectingMagicalDamage && damageType == DamageType.Magical) { if (MagicalRedirectTarget != null && MagicalRedirectTarget != this && WithinRange(MagicalRedirectTarget, 12)) { var yourDamage = realDamage * MagicalRedirectPercent; realDamage -= yourDamage; MagicalRedirectTarget.Damage(yourDamage, null, 0, DamageType.RawDamage, DamageFlags.None); } if (--MagicalRedirectCount == 0) { RemoveStatus("MagicalRedirect"); } } } if ((flags & DamageFlags.CanBeConvertedToManaDamage) == DamageFlags.CanBeConvertedToManaDamage) { if (ConvertingPhysicalDamageToManaDamage && damageType == DamageType.Physical) { CurrentMP -= (long)realDamage; if (CurrentMP < 0) { CurrentMP = 0; } CurrentPhysicalDamageConvertedToManaDamage += dmg; if (MaximumPhysicalDamageConvertedToManaDamage <= CurrentPhysicalDamageConvertedToManaDamage) { RemoveStatus("PhysicalConvertToMana"); } realDamage = 0; SpellAnimation(PhysicalConvertToManaAnimation, 100); } if (ConvertingMagicalDamageToManaDamage && damageType == DamageType.Magical) { CurrentMP -= (long)realDamage; if (CurrentMP < 0) { CurrentMP = 0; } CurrentMagicalDamageConvertedToManaDamage += dmg; if (MaximumMagicalDamageConvertedToManaDamage <= CurrentPhysicalDamageConvertedToManaDamage) { RemoveStatus("MagicalConvertToMana"); } realDamage = 0; SpellAnimation(MagicalConvertToManaAnimation, 100); } } CurrentHP -= (long)realDamage; if (CurrentHP < 0) { CurrentHP = 0; } if (attacker != null) { if (Attackers.ContainsKey(attacker)) { Attackers[attacker] += realDamage; } else { Attackers.Add(attacker, realDamage); } } double percent = Math.Floor((double)CurrentHP / (double)MaximumHP * 100.0); if (percent < 0) { percent = 0; } if (percent > 100) { percent = 100; } var dot = (flags & DamageFlags.DamageOverTime) == DamageFlags.DamageOverTime; var id = (attacker != null) ? attacker.ID : ID; foreach (Character c in Map.Objects) { if (WithinRange(c, 12) && (c is Player)) { var packet = new ServerPacket(0x13); packet.WriteUInt32(id); packet.WriteUInt32(ID); packet.WriteByte(dot); packet.WriteByte((byte)percent); packet.WriteUInt32((uint)realDamage); packet.WriteByte((byte)sound); (c as Player).Client.Enqueue(packet); } } }