Exemple #1
0
void WorldSession::HandleRequestVehicleSwitchSeat(WorldPacket &recv_data)
{
    DEBUG_LOG("WORLD: Received CMSG_REQUEST_VEHICLE_SWITCH_SEAT");
    recv_data.hexlike();

    ObjectGuid guid;
    recv_data >> guid.ReadAsPacked();

    int8 seatId;
    recv_data >> seatId;

    VehicleKit* pVehicle = GetPlayer()->GetVehicle();

    if (!pVehicle)
        return;

    if (pVehicle->GetBase()->GetVehicleInfo()->GetEntry()->m_flags & VEHICLE_FLAG_DISABLE_SWITCH)
        return;

    if (pVehicle->GetBase()->GetObjectGuid() == guid)
        GetPlayer()->ChangeSeat(seatId);

    else if (Unit *Vehicle2 = GetPlayer()->GetMap()->GetUnit(guid))
    {
        if (VehicleKit *pVehicle2 = Vehicle2->GetVehicleKit())
            if (pVehicle2->HasEmptySeat(seatId))
            {
                GetPlayer()->ExitVehicle();
                GetPlayer()->EnterVehicle(pVehicle2, seatId);
            }
    }
}
Exemple #2
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 WorldSession::HandleRequestVehicleSwitchSeat(WorldPacket &recv_data)
{
    DEBUG_LOG("WORLD: Recvd CMSG_REQUEST_VEHICLE_SWITCH_SEAT");
    recv_data.hexlike();

    ObjectGuid guid;
    recv_data >> guid.ReadAsPacked();

    int8 seatId;
    recv_data >> seatId;

    VehicleKit* pVehicle = GetPlayer()->GetVehicle();

    if (!pVehicle)                              // something wrong here...
        return;

    if (pVehicle->GetBase()->GetObjectGuid() == guid)
        GetPlayer()->ChangeSeat(seatId);
}
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))
    {
        if (!m_vehicle.RemoveSpellsCausingAuraByCaster(SPELL_AURA_CONTROL_VEHICLE, passenger->GetObjectGuid()))
            passenger->ExitVehicle();
    }
    return true;
}
void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data)
{
    sLog.outDebug("WORLD: Recvd CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE");
    recv_data.hexlike();

    VehicleKit* pVehicle = GetPlayer()->GetVehicle();

    ObjectGuid guid, guid2;
    recv_data >> guid.ReadAsPacked();

    MovementInfo mi;
    ReadMovementInfo(recv_data, &mi);
    GetPlayer()->m_movementInfo = mi;

    recv_data >> guid2.ReadAsPacked(); //guid of vehicle or of vehicle in target seat

    int8 seatId;
    recv_data >> seatId;


    if (!pVehicle)
        return;

    if (pVehicle->GetBase()->GetVehicleInfo()->GetEntry()->m_flags & VEHICLE_FLAG_DISABLE_SWITCH)
        GetPlayer()->ExitVehicle();

    if(guid.GetRawValue() == guid2.GetRawValue())
        GetPlayer()->ChangeSeat(seatId, false);

    else if (guid2.IsVehicle())
    {
        if (Creature* vehicle = GetPlayer()->GetMap()->GetAnyTypeCreature(guid2))
        {
            if (VehicleKit* pVehicle2 = vehicle->GetVehicleKit())
                if(pVehicle2->HasEmptySeat(seatId))
                {
                    GetPlayer()->ExitVehicle();
                    GetPlayer()->EnterVehicle(pVehicle2, seatId);
                }
        }
    }
}
Exemple #6
0
void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data)
{
    sLog.outDebug("WORLD: Recvd CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE");
    recv_data.hexlike();

    ObjectGuid guid, guid2;
    recv_data >> guid.ReadAsPacked();

    MovementInfo mi;
    recv_data >> mi;

    recv_data >> guid2.ReadAsPacked(); //guid of vehicle or of vehicle in target seat

    int8 seatId;
    recv_data >> seatId;

    VehicleKit* pVehicle = GetPlayer()->GetVehicle();

    if (!pVehicle)
        return;

    if (pVehicle->GetBase()->GetVehicleInfo()->GetEntry()->m_flags & VEHICLE_FLAG_DISABLE_SWITCH)
        return;

    pVehicle->GetBase()->m_movementInfo = mi;

    if(!guid2 || guid.GetRawValue() == guid2.GetRawValue())
        GetPlayer()->ChangeSeat(seatId);
    // seat to another vehicle or accessory
    else if (guid2.IsVehicle())
    {
        if (Creature* vehicle = GetPlayer()->GetMap()->GetAnyTypeCreature(guid2))
        {
            GetPlayer()->ExitVehicle();
            GetPlayer()->EnterVehicle(vehicle, seatId);
            DEBUG_LOG("WorldSession::HandleChangeSeatsOnControlledVehicle player %s try seat on vehicle %s, seat %u.",GetPlayer()->GetObjectGuid().GetString().c_str(),guid2.GetString().c_str(), seatId);
        }
    }
}
Exemple #7
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();
    }
}