diff options
author | xinef1 <w.szyszko2@gmail.com> | 2017-02-13 21:05:32 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2017-02-13 21:05:32 +0100 |
commit | b3f04ec1570c7fd6ef0d1dacfb7ff9f8ab00a43d (patch) | |
tree | a6ed2772652e884ca9399ddf789d6bd035052bfd | |
parent | 2412886ef69d305df1bd6e6422ca3134c0ab1449 (diff) |
Added some missing SetFallInformation calls (#19121)
Fixed HP drop bug on zeppelins
Fixed possible packet relocation problems on huge transports
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Transport/Transport.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 3 | ||||
-rwxr-xr-x | src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 8 |
6 files changed, 31 insertions, 4 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 29fd756bc58..ccf4ac4d24c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1929,7 +1929,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati // this will be used instead of the current location in SaveToDB m_teleport_dest = WorldLocation(mapid, x, y, z, orientation); - SetFallInformation(0, z); + SetFallInformation(0, GetPositionZ()); // code for finish transfer called in WorldSession::HandleMovementOpcodes() // at client packet MSG_MOVE_TELEPORT_ACK @@ -2037,7 +2037,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati oldmap->RemovePlayerFromMap(this, false); m_teleport_dest = WorldLocation(mapid, x, y, z, orientation); - SetFallInformation(0, z); + SetFallInformation(0, GetPositionZ()); // if the player is saved before worldportack (at logout for example) // this will be used instead of the current location in SaveToDB diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index fbb7bf26ab9..b4b12084777 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -286,7 +286,10 @@ void Transport::RemovePassenger(WorldObject* passenger) TC_LOG_DEBUG("entities.transport", "Object %s removed from transport %s.", passenger->GetName().c_str(), GetName().c_str()); if (Player* plr = passenger->ToPlayer()) + { sScriptMgr->OnRemovePassenger(this, plr); + plr->SetFallInformation(0, plr->GetPositionZ()); + } } } @@ -713,8 +716,11 @@ void Transport::UpdatePassengerPositions(PassengerSet& passengers) } case TYPEID_PLAYER: //relocate only passengers in world and skip any player that might be still logging in/teleporting - if (passenger->IsInWorld()) + if (passenger->IsInWorld() && !passenger->ToPlayer()->IsBeingTeleported()) + { GetMap()->PlayerRelocation(passenger->ToPlayer(), x, y, z, o); + passenger->ToPlayer()->SetFallInformation(0, passenger->GetPositionZ()); + } break; case TYPEID_GAMEOBJECT: GetMap()->GameObjectRelocation(passenger->ToGameObject(), x, y, z, o, false); diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 42b2db1cccd..69918e81555 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -88,6 +88,7 @@ void WorldSession::HandleMoveWorldportAck() if (GetPlayer()->HasUnitMovementFlag(MOVEMENTFLAG_HOVER)) z += GetPlayer()->GetFloatValue(UNIT_FIELD_HOVERHEIGHT); GetPlayer()->Relocate(loc.GetPositionX(), loc.GetPositionY(), z, loc.GetOrientation()); + GetPlayer()->SetFallInformation(0, GetPlayer()->GetPositionZ()); GetPlayer()->ResetMap(); GetPlayer()->SetMap(newMap); @@ -224,6 +225,7 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recvData) WorldLocation const& dest = plMover->GetTeleportDest(); plMover->UpdatePosition(dest, true); + plMover->SetFallInformation(0, GetPlayer()->GetPositionZ()); uint32 newzone, newarea; plMover->GetZoneAndAreaId(newzone, newarea); @@ -289,9 +291,16 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) /* handle special cases */ if (movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) { + // We were teleported, skip packets that were broadcast before teleport + if (movementInfo.pos.GetExactDist2d(mover) > SIZE_OF_GRIDS) + { + recvData.rfinish(); // prevent warnings spam + return; + } + // transports size limited // (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped) - if (movementInfo.transport.pos.GetPositionX() > 50 || movementInfo.transport.pos.GetPositionY() > 50 || movementInfo.transport.pos.GetPositionZ() > 50) + if (fabs(movementInfo.transport.pos.GetPositionX()) > 75.0f || fabs(movementInfo.transport.pos.GetPositionY()) > 75.0f || fabs(movementInfo.transport.pos.GetPositionZ()) > 75.0f) { recvData.rfinish(); // prevent warnings spam return; diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index ea3583b0cdf..8911278ed93 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -585,7 +585,10 @@ void MotionMaster::MoveFall(uint32 id /*=0*/) // don't run spline movement for players if (_owner->GetTypeId() == TYPEID_PLAYER) + { + _owner->ToPlayer()->SetFallInformation(0, _owner->GetPositionZ()); return; + } Movement::MoveSplineInit init(_owner); init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), tz, false); diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 2644b670de7..067a383fb33 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -328,6 +328,7 @@ void FlightPathMovementGenerator::DoFinalize(Player* player) // this prevent cheating with landing point at lags // when client side flight end early in comparison server side player->StopMoving(); + player->SetFallInformation(0, player->GetPositionZ()); } player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_TAXI_BENCHMARK); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index fb740906ea8..0321d786312 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4665,6 +4665,10 @@ void Spell::EffectCharge(SpellEffIndex /*effIndex*/) if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET) { + // charge changes fall time + if (m_caster->GetTypeId() == TYPEID_PLAYER) + m_caster->ToPlayer()->SetFallInformation(0, m_caster->GetPositionZ()); + float speed = G3D::fuzzyGt(m_spellInfo->Speed, 0.0f) ? m_spellInfo->Speed : SPEED_CHARGE; // Spell is not using explicit target - no generated path if (m_preGeneratedPath.GetPathType() == PATHFIND_BLANK) @@ -4755,6 +4759,10 @@ void Spell::EffectLeapBack(SpellEffIndex effIndex) float speedz = damage/ 10.f; //1891: Disengage unitTarget->JumpTo(speedxy, speedz, m_spellInfo->SpellIconID != 1891); + + // changes fall time + if (m_caster->GetTypeId() == TYPEID_PLAYER) + m_caster->ToPlayer()->SetFallInformation(0, m_caster->GetPositionZ()); } void Spell::EffectQuestClear(SpellEffIndex effIndex) |