aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp40
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h8
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp22
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.h5
-rwxr-xr-xsrc/server/game/Server/WorldSession.cpp16
5 files changed, 67 insertions, 24 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index db91eac7052..58cf20ee525 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -417,22 +417,24 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 M
void Unit::SendMonsterMoveTransport(Unit *vehicleOwner)
{
+ // TODO: Turn into BuildMonsterMoveTransport packet and allow certain variables (for npc movement aboard vehicles)
WorldPacket data(SMSG_MONSTER_MOVE_TRANSPORT, GetPackGUID().size()+vehicleOwner->GetPackGUID().size());
data.append(GetPackGUID());
data.append(vehicleOwner->GetPackGUID());
data << int8(GetTransSeat());
- data << uint8(0);
+ data << uint8(0); // unk boolean
data << GetPositionX() - vehicleOwner->GetPositionX();
data << GetPositionY() - vehicleOwner->GetPositionY();
data << GetPositionZ() - vehicleOwner->GetPositionZ();
- data << uint32(getMSTime());
- data << uint8(4);
- data << GetTransOffsetO();
+ data << uint32(100); // should be an increasing constant that indicates movement packet count
+ data << uint8(SPLINETYPE_FACING_ANGLE);
+ data << GetTransOffsetO(); // facing angle?
data << uint32(SPLINEFLAG_TRANSPORT);
- data << uint32(0);// move time
- data << uint32(0);//GetTransOffsetX();
- data << uint32(0);//GetTransOffsetY();
- data << uint32(0);//GetTransOffsetZ();
+ data << uint32(0); // move time
+ data << uint32(1);
+ data << uint32(GetTransOffsetX());
+ data << uint32(GetTransOffsetY());
+ data << uint32(GetTransOffsetZ());
SendMessageToSet(&data, true);
}
@@ -16610,16 +16612,20 @@ void Unit::EnterVehicle(Vehicle *vehicle, int8 seatId, bool byAura)
return;
}
+ if (Player* thisPlr = this->ToPlayer())
+ {
+ WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0);
+ thisPlr->GetSession()->SendPacket(&data);
+
+ data.Initialize(SMSG_BREAK_TARGET, 7);
+ data.append(vehicle->GetBase()->GetPackGUID());
+ thisPlr->GetSession()->SendPacket(&data);
+ }
+
SetControlled(true, UNIT_STAT_ROOT);
//movementInfo is set in AddPassenger
//packets are sent in AddPassenger
- if (GetTypeId() == TYPEID_PLAYER)
- {
- //this->ToPlayer()->SetClientControl(vehicle, 1);
- WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0);
- this->ToPlayer()->GetSession()->SendPacket(&data);
- }
}
void Unit::ChangeSeat(int8 seatId, bool next, bool byAura)
@@ -16700,6 +16706,8 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const
case TYPEID_UNIT:
if (canFly())
const_cast<Unit*>(this)->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
+ if (IsVehicle())
+ const_cast<Unit*>(this)->AddExtraUnitMovementFlag(GetVehicleKit()->GetExtraMovementFlagsForBase());
break;
case TYPEID_PLAYER:
// remove unknown, unused etc flags for now
@@ -16714,6 +16722,10 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const
break;
}
+ if (GetVehicle())
+ if (!this->HasUnitMovementFlag(MOVEMENTFLAG_ROOT))
+ sLog->outError("Unit does not have MOVEMENTFLAG_ROOT but is in vehicle!");
+
*data << uint32(GetUnitMovementFlags()); // movement flags
*data << uint16(m_movementInfo.flags2); // 2.3.0
*data << uint32(getMSTime()); // time
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 5c75327b603..3c9de3197ce 100755
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -675,7 +675,7 @@ enum MovementFlags2
MOVEMENTFLAG2_NONE = 0x00000000,
MOVEMENTFLAG2_NO_STRAFE = 0x00000001,
MOVEMENTFLAG2_NO_JUMPING = 0x00000002,
- MOVEMENTFLAG2_UNK3 = 0x00000004,
+ MOVEMENTFLAG2_UNK3 = 0x00000004, // Overrides various clientside checks
MOVEMENTFLAG2_FULL_SPEED_TURNING = 0x00000008,
MOVEMENTFLAG2_FULL_SPEED_PITCHING = 0x00000010,
MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING = 0x00000020,
@@ -1949,6 +1949,12 @@ class Unit : public WorldObject
uint32 GetUnitMovementFlags() const { return m_movementInfo.flags; }
void SetUnitMovementFlags(uint32 f) { m_movementInfo.flags = f; }
+ void AddExtraUnitMovementFlag(uint16 f) { m_movementInfo.flags2 |= f; }
+ void RemoveExtraUnitMovementFlag(uint16 f) { m_movementInfo.flags2 &= ~f; }
+ uint16 HasExtraUnitMovementFlag(uint16 f) const { return m_movementInfo.flags2 & f; }
+ uint16 GetExtraUnitMovementFlags() const { return m_movementInfo.flags2; }
+ void SetExtraUnitMovementFlags(uint16 f) { m_movementInfo.flags2 = f; }
+
void SetControlled(bool apply, UnitState state);
void AddComboPointHolder(uint32 lowguid) { m_ComboPointHolders.insert(lowguid); }
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index 64c8a0826dd..56717483f8a 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -317,7 +317,7 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatId, bool byAura)
if (seat->second.seatInfo->m_flags && !(seat->second.seatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK11))
unit->AddUnitState(UNIT_STAT_ONVEHICLE);
- unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
+ unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_ROOT);
VehicleSeatEntry const *veSeat = seat->second.seatInfo;
unit->m_movementInfo.t_pos.m_positionX = veSeat->m_attachmentOffsetX;
unit->m_movementInfo.t_pos.m_positionY = veSeat->m_attachmentOffsetY;
@@ -449,3 +449,23 @@ void Vehicle::Dismiss()
me->CombatStop();
me->AddObjectToRemoveList();
}
+
+uint16 Vehicle::GetExtraMovementFlagsForBase() const
+{
+ uint16 movementMask = MOVEMENTFLAG2_NONE;
+ uint32 vehicleFlags = GetVehicleInfo()->m_flags;
+
+ if (vehicleFlags & VEHICLE_FLAG_NO_STRAFE)
+ movementMask |= MOVEMENTFLAG2_NO_STRAFE;
+ if (vehicleFlags & VEHICLE_FLAG_NO_JUMPING)
+ movementMask |= MOVEMENTFLAG2_NO_JUMPING;
+ if (vehicleFlags & VEHICLE_FLAG_FULLSPEEDTURNING)
+ movementMask |= MOVEMENTFLAG2_FULL_SPEED_TURNING;
+ if (vehicleFlags & VEHICLE_FLAG_ALLOW_PITCHING)
+ movementMask |= MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING;
+ if (vehicleFlags & VEHICLE_FLAG_FULLSPEEDPITCHING)
+ movementMask |= MOVEMENTFLAG2_FULL_SPEED_PITCHING;
+
+ sLog->outDebug("Vehicle::GetExtraMovementFlagsForBase() returned %u", movementMask);
+ return movementMask;
+} \ No newline at end of file
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index 5ac3458257d..5063d3e4765 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -101,6 +101,8 @@ typedef std::map<int8, VehicleSeat> SeatMap;
class Vehicle
{
+ friend class Unit;
+
public:
explicit Vehicle(Unit *unit, VehicleEntry const *vehInfo);
virtual ~Vehicle();
@@ -127,6 +129,9 @@ class Vehicle
SeatMap m_Seats;
protected:
+ uint16 GetExtraMovementFlagsForBase() const;
+
+ protected:
Unit *me;
VehicleEntry const *m_vehicleInfo;
uint32 m_usableSeatNum; // Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 7b4db102fd5..1437ae403f5 100755
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -753,7 +753,7 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
data >> mi->time;
data >> mi->pos.PositionXYZOStream();
- if (mi->flags & MOVEMENTFLAG_ONTRANSPORT)
+ if (mi->HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
{
data.readPackGUID(mi->t_guid);
@@ -761,24 +761,24 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
data >> mi->t_time;
data >> mi->t_seat;
- if (mi->flags2 & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT)
+ if (mi->HasExtraMovementFlag(MOVEMENTFLAG2_INTERPOLATED_MOVEMENT))
{
data >> mi->t_time2;
}
- if(mi->pos.m_positionX != mi->t_pos.m_positionX)
- if(GetPlayer()->GetTransport())
+ if (mi->pos.m_positionX != mi->t_pos.m_positionX)
+ if (GetPlayer()->GetTransport())
GetPlayer()->GetTransport()->UpdatePosition(mi);
}
- if ((mi->flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (mi->flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))
+ if (mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (mi->HasExtraMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)))
{
data >> mi->pitch;
}
data >> mi->fallTime;
- if (mi->flags & MOVEMENTFLAG_JUMPING)
+ if (mi->HasMovementFlag(MOVEMENTFLAG_JUMPING))
{
data >> mi->j_zspeed;
data >> mi->j_sinAngle;
@@ -786,7 +786,7 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
data >> mi->j_xyspeed;
}
- if (mi->flags & MOVEMENTFLAG_SPLINE_ELEVATION)
+ if (mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION))
{
data >> mi->splineElevation;
}
@@ -810,7 +810,7 @@ void WorldSession::WriteMovementInfo(WorldPacket *data, MovementInfo *mi)
*data << mi->t_seat;
}
- if ((mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING))) || (mi->flags & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))
+ if (mi->HasMovementFlag(MovementFlags(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) && mi->HasExtraMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))
{
*data << mi->pitch;
}