From 8b1efbba8350e8dcf0b076e54fad2dbd2e12c8fe Mon Sep 17 00:00:00 2001 From: arrai Date: Sat, 8 Nov 2008 16:26:00 +0100 Subject: [PATCH] Fixed ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING by using total fall distance instead of fall time. This distance might be used for a more accurate fall damage formula in a later version. --- src/game/AchievementMgr.cpp | 5 ++--- src/game/MovementHandler.cpp | 11 +++++++++-- src/game/Player.h | 1 + 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 6e4dfa324..c0f5da462 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -304,9 +304,8 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if(!gameeventmgr.IsActiveEvent(26)) continue; } - // miscvalue1 is falltime, calculate to fall height format given in dbc - uint32 fallHeight = uint32(0.06f*miscvalue1-91.5)*100; - SetCriteriaProgress(achievementCriteria, fallHeight); + // miscvalue1 is the ingame fallheight*100 as stored in dbc + SetCriteriaProgress(achievementCriteria, miscvalue1); break; } case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 426c070ef..0303a7dff 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -291,6 +291,10 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map). if (recv_data.GetOpcode() == MSG_MOVE_FALL_LAND && !GetPlayer()->isInFlight()) { + // calculate total z distance of the fall + // it is currently only used for the achievement system. It might be used in a more correct falldamage formula later + float z_diff = GetPlayer()->m_fallMovementInfo.z - movementInfo.z; + sLog.outDebug("zDiff = %f", z_diff); Player *target = GetPlayer(); //Players with Feather Fall or low fall time, or physical immunity (charges used) are ignored @@ -323,8 +327,9 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) target->EnvironmentalDamage(target->GetGUID(), DAMAGE_FALL, damage); - if(target->isAlive()) - target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, movementInfo.fallTime); + // recheck alive, might have died of EnvironmentalDamage + if (target->isAlive()) + target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, uint32(z_diff*100)); } //Z given by moveinfo, LastZ, FallTime, WaterZ, MapZ, Damage, Safefall reduction @@ -363,6 +368,8 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) GetPlayer()->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); GetPlayer()->m_movementInfo = movementInfo; + if (GetPlayer()->m_fallMovementInfo.fallTime >= movementInfo.fallTime || GetPlayer()->m_fallMovementInfo.z <=movementInfo.z) + GetPlayer()->m_fallMovementInfo = movementInfo; if(GetPlayer()->isMovingOrTurning()) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); diff --git a/src/game/Player.h b/src/game/Player.h index 54f0d15ed..1e67267bf 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1945,6 +1945,7 @@ class MANGOS_DLL_SPEC Player : public Unit /*** VARIOUS SYSTEMS ***/ /*********************************************************/ MovementInfo m_movementInfo; + MovementInfo m_fallMovementInfo; bool isMoving() const { return HasUnitMovementFlag(movementFlagsMask); } bool isMovingOrTurning() const { return HasUnitMovementFlag(movementOrTurningFlagsMask); } -- 2.11.4.GIT