Core/Movement: Refresh collision height on shapeshifting

This commit is contained in:
Shauren
2021-02-11 22:59:28 +01:00
parent 409ca262b3
commit 49992508a4
5 changed files with 24 additions and 15 deletions
+3 -3
View File
@@ -1657,7 +1657,7 @@ void Player::SetObjectScale(float scale)
SetBoundingRadius(scale * DEFAULT_PLAYER_BOUNDING_RADIUS);
SetCombatReach(scale * DEFAULT_PLAYER_COMBAT_REACH);
if (IsInWorld())
SendMovementSetCollisionHeight(scale * GetCollisionHeight(IsMounted()));
SendMovementSetCollisionHeight(scale * GetCollisionHeight(IsMounted()), WorldPackets::Movement::UpdateCollisionHeightReason::Scale);
}
bool Player::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index, Unit* caster) const
@@ -28194,7 +28194,7 @@ void Player::DeleteGarrison()
}
}
void Player::SendMovementSetCollisionHeight(float height)
void Player::SendMovementSetCollisionHeight(float height, WorldPackets::Movement::UpdateCollisionHeightReason reason)
{
WorldPackets::Movement::MoveSetCollisionHeight setCollisionHeight;
setCollisionHeight.MoverGUID = GetGUID();
@@ -28203,7 +28203,7 @@ void Player::SendMovementSetCollisionHeight(float height)
setCollisionHeight.Scale = GetObjectScale();
setCollisionHeight.MountDisplayID = GetMountDisplayId();
setCollisionHeight.ScaleDuration = m_unitData->ScaleDuration;
setCollisionHeight.Reason = WorldPackets::Movement::UPDATE_COLLISION_HEIGHT_MOUNT;
setCollisionHeight.Reason = reason;
SendDirectMessage(setCollisionHeight.Write());
WorldPackets::Movement::MoveUpdateCollisionHeight updateCollisionHeight;
+6 -1
View File
@@ -104,6 +104,11 @@ namespace WorldPackets
{
struct CharacterCreateInfo;
}
namespace Movement
{
enum class UpdateCollisionHeightReason : uint8;
}
}
typedef std::deque<Mail*> PlayerMails;
@@ -2387,7 +2392,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void ValidateMovementInfo(MovementInfo* mi);
void SendMovementSetCollisionHeight(float height);
void SendMovementSetCollisionHeight(float height, WorldPackets::Movement::UpdateCollisionHeightReason reason);
bool CanFly() const override { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
+2 -2
View File
@@ -7848,7 +7848,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry)
if (charm->GetTypeId() == TYPEID_UNIT)
charm->AddUnitFlag(UNIT_FLAG_STUNNED);
player->SendMovementSetCollisionHeight(player->GetCollisionHeight(true));
player->SendMovementSetCollisionHeight(player->GetCollisionHeight(true), WorldPackets::Movement::UpdateCollisionHeightReason::Mount);
}
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOUNT);
@@ -7863,7 +7863,7 @@ void Unit::Dismount()
RemoveUnitFlag(UNIT_FLAG_MOUNT);
if (Player* thisPlayer = ToPlayer())
thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight(false));
thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight(false), WorldPackets::Movement::UpdateCollisionHeightReason::Mount);
// dismount as a vehicle
if (GetTypeId() == TYPEID_PLAYER && GetVehicleKit())
@@ -487,11 +487,11 @@ namespace WorldPackets
Optional<MoveKnockBackSpeeds> Speeds;
};
enum UpdateCollisionHeightReason : uint8
enum class UpdateCollisionHeightReason : uint8
{
UPDATE_COLLISION_HEIGHT_SCALE = 0,
UPDATE_COLLISION_HEIGHT_MOUNT = 1,
UPDATE_COLLISION_HEIGHT_FORCE = 2
Scale = 0,
Mount = 1,
Force = 2
};
class MoveSetCollisionHeight final : public ServerPacket
@@ -504,7 +504,7 @@ namespace WorldPackets
float Scale = 1.0f;
ObjectGuid MoverGUID;
uint32 MountDisplayID = 0;
UpdateCollisionHeightReason Reason = UPDATE_COLLISION_HEIGHT_MOUNT;
UpdateCollisionHeightReason Reason = UpdateCollisionHeightReason::Scale;
uint32 SequenceIndex = 0;
int32 ScaleDuration = 0;
float Height = 1.0f;
@@ -530,7 +530,7 @@ namespace WorldPackets
void Read() override;
MovementAck Data;
UpdateCollisionHeightReason Reason = UPDATE_COLLISION_HEIGHT_MOUNT;
UpdateCollisionHeightReason Reason = UpdateCollisionHeightReason::Scale;
uint32 MountDisplayID = 0;
float Height = 1.0f;
};
@@ -638,7 +638,7 @@ namespace WorldPackets
{
float Height = 0.0f;
float Scale = 0.0f;
UpdateCollisionHeightReason Reason = UPDATE_COLLISION_HEIGHT_MOUNT;
UpdateCollisionHeightReason Reason = UpdateCollisionHeightReason::Scale;
};
struct KnockBackInfo
@@ -29,6 +29,7 @@
#include "LootMgr.h"
#include "MiscPackets.h"
#include "MotionMaster.h"
#include "MovementPackets.h"
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
#include "Opcodes.h"
@@ -1821,8 +1822,11 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo
HandleShapeshiftBoosts(target, false);
}
if (target->GetTypeId() == TYPEID_PLAYER)
target->ToPlayer()->InitDataForForm();
if (Player* playerTarget = target->ToPlayer())
{
playerTarget->SendMovementSetCollisionHeight(playerTarget->GetCollisionHeight(false), WorldPackets::Movement::UpdateCollisionHeightReason::Force);
playerTarget->InitDataForForm();
}
else
target->UpdateDisplayPower();