Core/Movement: converted SMSG_MOVE_SET_COLLISION_HEIGHT to packet class and handle reason bits to match sniff behaivior

This commit is contained in:
Ovahlord
2020-02-23 10:59:57 +01:00
parent d01d7152a6
commit e47b9c8599
7 changed files with 62 additions and 39 deletions

View File

@@ -1823,7 +1823,7 @@ void Player::SetObjectScale(float scale)
SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, scale * DEFAULT_WORLD_OBJECT_SIZE);
SetFloatValue(UNIT_FIELD_COMBATREACH, scale * DEFAULT_COMBAT_REACH);
if (IsInWorld())
SendMovementSetCollisionHeight(GetCollisionHeight());
SendMovementSetCollisionHeight(GetCollisionHeight(), UPDATE_COLLISION_HEIGHT_SCALE);
}
bool Player::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index, Unit* caster) const
@@ -27852,12 +27852,14 @@ void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply)
Movement::PacketSender(this, NULL_OPCODE, SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY).Send();
}
void Player::SendMovementSetCollisionHeight(float height)
void Player::SendMovementSetCollisionHeight(float height, UpdateCollisionHeightReason reason)
{
static MovementStatusElements const heightElement = MSEExtraFloat;
Movement::ExtraMovementStatusElement extra(&heightElement);
extra.Data.floatData = height;
Movement::PacketSender(this, NULL_OPCODE, SMSG_MOVE_SET_COLLISION_HEIGHT, NULL_OPCODE, &extra).Send();
WorldPackets::Movement::MoveSetCollisionHeight packet;
packet.Height = height;
packet.MoverGUID = GetGUID();
packet.SequenceIndex = m_movementCounter++;
packet.Reason = reason;
SendDirectMessage(packet.Write());
}
std::string Player::GetMapAreaAndZoneString() const

View File

@@ -83,6 +83,7 @@ enum InventoryType : uint8;
enum ItemClass : uint8;
enum LootError : uint8;
enum LootType : uint8;
enum UpdateCollisionHeightReason : uint8;
typedef std::deque<Mail*> PlayerMails;
@@ -2358,7 +2359,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
These methods are only sent to the current unit.
*/
void SendMovementSetCanTransitionBetweenSwimAndFly(bool apply);
void SendMovementSetCollisionHeight(float height);
void SendMovementSetCollisionHeight(float height, UpdateCollisionHeightReason reason);
bool CanFly() const override { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }

View File

@@ -8219,7 +8219,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry)
if (charm->GetTypeId() == TYPEID_UNIT)
charm->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
player->SendMovementSetCollisionHeight(player->GetCollisionHeight());
player->SendMovementSetCollisionHeight(player->GetCollisionHeight(), UPDATE_COLLISION_HEIGHT_MOUNT);
}
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOUNT);
@@ -8234,10 +8234,7 @@ void Unit::Dismount()
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNT);
if (Player* thisPlayer = ToPlayer())
{
SendUpdateToSet();
thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight());
}
thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight(), UPDATE_COLLISION_HEIGHT_MOUNT);
WorldPacket data(SMSG_DISMOUNT, 8);
data << GetPackGUID();

View File

@@ -4288,6 +4288,12 @@ enum ContentLevels : uint8
MAX_CONTENT
};
enum UpdateCollisionHeightReason : uint8
{
UPDATE_COLLISION_HEIGHT_MOUNT = 0,
UPDATE_COLLISION_HEIGHT_SCALE = 1
};
#define MAX_CREATURE_SPELL_DATA_SLOT 4
#endif

View File

@@ -4654,31 +4654,6 @@ MovementStatusElements const MoveSetPitchRate[] =
MSEEnd,
};
MovementStatusElements const MoveSetCollisionHeight[] =
{
MSEZeroBit,
MSEZeroBit,
MSEHasGuidByte6,
MSEHasGuidByte1,
MSEHasGuidByte4,
MSEHasGuidByte7,
MSEHasGuidByte5,
MSEHasGuidByte2,
MSEHasGuidByte0,
MSEHasGuidByte3,
MSEGuidByte6,
MSEGuidByte0,
MSEGuidByte4,
MSEGuidByte3,
MSEGuidByte5,
MSECounter,
MSEGuidByte1,
MSEGuidByte2,
MSEGuidByte7,
MSEExtraElement,
MSEEnd,
};
MovementStatusElements const SplineMoveSetWalkMode[] =
{
MSEHasGuidByte7,
@@ -5774,8 +5749,6 @@ MovementStatusElements const* GetMovementStatusElementsSequence(uint32 opcode)
return MovementSetCanFlyAck;
case CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK:
return MovementSetCanTransitionBetweenSwimAndFlyAck;
case SMSG_MOVE_SET_COLLISION_HEIGHT:
return MoveSetCollisionHeight;
case CMSG_MOVE_SET_COLLISION_HEIGHT_ACK:
return MovementSetCollisionHeightAck;
case SMSG_MOVE_UPDATE_COLLISION_HEIGHT:

View File

@@ -64,3 +64,34 @@ WorldPacket const* WorldPackets::Movement::NewWorld::Write()
_worldPacket << Pos.GetPositionY();
return &_worldPacket;
}
WorldPacket const* WorldPackets::Movement::MoveSetCollisionHeight::Write()
{
_worldPacket.WriteBits(Reason, 2);
_worldPacket.WriteBit(MoverGUID[6]);
_worldPacket.WriteBit(MoverGUID[1]);
_worldPacket.WriteBit(MoverGUID[4]);
_worldPacket.WriteBit(MoverGUID[7]);
_worldPacket.WriteBit(MoverGUID[5]);
_worldPacket.WriteBit(MoverGUID[2]);
_worldPacket.WriteBit(MoverGUID[0]);
_worldPacket.WriteBit(MoverGUID[3]);
_worldPacket.FlushBits();
_worldPacket.WriteByteSeq(MoverGUID[6]);
_worldPacket.WriteByteSeq(MoverGUID[0]);
_worldPacket.WriteByteSeq(MoverGUID[4]);
_worldPacket.WriteByteSeq(MoverGUID[3]);
_worldPacket.WriteByteSeq(MoverGUID[5]);
_worldPacket << uint32(SequenceIndex);
_worldPacket.WriteByteSeq(MoverGUID[1]);
_worldPacket.WriteByteSeq(MoverGUID[2]);
_worldPacket.WriteByteSeq(MoverGUID[7]);
_worldPacket << float(Height);
return &_worldPacket;
}

View File

@@ -75,6 +75,19 @@ namespace WorldPackets
int32 MapID = 0;
Position Pos;
};
class MoveSetCollisionHeight final : public ServerPacket
{
public:
MoveSetCollisionHeight() : ServerPacket(SMSG_MOVE_SET_COLLISION_HEIGHT, 15) { }
WorldPacket const* Write() override;
ObjectGuid MoverGUID;
uint32 SequenceIndex = 0;
float Height = 1.0f;
UpdateCollisionHeightReason Reason = UPDATE_COLLISION_HEIGHT_MOUNT;
};
}
}