diff --git a/zone/aa.cpp b/zone/aa.cpp index c2a3d63cf..1f0b5b086 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -800,7 +800,10 @@ void Client::RefundAA() { int refunded = 0; for(auto &rank_value : aa_ranks) { - AA::Ability *ability = zone->GetAlternateAdvancementAbility(rank_value.first); + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(rank_value.first, rank_value.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; + if(!ability) { continue; } @@ -809,11 +812,6 @@ void Client::RefundAA() { continue; } - AA::Rank *rank = ability->GetRankByPointsSpent(rank_value.second.first); - if(!rank) { - continue; - } - refunded += rank->total_cost; } @@ -864,20 +862,19 @@ void Client::SendAlternateAdvancementTable() { void Client::SendAlternateAdvancementRank(int aa_id, int level) { if(!zone) return; - - AA::Ability *ability = zone->GetAlternateAdvancementAbility(aa_id); - if(!ability) + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa_id, level); + auto ability = ability_rank.first; + auto rank = ability_rank.second; + + if(!ability) { return; + } if(!(ability->classes & (1 << GetClass()))) { return; } - AA::Rank *rank = ability->GetRankByPointsSpent(level); - if(!rank) - return; - if(!CanUseAlternateAdvancementRank(rank)) { return; } @@ -1224,13 +1221,11 @@ int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) { } for(auto &aa : aa_ranks) { - AA::Ability *ability = zone->GetAlternateAdvancementAbility(aa.first); - if(!ability) { - continue; - } + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa.first, aa.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; - AA::Rank *rank = ability->GetRankByPointsSpent(aa.second.first); - if(!rank) { + if(!ability) { continue; } @@ -1328,6 +1323,21 @@ AA::Rank *Zone::GetAlternateAdvancementRank(int rank_id) { return nullptr; } +std::pair Zone::GetAlternateAdvancementAbilityAndRank(int id, int points_spent) { + AA::Ability *ability = GetAlternateAdvancementAbility(id); + + if(!ability) { + return std::make_pair(nullptr, nullptr); + } + + AA::Rank *rank = ability->GetRankByPointsSpent(points_spent); + if(!rank) { + return std::make_pair(nullptr, nullptr); + } + + return std::make_pair(ability, rank); +} + uint32 Mob::GetAA(uint32 rank_id, uint32 *charges) const { if(zone) { AA::Ability *ability = zone->GetAlternateAdvancementAbilityByRank(rank_id); @@ -1345,6 +1355,23 @@ uint32 Mob::GetAA(uint32 rank_id, uint32 *charges) const { return 0; } +uint32 Mob::GetAAByAAID(uint32 aa_id, uint32 *charges) const { + if(zone) { + AA::Ability *ability = zone->GetAlternateAdvancementAbility(aa_id); + + if(!ability) + return 0; + + auto iter = aa_ranks.find(ability->id); + if(iter != aa_ranks.end()) { + if(charges) { + *charges = iter->second.second; + } + return iter->second.first; + } + } +} + bool Mob::SetAA(uint32 rank_id, uint32 new_value, uint32 charges) { if(zone) { AA::Ability *ability = zone->GetAlternateAdvancementAbilityByRank(rank_id); diff --git a/zone/attack.cpp b/zone/attack.cpp index cecf37ff1..fda7837ab 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -4647,7 +4647,7 @@ void Mob::TrySkillProc(Mob *on, uint16 skill, uint16 ReuseTime, bool Success, ui if (IsClient() && aabonuses.LimitToSkill[skill]){ CanProc = true; - uint32 effect = 0; + uint32 effect_id = 0; int32 base1 = 0; int32 base2 = 0; uint32 slot = 0; @@ -4666,39 +4666,43 @@ void Mob::TrySkillProc(Mob *on, uint16 skill, uint16 ReuseTime, bool Success, ui proc_spell_id = 0; ProcMod = 0; - //old AA - //std::map >::const_iterator find_iter = aa_effects.find(aaid); - //if(find_iter == aa_effects.end()) - // break; + for(auto &rank_info : aa_ranks) { + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(rank_info.first, rank_info.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; - //for (std::map::const_iterator iter = aa_effects[aaid].begin(); iter != aa_effects[aaid].end(); ++iter) { - // effect = iter->second.skill_id; - // base1 = iter->second.base1; - // base2 = iter->second.base2; - // slot = iter->second.slot; - // - // if (effect == SE_SkillProc || effect == SE_SkillProcSuccess) { - // proc_spell_id = base1; - // ProcMod = static_cast(base2); - // } - // - // else if (effect == SE_LimitToSkill && base1 <= HIGHEST_SKILL) { - // - // if (CanProc && base1 == skill && IsValidSpell(proc_spell_id)) { - // float final_chance = chance * (ProcMod / 100.0f); - // - // if (zone->random.Roll(final_chance)) { - // ExecWeaponProc(nullptr, proc_spell_id, on); - // CanProc = false; - // break; - // } - // } - // } - // else { - // proc_spell_id = 0; - // ProcMod = 0; - // } - //} + if(!ability) { + continue; + } + + for(auto &effect : rank->effects) { + effect_id = effect.effect_id; + base1 = effect.base1; + base2 = effect.base2; + slot = effect.slot; + + if(effect_id == SE_SkillProc || effect_id == SE_SkillProcSuccess) { + proc_spell_id = base1; + ProcMod = static_cast(base2); + } + else if(effect_id == SE_LimitToSkill && base1 <= HIGHEST_SKILL) { + + if (CanProc && base1 == skill && IsValidSpell(proc_spell_id)) { + float final_chance = chance * (ProcMod / 100.0f); + + if (zone->random.Roll(final_chance)) { + ExecWeaponProc(nullptr, proc_spell_id, on); + CanProc = false; + break; + } + } + } + else { + proc_spell_id = 0; + ProcMod = 0; + } + } + } } } } diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index b0c48f205..6d12b1eac 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -640,14 +640,16 @@ void Client::CalcAABonuses(StatBonuses *newbon) memset(newbon, 0, sizeof(StatBonuses)); // start fresh for (const auto &aa : aa_ranks) { - auto ability = zone->GetAlternateAdvancementAbility(aa.first); - // zone doesn't know about this! bad data some where - if (!ability) - continue; + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa.first, aa.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; + + if(!ability) { + continue; + } - auto rank = ability->GetRankByPointsSpent(aa.second.first); // bad data or no effects - if (!rank || rank->effects.empty()) + if (rank->effects.empty()) continue; ApplyAABonuses(*rank, newbon); diff --git a/zone/client.h b/zone/client.h index 014747576..e830edfa8 100644 --- a/zone/client.h +++ b/zone/client.h @@ -774,27 +774,23 @@ public: void AddAAPoints(uint32 points) { m_pp.aapoints += points; SendAlternateAdvancementStats(); } int GetAAPoints() { return m_pp.aapoints; } int GetSpentAA() { return m_pp.aapoints_spent; } - - //old AA Methods + + //old AA methods that we still use void ResetAA(); + void RefundAA(); void SendClearAA(); - //this function is used by some AA stuff - void MemorizeSpell(uint32 slot,uint32 spellid,uint32 scribing); - void SetAATitle(const char *Title); - void SetTitleSuffix(const char *txt); inline uint32 GetMaxAAXP(void) const { return max_AAXP; } inline uint32 GetAAXP() const { return m_pp.expAA; } + int16 CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id); + void SetAATitle(const char *Title); + void SetTitleSuffix(const char *txt); + + //old AA Methods that are slated for removal + void MemorizeSpell(uint32 slot,uint32 spellid,uint32 scribing); void EnableAAEffect(aaEffectType type, uint32 duration = 0); void DisableAAEffect(aaEffectType type); bool CheckAAEffect(aaEffectType type); - void HandleAAAction(aaID activate); - int16 CalcAAFocusEffect(focusType type, uint16 focus_spell, uint16 spell_id); - int16 CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id); - void RefundAA(); - int32 GetAAEffectDataBySlot(uint32 aa_ID, uint32 slot_id, bool GetEffect, bool GetBase1, bool GetBase2); - int32 GetAAEffectid(uint32 aa_ID, uint32 slot_id) { return GetAAEffectDataBySlot(aa_ID, slot_id, true, false,false); } - int32 GetAABase1(uint32 aa_ID, uint32 slot_id) { return GetAAEffectDataBySlot(aa_ID, slot_id, false, true,false); } - int32 GetAABase2(uint32 aa_ID, uint32 slot_id) { return GetAAEffectDataBySlot(aa_ID, slot_id, false, false,true); } + int32 acmod(); // Item methods diff --git a/zone/mob.h b/zone/mob.h index ed5d68c2c..3e4f5ea39 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -960,6 +960,7 @@ public: //aa new uint32 GetAA(uint32 rank_id, uint32 *charges = nullptr) const; + uint32 GetAAByAAID(uint32 aa_id, uint32 *charges = nullptr) const; bool SetAA(uint32 rank_id, uint32 new_value, uint32 charges = 0); void ClearAAs() { aa_ranks.clear(); } bool CanUseAlternateAdvancementRank(AA::Rank *rank); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index 95fc146ae..eea9918cd 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -4077,34 +4077,7 @@ XS(XS_Client_RefundAA) { if(THIS == nullptr) Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - //old aa - //int curpt = 0; - //bool refunded = false; - // - //for(int x1=0;x1GetAA(x1); - // if(curpt > 0){ - // SendAA_Struct* curaa = zone->FindAA(x1); - // if(curaa){ - // THIS->SetAA(x1, 0); - // for(int x2=0;x2GetPP().aapoints += curaa->cost + (curaa->cost_inc * x2); - // refunded = true; - // } - // } - // else //aa doesn't exist.. but if they bought it then it had at least a cost of 1 point each - // { //so give back what we can - // THIS->GetPP().aapoints += curpt; - // THIS->SetAA(x1, 0); - // refunded = true; - // } - // } - //} - // - //if(refunded){ - // THIS->Save(); //save of course - // THIS->Kick(); //client gets all buggy if we don't immediatly relog so just force it on them - //} + THIS->RefundAA(); } XSRETURN_EMPTY; } diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index c78e80be8..a7c5643a1 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4149,43 +4149,6 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses) CalcBonuses(); } -int32 Client::GetAAEffectDataBySlot(uint32 aa_ID, uint32 slot_id, bool GetEffect, bool GetBase1, bool GetBase2) -{ - int32 aa_effects_data[3] = { 0 }; - uint32 effect = 0; - int32 base1 = 0; - int32 base2 = 0; - uint32 slot = 0; - - //old aa - //std::map >::const_iterator find_iter = aa_effects.find(aa_ID); - //if(find_iter == aa_effects.end()) - // return 0; - // - //for (std::map::const_iterator iter = aa_effects[aa_ID].begin(); iter != aa_effects[aa_ID].end(); ++iter) - //{ - // effect = iter->second.skill_id; - // base1 = iter->second.base1; - // base2 = iter->second.base2; - // slot = iter->second.slot; - // - // if (slot && slot == slot_id) { - // - // if (GetEffect) - // return effect; - // - // if (GetBase1) - // return base1; - // - // if (GetBase2) - // return base2; - // } - //} - - return 0; -} - - int16 Client::CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id) { const SPDat_Spell_Struct &spell = spells[spell_id]; @@ -5207,12 +5170,15 @@ uint16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) { if (SympatheticProcList.size() > MAX_SYMPATHETIC_PROCS) break; - auto ability = zone->GetAlternateAdvancementAbility(aa.first); - if (!ability) - continue; + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa.first, aa.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; - auto rank = ability->GetRankByPointsSpent(aa.second.first); - if (!rank || rank->effects.empty()) + if(!ability) { + continue; + } + + if (rank->effects.empty()) continue; proc_spellid = CalcAAFocus(type, *rank, spell_id); @@ -5474,12 +5440,15 @@ int16 Client::GetFocusEffect(focusType type, uint16 spell_id) { int16 Total3 = 0; for (const auto &aa : aa_ranks) { - auto ability = zone->GetAlternateAdvancementAbility(aa.first); - if (!ability) - continue; + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa.first, aa.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; - auto rank = ability->GetRankByPointsSpent(aa.second.first); - if (!rank || rank->effects.empty()) + if(!ability) { + continue; + } + + if (rank->effects.empty()) continue; Total3 = CalcAAFocus(type, *rank, spell_id); diff --git a/zone/zone.h b/zone/zone.h index a4a49b8b2..94bba72e4 100644 --- a/zone/zone.h +++ b/zone/zone.h @@ -119,6 +119,7 @@ public: AA::Ability *GetAlternateAdvancementAbility(int id); AA::Ability *GetAlternateAdvancementAbilityByRank(int rank_id); AA::Rank *GetAlternateAdvancementRank(int rank_id); + std::pair GetAlternateAdvancementAbilityAndRank(int id, int points_spent); void LoadZoneDoors(const char* zone, int16 version); bool LoadZoneObjects();