void VehicleKit::Reset() { RemoveAllPassengers(); InstallAllAccessories(m_pBase->GetEntry()); UpdateFreeSeatCount(); }
bool VehicleKit::AddPassenger(Unit *passenger, int8 seatId) { SeatMap::iterator seat; if (seatId < 0) // no specific seat requirement { for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) { if (!seat->second.passenger && (seat->second.seatInfo->IsUsable() || (seat->second.seatInfo->m_flags & SEAT_FLAG_UNCONTROLLED))) break; } if (seat == m_Seats.end()) // no available seat return false; } else { seat = m_Seats.find(seatId); if (seat == m_Seats.end()) return false; if (seat->second.passenger) return false; } VehicleSeatEntry const* seatInfo = seat->second.seatInfo; seat->second.passenger = passenger; if (!(seatInfo->m_flags & SEAT_FLAG_FREE_ACTION)) passenger->addUnitState(UNIT_STAT_ON_VEHICLE); m_pBase->SetPhaseMask(passenger->GetPhaseMask(), true); passenger->m_movementInfo.ClearTransportData(); passenger->m_movementInfo.AddMovementFlag(MOVEFLAG_ONTRANSPORT); if (GetBase()->m_movementInfo.HasMovementFlag(MOVEFLAG_ONTRANSPORT)) { passenger->m_movementInfo.SetTransportData(GetBase()->m_movementInfo.GetTransportGuid(), // passenger->m_movementInfo.SetTransportData(GetBase()->GetObjectGuid(), seatInfo->m_attachmentOffsetX + GetBase()->m_movementInfo.GetTransportPos()->x, seatInfo->m_attachmentOffsetY + GetBase()->m_movementInfo.GetTransportPos()->y, seatInfo->m_attachmentOffsetZ + GetBase()->m_movementInfo.GetTransportPos()->z, seatInfo->m_passengerYaw + GetBase()->m_movementInfo.GetTransportPos()->o, WorldTimer::getMSTime(), seat->first, seatInfo); DEBUG_LOG("VehicleKit::AddPassenger passenger %s transport offset on %s setted to %f %f %f %f (parent - %s)", passenger->GetObjectGuid().GetString().c_str(), passenger->m_movementInfo.GetTransportGuid().GetString().c_str(), passenger->m_movementInfo.GetTransportPos()->x, passenger->m_movementInfo.GetTransportPos()->y, passenger->m_movementInfo.GetTransportPos()->z, passenger->m_movementInfo.GetTransportPos()->o, GetBase()->m_movementInfo.GetTransportGuid().GetString().c_str()); } else if (passenger->GetTypeId() == TYPEID_UNIT && b_dstSet) { passenger->m_movementInfo.SetTransportData(m_pBase->GetObjectGuid(), seatInfo->m_attachmentOffsetX + m_dst_x, seatInfo->m_attachmentOffsetY + m_dst_y, seatInfo->m_attachmentOffsetZ + m_dst_z, seatInfo->m_passengerYaw + m_dst_o, WorldTimer::getMSTime(), seat->first, seatInfo); } else { passenger->m_movementInfo.SetTransportData(m_pBase->GetObjectGuid(), seatInfo->m_attachmentOffsetX, seatInfo->m_attachmentOffsetY, seatInfo->m_attachmentOffsetZ, seatInfo->m_passengerYaw, WorldTimer::getMSTime(), seat->first, seatInfo); } if (passenger->GetTypeId() == TYPEID_PLAYER) { ((Player*)passenger)->GetCamera().SetView(m_pBase); WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8+4); data << passenger->GetPackGUID(); data << uint32((passenger->m_movementInfo.GetVehicleSeatFlags() & SEAT_FLAG_CAN_CAST) ? 2 : 0); passenger->SendMessageToSet(&data, true); } if (seat->second.IsProtectPassenger()) { switch (m_pBase->GetEntry()) { case 33651: // VX 001 case 33432: // Leviathan MX case 33118: // Ignis (Ulduar) case 32934: // Kologarn Right Arm (Ulduar) case 30234: // Nexus Lord's Hover Disk (Eye of Eternity, Malygos Encounter) case 30248: // Scion's of Eternity Hover Disk (Eye of Eternity, Malygos Encounter) break; case 28817: default: passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); break; } passenger->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); } if (seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { if (!(m_pBase->GetVehicleInfo()->GetEntry()->m_flags & (VEHICLE_FLAG_ACCESSORY))) { m_pBase->StopMoving(); m_pBase->GetMotionMaster()->Clear(); m_pBase->CombatStop(true); } m_pBase->DeleteThreatList(); m_pBase->getHostileRefManager().deleteReferences(); m_pBase->SetCharmerGuid(passenger->GetObjectGuid()); m_pBase->addUnitState(UNIT_STAT_CONTROLLED); passenger->SetCharm(m_pBase); if (m_pBase->HasAuraType(SPELL_AURA_FLY) || m_pBase->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED)) { WorldPacket data; data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); data << m_pBase->GetPackGUID(); data << (uint32)(0); m_pBase->SendMessageToSet(&data,false); } if (passenger->GetTypeId() == TYPEID_PLAYER) { m_pBase->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); // patch vehicle faction on control if(m_pBase->GetMap() && !m_pBase->GetMap()->IsBattleGround()) m_pBase->setFaction(passenger->getFaction()); // if (CharmInfo* charmInfo = m_pBase->InitCharmInfo(m_pBase)) { charmInfo->InitVehicleCreateSpells(seat->first); charmInfo->SetReactState(REACT_PASSIVE); } Player* player = (Player*)passenger; player->SetMover(m_pBase); player->SetClientControl(m_pBase, 1); player->VehicleSpellInitialize(); } if(!(((Creature*)m_pBase)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_KEEP_AI)) ((Creature*)m_pBase)->AIM_Initialize(); if (m_pBase->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) { WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 8+4); data2 << m_pBase->GetPackGUID(); data2 << (uint32)(2); m_pBase->SendMessageToSet(&data2,false); } else if (passenger->m_movementInfo.GetMovementFlags() & MOVEFLAG_WALK_MODE) ((Creature*)m_pBase)->SetWalk(true); else ((Creature*)m_pBase)->SetWalk(false); } else if (seatInfo->m_flags & SEAT_FLAG_FREE_ACTION || seatInfo->m_flags & SEAT_FLAG_CAN_ATTACK) { if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* player = (Player*)passenger; player->SetClientControl(m_pBase, 0); } } passenger->SendMonsterMoveTransport(m_pBase, SPLINETYPE_FACINGANGLE, SPLINEFLAG_UNKNOWN5, 0, 0.0f); RelocatePassengers(m_pBase->GetPositionX(), m_pBase->GetPositionY(), m_pBase->GetPositionZ()+0.5f, m_pBase->GetOrientation()); UpdateFreeSeatCount(); if (m_pBase->GetTypeId() == TYPEID_UNIT) { if (((Creature*)m_pBase)->AI()) ((Creature*)m_pBase)->AI()->PassengerBoarded(passenger, seat->first, true); } if (b_dstSet && seatInfo->m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE_FORCED) { uint32 delay = seatInfo->m_exitMaxDuration * IN_MILLISECONDS; m_pBase->AddEvent(new PassengerEjectEvent(seatId,*m_pBase), delay); DEBUG_LOG("Vehicle::AddPassenger eject event for %s added, delay %u",passenger->GetObjectGuid().GetString().c_str(), delay); } return true; }
void VehicleKit::RemovePassenger(Unit *passenger, bool dismount) { SeatMap::iterator seat; for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) if (seat->second.passenger == passenger) break; if (seat == m_Seats.end()) return; seat->second.passenger = NULL; passenger->clearUnitState(UNIT_STAT_ON_VEHICLE); passenger->m_movementInfo.ClearTransportData(); passenger->m_movementInfo.RemoveMovementFlag(MOVEFLAG_ONTRANSPORT); if (seat->second.IsProtectPassenger()) if (passenger->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); if (seat->second.seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { passenger->SetCharm(NULL); passenger->RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE); m_pBase->SetCharmerGuid(ObjectGuid()); m_pBase->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); m_pBase->clearUnitState(UNIT_STAT_CONTROLLED); if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* player = (Player*)passenger; player->SetClientControl(m_pBase, 0); player->RemovePetActionBar(); } if(!(((Creature*)m_pBase)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_KEEP_AI)) ((Creature*)m_pBase)->AIM_Initialize(); } if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* player = (Player*)passenger; player->GetCamera().ResetView(); WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8+4); data << passenger->GetPackGUID(); data << uint32(2); passenger->SendMessageToSet(&data, true); player->SetMover(player); } UpdateFreeSeatCount(); if (m_pBase->GetTypeId() == TYPEID_UNIT) { if (((Creature*)m_pBase)->AI()) ((Creature*)m_pBase)->AI()->PassengerBoarded(passenger, seat->first, false); } if (dismount) { Dismount(passenger, seat->second.seatInfo); // only for flyable vehicles if (m_pBase->m_movementInfo.HasMovementFlag(MOVEFLAG_FLYING)) m_pBase->CastSpell(passenger, 45472, true); // Parachute } }
void VehicleKit::RemovePassenger(Unit *passenger) { SeatMap::iterator seat; for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) if (seat->second.passenger == passenger) break; if (seat == m_Seats.end()) return; seat->second.passenger = NULL; passenger->clearUnitState(UNIT_STAT_ON_VEHICLE); float px, py, pz, po; m_pBase->GetClosePoint(px, py, pz, m_pBase->GetObjectBoundingRadius(), 2.0f, M_PI_F); po = m_pBase->GetOrientation(); passenger->m_movementInfo.ClearTransportData(); passenger->m_movementInfo.RemoveMovementFlag(MOVEFLAG_ONTRANSPORT); if (seat->second.seatInfo->m_flags & SEAT_FLAG_UNATTACKABLE || seat->second.seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } if (seat->second.seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { passenger->SetCharm(NULL); passenger->RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE); m_pBase->SetCharmerGuid(ObjectGuid()); m_pBase->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); m_pBase->clearUnitState(UNIT_STAT_CONTROLLED); m_pBase->setFaction(((Creature*)m_pBase)->GetCreatureInfo()->faction_A); if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* player = (Player*)passenger; player->SetMover(NULL); player->SetClientControl(m_pBase, 0); player->RemovePetActionBar(); } ((Creature*)m_pBase)->AIM_Initialize(); } if (passenger->GetTypeId() == TYPEID_PLAYER) { ((Player*)passenger)->GetCamera().ResetView(); WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8+4); data << passenger->GetPackGUID(); data << uint32(2); passenger->SendMessageToSet(&data, true); ((Player*)passenger)->ResummonPetTemporaryUnSummonedIfAny(); } passenger->UpdateAllowedPositionZ(px, py, pz); passenger->SetPosition(px, py, pz + 0.5f, po); UpdateFreeSeatCount(); if (m_pBase->GetTypeId() == TYPEID_UNIT) { if (((Creature*)m_pBase)->AI()) ((Creature*)m_pBase)->AI()->PassengerBoarded(passenger, seat->first, false); } }
void VehicleKit::Reset() { InstallAllAccessories(m_pBase->GetEntry()); UpdateFreeSeatCount(); }
bool VehicleKit::AddPassenger(Unit *passenger, int8 seatId) { SeatMap::iterator seat; if (seatId < 0) // no specific seat requirement { for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) if (!seat->second.passenger && (seat->second.seatInfo->IsUsable() || (seat->second.seatInfo->m_flags & SEAT_FLAG_UNCONTROLLED))) break; if (seat == m_Seats.end()) // no available seat return false; } else { seat = m_Seats.find(seatId); if (seat == m_Seats.end()) return false; if (seat->second.passenger) return false; } seat->second.passenger = passenger; passenger->addUnitState(UNIT_STAT_ON_VEHICLE); m_pBase->SetPhaseMask(passenger->GetPhaseMask(), true); VehicleSeatEntry const *seatInfo = seat->second.seatInfo; passenger->m_movementInfo.AddMovementFlag(MOVEFLAG_ONTRANSPORT); passenger->m_movementInfo.SetTransportData(m_pBase->GetGUID(), seatInfo->m_attachmentOffsetX, seatInfo->m_attachmentOffsetY, seatInfo->m_attachmentOffsetZ, seatInfo->m_passengerYaw, WorldTimer::getMSTime(), seat->first, seatInfo); if (passenger->GetTypeId() == TYPEID_PLAYER) { ((Player*)passenger)->UnsummonPetTemporaryIfAny(); ((Player*)passenger)->GetCamera().SetView(m_pBase); WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8+4); data << passenger->GetPackGUID(); data << uint32((passenger->m_movementInfo.GetVehicleSeatFlags() & SEAT_FLAG_CAN_CAST) ? 2 : 0); passenger->SendMessageToSet(&data, true); } if (seat->second.seatInfo->m_flags & SEAT_FLAG_UNATTACKABLE || seat->second.seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); passenger->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); } if (seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { m_pBase->StopMoving(); m_pBase->GetMotionMaster()->Clear(); m_pBase->CombatStop(true); m_pBase->DeleteThreatList(); m_pBase->getHostileRefManager().deleteReferences(); m_pBase->SetCharmerGuid(passenger->GetObjectGuid()); m_pBase->addUnitState(UNIT_STAT_CONTROLLED); passenger->SetCharm(m_pBase); if(m_pBase->HasAuraType(SPELL_AURA_FLY) || m_pBase->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED)) { WorldPacket data; data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); data << m_pBase->GetPackGUID(); data << (uint32)(0); m_pBase->SendMessageToSet(&data,false); } if (passenger->GetTypeId() == TYPEID_PLAYER) { m_pBase->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); if(m_pBase->GetMap() && !m_pBase->GetMap()->IsBattleGround()) m_pBase->setFaction(passenger->getFaction()); if (CharmInfo* charmInfo = m_pBase->InitCharmInfo(m_pBase)) { charmInfo->InitVehicleCreateSpells(); charmInfo->SetReactState(REACT_PASSIVE); } Player* player = (Player*)passenger; player->SetMover(m_pBase); player->SetClientControl(m_pBase, 1); player->VehicleSpellInitialize(); } ((Creature*)m_pBase)->AIM_Initialize(); if(m_pBase->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) { WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 8+4); data2 << m_pBase->GetPackGUID(); data2 << (uint32)(2); m_pBase->SendMessageToSet(&data2,false); } } passenger->SendMonsterMoveTransport(m_pBase, SPLINETYPE_FACINGANGLE, SPLINEFLAG_UNKNOWN5, 0, 0.0f); RelocatePassengers(m_pBase->GetPositionX(), m_pBase->GetPositionY(), m_pBase->GetPositionZ()+0.5f, m_pBase->GetOrientation()); UpdateFreeSeatCount(); if (m_pBase->GetTypeId() == TYPEID_UNIT) { if (((Creature*)m_pBase)->AI()) ((Creature*)m_pBase)->AI()->PassengerBoarded(passenger, seat->first, true); } return true; }
void VehicleKit::Initialize(uint32 creatureEntry) { InstallAllAccessories(creatureEntry ? creatureEntry : GetBase()->GetEntry()); UpdateFreeSeatCount(); m_isInitialized = true; }
void VehicleKit::Reset() { RemoveAllPassengers(); UpdateFreeSeatCount(); m_isInitialized = false; }
void VehicleKit::RemovePassenger(Unit* passenger, bool dismount /*false*/) { SeatMap::iterator seat; for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) { if (seat->second.passenger == passenger->GetObjectGuid()) break; } if (seat == m_Seats.end()) return; seat->second.passenger.Clear(); passenger->clearUnitState(UNIT_STAT_ON_VEHICLE); UnBoardPassenger(passenger); // Use TransportBase to remove the passenger from storage list if (seat->second.IsProtectPassenger()) { if (passenger->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } if (seat->second.seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { passenger->SetCharm(NULL); passenger->RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE); GetBase()->SetCharmerGuid(ObjectGuid()); GetBase()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); GetBase()->clearUnitState(UNIT_STAT_CONTROLLED); if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* player = (Player*)passenger; player->SetClientControl(GetBase(), 0); player->RemovePetActionBar(); } // Allow to keep AI of controlled vehicle with CREATURE_FLAG_EXTRA_KEEP_AI extra-flag if (!(((Creature*)GetBase())->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_KEEP_AI)) ((Creature*)GetBase())->AIM_Initialize(); } if (passenger->GetTypeId() == TYPEID_PLAYER) { Player* player = (Player*)passenger; player->SetViewPoint(NULL); passenger->SetRoot(false); player->SetMover(player); player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_ROOT); if ((GetBase()->HasAuraType(SPELL_AURA_FLY) || GetBase()->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED) || (GetBase()->GetTypeId() == TYPEID_UNIT && ((Creature*)GetBase())->CanFly())) && (!player->HasAuraType(SPELL_AURA_FLY) && !player->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED))) { WorldPacket dataCF(SMSG_MOVE_UNSET_CAN_FLY, 8 + 4); dataCF << player->GetPackGUID(); dataCF << uint32(0); GetBase()->SendMessageToSet(&dataCF, false); player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_FLYING); player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_CAN_FLY); } if (GetBase()->IsLevitating()) player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_LEVITATING); } UpdateFreeSeatCount(); if (GetBase()->GetTypeId() == TYPEID_UNIT) { if (((Creature*)GetBase())->AI()) ((Creature*)GetBase())->AI()->PassengerBoarded(passenger, seat->first, false); } if (passenger->GetTypeId() == TYPEID_UNIT) { if (((Creature*)passenger)->AI()) { ((Creature*)passenger)->AI()->EnteredVehicle(GetBase(), seat->first, false); ((Creature*)passenger)->AI()->SetCombatMovement(true, true); } } if (dismount && seat->second.b_dismount) { Dismount(passenger, seat->second.seatInfo); // only for flyable vehicles if (GetBase()->m_movementInfo.HasMovementFlag(MOVEFLAG_FLYING)) GetBase()->CastSpell(passenger, 45472, true); // Parachute } }
bool VehicleKit::AddPassenger(Unit* passenger, int8 seatId) { SeatMap::iterator seat; if (seatId < 0) // no specific seat requirement { for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) { if (!seat->second.passenger && (seat->second.seatInfo->IsUsable() || (seat->second.seatInfo->m_flags & SEAT_FLAG_UNCONTROLLED))) break; } if (seat == m_Seats.end()) // no available seat return false; } else { seat = m_Seats.find(seatId); if (seat == m_Seats.end()) return false; if (seat->second.passenger) return false; } VehicleSeatEntry const* seatInfo = seat->second.seatInfo; seat->second.passenger = passenger->GetObjectGuid(); seat->second.b_dismount = true; if (!(seatInfo->m_flags & SEAT_FLAG_FREE_ACTION)) passenger->addUnitState(UNIT_STAT_ON_VEHICLE); GetBase()->SetPhaseMask(passenger->GetPhaseMask(), true); // Calculate passengers local position Position localPos = CalculateBoardingPositionOf(passenger->GetPosition()); BoardPassenger(passenger, localPos, seat->first); // Use TransportBase to store the passenger if (passenger->GetTypeId() == TYPEID_PLAYER) { ((Player*)passenger)->SetViewPoint(GetBase()); passenger->SetRoot(true); } if (seat->second.IsProtectPassenger()) { // make passenger attackable in some vehicles and allow him to cast when sitting on vehicle switch (GetBase()->GetEntry()) { case 30234: // Nexus Lord's Hover Disk (Eye of Eternity, Malygos Encounter) case 30248: // Scion's of Eternity Hover Disk (Eye of Eternity, Malygos Encounter) case 33118: // Ignis (Ulduar) case 33432: // Leviathan MX case 33651: // VX 001 break; // case 28817: // Mine Car (quest Massacre At Light's Point) // case 28864: // Scourge Gryphon (quest Massacre At Light's Point) default: passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); break; } passenger->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); } if (seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { if (!(GetEntry()->m_flags & VEHICLE_FLAG_ACCESSORY)) { GetBase()->StopMoving(); GetBase()->GetMotionMaster()->Clear(); GetBase()->CombatStop(true); } GetBase()->DeleteThreatList(); GetBase()->getHostileRefManager().deleteReferences(); GetBase()->SetCharmerGuid(passenger->GetObjectGuid()); GetBase()->addUnitState(UNIT_STAT_CONTROLLED); passenger->SetCharm(GetBase()); if (GetBase()->HasAuraType(SPELL_AURA_FLY) || GetBase()->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED) || (GetBase()->GetTypeId() == TYPEID_UNIT && ((Creature*)GetBase())->CanFly())) { WorldPacket data(SMSG_MOVE_SET_CAN_FLY, 8 + 4); data << GetBase()->GetPackGUID(); data << uint32(0); GetBase()->SendMessageToSet(&data, false); } if (passenger->GetTypeId() == TYPEID_PLAYER) { GetBase()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); if (CharmInfo* charmInfo = GetBase()->InitCharmInfo(GetBase())) { charmInfo->SetState(CHARM_STATE_ACTION,ACTIONS_DISABLE); charmInfo->InitVehicleCreateSpells(seat->first); } Player* player = (Player*)passenger; player->SetMover(GetBase()); player->SetClientControl(GetBase(), 1); player->VehicleSpellInitialize(); } // Allow to keep AI of controlled vehicle with CREATURE_FLAG_EXTRA_KEEP_AI extra-flag if (!(((Creature*)GetBase())->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_KEEP_AI)) ((Creature*)GetBase())->AIM_Initialize(); if (GetBase()->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) { GetBase()->SetRoot(true); } // Set owner's speedrate to vehicle at board. else if (passenger->IsWalking() && !GetBase()->IsWalking()) ((Creature*)GetBase())->SetWalk(true, true); else if (!passenger->IsWalking() && GetBase()->IsWalking()) ((Creature*)GetBase())->SetWalk(false, true); } else if ((seatInfo->m_flags & SEAT_FLAG_FREE_ACTION) || (seatInfo->m_flags & SEAT_FLAG_CAN_ATTACK)) { if (passenger->GetTypeId() == TYPEID_PLAYER) ((Player*)passenger)->SetClientControl(GetBase(), 0); } // Calculate passenger seat position (FIXME - requires correct calculation!) Position seatpos = CalculateSeatPositionOf(seatInfo); passenger->GetMotionMaster()->MoveBoardVehicle(seatpos.x, seatpos.y, seatpos.z, seatpos.o, seatInfo->m_enterSpeed < M_NULL_F ? BASE_CHARGE_SPEED : seatInfo->m_enterSpeed, 0.0f); UpdateFreeSeatCount(); if (GetBase()->GetTypeId() == TYPEID_UNIT) { if (((Creature*)GetBase())->AI()) ((Creature*)GetBase())->AI()->PassengerBoarded(passenger, seat->first, true); } if (passenger->GetTypeId() == TYPEID_UNIT) { if (((Creature*)passenger)->AI()) { ((Creature*)passenger)->AI()->SetCombatMovement(false); ((Creature*)passenger)->AI()->EnteredVehicle(GetBase(), seat->first, true); } // Not entirely sure how this must be handled in relation to CONTROL // But in any way this at least would require some changes in the movement system most likely passenger->GetMotionMaster()->Clear(false, true); passenger->GetMotionMaster()->MoveIdle(); } if (b_dstSet && (seatInfo->m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE_FORCED)) { uint32 delay = seatInfo->m_exitMaxDuration * IN_MILLISECONDS; GetBase()->AddEvent(new PassengerEjectEvent(seatId, *GetBase()), delay); DEBUG_LOG("Vehicle::AddPassenger eject event for %s added, delay %u", passenger->GetGuidStr().c_str(), delay); } DEBUG_LOG("VehicleKit::AddPassenger passenger %s boarded on %s, transport offset %f %f %f %f (parent - %s)", passenger->GetGuidStr().c_str(), passenger->m_movementInfo.GetTransportGuid().GetString().c_str(), passenger->m_movementInfo.GetTransportPos()->x, passenger->m_movementInfo.GetTransportPos()->y, passenger->m_movementInfo.GetTransportPos()->z, passenger->m_movementInfo.GetTransportPos()->o, GetBase()->m_movementInfo.GetTransportGuid().IsEmpty() ? "<none>" : GetBase()->m_movementInfo.GetTransportGuid().GetString().c_str()); return true; }