diff options
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 70eafbcb172..51c729a37a2 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3896,17 +3896,25 @@ void Spell::EffectInebriate() Player* player = unitTarget->ToPlayer(); uint8 currentDrunk = player->GetDrunkValue(); - uint8 drunkMod = damage; - if (currentDrunk + drunkMod > 100) - { + int32 drunkMod = damage; + + if (drunkMod == 0) + return; + + // drunkMod may contain values that are guaranteed to cause uint8 overflow/underflow (examples: 29690, 46874) + // In addition, we would not want currentDrunk to become more than 100. + // So before adding the values, let's check that everything is fine. + if (drunkMod > static_cast<int32>(100 - currentDrunk)) currentDrunk = 100; - if (rand_chance() < 25.0f) - player->CastSpell(player, 67468, false); // Drunken Vomit - } + else if (drunkMod < static_cast<int32>(0 - currentDrunk)) + currentDrunk = 0; else - currentDrunk += drunkMod; + currentDrunk += drunkMod; // Due to previous checks we can be sure that currentDrunk will not go beyond [0-100] range. player->SetDrunkValue(currentDrunk, m_CastItem ? m_CastItem->GetEntry() : 0); + + if (currentDrunk == 100 && roll_chance_i(25)) + player->CastSpell(player, 67468, false); // Drunken Vomit } void Spell::EffectFeedPet() |