int32 Client::CalcMaxMana() { switch (GetCasterClass()) { case 'I': case 'W': { max_mana = (CalcBaseMana() + itembonuses.Mana + spellbonuses.Mana + aabonuses.Mana + GroupLeadershipAAManaEnhancement()); break; } case 'N': { max_mana = 0; break; } default: { Log.Out(Logs::Detail, Logs::Spells, "Invalid Class '%c' in CalcMaxMana", GetCasterClass()); max_mana = 0; break; } } if (max_mana < 0) { max_mana = 0; } if (cur_mana > max_mana) { cur_mana = max_mana; } int mana_perc_cap = spellbonuses.ManaPercCap[0]; if (mana_perc_cap) { int curMana_cap = (max_mana * mana_perc_cap) / 100; if (cur_mana > curMana_cap || (spellbonuses.ManaPercCap[1] && cur_mana > spellbonuses.ManaPercCap[1])) { cur_mana = curMana_cap; } } Log.Out(Logs::Detail, Logs::Spells, "Client::CalcMaxMana() called for %s - returning %d", GetName(), max_mana); return max_mana; }
int32 Client::CalcBaseMana() { int WisInt = 0; int MindLesserFactor, MindFactor; int32 max_m = 0; int wisint_mana = 0; int base_mana = 0; int ConvertedWisInt = 0; switch(GetCasterClass()) { case 'I': WisInt = GetINT(); if((( WisInt - 199 ) / 2) > 0) MindLesserFactor = ( WisInt - 199 ) / 2; else MindLesserFactor = 0; MindFactor = WisInt - MindLesserFactor; if(WisInt > 100) max_m = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40); else max_m = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100); break; case 'W': WisInt = GetWIS(); if((( WisInt - 199 ) / 2) > 0) MindLesserFactor = ( WisInt - 199 ) / 2; else MindLesserFactor = 0; MindFactor = WisInt - MindLesserFactor; if(WisInt > 100) max_m = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40); else max_m = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100); break; case 'N': { max_m = 0; break; } default: { Log.Out(Logs::General, Logs::None, "Invalid Class '%c' in CalcMaxMana", GetCasterClass()); max_m = 0; break; } } #if EQDEBUG >= 11 Log.Out(Logs::General, Logs::None, "Client::CalcBaseMana() called for %s - returning %d", GetName(), max_m); #endif return max_m; }
int32 Client::CalcManaRegenCap() { int32 cap = RuleI(Character, ItemManaRegenCap) + aabonuses.ItemManaRegenCap; switch(GetCasterClass()) { case 'I': case 'W': break; } return (cap * RuleI(Character, ManaRegenMultiplier) / 100); }
int32 Client::CalcMaxMana() { switch(GetCasterClass()) { case 'I': case 'W': { max_mana = (CalcBaseMana() + itembonuses.Mana + spellbonuses.Mana + GroupLeadershipAAManaEnhancement()); break; } case 'N': { max_mana = 0; break; } default: { LogFile->write(EQEMuLog::Debug, "Invalid Class '%c' in CalcMaxMana", GetCasterClass()); max_mana = 0; break; } } if (max_mana < 0) { max_mana = 0; } if (cur_mana > max_mana) { cur_mana = max_mana; } int mana_perc_cap = spellbonuses.ManaPercCap[0]; if(mana_perc_cap) { int curMana_cap = (max_mana * mana_perc_cap) / 100; if (cur_mana > curMana_cap || (spellbonuses.ManaPercCap[1] && cur_mana > spellbonuses.ManaPercCap[1])) cur_mana = curMana_cap; } #if EQDEBUG >= 11 LogFile->write(EQEMuLog::Debug, "Client::CalcMaxMana() called for %s - returning %d", GetName(), max_mana); #endif return max_mana; }
int32 Client::CalcBaseMana() { int WisInt = 0; int MindLesserFactor, MindFactor; int32 max_m = 0; int wisint_mana = 0; int base_mana = 0; int ConvertedWisInt = 0; switch(GetCasterClass()) { case 'I': WisInt = GetINT(); if (GetClientVersion() >= EQClientSoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) { if (WisInt > 100) { ConvertedWisInt = (((WisInt - 100) * 5 / 2) + 100); if (WisInt > 201) { ConvertedWisInt -= ((WisInt - 201) * 5 / 4); } } else { ConvertedWisInt = WisInt; } auto base_data = database.GetBaseData(GetLevel(), GetClass()); if(base_data) { max_m = base_data->base_mana + (ConvertedWisInt * base_data->mana_factor) + (GetHeroicINT() * 10); } } else { if((( WisInt - 199 ) / 2) > 0) MindLesserFactor = ( WisInt - 199 ) / 2; else MindLesserFactor = 0; MindFactor = WisInt - MindLesserFactor; if(WisInt > 100) max_m = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40); else max_m = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100); } break; case 'W': WisInt = GetWIS(); if (GetClientVersion() >= EQClientSoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) { if (WisInt > 100) { ConvertedWisInt = (((WisInt - 100) * 5 / 2) + 100); if (WisInt > 201) { ConvertedWisInt -= ((WisInt - 201) * 5 / 4); } } else { ConvertedWisInt = WisInt; } auto base_data = database.GetBaseData(GetLevel(), GetClass()); if(base_data) { max_m = base_data->base_mana + (ConvertedWisInt * base_data->mana_factor) + (GetHeroicWIS() * 10); } } else { if((( WisInt - 199 ) / 2) > 0) MindLesserFactor = ( WisInt - 199 ) / 2; else MindLesserFactor = 0; MindFactor = WisInt - MindLesserFactor; if(WisInt > 100) max_m = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40); else max_m = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100); } break; case 'N': { max_m = 0; break; } default: { LogFile->write(EQEMuLog::Debug, "Invalid Class '%c' in CalcMaxMana", GetCasterClass()); max_m = 0; break; } } #if EQDEBUG >= 11 LogFile->write(EQEMuLog::Debug, "Client::CalcBaseMana() called for %s - returning %d", GetName(), max_m); #endif return max_m; }
int32 Client::CalcManaRegen(bool bCombat) { int regen = 0; auto level = GetLevel(); // so the new formulas break down with older skill caps where you don't have the skill until 4 or 8 // so for servers that want to use the old skill progression they can set this rule so they // will get at least 1 for standing and 2 for sitting. bool old = RuleB(Character, OldMinMana); if (!IsStarved()) { // client does some base regen for shrouds here if (IsSitting() || CanMedOnHorse()) { // kind of weird to do it here w/e // client does some base medding regen for shrouds here if (GetClass() != BARD) { auto skill = GetSkill(EQEmu::skills::SkillMeditate); if (skill > 0) { regen++; if (skill > 1) regen++; if (skill >= 15) regen += skill / 15; } } if (old) regen = std::max(regen, 2); } else if (old) { regen = std::max(regen, 1); } } if (level > 61) { regen++; if (level > 63) regen++; } regen += aabonuses.ManaRegen; // add in + 1 bonus for SE_CompleteHeal, but we don't do anything for it yet? int item_bonus = itembonuses.ManaRegen; // this is capped already int heroic_bonus = 0; switch (GetCasterClass()) { case 'W': heroic_bonus = GetHeroicWIS(); break; default: heroic_bonus = GetHeroicINT(); break; } item_bonus += heroic_bonus / 25; regen += item_bonus; if (level <= 70 && regen > 65) regen = 65; regen = regen * 100.0f * AreaManaRegen * 0.01f + 0.5f; if (!bCombat && CanFastRegen() && (IsSitting() || CanMedOnHorse())) { auto max_mana = GetMaxMana(); int fast_regen = 6 * (max_mana / zone->newzone_data.FastRegenMana); if (regen < fast_regen) // weird, but what the client is doing regen = fast_regen; } regen += spellbonuses.ManaRegen; // TODO: live does this in buff tick return (regen * RuleI(Character, ManaRegenMultiplier) / 100); }