feat(items): add Blood Drinker property
This commit is contained in:
parent
b485b843fd
commit
d163761dcd
4 changed files with 466 additions and 4 deletions
|
|
@ -63,11 +63,18 @@ namespace Server.Items
|
|||
_table.TryGetValue(m, out var timer);
|
||||
timer?.Stop();
|
||||
|
||||
_table[m] = timer = new InternalTimer(from, m);
|
||||
var bloodDrinker = CheckBloodDrinker(from);
|
||||
|
||||
_table[m] = timer = new InternalTimer(from, m, bloodDrinker);
|
||||
timer.Start();
|
||||
}
|
||||
|
||||
public static void DoBleed(Mobile m, Mobile from, int level)
|
||||
{
|
||||
DoBleed(m, from, level, false);
|
||||
}
|
||||
|
||||
internal static void DoBleed(Mobile m, Mobile from, int level, bool bloodDrinker)
|
||||
{
|
||||
if (m.Alive)
|
||||
{
|
||||
|
|
@ -79,7 +86,20 @@ namespace Server.Items
|
|||
}
|
||||
|
||||
m.PlaySound(0x133);
|
||||
var oldHits = m.Hits;
|
||||
m.Damage(damage, from);
|
||||
var applied = Math.Max(0, oldHits - m.Hits);
|
||||
|
||||
if (bloodDrinker && applied > 0 && from is { Deleted: false, Alive: true })
|
||||
{
|
||||
var oldFromHits = from.Hits;
|
||||
from.Heal(applied, from, message: false);
|
||||
|
||||
if (from.Hits > oldFromHits)
|
||||
{
|
||||
from.SendLocalizedMessage(1113606); // The blood drinker effect heals you.
|
||||
}
|
||||
}
|
||||
|
||||
var blood = new Blood { ItemID = Utility.Random(0x122A, 5) };
|
||||
blood.MoveToWorld(m.Location, m.Map);
|
||||
|
|
@ -105,20 +125,32 @@ namespace Server.Items
|
|||
}
|
||||
}
|
||||
|
||||
internal static bool CheckBloodDrinker(Mobile from)
|
||||
{
|
||||
if (!Core.SA || from?.Deleted != false || !from.Alive)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return from.Weapon is BaseWeapon weapon && weapon.ExtendedWeaponAttributes.BloodDrinker != 0;
|
||||
}
|
||||
|
||||
private class InternalTimer : Timer
|
||||
{
|
||||
private readonly Mobile m_From;
|
||||
private readonly Mobile m_Mobile;
|
||||
private readonly bool m_BloodDrinker;
|
||||
|
||||
public InternalTimer(Mobile from, Mobile m) : base(TimeSpan.FromSeconds(2.0), TimeSpan.FromSeconds(2.0), 5)
|
||||
public InternalTimer(Mobile from, Mobile m, bool bloodDrinker) : base(TimeSpan.FromSeconds(2.0), TimeSpan.FromSeconds(2.0), 5)
|
||||
{
|
||||
m_From = from;
|
||||
m_Mobile = m;
|
||||
m_BloodDrinker = bloodDrinker;
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
DoBleed(m_Mobile, m_From, 5 - Index);
|
||||
DoBleed(m_Mobile, m_From, 5 - Index, m_BloodDrinker);
|
||||
|
||||
if (Index == 4)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1115,7 +1115,8 @@ namespace Server
|
|||
{
|
||||
Bane = 0x00000001,
|
||||
BattleLust = 0x00000002,
|
||||
HitSparks = 0x00000004
|
||||
HitSparks = 0x00000004,
|
||||
BloodDrinker = 0x00000008
|
||||
}
|
||||
|
||||
public sealed class ExtendedWeaponAttributes : BaseAttributes
|
||||
|
|
@ -1165,6 +1166,13 @@ namespace Server
|
|||
set => this[ExtendedWeaponAttribute.HitSparks] = value;
|
||||
}
|
||||
|
||||
[CommandProperty(AccessLevel.GameMaster)]
|
||||
public int BloodDrinker
|
||||
{
|
||||
get => this[ExtendedWeaponAttribute.BloodDrinker];
|
||||
set => this[ExtendedWeaponAttribute.BloodDrinker] = value;
|
||||
}
|
||||
|
||||
public void GetProperties(IPropertyList list)
|
||||
{
|
||||
if (Core.HS && Bane != 0)
|
||||
|
|
@ -1177,6 +1185,11 @@ namespace Server
|
|||
list.Add(1113710); // Battle Lust
|
||||
}
|
||||
|
||||
if (Core.SA && BloodDrinker != 0)
|
||||
{
|
||||
list.Add(1113591); // Blood Drinker
|
||||
}
|
||||
|
||||
if (Core.TOL && HitSparks != 0)
|
||||
{
|
||||
list.Add(1157326, HitSparks); // Sparks ~1_val~%
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue