|
Патчи на рассмотрении Рассматриваемые к принятию патчи |
|
Опции темы | Поиск в этой теме | Опции просмотра |
17.06.2010, 11:24 | #1 |
Гость
Сообщений: n/a
|
Simplified way to retrieve talent auras.
Преамбула.
Чем собственно ауры талантов отличаются от обычных? Нет, не только тем, что они пассивны. Для человека, правящего спеллы, они представляют головную боль, т.к. очень часто все SpellFamilyFlags у них равны 0, а в ванильном ядре до сих пор нет никакого способа для облегчения их получения. Фабула. Для себя я уже достаточно давно сделал вот такую "хитрую штуку". В Unit.h: Код:
Aura* GetAura(AuraType type, uint32 family, SpellEffectIndex effindex, uint32 iconID, uint32 miscValue = 0, uint64 casterGUID = 0) const; Код:
Aura* Unit::GetAura(AuraType type, uint32 family, SpellEffectIndex effindex, uint32 iconID, uint32 miscValue, uint64 casterGUID) const { AuraList const& auras = GetAurasByType(type); for(AuraList::const_iterator i = auras.begin();i != auras.end(); ++i) { if ((*i)->GetEffIndex() != effindex) continue; if (casterGUID && (*i)->GetCasterGUID()!=casterGUID) continue; if (miscValue && (*i)->GetMiscValue() != miscValue) continue; SpellEntry const *spell = (*i)->GetSpellProto(); if (spell->SpellFamilyName == family && spell->SpellIconID == iconID) return (*i); } return NULL; } Код:
// Improved Moonkin Form if (form == FORM_MOONKIN) { Unit::AuraList const& dummyAuras = target->GetAurasByType(SPELL_AURA_DUMMY); for(Unit::AuraList::const_iterator i = dummyAuras.begin(); i != dummyAuras.end(); i++) { if ((*i)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_DRUID && (*i)->GetSpellProto()->SpellIconID == 2855) { uint32 spell_id = 0; switch((*i)->GetId()) { case 48384:spell_id=50170;break;//Rank 1 case 48395:spell_id=50171;break;//Rank 2 case 48396:spell_id=50172;break;//Rank 3 default: sLog.outError("Aura::HandleShapeshiftBoosts: Not handled rank of IMF (Spell: %u)",(*i)->GetId()); break; } if(spell_id) target->CastSpell(target, spell_id, true, NULL, this); break; } } } Код:
// Improved Moonkin Form if (form == FORM_MOONKIN) { if (Aura *aur = m_target->GetAura(SPELL_AURA_DUMMY, SPELLFAMILY_DRUID, EFFECT_INDEX_0, 2855)) { uint32 spell_id = 0; switch(aur->GetId()) { case 48384:spell_id=50170;break; // Rank 1 case 48395:spell_id=50171;break; // Rank 2 case 48396:spell_id=50172;break; // Rank 3 default: sLog.outError("Aura::HandleShapeshiftBoosts: Not handled rank of IMF (Spell: %u)", aur->GetId()); } if(spell_id) m_target->CastSpell(m_target, spell_id, true, NULL, this); } } |
17.06.2010, 11:39 | #2 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Т.е. номер иконки надо указывать всегда?
Может лучше расширить существующую GetAura и добавить опциональную проверку по иконке и miscvalue? |
17.06.2010, 11:48 | #3 |
Гость
Сообщений: n/a
|
Вы знаете, я очень не люблю, когда какая-либо функция получает более 3-4 параметров. Тут их и так 6 в худшем случае. Если слить с той, которая флаги требует, получим вообще полный абзац, который никто и никогда не запомнит. Лезть в прототип каждый раз при попытке использования - не лучшая перспектива. Код должен быть максимально простым всегда.
Существующий GetAura требует указания флагов и нацелен на получение ауры именно по флагам. Мой - по иконке, индексу и опциональному miscvalue (очень редко нужен). Функциональностью они не пересекаются, поэтому и сливать их воедино смысла нет. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[10616] Simplified trade distance checks, GROUP_UPDATE_FLAG_POSITION flag handling moved out of Map | newsbot | CMaNGOS Commits | 0 | 17.10.2010 19:22 |
[10446] Small fix for single target auras: remove caster only auras | newsbot | CMaNGOS Commits | 0 | 05.09.2010 08:00 |
[10051] Fixed talent 58426 broken after 3.3.3 switch. | newsbot | CMaNGOS Commits | 0 | 12.06.2010 03:40 |
[9987] Restore work talent 12311 and ranks. | newsbot | CMaNGOS Commits | 0 | 28.05.2010 00:13 |
[9661] Implement dual talent specializations in talent switch part. | newsbot | CMaNGOS Commits | 1 | 03.04.2010 06:39 |