diff options
| author | Machiavelli <machiavelli.trinity@gmail.com> | 2010-12-30 19:57:50 +0100 |
|---|---|---|
| committer | Machiavelli <machiavelli.trinity@gmail.com> | 2010-12-30 19:57:50 +0100 |
| commit | 11cc3eac7a9d19778f070c130facd4ee471d8169 (patch) | |
| tree | e607af02aa50ecbcf695a9890f63a9ba590694bb | |
| parent | 6c56f9e1b70ded755e651991740890fcc5ba3e99 (diff) | |
Core/Vehicles: Implement VEHICLE_SEAT_FLAG_B_CANSWITCH restriction, and do some cleanup.
| -rwxr-xr-x | src/server/game/DataStores/DBCStructure.h | 1 | ||||
| -rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.cpp | 11 | ||||
| -rwxr-xr-x | src/server/game/Server/Protocol/Handlers/MovementHandler.cpp | 12 |
3 files changed, 13 insertions, 11 deletions
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 40d68a3ea3f..7f00ec85f48 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1848,6 +1848,7 @@ struct VehicleSeatEntry // 46-57 added in 3.1, floats mostly bool CanEnterOrExit() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT; } + bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_B_CANSWITCH; } bool IsUsableByAura() const { return m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3); } bool IsEjectable() const { return m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE; } }; diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 8a60d5e7562..b28717250dd 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -423,17 +423,6 @@ void Vehicle::RemovePassenger(Unit *unit) sScriptMgr->OnRemovePassenger(this, unit); } -void Vehicle::EjectPassenger(Unit* passenger, Unit* controller) -{ - SeatMap::const_iterator m_SeatsItr; - for (m_SeatsItr = m_Seats.begin(); m_SeatsItr != m_Seats.end(); ++m_SeatsItr) - if (m_SeatsItr->second.passenger == passenger) - if (m_SeatsItr->second.seatInfo->IsEjectable()) - return passenger->ExitVehicle(); - else - sLog->outError("Player %u attempted to eject unit GUID "UI64FMTD" from non-ejectable seat.", controller->GetGUIDLow(), passenger->GetGUID()); -} - void Vehicle::RelocatePassengers(float x, float y, float z, float ang) { Map *map = me->GetMap(); diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp index 0cd943ef9e7..675286e538f 100755 --- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp @@ -548,6 +548,14 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data) if (!vehicle_base) return; + VehicleSeatEntry const* seat = GetPlayer()->GetVehicle()->GetSeatForPassenger(GetPlayer()); + if (!seat->CanSwitchFromSeat()) + { + sLog->outError("HandleChangeSeatsOnControlledVehicle, Opcode: %u, Player %u tried to switch seats but current seatflags %u don't permit that.", + recv_data.GetOpcode(), GetPlayer()->GetGUIDLow(), seat->m_flags); + return; + } + switch (recv_data.GetOpcode()) { case CMSG_REQUEST_VEHICLE_PREV_SEAT: @@ -635,6 +643,8 @@ void WorldSession::HandleEjectPassenger(WorldPacket &data) VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(plr); if (seat->IsEjectable()) plr->ExitVehicle(); + else + sLog->outError("Player %u attempted to eject player %u from non-ejectable seat.", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid)); } else sLog->outError("Player %u tried to eject player %u from vehicle, but the latter was not found in world!", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid)); @@ -650,6 +660,8 @@ void WorldSession::HandleEjectPassenger(WorldPacket &data) unit->ExitVehicle(); unit->ToCreature()->ForcedDespawn(1000); } + else + sLog->outError("Player %u attempted to eject creature GUID "UI64FMTD" from non-ejectable seat.", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid)); } else sLog->outError("Player %u tried to eject creature guid %u from vehicle, but the latter was not found in world!", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid)); |
