void Vehicle::RemovePassenger(Unit *unit) { SeatMap::iterator seat; for(seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) { if((seat->second.flags & (SEAT_FULL | SEAT_VEHICLE_FREE | SEAT_VEHICLE_FULL)) && seat->second.passenger == unit) { unit->SetVehicleGUID(0); if(seat->second.vs_flags & SF_MAIN_RIDER) { RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE); if(unit->GetTypeId() == TYPEID_PLAYER) { ((Player*)unit)->SetMover(unit); ((Player*)unit)->SetClientControl(unit, 1); ((Player*)unit)->SetMoverInQueve(NULL); ((Player*)unit)->RemovePetActionBar(); if(((Player*)unit)->GetGroup()) ((Player*)unit)->SetGroupUpdateFlag(GROUP_UPDATE_VEHICLE); } unit->SetCharm(NULL); SetCharmerGUID(NULL); setFaction(GetCreatureInfo()->faction_A); } if(GetVehicleFlags() & VF_NON_SELECTABLE) RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if(seat->second.vs_flags & SF_UNATTACKABLE) unit->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); // restore player control if(unit->GetTypeId() == TYPEID_PLAYER) { ((Player*)unit)->GetCamera().ResetView(); if(seat->second.vs_flags & SF_CAN_CAST) { WorldPacket data0(SMSG_FORCE_MOVE_UNROOT, 10); data0 << unit->GetPackGUID(); data0 << (uint32)(2); // can rotate unit->SendMessageToSet(&data0,true); } else { WorldPacket data1(SMSG_FORCE_MOVE_UNROOT, 10); data1 << unit->GetPackGUID(); data1 << (uint32)(0); // cannot rotate unit->SendMessageToSet(&data1,true); } } unit->m_movementInfo.ClearTransportData(); seat->second.passenger = NULL; seat->second.flags = SEAT_FREE; unit->m_movementInfo.RemoveMovementFlag(MOVEFLAG_ONTRANSPORT); EmptySeatsCountChanged(); break; } } }
void Vehicle::setDeathState(DeathState s) // overwrite virtual Creature::setDeathState and Unit::setDeathState { Creature::setDeathState(s); if(s == JUST_DIED) { if(GetVehicleFlags() & VF_DESPAWN_NPC) Dismiss(); else RemoveAllPassengers(); } }
void Vehicle::AddPassenger(Unit *unit, int8 seatId, bool force) { SeatMap::iterator seat; seat = m_Seats.find(seatId); // this should never happen if(seat == m_Seats.end()) return; unit->SetVehicleGUID(GetGUID()); seat->second.passenger = unit; if(unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->isVehicle()) { if(((Vehicle*)unit)->GetEmptySeatsCount(true) == 0) seat->second.flags = SEAT_VEHICLE_FULL; else seat->second.flags = SEAT_VEHICLE_FREE; } else { seat->second.flags = SEAT_FULL; } if(unit->GetTypeId() == TYPEID_PLAYER) { WorldPacket data0(SMSG_FORCE_MOVE_ROOT, 10); data0 << unit->GetPackGUID(); data0 << (uint32)((seat->second.vs_flags & SF_CAN_CAST) ? 2 : 0); unit->SendMessageToSet(&data0,true); } if(seat->second.vs_flags & SF_MAIN_RIDER) { if(!(GetVehicleFlags() & VF_MOVEMENT)) { GetMotionMaster()->Clear(false); GetMotionMaster()->MoveIdle(); SetCharmerGUID(unit->GetGUID()); unit->SetUInt64Value(UNIT_FIELD_CHARM, GetGUID()); if(unit->GetTypeId() == TYPEID_PLAYER) { ((Player*)unit)->SetMover(this); ((Player*)unit)->SetMoverInQueve(this); ((Player*)unit)->SetClientControl(this, 1); } if(canFly() || HasAuraType(SPELL_AURA_FLY) || HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED)) { WorldPacket data3(SMSG_MOVE_SET_CAN_FLY, 12); data3<< GetPackGUID(); data3 << (uint32)(0); SendMessageToSet(&data3,false); } } SpellClickInfoMapBounds clickPair = sObjectMgr.GetSpellClickInfoMapBounds(GetEntry()); for(SpellClickInfoMap::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr) { if (unit->GetTypeId() == TYPEID_UNIT || itr->second.IsFitToRequirements((Player*)unit)) { Unit *caster = (itr->second.castFlags & 0x1) ? unit : this; Unit *target = (itr->second.castFlags & 0x2) ? unit : this; caster->CastSpell(target, itr->second.spellId, true); } } if(unit->GetTypeId() == TYPEID_PLAYER) { // it should be added only on rider enter? if(((Player*)unit)->GetGroup()) ((Player*)unit)->SetGroupUpdateFlag(GROUP_UPDATE_VEHICLE); ((Player*)unit)->GetCamera().SetView(this); BuildVehicleActionBar((Player*)unit); } if(!(GetVehicleFlags() & VF_FACTION)) setFaction(unit->getFaction()); if(GetVehicleFlags() & VF_CANT_MOVE) { WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 10); data2<< GetPackGUID(); data2 << (uint32)(2); SendMessageToSet(&data2,false); } if(GetVehicleFlags() & VF_NON_SELECTABLE) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } if(seat->second.vs_flags & SF_UNATTACKABLE) unit->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); EmptySeatsCountChanged(); }
void Vehicle::RemovePassenger(Unit *unit) { SeatMap::iterator seat; for(seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) { if((seat->second.flags & (SEAT_FULL | SEAT_VEHICLE_FREE | SEAT_VEHICLE_FULL)) && seat->second.passenger == unit) { unit->SetVehicleGUID(0); if(seat->second.vs_flags & SF_MAIN_RIDER) { RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE); if(unit->GetTypeId() == TYPEID_PLAYER) { ((Player*)unit)->SetMover(unit); ((Player*)unit)->SetClientControl(unit, 1); ((Player*)unit)->SetMoverInQueve(NULL); ((Player*)unit)->RemovePetActionBar(); if(((Player*)unit)->GetGroup()) ((Player*)unit)->SetGroupUpdateFlag(GROUP_UPDATE_VEHICLE); } unit->SetCharm(NULL); SetCharmerGUID(NULL); setFaction(GetCreatureInfo()->faction_A); } if(GetVehicleFlags() & VF_NON_SELECTABLE) RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if(GetVehicleFlags() & VF_CAST_AURA && m_VehicleData && m_VehicleData->v_spells[0] != 0) unit->RemoveAurasDueToSpell(m_VehicleData->v_spells[0]); if(seat->second.vs_flags & SF_UNATTACKABLE) unit->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); // restore player control if(unit->GetTypeId() == TYPEID_PLAYER) { ((Player*)unit)->SetFarSightGUID(NULL); if(seat->second.vs_flags & SF_CAN_CAST) { WorldPacket data0(SMSG_FORCE_MOVE_UNROOT, 10); data0 << unit->GetPackGUID(); data0 << (uint32)(2); // can rotate unit->SendMessageToSet(&data0,true); } else { WorldPacket data1(SMSG_FORCE_MOVE_UNROOT, 10); data1 << unit->GetPackGUID(); data1 << (uint32)(0); // cannot rotate unit->SendMessageToSet(&data1,true); } } unit->m_SeatData.OffsetX = 0.0f; unit->m_SeatData.OffsetY = 0.0f; unit->m_SeatData.OffsetZ = 0.0f; unit->m_SeatData.Orientation = 0.0f; unit->m_SeatData.c_time = 0; unit->m_SeatData.dbc_seat = 0; unit->m_SeatData.seat = 0; unit->m_SeatData.s_flags = 0; unit->m_SeatData.v_flags = 0; seat->second.passenger = NULL; seat->second.flags = SEAT_FREE; EmptySeatsCountChanged(); break; } } }