void TransportKit::RemovePassenger(WorldObject* passenger) { UnBoardPassenger(passenger); DETAIL_FILTER_LOG(LOG_FILTER_TRANSPORT_MOVES,"Transport::RemovePassenger %s unboarded from %s.", passenger->GetObjectGuid().GetString().c_str(), GetBase()->GetObjectGuid().GetString().c_str()); }
/** * This function will Unboard a passenger * * @param passenger MUST be provided. This Unit will be unboarded from the vehicle * @param changeVehicle If set, the passenger is expected to be directly boarded to another vehicle, * and hence he will not be unboarded but only removed from this vehicle. */ void VehicleInfo::UnBoard(Unit* passenger, bool changeVehicle) { MANGOS_ASSERT(passenger); DEBUG_LOG("VehicleInfo::Unboard: passenger: %s", passenger->GetGuidStr().c_str()); PassengerMap::const_iterator itr = m_passengers.find(passenger); MANGOS_ASSERT(itr != m_passengers.end()); VehicleSeatEntry const* seatEntry = GetSeatEntry(itr->second->GetTransportSeat()); MANGOS_ASSERT(seatEntry); UnBoardPassenger(passenger); // Use TransportBase to remove the passenger from storage list if (!changeVehicle) // Send expected unboarding packages { // Update movementInfo passenger->m_movementInfo.RemoveMovementFlag(MOVEFLAG_ONTRANSPORT); passenger->m_movementInfo.ClearTransportData(); if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* pPlayer = (Player*)passenger; pPlayer->ResummonPetTemporaryUnSummonedIfAny(); // SMSG_PET_DISMISS_SOUND (?) } if (passenger->IsRooted()) passenger->SetRoot(false); Movement::MoveSplineInit init(*passenger); // ToDo: Set proper unboard coordinates init.MoveTo(m_owner->GetPositionX(), m_owner->GetPositionY(), m_owner->GetPositionZ()); init.SetExitVehicle(); init.Launch(); } // Remove passenger modifications RemoveSeatMods(passenger, seatEntry->m_flags); }
/** * This function will Unboard a passenger * * @param passenger MUST be provided. This Unit will be unboarded from the vehicle * @param changeVehicle If set, the passenger is expected to be directly boarded to another vehicle, * and hence he will not be unboarded but only removed from this vehicle. */ void VehicleInfo::UnBoard(Unit* passenger, bool changeVehicle) { MANGOS_ASSERT(passenger); DEBUG_LOG("VehicleInfo::Unboard: passenger: %s", passenger->GetGuidStr().c_str()); PassengerMap::const_iterator itr = m_passengers.find(passenger); MANGOS_ASSERT(itr != m_passengers.end()); VehicleSeatEntry const* seatEntry = GetSeatEntry(itr->second->GetTransportSeat()); MANGOS_ASSERT(seatEntry); UnBoardPassenger(passenger); // Use TransportBase to remove the passenger from storage list if (!changeVehicle) // Send expected unboarding packages { // Update movementInfo passenger->m_movementInfo.ClearTransportData(); if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* pPlayer = (Player*)passenger; pPlayer->ResummonPetTemporaryUnSummonedIfAny(); // SMSG_PET_DISMISS_SOUND (?) } if (passenger->IsRooted()) passenger->SetRoot(false); Movement::MoveSplineInit init(*passenger); // ToDo: Set proper unboard coordinates init.MoveTo(m_owner->GetPositionX(), m_owner->GetPositionY(), m_owner->GetPositionZ()); init.SetExitVehicle(); init.Launch(); // Despawn if passenger was accessory if (passenger->GetTypeId() == TYPEID_UNIT && m_accessoryGuids.find(passenger->GetObjectGuid()) != m_accessoryGuids.end()) { // TODO Same TODO as in VehicleInfo::RemoveAccessoriesFromMap ((Creature*)passenger)->ForcedDespawn(5000); m_accessoryGuids.erase(passenger->GetObjectGuid()); } } // Remove passenger modifications RemoveSeatMods(passenger, seatEntry->m_flags); // Some creature vehicles get despawned after passenger unboarding if (m_owner->GetTypeId() == TYPEID_UNIT) { // TODO: Guesswork, but seems to be fairly near correct // Only if the passenger was on control seat? Also depending on some flags if ((seatEntry->m_flags & SEAT_FLAG_CAN_CONTROL) && !(m_vehicleEntry->m_flags & (VEHICLE_FLAG_UNK4 | VEHICLE_FLAG_UNK20))) { if (((Creature*)m_owner)->IsTemporarySummon()) ((Creature*)m_owner)->ForcedDespawn(1000); } } }
void VehicleKit::RemovePassenger(Unit* passenger, bool dismount) { SeatMap::iterator seat; for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) if (seat->second.passenger == passenger->GetObjectGuid()) break; if (seat == m_Seats.end()) return; seat->second.passenger.Clear(); passenger->clearUnitState(UNIT_STAT_ON_VEHICLE); UnBoardPassenger(passenger); // Use TransportBase to remove the passenger from storage list passenger->m_movementInfo.ClearTransportData(); passenger->m_movementInfo.RemoveMovementFlag(MOVEFLAG_ONTRANSPORT); if (seat->second.IsProtectPassenger()) if (passenger->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); if (seat->second.seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { passenger->SetCharm(NULL); passenger->RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE); GetBase()->SetCharmerGuid(ObjectGuid()); GetBase()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); GetBase()->clearUnitState(UNIT_STAT_CONTROLLED); if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* player = (Player*)passenger; player->SetClientControl(GetBase(), 0); player->RemovePetActionBar(); } if(!(((Creature*)GetBase())->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_KEEP_AI)) ((Creature*)GetBase())->AIM_Initialize(); } if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* player = (Player*)passenger; player->SetViewPoint(NULL); passenger->SetRoot(false); player->SetMover(player); player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_ROOT); if ((GetBase()->HasAuraType(SPELL_AURA_FLY) || GetBase()->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED)) && (!player->HasAuraType(SPELL_AURA_FLY) && !player->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED))) { WorldPacket data; data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12); data << player->GetPackGUID(); data << (uint32)(0); GetBase()->SendMessageToSet(&data,false); player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_FLYING); player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_CAN_FLY); } } UpdateFreeSeatCount(); if (GetBase()->GetTypeId() == TYPEID_UNIT) { if (((Creature*)GetBase())->AI()) ((Creature*)GetBase())->AI()->PassengerBoarded(passenger, seat->first, false); } if (passenger->GetTypeId() == TYPEID_UNIT) { if (((Creature*)passenger)->AI()) ((Creature*)passenger)->AI()->EnteredVehicle(GetBase(), seat->first, false); } if (dismount && seat->second.b_dismount) { Dismount(passenger, seat->second.seatInfo); // only for flyable vehicles if (GetBase()->m_movementInfo.HasMovementFlag(MOVEFLAG_FLYING)) GetBase()->CastSpell(passenger, 45472, true); // Parachute } }
void VehicleKit::RemovePassenger(Unit* passenger, bool dismount /*false*/) { SeatMap::iterator seat; for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) { if (seat->second.passengerGuid == passenger->GetObjectGuid()) break; } if (seat == m_Seats.end()) return; seat->second.passengerGuid.Clear(); passenger->clearUnitState(UNIT_STAT_ON_VEHICLE); UnBoardPassenger(passenger); // Use TransportBase to remove the passenger from storage list passenger->m_movementInfo.ClearTransportData(); if (seat->second.IsProtectPassenger()) { if (passenger->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } if (passenger->GetTypeId() == TYPEID_UNIT) { if (seat->second.seatInfo->m_flags & SEAT_FLAG_NOT_SELECTABLE) passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } if (seat->second.seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL && GetBase()->GetTypeId() == TYPEID_UNIT) { passenger->SetCharm(NULL); passenger->RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE); GetBase()->SetCharmerGuid(ObjectGuid()); GetBase()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); GetBase()->clearUnitState(UNIT_STAT_CONTROLLED); GetBase()->StopMoving(); if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* player = (Player*)passenger; player->SetClientControl(GetBase(), 0); player->RemovePetActionBar(); } // Allow to keep AI of controlled vehicle with CREATURE_FLAG_EXTRA_KEEP_AI extra-flag if (!(((Creature*)GetBase())->GetCreatureInfo()->ExtraFlags & CREATURE_FLAG_EXTRA_KEEP_AI)) ((Creature*)GetBase())->AIM_Initialize(); } if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* player = (Player*)passenger; player->SetViewPoint(NULL); ((Player*)passenger)->SetGravity(true); passenger->SetRoot(false); player->SetMover(player); player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_ROOT); // restore player's walk mode if (GetBase()->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE) && !GetBase()->IsWalking()) player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_WALK_MODE); if ((GetBase()->HasAuraType(SPELL_AURA_FLY) || GetBase()->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED) || (GetBase()->GetTypeId() == TYPEID_UNIT && ((Creature*)GetBase())->CanFly())) && (!player->HasAuraType(SPELL_AURA_FLY) && !player->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED))) { WorldPacket data; GetBase()->BuildMoveSetCanFlyPacket(&data, false, 0); GetBase()->SendMessageToSet(&data, false); player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_FLYING); player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_CAN_FLY); } if (GetBase()->IsLevitating()) { player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_LEVITATING); player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_HOVER); } // group update if (player->GetGroup()) player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_VEHICLE_SEAT); } UpdateFreeSeatCount(); if (GetBase()->GetTypeId() == TYPEID_UNIT) { if (((Creature*)GetBase())->AI()) ((Creature*)GetBase())->AI()->PassengerBoarded(passenger, seat->first, false); } if (passenger->GetTypeId() == TYPEID_UNIT) { if (((Creature*)passenger)->AI()) { ((Creature*)passenger)->AI()->EnteredVehicle(GetBase(), seat->first, false); ((Creature*)passenger)->AI()->SetCombatMovement(true, true); } } if (dismount && seat->second.b_dismount) { Dismount(passenger, seat->second.seatInfo); // only for flyable vehicles if (GetBase()->m_movementInfo.HasMovementFlag(MOVEFLAG_FLYING)) GetBase()->CastSpell(passenger, 45472, true); // Parachute } else { // Force update passenger position to base position WorldLocation const& pos = GetBase()->GetPosition(); passenger->SetPosition(pos); } }