diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index ada33fca6..954d79a1c 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -40,10 +40,12 @@ #include "Pet.h" #include "SocialMgr.h" -void WorldSession::HandleRepopRequestOpcode( WorldPacket & /*recv_data*/ ) +void WorldSession::HandleRepopRequestOpcode( WorldPacket & recv_data ) { sLog.outDebug( "WORLD: Recvd CMSG_REPOP_REQUEST Message" ); + recv_data.read_skip(); + if(GetPlayer()->isAlive()||GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) return; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 963bf4608..77538a1c8 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -800,10 +800,10 @@ void Player::StopMirrorTimer(MirrorTimerType Type) GetSession()->SendPacket( &data ); } -void Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) +uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) { if(!isAlive() || isGameMaster()) - return; + return 0; // Absorb, resist some environmental damage type uint32 absorb = 0; @@ -825,7 +825,7 @@ void Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) data << uint32(resist); SendMessageToSet(&data, true); - DealDamage(this, damage, NULL, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + uint32 final_damage = DealDamage(this, damage, NULL, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); if(!isAlive()) { @@ -840,6 +840,8 @@ void Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, 1, type); } + + return final_damage; } int32 Player::getMaxTimer(MirrorTimerType timer) @@ -19887,10 +19889,11 @@ void Player::HandleFall(MovementInfo const& movementInfo) if (GetDummyAura(43621)) damage = GetMaxHealth()/2; - EnvironmentalDamage(DAMAGE_FALL, damage); + uint32 original_health = GetHealth(); + uint32 final_damage = EnvironmentalDamage(DAMAGE_FALL, damage); - // recheck alive, might have died of EnvironmentalDamage - if (isAlive()) + // recheck alive, might have died of EnvironmentalDamage, avoid cases when player die in fact like Spirit of Redemption case + if (isAlive() && final_damage < original_health) GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, uint32(z_diff*100)); } diff --git a/src/game/Player.h b/src/game/Player.h index b1c0cbd6e..863e4ef5d 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -2045,7 +2045,7 @@ class MANGOS_DLL_SPEC Player : public Unit /*** ENVIROMENTAL SYSTEM ***/ /*********************************************************/ - void EnvironmentalDamage(EnviromentalDamage type, uint32 damage); + uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage); /*********************************************************/ /*** FLOOD FILTER SYSTEM ***/ diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index fadaaff53..0dfdb2a3e 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8445" + #define REVISION_NR "8446" #endif // __REVISION_NR_H__