From 5ca475a7647c0e5ab4f4a6ef86e1b34974167c26 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Wed, 10 Nov 2021 13:53:14 +0100 Subject: [PATCH] Core/Movement: split SetCanFly for player and creature class and handle their part accordingly --- .../game/Entities/Creature/Creature.cpp | 14 +++++++ src/server/game/Entities/Creature/Creature.h | 1 + src/server/game/Entities/Unit/Unit.cpp | 38 +++++++++---------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 1b6dc981b5..82cebd2d83 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1112,6 +1112,10 @@ bool Creature::SetDisableGravity(bool disable, bool packetOnly /*= false*/, bool SetAnimationTier(AnimationTier::Ground); } + WorldPacket data(disable ? SMSG_SPLINE_MOVE_GRAVITY_DISABLE : SMSG_SPLINE_MOVE_GRAVITY_ENABLE); + WriteMovementInfo(data); + SendMessageToSet(&data, false); + return true; } @@ -1133,6 +1137,16 @@ bool Creature::SetHover(bool enable, bool packetOnly /*= false*/, bool updateAni return true; } +bool Creature::SetCanFly(bool enable, bool packetOnly /*= false*/) +{ + if (!Unit::SetCanFly(enable, packetOnly)) + return false; + + WorldPacket data(enable ? SMSG_SPLINE_MOVE_SET_FLYING : SMSG_SPLINE_MOVE_UNSET_FLYING); + WriteMovementInfo(data); + SendMessageToSet(&data, false); +} + void Creature::InitializeReactState() { if (IsTotem() || IsTrigger() || IsCritter() || IsSpiritService()) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 68f2a2f6ef..982156579e 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -101,6 +101,7 @@ class TC_GAME_API Creature : public Unit, public GridObject, public Ma bool CanHover() const { return GetMovementTemplate().IsHoverEnabled() || IsHovering(); } bool SetDisableGravity(bool disable, bool packetOnly = false, bool updateAnimationTier = true) override; bool SetHover(bool enable, bool packetOnly = false, bool updateAnimationTier = true) override; + bool SetCanFly(bool enable, bool packetOnly = false) override; bool IsDungeonBoss() const { return (GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_DUNGEON_BOSS) != 0; } bool IsAffectedByDiminishingReturns() const override { return Unit::IsAffectedByDiminishingReturns() || (GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH) != 0; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 69df939cc2..33a3db9f1b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13892,8 +13892,12 @@ void Unit::PurgeAndApplyPendingMovementChanges(bool informObservers /* = true */ case MovementChangeType::SPEED_CHANGE_FLIGHT_SPEED: moveType = MOVE_FLIGHT; break; case MovementChangeType::SPEED_CHANGE_FLIGHT_BACK_SPEED: moveType = MOVE_FLIGHT_BACK; break; case MovementChangeType::RATE_CHANGE_PITCH: moveType = MOVE_PITCH_RATE; break; - case MovementChangeType::GRAVITY_DISABLE: break; - case MovementChangeType::SET_CAN_FLY: break; + case MovementChangeType::GRAVITY_DISABLE: + Unit::SetDisableGravity(pendingChange.second.apply); + break; + case MovementChangeType::SET_CAN_FLY: + Unit::SetCanFly(pendingChange.second.apply); + break; default: ASSERT(false); return; @@ -13907,6 +13911,18 @@ void Unit::PurgeAndApplyPendingMovementChanges(bool informObservers /* = true */ if (informObservers) MovementPacketSender::SendSpeedChangeToObservers(this, *moveType, speedFlat); } + else if (informObservers) + { + switch (changeType) + { + case MovementChangeType::GRAVITY_DISABLE: + case MovementChangeType::SET_CAN_FLY: + MovementPacketSender::SendMovementFlagChangeToObservers(this); + break; + default: + break; + } + } } m_pendingMovementChanges.clear(); @@ -14199,14 +14215,6 @@ bool Unit::SetDisableGravity(bool disable, bool packetOnly /*= false*/, bool /*u } } - WorldPacket data; - if (disable) - data.Initialize(IsMovedByClient() ? SMSG_MOVE_GRAVITY_DISABLE : SMSG_SPLINE_MOVE_GRAVITY_DISABLE); - else - data.Initialize(IsMovedByClient() ? SMSG_MOVE_GRAVITY_ENABLE : SMSG_SPLINE_MOVE_GRAVITY_ENABLE); - - WriteMovementInfo(data); - return true; } @@ -14269,16 +14277,6 @@ bool Unit::SetCanFly(bool enable, bool packetOnly) if (GetTypeId() == TYPEID_PLAYER) RemoveExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS); } - - if (Player* player = ToPlayer()) - player->SendMovementSetCanTransitionBetweenSwimAndFly(enable); - } - - if (IsCreature()) - { - WorldPacket data(enable ? SMSG_SPLINE_MOVE_SET_FLYING : SMSG_SPLINE_MOVE_UNSET_FLYING); - WriteMovementInfo(data); - SendMessageToSet(&data, false); } return true;