aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorazazel <none@none>2010-08-12 22:07:56 +0600
committerazazel <none@none>2010-08-12 22:07:56 +0600
commitf8eed4da580c5c2be233a75f590690b6675b3d9f (patch)
treebfb82b9f058eac057c175e7ff61c5fe29acdf72a /src
parenta630f78c981097565049a9c3650f4a2374e8e374 (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.h8
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp30
2 files changed, 29 insertions, 9 deletions
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index d1a8514c6b9..025ce14c737 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -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;
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index 7f25f2b3655..1bda25539d4 100644
--- a/src/server/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
@@ -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()