diff options
author | megamage <none@none> | 2009-03-24 17:42:22 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-03-24 17:42:22 -0600 |
commit | 1c6c199f5da5e811fb3e010175bb065510924b9a (patch) | |
tree | dc0c066957d2cf56c0ebfd68b1ac8a5c976c8a63 /src | |
parent | 941e5b9dbd1c1dd6056bf4d5b2b057b0043ce63c (diff) |
[7533] Redirect movement packet in proper way to controlled target. Author: VladimirMangos
* In creature case ignore fall/etc damage
* In player case apply fall damage/etc to controlled player, apply other movement effect to it also.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/MovementHandler.cpp | 89 | ||||
-rw-r--r-- | src/game/Player.cpp | 27 | ||||
-rw-r--r-- | src/game/Player.h | 2 |
3 files changed, 53 insertions, 65 deletions
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 2ec6022ca39..49fb941fd25 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -192,6 +192,9 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) if (!Trinity::IsValidMapCoord(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o)) return; + Unit *mover = _player->m_mover; + Player *plMover = mover->GetTypeId()==TYPEID_PLAYER ? (Player*)mover : NULL; + /* handle special cases */ if (movementInfo.flags & MOVEMENTFLAG_ONTRANSPORT) { @@ -205,24 +208,24 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) return; // if we boarded a transport, add us to it - if (!GetPlayer()->m_transport) + if (plMover && plMover->m_transport) { // elevators also cause the client to send MOVEMENTFLAG_ONTRANSPORT - just unmount if the guid can be found in the transport list for (MapManager::TransportSet::iterator iter = MapManager::Instance().m_Transports.begin(); iter != MapManager::Instance().m_Transports.end(); ++iter) { if ((*iter)->GetGUID() == movementInfo.t_guid) { - GetPlayer()->m_transport = (*iter); - (*iter)->AddPassenger(GetPlayer()); + plMover->m_transport = (*iter); + (*iter)->AddPassenger(plMover); break; } } } } - else if (GetPlayer()->m_transport) // if we were on a transport, leave + else if (plMover && plMover->m_transport) // if we were on a transport, leave { - GetPlayer()->m_transport->RemovePassenger(GetPlayer()); - GetPlayer()->m_transport = NULL; + plMover->m_transport->RemovePassenger(plMover); + plMover->m_transport = NULL; movementInfo.t_x = 0.0f; movementInfo.t_y = 0.0f; movementInfo.t_z = 0.0f; @@ -232,54 +235,68 @@ 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 (opcode == MSG_MOVE_FALL_LAND && !GetPlayer()->isInFlight()) - GetPlayer()->HandleFall(movementInfo); + if (opcode == MSG_MOVE_FALL_LAND && plMover && !plMover->isInFlight()) + plMover->HandleFall(movementInfo); - if(((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != GetPlayer()->IsInWater()) + if (plMover && ((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != plMover->IsInWater()) { // now client not include swimming flag in case jumping under water - GetPlayer()->SetInWater( !GetPlayer()->IsInWater() || GetPlayer()->GetBaseMap()->IsUnderWater(movementInfo.x, movementInfo.y, movementInfo.z) ); + plMover->SetInWater( !plMover->IsInWater() || plMover->GetBaseMap()->IsUnderWater(movementInfo.x, movementInfo.y, movementInfo.z) ); } /*----------------------*/ /* process position-change */ - Unit *mover = _player->m_mover; recv_data.put<uint32>(6, getMSTime()); // fix time, offset flags(4) + unk(2) WorldPacket data(recv_data.GetOpcode(), (mover->GetPackGUID().size()+recv_data.size())); data.append(mover->GetPackGUID()); // use mover guid data.append(recv_data.contents(), recv_data.size()); GetPlayer()->SendMessageToSet(&data, false); - if(!_player->GetCharmGUID()) // nothing is charmed + if(plMover) // nothing is charmed, or player charmed { - _player->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); - _player->m_movementInfo = movementInfo; - _player->SetUnitMovementFlags(movementInfo.flags); - } - else - { - if(mover->GetTypeId() != TYPEID_PLAYER) // unit, creature, pet, vehicle... - { - if(Map *map = mover->GetMap()) - map->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); - mover->SetUnitMovementFlags(movementInfo.flags); - } - else // player - { - ((Player*)mover)->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); - ((Player*)mover)->m_movementInfo = movementInfo; - ((Player*)mover)->SetUnitMovementFlags(movementInfo.flags); - } - } + plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); + plMover->m_movementInfo = movementInfo; + plMover->SetUnitMovementFlags(movementInfo.flags); + + plMover->UpdateFallInformationIfNeed(movementInfo,recv_data.GetOpcode()); - GetPlayer()->UpdateFallInformationIfNeed(movementInfo,MSG_MOVE_FALL_LAND); + if(plMover->isMovingOrTurning()) + plMover->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); - if(GetPlayer()->isMovingOrTurning()) - GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); + if(movementInfo.z < -500.0f) + { + if(plMover->InBattleGround() + && plMover->GetBattleGround() + && plMover->GetBattleGround()->HandlePlayerUnderMap(_player)) + { + // do nothing, the handle already did if returned true + } + else + { + // NOTE: this is actually called many times while falling + // even after the player has been teleported away + // TODO: discard movement packets after the player is rooted + if(plMover->isAlive()) + { + plMover->EnvironmentalDamage(DAMAGE_FALL_TO_VOID, GetPlayer()->GetMaxHealth()); + // change the death state to CORPSE to prevent the death timer from + // starting in the next player update + plMover->KillPlayer(); + plMover->BuildPlayerRepop(); + } - if(movementInfo.z < -500.0f) - GetPlayer()->HandleFallUnderMap(); + // cancel the death timer here if started + plMover->RepopAtGraveyard(); + } + } + } + else // creature charmed + { + if(Map *map = mover->GetMap()) + map->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); + mover->SetUnitMovementFlags(movementInfo.flags); + } } void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 7f9ceffda7f..bef57fd0a45 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -20048,33 +20048,6 @@ bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const //-------------TRINITY--------------- //*********************************** -void Player::HandleFallUnderMap() -{ - if(InBattleGround() - && GetBattleGround() - && GetBattleGround()->HandlePlayerUnderMap(this)) - { - // do nothing, the handle already did if returned true - } - else - { - // NOTE: this is actually called many times while falling - // even after the player has been teleported away - // TODO: discard movement packets after the player is rooted - if(isAlive()) - { - EnvironmentalDamage(DAMAGE_FALL_TO_VOID, GetMaxHealth()); - // change the death state to CORPSE to prevent the death timer from - // starting in the next player update - KillPlayer(); - BuildPlayerRepop(); - } - - // cancel the death timer here if started - RepopAtGraveyard(); - } -} - void Player::StopCastingBindSight() { if(WorldObject* target = GetViewpoint()) diff --git a/src/game/Player.h b/src/game/Player.h index c00cba0ea2a..f2cefec9649 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1975,8 +1975,6 @@ class TRINITY_DLL_SPEC Player : public Unit bool IsFlying() const { return HasUnitMovementFlag(MOVEMENTFLAG_FLYING); } bool IsAllowUseFlyMountsHere() const; - void HandleFallUnderMap(); - void SetClientControl(Unit* target, uint8 allowMove); void EnterVehicle(Vehicle *vehicle); |