Fixes chaos damage bug with the spell system. Fixes various small other bugs. Fixes more merge cast type checks and uses default values.
This commit is contained in:
parent
9542c79ea4
commit
c155c82325
115 changed files with 644 additions and 1041 deletions
|
|
@ -90,13 +90,8 @@ namespace Server.Spells
|
|||
if (IsCasting)
|
||||
{
|
||||
object o = ProtectionSpell.Registry[Caster];
|
||||
bool disturb = true;
|
||||
|
||||
if (o is double)
|
||||
if ((double)o > Utility.RandomDouble() * 100.0)
|
||||
disturb = false;
|
||||
|
||||
if (disturb)
|
||||
if (!(o is double d) || d <= Utility.RandomDouble() * 100.0)
|
||||
Disturb(DisturbType.Hurt, false, true);
|
||||
}
|
||||
}
|
||||
|
|
@ -205,8 +200,8 @@ namespace Server.Spells
|
|||
|
||||
TransformContext context = TransformationSpellHelper.GetContext(Caster);
|
||||
|
||||
if (context?.Spell is ReaperFormSpell)
|
||||
damageBonus += ((ReaperFormSpell)context.Spell).SpellDamageBonus;
|
||||
if (context?.Spell is ReaperFormSpell spell)
|
||||
damageBonus += spell.SpellDamageBonus;
|
||||
|
||||
damage = AOS.Scale(damage, 100 + damageBonus);
|
||||
|
||||
|
|
@ -380,20 +375,12 @@ namespace Server.Spells
|
|||
}
|
||||
}
|
||||
|
||||
public void Disturb(DisturbType type)
|
||||
{
|
||||
Disturb(type, true, false);
|
||||
}
|
||||
|
||||
public virtual bool CheckDisturb(DisturbType type, bool firstCircle, bool resistable)
|
||||
{
|
||||
if (resistable && Scroll is BaseWand)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return !(resistable && Scroll is BaseWand);
|
||||
}
|
||||
|
||||
public void Disturb(DisturbType type, bool firstCircle, bool resistable)
|
||||
public void Disturb(DisturbType type, bool firstCircle = true, bool resistable = false)
|
||||
{
|
||||
if (!CheckDisturb(type, firstCircle, resistable))
|
||||
return;
|
||||
|
|
@ -456,7 +443,7 @@ namespace Server.Spells
|
|||
if (Scroll is BaseWand)
|
||||
return;
|
||||
|
||||
if (Info.Mantra != null && Info.Mantra.Length > 0 && Caster.Player)
|
||||
if (!string.IsNullOrEmpty(Info.Mantra) && Caster.Player)
|
||||
Caster.PublicOverheadMessage(MessageType.Spell, Caster.SpeechHue, true, Info.Mantra, false);
|
||||
}
|
||||
|
||||
|
|
@ -464,8 +451,8 @@ namespace Server.Spells
|
|||
{
|
||||
StartCastTime = Core.TickCount;
|
||||
|
||||
if (Core.AOS && Caster.Spell is Spell && ((Spell)Caster.Spell).State == SpellState.Sequencing)
|
||||
((Spell)Caster.Spell).Disturb(DisturbType.NewCast);
|
||||
if (Core.AOS && Caster.Spell is Spell spell && spell.State == SpellState.Sequencing)
|
||||
spell.Disturb(DisturbType.NewCast);
|
||||
|
||||
if (!Caster.CheckAlive()) return false;
|
||||
|
||||
|
|
@ -491,9 +478,9 @@ namespace Server.Spells
|
|||
{
|
||||
Caster.SendLocalizedMessage(502644); // You have not yet recovered from casting a spell.
|
||||
}
|
||||
else if (Caster is PlayerMobile && ((PlayerMobile)Caster).PeacedUntil > DateTime.UtcNow)
|
||||
else if (Caster is PlayerMobile mobile && mobile.PeacedUntil > DateTime.UtcNow)
|
||||
{
|
||||
Caster.SendLocalizedMessage(1072060); // You cannot cast a spell while calmed.
|
||||
mobile.SendLocalizedMessage(1072060); // You cannot cast a spell while calmed.
|
||||
}
|
||||
|
||||
#region Dueling
|
||||
|
|
@ -582,9 +569,7 @@ namespace Server.Spells
|
|||
if (Scroll is BaseWand)
|
||||
return true;
|
||||
|
||||
double minSkill, maxSkill;
|
||||
|
||||
GetCastSkills(out minSkill, out maxSkill);
|
||||
GetCastSkills(out double minSkill, out double maxSkill);
|
||||
|
||||
if (DamageSkill != CastSkill)
|
||||
Caster.CheckSkill(DamageSkill, 0.0, Caster.Skills[DamageSkill].Cap);
|
||||
|
|
@ -710,8 +695,8 @@ namespace Server.Spells
|
|||
DoFizzle();
|
||||
}
|
||||
else if (Scroll != null && !(Scroll is Runebook) &&
|
||||
(Scroll.Amount <= 0 || Scroll.Deleted || Scroll.RootParent != Caster || Scroll is BaseWand &&
|
||||
(((BaseWand)Scroll).Charges <= 0 || Scroll.Parent != Caster)))
|
||||
(Scroll.Amount <= 0 || Scroll.Deleted || Scroll.RootParent != Caster || Scroll is BaseWand baseWand &&
|
||||
(baseWand.Charges <= 0 || baseWand.Parent != Caster)))
|
||||
{
|
||||
DoFizzle();
|
||||
}
|
||||
|
|
@ -728,9 +713,9 @@ namespace Server.Spells
|
|||
Caster.SendLocalizedMessage(502646); // You cannot cast a spell while frozen.
|
||||
DoFizzle();
|
||||
}
|
||||
else if (Caster is PlayerMobile && ((PlayerMobile)Caster).PeacedUntil > DateTime.UtcNow)
|
||||
else if (Caster is PlayerMobile mobile && mobile.PeacedUntil > DateTime.UtcNow)
|
||||
{
|
||||
Caster.SendLocalizedMessage(1072060); // You cannot cast a spell while calmed.
|
||||
mobile.SendLocalizedMessage(1072060); // You cannot cast a spell while calmed.
|
||||
DoFizzle();
|
||||
}
|
||||
else if (CheckFizzle())
|
||||
|
|
@ -741,9 +726,9 @@ namespace Server.Spells
|
|||
{
|
||||
Scroll.Consume();
|
||||
}
|
||||
else if (Scroll is BaseWand)
|
||||
else if (Scroll is BaseWand wand)
|
||||
{
|
||||
((BaseWand)Scroll).ConsumeCharge(Caster);
|
||||
wand.ConsumeCharge(Caster);
|
||||
Caster.RevealingAction();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -102,6 +102,7 @@ namespace Server.Spells
|
|||
IsMLDungeon
|
||||
};
|
||||
|
||||
// TODO: Find a better way
|
||||
private static bool[,] m_Rules =
|
||||
{
|
||||
/*T2A(Fel), Khaldun, Ilshenar, Wind(Tram), Wind(Fel), Dungeons(Fel), Solen(Tram), Solen(Fel), CrystalCave(Malas), Gauntlet(Malas), Gauntlet(Ferry), SafeZone, Stronghold, ChampionSpawn, Dungeons(Tokuno[Malas]), LampRoom(Doom), GuardianRoom(Doom), Heartwood, MLDungeons */
|
||||
|
|
@ -155,17 +156,7 @@ namespace Server.Spells
|
|||
return Core.AOS ? AosDamageDelay : OldDamageDelay;
|
||||
}
|
||||
|
||||
public static bool CheckMulti(Point3D p, Map map)
|
||||
{
|
||||
return CheckMulti(p, map, true, 0);
|
||||
}
|
||||
|
||||
public static bool CheckMulti(Point3D p, Map map, bool houses)
|
||||
{
|
||||
return CheckMulti(p, map, houses, 0);
|
||||
}
|
||||
|
||||
public static bool CheckMulti(Point3D p, Map map, bool houses, int housingrange)
|
||||
public static bool CheckMulti(Point3D p, Map map, bool houses = true, int housingrange = 0)
|
||||
{
|
||||
if (map == null || map == Map.Internal)
|
||||
return false;
|
||||
|
|
@ -176,10 +167,8 @@ namespace Server.Spells
|
|||
{
|
||||
BaseMulti multi = sector.Multis[i];
|
||||
|
||||
if (multi is BaseHouse)
|
||||
if (multi is BaseHouse bh)
|
||||
{
|
||||
BaseHouse bh = (BaseHouse)multi;
|
||||
|
||||
if (houses && bh.IsInside(p, 16) || housingrange > 0 && bh.InRange(p, housingrange))
|
||||
return true;
|
||||
}
|
||||
|
|
@ -194,15 +183,11 @@ namespace Server.Spells
|
|||
|
||||
public static void Turn(Mobile from, object to)
|
||||
{
|
||||
IPoint3D target = to as IPoint3D;
|
||||
|
||||
if (target == null)
|
||||
if (!(to is IPoint3D target))
|
||||
return;
|
||||
|
||||
if (target is Item)
|
||||
if (target is Item item)
|
||||
{
|
||||
Item item = (Item)target;
|
||||
|
||||
if (item.RootParent != from)
|
||||
from.Direction = from.GetDirectionTo(item.GetWorldLocation());
|
||||
}
|
||||
|
|
@ -258,26 +243,18 @@ namespace Server.Spells
|
|||
|
||||
public static bool CanRevealCaster(Mobile m)
|
||||
{
|
||||
if (m is BaseCreature)
|
||||
{
|
||||
BaseCreature c = (BaseCreature)m;
|
||||
|
||||
if (!c.Controlled)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return m is BaseCreature c && !c.Controlled;
|
||||
}
|
||||
|
||||
public static void GetSurfaceTop(ref IPoint3D p)
|
||||
{
|
||||
if (p is Item)
|
||||
if (p is Item item)
|
||||
{
|
||||
p = ((Item)p).GetSurfaceTop();
|
||||
p = item.GetSurfaceTop();
|
||||
}
|
||||
else if (p is StaticTarget)
|
||||
else if (p is StaticTarget t)
|
||||
{
|
||||
StaticTarget t = (StaticTarget)p;
|
||||
int z = t.Z;
|
||||
|
||||
if ((t.Flags & TileFlag.Surface) == 0)
|
||||
|
|
@ -408,9 +385,8 @@ namespace Server.Spells
|
|||
{
|
||||
Guild g = m.Guild as Guild;
|
||||
|
||||
if (g == null && m is BaseCreature)
|
||||
if (g == null && m is BaseCreature c)
|
||||
{
|
||||
BaseCreature c = (BaseCreature)m;
|
||||
m = c.ControlMaster;
|
||||
|
||||
if (m != null)
|
||||
|
|
@ -436,26 +412,23 @@ namespace Server.Spells
|
|||
if (to.Hidden && to.AccessLevel > from.AccessLevel)
|
||||
return false;
|
||||
|
||||
BaseCreature bcFrom = from as BaseCreature;
|
||||
BaseCreature bcTarg = to as BaseCreature;
|
||||
|
||||
#region Dueling
|
||||
|
||||
PlayerMobile pmFrom = from as PlayerMobile;
|
||||
PlayerMobile pmTarg = to as PlayerMobile;
|
||||
PlayerMobile pmFrom;
|
||||
PlayerMobile pmTarg;
|
||||
|
||||
if (pmFrom == null && from is BaseCreature)
|
||||
{
|
||||
BaseCreature bcFrom = (BaseCreature)from;
|
||||
if (bcFrom != null && bcFrom.Summoned)
|
||||
pmFrom = bcFrom.SummonMaster as PlayerMobile;
|
||||
else
|
||||
pmFrom = from as PlayerMobile;
|
||||
|
||||
if (bcFrom.Summoned)
|
||||
pmFrom = bcFrom.SummonMaster as PlayerMobile;
|
||||
}
|
||||
|
||||
if (pmTarg == null && to is BaseCreature)
|
||||
{
|
||||
BaseCreature bcTarg = (BaseCreature)to;
|
||||
|
||||
if (bcTarg.Summoned)
|
||||
pmTarg = bcTarg.SummonMaster as PlayerMobile;
|
||||
}
|
||||
if (bcTarg != null && bcTarg.Summoned)
|
||||
pmTarg = bcTarg.SummonMaster as PlayerMobile;
|
||||
else
|
||||
pmTarg = to as PlayerMobile;
|
||||
|
||||
if (pmFrom != null && pmTarg != null)
|
||||
if (pmFrom.DuelContext != null && pmFrom.DuelContext == pmTarg.DuelContext && pmFrom.DuelContext.Started &&
|
||||
|
|
@ -475,37 +448,27 @@ namespace Server.Spells
|
|||
if (p != null && p.Contains(to))
|
||||
return false;
|
||||
|
||||
if (to is BaseCreature)
|
||||
if (bcTarg != null && (bcTarg.Controlled || bcTarg.Summoned))
|
||||
{
|
||||
BaseCreature c = (BaseCreature)to;
|
||||
if (bcTarg.ControlMaster == from || bcTarg.SummonMaster == from)
|
||||
return false;
|
||||
|
||||
if (c.Controlled || c.Summoned)
|
||||
{
|
||||
if (c.ControlMaster == from || c.SummonMaster == from)
|
||||
return false;
|
||||
|
||||
if (p != null && (p.Contains(c.ControlMaster) || p.Contains(c.SummonMaster)))
|
||||
return false;
|
||||
}
|
||||
if (p != null && (p.Contains(bcTarg.ControlMaster) || p.Contains(bcTarg.SummonMaster)))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (from is BaseCreature)
|
||||
if (bcFrom != null && (bcFrom.Controlled || bcFrom.Summoned))
|
||||
{
|
||||
BaseCreature c = (BaseCreature)from;
|
||||
if (bcFrom.ControlMaster == to || bcFrom.SummonMaster == to)
|
||||
return false;
|
||||
|
||||
if (c.Controlled || c.Summoned)
|
||||
{
|
||||
if (c.ControlMaster == to || c.SummonMaster == to)
|
||||
return false;
|
||||
p = Party.Get(to);
|
||||
|
||||
p = Party.Get(to);
|
||||
|
||||
if (p != null && (p.Contains(c.ControlMaster) || p.Contains(c.SummonMaster)))
|
||||
return false;
|
||||
}
|
||||
if (p != null && (p.Contains(bcFrom.ControlMaster) || p.Contains(bcFrom.SummonMaster)))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (to is BaseCreature && !((BaseCreature)to).Controlled && ((BaseCreature)to).InitialInnocent)
|
||||
if (bcTarg != null && !bcTarg.Controlled && bcTarg.InitialInnocent)
|
||||
return true;
|
||||
|
||||
int noto = Notoriety.Compute(from, to);
|
||||
|
|
@ -661,13 +624,8 @@ namespace Server.Spells
|
|||
}
|
||||
|
||||
// Always allow monsters to teleport
|
||||
if (caster is BaseCreature && (type == TravelCheckType.TeleportTo || type == TravelCheckType.TeleportFrom))
|
||||
{
|
||||
BaseCreature bc = (BaseCreature)caster;
|
||||
|
||||
if (!bc.Controlled && !bc.Summoned)
|
||||
if (caster is BaseCreature bc && !bc.Controlled && !bc.Summoned && (type == TravelCheckType.TeleportTo || type == TravelCheckType.TeleportFrom))
|
||||
return true;
|
||||
}
|
||||
|
||||
m_TravelCaster = caster;
|
||||
m_TravelType = type;
|
||||
|
|
@ -883,12 +841,12 @@ namespace Server.Spells
|
|||
}
|
||||
|
||||
//towns
|
||||
public static bool IsTown(IPoint3D loc, Mobile caster)
|
||||
public static bool IsTown(IPoint3D ip, Mobile caster)
|
||||
{
|
||||
if (loc is Item)
|
||||
loc = ((Item)loc).GetWorldLocation();
|
||||
if (ip is Item item)
|
||||
ip = item.GetWorldLocation();
|
||||
|
||||
return IsTown(new Point3D(loc), caster);
|
||||
return IsTown(new Point3D(ip), caster);
|
||||
}
|
||||
|
||||
public static bool IsTown(Point3D loc, Mobile caster)
|
||||
|
|
@ -917,12 +875,12 @@ namespace Server.Spells
|
|||
return reg != null && !reg.IsDisabled();
|
||||
}
|
||||
|
||||
public static bool CheckTown(IPoint3D loc, Mobile caster)
|
||||
public static bool CheckTown(IPoint3D ip, Mobile caster)
|
||||
{
|
||||
if (loc is Item)
|
||||
loc = ((Item)loc).GetWorldLocation();
|
||||
if (ip is Item item)
|
||||
ip = item.GetWorldLocation();
|
||||
|
||||
return CheckTown(new Point3D(loc), caster);
|
||||
return CheckTown(new Point3D(ip), caster);
|
||||
}
|
||||
|
||||
public static bool CheckTown(Point3D loc, Mobile caster)
|
||||
|
|
@ -971,18 +929,18 @@ namespace Server.Spells
|
|||
target = temp;
|
||||
}
|
||||
}
|
||||
else if (target is BaseCreature)
|
||||
else if (target is BaseCreature creature)
|
||||
{
|
||||
bool reflect = false;
|
||||
|
||||
((BaseCreature)target).CheckReflect(caster, ref reflect);
|
||||
creature.CheckReflect(caster, ref reflect);
|
||||
|
||||
if (reflect)
|
||||
{
|
||||
target.FixedEffect(0x37B9, 10, 5);
|
||||
creature.FixedEffect(0x37B9, 10, 5);
|
||||
|
||||
Mobile temp = caster;
|
||||
caster = target;
|
||||
caster = creature;
|
||||
target = temp;
|
||||
}
|
||||
}
|
||||
|
|
@ -1022,63 +980,45 @@ namespace Server.Spells
|
|||
new SpellDamageTimer(spell, target, from, iDamage, delay).Start();
|
||||
}
|
||||
|
||||
if (target is BaseCreature && from != null && delay == TimeSpan.Zero)
|
||||
if (target is BaseCreature c && from != null && delay == TimeSpan.Zero)
|
||||
{
|
||||
BaseCreature c = (BaseCreature)target;
|
||||
|
||||
c.OnHarmfulSpell(from);
|
||||
c.OnDamagedBySpell(from);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Damage(Spell spell, Mobile target, double damage, int phys, int fire, int cold, int pois,
|
||||
int nrgy)
|
||||
int nrgy, int chaos = 0, DFAlgorithm dfa = DFAlgorithm.Standard)
|
||||
{
|
||||
TimeSpan ts = GetDamageDelayForSpell(spell);
|
||||
|
||||
Damage(spell, ts, target, spell.Caster, damage, phys, fire, cold, pois, nrgy, DFAlgorithm.Standard);
|
||||
}
|
||||
|
||||
public static void Damage(Spell spell, Mobile target, double damage, int phys, int fire, int cold, int pois,
|
||||
int nrgy, DFAlgorithm dfa)
|
||||
{
|
||||
TimeSpan ts = GetDamageDelayForSpell(spell);
|
||||
|
||||
Damage(spell, ts, target, spell.Caster, damage, phys, fire, cold, pois, nrgy, dfa);
|
||||
Damage(spell, GetDamageDelayForSpell(spell), target, spell.Caster, damage, phys, fire, cold, pois, nrgy, chaos, dfa);
|
||||
}
|
||||
|
||||
public static void Damage(TimeSpan delay, Mobile target, double damage, int phys, int fire, int cold, int pois,
|
||||
int nrgy)
|
||||
int nrgy, int chaos = 0, DFAlgorithm dfa = DFAlgorithm.Standard)
|
||||
{
|
||||
Damage(delay, target, null, damage, phys, fire, cold, pois, nrgy);
|
||||
Damage(delay, target, null, damage, phys, fire, cold, pois, nrgy, chaos, dfa);
|
||||
}
|
||||
|
||||
public static void Damage(TimeSpan delay, Mobile target, Mobile from, double damage, int phys, int fire, int cold,
|
||||
int pois, int nrgy)
|
||||
int pois, int nrgy, int chaos = 0, DFAlgorithm dfa = DFAlgorithm.Standard)
|
||||
{
|
||||
Damage(delay, target, from, damage, phys, fire, cold, pois, nrgy, DFAlgorithm.Standard);
|
||||
}
|
||||
|
||||
public static void Damage(TimeSpan delay, Mobile target, Mobile from, double damage, int phys, int fire, int cold,
|
||||
int pois, int nrgy, DFAlgorithm dfa)
|
||||
{
|
||||
Damage(null, delay, target, from, damage, phys, fire, cold, pois, nrgy, dfa);
|
||||
Damage(null, delay, target, from, damage, phys, fire, cold, pois, nrgy, chaos, dfa);
|
||||
}
|
||||
|
||||
public static void Damage(Spell spell, TimeSpan delay, Mobile target, Mobile from, double damage, int phys, int fire,
|
||||
int cold, int pois, int nrgy, DFAlgorithm dfa)
|
||||
int cold, int pois, int nrgy, int chaos = 0, DFAlgorithm dfa = DFAlgorithm.Standard)
|
||||
{
|
||||
int iDamage = (int)damage;
|
||||
int dmg = (int)damage;
|
||||
|
||||
if (delay == TimeSpan.Zero)
|
||||
{
|
||||
(from as BaseCreature)?.AlterSpellDamageTo(target, ref iDamage);
|
||||
(from as BaseCreature)?.AlterSpellDamageTo(target, ref dmg);
|
||||
|
||||
(target as BaseCreature)?.AlterSpellDamageFrom(from, ref iDamage);
|
||||
(target as BaseCreature)?.AlterSpellDamageFrom(from, ref dmg);
|
||||
|
||||
WeightOverloading.DFA = dfa;
|
||||
|
||||
int damageGiven = AOS.Damage(target, from, iDamage, phys, fire, cold, pois, nrgy);
|
||||
int damageGiven = AOS.Damage(target, from, dmg, phys, fire, cold, pois, nrgy, chaos);
|
||||
|
||||
if (from != null) // sanity check
|
||||
DoLeech(damageGiven, from, target);
|
||||
|
|
@ -1087,13 +1027,11 @@ namespace Server.Spells
|
|||
}
|
||||
else
|
||||
{
|
||||
new SpellDamageTimerAOS(spell, target, from, iDamage, phys, fire, cold, pois, nrgy, delay, dfa).Start();
|
||||
new SpellDamageTimerAOS(spell, delay, target, from, dmg, phys, fire, cold, pois, nrgy, chaos, dfa).Start();
|
||||
}
|
||||
|
||||
if (target is BaseCreature && from != null && delay == TimeSpan.Zero)
|
||||
if (target is BaseCreature c && from != null && delay == TimeSpan.Zero)
|
||||
{
|
||||
BaseCreature c = (BaseCreature)target;
|
||||
|
||||
c.OnHarmfulSpell(from);
|
||||
c.OnDamagedBySpell(from);
|
||||
}
|
||||
|
|
@ -1103,25 +1041,25 @@ namespace Server.Spells
|
|||
{
|
||||
TransformContext context = TransformationSpellHelper.GetContext(from);
|
||||
|
||||
if (context != null) /* cleanup */
|
||||
if (context == null) /* cleanup */
|
||||
return;
|
||||
|
||||
if (context.Type == typeof(WraithFormSpell))
|
||||
{
|
||||
if (context.Type == typeof(WraithFormSpell))
|
||||
int wraithLeech =
|
||||
5 + (int)(15 * from.Skills.SpiritSpeak.Value / 100); // Wraith form gives 5-20% mana leech
|
||||
int manaLeech = AOS.Scale(damageGiven, wraithLeech);
|
||||
if (manaLeech != 0)
|
||||
{
|
||||
int wraithLeech =
|
||||
5 + (int)(15 * from.Skills.SpiritSpeak.Value / 100); // Wraith form gives 5-20% mana leech
|
||||
int manaLeech = AOS.Scale(damageGiven, wraithLeech);
|
||||
if (manaLeech != 0)
|
||||
{
|
||||
from.Mana += manaLeech;
|
||||
from.PlaySound(0x44D);
|
||||
}
|
||||
}
|
||||
else if (context.Type == typeof(VampiricEmbraceSpell))
|
||||
{
|
||||
from.Hits += AOS.Scale(damageGiven, 20);
|
||||
from.Mana += manaLeech;
|
||||
from.PlaySound(0x44D);
|
||||
}
|
||||
}
|
||||
else if (context.Type == typeof(VampiricEmbraceSpell))
|
||||
{
|
||||
from.Hits += AOS.Scale(damageGiven, 20);
|
||||
from.PlaySound(0x44D);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Heal(int amount, Mobile target, Mobile from)
|
||||
|
|
@ -1172,12 +1110,12 @@ namespace Server.Spells
|
|||
{
|
||||
private int m_Damage;
|
||||
private DFAlgorithm m_DFA;
|
||||
private int m_Phys, m_Fire, m_Cold, m_Pois, m_Nrgy;
|
||||
private int m_Phys, m_Fire, m_Cold, m_Pois, m_Nrgy, m_Chaos;
|
||||
private Spell m_Spell;
|
||||
private Mobile m_Target, m_From;
|
||||
|
||||
public SpellDamageTimerAOS(Spell s, Mobile target, Mobile from, int damage, int phys, int fire, int cold,
|
||||
int pois, int nrgy, TimeSpan delay, DFAlgorithm dfa)
|
||||
public SpellDamageTimerAOS(Spell s, TimeSpan delay, Mobile target, Mobile from, int damage, int phys, int fire, int cold,
|
||||
int pois, int nrgy, int chaos, DFAlgorithm dfa)
|
||||
: base(delay)
|
||||
{
|
||||
m_Target = target;
|
||||
|
|
@ -1188,6 +1126,7 @@ namespace Server.Spells
|
|||
m_Cold = cold;
|
||||
m_Pois = pois;
|
||||
m_Nrgy = nrgy;
|
||||
m_Chaos = chaos;
|
||||
m_DFA = dfa;
|
||||
m_Spell = s;
|
||||
if (m_Spell != null && m_Spell.DelayedDamage && !m_Spell.DelayedDamageStacking)
|
||||
|
|
@ -1198,27 +1137,28 @@ namespace Server.Spells
|
|||
|
||||
protected override void OnTick()
|
||||
{
|
||||
if (m_From is BaseCreature && m_Target != null)
|
||||
((BaseCreature)m_From).AlterSpellDamageTo(m_Target, ref m_Damage);
|
||||
BaseCreature bcFrom = m_From as BaseCreature;
|
||||
BaseCreature bcTarg = m_Target as BaseCreature;
|
||||
|
||||
if (bcFrom != null && m_Target != null)
|
||||
bcFrom.AlterSpellDamageTo(m_Target, ref m_Damage);
|
||||
|
||||
if (m_Target is BaseCreature && m_From != null)
|
||||
((BaseCreature)m_Target).AlterSpellDamageFrom(m_From, ref m_Damage);
|
||||
if (bcTarg != null && m_From != null)
|
||||
bcTarg.AlterSpellDamageFrom(m_From, ref m_Damage);
|
||||
|
||||
WeightOverloading.DFA = m_DFA;
|
||||
|
||||
int damageGiven = AOS.Damage(m_Target, m_From, m_Damage, m_Phys, m_Fire, m_Cold, m_Pois, m_Nrgy);
|
||||
int damageGiven = AOS.Damage(m_Target, m_From, m_Damage, m_Phys, m_Fire, m_Cold, m_Pois, m_Nrgy, m_Chaos);
|
||||
|
||||
if (m_From != null) // sanity check
|
||||
DoLeech(damageGiven, m_From, m_Target);
|
||||
|
||||
WeightOverloading.DFA = DFAlgorithm.Standard;
|
||||
|
||||
if (m_Target is BaseCreature && m_From != null)
|
||||
if (bcTarg != null && m_From != null)
|
||||
{
|
||||
BaseCreature c = (BaseCreature)m_Target;
|
||||
|
||||
c.OnHarmfulSpell(m_From);
|
||||
c.OnDamagedBySpell(m_From);
|
||||
bcTarg.OnHarmfulSpell(m_From);
|
||||
bcTarg.OnDamagedBySpell(m_From);
|
||||
}
|
||||
|
||||
m_Spell?.RemoveDelayedDamageContext(m_Target);
|
||||
|
|
@ -1253,9 +1193,7 @@ namespace Server.Spells
|
|||
|
||||
public static bool OnCast(Mobile caster, Spell spell)
|
||||
{
|
||||
ITransformationSpell transformSpell = spell as ITransformationSpell;
|
||||
|
||||
if (transformSpell == null)
|
||||
if (!(spell is ITransformationSpell transformSpell))
|
||||
return false;
|
||||
|
||||
if (Sigil.ExistsOn(caster))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue