// Function to search for new tubber in range
    void DoFindNewTubber()
    {
        std::list<GameObject*> lTubbersInRange;
        GetGameObjectListWithEntryInGrid(lTubbersInRange, m_creature, GO_BLUELEAF_TUBBER, 40.0f);

        if (lTubbersInRange.empty())
            return;

        lTubbersInRange.sort(ObjectDistanceOrder(m_creature));
        GameObject* pNearestTubber = nullptr;

        // Always need to find new ones
        for (std::list<GameObject*>::const_iterator itr = lTubbersInRange.begin(); itr != lTubbersInRange.end(); ++itr)
        {
            if (!(*itr)->isSpawned() && (*itr)->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND) && (*itr)->IsWithinLOSInMap(m_creature))
            {
                pNearestTubber = *itr;
                break;
            }
        }

        if (!pNearestTubber)
            return;
        m_targetTubberGuid = pNearestTubber->GetObjectGuid();

        float fX, fY, fZ;
        pNearestTubber->GetContactPoint(m_creature, fX, fY, fZ);
        m_creature->GetMotionMaster()->MovePoint(1, fX, fY, fZ);
        m_bIsMovementActive = true;
    }
Exemple #2
0
void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket*/)
{
    DEBUG_LOG("WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY");

    uint32 count = 0;

    WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4);
    data << uint32(count);                                  // placeholder

    for(ObjectGuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr)
    {
        uint8 dialogStatus = DIALOG_STATUS_NONE;

        if (itr->IsAnyTypeCreature())
        {
            // need also pet quests case support
            Creature *questgiver = GetPlayer()->GetMap()->GetAnyTypeCreature(*itr);

            if (!questgiver || questgiver->IsHostileTo(_player))
                continue;

            if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER))
                continue;

            dialogStatus = sScriptMgr.GetDialogStatus(_player, questgiver);

            if (dialogStatus > DIALOG_STATUS_REWARD_REP)
                dialogStatus = getDialogStatus(_player, questgiver, DIALOG_STATUS_NONE);

            data << questgiver->GetObjectGuid();
            data << uint8(dialogStatus);
            ++count;
        }
        else if (itr->IsGameObject())
        {
            GameObject *questgiver = GetPlayer()->GetMap()->GetGameObject(*itr);

            if (!questgiver)
                continue;

            if (questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
                continue;

            dialogStatus = sScriptMgr.GetDialogStatus(_player, questgiver);

            if (dialogStatus > DIALOG_STATUS_REWARD_REP)
                dialogStatus = getDialogStatus(_player, questgiver, DIALOG_STATUS_NONE);

            data << questgiver->GetObjectGuid();
            data << uint8(dialogStatus);
            ++count;
        }
    }

    data.put<uint32>(0, count);                             // write real count
    SendPacket(&data);
}
list<ObjectGuid> NearestGameObjects::Calculate()
{
    list<GameObject*> targets;

    AnyGameObjectInObjectRangeCheck u_check(bot, range);
    GameObjectListSearcher<AnyGameObjectInObjectRangeCheck> searcher(targets, u_check);
    Cell::VisitAllObjects((const WorldObject*)bot, searcher, range);

    list<ObjectGuid> result;
    for(list<GameObject*>::iterator tIter = targets.begin(); tIter != targets.end(); ++tIter)
    {
        GameObject* go = *tIter;
        if(bot->IsWithinLOSInMap(go))
            result.push_back(go->GetObjectGuid());
    }

    return result;
}
    void OnCreatureEnterCombat(Creature * pCreature)
    {
        switch (pCreature->GetEntry())
        {
            case NPC_CAPTAIN_QEEZ:
            case NPC_CAPTAIN_TUUBID:
            case NPC_CAPTAIN_DRENN:
            case NPC_CAPTAIN_XURREM:
            case NPC_MAJOR_YEGGETH:
            case NPC_MAJOR_PAKKON:
            case NPC_COLONEL_ZERRAN:
            case NPC_SWARMGUARD_NEEDLER:
            case NPC_QIRAJI_WARRIOR:
                /** Create Yeggeth list for Rajaxx Shield ability */
                if (CreatureGroup* g = pCreature->GetCreatureGroup())
                    if (g->GetLeaderGuid().GetEntry() == NPC_MAJOR_YEGGETH)
                        m_lYeggethShieldList.push_back(pCreature->GetGUID());
                // If any creature from Rajaxx's wave enters combat, start Rajaxx event.
                if (m_auiEncounter[TYPE_RAJAXX] == NOT_STARTED)
                    SetData(TYPE_RAJAXX, IN_PROGRESS);
                m_bRajaxxEventIsToReset = false;
            // no break
            case NPC_KURINNAXX:
            case NPC_RAJAXX:
            case NPC_BURU:
            case NPC_MOAM:
            case NPC_AYAMISS:
            case NPC_OSSIRIAN:
                if (!m_bIsAQDoorOn)
                {
                    GameObject *pAQDoor = pCreature->SummonGameObject(176149,
                                          -8526,
                                          1507.4f,
                                          49,
                                          4.20662f, 0, 0, 0.861534f, -0.5077f, -1, false);

                    p_doorGuid = pAQDoor->GetObjectGuid();
                    m_bIsAQDoorOn = true;
                }
                break;
            default:
                break;
        }
    }