aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxinef1 <w.szyszko2@gmail.com>2017-02-13 21:05:32 +0100
committerShauren <shauren.trinity@gmail.com>2019-07-21 21:06:54 +0200
commitcfefd27cb8171b7fe28781eb8f1d903272830f22 (patch)
treef434e4d85923306bf50e052753e210048b9cf059
parent89f728cd5b6ae3041fdae3c853ac4b0ac5f0a848 (diff)
Added some missing SetFallInformation calls (#19121)
Fixed HP drop bug on zeppelins Fixed possible packet relocation problems on huge transports (cherrypicked from b3f04ec1570c7fd6ef0d1dacfb7ff9f8ab00a43d)
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp8
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp8
-rw-r--r--src/server/game/Movement/MotionMaster.cpp3
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp8
6 files changed, 28 insertions, 4 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index d89c26a8cfd..0f3a258a411 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -1523,7 +1523,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);
m_teleport_options = options;
- SetFallInformation(0, z);
+ SetFallInformation(0, GetPositionZ());
// code for finish transfer called in WorldSession::HandleMovementOpcodes()
// at client packet CMSG_MOVE_TELEPORT_ACK
@@ -1639,7 +1639,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
m_teleport_dest = WorldLocation(mapid, x, y, z, orientation);
m_teleport_options = options;
- 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 973082b2252..ee014beed06 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -290,7 +290,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());
+ }
}
}
@@ -720,8 +723,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 5850d71bae3..dade838586b 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -93,6 +93,7 @@ void WorldSession::HandleMoveWorldportAck()
z += GetPlayer()->m_unitData->HoverHeight;
GetPlayer()->Relocate(loc.GetPositionX(), loc.GetPositionY(), z, loc.GetOrientation());
+ GetPlayer()->SetFallInformation(0, GetPlayer()->GetPositionZ());
GetPlayer()->ResetMap();
GetPlayer()->SetMap(newMap);
@@ -264,6 +265,7 @@ void WorldSession::HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck
WorldLocation const& dest = plMover->GetTeleportDest();
plMover->UpdatePosition(dest, true);
+ plMover->SetFallInformation(0, GetPlayer()->GetPositionZ());
uint32 newzone, newarea;
plMover->GetZoneAndAreaId(newzone, newarea);
@@ -327,9 +329,13 @@ void WorldSession::HandleMovementOpcode(OpcodeClient opcode, MovementInfo& movem
/* handle special cases */
if (!movementInfo.transport.guid.IsEmpty())
{
+ // We were teleported, skip packets that were broadcast before teleport
+ if (movementInfo.pos.GetExactDist2d(mover) > SIZE_OF_GRIDS)
+ 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)
{
return;
}
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index 64294e3693b..4aa7f2246bf 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -605,7 +605,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 fdbeeed3494..9bb42da1e45 100755
--- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
@@ -404,6 +404,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->RemovePlayerFlag(PLAYER_FLAGS_TAXI_BENCHMARK);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index d5d9f1cdd2b..c17f33b9e62 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -4216,6 +4216,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;
Optional<Movement::SpellEffectExtraData> spellEffectExtraData;
if (effectInfo->MiscValueB)
@@ -4321,6 +4325,10 @@ void Spell::EffectLeapBack(SpellEffIndex /*effIndex*/)
float speedz = damage / 10.f;
// Disengage
unitTarget->JumpTo(speedxy, speedz, m_spellInfo->IconFileDataId != 132572);
+
+ // changes fall time
+ if (m_caster->GetTypeId() == TYPEID_PLAYER)
+ m_caster->ToPlayer()->SetFallInformation(0, m_caster->GetPositionZ());
}
void Spell::EffectQuestClear(SpellEffIndex /*effIndex*/)