diff --git a/changelog.txt b/changelog.txt index ca2e11a1f..603481a32 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,6 +2,7 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- == 12/11/2013 == demonstar55: Fixed issue with crippling blow from berserker frenzy not actually doing anything +demonstar55: Fix haste caps == 12/04/2013 == demonstar55: Fixed SpellType_Charm case in AICastSpell diff --git a/zone/client_mods.cpp b/zone/client_mods.cpp index 2cc26c3f7..45504510d 100644 --- a/zone/client_mods.cpp +++ b/zone/client_mods.cpp @@ -1340,45 +1340,46 @@ int16 Client::CalcCHA() { } int Client::CalcHaste() { - int h = spellbonuses.haste + spellbonuses.hastetype2 + itembonuses.haste; + int h = spellbonuses.haste + spellbonuses.hastetype2; int cap = 0; + int overhaste = 0; int level = GetLevel(); - /* - if(disc_inuse == discBlindingSpeed) { - if(!disc_elapse.Check(false)) { - h += 20; //this ammount is completely unknown - } else { - disc_inuse = discNone; - } - } */ - if(level < 30) { // Rogean: Are these caps correct? Will use for now. - cap = 50; - } else if(level < 50) { - cap = 74; - } else if(level < 55) { - cap = 84; - } else if(level < 60) { - cap = 94; - } else { + // 26+ no cap, 1-25 10 + if (level > 25) // 26+ + h += itembonuses.haste; + else // 1-25 + h += itembonuses.haste > 10 ? 10 : itembonuses.haste; + + // 60+ 100, 51-59 85, 1-50 level+25 + if (level > 59) // 60+ cap = RuleI(Character, HasteCap); - } + else if (level > 50) // 51-59 + cap = 85; + else // 1-50 + cap = level + 25; cap = mod_client_haste_cap(cap); - if(h > cap) h = cap; + if (h > cap) + h = cap; - h += spellbonuses.hastetype3; + // 51+ 25 (despite there being higher spells...), 1-50 10 + if (level > 50) // 51+ + overhaste = spellbonuses.hastetype3 > 25 ? 25 : spellbonuses.hastetype3; + else // 1-50 + overhaste = spellbonuses.hastetype3 > 10 ? 10 : spellbonuses.hastetype3; + + h += overhaste; h += ExtraHaste; //GM granted haste. h = mod_client_haste(h); - if (spellbonuses.inhibitmelee){ + if (spellbonuses.inhibitmelee) { if (h >= 0) h -= spellbonuses.inhibitmelee; - else - h -=((100+h)*spellbonuses.inhibitmelee/100); + h -= ((100 + h) * spellbonuses.inhibitmelee / 100); } Haste = h; diff --git a/zone/mob.cpp b/zone/mob.cpp index 820db7beb..632b0a16f 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -2875,33 +2875,42 @@ uint32 Mob::GetZoneID() const { } int Mob::GetHaste() { - int h = spellbonuses.haste + spellbonuses.hastetype2 + itembonuses.haste; + int h = spellbonuses.haste + spellbonuses.hastetype2; int cap = 0; + int overhaste = 0; int level = GetLevel(); - if(level < 30) { // Rogean: Are these caps correct? Will use for now. - cap = 50; - } else if(level < 50) { - cap = 74; - } else if(level < 55) { - cap = 84; - } else if(level < 60) { - cap = 94; - } else { + // 26+ no cap, 1-25 10 + if (level > 25) // 26+ + h += itembonuses.haste; + else // 1-25 + h += itembonuses.haste > 10 ? 10 : itembonuses.haste; + + // 60+ 100, 51-59 85, 1-50 level+25 + if (level > 59) // 60+ cap = RuleI(Character, HasteCap); - } + else if (level > 50) // 51-59 + cap = 85; + else // 1-50 + cap = level + 25; - if(h > cap) h = cap; + if(h > cap) + h = cap; - h += spellbonuses.hastetype3; + // 51+ 25 (despite there being higher spells...), 1-50 10 + if (level > 50) // 51+ + overhaste = spellbonuses.hastetype3 > 25 ? 25 : spellbonuses.hastetype3; + else // 1-50 + overhaste = spellbonuses.hastetype3 > 10 ? 10 : spellbonuses.hastetype3; + + h += overhaste; h += ExtraHaste; //GM granted haste. - if (spellbonuses.inhibitmelee){ + if (spellbonuses.inhibitmelee) { if (h >= 0) h -= spellbonuses.inhibitmelee; - else - h -=((100+h)*spellbonuses.inhibitmelee/100); + h -= ((100 + h) * spellbonuses.inhibitmelee / 100); } return(h);