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:
Kamron Batman 2021-12-05 09:40:57 -08:00 committed by GitHub
parent 1cf7b6c056
commit 4f9714818d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 311 additions and 382 deletions

View file

@ -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;
}