aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Object.cpp684
-rw-r--r--src/server/game/Entities/Object/Object.h12
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.cpp1
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.h6
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.cpp9
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.h26
6 files changed, 427 insertions, 311 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index fa9634add80..e4313032d6f 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -177,7 +177,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
return;
uint8 updateType = UPDATETYPE_CREATE_OBJECT;
- uint16 flags = m_updateFlag;
+ uint32 flags = m_updateFlag;
/** lower flag1 **/
if (target == this) // building packet for yourself
@@ -239,7 +239,7 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
flags |= UPDATEFLAG_ANIMKITS;
}
- ByteBuffer buf(500);
+ ByteBuffer buf(0x400);
buf << uint8(updateType);
buf << GetPackGUID();
buf << uint8(m_objectTypeId);
@@ -348,325 +348,177 @@ ObjectGuid const& Object::GetGuidValue(uint16 index) const
return *((ObjectGuid*)&(m_uint32Values[index]));
}
-void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const
-{
- Unit const* self = NULL;
- ObjectGuid guid = GetGUID();
- uint32 movementFlags = 0;
- uint16 movementFlagsExtra = 0;
-
- bool hasTransportTime2 = false;
- bool hasTransportTime3 = false;
- bool hasFallDirection = false;
- bool hasFallData = false;
- bool hasPitch = false;
- bool hasSpline = false;
- bool hasSplineElevation = false;
-
- uint32 stopFrameCount = 0;
+void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const
+{
+ bool NoBirthAnim = false;
+ bool EnablePortals = false;
+ bool PlayHoverAnim = false;
+ bool IsSuppressingGreetings = false;
+ bool HasMovementUpdate = flags & UPDATEFLAG_LIVING;
+ bool HasMovementTransport = flags & UPDATEFLAG_GO_TRANSPORT_POSITION;
+ bool Stationary = flags & UPDATEFLAG_STATIONARY_POSITION;
+ bool CombatVictim = flags & UPDATEFLAG_HAS_TARGET;
+ bool ServerTime = flags & UPDATEFLAG_TRANSPORT;
+ bool VehicleCreate = flags & UPDATEFLAG_VEHICLE;
+ bool AnimKitCreate = flags & UPDATEFLAG_ANIMKITS;
+ bool Rotation = flags & UPDATEFLAG_ROTATION;
+ bool HasAreaTrigger = false;
+ bool HasGameObject = false;
+ bool ThisIsYou = flags & UPDATEFLAG_SELF;
+ bool ReplaceActive = false;
+ bool SceneObjCreate = false;
+ bool ScenePendingInstances = false;
+ uint32 PauseTimesCount = 0;
if (GameObject const* go = ToGameObject())
if (go->GetGoType() == GAMEOBJECT_TYPE_TRANSPORT)
- stopFrameCount = go->GetGOValue()->Transport.StopFrames->size();
-
- // Bit content
- data->WriteBit(0);
- data->WriteBit(0);
- data->WriteBit(flags & UPDATEFLAG_ROTATION);
- data->WriteBit(flags & UPDATEFLAG_ANIMKITS);
- data->WriteBit(flags & UPDATEFLAG_HAS_TARGET);
- data->WriteBit(flags & UPDATEFLAG_SELF);
- data->WriteBit(flags & UPDATEFLAG_VEHICLE);
- data->WriteBit(flags & UPDATEFLAG_LIVING);
- data->WriteBits(stopFrameCount, 24);
- data->WriteBit(0);
- data->WriteBit(flags & UPDATEFLAG_GO_TRANSPORT_POSITION);
- data->WriteBit(flags & UPDATEFLAG_STATIONARY_POSITION);
- data->WriteBit(flags & UPDATEFLAG_UNK5);
- data->WriteBit(0);
- data->WriteBit(flags & UPDATEFLAG_TRANSPORT);
-
- if (flags & UPDATEFLAG_LIVING)
- {
- self = ToUnit();
- movementFlags = self->m_movementInfo.GetMovementFlags();
- movementFlagsExtra = self->m_movementInfo.GetExtraMovementFlags();
- hasSpline = self->IsSplineEnabled();
-
- hasTransportTime2 = !self->m_movementInfo.transport.guid.IsEmpty() && self->m_movementInfo.transport.time2 != 0;
- hasTransportTime3 = false;
- hasPitch = self->HasUnitMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || self->HasExtraUnitMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING);
- hasFallDirection = self->HasUnitMovementFlag(MOVEMENTFLAG_FALLING);
- hasFallData = hasFallDirection || self->m_movementInfo.jump.fallTime != 0;
- hasSplineElevation = self->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION);
-
- if (GetTypeId() == TYPEID_UNIT)
- movementFlags &= MOVEMENTFLAG_MASK_CREATURE_ALLOWED;
-
- data->WriteBit(!movementFlags);
- data->WriteBit(G3D::fuzzyEq(self->GetOrientation(), 0.0f)); // Has Orientation
- data->WriteBit(guid[7]);
- data->WriteBit(guid[3]);
- data->WriteBit(guid[2]);
- if (movementFlags)
- data->WriteBits(movementFlags, 30);
-
- data->WriteBit(hasSpline && GetTypeId() == TYPEID_PLAYER); // Has spline (from MovementInfo)
- data->WriteBit(!hasPitch); // Has pitch
- data->WriteBit(hasSpline); // Has spline data (independent)
- data->WriteBit(hasFallData); // Has fall data
- data->WriteBit(!hasSplineElevation); // Has spline elevation
- data->WriteBit(guid[5]);
- data->WriteBit(!self->m_movementInfo.transport.guid.IsEmpty()); // Has transport data
- data->WriteBit(0); // Is missing time
-
- if (!self->m_movementInfo.transport.guid.IsEmpty())
- {
- ObjectGuid transGuid = self->m_movementInfo.transport.guid;
-
- data->WriteBit(transGuid[1]);
- data->WriteBit(hasTransportTime2); // Has transport time 2
- data->WriteBit(transGuid[4]);
- data->WriteBit(transGuid[0]);
- data->WriteBit(transGuid[6]);
- data->WriteBit(hasTransportTime3); // Has transport time 3
- data->WriteBit(transGuid[7]);
- data->WriteBit(transGuid[5]);
- data->WriteBit(transGuid[3]);
- data->WriteBit(transGuid[2]);
- }
-
- data->WriteBit(guid[4]);
-
- if (hasSpline)
- Movement::PacketBuilder::WriteCreateBits(*self->movespline, *data);
-
- data->WriteBit(guid[6]);
- if (hasFallData)
- data->WriteBit(hasFallDirection);
-
- data->WriteBit(guid[0]);
- data->WriteBit(guid[1]);
- data->WriteBit(0);
- data->WriteBit(!movementFlagsExtra);
- if (movementFlagsExtra)
- data->WriteBits(movementFlagsExtra, 12);
- }
-
- if (flags & UPDATEFLAG_GO_TRANSPORT_POSITION)
- {
- WorldObject const* self = static_cast<WorldObject const*>(this);
- ObjectGuid transGuid = self->m_movementInfo.transport.guid;
- data->WriteBit(transGuid[5]);
- data->WriteBit(0); // Has GO transport time 3
- data->WriteBit(transGuid[0]);
- data->WriteBit(transGuid[3]);
- data->WriteBit(transGuid[6]);
- data->WriteBit(transGuid[1]);
- data->WriteBit(transGuid[4]);
- data->WriteBit(transGuid[2]);
- data->WriteBit(0); // Has GO transport time 2
- data->WriteBit(transGuid[7]);
- }
-
- if (flags & UPDATEFLAG_HAS_TARGET)
- {
- ObjectGuid victimGuid = self->GetVictim()->GetGUID(); // checked in BuildCreateUpdateBlockForPlayer
- data->WriteBit(victimGuid[2]);
- data->WriteBit(victimGuid[7]);
- data->WriteBit(victimGuid[0]);
- data->WriteBit(victimGuid[4]);
- data->WriteBit(victimGuid[5]);
- data->WriteBit(victimGuid[6]);
- data->WriteBit(victimGuid[1]);
- data->WriteBit(victimGuid[3]);
- }
-
- if (flags & UPDATEFLAG_ANIMKITS)
+ PauseTimesCount = go->GetGOValue()->Transport.StopFrames->size();
+
+ data->WriteBit(NoBirthAnim);
+ data->WriteBit(EnablePortals);
+ data->WriteBit(PlayHoverAnim);
+ data->WriteBit(IsSuppressingGreetings);
+ data->WriteBit(HasMovementUpdate);
+ data->WriteBit(HasMovementTransport);
+ data->WriteBit(Stationary);
+ data->WriteBit(CombatVictim);
+ data->WriteBit(ServerTime);
+ data->WriteBit(VehicleCreate);
+ data->WriteBit(AnimKitCreate);
+ data->WriteBit(Rotation);
+ data->WriteBit(HasAreaTrigger);
+ data->WriteBit(HasGameObject);
+ data->WriteBit(ThisIsYou);
+ data->WriteBit(ReplaceActive);
+ data->WriteBit(SceneObjCreate);
+ data->WriteBit(ScenePendingInstances);
+ *data << uint32(PauseTimesCount);
+
+ if (HasMovementUpdate)
{
Unit const* unit = ToUnit();
- data->WriteBit(unit->GetAIAnimKitId() == 0);
- data->WriteBit(unit->GetMovementAnimKitId() == 0);
- data->WriteBit(unit->GetMeleeAnimKitId() == 0);
- }
+ bool HasFallDirection = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING);
+ bool HasFall = HasFallDirection || unit->m_movementInfo.jump.fallTime != 0;
+ bool HasSpline = unit->IsSplineEnabled();
- data->FlushBits();
+ *data << unit->m_movementInfo.guid; // MoverGUID
- // Data
- if (GameObject const* go = ToGameObject())
- for (uint32 i = 0; i < stopFrameCount; ++i)
- *data << uint32(go->GetGOValue()->Transport.StopFrames->at(i));
+ *data << uint32(unit->m_movementInfo.time); // MoveIndex
+ *data << float(unit->GetPositionX());
+ *data << float(unit->GetPositionY());
+ *data << float(unit->GetPositionZ());
+ *data << float(unit->GetOrientation());
- if (flags & UPDATEFLAG_LIVING)
- {
- data->WriteByteSeq(guid[4]);
- *data << self->GetSpeed(MOVE_RUN_BACK);
+ *data << float(unit->m_movementInfo.pitch); // Pitch
+ *data << float(unit->m_movementInfo.splineElevation); // StepUpStartElevation
- if (hasFallData)
- {
- if (hasFallDirection)
- {
- *data << float(self->m_movementInfo.jump.xyspeed);
- *data << float(self->m_movementInfo.jump.sinAngle);
- *data << float(self->m_movementInfo.jump.cosAngle);
- }
-
- *data << uint32(self->m_movementInfo.jump.fallTime);
- *data << float(self->m_movementInfo.jump.zspeed);
- }
-
- *data << self->GetSpeed(MOVE_SWIM_BACK);
- if (hasSplineElevation)
- *data << float(self->m_movementInfo.splineElevation);
+ uint32 removeMovementForcesCount = 0;
+ *data << uint32(removeMovementForcesCount); // Count of RemoveForcesIDs
+ *data << uint32(0); // Unknown
- if (hasSpline)
- Movement::PacketBuilder::WriteCreateData(*self->movespline, *data);
+ //for (uint32 i = 0; i < removeMovementForcesCount; ++i)
+ // *data << ObjectGuid(RemoveForcesIDs);
- *data << float(self->GetPositionZMinusOffset());
- data->WriteByteSeq(guid[5]);
+ data->WriteBits(unit->GetUnitMovementFlags(), 30);
+ data->WriteBits(unit->GetExtraUnitMovementFlags(), 15);
+ data->WriteBit(!unit->m_movementInfo.transport.guid.IsEmpty()); // HasTransport
+ data->WriteBit(HasFall); // HasFall
+ data->WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement
+ data->WriteBit(0); // HeightChangeFailed
- if (!self->m_movementInfo.transport.guid.IsEmpty())
+ if (!unit->m_movementInfo.transport.guid.IsEmpty())
{
- ObjectGuid transGuid = self->m_movementInfo.transport.guid;
-
- data->WriteByteSeq(transGuid[5]);
- data->WriteByteSeq(transGuid[7]);
- *data << uint32(self->GetTransTime());
- *data << float(self->GetTransOffsetO());
- if (hasTransportTime2)
- *data << uint32(self->m_movementInfo.transport.time2);
-
- *data << float(self->GetTransOffsetY());
- *data << float(self->GetTransOffsetX());
- data->WriteByteSeq(transGuid[3]);
- *data << float(self->GetTransOffsetZ());
- data->WriteByteSeq(transGuid[0]);
- if (hasTransportTime3)
- *data << uint32(self->m_movementInfo.transport.time3);
-
- *data << int8(self->GetTransSeat());
- data->WriteByteSeq(transGuid[1]);
- data->WriteByteSeq(transGuid[6]);
- data->WriteByteSeq(transGuid[2]);
- data->WriteByteSeq(transGuid[4]);
+ *data << unit->m_movementInfo.transport.guid; // Transport Guid
+ *data << float(unit->GetTransOffsetX());
+ *data << float(unit->GetTransOffsetY());
+ *data << float(unit->GetTransOffsetZ());
+ *data << float(unit->GetTransOffsetO());
+ *data << int8(unit->m_movementInfo.transport.seat); // VehicleSeatIndex
+ *data << uint32(unit->m_movementInfo.transport.time); // MoveTime
+
+ data->WriteBit(unit->m_movementInfo.transport.prevTime != 0);
+ data->WriteBit(unit->m_movementInfo.transport.vehicleId != 0);
+
+ if (unit->m_movementInfo.transport.prevTime)
+ *data << uint32(unit->m_movementInfo.transport.prevTime); // PrevMoveTime
+
+ if (unit->m_movementInfo.transport.vehicleId)
+ *data << uint32(unit->m_movementInfo.transport.vehicleId); // VehicleRecID
}
- *data << float(self->GetPositionX());
- *data << self->GetSpeed(MOVE_PITCH_RATE);
- data->WriteByteSeq(guid[3]);
- data->WriteByteSeq(guid[0]);
- *data << self->GetSpeed(MOVE_SWIM);
- *data << float(self->GetPositionY());
- data->WriteByteSeq(guid[7]);
- data->WriteByteSeq(guid[1]);
- data->WriteByteSeq(guid[2]);
- *data << self->GetSpeed(MOVE_WALK);
+ if (HasFall)
+ {
+ *data << uint32(unit->m_movementInfo.jump.fallTime); // Time
+ *data << float(unit->m_movementInfo.jump.zspeed); // JumpVelocity
- //if (true) // Has time, controlled by bit just after HasTransport
- *data << uint32(getMSTime());
+ if (data->WriteBit(HasFallDirection))
+ {
+ *data << float(unit->m_movementInfo.jump.sinAngle); // Direction
+ *data << float(unit->m_movementInfo.jump.cosAngle);
+ *data << float(unit->m_movementInfo.jump.xyspeed); // Speed
+ }
+ }
- *data << self->GetSpeed(MOVE_TURN_RATE);
- data->WriteByteSeq(guid[6]);
- *data << self->GetSpeed(MOVE_FLIGHT);
- if (!G3D::fuzzyEq(self->GetOrientation(), 0.0f))
- *data << float(self->GetOrientation());
+ *data << float(unit->GetSpeed(MOVE_WALK));
+ *data << float(unit->GetSpeed(MOVE_RUN));
+ *data << float(unit->GetSpeed(MOVE_RUN_BACK));
+ *data << float(unit->GetSpeed(MOVE_SWIM));
+ *data << float(unit->GetSpeed(MOVE_SWIM_BACK));
+ *data << float(unit->GetSpeed(MOVE_FLIGHT));
+ *data << float(unit->GetSpeed(MOVE_FLIGHT_BACK));
+ *data << float(unit->GetSpeed(MOVE_TURN_RATE));
+ *data << float(unit->GetSpeed(MOVE_PITCH_RATE));
- *data << self->GetSpeed(MOVE_RUN);
- if (hasPitch)
- *data << float(self->m_movementInfo.pitch);
+ uint32 MovementForceCount = 0;
+ *data << uint32(MovementForceCount);
- *data << self->GetSpeed(MOVE_FLIGHT_BACK);
- }
+ //for (uint32 i = 0; i < MovementForceCount; ++i)
+ //{
+ // *data << ObjectGuid(ID);
+ // *data << Vector3(Direction);
+ // *data << int32(TransportID);
+ // *data << float(Magnitude);
+ // *data << uint8(Type);
+ //}
- if (flags & UPDATEFLAG_VEHICLE)
- {
- *data << float(self->GetOrientation());
- *data << uint32(self->GetVehicleKit()->GetVehicleInfo()->m_ID);
+ // HasMovementSpline - marks that spline data is present in packet
+ if (data->WriteBit(HasSpline))
+ Movement::PacketBuilder::WriteCreate(*unit->movespline, *data);
}
- if (flags & UPDATEFLAG_GO_TRANSPORT_POSITION)
+ if (HasMovementTransport)
{
WorldObject const* self = static_cast<WorldObject const*>(this);
- ObjectGuid transGuid = self->m_movementInfo.transport.guid;
-
- data->WriteBit(transGuid[0]);
- data->WriteBit(transGuid[5]);
- if (hasTransportTime3)
- *data << uint32(self->m_movementInfo.transport.time3);
-
- data->WriteBit(transGuid[3]);
+ *data << self->m_movementInfo.transport.guid; // Transport Guid
*data << float(self->GetTransOffsetX());
- data->WriteBit(transGuid[4]);
- data->WriteBit(transGuid[6]);
- data->WriteBit(transGuid[1]);
- *data << uint32(self->GetTransTime());
*data << float(self->GetTransOffsetY());
- data->WriteBit(transGuid[2]);
- data->WriteBit(transGuid[7]);
*data << float(self->GetTransOffsetZ());
- *data << int8(self->GetTransSeat());
*data << float(self->GetTransOffsetO());
- if (hasTransportTime2)
- *data << uint32(self->m_movementInfo.transport.time2);
- }
-
- if (flags & UPDATEFLAG_ROTATION)
- *data << uint64(ToGameObject()->GetRotation());
-
- if (flags & UPDATEFLAG_UNK5)
- {
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << uint8(0);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
- *data << float(0.0f);
+ *data << int8(self->m_movementInfo.transport.seat); // VehicleSeatIndex
+ *data << uint32(self->m_movementInfo.transport.time); // MoveTime
+
+ data->WriteBit(self->m_movementInfo.transport.prevTime != 0);
+ data->WriteBit(self->m_movementInfo.transport.vehicleId != 0);
+
+ if (self->m_movementInfo.transport.prevTime)
+ *data << uint32(self->m_movementInfo.transport.prevTime); // PrevMoveTime
+
+ if (self->m_movementInfo.transport.vehicleId)
+ *data << uint32(self->m_movementInfo.transport.vehicleId); // VehicleRecID
}
- if (flags & UPDATEFLAG_STATIONARY_POSITION)
+ if (Stationary)
{
WorldObject const* self = static_cast<WorldObject const*>(this);
- *data << float(self->GetStationaryO());
*data << float(self->GetStationaryX());
*data << float(self->GetStationaryY());
*data << float(self->GetStationaryZ());
+ *data << float(self->GetStationaryO());
}
- if (flags & UPDATEFLAG_HAS_TARGET)
- {
- ObjectGuid victimGuid = self->GetVictim()->GetGUID(); // checked in BuildCreateUpdateBlockForPlayer
- data->WriteByteSeq(victimGuid[4]);
- data->WriteByteSeq(victimGuid[0]);
- data->WriteByteSeq(victimGuid[3]);
- data->WriteByteSeq(victimGuid[5]);
- data->WriteByteSeq(victimGuid[7]);
- data->WriteByteSeq(victimGuid[6]);
- data->WriteByteSeq(victimGuid[2]);
- data->WriteByteSeq(victimGuid[1]);
- }
+ if (CombatVictim)
+ *data << ToUnit()->GetVictim()->GetGUID(); // CombatVictim
- if (flags & UPDATEFLAG_ANIMKITS)
- {
- Unit const* unit = ToUnit();
- if (unit->GetAIAnimKitId())
- *data << uint16(unit->GetAIAnimKitId());
- if (unit->GetMovementAnimKitId())
- *data << uint16(unit->GetMovementAnimKitId());
- if (unit->GetMeleeAnimKitId())
- *data << uint16(unit->GetMeleeAnimKitId());
- }
-
- if (flags & UPDATEFLAG_TRANSPORT)
+ if (ServerTime)
{
GameObject const* go = ToGameObject();
/** @TODO Use IsTransport() to also handle type 11 (TRANSPORT)
@@ -674,11 +526,267 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const
this causes clients to receive different PathProgress
resulting in players seeing the object in a different position
*/
- if (go && go->ToTransport())
+ if (go && go->ToTransport()) // ServerTime
*data << uint32(go->GetGOValue()->Transport.PathProgress);
else
*data << uint32(getMSTime());
}
+
+ if (VehicleCreate)
+ {
+ Unit const* unit = ToUnit();
+ *data << uint32(unit->GetVehicleKit()->GetVehicleInfo()->m_ID); // RecID
+ *data << float(unit->GetOrientation()); // InitialRawFacing
+ }
+
+ if (AnimKitCreate)
+ {
+ Unit const* unit = ToUnit();
+ *data << uint16(unit->GetAIAnimKitId()); // AiID
+ *data << uint16(unit->GetMovementAnimKitId()); // MovementID
+ *data << uint16(unit->GetMeleeAnimKitId()); // MeleeID
+ }
+
+ if (Rotation)
+ *data << uint64(ToGameObject()->GetRotation()); // Rotation
+
+ //if (AreaTrigger)
+ //{
+ // packet.ReadInt32("ElapsedMs", index);
+
+ // packet.ReadVector3("RollPitchYaw1", index);
+
+ // packet.ResetBitReader();
+
+ // var HasAbsoluteOrientation = packet.ReadBit("HasAbsoluteOrientation", index);
+ // var HasDynamicShape = packet.ReadBit("HasDynamicShape", index);
+ // var HasAttached = packet.ReadBit("HasAttached", index);
+ // var HasFaceMovementDir = packet.ReadBit("HasFaceMovementDir", index);
+ // var HasFollowsTerrain = packet.ReadBit("HasFollowsTerrain", index);
+ // var HasTargetRollPitchYaw = packet.ReadBit("HasTargetRollPitchYaw", index);
+ // var HasScaleCurveID = packet.ReadBit("HasScaleCurveID", index);
+ // var HasMorphCurveID = packet.ReadBit("HasMorphCurveID", index);
+ // var HasFacingCurveID = packet.ReadBit("HasFacingCurveID", index);
+ // var HasMoveCurveID = packet.ReadBit("HasMoveCurveID", index);
+ // var HasAreaTriggerSphere = packet.ReadBit("HasAreaTriggerSphere", index);
+ // var HasAreaTriggerBox = packet.ReadBit("HasAreaTriggerBox", index);
+ // var HasAreaTriggerPolygon = packet.ReadBit("HasAreaTriggerPolygon", index);
+ // var HasAreaTriggerCylinder = packet.ReadBit("HasAreaTriggerCylinder", index);
+ // var HasAreaTriggerSpline = packet.ReadBit("HasAreaTriggerSpline", index);
+
+ // if (HasTargetRollPitchYaw)
+ // packet.ReadVector3("TargetRollPitchYaw", index);
+
+ // if (HasScaleCurveID)
+ // packet.ReadInt32("ScaleCurveID, index");
+
+ // if (HasMorphCurveID)
+ // packet.ReadInt32("MorphCurveID", index);
+
+ // if (HasFacingCurveID)
+ // packet.ReadInt32("FacingCurveID", index);
+
+ // if (HasMoveCurveID)
+ // packet.ReadInt32("MoveCurveID", index);
+
+ // if (HasAreaTriggerSphere)
+ // {
+ // packet.ReadSingle("Radius", index);
+ // packet.ReadSingle("RadiusTarget", index);
+ // }
+
+ // if (HasAreaTriggerBox)
+ // {
+ // packet.ReadVector3("Extents", index);
+ // packet.ReadVector3("ExtentsTarget", index);
+ // }
+
+ // if (HasAreaTriggerPolygon)
+ // {
+ // var VerticesCount = packet.ReadInt32("VerticesCount", index);
+ // var VerticesTargetCount = packet.ReadInt32("VerticesTargetCount", index);
+ // packet.ReadSingle("Height", index);
+ // packet.ReadSingle("HeightTarget", index);
+
+ // for (var i = 0; i < VerticesCount; ++i)
+ // packet.ReadVector2("Vertices", index, i);
+
+ // for (var i = 0; i < VerticesTargetCount; ++i)
+ // packet.ReadVector2("VerticesTarget", index, i);
+ // }
+
+ // if (HasAreaTriggerCylinder)
+ // {
+ // packet.ReadSingle("Radius", index);
+ // packet.ReadSingle("RadiusTarget", index);
+ // packet.ReadSingle("Height", index);
+ // packet.ReadSingle("HeightTarget", index);
+ // packet.ReadSingle("Float4", index);
+ // packet.ReadSingle("Float5", index);
+ // }
+
+ // if (HasAreaTriggerSpline)
+ // {
+ // packet.ReadInt32("TimeToTarget", index);
+ // packet.ReadInt32("ElapsedTimeForMovement", index);
+ // var int8 = packet.ReadInt32("VerticesCount", index);
+
+ // for (var i = 0; i < int8; ++i)
+ // packet.ReadVector3("Points", index, i);
+ // }
+ //}
+
+ //if (GameObject)
+ //{
+ // packet.ReadInt32("WorldEffectID", index);
+
+ // packet.ResetBitReader();
+
+ // var bit8 = packet.ReadBit("bit8", index);
+ // if (bit8)
+ // packet.ReadInt32("Int1", index);
+ //}
+
+ //if (SceneObjCreate)
+ //{
+ // packet.ResetBitReader();
+
+ // var CliSceneLocalScriptData = packet.ReadBit("CliSceneLocalScriptData", index);
+ // var PetBattleFullUpdate = packet.ReadBit("PetBattleFullUpdate", index);
+
+ // if (CliSceneLocalScriptData)
+ // {
+ // packet.ResetBitReader();
+ // var DataLength = packet.ReadBits(7);
+ // packet.ReadWoWString("Data", DataLength, index);
+ // }
+
+ // if (PetBattleFullUpdate)
+ // {
+ // for (var i = 0; i < 2; ++i)
+ // {
+ // packet.ReadPackedGuid128("CharacterID", index, i);
+
+ // packet.ReadInt32("TrapAbilityID", index, i);
+ // packet.ReadInt32("TrapStatus", index, i);
+
+ // packet.ReadInt16("RoundTimeSecs", index, i);
+
+ // packet.ReadByte("FrontPet", index, i);
+ // packet.ReadByte("InputFlags", index, i);
+
+ // packet.ResetBitReader();
+
+ // var PetBattlePetUpdateCount = packet.ReadBits("PetBattlePetUpdateCount", 2, index, i);
+
+ // for (var j = 0; j < PetBattlePetUpdateCount; ++j)
+ // {
+ // packet.ReadPackedGuid128("BattlePetGUID", index, i, j);
+
+ // packet.ReadInt32("SpeciesID", index, i, j);
+ // packet.ReadInt32("DisplayID", index, i, j);
+ // packet.ReadInt32("CollarID", index, i, j);
+
+ // packet.ReadInt16("Level", index, i, j);
+ // packet.ReadInt16("Xp", index, i, j);
+
+
+ // packet.ReadInt32("CurHealth", index, i, j);
+ // packet.ReadInt32("MaxHealth", index, i, j);
+ // packet.ReadInt32("Power", index, i, j);
+ // packet.ReadInt32("Speed", index, i, j);
+ // packet.ReadInt32("NpcTeamMemberID", index, i, j);
+
+ // packet.ReadInt16("BreedQuality", index, i, j);
+ // packet.ReadInt16("StatusFlags", index, i, j);
+
+ // packet.ReadByte("Slot", index, i, j);
+
+ // var PetBattleActiveAbility = packet.ReadInt32("PetBattleActiveAbility", index, i, j);
+ // var PetBattleActiveAura = packet.ReadInt32("PetBattleActiveAura", index, i, j);
+ // var PetBattleActiveState = packet.ReadInt32("PetBattleActiveState", index, i, j);
+
+ // for (var k = 0; k < PetBattleActiveAbility; ++k)
+ // {
+ // packet.ReadInt32("AbilityID", index, i, j, k);
+ // packet.ReadInt16("CooldownRemaining", index, i, j, k);
+ // packet.ReadInt16("LockdownRemaining", index, i, j, k);
+ // packet.ReadByte("AbilityIndex", index, i, j, k);
+ // packet.ReadByte("Pboid", index, i, j, k);
+ // }
+
+ // for (var k = 0; k < PetBattleActiveAura; ++k)
+ // {
+ // packet.ReadInt32("AbilityID", index, i, j, k);
+ // packet.ReadInt32("InstanceID", index, i, j, k);
+ // packet.ReadInt32("RoundsRemaining", index, i, j, k);
+ // packet.ReadInt32("CurrentRound", index, i, j, k);
+ // packet.ReadByte("CasterPBOID", index, i, j, k);
+ // }
+
+ // for (var k = 0; k < PetBattleActiveState; ++k)
+ // {
+ // packet.ReadInt32("StateID", index, i, j, k);
+ // packet.ReadInt32("StateValue", index, i, j, k);
+ // }
+
+ // packet.ResetBitReader();
+ // var bits57 = packet.ReadBits(7);
+ // packet.ReadWoWString("CustomName", bits57, index, i, j);
+ // }
+ // }
+
+ // for (var i = 0; i < 3; ++i)
+ // {
+ // var PetBattleActiveAura = packet.ReadInt32("PetBattleActiveAura", index, i);
+ // var PetBattleActiveState = packet.ReadInt32("PetBattleActiveState", index, i);
+
+ // for (var j = 0; j < PetBattleActiveAura; ++j)
+ // {
+ // packet.ReadInt32("AbilityID", index, i, j);
+ // packet.ReadInt32("InstanceID", index, i, j);
+ // packet.ReadInt32("RoundsRemaining", index, i, j);
+ // packet.ReadInt32("CurrentRound", index, i, j);
+ // packet.ReadByte("CasterPBOID", index, i, j);
+ // }
+
+ // for (var j = 0; j < PetBattleActiveState; ++j)
+ // {
+ // packet.ReadInt32("StateID", index, i, j);
+ // packet.ReadInt32("StateValue", index, i, j);
+ // }
+ // }
+
+ // packet.ReadInt16("WaitingForFrontPetsMaxSecs", index);
+ // packet.ReadInt16("PvpMaxRoundTime", index);
+
+ // packet.ReadInt32("CurRound", index);
+ // packet.ReadInt32("NpcCreatureID", index);
+ // packet.ReadInt32("NpcDisplayID", index);
+
+ // packet.ReadByte("CurPetBattleState");
+ // packet.ReadByte("ForfeitPenalty");
+
+ // packet.ReadPackedGuid128("InitialWildPetGUID");
+
+ // packet.ReadBit("IsPVP");
+ // packet.ReadBit("CanAwardXP");
+ // }
+ //}
+
+ //if (ScenePendingInstances)
+ //{
+ // var SceneInstanceIDs = packet.ReadInt32("SceneInstanceIDsCount");
+
+ // for (var i = 0; i < SceneInstanceIDs; ++i)
+ // packet.ReadInt32("SceneInstanceIDs", index, i);
+ //}
+
+ if (GameObject const* go = ToGameObject())
+ for (uint32 i = 0; i < PauseTimesCount; ++i)
+ *data << uint32(go->GetGOValue()->Transport.StopFrames->at(i));
+
+ data->FlushBits();
}
void Object::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) const
@@ -1442,9 +1550,9 @@ void MovementInfo::OutDebug()
TC_LOG_INFO("misc", "seat: %i", transport.seat);
TC_LOG_INFO("misc", "time: %u", transport.time);
if (flags2 & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT)
- TC_LOG_INFO("misc", "time2: %u", transport.time2);
- if (transport.time3)
- TC_LOG_INFO("misc", "time3: %u", transport.time3);
+ TC_LOG_INFO("misc", "prevTime: %u", transport.prevTime);
+ if (transport.vehicleId)
+ TC_LOG_INFO("misc", "vehicleId: %u", transport.vehicleId);
}
if ((flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index b989aca0b17..bae3a8b07c1 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -218,14 +218,14 @@ class Object
uint32 GetUpdateFieldData(Player const* target, uint32*& flags) const;
uint32 GetDynamicUpdateFieldData(Player const* target, uint32*& flags) const;
- void BuildMovementUpdate(ByteBuffer* data, uint16 flags) const;
+ void BuildMovementUpdate(ByteBuffer* data, uint32 flags) const;
virtual void BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, Player* target) const;
virtual void BuildDynamicValuesUpdate(uint8 updatetype, ByteBuffer* data, Player* target) const;
uint16 m_objectType;
TypeID m_objectTypeId;
- uint16 m_updateFlag;
+ uint32 m_updateFlag;
union
{
@@ -411,16 +411,16 @@ struct MovementInfo
pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f);
seat = -1;
time = 0;
- time2 = 0;
- time3 = 0;
+ prevTime = 0;
+ vehicleId = 0;
}
ObjectGuid guid;
Position pos;
int8 seat;
uint32 time;
- uint32 time2;
- uint32 time3;
+ uint32 prevTime;
+ uint32 vehicleId;
} transport;
// swimming/flying
diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp
index 126916c4364..f59c82d44f5 100644
--- a/src/server/game/Entities/Object/ObjectGuid.cpp
+++ b/src/server/game/Entities/Object/ObjectGuid.cpp
@@ -107,6 +107,7 @@ void PackedGuid::Set(ObjectGuid const& guid)
{
uint8 lowMask = 0;
uint8 highMask = 0;
+ _packedGuid.clear();
_packedGuid << uint8(lowMask);
_packedGuid << uint8(highMask);
diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h
index 247982a2837..378428e3ce5 100644
--- a/src/server/game/Entities/Object/ObjectGuid.h
+++ b/src/server/game/Entities/Object/ObjectGuid.h
@@ -46,13 +46,15 @@ enum TypeMask
{
TYPEMASK_OBJECT = 0x0001,
TYPEMASK_ITEM = 0x0002,
- TYPEMASK_CONTAINER = 0x0006, // TYPEMASK_ITEM | 0x0004
- TYPEMASK_UNIT = 0x0008, // creature
+ TYPEMASK_CONTAINER = 0x0004,
+ TYPEMASK_UNIT = 0x0008,
TYPEMASK_PLAYER = 0x0010,
TYPEMASK_GAMEOBJECT = 0x0020,
TYPEMASK_DYNAMICOBJECT = 0x0040,
TYPEMASK_CORPSE = 0x0080,
TYPEMASK_AREATRIGGER = 0x0100,
+ TYPEMASK_SCENEOBJECT = 0x0200,
+ TYPEMASK_CONVERSATION = 0x0400,
TYPEMASK_SEER = TYPEMASK_PLAYER | TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT
};
diff --git a/src/server/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp
index db911dfa267..df7f6fdcc77 100644
--- a/src/server/game/Entities/Object/Updates/UpdateData.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp
@@ -47,18 +47,19 @@ bool UpdateData::BuildPacket(WorldPacket* packet)
ASSERT(packet->empty()); // shouldn't happen
packet->Initialize(SMSG_UPDATE_OBJECT, 2 + 4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos());
+ *packet << uint32(m_blockCount);
*packet << uint16(m_map);
- *packet << uint32(m_blockCount + (m_outOfRangeGUIDs.empty() ? 0 : 1));
-
- if (!m_outOfRangeGUIDs.empty())
+
+ if (packet->WriteBit(!m_outOfRangeGUIDs.empty()))
{
- *packet << uint8(UPDATETYPE_OUT_OF_RANGE_OBJECTS);
+ *packet << uint16(0);
*packet << uint32(m_outOfRangeGUIDs.size());
for (GuidSet::const_iterator i = m_outOfRangeGUIDs.begin(); i != m_outOfRangeGUIDs.end(); ++i)
*packet << i->WriteAsPacked();
}
+ *packet << uint32(m_data.size());
packet->append(m_data);
return true;
}
diff --git a/src/server/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h
index 82958229ea0..2ee0adba299 100644
--- a/src/server/game/Entities/Object/Updates/UpdateData.h
+++ b/src/server/game/Entities/Object/Updates/UpdateData.h
@@ -39,17 +39,21 @@ enum OBJECT_UPDATE_FLAGS
UPDATEFLAG_SELF = 0x0001,
UPDATEFLAG_TRANSPORT = 0x0002,
UPDATEFLAG_HAS_TARGET = 0x0004,
- UPDATEFLAG_UNKNOWN = 0x0008,
- UPDATEFLAG_LOWGUID = 0x0010,
- UPDATEFLAG_LIVING = 0x0020,
- UPDATEFLAG_STATIONARY_POSITION = 0x0040,
- UPDATEFLAG_VEHICLE = 0x0080,
- UPDATEFLAG_GO_TRANSPORT_POSITION = 0x0100,
- UPDATEFLAG_ROTATION = 0x0200,
- UPDATEFLAG_UNK3 = 0x0400,
- UPDATEFLAG_ANIMKITS = 0x0800,
- UPDATEFLAG_UNK5 = 0x1000,
- UPDATEFLAG_UNK6 = 0x2000,
+ UPDATEFLAG_LIVING = 0x0008,
+ UPDATEFLAG_STATIONARY_POSITION = 0x0010,
+ UPDATEFLAG_VEHICLE = 0x0020,
+ UPDATEFLAG_GO_TRANSPORT_POSITION = 0x0040,
+ UPDATEFLAG_ROTATION = 0x0080,
+ UPDATEFLAG_ANIMKITS = 0x0100,
+ //UPDATEFLAG_AREATRIGGER = 0x0200,
+ //UPDATEFLAG_GAMEOBJECT = 0x0400,
+ //UPDATEFLAG_REPLACE_ACTIVE = 0x0800,
+ //UPDATEFLAG_NO_BIRTH_ANIM = 0x1000,
+ //UPDATEFLAG_ENABLE_PORTALS = 0x2000,
+ //UPDATEFLAG_PLAY_HOVER_ANIM = 0x4000,
+ //UPDATEFLAG_IS_SUPPRESSING_GREETINGS = 0x8000
+ //UPDATEFLAG_SCENEOBJECT = 0x10000,
+ //UPDATEFLAG_SCENE_PENDING_INSTANCE = 0x20000
};
class UpdateData