diff options
| -rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 40 | ||||
| -rwxr-xr-x | src/server/game/Entities/Unit/Unit.h | 8 | ||||
| -rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.cpp | 22 | ||||
| -rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.h | 5 | ||||
| -rwxr-xr-x | src/server/game/Server/WorldSession.cpp | 16 |
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; } |
