Add checks to prevent some player stats from overflowing thus making such exploits as 65k SP impossible.

This change affects such stats as spell power, feral AP, mana regen and health regen.

--HG--
branch : trunk
This commit is contained in:
azazel
2010-08-12 22:07:56 +06:00
parent a630f78c98
commit f8eed4da58
2 changed files with 29 additions and 9 deletions
+4 -4
View File
@@ -2501,10 +2501,10 @@ class Player : public Unit, public GridObject<Player>
float m_auraBaseMod[BASEMOD_END][MOD_END];
int16 m_baseRatingValue[MAX_COMBAT_RATING];
uint16 m_baseSpellPower;
uint16 m_baseFeralAP;
uint16 m_baseManaRegen;
uint16 m_baseHealthRegen;
uint32 m_baseSpellPower;
uint32 m_baseFeralAP;
uint32 m_baseManaRegen;
uint32 m_baseHealthRegen;
SpellModList m_spellMods[MAX_SPELLMOD];
//uint32 m_pad;
+25 -5
View File
@@ -26,6 +26,26 @@
#include "SpellAuras.h"
#include "SpellAuraEffects.h"
inline bool _ModifyUInt32(bool apply, uint32& baseValue, int32& amount)
{
// If amount is negative, change sign and value of apply.
if (amount < 0)
{
apply = !apply;
amount = -amount;
}
if (apply)
baseValue += amount;
else
{
// Make sure we do not get uint32 overflow.
if (amount > baseValue)
amount = baseValue;
baseValue -= amount;
}
return apply;
}
/*#######################################
######## ########
######## PLAYERS STAT SYSTEM ########
@@ -113,12 +133,12 @@ bool Player::UpdateStats(Stats stat)
void Player::ApplySpellPowerBonus(int32 amount, bool apply)
{
m_baseSpellPower+=apply?amount:-amount;
apply = _ModifyUInt32(apply, m_baseSpellPower, amount);
// For speed just update for client
ApplyModUInt32Value(PLAYER_FIELD_MOD_HEALING_DONE_POS, amount, apply);
for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+i, amount, apply);;
ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + i, amount, apply);
}
void Player::UpdateSpellDamageAndHealingBonus()
@@ -256,7 +276,7 @@ void Player::UpdateMaxPower(Powers power)
void Player::ApplyFeralAPBonus(int32 amount, bool apply)
{
m_baseFeralAP+= apply ? amount:-amount;
_ModifyUInt32(apply, m_baseFeralAP, amount);
UpdateAttackPowerAndDamage();
}
@@ -692,13 +712,13 @@ void Player::UpdateExpertise(WeaponAttackType attack)
void Player::ApplyManaRegenBonus(int32 amount, bool apply)
{
m_baseManaRegen+= apply ? amount : -amount;
_ModifyUInt32(apply, m_baseManaRegen, amount);
UpdateManaRegen();
}
void Player::ApplyHealthRegenBonus(int32 amount, bool apply)
{
m_baseHealthRegen+= apply ? amount : -amount;
_ModifyUInt32(apply, m_baseHealthRegen, amount);
}
void Player::UpdateManaRegen()