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