Caryatis |
11-05-2010 02:19 AM |
Rewrote this effect as well to use the bonus system as well as being incorporated into GetActSpellHealing.
Code:
Index: EQEmuServer/zone/bonuses.cpp
===================================================================
--- EQEmuServer/zone/bonuses.cpp (revision 1713)
+++ EQEmuServer/zone/bonuses.cpp (working copy)
@@ -1206,8 +1206,11 @@
newbon->Accuracy = effect_value;
break;
}
+ case SE_HealRate:
+ {
+ newbon->HealRate += effect_value;
+ break;
+ }
}
}
}
Index: EQEmuServer/zone/effects.cpp
===================================================================
--- EQEmuServer/zone/effects.cpp (revision 1713)
+++ EQEmuServer/zone/effects.cpp (working copy)
@@ -219,12 +219,22 @@
}
sint32 Client::GetActSpellHealing(int16 spell_id, sint32 value) {
+
sint32 modifier = 100;
modifier += GetFocusEffect(focusImprovedHeal, spell_id);
-
+
+ // Instant Heals
if(spells[spell_id].buffduration < 1) {
- //non-dot
+
+ // Check for buffs that affect the healrate of the target
+ if (this->GetTarget())
+ {
+ value += value * GetHealRate(this->GetTarget()) / 100;
+ if(value < 1)
+ return 0;
+ }
+
switch(GetAA(aaHealingAdept)) {
case 1:
modifier += 2;
Index: EQEmuServer/zone/mob.cpp
===================================================================
--- EQEmuServer/zone/mob.cpp (revision 1713)
+++ EQEmuServer/zone/mob.cpp (working copy)
@@ -3323,34 +3323,12 @@
return damage;
}
-int32 Mob::GetHealRate(uint32 amount, Mob *target)
+int32 Mob::GetHealRate(Mob *target)
{
-
- if(target) {
- int slot = target->GetBuffSlotFromType(SE_HealRate);
- if(slot >= 0)
- {
- sint32 modify_amount = amount;
- for(int i = 0; i < EFFECT_COUNT; i++)
- {
- if (spells[buffs[slot].spellid].effectid[i] == SE_HealRate)
- {
- // if the effect reduces the heal amount below 0, return 0.
- if(spells[buffs[slot].spellid].base[i] < -100)
- {
- amount = 0;
- break;
- }
- else
- {
- amount += (modify_amount * spells[buffs[slot].spellid].base[i] / 100);
- break;
- }
- }
- }
- }
- }
- return amount;
+ if(!target)
+ return 0;
+
+ return (target->itembonuses.HealRate + target->spellbonuses.HealRate);
}
bool Mob::TryFadeEffect(int slot)
Index: EQEmuServer/zone/mob.h
===================================================================
--- EQEmuServer/zone/mob.h (revision 1713)
+++ EQEmuServer/zone/mob.h (working copy)
@@ -275,6 +275,7 @@
sint8 HundredHands; //extra haste, stacks with all other haste i
sint8 MeleeLifetap;
+ sint16 HealRate;
int XPRateMod;
sint8 Packrat; //weight reduction for items, 1 point = 10%
@@ -796,7 +797,7 @@
void TryTwincast(Mob *caster, Mob *target, uint32 spell_id);
void TrySympatheticProc(Mob *target, uint32 spell_id);
bool TryFadeEffect(int slot);
- int32 GetHealRate(uint32 amount, Mob *target);
+ int32 GetHealRate(Mob *target);
sint32 GetVulnerability(sint32 damage, Mob *caster, uint32 spell_id, int32 ticsremaining);
sint32 GetSkillDmgTaken(const SkillType skill_used, sint32 damage);
void DoKnockback(Mob *caster, uint32 pushback, uint32 pushup);
Index: EQEmuServer/zone/spell_effects.cpp
===================================================================
--- EQEmuServer/zone/spell_effects.cpp (revision 1713)
+++ EQEmuServer/zone/spell_effects.cpp (working copy)
@@ -213,10 +213,8 @@
else if(dmg > 0) {
//healing spell...
if(caster)
- {
- dmg = GetHealRate(dmg, caster->GetTarget());
dmg = caster->GetActSpellHealing(spell_id, dmg);
- }
+
HealDamage(dmg, caster);
}
@@ -252,8 +250,6 @@
dmg = -dmg;
Damage(caster, dmg, spell_id, spell.skill, false, buffslot, false);
} else {
- if(caster)
- dmg = GetHealRate(dmg, caster->GetTarget());
HealDamage(dmg, caster);
}
break;
@@ -278,11 +274,7 @@
val = cap;
if(val > 0)
- {
- if(caster && caster->GetTarget())
- val = GetHealRate(val, caster->GetTarget());
HealDamage(val, caster);
- }
break;
}
@@ -3246,25 +3238,20 @@
effect_value = -effect_value;
Damage(caster, effect_value, spell_id, spell.skill, false, i, true);
} else if(effect_value > 0) {
- //healing spell...
- //healing aggro would go here; removed for now
- if(caster)
- {
- if (caster->GetTarget())
- effect_value = GetHealRate(effect_value, caster->GetTarget());
- effect_value = caster->GetActSpellHealing(spell_id, effect_value);
- }
+ // Regen spell...
+ effect_value += effect_value * (itembonuses.HealRate + spellbonuses.HealRate) / 100;
HealDamage(effect_value, caster);
}
-
break;
}
case SE_HealOverTime:
{
effect_value = CalcSpellEffectValue(spell_id, i, caster_level);
- effect_value = GetHealRate(effect_value, this);
- //is this affected by stuff like GetActSpellHealing??
+ if(caster)
+ // Currently returns no change as there are no AAs that affect HoTs but soon.
+ effect_value = caster->GetActSpellHealing(spell_id, effect_value);
+ effect_value += effect_value * (itembonuses.HealRate + spellbonuses.HealRate) / 100;
HealDamage(effect_value, caster);
//healing aggro would go here; removed for now
break;
|