diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ff98de25a2e..7c4d465ed75 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -733,6 +733,20 @@ void Player::HandleDrowning(uint32 time_diff) if (!m_MirrorTimerFlags) return; + auto getEnvironmentalDamage = [&](EnviromentalDamage damageType) + { + uint8 damagePercent = 10; + if (damageType == DAMAGE_DROWNING || damageType == DAMAGE_EXHAUSTED) + damagePercent *= 2; + + uint32 damage = GetMaxHealth() * damagePercent / 100; + + // Randomize damage + damage += urand(0, pow(10, std::max(0, (int32)log10(damage) - 1))); + + return damage; + }; + // In water if (m_MirrorTimerFlags & UNDERWATER_INWATER) { @@ -750,8 +764,7 @@ void Player::HandleDrowning(uint32 time_diff) { m_MirrorTimer[BREATH_TIMER] += 1 * IN_MILLISECONDS; // Calculate and deal damage - /// @todo Check this formula - uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1); + uint32 damage = getEnvironmentalDamage(DAMAGE_DROWNING); EnvironmentalDamage(DAMAGE_DROWNING, damage); } else if (!(m_MirrorTimerFlagsLast & UNDERWATER_INWATER)) // Update time in client if need @@ -787,7 +800,7 @@ void Player::HandleDrowning(uint32 time_diff) m_MirrorTimer[FATIGUE_TIMER] += 1 * IN_MILLISECONDS; if (IsAlive()) // Calculate and deal damage { - uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1); + uint32 damage = getEnvironmentalDamage(DAMAGE_EXHAUSTED); EnvironmentalDamage(DAMAGE_EXHAUSTED, damage); } else if (HasPlayerFlag(PLAYER_FLAGS_GHOST)) // Teleport ghost to graveyard @@ -819,8 +832,7 @@ void Player::HandleDrowning(uint32 time_diff) { m_MirrorTimer[FIRE_TIMER] += 1 * IN_MILLISECONDS; // Calculate and deal damage - /// @todo Check this formula - uint32 damage = urand(600, 700); + uint32 damage = getEnvironmentalDamage(DAMAGE_LAVA); if (m_MirrorTimerFlags & UNDERWATER_INLAVA) EnvironmentalDamage(DAMAGE_LAVA, damage); // need to skip Slime damage in Undercity, |