fix: Fixes skill requirements and cleans up magery spells (#870)
* Preps damage stacking for mysticism, necromancy fixes, and spellweaving * Removes extra LINQ allocations * Fixes skill requirements for magery spells.
This commit is contained in:
parent
1cf7b6c056
commit
4f9714818d
16 changed files with 311 additions and 382 deletions
|
|
@ -184,7 +184,7 @@ namespace Server.Spells
|
|||
|
||||
public static void Turn(Mobile from, object to)
|
||||
{
|
||||
if (!(to is IPoint3D target))
|
||||
if (to is not IPoint3D target)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -333,7 +333,7 @@ namespace Server.Spells
|
|||
public static bool AddStatCurse(Mobile caster, Mobile target, StatType type, int curse, TimeSpan duration)
|
||||
{
|
||||
var offset = -curse;
|
||||
var name = $"[Magic] {type} Offset";
|
||||
var name = $"[Magic] {type} Curse";
|
||||
|
||||
var mod = target.GetStatMod(name);
|
||||
|
||||
|
|
@ -447,26 +447,8 @@ namespace Server.Spells
|
|||
var bcFrom = from as BaseCreature;
|
||||
var bcTarg = to as BaseCreature;
|
||||
|
||||
PlayerMobile pmFrom;
|
||||
PlayerMobile pmTarg;
|
||||
|
||||
if (bcFrom?.Summoned == true)
|
||||
{
|
||||
pmFrom = bcFrom.SummonMaster as PlayerMobile;
|
||||
}
|
||||
else
|
||||
{
|
||||
pmFrom = from as PlayerMobile;
|
||||
}
|
||||
|
||||
if (bcTarg?.Summoned == true)
|
||||
{
|
||||
pmTarg = bcTarg.SummonMaster as PlayerMobile;
|
||||
}
|
||||
else
|
||||
{
|
||||
pmTarg = to as PlayerMobile;
|
||||
}
|
||||
var pmFrom = (bcFrom?.Summoned == true ? bcFrom.SummonMaster : from) as PlayerMobile;
|
||||
var pmTarg = (bcTarg?.Summoned == true ? bcTarg.SummonMaster : to) as PlayerMobile;
|
||||
|
||||
if (pmFrom?.DuelContext != null && pmFrom.DuelContext == pmTarg?.DuelContext && pmFrom.DuelContext.Started &&
|
||||
pmFrom.DuelPlayer != null && pmTarg?.DuelPlayer != null)
|
||||
|
|
@ -864,17 +846,6 @@ namespace Server.Spells
|
|||
return x < 0 || y < 0 || x >= map.Width || y >= map.Height;
|
||||
}
|
||||
|
||||
// towns
|
||||
public static bool IsTown(IPoint3D ip, Mobile caster)
|
||||
{
|
||||
if (ip is Item item)
|
||||
{
|
||||
ip = item.GetWorldLocation();
|
||||
}
|
||||
|
||||
return IsTown(new Point3D(ip), caster);
|
||||
}
|
||||
|
||||
public static bool IsTown(Point3D loc, Mobile caster)
|
||||
{
|
||||
var map = caster.Map;
|
||||
|
|
@ -897,15 +868,8 @@ namespace Server.Spells
|
|||
return reg?.IsDisabled() == false;
|
||||
}
|
||||
|
||||
public static bool CheckTown(IPoint3D ip, Mobile caster)
|
||||
{
|
||||
if (ip is Item item)
|
||||
{
|
||||
ip = item.GetWorldLocation();
|
||||
}
|
||||
|
||||
return CheckTown(new Point3D(ip), caster);
|
||||
}
|
||||
public static bool CheckTown(IPoint3D ip, Mobile caster) =>
|
||||
CheckTown((ip as Item)?.GetWorldLocation() ?? new Point3D(ip), caster);
|
||||
|
||||
public static bool CheckTown(Point3D loc, Mobile caster)
|
||||
{
|
||||
|
|
@ -919,13 +883,13 @@ namespace Server.Spells
|
|||
}
|
||||
|
||||
// magic reflection
|
||||
public static void CheckReflect(int circle, Mobile caster, ref Mobile target)
|
||||
{
|
||||
public static bool CheckReflect(int circle, Mobile caster, ref Mobile target) =>
|
||||
CheckReflect(circle, ref caster, ref target);
|
||||
}
|
||||
|
||||
public static void CheckReflect(int circle, ref Mobile caster, ref Mobile target)
|
||||
public static bool CheckReflect(int circle, ref Mobile caster, ref Mobile target)
|
||||
{
|
||||
var reflect = false;
|
||||
|
||||
if (target.MagicDamageAbsorb > 0)
|
||||
{
|
||||
++circle;
|
||||
|
|
@ -933,41 +897,26 @@ namespace Server.Spells
|
|||
target.MagicDamageAbsorb -= circle;
|
||||
|
||||
// This order isn't very intuitive, but you have to nullify reflect before target gets switched
|
||||
|
||||
var reflect = target.MagicDamageAbsorb >= 0;
|
||||
|
||||
(target as BaseCreature)?.CheckReflect(caster, ref reflect);
|
||||
|
||||
reflect = target.MagicDamageAbsorb >= 0;
|
||||
if (target.MagicDamageAbsorb <= 0)
|
||||
{
|
||||
target.MagicDamageAbsorb = 0;
|
||||
DefensiveSpell.Nullify(target);
|
||||
}
|
||||
|
||||
if (reflect)
|
||||
{
|
||||
target.FixedEffect(0x37B9, 10, 5);
|
||||
|
||||
var temp = caster;
|
||||
caster = target;
|
||||
target = temp;
|
||||
}
|
||||
}
|
||||
else if (target is BaseCreature creature)
|
||||
|
||||
if (target is BaseCreature creature)
|
||||
{
|
||||
var reflect = false;
|
||||
|
||||
creature.CheckReflect(caster, ref reflect);
|
||||
|
||||
if (reflect)
|
||||
{
|
||||
creature.FixedEffect(0x37B9, 10, 5);
|
||||
|
||||
var temp = caster;
|
||||
caster = creature;
|
||||
target = temp;
|
||||
}
|
||||
}
|
||||
|
||||
if (reflect)
|
||||
{
|
||||
target.FixedEffect(0x37B9, 10, 5);
|
||||
(caster, target) = (target, caster);
|
||||
}
|
||||
|
||||
return reflect;
|
||||
}
|
||||
|
||||
public static void Damage(Spell spell, Mobile target, double damage)
|
||||
|
|
@ -995,20 +944,21 @@ namespace Server.Spells
|
|||
{
|
||||
(from as BaseCreature)?.AlterSpellDamageTo(target, ref iDamage);
|
||||
|
||||
(target as BaseCreature)?.AlterSpellDamageFrom(from, ref iDamage);
|
||||
var bcTarget = target as BaseCreature;
|
||||
bcTarget?.AlterSpellDamageFrom(from, ref iDamage);
|
||||
|
||||
target.Damage(iDamage, from);
|
||||
|
||||
if (from != null)
|
||||
{
|
||||
bcTarget?.OnHarmfulSpell(from);
|
||||
bcTarget?.OnDamagedBySpell(from);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
new SpellDamageTimer(spell, target, from, iDamage, delay).Start();
|
||||
}
|
||||
|
||||
if (target is BaseCreature c && from != null && delay == TimeSpan.Zero)
|
||||
{
|
||||
c.OnHarmfulSpell(from);
|
||||
c.OnDamagedBySpell(from);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Damage(
|
||||
|
|
@ -1086,6 +1036,11 @@ namespace Server.Spells
|
|||
|
||||
public static void DoLeech(int damageGiven, Mobile from, Mobile target)
|
||||
{
|
||||
if (target == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var context = TransformationSpellHelper.GetContext(from);
|
||||
|
||||
if (context == null) /* cleanup */
|
||||
|
|
@ -1134,7 +1089,7 @@ namespace Server.Spells
|
|||
m_Damage = damage;
|
||||
m_Spell = s;
|
||||
|
||||
if (m_Spell?.DelayedDamage == true && !m_Spell.DelayedDamageStacking)
|
||||
if (m_Spell?.DelayedDamage == true)
|
||||
{
|
||||
m_Spell.StartDelayedDamageContext(target, this);
|
||||
}
|
||||
|
|
@ -1143,7 +1098,6 @@ namespace Server.Spells
|
|||
protected override void OnTick()
|
||||
{
|
||||
(m_From as BaseCreature)?.AlterSpellDamageTo(m_Target, ref m_Damage);
|
||||
|
||||
(m_Target as BaseCreature)?.AlterSpellDamageFrom(m_From, ref m_Damage);
|
||||
|
||||
m_Target.Damage(m_Damage);
|
||||
|
|
@ -1181,7 +1135,8 @@ namespace Server.Spells
|
|||
m_Chaos = chaos;
|
||||
m_DFA = dfa;
|
||||
m_Spell = s;
|
||||
if (m_Spell?.DelayedDamage == true && !m_Spell.DelayedDamageStacking)
|
||||
|
||||
if (m_Spell?.DelayedDamage == true)
|
||||
{
|
||||
m_Spell.StartDelayedDamageContext(target, this);
|
||||
}
|
||||
|
|
@ -1189,10 +1144,9 @@ namespace Server.Spells
|
|||
|
||||
protected override void OnTick()
|
||||
{
|
||||
var bcFrom = m_From as BaseCreature;
|
||||
var bcTarg = m_Target as BaseCreature;
|
||||
|
||||
if (bcFrom != null && m_Target != null)
|
||||
if (m_From is BaseCreature bcFrom && m_Target != null)
|
||||
{
|
||||
bcFrom.AlterSpellDamageTo(m_Target, ref m_Damage);
|
||||
}
|
||||
|
|
@ -1253,7 +1207,7 @@ namespace Server.Spells
|
|||
|
||||
public static bool OnCast(Mobile caster, Spell spell)
|
||||
{
|
||||
if (!(spell is ITransformationSpell transformSpell))
|
||||
if (spell is not ITransformationSpell transformSpell)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue