示例#1
0
void WorldSession::HandleEjectPassenger(WorldPackets::Vehicle::EjectPassenger& ejectPassenger)
{
    Vehicle* vehicle = _player->GetVehicleKit();
    if (!vehicle)
    {
        TC_LOG_ERROR("network", "HandleEjectPassenger: %s is not in a vehicle!", GetPlayer()->GetGUID().ToString().c_str());
        return;
    }

    if (ejectPassenger.Passenger.IsUnit())
    {
        Unit* unit = ObjectAccessor::GetUnit(*_player, ejectPassenger.Passenger);
        if (!unit) // creatures can be ejected too from player mounts
        {
            TC_LOG_ERROR("network", "%s tried to eject %s from vehicle, but the latter was not found in world!", GetPlayer()->GetGUID().ToString().c_str(), ejectPassenger.Passenger.ToString().c_str());
            return;
        }

        if (!unit->IsOnVehicle(vehicle->GetBase()))
        {
            TC_LOG_ERROR("network", "%s tried to eject %s, but they are not in the same vehicle", GetPlayer()->GetGUID().ToString().c_str(), ejectPassenger.Passenger.ToString().c_str());
            return;
        }

        VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(unit);
        ASSERT(seat);
        if (seat->IsEjectable())
            unit->ExitVehicle();
        else
            TC_LOG_ERROR("network", "%s attempted to eject %s from non-ejectable seat.", GetPlayer()->GetGUID().ToString().c_str(), ejectPassenger.Passenger.ToString().c_str());
    }
    else
        TC_LOG_ERROR("network", "HandleEjectPassenger: %s tried to eject invalid %s ", GetPlayer()->GetGUID().ToString().c_str(), ejectPassenger.Passenger.ToString().c_str());
}
示例#2
0
bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
{
    /// @Prevent adding passengers when vehicle is uninstalling. (Bad script in OnUninstall/OnRemovePassenger/PassengerBoarded hook.)
    if (_status == STATUS_UNINSTALLING)
    {
        TC_LOG_ERROR(LOG_FILTER_VEHICLES, "Passenger GuidLow: %u, Entry: %u, attempting to board vehicle GuidLow: %u, Entry: %u during uninstall! SeatId: %d",
            unit->GetGUIDLow(), unit->GetEntry(), _me->GetGUIDLow(), _me->GetEntry(), (int32)seatId);
        return false;
    }

    TC_LOG_DEBUG(LOG_FILTER_VEHICLES, "Unit %s scheduling enter vehicle (entry: %u, vehicleId: %u, guid: %u (dbguid: %u) on seat %d",
        unit->GetName().c_str(), _me->GetEntry(), _vehicleInfo->m_ID, _me->GetGUIDLow(),
        (_me->GetTypeId() == TYPEID_UNIT ? _me->ToCreature()->GetDBTableGUIDLow() : 0), (int32)seatId);

    // The seat selection code may kick other passengers off the vehicle.
    // While the validity of the following may be arguable, it is possible that when such a passenger
    // exits the vehicle will dismiss. That's why the actual adding the passenger to the vehicle is scheduled
    // asynchronously, so it can be cancelled easily in case the vehicle is uninstalled meanwhile.
    SeatMap::iterator seat;
    VehicleJoinEvent* e = new VehicleJoinEvent(this, unit);
    unit->m_Events.AddEvent(e, unit->m_Events.CalculateTime(0));

    if (seatId < 0) // no specific seat requirement
    {
        for (seat = Seats.begin(); seat != Seats.end(); ++seat)
            if (seat->second.IsEmpty() && (seat->second.SeatInfo->CanEnterOrExit() || seat->second.SeatInfo->IsUsableByOverride()))
                break;

        if (seat == Seats.end()) // no available seat
        {
            e->to_Abort = true;
            return false;
        }

        e->Seat = seat;
        _pendingJoinEvents.push_back(e);
    }
    else
    {
        seat = Seats.find(seatId);
        if (seat == Seats.end())
        {
            e->to_Abort = true;
            return false;
        }

        e->Seat = seat;
        _pendingJoinEvents.push_back(e);
        if (!seat->second.IsEmpty())
        {
            Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), seat->second.Passenger.Guid);
            ASSERT(passenger);
            passenger->ExitVehicle();
        }

        ASSERT(seat->second.IsEmpty());
    }

    return true;
}
示例#3
0
        void MovementInform(uint32 type, uint32 id)
        {
            if (type != POINT_MOTION_TYPE)
                return;

            if (id < 15)
            {
                ++countWP;
                wpReached = true;
            }
            else
            // drake reached village
            {
                // get player that rides drake (from seat 0)
                Unit* player = me->GetVehicleKit()->GetPassenger(0);
                if (player && player->GetTypeId() == TYPEID_PLAYER)
                {
                    // for each prisoner on drake,give credit
                    for (uint8 i = 1; i < 4; ++i)
                        if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i))
                        {
                            if (prisoner->GetTypeId() != TYPEID_UNIT)
                                return;
                            prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true);
                            prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true);
                            prisoner->ExitVehicle();
                        }
                    me->CastSpell(me, SPELL_KILL_CREDIT_DRAKE, true);
                    player->ExitVehicle();
                }
            }
        }
示例#4
0
        void MovementInform(uint32 type, uint32 id)
        {
            if (type != POINT_MOTION_TYPE || id != count)
                return;

            if (id < 5)
            {
                ++count;
                wp_reached = true;
            }
            else // reached village, give credits
            {
                Unit* player = me->GetVehicleKit()->GetPassenger(0); // get player
                if (player && player->GetTypeId() == TYPEID_PLAYER)
                {
                    for (uint8 i = 1; i < 4; ++i) // try to get prisoners
                        if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i))
                        {
                            if (prisoner->GetTypeId() != TYPEID_UNIT)
                                return;

                            player->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true);
                            //DoCast(player, SPELL_SUMMON_LIBERATED, true);
                            prisoner->ExitVehicle();
                            prisoner->ToCreature()->AI()->DoAction(0);
                        }

                    player->ToPlayer()->KilledMonsterCredit(29709, 0);
                    //DoCast(player, SPELL_KILL_CREDIT_DRAKE, true);
                    player->ExitVehicle();
                }
            }
        }
        void MovementInform(uint32 type, uint32 id)
        {
            if (type != POINT_MOTION_TYPE || id != count)
                return;

            if (id < 5)
            {
                ++count;
                wp_reached = true;
            }
            else //reached village, give credits
            {
                Unit* pPlayer = me->GetVehicleKit()->GetPassenger(0); //get player
                if (pPlayer && pPlayer->GetTypeId() == TYPEID_PLAYER)
                {
                    for (uint8 i = 1; i < 4; ++i) //try to get prisoners
                        if (Unit* pPrisoner = me->GetVehicleKit()->GetPassenger(i))
                        {
                            pPlayer->ToPlayer()->KilledMonsterCredit(ENTRY_LIBERATED_BRUNNHILDAR, 0);
                            pPrisoner->ExitVehicle();
                        }

                    pPlayer->ToPlayer()->KilledMonsterCredit(ENTRY_FREED_PROTODRAKE, 0);
                    pPlayer->ExitVehicle();
                }

                me->SetVisible(false);
                me->ForcedDespawn(1000);
            }
        }
示例#6
0
        void MovementInform(uint32 type, uint32 id)
        {
            if (type != POINT_MOTION_TYPE || id != count)
                return;

            if (id < 31)
            {
                Unit* player = me->GetVehicleKit()->GetPassenger(0);
                if (player && player->GetTypeId() == TYPEID_PLAYER)
                {
                    ++count;
                    wp_reached = true;
                }
                else
                    me->DisappearAndDie();
            }
            else // reached questgiver, give credit
            {
                Unit* player = me->GetVehicleKit()->GetPassenger(0);
                if (player && player->GetTypeId() == TYPEID_PLAYER)
                {
                    player->ToPlayer()->CompleteQuest(12536);
                    player->ExitVehicle();
                }
                me->DisappearAndDie();
            }
        }
示例#7
0
bool PassengerEjectEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
{
    if (!m_vehicle.GetVehicleInfo())
        return true;

    VehicleKit* pVehicle = m_vehicle.GetVehicleKit();

    if (!pVehicle)
        return true;

    Unit* passenger = pVehicle->GetPassenger(m_seatId);

    if (passenger && passenger->IsInWorld() && passenger->hasUnitState(UNIT_STAT_ON_VEHICLE))
    {
        uint32 controlSpell = 0;
        Unit::AuraList const& controlAuras = m_vehicle.GetAurasByType(SPELL_AURA_CONTROL_VEHICLE);
        for(Unit::AuraList::const_iterator i = controlAuras.begin(); i != controlAuras.end(); ++i)
        {
            if ((*i)->GetCasterGuid() == passenger->GetObjectGuid())
            {
                controlSpell = (*i)->GetId();
                break;
            }
        }

        if (controlSpell)
        {
            m_vehicle.RemoveAurasByCasterSpell(controlSpell, passenger->GetObjectGuid());
        }
        else
            passenger->ExitVehicle();
    }
    return true;
}
 void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override
 {
     if (spell->Id == SPELL_LAND)
     {
         Unit* passenger = me->GetVehicleKit()->GetPassenger(1); // player should be on seat 1
         if (passenger && passenger->GetTypeId() == TYPEID_PLAYER)
         {
             passenger->CastSpell(passenger, SPELL_CREDIT, true);
             passenger->ExitVehicle();
         }
     }
 }
示例#9
0
	void UpdateAI(const uint32 diff)
    {
		if(!pInstance)
			return;

		if(!JiustYell && pInstance->GetData(DATA_DRAKOS_EVENT) == DONE)
		{
			DoScriptText(SAY_SPAWN, me);
			JiustYell = true;
		}
		if(!started && pInstance->GetData(DATA_CENTRIFUGE_CONSTRUCT_EVENT) == 10)
		{
			me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
			me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
			me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
			me->RemoveAllAuras();
			me->SetReactState(REACT_AGGRESSIVE);
			started=true;
		}
        //Return since we have no target
		if (!started || !UpdateVictim())
            return;

		if(uiEnergizeCore_Timer <= diff)
		{
			DoCast(me->getVictim(),SPELL_ENERGIZE_CORES);
			uiEnergizeCore_Timer = 10000;
		} else uiEnergizeCore_Timer -= diff;

        DoMeleeAttackIfReady();

		std::list<HostileReference*>& m_threatlist = me->getThreatManager().getThreatList();
        std::list<HostileReference*>::const_iterator i = m_threatlist.begin();
        for (i = m_threatlist.begin(); i!= m_threatlist.end(); ++i)
        {
            Unit* pUnit = Unit::GetUnit((*me), (*i)->getUnitGuid());
			if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER) )
            {
				Vehicle* v = pUnit->GetVehicle();
				if(v)
				{
					pUnit->ExitVehicle();
					v->Dismiss();
					DoCast(pUnit,SPELL_PARACHUTE);					
				}
            }
        }
    }
示例#10
0
// Vehicle events
bool PassengerEjectEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
{
    if (!m_vehicle.IsVehicle())
        return true;

    VehicleKitPtr pVehicle = m_vehicle.GetVehicleKit();

    Unit* passenger = pVehicle->GetPassenger(m_seatId);

    if (passenger && passenger->IsInWorld())
    {
        if (!m_vehicle.RemoveSpellsCausingAuraByCaster(SPELL_AURA_CONTROL_VEHICLE, passenger->GetObjectGuid()))
            passenger->ExitVehicle();
    }
    return true;
}
示例#11
0
void WorldSession::HandleEjectPasenger(WorldPacket &recv_data)
{
    DEBUG_LOG("WORLD: Received CMSG_EJECT_PASSENGER");
    recv_data.hexlike();

    ObjectGuid guid;
    recv_data >> guid;

    Unit* passenger = ObjectAccessor::GetUnit(*GetPlayer(), guid);

    if (!passenger)
        return;

    if (!passenger->GetVehicle() || passenger->GetVehicle() != GetPlayer()->GetVehicleKit())
        return;

    passenger->ExitVehicle();
}
示例#12
0
 	void DismountPlayers()
 	{
 		std::list<HostileReference*>& m_threatlist = me->getThreatManager().getThreatList();
 		std::list<HostileReference*>::const_iterator i = m_threatlist.begin();
 		for (i = m_threatlist.begin(); i!= m_threatlist.end(); ++i)
 		{
 			Unit* pUnit = Unit::GetUnit((*me), (*i)->getUnitGuid());
 			if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER) )
 			{
 				Vehicle* v = pUnit->GetVehicle();
 				if(v)
 				{
 					pUnit->ExitVehicle();
 					v->Dismiss();
 					DoCast(pUnit,SPELL_PARACHUTE);					
 				}
 			}
 		}
 	}
