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 (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(); } 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); } } 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; }
bool Vehicle::AddPassenger(Unit *unit, int8 seatId) { if (unit->GetVehicle() != this) return false; 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()) 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) seat->second.passenger->ExitVehicle(); assert(!seat->second.passenger); } sLog.outDebug("Unit %s enter vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), me->GetEntry(), m_vehicleInfo->m_ID, me->GetGUIDLow(), (int32)seat->first); seat->second.passenger = unit; if (seat->second.seatInfo->IsUsable()) { assert(m_usableSeatNum); --m_usableSeatNum; if (!m_usableSeatNum) { if (me->GetTypeId() == TYPEID_PLAYER) me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); else me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); } } if (seat->second.seatInfo->m_flags && !(seat->second.seatInfo->m_flags & 0x400)) unit->addUnitState(UNIT_STAT_ONVEHICLE); //SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); VehicleSeatEntry const *veSeat = seat->second.seatInfo; unit->m_movementInfo.t_x = veSeat->m_attachmentOffsetX; unit->m_movementInfo.t_y = veSeat->m_attachmentOffsetY; unit->m_movementInfo.t_z = veSeat->m_attachmentOffsetZ; unit->m_movementInfo.t_o = 0; unit->m_movementInfo.t_time = 0; // 1 for player unit->m_movementInfo.t_seat = seat->first; if (me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.seatInfo->m_flags & 0x800) // not right if (!me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE)) assert(false); if (me->IsInWorld()) { unit->SendMonsterMoveTransport(me); if (me->GetTypeId() == TYPEID_UNIT) { if (me->ToCreature()->IsAIEnabled) me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, true); // update all passenger's positions RelocatePassengers(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); } } //if (unit->GetTypeId() == TYPEID_PLAYER) // unit->ToPlayer()->SendTeleportAckPacket(); //unit->SendMovementFlagUpdate(); return true; }
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); if (CharmInfo* charmInfo = m_pBase->InitCharmInfo(m_pBase)) { charmInfo->SetState(CHARM_STATE_ACTION,ACTIONS_DISABLE); charmInfo->InitVehicleCreateSpells(seat->first); } 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; }
bool Vehicle::AddPassenger(Unit* unit, int8 seatId) { if(unit->GetVehicle() != this) return false; SeatMap::iterator seat; if(seatId < 0) // no specific seat requirement { for(seat = Seats.begin(); seat != Seats.end(); ++seat) if(!seat->second.Passenger && (seat->second.SeatInfo->CanEnterOrExit() || seat->second.SeatInfo->IsUsableByOverride())) break; if(seat == Seats.end()) // no available seat return false; } else { seat = Seats.find(seatId); if(seat == Seats.end()) return false; if(seat->second.Passenger) { if(Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), seat->second.Passenger)) passenger->ExitVehicle(); else seat->second.Passenger = 0; } ASSERT(!seat->second.Passenger); } sLog->outDebug(LOG_FILTER_VEHICLES, "Unit %s enter vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), _me->GetEntry(), _vehicleInfo->m_ID, _me->GetGUIDLow(), (int32)seat->first); seat->second.Passenger = unit->GetGUID(); if(seat->second.SeatInfo->CanEnterOrExit()) { ASSERT(_usableSeatNum); --_usableSeatNum; if(!_usableSeatNum) { if(_me->GetTypeId() == TYPEID_PLAYER) _me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); else _me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); } } if(seat->second.SeatInfo->m_flags && !(seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK11)) unit->AddUnitState(UNIT_STAT_ONVEHICLE); unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); VehicleSeatEntry const* veSeat = seat->second.SeatInfo; unit->m_movementInfo.t_pos.m_positionX = veSeat->m_attachmentOffsetX; unit->m_movementInfo.t_pos.m_positionY = veSeat->m_attachmentOffsetY; unit->m_movementInfo.t_pos.m_positionZ = veSeat->m_attachmentOffsetZ; unit->m_movementInfo.t_pos.m_orientation = 0; unit->m_movementInfo.t_time = 0; // 1 for player unit->m_movementInfo.t_seat = seat->first; if(_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) { if(!_me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE)) ASSERT(false); } if(_me->IsInWorld()) { unit->SendClearTarget(); // SMSG_BREAK_TARGET unit->SetControlled(true, UNIT_STAT_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_SPLINE_MOVE_ROOT here (for creatures) // also adds MOVEMENTFLAG_ROOT unit->SendMonsterMoveTransport(_me); // SMSG_MONSTER_MOVE_TRANSPORT if(_me->GetTypeId() == TYPEID_UNIT) { if(_me->ToCreature()->IsAIEnabled) _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, true); // update all passenger's positions RelocatePassengers(_me->GetPositionX(), _me->GetPositionY(), _me->GetPositionZ(), _me->GetOrientation()); } } if(GetBase()->GetTypeId() == TYPEID_UNIT) sScriptMgr->OnAddPassenger(this, unit, seatId); return true; }
bool VehicleKit::AddPassenger(Unit *unit, int8 seatId) { if (unit->GetVehicle() != this) return false; 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->m_flags & SF_USABLE)) 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) seat->second.passenger->ExitVehicle(); } seat->second.passenger = unit; if (seat->second.seatInfo->IsUsable()) { ASSERT(m_uiNumFreeSeats); --m_uiNumFreeSeats; if (!m_uiNumFreeSeats) { if (m_pBase->GetTypeId() == TYPEID_PLAYER) m_pBase->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); else m_pBase->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); } } unit->addUnitState(UNIT_STAT_ON_VEHICLE); VehicleSeatEntry const *veSeat = seat->second.seatInfo; float fsize = unit->GetFloatValue(OBJECT_FIELD_SCALE_X); unit->m_movementInfo.SetTransportData(m_pBase->GetGUID(), veSeat->m_attachmentOffsetX, veSeat->m_attachmentOffsetY, veSeat->m_attachmentOffsetZ, veSeat->m_passengerYaw, getMSTime(), seat->first, veSeat); unit->m_movementInfo.AddMovementFlag(MOVEFLAG_ONTRANSPORT); if(seat->second.seatInfo->m_flags & SF_MAIN_RIDER) { m_pBase->GetMotionMaster()->Clear(false); m_pBase->GetMotionMaster()->MoveIdle(); m_pBase->SetCharmerGUID(unit->GetGUID()); unit->SetCharmGUID(m_pBase->GetGUID()); m_pBase->setFaction(unit->getFaction()); if(CharmInfo* charmInfo = m_pBase->InitCharmInfo(m_pBase)) charmInfo->InitVehicleCreateSpells(); if(unit->GetTypeId() == TYPEID_PLAYER) { Player* pl = (Player*)unit; m_pBase->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); pl->SetClientControl(m_pBase, 1); pl->VehicleSpellInitialize(); if(pl->GetGroup()) pl->SetGroupUpdateFlag(GROUP_UPDATE_VEHICLE); } } if(unit->GetTypeId() == TYPEID_PLAYER) { Player* pl = (Player*)unit; pl->GetCamera().SetView(m_pBase); WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10); data << unit->GetPackGUID(); data << uint32((unit->m_movementInfo.GetVehicleSeatFlags() & SF_CAN_CAST) ? 2 : 0); unit->SendMessageToSet(&data, true); } unit->SendMonsterMoveTransport(m_pBase); if(m_pBase->GetTypeId() == TYPEID_UNIT) { RelocatePassengers(m_pBase->GetPositionX(), m_pBase->GetPositionY(), m_pBase->GetPositionZ(), m_pBase->GetOrientation()); if (((Creature*)m_pBase)->AI()) ((Creature*)m_pBase)->AI()->PassengerBoarded(unit, seat->first, true); } return true; }
bool Vehicle::AddPassenger(Unit *unit, int8 seatId, bool byAura) { if (unit->GetVehicle() != this) return false; if (unit->GetTypeId() == TYPEID_PLAYER && unit->GetMap()->IsBattleArena()) return false; SeatMap::iterator seat; if (seatId < 0) // no specific seat requirement { for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) if (!seat->second.passenger && ((!byAura && seat->second.seatInfo->CanEnterOrExit()) || (byAura && seat->second.seatInfo->IsUsableByAura()))) 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) seat->second.passenger->ExitVehicle(); else seat->second.passenger = NULL; ASSERT(!seat->second.passenger); } sLog->outDebug(LOG_FILTER_VEHICLES, "Unit %s enter vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), me->GetEntry(), m_vehicleInfo->m_ID, me->GetGUIDLow(), (int32) seat->first); seat->second.passenger = unit; if (seat->second.seatInfo->CanEnterOrExit()) { ASSERT(m_usableSeatNum); --m_usableSeatNum; if (!m_usableSeatNum) { if (me->GetTypeId() == TYPEID_PLAYER) me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); else me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); } } if (seat->second.seatInfo->m_flags && !(seat->second.seatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK11)) unit->AddUnitState( UNIT_STAT_ONVEHICLE); unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_ROOT); VehicleSeatEntry const *veSeat = seat->second.seatInfo; unit->m_movementInfo.t_pos.m_positionX = veSeat->m_attachmentOffsetX; unit->m_movementInfo.t_pos.m_positionY = veSeat->m_attachmentOffsetY; unit->m_movementInfo.t_pos.m_positionZ = veSeat->m_attachmentOffsetZ; unit->m_movementInfo.t_pos.m_orientation = 0; unit->m_movementInfo.t_time = 0; // 1 for player unit->m_movementInfo.t_seat = seat->first; if (me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.seatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) { if (!me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE)) ASSERT(false); if (VehicleScalingInfo const *scalingInfo = sObjectMgr->GetVehicleScalingInfo(m_vehicleInfo->m_ID)) { Player *plr = unit->ToPlayer(); float averageItemLevel = plr->GetAverageItemLevel(); if (averageItemLevel < scalingInfo->baseItemLevel) averageItemLevel = scalingInfo->baseItemLevel; averageItemLevel -= scalingInfo->baseItemLevel; m_bonusHP = uint32( me->GetMaxHealth() * (averageItemLevel * scalingInfo->scalingFactor)); me->SetMaxHealth(me->GetMaxHealth() + m_bonusHP); me->SetHealth(me->GetHealth() + m_bonusHP); } } if (me->IsInWorld()) { unit->SendMonsterMoveTransport(me); if (me->GetTypeId() == TYPEID_UNIT) { if (me->ToCreature()->IsAIEnabled) me->ToCreature()->AI()->PassengerBoarded( unit, seat->first, true); // update all passenger's positions RelocatePassengers(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); } } unit->DestroyForNearbyPlayers(); unit->UpdateObjectVisibility(false); if (GetBase()->GetTypeId() == TYPEID_UNIT) sScriptMgr->OnAddPassenger(this, unit, seatId); return true; }
bool Vehicle::AddPassenger(Unit *unit, int8 seatId) { if (unit->GetVehicle() != this) return false; 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->CanEnterOrExit() || seat->second.seatInfo->IsUsableByOverride())) 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) { if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), seat->second.passenger)) passenger->ExitVehicle(); else seat->second.passenger = NULL; } ASSERT(!seat->second.passenger); } sLog->outDebug(LOG_FILTER_VEHICLES, "Unit %s enter vehicle entry %u id %u dbguid %u seat %d", unit->GetName(), me->GetEntry(), m_vehicleInfo->m_ID, me->GetGUIDLow(), (int32)seat->first); seat->second.passenger = unit->GetGUID(); if (seat->second.seatInfo->CanEnterOrExit()) { ASSERT(m_usableSeatNum); --m_usableSeatNum; if (!m_usableSeatNum) { if (me->GetTypeId() == TYPEID_PLAYER) me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); else me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); } } if (seat->second.seatInfo->m_flags && !(seat->second.seatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK11)) unit->AddUnitState(UNIT_STAT_ONVEHICLE); unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); VehicleSeatEntry const *veSeat = seat->second.seatInfo; unit->m_movementInfo.t_pos.m_positionX = veSeat->m_attachmentOffsetX; unit->m_movementInfo.t_pos.m_positionY = veSeat->m_attachmentOffsetY; unit->m_movementInfo.t_pos.m_positionZ = veSeat->m_attachmentOffsetZ; unit->m_movementInfo.t_pos.m_orientation = 0; unit->m_movementInfo.t_time = 0; // 1 for player unit->m_movementInfo.t_seat = seat->first; if (me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.seatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) { if (!me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE)) ASSERT(false); // hack: should be done by aura system if (VehicleScalingInfo const *scalingInfo = sObjectMgr->GetVehicleScalingInfo(m_vehicleInfo->m_ID)) { Player *plr = unit->ToPlayer(); float averageItemLevel = plr->GetAverageItemLevel(); if (averageItemLevel < scalingInfo->baseItemLevel) averageItemLevel = scalingInfo->baseItemLevel; averageItemLevel -= scalingInfo->baseItemLevel; float currentHealthPct = float(me->GetHealth() / me->GetMaxHealth()); m_bonusHP = uint32(me->GetMaxHealth() * (averageItemLevel * scalingInfo->scalingFactor)); me->SetMaxHealth(me->GetMaxHealth() + m_bonusHP); me->SetHealth(uint32((me->GetHealth() + m_bonusHP) * currentHealthPct)); } } if (me->IsInWorld()) { unit->SendClearTarget(); // SMSG_BREAK_TARGET unit->SetControlled(true, UNIT_STAT_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_SPLINE_MOVE_ROOT here (for creatures) // also adds MOVEMENTFLAG_ROOT unit->SendMonsterMoveTransport(me); // SMSG_MONSTER_MOVE_TRANSPORT if (me->GetTypeId() == TYPEID_UNIT) { if (me->ToCreature()->IsAIEnabled) me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, true); // update all passenger's positions RelocatePassengers(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); } } if (GetBase()->GetTypeId() == TYPEID_UNIT) sScriptMgr->OnAddPassenger(this, unit, seatId); return true; }
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); 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, 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 (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->GetGUID()); m_pBase->addUnitState(UNIT_STAT_CONTROLLED); passenger->SetCharm(m_pBase); if (passenger->GetTypeId() == TYPEID_PLAYER) { m_pBase->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); 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(); } passenger->SendMonsterMoveTransport(m_pBase, SPLINETYPE_FACINGANGLE, SPLINEFLAG_UNKNOWN5, 0, 0.0f); if (m_pBase->GetTypeId() == TYPEID_UNIT) RelocatePassengers(m_pBase->GetPositionX(), m_pBase->GetPositionY(), m_pBase->GetPositionZ(), m_pBase->GetOrientation()); UpdateFreeSeatCount(); return true; }
bool VehicleKit::AddPassenger(Unit *unit, 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()) 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) seat->second.passenger->ExitVehicle(); } seat->second.passenger = unit; if (seat->second.seatInfo->IsUsable()) { ASSERT(m_uiNumFreeSeats); --m_uiNumFreeSeats; if (!m_uiNumFreeSeats) { if (m_pBase->GetTypeId() == TYPEID_PLAYER) m_pBase->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PLAYER_VEHICLE); else m_pBase->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); } } unit->addUnitState(UNIT_STAT_ON_VEHICLE); VehicleSeatEntry const *veSeat = seat->second.seatInfo; unit->m_movementInfo.AddMovementFlag(MOVEFLAG_ONTRANSPORT); unit->m_movementInfo.SetTransportData(m_pBase->GetGUID(), veSeat->m_attachmentOffsetX, veSeat->m_attachmentOffsetY, veSeat->m_attachmentOffsetZ, veSeat->m_passengerYaw, getMSTime(), seat->first, veSeat); if (unit->GetTypeId() == TYPEID_PLAYER) { //((Player*)unit)->GetCamera().SetView(m_pBase); WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8+4); data << unit->GetPackGUID(); data << uint32((unit->m_movementInfo.GetVehicleSeatFlags() & SEAT_FLAG_CAN_CAST) ? 2 : 0); unit->SendMessageToSet(&data, true); } unit->SendMonsterMoveTransport(m_pBase); if (m_pBase->GetTypeId() == TYPEID_UNIT) RelocatePassengers(m_pBase->GetPositionX(), m_pBase->GetPositionY(), m_pBase->GetPositionZ(), m_pBase->GetOrientation()); return true; }