feat: Adds reflect damage ability. Fixes magical barrier (#1184)
This commit is contained in:
parent
3c5e9eaec9
commit
2806e5d4b7
5 changed files with 86 additions and 64 deletions
|
|
@ -5761,6 +5761,11 @@ namespace Server
|
||||||
|
|
||||||
public virtual void Damage(int amount, Mobile from = null, bool informMount = true)
|
public virtual void Damage(int amount, Mobile from = null, bool informMount = true)
|
||||||
{
|
{
|
||||||
|
if (amount <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!CanBeDamaged() || Deleted)
|
if (!CanBeDamaged() || Deleted)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|
@ -5771,67 +5776,64 @@ namespace Server
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (amount > 0)
|
var oldHits = Hits;
|
||||||
|
var newHits = oldHits - amount;
|
||||||
|
|
||||||
|
m_Spell?.OnCasterHurt();
|
||||||
|
|
||||||
|
// if (m_Spell != null && m_Spell.State == SpellState.Casting)
|
||||||
|
// m_Spell.Disturb( DisturbType.Hurt, false, true );
|
||||||
|
|
||||||
|
if (from != null)
|
||||||
{
|
{
|
||||||
var oldHits = Hits;
|
RegisterDamage(amount, from);
|
||||||
var newHits = oldHits - amount;
|
}
|
||||||
|
|
||||||
m_Spell?.OnCasterHurt();
|
DisruptiveAction();
|
||||||
|
|
||||||
// if (m_Spell != null && m_Spell.State == SpellState.Casting)
|
Paralyzed = false;
|
||||||
// m_Spell.Disturb( DisturbType.Hurt, false, true );
|
|
||||||
|
|
||||||
if (from != null)
|
switch (VisibleDamageType)
|
||||||
{
|
{
|
||||||
RegisterDamage(amount, from);
|
case VisibleDamageType.Related:
|
||||||
}
|
|
||||||
|
|
||||||
DisruptiveAction();
|
|
||||||
|
|
||||||
Paralyzed = false;
|
|
||||||
|
|
||||||
switch (VisibleDamageType)
|
|
||||||
{
|
|
||||||
case VisibleDamageType.Related:
|
|
||||||
{
|
|
||||||
SendVisibleDamageRelated(from, amount);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case VisibleDamageType.Everyone:
|
|
||||||
{
|
|
||||||
SendVisibleDamageEveryone(amount);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case VisibleDamageType.Selective:
|
|
||||||
{
|
|
||||||
SendVisibleDamageSelective(from, amount);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OnDamage(amount, from, newHits < 0);
|
|
||||||
|
|
||||||
if (informMount)
|
|
||||||
{
|
|
||||||
Mount?.OnRiderDamaged(amount, from, newHits < 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newHits < 0)
|
|
||||||
{
|
|
||||||
LastKiller = from;
|
|
||||||
|
|
||||||
Hits = 0;
|
|
||||||
|
|
||||||
if (oldHits >= 0)
|
|
||||||
{
|
{
|
||||||
Kill();
|
SendVisibleDamageRelated(from, amount);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
case VisibleDamageType.Everyone:
|
||||||
else
|
{
|
||||||
|
SendVisibleDamageEveryone(amount);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case VisibleDamageType.Selective:
|
||||||
|
{
|
||||||
|
SendVisibleDamageSelective(from, amount);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OnDamage(amount, from, newHits < 0);
|
||||||
|
|
||||||
|
if (informMount)
|
||||||
|
{
|
||||||
|
Mount?.OnRiderDamaged(amount, from, newHits < 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newHits < 0)
|
||||||
|
{
|
||||||
|
LastKiller = from;
|
||||||
|
|
||||||
|
Hits = 0;
|
||||||
|
|
||||||
|
if (oldHits >= 0)
|
||||||
{
|
{
|
||||||
Hits = newHits;
|
Kill();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Hits = newHits;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendVisibleDamageRelated(Mobile from, int amount)
|
public void SendVisibleDamageRelated(Mobile from, int amount)
|
||||||
|
|
|
||||||
|
|
@ -194,24 +194,35 @@ namespace Server
|
||||||
totalDamage = m.Hits;
|
totalDamage = m.Hits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var bcFrom = from as BaseCreature;
|
||||||
|
|
||||||
if (from is { Deleted: false, Alive: true })
|
if (from is { Deleted: false, Alive: true })
|
||||||
{
|
{
|
||||||
var reflectPhys = AosAttributes.GetValue(m, AosAttribute.ReflectPhysical);
|
var reflectPhys = AosAttributes.GetValue(m, AosAttribute.ReflectPhysical);
|
||||||
|
var reflectPhysAbility = bcFrom?.GetAbility(MonsterAbilityType.ReflectPhysicalDamage) as ReflectPhysicalDamage;
|
||||||
|
|
||||||
if (reflectPhys != 0 && from is BaseCreature bcFrom)
|
if (reflectPhysAbility
|
||||||
|
?.CanTrigger(bcFrom, MonsterAbilityTrigger.CombatAction) == true)
|
||||||
{
|
{
|
||||||
var magicalBarrier = bcFrom.GetAbility(MonsterAbilityType.MagicalBarrier);
|
reflectPhys += reflectPhysAbility.PercentReflected;
|
||||||
magicalBarrier.AlterMeleeDamageFrom(bcFrom, m, ref reflectPhys);
|
m.SendLocalizedMessage(1070844); // The creature repels the attack back at you.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reflectPhys != 0)
|
if (reflectPhys > 0)
|
||||||
{
|
{
|
||||||
var reflectDamage = Scale(
|
var reflectDamage = Scale(
|
||||||
damage * phys * (100 - (ignoreArmor ? 0 : m.PhysicalResistance)) / 10000,
|
damage * phys * (100 - (ignoreArmor ? 0 : m.PhysicalResistance)) / 10000,
|
||||||
reflectPhys
|
reflectPhys
|
||||||
);
|
);
|
||||||
|
|
||||||
from.Damage(reflectDamage, m);
|
bcFrom
|
||||||
|
?.GetAbility(MonsterAbilityType.MagicalBarrier)
|
||||||
|
?.AlterMeleeDamageFrom(bcFrom, m, ref reflectDamage);
|
||||||
|
|
||||||
|
if (reflectDamage > 0)
|
||||||
|
{
|
||||||
|
from.Damage(reflectDamage, m);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,5 +14,6 @@ public enum MonsterAbilityType
|
||||||
DeathExplosion,
|
DeathExplosion,
|
||||||
MassDrainLife,
|
MassDrainLife,
|
||||||
MagicalBarrier,
|
MagicalBarrier,
|
||||||
EnergyBoltCounter
|
EnergyBoltCounter,
|
||||||
|
ReflectPhysicalDamage
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
namespace Server.Mobiles;
|
||||||
|
|
||||||
|
public class ReflectPhysicalDamage : MonsterAbility
|
||||||
|
{
|
||||||
|
// This is handled manually in AOS.Damage()
|
||||||
|
public override MonsterAbilityTrigger AbilityTrigger => MonsterAbilityTrigger.CombatAction;
|
||||||
|
|
||||||
|
public override MonsterAbilityType AbilityType => MonsterAbilityType.ReflectPhysicalDamage;
|
||||||
|
|
||||||
|
public virtual int PercentReflected => 10;
|
||||||
|
}
|
||||||
|
|
@ -64,6 +64,9 @@ namespace Server.Mobiles
|
||||||
|
|
||||||
public override bool Uncalmable => true;
|
public override bool Uncalmable => true;
|
||||||
|
|
||||||
|
private static MonsterAbility[] _abilities = { new ReflectPhysicalDamage() };
|
||||||
|
public override MonsterAbility[] GetMonsterAbilities() => _abilities;
|
||||||
|
|
||||||
public override void GenerateLoot()
|
public override void GenerateLoot()
|
||||||
{
|
{
|
||||||
AddLoot(LootPack.FilthyRich);
|
AddLoot(LootPack.FilthyRich);
|
||||||
|
|
@ -71,12 +74,6 @@ namespace Server.Mobiles
|
||||||
AddLoot(LootPack.Gems, 2);
|
AddLoot(LootPack.Gems, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Repel Magic
|
|
||||||
* 10% chance of repelling a melee attack (why did they call it repel magic anyway?)
|
|
||||||
* Cliloc: 1070844
|
|
||||||
* Effect: damage is dealt to the attacker, no damage is taken by the fan dancer
|
|
||||||
*/
|
|
||||||
|
|
||||||
private void ThrowFan(Mobile to)
|
private void ThrowFan(Mobile to)
|
||||||
{
|
{
|
||||||
if (!(Utility.RandomDouble() < 0.8) || to.InRange(this, 1))
|
if (!(Utility.RandomDouble() < 0.8) || to.InRange(this, 1))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue