本文整理汇总了C++中Aura::AddMod方法的典型用法代码示例。如果您正苦于以下问题:C++ Aura::AddMod方法的具体用法?C++ Aura::AddMod怎么用?C++ Aura::AddMod使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Aura
的用法示例。
在下文中一共展示了Aura::AddMod方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: UpdateAuraStateAuras
void AuraInterface::UpdateAuraStateAuras(uint32 oldflag)
{
if( oldflag == AURASTATE_FLAG_STUNNED && m_Unit->IsPlayer() && m_Unit->HasDummyAura(SPELL_HASH_PRIMAL_TENACITY) && TO_PLAYER(m_Unit)->GetShapeShift() == FORM_CAT )
{
for(uint32 i = 0; i < TOTAL_AURAS; i++)
{
if(m_auras.find(i) != m_auras.end())
{
if( m_auras.at(i)->GetSpellProto()->NameHash == SPELL_HASH_PRIMAL_TENACITY )
{
Aura* aura = new Aura(m_auras.at(i)->GetSpellProto(), -1, TO_OBJECT(this), TO_UNIT(this));
RemoveAuraBySlot(i);
aura->AddMod(232, -31, 5, 0);
aura->AddMod(SPELL_AURA_DUMMY, 0, 0, 2);
aura->AddMod(SPELL_AURA_ADD_PCT_MODIFIER, -51, 14, 2);
AddAura(aura);
continue;
}
if( m_auras.at(i)->m_applied) // try to apply
m_auras.at(i)->ApplyModifiers(true);
if( m_auras.at(i)->m_applied) // try to remove, if we lack the aurastate
m_auras.at(i)->RemoveIfNecessary();
}
}
}
else
{
for(uint32 i = 0; i < TOTAL_AURAS; i++)
{
if(m_auras.find(i) != m_auras.end())
{
if( !m_auras.at(i)->m_applied) // try to apply
m_auras.at(i)->ApplyModifiers(true);
if( m_auras.at(i)->m_applied) // try to remove, if we lack the aurastate
m_auras.at(i)->RemoveIfNecessary();
}
}
}
}
示例2: SpellStealAuras
void AuraInterface::SpellStealAuras(Unit* caster, int32 MaxSteals)
{
Aura* aur = NULL;
int32 spells_to_steal = MaxSteals > 1 ? MaxSteals : 1;
for(uint32 x = 0; x < MAX_POSITIVE_AURAS; x++)
{
if(m_auras.find(x) != m_auras.end())
{
aur = m_auras.at(x);
if(aur != NULL && aur->GetSpellId() != 15007 && !aur->IsPassive() && aur->IsPositive()) //Nothing can dispel resurrection sickness
{
if(aur->GetSpellProto()->DispelType == DISPEL_MAGIC && aur->GetDuration() > 0)
{
WorldPacket data(SMSG_SPELLDISPELLOG, 16);
data << caster->GetNewGUID();
data << m_Unit->GetNewGUID();
data << uint32(1);
data << aur->GetSpellId();
caster->SendMessageToSet(&data,true);
Aura* aura = new Aura(aur->GetSpellProto(), (aur->GetDuration()>120000) ? 120000 : aur->GetDuration(), caster, caster);
aura->stackSize = aur->stackSize;
// copy the mods across
for( uint32 m = 0; m < aur->GetModCount(); ++m )
{
Modifier *mod = aur->GetMod(m);
aura->AddMod(mod->m_type, mod->m_baseAmount, mod->m_miscValue, mod->i);
}
caster->AddAura(aura);
RemoveAuraBySlot(x);
if( --spells_to_steal <= 0 )
break; //exit loop now
}
}
}
}
}
示例3: SkyShatterRegalia
bool SkyShatterRegalia(uint32 i, Spell* s)
{
// Shaman - Skyshatter Regalia - Two Piece Bonus
// it checks for earth, air, water, fire totems and triggers Totemic Mastery spell 38437.
if(!s->p_caster)
return false;
if(s->p_caster->summonhandler.HasSummonInSlot(0) &&
s->p_caster->summonhandler.HasSummonInSlot(1) &&
s->p_caster->summonhandler.HasSummonInSlot(2) &&
s->p_caster->summonhandler.HasSummonInSlot(3))
{
Aura* aur = sSpellFactoryMgr.NewAura(dbcSpell.LookupEntry(38437), 5000, s->p_caster, s->p_caster, true);
for(uint32 j = 0; j < 3; j++)
aur->AddMod(aur->GetSpellProto()->eff[j].EffectApplyAuraName, aur->GetSpellProto()->eff[j].EffectBasePoints + 1, aur->GetSpellProto()->eff[j].EffectMiscValue, j);
s->p_caster->AddAura(aur);
}
return true;
}
示例4: UpdateTargets
void DynamicObject::UpdateTargets()
{
if(m_aliveDuration == 0)
return;
if(m_aliveDuration >= 100)
{
FactionRangeList::iterator itr = m_inRangeOppFactions.begin();
FactionRangeList::iterator iend = m_inRangeOppFactions.end();
Unit * target;
Aura * pAura;
float radius = powf(m_floatValues[DYNAMICOBJECT_RADIUS], 2);
while(itr != iend)
{
target = *itr;
++itr;
// skip units already hit, their range will be tested later
if(targets.find(target) != targets.end())
continue;
if(GetDistanceSq(target) <= radius)
{
pAura = new Aura(m_spellProto, m_aliveDuration, u_caster, target);
for(uint32 i = 0; i < 3; ++i)
{
if(m_spellProto->Effect[i] == 27)
{
pAura->AddMod(m_spellProto->EffectApplyAuraName[i],
m_spellProto->EffectBasePoints[i]+1, m_spellProto->EffectMiscValue[i], i);
}
}
target->AddAura(pAura);
if(p_caster)
p_caster->HandleProc(PROC_ON_CAST_SPECIFIC_SPELL | PROC_ON_CAST_SPELL,target, m_spellProto);
// add to target list
targets.insert(target);
}
}
// loop the targets, check the range of all of them
DynamicObjectList::iterator jtr = targets.begin();
DynamicObjectList::iterator jtr2;
DynamicObjectList::iterator jend = targets.end();
while(jtr != jend)
{
target = *jtr;
jtr2 = jtr;
++jtr;
if(GetDistanceSq(target) > radius)
{
targets.erase(jtr2);
target->RemoveAura(m_spellProto->Id);
}
}
m_aliveDuration -= 100;
}
else
{
m_aliveDuration = 0;
}
if(m_aliveDuration == 0)
{
DynamicObjectList::iterator jtr = targets.begin();
DynamicObjectList::iterator jend = targets.end();
Unit * target;
while(jtr != jend)
{
target = *jtr;
++jtr;
target->RemoveAura(m_spellProto->Id);
}
Remove();
}
}
示例5: UpdateTargets
void DynamicObject::UpdateTargets()
{
if(m_aliveDuration == 0)
return;
if(m_aliveDuration >= 100)
{
Unit* target;
Aura* pAura;
float radius = m_floatValues[ DYNAMICOBJECT_RADIUS ] * m_floatValues[ DYNAMICOBJECT_RADIUS ];
// Looking for targets in the Object set
for(std::set< Object* >::iterator itr = m_objectsInRange.begin(); itr != m_objectsInRange.end(); ++itr)
{
Object* o = *itr;
if(!o->IsUnit() || !TO< Unit* >(o)->isAlive())
continue;
target = TO< Unit* >(o);
if(!isAttackable(u_caster, target, !(m_spellProto->c_is_flags & SPELL_FLAG_IS_TARGETINGSTEALTHED)))
continue;
// skip units already hit, their range will be tested later
if(targets.find(target->GetGUID()) != targets.end())
continue;
if(GetDistanceSq(target) <= radius)
{
pAura = sSpellFactoryMgr.NewAura(m_spellProto, m_aliveDuration, u_caster, target, true);
for(uint32 i = 0; i < 3; ++i)
{
if(m_spellProto->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA)
{
pAura->AddMod(m_spellProto->EffectApplyAuraName[i],
m_spellProto->EffectBasePoints[i] + 1, m_spellProto->EffectMiscValue[i], i);
}
}
target->AddAura(pAura);
if(p_caster)
{
p_caster->HandleProc(PROC_ON_CAST_SPECIFIC_SPELL | PROC_ON_CAST_SPELL, target, m_spellProto);
p_caster->m_procCounter = 0;
}
// add to target list
targets.insert(target->GetGUID());
}
}
// loop the targets, check the range of all of them
DynamicObjectList::iterator jtr = targets.begin();
DynamicObjectList::iterator jtr2;
DynamicObjectList::iterator jend = targets.end();
while(jtr != jend)
{
target = GetMapMgr() ? GetMapMgr()->GetUnit(*jtr) : NULL;
jtr2 = jtr;
++jtr;
if((target != NULL) && (GetDistanceSq(target) > radius))
{
target->RemoveAura(m_spellProto->Id);
targets.erase(jtr2);
}
}
m_aliveDuration -= 100;
}
else
{
m_aliveDuration = 0;
}
if(m_aliveDuration == 0)
{
Remove();
}
}
示例6: UpdateTargets
void DynamicObject::UpdateTargets()
{
if(m_aliveDuration == 0)
return;
if(m_aliveDuration >= 100)
{
std::set<Object*>::iterator itr = GetInRangeSetBegin(),itr2;
std::set<Object*>::iterator iend = GetInRangeSetEnd();
Unit * target;
Aura * pAura;
float radius = m_floatValues[DYNAMICOBJECT_RADIUS]*m_floatValues[DYNAMICOBJECT_RADIUS];
this->AquireInrangeLock(); //make sure to release lock before exit function !
while(itr != iend)
{
// target = *itr;
// ++itr;
itr2 = itr;
++itr;
if( !( (*itr2)->IsUnit() ) || ! static_cast< Unit* >( *itr2 )->isAlive() || ( static_cast< Creature* >( *itr2 )->IsTotem() && !static_cast< Unit* >( *itr2 )->IsPlayer() ) )
continue;
target = static_cast< Unit* >( *itr2 );
if( !isAttackable( p_caster, target, !(m_spellProto->c_is_flags & SPELL_FLAG_IS_TARGETINGSTEALTHED) ) )
continue;
// skip units already hit, their range will be tested later
if(targets.find(target->GetGUID()) != targets.end())
continue;
if(GetDistanceSq(target) <= radius)
{
pAura = AuraPool.PooledNew();
pAura->Init(m_spellProto, m_aliveDuration, u_caster, target, true);
for(uint32 i = 0; i < 3; ++i)
{
if(m_spellProto->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA)
{
pAura->AddMod(m_spellProto->EffectApplyAuraName[i],
m_spellProto->EffectBasePoints[i]+1, m_spellProto->EffectMiscValue[i], i);
}
}
target->AddAura(pAura, m_spellScript);
if(p_caster)
{
p_caster->HandleProc(PROC_ON_CAST_SPECIFIC_SPELL | PROC_ON_CAST_SPELL,target, m_spellProto);
p_caster->m_procCounter = 0;
}
// add to target list
targets.insert(target->GetGUID());
}
}
this->ReleaseInrangeLock();
// loop the targets, check the range of all of them
DynamicObjectList::iterator jtr = targets.begin();
DynamicObjectList::iterator jtr2;
DynamicObjectList::iterator jend = targets.end();
while(jtr != jend)
{
target = GetMapMgr() ? GetMapMgr()->GetUnit(*jtr) : NULL;
jtr2 = jtr;
++jtr;
if(GetDistanceSq(target) > radius)
{
target->RemoveAura(m_spellProto->Id);
targets.erase(jtr2);
}
}
m_aliveDuration -= 100;
}
else
{
m_aliveDuration = 0;
}
if(m_aliveDuration == 0)
{
Remove();
}
}
示例7: UpdateTargets
void DynamicObject::UpdateTargets(uint32 p_time)
{
Unit* u_caster = NULL;
if(GUID_HIPART(casterGuid) == HIGHGUID_TYPE_GAMEOBJECT)
{
GameObject* goCaster = GetMapMgr()->GetGameObject(casterGuid);
if(goCaster == NULL || !goCaster->IsInWorld())
m_aliveDuration = 0; // Set alive duration to 0
else if(goCaster->m_summoner)
u_caster = goCaster->m_summoner;
}
else
{
u_caster = GetMapMgr()->GetUnit(casterGuid);
if(u_caster == NULL || !u_caster->IsInWorld())
m_aliveDuration = 0; // Set alive duration to 0
}
// If we're a channelled spell, we are required to be the caster channel target
if(m_spellProto->IsChannelSpell() && u_caster)
{
if(u_caster->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT) != GetGUID())
m_aliveDuration = 0;
}
if(m_aliveDuration > 0)
{
if(m_aliveDuration < p_time)
m_aliveDuration = 0;
else m_aliveDuration -= p_time;
}
if(m_aliveDuration && u_caster)
{
Aura* pAura;
Unit* target;
float radius = m_floatValues[DYNAMICOBJECT_RADIUS] * m_floatValues[DYNAMICOBJECT_RADIUS];
// Looking for targets in the Object set
for(std::unordered_set< Unit* >::iterator itr = m_unitsInRange.begin(); itr != m_unitsInRange.end(); ++itr)
{
target = *itr;
if(!target->isAlive())
continue;
if(!sFactionSystem.isAttackable(u_caster, target, !(m_spellProto->c_is_flags & SPELL_FLAG_IS_TARGETINGSTEALTHED)))
continue;
// skip units already hit, their range will be tested later
if(targets.find(target->GetGUID()) != targets.end())
continue;
if(GetDistanceSq(target) <= radius)
{
pAura = new Aura(m_spellProto, m_aliveDuration, u_caster, target);
for(uint32 i = 0; i < 3; ++i)
{
if(m_spellProto->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA)
{
pAura->AddMod(m_spellProto->EffectApplyAuraName[i], m_spellProto->EffectBasePoints[i]+1, m_spellProto->EffectMiscValue[i], i);
}
}
target->AddAura(pAura);
u_caster->HandleProc(PROC_ON_CAST_SPECIFIC_SPELL | PROC_ON_CAST_SPELL, NULL, target, m_spellProto);
// add to target list
targets.insert(target->GetGUID());
}
}
// loop the targets, check the range of all of them
DynamicObjectList::iterator jtr = targets.begin(), jtr2, jend = targets.end();
while(jtr != jend)
{
jtr2 = jtr;
++jtr;
target = GetMapMgr() ? GetMapMgr()->GetUnit(*jtr2) : NULL;
if(target == NULL || GetDistanceSq(target) > radius)
{
if(target)
target->RemoveAura(m_spellProto->Id);
targets.erase(jtr2);
}
}
}
else
{
// call remove here
Remove();
}
}