void Vehicle::RemovePassenger(Player * player) { if (player == NULL || player->GetVehicle() != this || player->GetVehicleSeat() >= GetPassengerCount() || m_passengers[player->GetVehicleSeat()] != player) return; SendFarsightPacket(player, false); RelocateToVehicle(player); if (player == m_controller) { WorldPacket data; m_controller = NULL; SetCharmedByGUID( 0); RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED_CREATURE); player->GetSession()->SetActiveMover(player->GetNewGUID()); data.Initialize(SMSG_CLIENT_CONTROL_UPDATE); data << GetNewGUID() << uint8(0); player->GetSession()->SendPacket(&data); } //clear refs uint8 seat = player->GetVehicleSeat(); player->ResetVehicleSettings(); m_passengers[seat] = NULL; }
void Vehicle::AddPassenger(Player * player, int8 seat) { if (!player->IsInWorld()) return; if (seat == -1) //choose a seat for us { for (uint8 i= 0; i < GetOccupancyLimit(); i++) if (m_passengers[i] == NULL) { seat = i; break; } if (seat == -1) //can't find a seat return; seat = 0; } else { if (seat >= GetOccupancyLimit() || m_passengers[seat] != NULL) return; } sLog.outDebug("AddPassenger"); m_passengers[seat] = player; // Set this vehicle and seat to player player->SetVehicle(this, seat); // Time to move into the unit... //player->Root(); SendFarsightPacket(player, true); RelocateToVehicle(player); if (seat == 0) //todo: what if its uncontrollable (skybreaker flightpath, rocket mount from k3) { //give control to player WorldPacket data; data.Initialize(SMSG_CLIENT_CONTROL_UPDATE); data << GetNewGUID() << uint8(1); player->SendPacket(&data); m_controller = player; player->SetCharmedUnitGUID(GetGUID()); SetCharmedByGUID(player->GetGUID()); SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED_CREATURE); //set active mover player->GetSession()->SetActiveMover(GetNewGUID()); // Show the vehicle action bar ??? SendRideSpellPacket(player); } }
void Vehicle::RemovePassenger(Unit * passenger) { if( HasAllProtoAvailable() == false ) return; ASSERT(this && passenger); if (passenger == NULL || // Are we passing NULL pointers? passenger->GetVehicle() != this || // Are we trying to dismount from something invalid? passenger->GetSeatID() >= MAX_PASSENGERS || // Are we trying to dismount someone in an inexcisting seat? m_passengers[passenger->GetSeatID()] != passenger) // Are we trying to dismount someone who's seat we do not own? { // ASSERT( false ); //wow, we are not expecting this situation at all return; } if(passenger->IsPlayer()) // The passenger is a player { Player * player = static_cast<Player*>(passenger); //remove pet action bar in case we had any sStackWolrdPacket( data, SMSG_PET_SPELLS, 9 ); data << uint64(0); player->GetSession()->SendPacket(&data); if( passenger != m_owner ) { // SendHeartbeatPacket(player); // RelocateToVehicle(player); if( IsMount == false ) SendFarsightPacket(player, false); // player->SetUInt64Value(UNIT_FIELD_TARGET, 0); //loose targetting, but why ? if( IsMount == false && player == m_controller) // Are we the driver of this vehicle? { m_controller = NULL; player->UnPossess(); // passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); } player->GetSession()->SetActiveMover( player->GetNewGUID() ); passenger->Unroot(); WorldPacket data; data.Initialize(SMSG_MONSTER_MOVE); data << player->GetNewGUID(); // PlayerGUID data << uint8(0x40); // Unk - blizz uses 0x40 data << player->GetPosition(); // Player Position xyz data << getMSTime(); // Timestamp data << uint8(0x4); // Flags data << player->GetOrientation(); // Orientation data << uint32(0x01000000); // MovementFlags data << uint32(0); // MovementTime data << uint32(1); // Pointcount data << m_owner->GetPosition(); // Vehicle Position xyz player->SendMessageToSet(&data, true); } if( passenger == m_owner ) { // Send others that we are no longer a vehicle sStackWolrdPacket( data, SMSG_CONVERT_VEHICLE, 9+4); data << passenger->GetNewGUID() ; data << uint32( 0 ); player->SendMessageToSet(&data,true); } player->m_noFallDamage = false; } else if(passenger->IsCreature()) { static_cast<Creature*>(passenger)->ResetParentInfo(); passenger->SetPosition( m_owner->GetPositionX(), m_owner->GetPositionY(), m_owner->GetPositionZ(), m_owner->GetOrientation(), true); } else { sLog.outDebug("Error while removing passenger."); } //clear refs uint8 seat = passenger->GetSeatID(); passenger->m_vehicle_data = NULL; passenger->m_CurrentVehicleSeat = VEHICLE_PASSENGER_SLOT_INVALID; m_passengers[seat] = NULL; passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_MOUNTABLE); passenger->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_VEHICLE); if( GetPassengerCount() < GetOccupancyLimit() && m_owner->IsPlayer() == false && m_owner != passenger ) m_owner->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); if(m_vehicledata->flags & VEHICLE_FLAG_DISABLE_AI_ON_ENTER) m_owner->EnableAI(); --m_passengerCount; if( m_passengerCount <= 0 && IsMount ) { m_owner->DestoryVehicle(); return; //we just killed ourself, do not do anything after that function call } }
void Vehicle::AddPassenger(Unit * passenger, int8 seat) { if( HasAllProtoAvailable() == false ) return; ASSERT( passenger ); if( !passenger->IsInWorld() ) return; if(GetPassengerCount() + 1 > GetOccupancyLimit()) // Check if there is place left for us { return; } // Check if we're a vehicle trying to mount a non-player seat position if( seat == VEHICLE_PASSENGER_SLOT_INVALID || seat >= MAX_PASSENGERS || seat >= GetOccupancyLimit() || m_passengers[seat] != NULL) { return; } //right now mount owners are using seat 0 with is not actually a seat. In case there are crash reports we should check if picked seat is also valid in DBC // if( m_vehicleEntry->m_seatID[ seat ] == 0 ) return; m_passengers[seat] = passenger; // Set this vehicle and seat to player passenger->SetVehicle(this, seat); //set controler if( m_controller == NULL ) { m_controller = passenger; if( IsMount == false ) { //should not posses self ? if( m_controller != m_owner && passenger->IsPlayer() ) SafePlayerCast( passenger )->Possess( m_owner ); // passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); } } if( passenger->IsPlayer() ) { Player * player = SafePlayerCast(passenger); if( passenger != m_owner ) { if( IsMount == false ) SendFarsightPacket(player, true); //focus on vehicle instead us ? But why ? player->GetSession()->SetActiveMover( GetNewGUID() ); //loose movement control ? } if( IsMount == false ) player->m_noFallDamage = true; // Show the vehicle action bar. Is this to owner or to seat ? SendVehicleActionBar( player ); if( passenger != m_owner ) SendRidePacket( passenger, GetSeatData()->seat[seat] ); //seems like this is a mount if( passenger == m_owner ) { // Send others that we now have a vehicle sStackWolrdPacket( data, SMSG_CONVERT_VEHICLE, 9+4); data << passenger->GetNewGUID() ; data << uint32( proto->vehicleId ); player->SendMessageToSet(&data,true); //is this for all players or only the real vehicle controller data.Initialize(SMSG_CONTROL_VECHICLE); player->GetSession()->SendPacket(&data); } } // Remove shapeshift auras passenger->RemoveAllAuraType(SPELL_AURA_MOD_SHAPESHIFT); passenger->RemoveAllAuraType(SPELL_AURA_TRANSFORM); if( passenger != m_owner ) { passenger->Root(); passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } else if( passenger == m_owner ) m_owner->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_VEHICLE); if(m_vehicledata->flags & VEHICLE_FLAG_DISABLE_AI_ON_ENTER) m_owner->DisableAI(); // Check if we exceeded maximum passenger capacity if( GetPassengerCount() >= GetOccupancyLimit() ) m_owner->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); m_passengerCount++; // Count the passenger as inside the vehicle }