// Note: This seems like a very complicated fix. The fix needs to be handled by the core, as implementation of limited-target AoE spells are still not limited. void CastBloodboil() { std::list<Unit *> targets; Map *map = m_creature->GetMap(); if(map->IsDungeon()) { InstanceMap::PlayerList const &PlayerList = ((InstanceMap*)map)->GetPlayers(); for (InstanceMap::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { if (Player* i_pl = i->getSource()) { if(i_pl && i_pl->isAlive()) targets.push_back(i_pl); } } } //Sort the list of players targets.sort(ObjectDistanceOrderReversed(m_creature)); //Resize so we only get top 5 targets.resize(5); //Aura each player in the targets list with Bloodboil. for(std::list<Unit *>::iterator itr = targets.begin(); itr != targets.end(); ++itr) { Unit* target = *itr; if(target && target->isAlive()) m_creature->AddAura(SPELL_BLOODBOIL, target); } targets.clear(); }
Unit* SelectRandomRangedTarget(Unit *pSource) { Unit *pResult = NULL; std::list<Unit*> lTargets; ThreatList const& tList = m_creature->getThreatManager().getThreatList(); for (ThreatList::const_iterator i = tList.begin();i != tList.end(); ++i) { if (!(*i)->getUnitGuid().IsPlayer()) continue; if (Unit* pTmp = m_creature->GetMap()->GetUnit((*i)->getUnitGuid())) lTargets.push_back(pTmp); } if (!lTargets.empty()) { uint8 max = m_bIs25Man ? 1 : 1; std::list<Unit*>::iterator iter; lTargets.sort(ObjectDistanceOrderReversed(pSource)); iter = lTargets.begin(); if (max >= lTargets.size()) max = lTargets.size() - 1; std::advance(iter, urand(0, max)); pResult = (*iter); } return pResult; }
void SummonAdds(bool bRightSide, uint32 uiSummonEntry) { std::list<Creature*> lSummonList; m_pInstance->GetGothSummonPointCreatures(lSummonList, bRightSide); if (lSummonList.empty()) return; uint8 uiCount = 2; switch(uiSummonEntry) { case NPC_UNREL_TRAINEE: lSummonList.sort(ObjectDistanceOrder(m_creature)); break; case NPC_UNREL_DEATH_KNIGHT: case NPC_UNREL_RIDER: uiCount = 1; lSummonList.sort(ObjectDistanceOrderReversed(m_creature)); break; } for(std::list<Creature*>::iterator itr = lSummonList.begin(); itr != lSummonList.end(); ++itr) { if (uiCount == 0) break; m_creature->SummonCreature(uiSummonEntry, (*itr)->GetPositionX(), (*itr)->GetPositionY(), (*itr)->GetPositionZ(), (*itr)->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); --uiCount; } }
void PrepareSummonPlaces() { std::list<Creature*> lSummonList; m_pInstance->GetGothSummonPointCreatures(lSummonList, true); if (lSummonList.empty()) { return; } // Trainees and Rider uint8 index = 0; uint8 uiTraineeCount = 3; lSummonList.sort(ObjectDistanceOrder(m_creature)); for (std::list<Creature*>::iterator itr = lSummonList.begin(); itr != lSummonList.end(); ++itr) { if (*itr) { if (uiTraineeCount == 0) { break; } if (index == 1) { m_lRiderSummonPosGuids.push_back((*itr)->GetObjectGuid()); } else { m_lTraineeSummonPosGuids.push_back((*itr)->GetObjectGuid()); --uiTraineeCount; } index++; } } // DeathKnights uint8 uiDeathKnightCount = 2; lSummonList.sort(ObjectDistanceOrderReversed(m_creature)); for (std::list<Creature*>::iterator itr = lSummonList.begin(); itr != lSummonList.end(); ++itr) { if (*itr) { if (uiDeathKnightCount == 0) { break; } m_lDeathKnightSummonPosGuids.push_back((*itr)->GetObjectGuid()); --uiDeathKnightCount; } } }
// Note: This seems like a very complicated fix. The fix needs to be handled by the core, as implementation of limited-target AoE spells are still not limited. void CastBloodboil() { // Get the Threat List ThreatList const& tList = m_creature->getThreatManager().getThreatList(); // He doesn't have anyone in his threatlist, useless to continue if (tList.empty()) return; std::list<Unit *> targets; //store the threat list in a different container for (ThreatList::const_iterator itr = tList.begin();itr != tList.end(); ++itr) { Unit *target = m_creature->GetMap()->GetUnit((*itr)->getUnitGuid()); //only on alive players if (target && target->isAlive() && target->GetTypeId() == TYPEID_PLAYER) targets.push_back(target); } //Sort the list of players targets.sort(ObjectDistanceOrderReversed(m_creature)); //Resize so we only get top 5 targets.resize(5); //Aura each player in the targets list with Bloodboil. Aura code copied+pasted from Aura command in Level3.cpp /*SpellEntry const *spellInfo = GetSpellStore()->LookupEntry(SPELL_BLOODBOIL); if (spellInfo) { for(std::list<Unit *>::iterator itr = targets.begin(); itr != targets.end(); ++itr) { Unit* target = *itr; if (!target) return; for(uint32 i = 0;i<3; ++i) { uint8 eff = spellInfo->Effect[i]; if (eff>=TOTAL_SPELL_EFFECTS) continue; Aura *Aur = new Aura(spellInfo, i, NULL, target); target->AddAura(Aur); } } }*/ }
void PrepareSummonPlaces() { CreatureList lSummonList; m_pInstance->GetGothSummonPointCreatures(lSummonList, true); if (lSummonList.empty()) return; // Trainees and Rider uint8 index = 0; uint8 uiTraineeCount = 3; lSummonList.sort(ObjectDistanceOrder(m_creature)); for (auto& itr : lSummonList) { if (itr) { if (uiTraineeCount == 0) break; if (index == 1) m_lRiderSummonPosGuids.push_back(itr->GetObjectGuid()); else { m_lTraineeSummonPosGuids.push_back(itr->GetObjectGuid()); --uiTraineeCount; } index++; } } // DeathKnights uint8 uiDeathKnightCount = 2; lSummonList.sort(ObjectDistanceOrderReversed(m_creature)); for (auto& itr : lSummonList) { if (itr) { if (uiDeathKnightCount == 0) break; m_lDeathKnightSummonPosGuids.push_back(itr->GetObjectGuid()); --uiDeathKnightCount; } } }
void SummonAdds(bool bRightSide, uint32 uiSummonEntry) { std::list<Creature*> lSummonList; m_pInstance->GetGothSummonPointCreatures(lSummonList, bRightSide); if (lSummonList.empty()) return; uint8 uiCount = 2; switch(uiSummonEntry) { case NPC_UNREL_TRAINEE: lSummonList.sort(ObjectDistanceOrder(m_creature)); break; case NPC_UNREL_DEATH_KNIGHT: case NPC_UNREL_RIDER: uiCount = 1; lSummonList.sort(ObjectDistanceOrderReversed(m_creature)); break; } for(std::list<Creature*>::iterator itr = lSummonList.begin(); itr != lSummonList.end(); ++itr) { if (uiCount == 0) break; if(Creature* pAdds = m_creature->SummonCreature(uiSummonEntry, (*itr)->GetPositionX(), (*itr)->GetPositionY(), (*itr)->GetPositionZ(), (*itr)->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000)) { m_pInstance->lGothikLiveAdds.push_back(pAdds->GetGUID() ); if (Unit* pVictim = m_pInstance->SelectRandomTargetOnSide(true, *pAdds) ) pAdds->AI()->AttackStart(pVictim); --uiCount; } } }