From 948a2136c439c7cbc2a75c2e642bead75e2c80c8 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Thu, 30 Dec 2010 19:10:46 +0100 Subject: Core/Vehicles: - Redefine VEHICLE_SEAT_FLAG_USABLE as VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT. This flag determines whether or not the player has control over entering/exiting a vehicleseat. Thanks to linencloth for help with research. - Implement VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT exit restriction - Remove MOVEMENTFLAG_ROOT on vehicle exit --- .../Server/Protocol/Handlers/MovementHandler.cpp | 25 ++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'src/server/game/Server') diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp index 25cfed8e3f1..0cd943ef9e7 100755 --- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp @@ -631,7 +631,11 @@ void WorldSession::HandleEjectPassenger(WorldPacket &data) if (IS_PLAYER_GUID(guid)) { if (Player *plr = ObjectAccessor::FindPlayer(guid)) - vehicle->EjectPassenger(plr, GetPlayer()); + { + VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(plr); + if (seat->IsEjectable()) + plr->ExitVehicle(); + } 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)); } @@ -640,8 +644,12 @@ void WorldSession::HandleEjectPassenger(WorldPacket &data) { if (Unit *unit = ObjectAccessor::GetUnit(*_player, guid)) // creatures can be ejected too from player mounts { - vehicle->EjectPassenger(unit, GetPlayer()); - unit->ToCreature()->ForcedDespawn(1000); + VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(unit); + if (seat->IsEjectable()) + { + unit->ExitVehicle(); + unit->ToCreature()->ForcedDespawn(1000); + } } 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)); @@ -657,7 +665,16 @@ void WorldSession::HandleRequestVehicleExit(WorldPacket &recv_data) { sLog->outDebug("WORLD: Recvd CMSG_REQUEST_VEHICLE_EXIT"); recv_data.hexlike(); - GetPlayer()->ExitVehicle(); + + if (Vehicle* vehicle = GetPlayer()->GetVehicle()) + { + if (VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(GetPlayer())) + if (seat->CanEnterOrExit()) + GetPlayer()->ExitVehicle(); + else + sLog->outError("Player %u tried to exit vehicle, but seatflags %u (ID: %u) don't permit that.", + GetPlayer()->GetGUIDLow(), seat->m_ID, seat->m_flags); + } } void WorldSession::HandleMountSpecialAnimOpcode(WorldPacket& /*recv_data*/) -- cgit v1.2.3