示例#13
0
        void MovementInform(uint32 type, uint32 id)
        {
            if (type != POINT_MOTION_TYPE || id != count)
                return;

            if (id < 16)
            {
                ++count;
                wp_reached = true;
            }
            else // reached questgiver, give credit
            {
                Unit* player = me->GetVehicleKit()->GetPassenger(0);
                if (player && player->GetTypeId() == TYPEID_PLAYER)
                {
                    player->ToPlayer()->KilledMonsterCredit(ENTRY_INJURED_ICEMAW, 0);
                    player->ExitVehicle();
                }
            }
        }
示例#14
0
void WorldSession::HandleEjectPassenger(WorldPacket &recv_data)
{
    recv_data.hexlike();

    ObjectGuid guid;
    recv_data >> guid;

    DEBUG_LOG("WORLD: Received CMSG_EJECT_PASSENGER %s",guid.GetString().c_str());

    Unit* passenger = ObjectAccessor::GetUnit(*GetPlayer(), guid);

    if (!passenger)
        return;

    VehicleKit* pVehicle = passenger->GetVehicle();

    if (!pVehicle ||
       ((pVehicle != GetPlayer()->GetVehicleKit()) &&
        !(pVehicle->GetBase()->GetVehicleInfo()->GetEntry()->m_flags & (VEHICLE_FLAG_ACCESSORY))))
    {
        sLog.outError("WorldSession::HandleEjectPassenger %s try eject %s, but not may do this!",GetPlayer()->GetObjectGuid().GetString().c_str(),guid.GetString().c_str());
        return;
    }

    passenger->ExitVehicle();

    // eject and remove creatures of player mounts
    if (passenger->GetTypeId() == TYPEID_UNIT)
    {
        if (((Creature*)passenger)->IsTemporarySummon())
        {
            // Fixme: delay must be calculated not from this, but from creature template parameters (off traders ...?).
            uint32 delay = passenger->GetObjectGuid().IsVehicle() ? 1000: 60000;
            ((TemporarySummon*)passenger)->UnSummon(delay);
        }
        else
            passenger->AddObjectToRemoveList();
    }
}
示例#15
0
        void UpdateAI(uint32 diff)
        {
            events.Update(diff);

            switch (events.ExecuteEvent())
            {
                case EVENT_CHECK_AREA:
                    if (me->GetAreaId() == AREA_VALLEY_OF_ANCIENT_WINTERS)
                    {
                        if (Vehicle* vehicle = me->GetVehicleKit())
                            if (Unit* passenger = vehicle->GetPassenger(0))
                            {
                                Talk(TEXT_EMOTE, passenger->GetGUID());
                                me->GetMotionMaster()->MovePath(NPC_DRAKE, false);
                            }
                    }
                    else
                        events.ScheduleEvent(EVENT_CHECK_AREA, 5000);
                    break;
                case EVENT_REACHED_HOME:
                    Unit* player = me->GetVehicleKit()->GetPassenger(0);
                    if (player && player->GetTypeId() == TYPEID_PLAYER)
                    {
                        // for each prisoner on drake, give credit
                        for (uint8 i = 1; i < 4; ++i)
                            if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i))
                            {
                                if (prisoner->GetTypeId() != TYPEID_UNIT)
                                    return;
                                prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true);
                                prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true);
                                prisoner->ExitVehicle();
                            }
                        me->CastSpell(me, SPELL_KILL_CREDIT_DRAKE, true);
                        player->ExitVehicle();
                    }
                    break;
            }
        }
示例#16
0
        void MovementInform(uint32 type, uint32 id)
        {
            if (type != POINT_MOTION_TYPE || id != count)
                return;

            if (id < 10)
            {
                ++count;
                wp_reached = true;
            }
            else
            {
                Unit* player = me->GetVehicleKit()->GetPassenger(0);
                if (player && player->GetTypeId() == TYPEID_PLAYER)
                {
                    for (uint8 i = 0; i < 10; ++i)
                        player->ToPlayer()->KilledMonsterCredit(ENTRY_DRAKE_RIDER, 0);
                    player->ExitVehicle();
                    me->DespawnOrUnsummon(5000);
                }
            }
        }
