diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/MovementHandler.cpp | 29 | ||||
-rw-r--r-- | src/game/Object.cpp | 9 | ||||
-rw-r--r-- | src/game/Unit.cpp | 2 | ||||
-rw-r--r-- | src/game/Vehicle.cpp | 32 | ||||
-rw-r--r-- | src/game/Vehicle.h | 1 |
5 files changed, 52 insertions, 21 deletions
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index cf312ad3513..d018adb7e2e 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -261,6 +261,9 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) } } } + + if(!mover->GetTransport() || !mover->m_Vehicle) + movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT; } else if (plMover && plMover->m_transport) // if we were on a transport, leave { @@ -293,11 +296,12 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) data.append(recv_data.contents(), recv_data.size()); GetPlayer()->SendMessageToSet(&data, false); + mover->m_movementInfo = movementInfo; + mover->SetUnitMovementFlags(movementInfo.flags); + if(plMover) // nothing is charmed, or player charmed { plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); - plMover->m_movementInfo = movementInfo; - plMover->SetUnitMovementFlags(movementInfo.flags); plMover->UpdateFallInformationIfNeed(movementInfo,recv_data.GetOpcode()); if(plMover->isMovingOrTurning()) @@ -493,20 +497,29 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data) if(!recv_data.readPackGUID(guid)) return; - Vehicle *vehicle = ObjectAccessor::GetVehicle(guid); + Vehicle *vehicle = guid ? ObjectAccessor::GetVehicle(guid) : GetPlayer()->m_Vehicle; if(!vehicle) return; int8 seatNum; recv_data >> seatNum; - if(vehicle == GetPlayer()->m_Vehicle && seatNum == GetPlayer()->GetTransSeat()) - return; - - if(!vehicle->HasEmptySeat(seatNum)) + if(!guid) + { + seatNum = vehicle->GetNextEmptySeat(GetPlayer()->GetTransSeat(), seatNum > 0); + if(seatNum < 0) + return; + } + else if(!vehicle->HasEmptySeat(seatNum)) return; GetPlayer()->m_Vehicle->RemovePassenger(GetPlayer()); - GetPlayer()->m_Vehicle = vehicle; + if(GetPlayer()->m_Vehicle != vehicle) + { + GetPlayer()->m_Vehicle = vehicle; + GetPlayer()->SetClientControl(vehicle, 1); + WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0); + GetPlayer()->GetSession()->SendPacket(&data); + } if(!vehicle->AddPassenger(GetPlayer(), seatNum)) assert(false); } diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 0739f89db2c..0575ef6623a 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -270,10 +270,6 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const { case TYPEID_UNIT: { - if(((Unit*)this)->m_Vehicle) - flags2 |= MOVEMENTFLAG_ONTRANSPORT; - else - flags2 &= ~MOVEMENTFLAG_ONTRANSPORT; flags2 &= ~MOVEMENTFLAG_SPLINE2; if(((Creature*)this)->isVehicle()) ((Unit*)this)->m_movementInfo.unk1 |= 0x20; // always allow pitch @@ -281,11 +277,6 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags) const break; case TYPEID_PLAYER: { - if(((Player*)this)->GetTransport() || ((Player*)this)->m_Vehicle) - flags2 |= MOVEMENTFLAG_ONTRANSPORT; - else - flags2 &= ~MOVEMENTFLAG_ONTRANSPORT; - // remove unknown, unused etc flags for now flags2 &= ~MOVEMENTFLAG_SPLINE2; // will be set manually diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 887ef6993df..832e2e6fff4 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -13546,7 +13546,7 @@ void Unit::BuildMovementPacket(ByteBuffer *data) const else if(GetTransport()) *data << (uint64)GetTransport()->GetGUID(); else - *data << (uint64)0; + *data << (uint64)0; //This will cause client crash *data << float (GetTransOffsetX()); *data << float (GetTransOffsetY()); *data << float (GetTransOffsetZ()); diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp index a788bec1c48..f2d023300fe 100644 --- a/src/game/Vehicle.cpp +++ b/src/game/Vehicle.cpp @@ -45,6 +45,7 @@ void Vehicle::AddToWorld() AIM_Initialize(); switch(GetEntry()) { + case 27850:InstallAccessory(27905,1);break; case 28312:InstallAccessory(28319,7);break; case 32627:InstallAccessory(32629,7);break; } @@ -154,6 +155,30 @@ bool Vehicle::HasEmptySeat(int8 seatNum) const return !seat->second.passenger; } +int8 Vehicle::GetNextEmptySeat(int8 seatNum, bool next) const +{ + SeatMap::const_iterator seat = m_Seats.find(seatNum); + if(seat == m_Seats.end()) return -1; + while(seat->second.passenger) + { + if(next) + { + ++seat; + if(seat == m_Seats.end()) + seat = m_Seats.begin(); + } + else + { + if(seat == m_Seats.begin()) + seat = m_Seats.end(); + --seat; + } + if(seat->first == seatNum) + return -1; + } + return seat->first; +} + void Vehicle::InstallAccessory(uint32 entry, int8 seatNum) { //Creature *accessory = SummonCreature(entry, GetPositionX(), GetPositionY(), GetPositionZ()); @@ -197,12 +222,13 @@ bool Vehicle::AddPassenger(Unit *unit, int8 seatNum) seat->second.passenger = unit; //RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + //SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24); unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); VehicleSeatEntry const *veSeat = seat->second.seatInfo; - unit->m_movementInfo.t_x = 0;//veSeat->m_attachmentOffsetX; - unit->m_movementInfo.t_y = 0;//veSeat->m_attachmentOffsetY; - unit->m_movementInfo.t_z = 0;//veSeat->m_attachmentOffsetZ; + unit->m_movementInfo.t_x = veSeat->m_attachmentOffsetX; + unit->m_movementInfo.t_y = veSeat->m_attachmentOffsetY; + unit->m_movementInfo.t_z = veSeat->m_attachmentOffsetZ; unit->m_movementInfo.t_o = 0; unit->m_movementInfo.t_time = 4; unit->m_movementInfo.t_seat = seat->first; diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h index 0b134348454..3e1118f4685 100644 --- a/src/game/Vehicle.h +++ b/src/game/Vehicle.h @@ -53,6 +53,7 @@ class Vehicle : public Creature void SetVehicleId(uint32 vehicleid); bool HasEmptySeat(int8 seatNum) const; + int8 GetNextEmptySeat(int8 seatNum, bool next) const; bool AddPassenger(Unit *passenger, int8 seatNum = -1); void RemovePassenger(Unit *passenger); void InstallAccessory(uint32 entry, int8 seatNum); |