mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-05 09:22:24 +00:00
[Spells] Fixes for numhits type 7 counter incrementing incorrectly. (#2022)
* [Spells] Fix for numhits type 7 counter incrementing incorrectly. * [Spells] Fixes for numhits type 7 counter incrementing incorrectly. bot fix * [Spells] Fixes for numhits type 7 counter incrementing incorrectly. mercs * [Spells] Fixes for numhits type 7 counter incrementing incorrectly. remove old variable and related code. * [Spells] Fixes for numhits type 7 counter incrementing incorrectly. comments
This commit is contained in:
parent
2ec6dcbe24
commit
6dffeacc6e
@ -5275,7 +5275,7 @@ int32 Bot::CalcBotAAFocus(focusType type, uint32 aa_ID, uint32 points, uint16 sp
|
|||||||
return (value * lvlModifier / 100);
|
return (value * lvlModifier / 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 Bot::GetBotFocusEffect(focusType bottype, uint16 spell_id) {
|
int32 Bot::GetBotFocusEffect(focusType bottype, uint16 spell_id, bool from_buff_tic) {
|
||||||
if (IsBardSong(spell_id) && bottype != focusFcBaseEffects)
|
if (IsBardSong(spell_id) && bottype != focusFcBaseEffects)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -5390,9 +5390,9 @@ int32 Bot::GetBotFocusEffect(focusType bottype, uint16 spell_id) {
|
|||||||
if(focusspell_tracker && rand_effectiveness && focus_max_real2 != 0)
|
if(focusspell_tracker && rand_effectiveness && focus_max_real2 != 0)
|
||||||
realTotal2 = CalcBotFocusEffect(bottype, focusspell_tracker, spell_id);
|
realTotal2 = CalcBotFocusEffect(bottype, focusspell_tracker, spell_id);
|
||||||
|
|
||||||
// For effects like gift of mana that only fire once, save the spellid into an array that consists of all available buff slots.
|
if (!from_buff_tic && buff_tracker >= 0 && buffs[buff_tracker].hit_number > 0) {
|
||||||
if(buff_tracker >= 0 && buffs[buff_tracker].hit_number > 0)
|
CheckNumHitsRemaining(NumHit::MatchingSpells, buff_tracker);
|
||||||
m_spellHitsLeft[buff_tracker] = focusspell_tracker;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// AA Focus
|
// AA Focus
|
||||||
|
|||||||
@ -601,7 +601,7 @@ protected:
|
|||||||
virtual void PetAIProcess();
|
virtual void PetAIProcess();
|
||||||
virtual void BotMeditate(bool isSitting);
|
virtual void BotMeditate(bool isSitting);
|
||||||
virtual bool CheckBotDoubleAttack(bool Triple = false);
|
virtual bool CheckBotDoubleAttack(bool Triple = false);
|
||||||
virtual int32 GetBotFocusEffect(focusType bottype, uint16 spell_id);
|
virtual int32 GetBotFocusEffect(focusType bottype, uint16 spell_id, bool from_buff_tic = false);
|
||||||
virtual int32 CalcBotFocusEffect(focusType bottype, uint16 focus_id, uint16 spell_id, bool best_focus=false);
|
virtual int32 CalcBotFocusEffect(focusType bottype, uint16 focus_id, uint16 spell_id, bool best_focus=false);
|
||||||
virtual int32 CalcBotAAFocus(focusType type, uint32 aa_ID, uint32 points, uint16 spell_id);
|
virtual int32 CalcBotAAFocus(focusType type, uint32 aa_ID, uint32 points, uint16 spell_id);
|
||||||
virtual void PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* client);
|
virtual void PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* client);
|
||||||
|
|||||||
@ -1648,7 +1648,7 @@ protected:
|
|||||||
void MakeBuffFadePacket(uint16 spell_id, int slot_id, bool send_message = true);
|
void MakeBuffFadePacket(uint16 spell_id, int slot_id, bool send_message = true);
|
||||||
bool client_data_loaded;
|
bool client_data_loaded;
|
||||||
|
|
||||||
int32 GetFocusEffect(focusType type, uint16 spell_id, Mob *caster = nullptr);
|
int32 GetFocusEffect(focusType type, uint16 spell_id, Mob *caster = nullptr, bool from_buff_tic = false);
|
||||||
uint16 GetSympatheticFocusEffect(focusType type, uint16 spell_id);
|
uint16 GetSympatheticFocusEffect(focusType type, uint16 spell_id);
|
||||||
|
|
||||||
void FinishAlternateAdvancementPurchase(AA::Rank *rank, bool ignore_cost);
|
void FinishAlternateAdvancementPurchase(AA::Rank *rank, bool ignore_cost);
|
||||||
|
|||||||
@ -192,7 +192,7 @@ int32 Mob::GetActReflectedSpellDamage(int32 spell_id, int32 value, int effective
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 Mob::GetActDoTDamage(uint16 spell_id, int32 value, Mob* target) {
|
int32 Mob::GetActDoTDamage(uint16 spell_id, int32 value, Mob* target, bool from_buff_tic) {
|
||||||
|
|
||||||
if (target == nullptr)
|
if (target == nullptr)
|
||||||
return value;
|
return value;
|
||||||
@ -216,16 +216,16 @@ int32 Mob::GetActDoTDamage(uint16 spell_id, int32 value, Mob* target) {
|
|||||||
int32 ratio = 200;
|
int32 ratio = 200;
|
||||||
ratio += itembonuses.DotCritDmgIncrease + spellbonuses.DotCritDmgIncrease + aabonuses.DotCritDmgIncrease;
|
ratio += itembonuses.DotCritDmgIncrease + spellbonuses.DotCritDmgIncrease + aabonuses.DotCritDmgIncrease;
|
||||||
value = base_value*ratio/100;
|
value = base_value*ratio/100;
|
||||||
value += int(base_value*GetFocusEffect(focusImprovedDamage, spell_id)/100)*ratio/100;
|
value += int(base_value*GetFocusEffect(focusImprovedDamage, spell_id, nullptr, from_buff_tic)/100)*ratio/100;
|
||||||
value += int(base_value*GetFocusEffect(focusImprovedDamage2, spell_id)/100)*ratio/100;
|
value += int(base_value*GetFocusEffect(focusImprovedDamage2, spell_id, nullptr, from_buff_tic)/100)*ratio/100;
|
||||||
value += int(base_value*GetFocusEffect(focusFcDamagePctCrit, spell_id)/100)*ratio/100;
|
value += int(base_value*GetFocusEffect(focusFcDamagePctCrit, spell_id, nullptr, from_buff_tic)/100)*ratio/100;
|
||||||
value += int(base_value*GetFocusEffect(focusFcAmplifyMod, spell_id) / 100)*ratio/100;
|
value += int(base_value*GetFocusEffect(focusFcAmplifyMod, spell_id, nullptr, from_buff_tic) / 100)*ratio/100;
|
||||||
value += int(base_value*target->GetVulnerability(this, spell_id, 0)/100)*ratio/100;
|
value += int(base_value*target->GetVulnerability(this, spell_id, 0, from_buff_tic)/100)*ratio/100;
|
||||||
extra_dmg = target->GetFcDamageAmtIncoming(this, spell_id) +
|
extra_dmg = target->GetFcDamageAmtIncoming(this, spell_id, from_buff_tic) +
|
||||||
int(GetFocusEffect(focusFcDamageAmtCrit, spell_id)*ratio/100) +
|
int(GetFocusEffect(focusFcDamageAmtCrit, spell_id, nullptr, from_buff_tic)*ratio/100) +
|
||||||
GetFocusEffect(focusFcDamageAmt, spell_id) +
|
GetFocusEffect(focusFcDamageAmt, spell_id, nullptr, from_buff_tic) +
|
||||||
GetFocusEffect(focusFcDamageAmt2, spell_id) +
|
GetFocusEffect(focusFcDamageAmt2, spell_id, nullptr, from_buff_tic) +
|
||||||
GetFocusEffect(focusFcAmplifyAmt, spell_id);
|
GetFocusEffect(focusFcAmplifyAmt, spell_id, nullptr, from_buff_tic);
|
||||||
|
|
||||||
if (RuleB(Spells, DOTsScaleWithSpellDmg)) {
|
if (RuleB(Spells, DOTsScaleWithSpellDmg)) {
|
||||||
if (RuleB(Spells, IgnoreSpellDmgLvlRestriction) && !spells[spell_id].no_heal_damage_item_mod && itembonuses.SpellDmg) {
|
if (RuleB(Spells, IgnoreSpellDmgLvlRestriction) && !spells[spell_id].no_heal_damage_item_mod && itembonuses.SpellDmg) {
|
||||||
@ -247,16 +247,16 @@ int32 Mob::GetActDoTDamage(uint16 spell_id, int32 value, Mob* target) {
|
|||||||
else {
|
else {
|
||||||
|
|
||||||
value = base_value;
|
value = base_value;
|
||||||
value += base_value*GetFocusEffect(focusImprovedDamage, spell_id)/100;
|
value += base_value*GetFocusEffect(focusImprovedDamage, spell_id, nullptr, from_buff_tic)/100;
|
||||||
value += base_value*GetFocusEffect(focusImprovedDamage2, spell_id)/100;
|
value += base_value*GetFocusEffect(focusImprovedDamage2, spell_id, nullptr, from_buff_tic)/100;
|
||||||
value += base_value*GetFocusEffect(focusFcDamagePctCrit, spell_id)/100;
|
value += base_value*GetFocusEffect(focusFcDamagePctCrit, spell_id, nullptr, from_buff_tic)/100;
|
||||||
value += base_value*GetFocusEffect(focusFcAmplifyMod, spell_id)/100;
|
value += base_value*GetFocusEffect(focusFcAmplifyMod, spell_id, nullptr, from_buff_tic)/100;
|
||||||
value += base_value*target->GetVulnerability(this, spell_id, 0)/100;
|
value += base_value*target->GetVulnerability(this, spell_id, 0, from_buff_tic)/100;
|
||||||
extra_dmg = target->GetFcDamageAmtIncoming(this, spell_id) +
|
extra_dmg = target->GetFcDamageAmtIncoming(this, spell_id, from_buff_tic) +
|
||||||
GetFocusEffect(focusFcDamageAmtCrit, spell_id) +
|
GetFocusEffect(focusFcDamageAmtCrit, spell_id, nullptr, from_buff_tic) +
|
||||||
GetFocusEffect(focusFcDamageAmt, spell_id) +
|
GetFocusEffect(focusFcDamageAmt, spell_id, nullptr, from_buff_tic) +
|
||||||
GetFocusEffect(focusFcDamageAmt2, spell_id) +
|
GetFocusEffect(focusFcDamageAmt2, spell_id, nullptr, from_buff_tic) +
|
||||||
GetFocusEffect(focusFcAmplifyAmt, spell_id);
|
GetFocusEffect(focusFcAmplifyAmt, spell_id, nullptr, from_buff_tic);
|
||||||
|
|
||||||
if (RuleB(Spells, DOTsScaleWithSpellDmg)) {
|
if (RuleB(Spells, DOTsScaleWithSpellDmg)) {
|
||||||
if (RuleB(Spells, IgnoreSpellDmgLvlRestriction) && !spells[spell_id].no_heal_damage_item_mod && itembonuses.SpellDmg) {
|
if (RuleB(Spells, IgnoreSpellDmgLvlRestriction) && !spells[spell_id].no_heal_damage_item_mod && itembonuses.SpellDmg) {
|
||||||
@ -316,7 +316,7 @@ int32 Mob::GetExtraSpellAmt(uint16 spell_id, int32 extra_spell_amt, int32 base_s
|
|||||||
return extra_spell_amt;
|
return extra_spell_amt;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 Mob::GetActSpellHealing(uint16 spell_id, int32 value, Mob* target) {
|
int32 Mob::GetActSpellHealing(uint16 spell_id, int32 value, Mob* target, bool from_buff_tic) {
|
||||||
|
|
||||||
|
|
||||||
if (IsNPC()) {
|
if (IsNPC()) {
|
||||||
@ -356,8 +356,8 @@ int32 Mob::GetActSpellHealing(uint16 spell_id, int32 value, Mob* target) {
|
|||||||
if (GetClass() == CLERIC) {
|
if (GetClass() == CLERIC) {
|
||||||
value += int(base_value*RuleI(Spells, ClericInnateHealFocus) / 100); //confirmed on live parsing clerics get an innate 5 pct heal focus
|
value += int(base_value*RuleI(Spells, ClericInnateHealFocus) / 100); //confirmed on live parsing clerics get an innate 5 pct heal focus
|
||||||
}
|
}
|
||||||
value += int(base_value*GetFocusEffect(focusImprovedHeal, spell_id) / 100);
|
value += int(base_value*GetFocusEffect(focusImprovedHeal, spell_id, nullptr, from_buff_tic) / 100);
|
||||||
value += int(base_value*GetFocusEffect(focusFcAmplifyMod, spell_id) / 100);
|
value += int(base_value*GetFocusEffect(focusFcAmplifyMod, spell_id, nullptr, from_buff_tic) / 100);
|
||||||
|
|
||||||
// Instant Heals
|
// Instant Heals
|
||||||
if (spells[spell_id].buff_duration < 1) {
|
if (spells[spell_id].buff_duration < 1) {
|
||||||
|
|||||||
@ -2552,7 +2552,7 @@ bool Merc::CheckAENuke(Merc* caster, Mob* tar, uint16 spell_id, uint8 &numTarget
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 Merc::GetFocusEffect(focusType type, uint16 spell_id) {
|
int32 Merc::GetFocusEffect(focusType type, uint16 spell_id, bool from_buff_tic) {
|
||||||
|
|
||||||
int32 realTotal = 0;
|
int32 realTotal = 0;
|
||||||
int32 realTotal2 = 0;
|
int32 realTotal2 = 0;
|
||||||
@ -2666,9 +2666,8 @@ int32 Merc::GetFocusEffect(focusType type, uint16 spell_id) {
|
|||||||
if(focusspell_tracker && rand_effectiveness && focus_max_real2 != 0)
|
if(focusspell_tracker && rand_effectiveness && focus_max_real2 != 0)
|
||||||
realTotal2 = CalcFocusEffect(type, focusspell_tracker, spell_id);
|
realTotal2 = CalcFocusEffect(type, focusspell_tracker, spell_id);
|
||||||
|
|
||||||
// For effects like gift of mana that only fire once, save the spellid into an array that consists of all available buff slots.
|
if (!from_buff_tic && buff_tracker >= 0 && buffs[buff_tracker].hit_number > 0) {
|
||||||
if(buff_tracker >= 0 && buffs[buff_tracker].hit_number > 0) {
|
CheckNumHitsRemaining(NumHit::MatchingSpells, buff_tracker);
|
||||||
m_spellHitsLeft[buff_tracker] = focusspell_tracker;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -272,7 +272,7 @@ protected:
|
|||||||
void AddItemBonuses(const EQ::ItemData *item, StatBonuses* newbon);
|
void AddItemBonuses(const EQ::ItemData *item, StatBonuses* newbon);
|
||||||
int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat);
|
int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat);
|
||||||
|
|
||||||
int32 GetFocusEffect(focusType type, uint16 spell_id);
|
int32 GetFocusEffect(focusType type, uint16 spell_id, bool from_buff_tic = false);
|
||||||
|
|
||||||
std::vector<MercSpell> merc_spells;
|
std::vector<MercSpell> merc_spells;
|
||||||
std::map<uint32,MercTimer> timers;
|
std::map<uint32,MercTimer> timers;
|
||||||
|
|||||||
@ -313,8 +313,6 @@ Mob::Mob(
|
|||||||
armor_tint.Slot[i].Color = in_armor_tint.Slot[i].Color;
|
armor_tint.Slot[i].Color = in_armor_tint.Slot[i].Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::fill(std::begin(m_spellHitsLeft), std::end(m_spellHitsLeft), 0);
|
|
||||||
|
|
||||||
m_Delta = glm::vec4();
|
m_Delta = glm::vec4();
|
||||||
animation = 0;
|
animation = 0;
|
||||||
|
|
||||||
@ -4567,7 +4565,7 @@ void Mob::ApplyHealthTransferDamage(Mob *caster, Mob *target, uint16 spell_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 Mob::GetVulnerability(Mob *caster, uint32 spell_id, uint32 ticsremaining)
|
int32 Mob::GetVulnerability(Mob *caster, uint32 spell_id, uint32 ticsremaining, bool from_buff_tic)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Modifies incoming spell damage by percent, to increase or decrease damage, can be limited to specific resists.
|
Modifies incoming spell damage by percent, to increase or decrease damage, can be limited to specific resists.
|
||||||
@ -4593,8 +4591,8 @@ int32 Mob::GetVulnerability(Mob *caster, uint32 spell_id, uint32 ticsremaining)
|
|||||||
innate_mod = Vulnerability_Mod[HIGHEST_RESIST + 1];
|
innate_mod = Vulnerability_Mod[HIGHEST_RESIST + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
fc_spell_vulnerability_mod = GetFocusEffect(focusSpellVulnerability, spell_id, caster);
|
fc_spell_vulnerability_mod = GetFocusEffect(focusSpellVulnerability, spell_id, caster, from_buff_tic);
|
||||||
fc_spell_damage_pct_incomingPC_mod = GetFocusEffect(focusFcSpellDamagePctIncomingPC, spell_id, caster);
|
fc_spell_damage_pct_incomingPC_mod = GetFocusEffect(focusFcSpellDamagePctIncomingPC, spell_id, caster, from_buff_tic);
|
||||||
|
|
||||||
total_mod = fc_spell_vulnerability_mod + fc_spell_damage_pct_incomingPC_mod;
|
total_mod = fc_spell_vulnerability_mod + fc_spell_damage_pct_incomingPC_mod;
|
||||||
|
|
||||||
|
|||||||
12
zone/mob.h
12
zone/mob.h
@ -317,8 +317,8 @@ public:
|
|||||||
bool NegateSpellEffect(uint16 spell_id, int effect_id);
|
bool NegateSpellEffect(uint16 spell_id, int effect_id);
|
||||||
virtual float GetActSpellRange(uint16 spell_id, float range, bool IsBard = false);
|
virtual float GetActSpellRange(uint16 spell_id, float range, bool IsBard = false);
|
||||||
virtual int32 GetActSpellDamage(uint16 spell_id, int32 value, Mob* target = nullptr);
|
virtual int32 GetActSpellDamage(uint16 spell_id, int32 value, Mob* target = nullptr);
|
||||||
virtual int32 GetActDoTDamage(uint16 spell_id, int32 value, Mob* target);
|
virtual int32 GetActDoTDamage(uint16 spell_id, int32 value, Mob* target, bool from_buff_tic = true);
|
||||||
virtual int32 GetActSpellHealing(uint16 spell_id, int32 value, Mob* target = nullptr);
|
virtual int32 GetActSpellHealing(uint16 spell_id, int32 value, Mob* target = nullptr, bool from_buff_tic = false);
|
||||||
virtual int32 GetActSpellCost(uint16 spell_id, int32 cost){ return cost;}
|
virtual int32 GetActSpellCost(uint16 spell_id, int32 cost){ return cost;}
|
||||||
virtual int32 GetActSpellDuration(uint16 spell_id, int32 duration);
|
virtual int32 GetActSpellDuration(uint16 spell_id, int32 duration);
|
||||||
virtual int32 GetActSpellCasttime(uint16 spell_id, int32 casttime);
|
virtual int32 GetActSpellCasttime(uint16 spell_id, int32 casttime);
|
||||||
@ -851,8 +851,8 @@ public:
|
|||||||
void TrySympatheticProc(Mob *target, uint32 spell_id);
|
void TrySympatheticProc(Mob *target, uint32 spell_id);
|
||||||
bool TryFadeEffect(int slot);
|
bool TryFadeEffect(int slot);
|
||||||
uint16 GetSpellEffectResistChance(uint16 spell_id);
|
uint16 GetSpellEffectResistChance(uint16 spell_id);
|
||||||
int32 GetVulnerability(Mob *caster, uint32 spell_id, uint32 ticsremaining);
|
int32 GetVulnerability(Mob *caster, uint32 spell_id, uint32 ticsremaining, bool from_buff_tic = false);
|
||||||
int32 GetFcDamageAmtIncoming(Mob *caster, int32 spell_id);
|
int32 GetFcDamageAmtIncoming(Mob *caster, int32 spell_id, bool from_buff_tic = false);
|
||||||
int32 GetFocusIncoming(focusType type, int effect, Mob *caster, uint32 spell_id); //**** This can be removed when bot healing focus code is updated ****
|
int32 GetFocusIncoming(focusType type, int effect, Mob *caster, uint32 spell_id); //**** This can be removed when bot healing focus code is updated ****
|
||||||
int32 GetSkillDmgTaken(const EQ::skills::SkillType skill_used, ExtraAttackOptions *opts = nullptr);
|
int32 GetSkillDmgTaken(const EQ::skills::SkillType skill_used, ExtraAttackOptions *opts = nullptr);
|
||||||
int32 GetPositionalDmgTaken(Mob *attacker);
|
int32 GetPositionalDmgTaken(Mob *attacker);
|
||||||
@ -1502,7 +1502,7 @@ protected:
|
|||||||
virtual
|
virtual
|
||||||
#endif
|
#endif
|
||||||
int GetBaseSkillDamage(EQ::skills::SkillType skill, Mob *target = nullptr);
|
int GetBaseSkillDamage(EQ::skills::SkillType skill, Mob *target = nullptr);
|
||||||
virtual int32 GetFocusEffect(focusType type, uint16 spell_id, Mob *caster = nullptr) { return 0; }
|
virtual int32 GetFocusEffect(focusType type, uint16 spell_id, Mob *caster = nullptr, bool from_buff_tic = false) { return 0; }
|
||||||
void CalculateNewFearpoint();
|
void CalculateNewFearpoint();
|
||||||
float FindGroundZ(float new_x, float new_y, float z_offset=0.0);
|
float FindGroundZ(float new_x, float new_y, float z_offset=0.0);
|
||||||
float FindDestGroundZ(glm::vec3 dest, float z_offset=0.0);
|
float FindDestGroundZ(glm::vec3 dest, float z_offset=0.0);
|
||||||
@ -1738,8 +1738,6 @@ protected:
|
|||||||
|
|
||||||
glm::vec3 m_TargetRing;
|
glm::vec3 m_TargetRing;
|
||||||
|
|
||||||
// we might want to do this differently, we gotta do max NPC buffs ... which is 97
|
|
||||||
uint32 m_spellHitsLeft[EQ::spells::TOTAL_BUFFS]; // Used to track which spells will have their numhits incremented when spell finishes casting
|
|
||||||
GravityBehavior flymode;
|
GravityBehavior flymode;
|
||||||
bool m_targetable;
|
bool m_targetable;
|
||||||
int QGVarDuration(const char *fmt);
|
int QGVarDuration(const char *fmt);
|
||||||
|
|||||||
@ -575,7 +575,7 @@ protected:
|
|||||||
virtual bool AICastSpell(Mob* tar, uint8 iChance, uint32 iSpellTypes, bool bInnates = false);
|
virtual bool AICastSpell(Mob* tar, uint8 iChance, uint32 iSpellTypes, bool bInnates = false);
|
||||||
virtual bool AIDoSpellCast(uint8 i, Mob* tar, int32 mana_cost, uint32* oDontDoAgainBefore = 0);
|
virtual bool AIDoSpellCast(uint8 i, Mob* tar, int32 mana_cost, uint32* oDontDoAgainBefore = 0);
|
||||||
AISpellsVar_Struct AISpellVar;
|
AISpellsVar_Struct AISpellVar;
|
||||||
int32 GetFocusEffect(focusType type, uint16 spell_id);
|
int32 GetFocusEffect(focusType type, uint16 spell_id, Mob* caster, bool from_buff_tic = false);
|
||||||
uint16 innate_proc_spell_id;
|
uint16 innate_proc_spell_id;
|
||||||
|
|
||||||
uint32 npc_spells_effects_id;
|
uint32 npc_spells_effects_id;
|
||||||
|
|||||||
@ -234,8 +234,13 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
|
|||||||
snprintf(effect_desc, _EDLEN, "Current Hitpoints: %+i", effect_value);
|
snprintf(effect_desc, _EDLEN, "Current Hitpoints: %+i", effect_value);
|
||||||
#endif
|
#endif
|
||||||
// SE_CurrentHP is calculated at first tick if its a dot/buff
|
// SE_CurrentHP is calculated at first tick if its a dot/buff
|
||||||
if (buffslot >= 0)
|
if (buffslot >= 0) {
|
||||||
|
//This is here so dots with hit counters tic down on initial cast.
|
||||||
|
if (effect_value < 0) {
|
||||||
|
caster->GetActDoTDamage(spell_id, effect_value, this, false);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (spells[spell_id].limit_value[i] && !PassCastRestriction(spells[spell_id].limit_value[i])) {
|
if (spells[spell_id].limit_value[i] && !PassCastRestriction(spells[spell_id].limit_value[i])) {
|
||||||
break; //no messages are given on live if this fails.
|
break; //no messages are given on live if this fails.
|
||||||
@ -2987,6 +2992,11 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case SE_HealOverTime: {
|
||||||
|
//This is here so buffs with hit counters tic down on initial cast.
|
||||||
|
caster->GetActSpellHealing(spell_id, effect_value, nullptr, false);
|
||||||
|
}
|
||||||
|
|
||||||
case SE_PersistentEffect:
|
case SE_PersistentEffect:
|
||||||
MakeAura(spell_id);
|
MakeAura(spell_id);
|
||||||
break;
|
break;
|
||||||
@ -3071,7 +3081,6 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
|
|||||||
case SE_TrueNorth:
|
case SE_TrueNorth:
|
||||||
case SE_WaterBreathing:
|
case SE_WaterBreathing:
|
||||||
case SE_MovementSpeed:
|
case SE_MovementSpeed:
|
||||||
case SE_HealOverTime:
|
|
||||||
case SE_PercentXPIncrease:
|
case SE_PercentXPIncrease:
|
||||||
case SE_DivineSave:
|
case SE_DivineSave:
|
||||||
case SE_Accuracy:
|
case SE_Accuracy:
|
||||||
@ -3808,8 +3817,9 @@ void Mob::DoBuffTic(const Buffs_Struct &buff, int slot, Mob *caster)
|
|||||||
}
|
}
|
||||||
case SE_HealOverTime: {
|
case SE_HealOverTime: {
|
||||||
effect_value = CalcSpellEffectValue(buff.spellid, i, buff.casterlevel, buff.instrument_mod);
|
effect_value = CalcSpellEffectValue(buff.spellid, i, buff.casterlevel, buff.instrument_mod);
|
||||||
if (caster)
|
if (caster) {
|
||||||
effect_value = caster->GetActSpellHealing(buff.spellid, effect_value);
|
effect_value = caster->GetActSpellHealing(buff.spellid, effect_value, nullptr, true);
|
||||||
|
}
|
||||||
|
|
||||||
HealDamage(effect_value, caster, buff.spellid);
|
HealDamage(effect_value, caster, buff.spellid);
|
||||||
// healing aggro would go here; removed for now
|
// healing aggro would go here; removed for now
|
||||||
@ -6307,7 +6317,7 @@ uint16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 Client::GetFocusEffect(focusType type, uint16 spell_id, Mob *caster)
|
int32 Client::GetFocusEffect(focusType type, uint16 spell_id, Mob *caster, bool from_buff_tic)
|
||||||
{
|
{
|
||||||
if (IsBardSong(spell_id) && type != focusFcBaseEffects && type != focusSpellDuration && type != focusReduceRecastTime) {
|
if (IsBardSong(spell_id) && type != focusFcBaseEffects && type != focusSpellDuration && type != focusReduceRecastTime) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -6542,13 +6552,11 @@ int32 Client::GetFocusEffect(focusType type, uint16 spell_id, Mob *caster)
|
|||||||
if(focusspell_tracker && rand_effectiveness && focus_max_real2 != 0)
|
if(focusspell_tracker && rand_effectiveness && focus_max_real2 != 0)
|
||||||
realTotal2 = CalcFocusEffect(type, focusspell_tracker, spell_id, false, original_caster_id, caster);
|
realTotal2 = CalcFocusEffect(type, focusspell_tracker, spell_id, false, original_caster_id, caster);
|
||||||
|
|
||||||
// For effects like gift of mana that only fire once, save the spellid into an array that consists of all available buff slots.
|
if(!from_buff_tic && buff_tracker >= 0 && buffs[buff_tracker].hit_number > 0) {
|
||||||
if(buff_tracker >= 0 && buffs[buff_tracker].hit_number > 0) {
|
CheckNumHitsRemaining(NumHit::MatchingSpells, buff_tracker);
|
||||||
m_spellHitsLeft[buff_tracker] = focusspell_tracker;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// AA Focus
|
// AA Focus
|
||||||
if (aabonuses.FocusEffects[type]){
|
if (aabonuses.FocusEffects[type]){
|
||||||
|
|
||||||
@ -6589,7 +6597,7 @@ int32 Client::GetFocusEffect(focusType type, uint16 spell_id, Mob *caster)
|
|||||||
return realTotal + realTotal2 + realTotal3 + worneffect_bonus;
|
return realTotal + realTotal2 + realTotal3 + worneffect_bonus;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 NPC::GetFocusEffect(focusType type, uint16 spell_id, Mob* caster) {
|
int32 NPC::GetFocusEffect(focusType type, uint16 spell_id, Mob* caster, bool from_buff_tic) {
|
||||||
|
|
||||||
int32 realTotal = 0;
|
int32 realTotal = 0;
|
||||||
int32 realTotal2 = 0;
|
int32 realTotal2 = 0;
|
||||||
@ -6704,9 +6712,8 @@ int32 NPC::GetFocusEffect(focusType type, uint16 spell_id, Mob* caster) {
|
|||||||
realTotal2 = CalcFocusEffect(type, focusspell_tracker, spell_id, false, original_caster_id, caster);
|
realTotal2 = CalcFocusEffect(type, focusspell_tracker, spell_id, false, original_caster_id, caster);
|
||||||
}
|
}
|
||||||
|
|
||||||
// For effects like gift of mana that only fire once, save the spellid into an array that consists of all available buff slots.
|
if(!from_buff_tic && buff_tracker >= 0 && buffs[buff_tracker].hit_number > 0) {
|
||||||
if(buff_tracker >= 0 && buffs[buff_tracker].hit_number > 0) {
|
CheckNumHitsRemaining(NumHit::MatchingSpells, buff_tracker);
|
||||||
m_spellHitsLeft[buff_tracker] = focusspell_tracker;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6779,31 +6786,9 @@ void Mob::CheckNumHitsRemaining(NumHit type, int32 buff_slot, uint16 spell_id)
|
|||||||
} else if (IsClient()) { // still have numhits and client, update
|
} else if (IsClient()) { // still have numhits and client, update
|
||||||
CastToClient()->SendBuffNumHitPacket(buffs[buff_slot], buff_slot);
|
CastToClient()->SendBuffNumHitPacket(buffs[buff_slot], buff_slot);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
for (int d = 0; d < buff_max; d++) {
|
}
|
||||||
if (!m_spellHitsLeft[d])
|
else {
|
||||||
continue;
|
|
||||||
|
|
||||||
if (IsValidSpell(buffs[d].spellid) && m_spellHitsLeft[d] == buffs[d].spellid) {
|
|
||||||
|
|
||||||
#ifdef BOTS
|
|
||||||
buff_name = spells[buffs[d].spellid].name;
|
|
||||||
buff_counter = (buffs[d].hit_number - 1);
|
|
||||||
buff_update = true;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (--buffs[d].hit_number == 0) {
|
|
||||||
CastOnNumHitFade(buffs[d].spellid);
|
|
||||||
m_spellHitsLeft[d] = 0;
|
|
||||||
if (!TryFadeEffect(d))
|
|
||||||
BuffFadeBySlot(d, true);
|
|
||||||
} else if (IsClient()) { // still have numhits and client, update
|
|
||||||
CastToClient()->SendBuffNumHitPacket(buffs[d], d);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int d = 0; d < buff_max; d++) {
|
for (int d = 0; d < buff_max; d++) {
|
||||||
if (IsValidSpell(buffs[d].spellid) && buffs[d].hit_number > 0 &&
|
if (IsValidSpell(buffs[d].spellid) && buffs[d].hit_number > 0 &&
|
||||||
spells[buffs[d].spellid].hit_number_type == static_cast<int>(type)) {
|
spells[buffs[d].spellid].hit_number_type == static_cast<int>(type)) {
|
||||||
@ -7095,12 +7080,12 @@ bool Mob::DoHPToManaCovert(uint16 mana_cost)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 Mob::GetFcDamageAmtIncoming(Mob *caster, int32 spell_id)
|
int32 Mob::GetFcDamageAmtIncoming(Mob *caster, int32 spell_id, bool from_buff_tic)
|
||||||
{
|
{
|
||||||
//THIS is target of spell cast
|
//THIS is target of spell cast
|
||||||
int32 dmg = 0;
|
int32 dmg = 0;
|
||||||
dmg += GetFocusEffect(focusFcDamageAmtIncoming, spell_id, caster); //SPA 297 SE_FcDamageAmtIncoming
|
dmg += GetFocusEffect(focusFcDamageAmtIncoming, spell_id, caster, from_buff_tic); //SPA 297 SE_FcDamageAmtIncoming
|
||||||
dmg += GetFocusEffect(focusFcSpellDamageAmtIncomingPC, spell_id, caster); //SPA 484 SE_Fc_Spell_Damage_Amt_IncomingPC
|
dmg += GetFocusEffect(focusFcSpellDamageAmtIncomingPC, spell_id, caster, from_buff_tic); //SPA 484 SE_Fc_Spell_Damage_Amt_IncomingPC
|
||||||
return dmg;
|
return dmg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1613,7 +1613,6 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(IsClient()) {
|
if(IsClient()) {
|
||||||
CheckNumHitsRemaining(NumHit::MatchingSpells);
|
|
||||||
TrySympatheticProc(target, spell_id);
|
TrySympatheticProc(target, spell_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user