示例#17
0
void WorldSession::HandleEjectPasenger(WorldPacket &recv_data)
{
    DEBUG_LOG("WORLD: Received CMSG_CONTROLLER_EJECT_PASSENGER");
    recv_data.hexlike();

    ObjectGuid guid;
    recv_data >> guid;

    Unit* passenger = ObjectAccessor::GetUnit(*GetPlayer(), guid);

    if (!passenger)
        return;

    if (!passenger->GetVehicle() || passenger->GetVehicle() != GetPlayer()->GetVehicleKit())
        return;

    passenger->ExitVehicle();

    // eject and remove creatures of player mounts
    if (passenger->GetTypeId() == TYPEID_UNIT)
        passenger->AddObjectToRemoveList();
}
        void MovementInform(uint32 type, uint32 id)
        {
            if (type != POINT_MOTION_TYPE || id != count)
                return;

            if (id < 10)
            {
                ++count;
                wp_reached = true;
            }
            else //TODO: remove this and loop waypoints around the hill
            {
                Unit* pPlayer = me->GetVehicleKit()->GetPassenger(0);
                if (pPlayer && pPlayer->GetTypeId() == TYPEID_PLAYER)
                {
                    for (uint8 i = 0; i < 10; ++i)
                        pPlayer->ToPlayer()->KilledMonsterCredit(ENTRY_DRAKE_RIDER, 0);
                    pPlayer->ExitVehicle();
                    //me->ForcedDespawn(5000);
                }
            }
        }
示例#19
0
void WorldSession::HandleEjectPassenger(WorldPacket& data)
{
    Vehicle* vehicle = _player->GetVehicleKit();
    if (!vehicle)
    {
        data.rfinish();                                     // prevent warnings spam
        TC_LOG_ERROR("network", "HandleEjectPassenger: %s is not in a vehicle!", GetPlayer()->GetGUID().ToString().c_str());
        return;
    }

    ObjectGuid guid;
    data >> guid;

    if (guid.IsUnit())
    {
        Unit* unit = ObjectAccessor::GetUnit(*_player, guid);
        if (!unit) // creatures can be ejected too from player mounts
        {
            TC_LOG_ERROR("network", "%s tried to eject %s from vehicle, but the latter was not found in world!", GetPlayer()->GetGUID().ToString().c_str(), guid.ToString().c_str());
            return;
        }

        if (!unit->IsOnVehicle(vehicle->GetBase()))
        {
            TC_LOG_ERROR("network", "%s tried to eject %s, but they are not in the same vehicle", GetPlayer()->GetGUID().ToString().c_str(), guid.ToString().c_str());
            return;
        }

        VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(unit);
        ASSERT(seat);
        if (seat->IsEjectable())
            unit->ExitVehicle();
        else
            TC_LOG_ERROR("network", "Player %u attempted to eject %s from non-ejectable seat.", GetPlayer()->GetGUIDLow(), guid.ToString().c_str());
    }
    else
        TC_LOG_ERROR("network", "HandleEjectPassenger: %s tried to eject invalid %s ", GetPlayer()->GetGUID().ToString().c_str(), guid.ToString().c_str());
}
示例#20
0
    void WaypointReached(uint32 uiPointId)
    {

        if (uiPointId == 5) //reached village, give credits
        {
            Unit* pPlayer = m_creature->GetVehicleKit()->GetPassenger(0);
            if (pPlayer && pPlayer->GetTypeId() == TYPEID_PLAYER)
            {
                for (uint8 i = 1; i < 4; ++i)
                    if (Unit* pPrisoner = m_creature->GetVehicleKit()->GetPassenger(i))
                    {
                        ((Player*)pPlayer)->KilledMonsterCredit(ENTRY_LIBERATED_BRUNNHILDAR);
                        pPrisoner->ExitVehicle();
                    }

                ((Player*)pPlayer)->KilledMonsterCredit(ENTRY_FREED_PROTODRAKE);
                pPlayer->ExitVehicle();
            }

            m_creature->SetVisibility(VISIBILITY_OFF);
            m_creature->ForcedDespawn(1000);
        }
    }
        void MovementInform(uint32 type, uint32 id)
        {
            if (type != WAYPOINT_MOTION_TYPE)
                return;

            if (id == 15)
            {
                Unit* player = me->GetVehicleKit()->GetPassenger(0);
                if (player && player->GetTypeId() == TYPEID_PLAYER)
                {
                    for (uint8 i = 1; i < 4; ++i)
                        if (Unit* prisoner = me->GetVehicleKit()->GetPassenger(i))
                        {
                            if (prisoner->GetTypeId() != TYPEID_UNIT)
                                return;
                            prisoner->CastSpell(player, SPELL_KILL_CREDIT_PRISONER, true);
                            prisoner->CastSpell(prisoner, SPELL_SUMMON_LIBERATED, true);
                            prisoner->ExitVehicle();
                        }
                    me->CastSpell(me, SPELL_KILL_CREDIT_DRAKE, true);
                    player->ExitVehicle();
                }
            }
        }
 void DamageTaken(Unit* pKiller, uint32 &damage)
 {
     if (Gripped)
     {
         ArmDamage += damage;
         int32 dmg = RAID_MODE(100000, 480000);
     
         if (ArmDamage >= dmg || damage >= me->GetHealth())
         {
             for (uint8 n = 0; n < RAID_MODE(1, 3); ++n)
             {
                 Unit* pGripTarget = me->GetVehicleKit()->GetPassenger(n);
                 if (pGripTarget && pGripTarget->isAlive())
                 {
                     pGripTarget->RemoveAurasDueToSpell(SPELL_STONE_GRIP);
                     pGripTarget->RemoveAurasDueToSpell(SPELL_STONE_GRIP_STUN);
                     pGripTarget->ExitVehicle();
                     pGripTarget->GetMotionMaster()->MoveJump(1767.80f, -18.38f, 448.808f, 10, 10);
                 }
             }
             Gripped = false;
         }
     }
 }
