diff --git a/changelog.txt b/changelog.txt index 08527447b..ac53a761b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,7 +2,7 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- == 07/2/2014 == Kayen: Implemented SE_Sanctuary - Places caster at bottom hate list, effect fades if caster cast spell on targets other than self. - +Kayen: Implemented SE_ResourceTap - Coverts a percent of dmg from dmg spells(DD/DoT) to hp/mana/end. == 06/25/2014 == Kayen: Updated SE_Hate (Renamed from SE_Hate2) to now properly work for instant +/- hate spells. diff --git a/common/spdat.h b/common/spdat.h index 0c2cf4b1f..3b9d88995 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -604,7 +604,7 @@ typedef enum { #define SE_TriggerSpellThreshold 454 // implemented Trigger effect on X amount of spell damage taken #define SE_AddHatePct 455 // implemented Modify total hate by % #define SE_AddHateOverTimePct 456 // implemented Modify total hate by % over time. -//#define SE_ResourceTap 457 // not used +#define SE_ResourceTap 457 // implemented Coverts a percent of dmg from dmg spells(DD/DoT) to hp/mana/end. //#define SE_FactionModPct 458 // not used #define SE_DamageModifier2 459 // implemented - Modifies melee damage by skill type diff --git a/zone/mob.h b/zone/mob.h index 5c1240e83..4f7b47c03 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -229,6 +229,7 @@ public: bool TryDispel(uint8 caster_level, uint8 buff_level, int level_modifier); void SpellProjectileEffect(); bool TrySpellProjectile(Mob* spell_target, uint16 spell_id); + void ResourceTap(int32 damage, uint16 spell_id); //Buff void BuffProcess(); diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 7bb227bd0..498e5d7ec 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -224,9 +224,11 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial) dmg = (int32) (dmg * partial / 100); //handles AAs and what not... - if(caster) + if(caster) { dmg = caster->GetActSpellDamage(spell_id, dmg, this); - + caster->ResourceTap(-dmg, spell_id); + } + dmg = -dmg; Damage(caster, dmg, spell_id, spell.skill, false, buffslot, false); } @@ -3367,6 +3369,8 @@ void Mob::DoBuffTic(uint16 spell_id, int slot, uint32 ticsremaining, uint8 caste if(caster->IsNPC()) effect_value = caster->CastToNPC()->GetActSpellDamage(spell_id, effect_value, this); + + caster->ResourceTap(-effect_value, spell_id); } effect_value = -effect_value; @@ -6283,4 +6287,28 @@ bool Mob::TrySpellProjectile(Mob* spell_target, uint16 spell_id){ return true; } +void Mob::ResourceTap(int32 damage, uint16 spellid){ + //'this' = caster + if (!IsValidSpell(spellid)) + return; + for (int i = 0; i <= EFFECT_COUNT; i++) + { + if (spells[spellid].effectid[i] == SE_ResourceTap){ + + damage += (damage * spells[spellid].base[i])/100; + + if (spells[spellid].max[i] && (damage > spells[spellid].max[i])) + damage = spells[spellid].max[i]; + + if (spells[spellid].base2[i] == 0) //HP Tap + SetHP((GetHP()+ damage)); + + if (spells[spellid].base2[i] == 1) //Mana Tap + SetMana(GetMana() + damage); + + if (spells[spellid].base2[i] == 2 && IsClient()) //Endurance Tap + CastToClient()->SetEndurance(CastToClient()->GetEndurance() + damage); + } + } +}