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); } } }
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); } } } }
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); } } }
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(); } }