示例#23
0
void WorldSession::HandleEjectPassenger(WorldPacket& data)
{
    Vehicle* vehicle = _player->GetVehicleKit();
    if (!vehicle)
    {
        data.rfinish();                                     // prevent warnings spam
        TC_LOG_ERROR("network", "HandleEjectPassenger: Player %u is not in a vehicle!", GetPlayer()->GetGUIDLow());
        return;
    }

    uint64 guid;
    data >> guid;

    if (IS_PLAYER_GUID(guid))
    {
        Player* player = ObjectAccessor::FindPlayer(guid);
        if (!player)
        {
            TC_LOG_ERROR("network", "Player %u tried to eject player %u from vehicle, but the latter was not found in world!", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
            return;
        }

        if (!player->IsOnVehicle(vehicle->GetBase()))
        {
            TC_LOG_ERROR("network", "Player %u tried to eject player %u, but they are not in the same vehicle", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
            return;
        }

        VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(player);
        ASSERT(seat);
        if (seat->IsEjectable())
            player->ExitVehicle();
        else
            TC_LOG_ERROR("network", "Player %u attempted to eject player %u from non-ejectable seat.", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
    }

    else if (IS_CREATURE_GUID(guid))
    {
        Unit* unit = ObjectAccessor::GetUnit(*_player, guid);
        if (!unit) // creatures can be ejected too from player mounts
        {
            TC_LOG_ERROR("network", "Player %u tried to eject creature guid %u from vehicle, but the latter was not found in world!", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
            return;
        }

        if (!unit->IsOnVehicle(vehicle->GetBase()))
        {
            TC_LOG_ERROR("network", "Player %u tried to eject unit %u, but they are not in the same vehicle", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
            return;
        }

        VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(unit);
        ASSERT(seat);
        if (seat->IsEjectable())
        {
            ASSERT(GetPlayer() == vehicle->GetBase());
            unit->ExitVehicle();
        }
        else
            TC_LOG_ERROR("network", "Player %u attempted to eject creature GUID %u from non-ejectable seat.", GetPlayer()->GetGUIDLow(), GUID_LOPART(guid));
    }
    else
        TC_LOG_ERROR("network", "HandleEjectPassenger: Player %u tried to eject invalid GUID " UI64FMTD, GetPlayer()->GetGUIDLow(), guid);
}