aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2023-09-17 00:33:00 +0200
committerGitHub <noreply@github.com>2023-09-17 00:33:00 +0200
commit911e9da2bb6c8e244828dc52c89f935ecc7c2526 (patch)
tree415195e563ffd9ac8f7f3e0a58c6c636c442270d
parent22f19a16452a87fa625a2794a53a5a06ff97f8bd (diff)
Core/Players: Fix environmental damage from lava (#29327)
-rw-r--r--src/server/game/Entities/Player/Player.cpp22
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,