Пример #1
0
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;
}
Пример #2
0
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
}