bool AuraInterface::BuildAuraUpdateAllPacket(WorldPacket* data) { if(!m_auras.size()) return false; bool res = false; Aura* aur = NULL; for (uint32 i=0; i<MAX_AURAS; i++) { if(m_auras.find(i) != m_auras.end()) { res = true; aur = m_auras.at(i); aur->BuildAuraUpdate(); uint8 flags = aur->GetAuraFlags(); *data << uint8(aur->m_auraSlot); int32 stack = aur->stackSize; if(aur->procCharges > stack && stack != 0) stack = aur->procCharges; if(stack < 0) { *data << uint32(0); continue; } *data << uint32(aur->GetSpellId()); *data << uint8(flags); *data << uint8(aur->GetUnitCaster() ? aur->GetUnitCaster()->getLevel() : 0); *data << uint8(stack); if(!(flags & AFLAG_NOT_GUID)) FastGUIDPack(*data, aur->GetCasterGUID()); if(flags & AFLAG_HAS_DURATION) { *data << aur->GetDuration(); *data << aur->GetTimeLeft(); } } } return res; }
void AuraInterface::RemoveAllAurasByInterruptFlagButSkip(uint32 flag, uint32 skip) { Aura* a = NULL; for(uint32 x = 0; x < MAX_AURAS; x++) { a = NULL; if(m_auras.find(x) == m_auras.end()) continue; a = m_auras.at(x); if( a->GetDuration() > 0 && (int32)(a->GetTimeLeft()+500) > a->GetDuration() ) continue;//pretty new aura, don't remove //some spells do not get removed all the time only at specific intervals if((a->m_spellProto->AuraInterruptFlags & flag) && (a->m_spellProto->Id != skip) && a->m_spellProto->proc_interval==0) { //the black sheeps of sociaty if(a->m_spellProto->AuraInterruptFlags & AURA_INTERRUPT_ON_CAST_SPELL) { switch(a->GetSpellProto()->Id) { // priest - holy conc case 34754: { if( m_Unit->GetCurrentSpell() !=NULL && !(m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_FLASH_HEAL || m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_BINDING_HEAL || m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_GREATER_HEAL)) continue; SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && spi->NameHash != SPELL_HASH_FLASH_HEAL && spi->NameHash != SPELL_HASH_BINDING_HEAL && spi->NameHash != SPELL_HASH_GREATER_HEAL) continue; }break; //Arcane Potency case 57529: case 57531: { if( m_Unit->GetCurrentSpell() != NULL && !(m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_PRESENCE_OF_MIND || m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_CLEARCASTING )) continue; SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL || !(spi->c_is_flags & SPELL_FLAG_IS_DAMAGING) ) continue; }break; //paladin - Art of war case 53489: case 59578: { if( m_Unit->GetCurrentSpell() != NULL && m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_FLASH_OF_LIGHT ) continue; SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && spi->NameHash != SPELL_HASH_FLASH_OF_LIGHT ) continue; }break; //paladin - Infusion of light case 53672: case 54149: { if( m_Unit->GetCurrentSpell() != NULL && !(m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_FLASH_OF_LIGHT || m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_HOLY_LIGHT)) continue; SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && spi->NameHash != SPELL_HASH_FLASH_OF_LIGHT && spi->NameHash != SPELL_HASH_HOLY_LIGHT) continue; }break; //Mage - Firestarter case 54741: { if( m_Unit->GetCurrentSpell() != NULL && m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_FLAMESTRIKE ) continue; SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && spi->NameHash != SPELL_HASH_FLAMESTRIKE ) continue; }break; case 34936: // Backlash { SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && spi->NameHash != SPELL_HASH_SHADOW_BOLT && spi->NameHash != SPELL_HASH_INCINERATE ) continue; }break; case 17941: //Shadow Trance { SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && spi->NameHash != SPELL_HASH_SHADOW_BOLT ) continue; }break; // Glyph of Revenge Proc case 58363: { if( m_Unit->GetCurrentSpell() != NULL && m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_HEROIC_STRIKE ) continue; SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && spi->NameHash != SPELL_HASH_HEROIC_STRIKE ) continue; }break; case 18708: //Fel Domination { SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && spi->NameHash != SPELL_HASH_SUMMON_IMP && spi->NameHash != SPELL_HASH_SUMMON_VOIDWALKER && spi->NameHash != SPELL_HASH_SUMMON_SUCCUBUS && spi->NameHash != SPELL_HASH_SUMMON_FELHUNTER && spi->NameHash != SPELL_HASH_SUMMON_FELGUARD ) continue; }break; case 46916: // Bloodsurge { SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && spi->NameHash != SPELL_HASH_SLAM ) continue; }break; case 14177: // Cold Blood { SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && !(spi->c_is_flags & SPELL_FLAG_IS_DAMAGING) && spi->NameHash != SPELL_HASH_MUTILATE ) continue; }break; case 31834: // Light's Grace { if( m_Unit->GetCurrentSpell() != NULL && m_Unit->GetCurrentSpell()->GetSpellProto()->NameHash == SPELL_HASH_HOLY_LIGHT ) continue; SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && spi->NameHash != SPELL_HASH_HOLY_LIGHT ) continue; }break; // Shadowstep case 44373: case 36563: { SpellEntry *spi = dbcSpell.LookupEntry( skip ); if( spi != NULL && !(spi->c_is_flags & SPELL_FLAG_IS_DAMAGING) ) continue; }break; } } RemoveAuraBySlot(x); } } }
void AuraInterface::SaveAuras(stringstream& ss) { for(uint32 x = 0; x < MAX_AURAS; x++) // Crow: Changed to max auras in r1432, since we skip passive auras. { if(m_auras.find(x) != m_auras.end()) { Aura* aur = m_auras.at(x); // skipped spells due to bugs switch(aur->m_spellProto->Id) { case 642: case 1020: // Divine Shield case 11129: // Combustion case 12043: // Presence of mind case 16188: // Natures Swiftness case 17116: // Natures Swiftness case 23333: // WSG case 23335: // WSG case 28682: // Combustion proc case 31665: // Master of Subtlety (buff) case 32724: // Gold Team case 32725: // Green Team case 32727: // Arena Preparation case 32728: // Arena Preparation case 32071: // Hellfire Superority case 32049: // Hellfire Superority case 34936: // Backlash case 35076: // Blessing of A'dal case 35774: // Gold Team case 35775: // Green Team case 44521: // Preparation? case 44683: // Team A case 44684: // Team B case 45438: // Ice Block case 48418: // Master Shapeshifter Damage (buff) case 48420: // Master Shapeshifter Critical Strike (buff) case 48421: // Master Shapeshifter Spell Damage (buff) case 48422: // Master Shapeshifter Healing (buff) continue; break; } bool stop = false; for(uint32 i = 0; i < 3; i++) { if(!stop) { if((aur->m_spellProto->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA && aur->GetCasterGUID() != m_Unit->GetGUID()) || aur->m_spellProto->Effect[i] == SPELL_EFFECT_APPLY_AURA_128 || aur->m_spellProto->Effect[i] == SPELL_EFFECT_ADD_FARSIGHT) { stop = true; break; } } } if(stop) continue; // We are going to cast passive spells anyway on login so no need to save auras for them if( aur->IsPassive() || aur->m_spellProto->c_is_flags & SPELL_FLAG_IS_EXPIREING_WITH_PET || aur->m_spellProto->AuraInterruptFlags & AURA_INTERRUPT_ON_STAND_UP ) continue; // To prevent food/drink bug ss << aur->GetSpellId() << "," << aur->GetTimeLeft() << ","; } } }