本文整理汇总了C++中Aura::GetStackAmount方法的典型用法代码示例。如果您正苦于以下问题:C++ Aura::GetStackAmount方法的具体用法?C++ Aura::GetStackAmount怎么用?C++ Aura::GetStackAmount使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Aura
的用法示例。
在下文中一共展示了Aura::GetStackAmount方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: HandleKill
void OPvPWintergrasp::HandleKill(Player *killer, Unit *victim)
{
if(victim->GetTypeId() == TYPEID_PLAYER)
{
// We handle promotion here because player should not get promotion if he has buff but do the kill outside the zone
if(victim->getLevel() >= 70)
{
Aura *aur;
if(aur = killer->GetAura(SPELL_RECRUIT))
{
if(aur->GetStackAmount() >= 5)
{
killer->RemoveAura(SPELL_RECRUIT);
killer->CastSpell(killer, SPELL_CORPORAL, true);
}
else
killer->CastSpell(killer, SPELL_RECRUIT, true);
}
else if(aur = killer->GetAura(SPELL_CORPORAL))
{
if(aur->GetStackAmount() >= 5)
{
killer->RemoveAura(SPELL_CORPORAL);
killer->CastSpell(killer, SPELL_LIEUTENANT, true);
}
else
killer->CastSpell(killer, SPELL_CORPORAL, true);
}
else if(killer->HasAura(SPELL_LIEUTENANT))
killer->CastSpell(killer, SPELL_LIEUTENANT, true);
}
}
}
示例2: HandleScript
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (!(GetHitCreature() && GetHitCreature()->IsAlive()))
return;
Aura *unstable = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE);
if (unstable != NULL)
{
uint8 newStack = uint8(unstable->GetStackAmount()+1);
unstable->SetStackAmount(newStack);
// explode!
if (newStack >= 5)
{
GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_BUFF_COMBINE);
GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_COMBINE);
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
if (Creature* rotface = Unit::GetCreature(*GetCaster(), instance->GetData64(DATA_ROTFACE)))
if (rotface->IsAlive())
{
rotface->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION);
rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION);
}
if (Creature* cre = GetCaster()->ToCreature())
cre->AI()->DoAction(EVENT_STICKY_OOZE);
GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE_EXPLOSION, false, NULL, NULL, GetCaster()->GetGUID());
if (InstanceScript* instance = GetCaster()->GetInstanceScript())
instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false));
}
}
GetHitCreature()->DespawnOrUnsummon();
}
示例3: UpdateAI
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
if (uiGripOfSladRanTimer <= diff)
{
Unit* target = me->GetVictim();
DoCast(target, SPELL_GRIP_OF_SLAD_RAN);
uiGripOfSladRanTimer = urand(3, 6)*IN_MILLISECONDS;
Aura* grip = target->GetAura(SPELL_GRIP_OF_SLAD_RAN, me->GetGUID());
if (grip && grip->GetStackAmount() == 5)
{
target->RemoveAurasDueToSpell(SPELL_GRIP_OF_SLAD_RAN, me->GetGUID());
target->CastSpell(target, SPELL_SNAKE_WRAP, true);
if (TempSummon* _me = me->ToTempSummon())
if (Unit* summoner = _me->GetSummoner())
if (Creature* sladran = summoner->ToCreature())
sladran->AI()->SetGUID(target->GetGUID(), DATA_SNAKES_WHYD_IT_HAVE_TO_BE_SNAKES);
me->DespawnOrUnsummon();
}
} else uiGripOfSladRanTimer -= diff;
}
示例4: HandleRemove
void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes mode)
{
PreventDefaultAction();
Aura* aura = aurEff->GetBase();
if (aura->GetStackAmount() == 1)
aura->Remove(AURA_REMOVE_BY_DEFAULT);
else
aura->SetStackAmount(GetStackAmount() - 1);
}
示例5: UpdateAI
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (CheckIntenseColdTimer < diff && !MoreThanTwoIntenseCold)
{
std::list<HostilReference*> ThreatList = m_creature->getThreatManager().getThreatList();
for(std::list<HostilReference*>::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); itr++)
{
Unit *target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
if (!target || target->GetTypeId() != TYPEID_PLAYER)
continue;
Aura *AuraIntenseCold = target->GetAura(SPELL_INTENSE_COLD_TRIGGERED);
if (AuraIntenseCold && AuraIntenseCold->GetStackAmount() > 2)
{
MoreThanTwoIntenseCold = true;
break;
}
}
CheckIntenseColdTimer = 2000;
}else CheckIntenseColdTimer -= diff;
if (!Enrage && (m_creature->GetHealth() < m_creature->GetMaxHealth() * 0.25))
{
DoScriptText(SAY_ENRAGE , m_creature);
DoCast(m_creature, SPELL_ENRAGE);
Enrage = true;
}
if (CRYSTALFIRE_BREATH_Timer < diff)
{
DoCast(m_creature->getVictim(), HeroicMode ? SPELL_CRYSTALFIRE_BREATH_H : SPELL_CRYSTALFIRE_BREATH_N);
CRYSTALFIRE_BREATH_Timer = 14000;
}else CRYSTALFIRE_BREATH_Timer -=diff;
if (TAIL_SWEEP_Timer < diff)
{
DoCast(m_creature, SPELL_TAIL_SWEEP);
TAIL_SWEEP_Timer = 5000;
}else TAIL_SWEEP_Timer -=diff;
if (CRYSTAL_CHAINS_CRYSTALIZE_Timer < diff)
{
DoScriptText(SAY_CRYSTAL_NOVA , m_creature);
if (HeroicMode)
DoCast(m_creature, SPELL_CRYSTALIZE);
else
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CRYSTAL_CHAINS);
CRYSTAL_CHAINS_CRYSTALIZE_Timer = HeroicMode ? 30000 : 11000;
}else CRYSTAL_CHAINS_CRYSTALIZE_Timer -= diff;
DoMeleeAttackIfReady();
}
示例6: UpdateAI
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (uiSpawnTimer <= diff)
{
for (uint8 i = 0; i < urand(2,HEROIC(3,5)); ++i)
DoSpawnCreature(RAND(NPC_DRAKKARI_INVADER_1,NPC_DRAKKARI_INVADER_2), AddSpawnPoint.GetPositionX(), AddSpawnPoint.GetPositionY(), AddSpawnPoint.GetPositionZ(), AddSpawnPoint.GetOrientation(), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000);
uiSpawnTimer = urand(30000,40000);
} else uiSpawnTimer -= diff;
if (uiConsumeTimer <= diff)
{
DoScriptText(SAY_CONSUME, m_creature);
DoCast(HEROIC(SPELL_CONSUME, H_SPELL_CONSUME));
uiConsumeTimer = 15000;
} else uiConsumeTimer -= diff;
if (bAchiev)
{
if (uiAuraCountTimer <= diff)
{
if (m_creature->HasAura(HEROIC(SPELL_CONSUME,H_SPELL_CONSUME)))
{
Aura *pConsumeAura = m_creature->GetAura(HEROIC(SPELL_CONSUME,H_SPELL_CONSUME));
if (pConsumeAura && pConsumeAura->GetStackAmount() > 9)
bAchiev = false;
}
uiAuraCountTimer = 16000;
} else uiAuraCountTimer -= diff;
}
if (uiCrushTimer <= diff)
{
DoCastVictim(SPELL_CRUSH);
uiCrushTimer = urand(10000,15000);
} else uiCrushTimer -= diff;
if (uiInfectedWoundTimer <= diff)
{
DoCastVictim(SPELL_INFECTED_WOUND);
uiInfectedWoundTimer = urand(25000,35000);
} else uiInfectedWoundTimer -= diff;
if (uiExplodeCorpseTimer <= diff)
{
DoCast(HEROIC(SPELL_CORPSE_EXPLODE, H_SPELL_CORPSE_EXPLODE));
DoScriptText(SAY_EXPLODE, m_creature);
uiExplodeCorpseTimer = urand(15000,19000);
} else uiExplodeCorpseTimer -= diff;
DoMeleeAttackIfReady();
}
示例7: UpdateAI
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CONSUME:
Talk(SAY_CONSUME);
DoCastAOE(SPELL_CONSUME);
events.ScheduleEvent(EVENT_CONSUME, 15000);
break;
case EVENT_CRUSH:
DoCastVictim(SPELL_CRUSH);
events.ScheduleEvent(EVENT_CRUSH, urand(10000, 15000));
break;
case EVENT_INFECTED_WOUND:
DoCastVictim(SPELL_INFECTED_WOUND);
events.ScheduleEvent(EVENT_INFECTED_WOUND, urand(25000, 35000));
break;
case EVENT_CORPSE_EXPLODE:
Talk(SAY_EXPLODE);
DoCastAOE(SPELL_CORPSE_EXPLODE);
events.ScheduleEvent(EVENT_CORPSE_EXPLODE, urand(15000, 19000));
break;
case EVENT_SPAWN:
for (uint8 i = 0; i < 3; ++i)
if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TROLLGORE_INVADER_SUMMONER_1 + i)))
trigger->CastSpell(trigger, RAND(SPELL_SUMMON_INVADER_A, SPELL_SUMMON_INVADER_B, SPELL_SUMMON_INVADER_C), true, NULL, NULL, me->GetGUID());
events.ScheduleEvent(EVENT_SPAWN, urand(30000, 40000));
break;
default:
break;
}
}
if (_consumptionJunction)
{
Aura* ConsumeAura = me->GetAura(SPELL_CONSUME_BUFF_HELPER);
if (ConsumeAura && ConsumeAura->GetStackAmount() > 9)
_consumptionJunction = false;
}
DoMeleeAttackIfReady();
}
示例8: UpdateAI
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (SpawnTimer <= diff)
{
uint32 spawnNumber = urand(2, DUNGEON_MODE(3, 5));
for (uint8 i = 0; i < spawnNumber; ++i)
DoSummon(RAND(NPC_DRAKKARI_INVADER_1, NPC_DRAKKARI_INVADER_2), AddSpawnPoint, 0, TEMPSUMMON_DEAD_DESPAWN);
SpawnTimer = urand(30*IN_MILLISECONDS, 40*IN_MILLISECONDS);
}
else SpawnTimer -= diff;
if (ConsumeTimer <= diff)
{
DoSendQuantumText(SAY_CONSUME, me);
DoCastAOE(DUNGEON_MODE(SPELL_CONSUME_5N, SPELL_CONSUME_5H));
ConsumeTimer = 15*IN_MILLISECONDS;
}
else ConsumeTimer -= diff;
if (bAchiev)
{
Aura* ConsumeAura = me->GetAura(DUNGEON_MODE(SPELL_CONSUME_AURA_5N, SPELL_CONSUME_AURA_5H));
if (ConsumeAura && ConsumeAura->GetStackAmount() > 9)
bAchiev = false;
}
if (CrushTimer <= diff)
{
DoCastVictim(SPELL_CRUSH);
CrushTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS);
}
else CrushTimer -= diff;
if (InfectedWoundTimer <= diff)
{
DoCastVictim(SPELL_INFECTED_WOUND);
InfectedWoundTimer = urand(25*IN_MILLISECONDS, 35*IN_MILLISECONDS);
}
else InfectedWoundTimer -= diff;
if (ExplodeCorpseTimer <= diff)
{
DoCast(DUNGEON_MODE(SPELL_CORPSE_EXPLODE_5N, SPELL_CORPSE_EXPLODE_5H));
DoSendQuantumText(SAY_EXPLODE, me);
ExplodeCorpseTimer = urand(15*IN_MILLISECONDS, 19*IN_MILLISECONDS);
}
else ExplodeCorpseTimer -= diff;
DoMeleeAttackIfReady();
}
示例9: Spell_arcane_torrent
bool Spell_arcane_torrent(Unit* caster, std::list<Unit*> &, SpellCastTargets const&, SpellEntry const *spellInfo, uint32 effectIndex)
{
if (effectIndex != 0)
return true;
switch (spellInfo->Id)
{
case 28730: // Arcane Torrent (Mana)
case 33390: // Arcane Torrent (mana Wretched Devourer)
{
Aura* dummy = caster->GetDummyAura(28734);
if (dummy)
{
int32 bp = (2.17*caster->getLevel() + 9.136) * dummy->GetStackAmount();
caster->CastCustomSpell(caster, 28733, &bp, NULL, NULL, true);
caster->RemoveAurasDueToSpell(28734);
}
break;
}
// Arcane Torrent (Energy)
case 25046:
{
// Search Mana Tap auras on caster
Aura* dummy = caster->GetDummyAura(28734);
if (dummy)
{
int32 bp = dummy->GetStackAmount() * 10;
caster->CastCustomSpell(caster, 25048, &bp, NULL, NULL, true);
caster->RemoveAurasDueToSpell(28734);
}
break;
}
}
return true;
}
示例10: executeEvent
void MountedChampionAI::executeEvent(uint32 eventID)
{
uint32 timer = 0;
switch (eventID)
{
case EVENT_SPELL_CHARGE:
{
if (Unit* pUnit = SelectTarget(SELECT_TARGET_FARTHEST))
{
DoResetThreat();
me->AddThreat(pUnit, 5.0f);
DoCast(pUnit, SPELL_CHARGE, true);
}
timer = 5000;
}break;
case EVENT_SPELL_SHIELD_BREAKER:
{
if (Unit* pUnit = SelectTarget(SELECT_TARGET_FARTHEST))
DoCast(pUnit, SPELL_SHIELD_BREAKER, true);
timer = 7 * IN_MILLISECONDS;
}break;
case EVENT_SPELL_SHIELD:
{
Aura* pAura = me->GetAura(SPELL_SHIELD);
if (!pAura || pAura->GetStackAmount() < 3)
{
DoCast(SPELL_SHIELD);
timer = urand(4 * IN_MILLISECONDS, 5 * IN_MILLISECONDS);
}
else
timer = urand(1 * IN_MILLISECONDS, 2 * IN_MILLISECONDS);
}break;
}
if (eventID && timer)
eventMap.ScheduleEvent(eventID, timer);
}
示例11: UpdateAI
void UpdateAI(uint32 const diff)
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_DUMMY_RECAST_DEFEND:
switch (me->GetEntry())
{
case NPC_CHARGE_TARGET:
{
if (!me->HasAura(SPELL_CHARGE_DEFEND))
DoCast(SPELL_CHARGE_DEFEND);
break;
}
case NPC_RANGED_TARGET:
{
Aura* defend = me->GetAura(SPELL_RANGED_DEFEND);
if (!defend || defend->GetStackAmount() < 3 || defend->GetDuration() <= 8000)
DoCast(SPELL_RANGED_DEFEND);
break;
}
}
isVulnerable = false;
events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5000);
break;
case EVENT_DUMMY_RESET:
if (UpdateVictim())
{
EnterEvadeMode();
events.ScheduleEvent(EVENT_DUMMY_RESET, 10000);
}
break;
}
if (!UpdateVictim())
return;
if (!me->HasUnitState(UNIT_STATE_STUNNED))
me->SetControlled(true, UNIT_STATE_STUNNED);
}
示例12: HandleScriptEffect
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
if (Unit* unitTarget = GetHitUnit())
{
uint32 spellId = 0;
int32 basePoint = 0;
Unit::AuraApplicationMap& Auras = unitTarget->GetAppliedAuras();
for (Unit::AuraApplicationMap::iterator i = Auras.begin(); i != Auras.end(); ++i)
{
Aura* aura = i->second->GetBase();
if (aura->GetCasterGUID() != caster->GetGUID())
continue;
// Search only Serpent Sting, Viper Sting, Scorpid Sting auras
flag96 familyFlag = aura->GetSpellInfo()->SpellFamilyFlags;
if (!(familyFlag[1] & 0x00000080 || familyFlag[0] & 0x0000C000))
continue;
if (AuraEffect* aurEff = aura->GetEffect(0))
{
// Serpent Sting - Instantly deals 40% of the damage done by your Serpent Sting.
if (familyFlag[0] & 0x4000)
{
int32 TickCount = aurEff->GetTotalTicks();
spellId = SPELL_HUNTER_CHIMERA_SHOT_SERPENT;
basePoint = (aurEff->GetAmount() + aurEff->GetBonusAmount()) * aurEff->GetDonePct();
ApplyPct(basePoint, TickCount * 40);
basePoint = unitTarget->SpellDamageBonusTaken(caster, aura->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount());
if (Player* modOwner = caster->GetSpellModOwner())
modOwner->ApplySpellMod(aura->GetSpellInfo()->Id, SPELLMOD_DOT, basePoint);
aurEff->SetBonusAmount(caster->SpellDamageBonusDone(unitTarget, aurEff->GetSpellInfo(), 0, DOT));
}
// Viper Sting - Instantly restores mana to you equal to 60% of the total amount drained by your Viper Sting.
else if (familyFlag[1] & 0x00000080)
{
int32 TickCount = aura->GetEffect(0)->GetTotalTicks();
spellId = SPELL_HUNTER_CHIMERA_SHOT_VIPER;
// Amount of one aura tick
basePoint = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), aurEff->GetAmount()));
int32 casterBasePoint = aurEff->GetAmount() * unitTarget->GetMaxPower(POWER_MANA) / 50; /// @todo WTF? caster uses unitTarget?
if (basePoint > casterBasePoint)
basePoint = casterBasePoint;
ApplyPct(basePoint, TickCount * 60);
}
// Scorpid Sting - Attempts to Disarm the target for 10 sec. This effect cannot occur more than once per 1 minute.
else if (familyFlag[0] & 0x00008000)
spellId = SPELL_HUNTER_CHIMERA_SHOT_SCORPID;
// ?? nothing say in spell desc (possibly need addition check)
//if (familyFlag & 0x0000010000000000LL || // dot
// familyFlag & 0x0000100000000000LL) // stun
//{
// spellId = 53366; // 53366 Chimera Shot - Wyvern
//}
// Refresh aura duration
aura->RefreshDuration();
}
break;
}
if (spellId)
caster->CastCustomSpell(unitTarget, spellId, &basePoint, 0, 0, true);
if (spellId == SPELL_HUNTER_CHIMERA_SHOT_SCORPID && caster->ToPlayer()) // Scorpid Sting - Add 1 minute cooldown
caster->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::minutes(1));
}
}
示例13: UpdateAI
void UpdateAI(const uint32 uiDiff) override
{
if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
return;
// This needs to be checked only on heroic
if (!m_bIsRegularMode && m_uiCheckPermafrostTimer)
{
if (m_uiCheckPermafrostTimer <= uiDiff)
{
ThreatList playerList = m_creature->getThreatManager().getThreatList();
for (ThreatList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
{
if (Player* pTarget = m_creature->GetMap()->GetPlayer((*itr)->getUnitGuid()))
{
Aura* pAuraIntenseCold = pTarget->GetAura(SPELL_PERMAFROST_AURA_H, EFFECT_INDEX_2);
if (pAuraIntenseCold)
{
if (pAuraIntenseCold->GetStackAmount() > MAX_PERMAFROST_STACK)
{
if (m_pInstance)
m_pInstance->SetSpecialAchievementCriteria(TYPE_ACHIEV_DOESNT_GO_ELEVEN, false);
m_uiCheckPermafrostTimer = 0;
return;
}
}
}
}
m_uiCheckPermafrostTimer = 1000;
}
else
m_uiCheckPermafrostTimer -= uiDiff;
}
// Do nothing more while moving
if (m_uiPhase == PHASE_MOVEMENT)
return;
// Casted in every phase
if (m_uiThrowSaroniteTimer < uiDiff)
{
// TODO - only target players?
if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0))
{
if (DoCastSpellIfCan(pTarget, SPELL_THROW_SARONITE) == CAST_OK)
{
DoScriptText(EMOTE_THROW_SARONITE, m_creature, pTarget);
m_uiThrowSaroniteTimer = 16000;
}
}
}
else
m_uiThrowSaroniteTimer -= uiDiff;
switch (m_uiPhase)
{
case PHASE_NO_ENCHANTMENT:
{
if (m_creature->GetHealthPercent() < 66.0f)
{
DoCastSpellIfCan(m_creature, SPELL_THUNDERING_STOMP, CAST_INTERRUPT_PREVIOUS);
SetCombatMovement(false);
m_creature->GetMotionMaster()->MoveJump(aGarfrostMoveLocs[0][0], aGarfrostMoveLocs[0][1], aGarfrostMoveLocs[0][2], 3 * m_creature->GetSpeed(MOVE_RUN), 10.0f, PHASE_BLADE_ENCHANTMENT);
m_uiPhase = PHASE_MOVEMENT;
// Stop further action
return;
}
break;
}
case PHASE_BLADE_ENCHANTMENT:
{
if (m_creature->GetHealthPercent() < 33.0f)
{
DoCastSpellIfCan(m_creature, SPELL_THUNDERING_STOMP, CAST_INTERRUPT_PREVIOUS);
SetCombatMovement(false);
m_creature->GetMotionMaster()->MoveJump(aGarfrostMoveLocs[1][0], aGarfrostMoveLocs[1][1], aGarfrostMoveLocs[1][2], 3 * m_creature->GetSpeed(MOVE_RUN), 10.0f, PHASE_MACE_ENCHANTMENT);
m_uiPhase = PHASE_MOVEMENT;
// Stop further action
return;
}
if (m_uiChillingWaveTimer < uiDiff)
{
if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_CHILLING_WAVE) == CAST_OK)
m_uiChillingWaveTimer = 14000;
}
else
m_uiChillingWaveTimer -= uiDiff;
break;
}
case PHASE_MACE_ENCHANTMENT:
{
if (m_uiDeepFreezeTimer < uiDiff)
//.........这里部分代码省略.........
示例14: DoNextCombatManeuver
//.........这里部分代码省略.........
if (m_tank->getVictim() && m_tank->getVictim()->GetGUID() != pTarget->GetGUID()) // I am attacking wrong target!!
{
m_bot->SetSelection(m_tank->getVictim()->GetGUID());
return;
}
else
{
if (CastSpell(INVISIBILITY,m_bot)) { return; } //Lets see if we can manage
else if (m_bot->FindCurrentSpellBySpellId(SHOOT)) { m_bot->InterruptNonMeleeSpells( true, SHOOT ); return; } //Disable wand
else { return; } //use no spells and wait threat to be reduced
}
}
// buff up
if (CastSpell(ICY_VEINS,m_bot)) {} //nogcd
if (m_bot->getRace() == (uint8) RACE_TROLL && CastSpell(R_BERSERKING,m_bot)) {} //no GCD
if (m_bot->getRace() == (uint8) RACE_ORC && CastSpell(R_BLOOD_FURY,m_bot)) {} //no GCD
if (CastSpell(POM,m_bot)) {} //nogcd
if (TALENT_ARCANE)
{
if (CastSpell(ARCANE_POWER,m_bot)) {} //nogcd
if (CastSpell(MIRROR_IMAGE,m_bot)) { return; }
//AOE
if (isUnderAttack(m_tank,5))
{
if (CastSpell(BLIZZARD,pTarget)) { return; }
}
//DPS
if (ARCANE_BLAST)
{
Aura *abaura = m_bot->GetAura(P_ARCANE_BLAST);
if (abaura && abaura->GetStackAmount() >= 3)
{
if (m_bot->HasAura(P_MISSILE_BARRAGE) && CastSpell(ARCANE_MISSILES,pTarget)) { return; }
else if (CastSpell(ARCANE_BARRAGE,pTarget)) { return; }
}
}
if (CastSpell(ARCANE_BARRAGE,pTarget) ) { return; }
}
if (TALENT_FIRE)
{
if (CastSpell(COMBUSTION,m_bot)) { } //nogcd
if (CastSpell(MIRROR_IMAGE,m_bot)) { return; }
//AOE
if (isUnderAttack(m_tank,5))
{
if (CastSpell(FLAMESTRIKE,pTarget)) { return; }
if (CastSpell(BLAST_WAVE,pTarget)) { return; }
if (CastSpell(LIVING_BOMB,pTarget)) { return; }
if (CastSpell(DRAGONS_BREATH,pTarget)) { return; }
}
//DPS
if (m_bot->HasAura(P_HOT_STREAK) && CastSpell(PYROBLAST,pTarget)) { return; }
if (!pTarget->HasAura(LIVING_BOMB,m_bot->GetGUID()) && CastSpell(LIVING_BOMB,pTarget)) { return; }
//if (!pTarget->HasAura(IMP_SCORCH) && CastSpell(SCORCH,pTarget)) { return; }
if (CastSpell(FIREBALL,pTarget)) { return; }
}
if (TALENT_FROST)
{
if (CastSpell(MIRROR_IMAGE,m_bot)) { return; }
if (CastSpell(WATER_ELEMENTAL,m_bot)) { return; }
示例15: UpdateAI
void UpdateAI(const uint32 uiDiff)
{
if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
return;
if (m_bTimeToDie)
{
FakeDeath();
return;
}
if (m_bDead)
{
if (m_uiRespawnTimer < uiDiff)
{
m_creature->SetHealth(m_creature->GetMaxHealth());
m_creature->SetVisibility(VISIBILITY_OFF);
Init();
m_creature->MonsterTextEmote("%s appears to defend Emalon!", 0, true);
if (m_pInstance)
{
Creature* pEmalon = (Creature*)Unit::GetUnit((*m_creature), m_pInstance->GetData64(DATA_EMALON));
if (pEmalon)
{
Unit* pTarget = pEmalon->getVictim();
if (pTarget)
m_creature->GetMotionMaster()->MoveChase(pTarget);
}
}
return;
}
else
{
m_uiRespawnTimer -= uiDiff;
return;
}
}
Aura* pAuraOvercharged = m_creature->GetAura(SPELL_OVERCHARGED, 0);
if(pAuraOvercharged && pAuraOvercharged->GetStackAmount() >= 10)
{
DoCast(m_creature, SPELL_OVERCHARGED_BLAST);
m_bTimeToDie = true;
return;
}
if(m_uiShockTimer < uiDiff)
{
DoCast(m_creature->getVictim(), SPELL_SHOCK);
m_uiShockTimer = 8000+rand()%4000;
}
else
m_uiShockTimer -= uiDiff;
if(m_uiEvadeCheckTimer < uiDiff)
{
if(m_creature->GetDistance2d(-229.11f, -289.03f) > 70.0f)
EnterEvadeMode();
m_uiEvadeCheckTimer = 2000;
}
else
m_uiEvadeCheckTimer -= uiDiff;
DoMeleeAttackIfReady();
}