aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-03-24 17:42:22 -0600
committermegamage <none@none>2009-03-24 17:42:22 -0600
commit1c6c199f5da5e811fb3e010175bb065510924b9a (patch)
treedc0c066957d2cf56c0ebfd68b1ac8a5c976c8a63 /src
parent941e5b9dbd1c1dd6056bf4d5b2b057b0043ce63c (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.cpp89
-rw-r--r--src/game/Player.cpp27
-rw-r--r--src/game/Player.h2
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);