void UpdateData::AddOutOfRangeGUID(GuidSet& guids) { m_outOfRangeGUIDs.insert(guids.begin(), guids.end()); }
void WorldSession::SendLfgUpdateProposal(LFGProposal* pProposal) { if (!sWorld.getConfig(CONFIG_BOOL_LFG_ENABLE)) { DEBUG_LOG("SendLfgUpdateProposal %u failed - Dungeon finder disabled", GetPlayer()->GetObjectGuid().GetCounter()); return; } if (!pProposal) return; LFGDungeonEntry const* dungeon = pProposal->GetDungeon(); if (!dungeon) { DEBUG_LOG("SMSG_LFG_PROPOSAL_UPDATE: no dungeon in proposal %u, returning.", pProposal->m_uiID); return; } ObjectGuid guid = GetPlayer()->GetObjectGuid(); bool isSameDungeon = false; bool isSameGroup = false; uint32 completedEncounters = 0; LFGRolesMap rolesMap; if (Group* group = pProposal->GetGroup()) { for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* pGroupMember = itr->getSource(); if (pGroupMember && pGroupMember->IsInWorld()) { rolesMap.insert(std::make_pair(pGroupMember->GetObjectGuid(), pGroupMember->GetLFGPlayerState()->GetRoles())); if (InstancePlayerBind* bind = pGroupMember->GetBoundInstance(dungeon->map, Difficulty(dungeon->difficulty))) { if (DungeonPersistentState* state = bind->state) completedEncounters |= state->GetCompletedEncountersMask(); } } } // isContinue = group->isLFGGroup() && sLFGMgr->GetState(gguid) != LFG_STATE_FINISHED_DUNGEON; isSameDungeon = dungeon->map == GetPlayer()->GetMapId(); isSameGroup = GetPlayer()->GetGroup() == group; } GuidSet const proposalGuids = pProposal->GetMembers(); if (!proposalGuids.empty()) { for (GuidSet::const_iterator itr = proposalGuids.begin(); itr != proposalGuids.end(); ++itr) { Player* player = sObjectMgr.GetPlayer(*itr); if (player && player->IsInWorld()) rolesMap.insert(std::make_pair(player->GetObjectGuid(), player->GetLFGPlayerState()->GetRoles())); } } uint32 size = rolesMap.size(); DEBUG_LOG("SMSG_LFG_PROPOSAL_UPDATE proposal %u, player %u, state: %u", pProposal->m_uiID, GetPlayer()->GetObjectGuid().GetCounter(), pProposal->GetState()); WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + size * (4 + 1 + 1 + 1 + 1 +1)); data << uint32(dungeon->Entry()); // Dungeon data << uint8(pProposal->GetState()); // Result state data << uint32(pProposal->m_uiID); // Internal Proposal ID data << uint32(completedEncounters); // Bosses killed data << uint8(isSameDungeon); // Silent (show client window) data << uint8(size); // Group size for (LFGRolesMap::const_iterator itr = rolesMap.begin(); itr != rolesMap.end(); ++itr) { Player* pPlayer = sObjectMgr.GetPlayer(itr->first); if (!pPlayer) continue; isSameDungeon = dungeon->map == pPlayer->GetMapId(); isSameGroup = pPlayer->GetGroup() == pProposal->GetGroup(); data << uint32(itr->second); // Role data << uint8(pPlayer->GetObjectGuid() == guid); // Self player data << uint8(isSameDungeon); // Not in dungeon data << uint8(isSameGroup); // Not same group data << uint8(pPlayer->GetLFGPlayerState()->GetAnswer() != LFG_ANSWER_PENDING); // Answered data << uint8(pPlayer->GetLFGPlayerState()->GetAnswer() == LFG_ANSWER_AGREE); // Accepted } SendPacket(&data); }
void UpdateEscortAI(const uint32 uiDiff) override { if (!m_pInstance) return; if (m_pInstance->GetData(TYPE_RING_OF_LAW) == FAIL) { // Reset Doors if (m_uiEventPhase >= 10) // North Gate is opened { m_pInstance->DoUseDoorOrButton(GO_ARENA_2); m_pInstance->DoUseDoorOrButton(GO_ARENA_4); } else if (m_uiEventPhase >= 4) // East Gate is opened { m_pInstance->DoUseDoorOrButton(GO_ARENA_1); m_pInstance->DoUseDoorOrButton(GO_ARENA_4); } // Despawn Summoned Mobs for (GuidList::const_iterator itr = m_lSummonedGUIDList.begin(); itr != m_lSummonedGUIDList.end(); ++itr) { if (Creature* pSummoned = m_creature->GetMap()->GetCreature(*itr)) pSummoned->ForcedDespawn(); } m_lSummonedGUIDList.clear(); // Despawn NPC m_creature->ForcedDespawn(); return; } if (m_uiEventTimer) { if (m_uiEventTimer <= uiDiff) { switch (m_uiEventPhase) { case 0: // Shortly after spawn, start walking m_creature->CastSpell(m_creature, SPELL_ASHCROMBES_TELEPORT_A, true); DoScriptText(SAY_START_2, m_creature); m_pInstance->DoUseDoorOrButton(GO_ARENA_4); // Some of the NPCs in the crowd do cheer emote at event start // we randomly select 25% of the NPCs to do this m_pInstance->GetArenaCrowdGuid(m_lArenaCrowd); for (GuidSet::const_iterator itr = m_lArenaCrowd.begin(); itr != m_lArenaCrowd.end(); ++itr) { if (Creature* pSpectator = m_creature->GetMap()->GetCreature(*itr)) { if (urand(0, 1) < 0.25) pSpectator->HandleEmote(EMOTE_ONESHOT_CHEER); } } Start(false); SetEscortPaused(false); m_uiEventTimer = 0; break; case 1: // Start walking towards wall SetEscortPaused(false); m_uiEventTimer = 0; break; case 2: m_uiEventTimer = 2000; break; case 3: // Open East Gate m_creature->CastSpell(m_creature, SPELL_ARENA_FLASH_A, true); m_creature->CastSpell(m_creature, SPELL_ARENA_FLASH_B, true); m_pInstance->DoUseDoorOrButton(GO_ARENA_1); m_uiEventTimer = 3000; break; case 4: // timer for teleport out spell which has 2000 ms cast time m_creature->CastSpell(m_creature, SPELL_ASHCROMBES_TELEPORT_B, true); m_uiEventTimer = 2500; break; case 5: m_creature->SetVisibility(VISIBILITY_OFF); SetEscortPaused(false); // Summon Ring Mob(s) SummonRingMob(aRingMob[m_uiMobSpawnId], POS_EAST); m_uiEventTimer = 8000; break; case 6: // Summon Ring Mob(s) SummonRingMob(aRingMob[m_uiMobSpawnId], POS_EAST); SummonRingMob(aRingMob[m_uiMobSpawnId], POS_EAST); m_uiEventTimer = 8000; break; case 7: // Summon Ring Mob(s) SummonRingMob(aRingMob[m_uiMobSpawnId], POS_EAST); m_uiEventTimer = 0; break; case 8: // Summoned Mobs are dead, continue event DoScriptText(SAY_SUMMON_BOSS_2, m_creature); m_creature->SetVisibility(VISIBILITY_ON); m_creature->CastSpell(m_creature, SPELL_ASHCROMBES_TELEPORT_A, true); m_pInstance->DoUseDoorOrButton(GO_ARENA_1); SetEscortPaused(false); m_uiEventTimer = 0; break; case 9: // Open North Gate m_creature->CastSpell(m_creature, SPELL_ARENA_FLASH_C, true); m_creature->CastSpell(m_creature, SPELL_ARENA_FLASH_D, true); m_pInstance->DoUseDoorOrButton(GO_ARENA_2); m_uiEventTimer = 5000; break; case 10: // timer for teleport out spell which has 2000 ms cast time m_creature->CastSpell(m_creature, SPELL_ASHCROMBES_TELEPORT_B, true); m_uiEventTimer = 2500; break; case 11: // Summon Boss m_creature->SetVisibility(VISIBILITY_OFF); // If banner summoned after start, then summon Thelden after the creatures are dead if (m_pInstance->GetData(TYPE_RING_OF_LAW) == SPECIAL && m_uiPhase == PHASE_MOBS) { m_uiPhase = PHASE_GLADIATORS; SummonRingMob(NPC_THELDREN, POS_NORTH); for (uint8 i = 0; i < MAX_THELDREN_ADDS; ++i) SummonRingMob(m_uiGladiatorId[i], POS_NORTH); } else { m_uiPhase = PHASE_BOSS; SummonRingMob(aRingBoss[urand(0, 5)], POS_NORTH); } m_uiEventTimer = 0; break; case 12: // Boss dead m_lSummonedGUIDList.clear(); m_pInstance->DoUseDoorOrButton(GO_ARENA_2); m_pInstance->DoUseDoorOrButton(GO_ARENA_3); m_pInstance->DoUseDoorOrButton(GO_ARENA_4); SetEscortPaused(false); m_uiEventTimer = 0; break; } ++m_uiEventPhase; } else m_uiEventTimer -= uiDiff; } }