本文整理汇总了C++中GetSpellMaxRange函数的典型用法代码示例。如果您正苦于以下问题:C++ GetSpellMaxRange函数的具体用法?C++ GetSpellMaxRange怎么用?C++ GetSpellMaxRange使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了GetSpellMaxRange函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: switch
Unit* ScriptedAI::SelectCastTarget(uint32 spellId, castTargetMode targetMode)
{
switch (targetMode)
{
case CAST_TANK:
return me->getVictim();
case CAST_NULL:
return NULL;
case CAST_RANDOM:
case CAST_RANDOM_WITHOUT_TANK:
{
SpellEntry const* pSpell = GetSpellStore()->LookupEntry(spellId);
return SelectUnit(SELECT_TARGET_RANDOM, 0, GetSpellMaxRange(spellId), pSpell->AttributesEx3 & SPELL_ATTR_EX3_PLAYERS_ONLY, targetMode == CAST_RANDOM_WITHOUT_TANK ? me->getVictimGUID() : 0);
}
case CAST_SELF:
return me;
case CAST_LOWEST_HP_FRIENDLY:
{
SpellEntry const* pSpell = GetSpellStore()->LookupEntry(spellId);
return SelectLowestHpFriendly(GetSpellMaxRange(spellId));
}
case CAST_THREAT_SECOND:
{
SpellEntry const* pSpell = GetSpellStore()->LookupEntry(spellId);
return SelectUnit(SELECT_TARGET_TOPAGGRO, 1, GetSpellMaxRange(spellId), pSpell->AttributesEx3 & SPELL_ATTR_EX3_PLAYERS_ONLY);
}
default:
return NULL;
};
}
示例2: GetSpellMaxRange
void
TotemAI::UpdateAI(const uint32 /*diff*/)
{
if (i_totem.GetTotemType() != TOTEM_ACTIVE)
return;
if (!i_totem.isAlive() || i_totem.IsNonMeleeSpellCasted(false))
return;
// Search spell
SpellEntry const *spellInfo = sSpellStore.LookupEntry(i_totem.GetSpell());
if (!spellInfo)
return;
// Get spell rangy
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex);
float max_range = GetSpellMaxRange(srange);
// SPELLMOD_RANGE not applied in this place just because not existence range mods for attacking totems
// pointer to appropriate target if found any
Unit* victim = i_victimGuid ? ObjectAccessor::GetUnit(i_totem, i_victimGuid) : NULL;
// Search victim if no, not attackable, or out of range, or friendly (possible in case duel end)
if (!victim ||
!victim->isTargetableForAttack() || !i_totem.IsWithinDistInMap(victim, max_range) ||
i_totem.IsFriendlyTo(victim) || !victim->isVisibleForOrDetect(&i_totem,false))
{
CellPair p(BlizzLike::ComputeCellPair(i_totem.GetPositionX(),i_totem.GetPositionY()));
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
victim = NULL;
BlizzLike::NearestAttackableUnitInObjectRangeCheck u_check(&i_totem, &i_totem, max_range);
BlizzLike::UnitLastSearcher<BlizzLike::NearestAttackableUnitInObjectRangeCheck> checker(victim, u_check);
TypeContainerVisitor<BlizzLike::UnitLastSearcher<BlizzLike::NearestAttackableUnitInObjectRangeCheck>, GridTypeMapContainer > grid_object_checker(checker);
TypeContainerVisitor<BlizzLike::UnitLastSearcher<BlizzLike::NearestAttackableUnitInObjectRangeCheck>, WorldTypeMapContainer > world_object_checker(checker);
//TODO: Backport BLizzLike Add to CreatureAI field pointing to creature itself
//cell.Visit(p, grid_object_checker, *m_creature.GetMap(), *m_creature, max_range);
//cell.Visit(p, world_object_checker, *m_creature.GetMap(), *m_creature, max_range);
cell.Visit(p, grid_object_checker, *i_totem.GetMap());
cell.Visit(p, world_object_checker, *i_totem.GetMap());
}
// If have target
if (victim)
{
// remember
i_victimGuid = victim->GetGUID();
// attack
i_totem.SetInFront(victim); // client change orientation by self
i_totem.CastSpell(victim, i_totem.GetSpell(), false);
}
else
i_victimGuid = 0;
}
示例3: CreatureAI
TurretAI::TurretAI(Creature *c) : CreatureAI(c)
{
ASSERT(me->m_spells[0]);
m_minRange = GetSpellMinRange(me->m_spells[0], false);
me->m_CombatDistance = GetSpellMaxRange(me->m_spells[0], false);
me->m_SightDistance = me->m_CombatDistance;
}
示例4: GetSpellMaxRange
void GameObject::TriggeringLinkedGameObject( uint32 trapEntry, Unit* target)
{
GameObjectInfo const* trapInfo = sGOStorage.LookupEntry<GameObjectInfo>(trapEntry);
if(!trapInfo || trapInfo->type!=GAMEOBJECT_TYPE_TRAP)
return;
SpellEntry const* trapSpell = sSpellStore.LookupEntry(trapInfo->trap.spellId);
if(!trapSpell) // checked at load already
return;
float range = GetSpellMaxRange(sSpellRangeStore.LookupEntry(trapSpell->rangeIndex));
// search nearest linked GO
GameObject* trapGO = NULL;
{
// using original GO distance
CellPair p(MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY()));
Cell cell(p);
cell.data.Part.reserved = ALL_DISTRICT;
MaNGOS::NearestGameObjectEntryInObjectRangeCheck go_check(*target,trapEntry,range);
MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck> checker(trapGO,go_check);
TypeContainerVisitor<MaNGOS::GameObjectLastSearcher<MaNGOS::NearestGameObjectEntryInObjectRangeCheck>, GridTypeMapContainer > object_checker(checker);
CellLock<GridReadGuard> cell_lock(cell, p);
cell_lock->Visit(cell_lock, object_checker, *GetMap());
}
// found correct GO
// FIXME: when GO casting will be implemented trap must cast spell to target
if(trapGO)
target->CastSpell(target,trapSpell,true);
}
示例5: CreatureAI
TurretAI::TurretAI(Creature *c) : CreatureAI(c)
{
if (!me->m_spells[0])
sLog.outError("TurretAI set for creature (entry = %u) with spell1=0. AI will do nothing", me->GetEntry());
m_minRange = GetSpellMinRange(me->m_spells[0], false);
me->m_CombatDistance = GetSpellMaxRange(me->m_spells[0], false);
me->m_SightDistance = me->m_CombatDistance;
}
示例6: CreatureAI
ArchorAI::ArchorAI(Creature *c) : CreatureAI(c)
{
if (!me->m_spells[0])
sLog->outError("ArchorAI set for creature (entry = %u) with spell1=0. AI will do nothing", me->GetEntry());
m_minRange = GetSpellMinRange(me->m_spells[0], false);
if (!m_minRange)
m_minRange = MELEE_RANGE;
me->m_CombatDistance = GetSpellMaxRange(me->m_spells[0], false);
me->m_SightDistance = me->m_CombatDistance;
}
示例7: CreatureAI
ArcherAI::ArcherAI(Creature* c) : CreatureAI(c)
{
SpellEntry const* spellInfo = sSpellStore.LookupEntry(me->m_spells[0]);
m_minRange = spellInfo ? GetSpellMinRange(spellInfo) : 0;
if (!m_minRange)
m_minRange = MELEE_RANGE;
me->SetCombatDistance(spellInfo ? GetSpellMaxRange(spellInfo) : 0);
me->m_SightDistance = me->GetCombatDistance();
}
示例8: UpdateAI
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
//IceArmor_Timer
if (IceArmor_Timer < diff)
{
DoCast(m_creature, SPELL_ICEARMOR);
IceArmor_Timer = 180000;
}else IceArmor_Timer -= diff;
//Frostbolt_Timer
if (Frostbolt_Timer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0, GetSpellMaxRange(SPELL_FROSTBOLT), true);
if (target)
DoCast(target,SPELL_FROSTBOLT);
Frostbolt_Timer = 8000;
}else Frostbolt_Timer -= diff;
//Freeze_Timer
if (Freeze_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_FREEZE);
Freeze_Timer = 24000;
}else Freeze_Timer -= diff;
//Fear_Timer
if (Fear_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_FEAR);
Fear_Timer = 30000;
}else Fear_Timer -= diff;
//ChillNova_Timer
if (ChillNova_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_CHILLNOVA);
ChillNova_Timer = 14000;
}else ChillNova_Timer -= diff;
//FrostVolley_Timer
if (FrostVolley_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_FROSTVOLLEY);
FrostVolley_Timer = 15000;
}else FrostVolley_Timer -= diff;
DoMeleeAttackIfReady();
}
示例9: GetSpellMaxRange
void
TotemAI::UpdateAI(const uint32 /*diff*/)
{
if (getTotem().GetTotemType() != TOTEM_ACTIVE)
return;
if (!m_creature->isAlive() || m_creature->IsNonMeleeSpellCasted(false))
return;
// Search spell
SpellEntry const *spellInfo = sSpellStore.LookupEntry(getTotem().GetSpell());
if (!spellInfo)
return;
SpellMiscEntry const* spellMisc = sSpellMiscStore.LookupEntry(spellInfo->Id);
// Get spell rangy
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellMisc->rangeIndex);
float max_range = GetSpellMaxRange(srange);
// SPELLMOD_RANGE not applied in this place just because nonexistent range mods for attacking totems
// pointer to appropriate target if found any
Unit* victim = m_creature->GetMap()->GetUnit(i_victimGuid);
// Search victim if no, not attackable, or out of range, or friendly (possible in case duel end)
if( !victim ||
!victim->isTargetableForAttack() || !m_creature->IsWithinDistInMap(victim, max_range) ||
m_creature->IsFriendlyTo(victim) || !victim->isVisibleForOrDetect(m_creature,m_creature,false) )
{
victim = NULL;
Strawberry::NearestAttackableUnitInObjectRangeCheck u_check(m_creature, m_creature, max_range);
Strawberry::UnitLastSearcher<Strawberry::NearestAttackableUnitInObjectRangeCheck> checker(victim, u_check);
Cell::VisitAllObjects(m_creature, checker, max_range);
}
// If have target
if (victim)
{
// remember
i_victimGuid = victim->GetObjectGuid();
// attack
m_creature->SetInFront(victim); // client change orientation by self
m_creature->CastSpell(victim, getTotem().GetSpell(), false);
}
else
i_victimGuid.Clear();
}
示例10: UpdateAI
void UpdateAI(const uint32 diff)
{
if(!UpdateVictim())
return;
if( BerserkerCharge_Timer < diff )
{
Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,GetSpellMaxRange(SPELL_BERSERKER_CHARGE), true);
if( target )
DoCast(target,SPELL_BERSERKER_CHARGE);
BerserkerCharge_Timer = 25000;
}else BerserkerCharge_Timer -= diff;
if( Uppercut_Timer < diff )
{
DoCast(m_creature->getVictim(),SPELL_UPPERCUT);
Uppercut_Timer = 20000;
}else Uppercut_Timer -= diff;
if( Thunderclap_Timer < diff )
{
DoCast(m_creature->getVictim(),SPELL_THUNDERCLAP);
Thunderclap_Timer = 15000;
}else Thunderclap_Timer -= diff;
if( MortalStrike_Timer < diff )
{
DoCast(m_creature->getVictim(),SPELL_MORTAL_STRIKE);
MortalStrike_Timer = 15000;
}else MortalStrike_Timer -= diff;
if( Cleave_Timer < diff )
{
DoCast(m_creature->getVictim(),SPELL_CLEAVE);
Cleave_Timer = 7000;
}else Cleave_Timer -= diff;
DoMeleeAttackIfReady();
}
示例11: UpdateAI
void UpdateAI (const uint32 diff)
{
if (!UpdateVictim())
return;
//Bomb_Timer
if (Bomb_Timer < diff)
{
if (Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0, GetSpellMaxRange(SPELL_BOMB), true))
{
DoCast(target, SPELL_BOMB);
Bomb_Timer = 5000;
}
}
else
Bomb_Timer -= diff;
//Check_Timer
if (Check_Timer < diff)
{
if (pInstance)
{
if (pInstance->GetData(DATA_JEKLIKEVENT) == DONE)
{
m_creature->setDeathState(JUST_DIED);
m_creature->RemoveCorpse();
}
}
Check_Timer = 1000;
}
else
Check_Timer -= diff;
DoMeleeAttackIfReady();
}
示例12: UpdateAllies
//.........这里部分代码省略.........
if (spellInfo->HasAttribute(SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY))
{
m_spellType[PET_SPELL_FREEACTION].insert(spellID);
continue;
}
// don't have SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY !
if (spellInfo->HasAttribute(SPELL_ATTR_EX_CANT_REFLECTED) ||
spellInfo->HasAttribute(SPELL_ATTR_EX7_HAS_CHARGE_EFFECT))
{
m_spellType[PET_SPELL_ATTACKSTART].insert(spellID);
continue;
}
if (IsSpellIncreaseThreat(spellInfo))
{
m_spellType[PET_SPELL_THREAT].insert(spellID);
continue;
}
// all non-combat spells classified.
switch (spellInfo->rangeIndex)
{
case SPELL_RANGE_IDX_COMBAT:
{
if (IsSpellCauseDamage(spellInfo))
{
m_spellType[PET_SPELL_MELEE].insert(spellID);
++meleeDamageSpells;
}
else
{
m_spellType[PET_SPELL_SPECIAL].insert(spellID);
}
break;
}
// possible debuffs or auras?
case SPELL_RANGE_IDX_SELF_ONLY:
case SPELL_RANGE_IDX_ANYWHERE:
{
m_spellType[PET_SPELL_SPECIAL].insert(spellID);
break;
}
default:
{
float range = GetSpellMaxRange(sSpellRangeStore.LookupEntry(spellInfo->rangeIndex), false);
if (f_range < M_NULL_F || (range > M_NULL_F && range < f_range))
f_range = range;
if (IsSpellCauseDamage(spellInfo))
{
m_spellType[PET_SPELL_RANGED].insert(spellID);
++rangedDamageSpells;
}
else
{
m_spellType[PET_SPELL_SPECIAL].insert(spellID);
}
break;
}
}
}
// define initial AI type
if (m_creature->IsVehicle())
m_AIType = PET_AI_PASSIVE;
if (m_spellType[PET_SPELL_RANGED].size() > 0 && (m_spellType[PET_SPELL_MELEE].size() < m_spellType[PET_SPELL_RANGED].size()))
{
m_AIType = PET_AI_RANGED;
m_attackDistance = f_range - m_creature->GetObjectBoundingRadius() - 2.0f;
if (m_attackDistance < 20.0f)
m_attackDistance = 18.0f;
}
else
{
m_AIType = PET_AI_MELEE;
m_attackDistance = 0.0f;
}
m_savedAIType = m_AIType;
m_creature->GetMotionMaster()->MoveTargetedHome();
DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS,"PetAI::Reset %s, AI %u dist %f, spells: "SIZEFMTD" "SIZEFMTD" "SIZEFMTD" "SIZEFMTD" "SIZEFMTD" "SIZEFMTD" "SIZEFMTD" "SIZEFMTD" "SIZEFMTD" "SIZEFMTD" "SIZEFMTD" "SIZEFMTD ,
m_creature->GetObjectGuid().GetString().c_str(),
m_AIType,
m_attackDistance,
m_spellType[PET_SPELL_PASSIVE].size(),
m_spellType[PET_SPELL_NONCOMBAT].size(),
m_spellType[PET_SPELL_BUFF].size(),
m_spellType[PET_SPELL_DEBUFF].size(),
m_spellType[PET_SPELL_FREEACTION].size(),
m_spellType[PET_SPELL_ATTACKSTART].size(),
m_spellType[PET_SPELL_THREAT].size(),
m_spellType[PET_SPELL_MELEE].size(),
m_spellType[PET_SPELL_RANGED].size(),
m_spellType[PET_SPELL_DEFENCE].size(),
m_spellType[PET_SPELL_SPECIAL].size(),
m_spellType[PET_SPELL_HEAL].size()
);
}
示例13: UpdateAI
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim() )
return;
if(CheckTimer < diff)
{
if(!m_creature->IsWithinDistInMap(&wLoc, 30.0f))
EnterEvadeMode();
else
DoZoneInCombat();
CheckTimer = 3000;
}
else
CheckTimer -= diff;
if(Enrage_Timer < diff && !Enraged)
{
DoCast(m_creature, SPELL_BERSERK,true);
Enraged = true;
}
else
Enrage_Timer -=diff;
if(Holyground_Timer < diff)
{
DoCast(m_creature, SPELL_HOLYGROUND, true); //Triggered so it doesn't interrupt her at all
Holyground_Timer = 3000;
}
else
Holyground_Timer -= diff;
if (Repentance_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_REPENTANCE);
DoScriptText(RAND(SAY_REPENTANCE1, SAY_REPENTANCE2), m_creature);
Repentance_Timer = 30000 + rand()%15000; //A little randomness on that spell
Holyfire_Timer += 6000;
}
else
Repentance_Timer -= diff;
if(Holyfire_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,GetSpellMaxRange(SPELL_HOLYFIRE), true))
DoCast(target,SPELL_HOLYFIRE);
Holyfire_Timer = 8000 + rand()%17000; //Anywhere from 8 to 25 seconds, good luck having several of those in a row!
}
else
Holyfire_Timer -= diff;
if(Holywrath_Timer < diff)
{
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,GetSpellMaxRange(SPELL_HOLYWRATH), true))
DoCast(target,SPELL_HOLYWRATH);
Holywrath_Timer = 20000+(rand()%10000); //20-30 secs sounds nice
}
else
Holywrath_Timer -= diff;
DoMeleeAttackIfReady();
}
示例14: UpdateAI
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
//BrainWashTotem_Timer
if (BrainWashTotem_Timer < diff)
{
DoCast(m_creature, SPELL_BRAINWASHTOTEM);
BrainWashTotem_Timer = 18000 + rand()%8000;
}
else
BrainWashTotem_Timer -= diff;
//HealingWard_Timer
if (HealingWard_Timer < diff)
{
DoCast(m_creature, SPELL_POWERFULLHEALINGWARD);
HealingWard_Timer = 14000 + rand()%6000;
}
else
HealingWard_Timer -= diff;
//Hex_Timer
if (Hex_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_HEX);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(m_creature->getVictim(),-80);
Hex_Timer = 12000 + rand()%8000;
}
else
Hex_Timer -= diff;
//Casting the delusion curse with a shade. So shade will attack the same target with the curse.
if(Delusions_Timer < diff)
{
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0, GetSpellMaxRange(SPELL_DELUSIONSOFJINDO), true))
{
DoCast(target, SPELL_DELUSIONSOFJINDO);
Shade = m_creature->SummonCreature(14986, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if(Shade)
Shade->AI()->AttackStart(target);
}
Delusions_Timer = 4000 + rand()%8000;
}
else
Delusions_Timer -= diff;
//Teleporting a random gamer and spawning 9 skeletons that will attack this gamer
if(Teleport_Timer < diff)
{
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0, 200, true))
{
DoTeleportPlayer(target, -11583.7783,-1249.4278,77.5471,4.745);
if(DoGetThreat(m_creature->getVictim()))
DoModifyThreatPercent(target,-100);
Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()+2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if(Skeletons)
Skeletons->AI()->AttackStart(target);
Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()-2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if(Skeletons)
Skeletons->AI()->AttackStart(target);
Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()+4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if(Skeletons)
Skeletons->AI()->AttackStart(target);
Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()-4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if(Skeletons)
Skeletons->AI()->AttackStart(target);
Skeletons = m_creature->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if(Skeletons)
Skeletons->AI()->AttackStart(target);
Skeletons = m_creature->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if(Skeletons)
Skeletons->AI()->AttackStart(target);
Skeletons = m_creature->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if(Skeletons)
Skeletons->AI()->AttackStart(target);
Skeletons = m_creature->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if(Skeletons)
Skeletons->AI()->AttackStart(target);
Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()+3, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
if(Skeletons)
Skeletons->AI()->AttackStart(target);
}
Teleport_Timer = 15000 + rand()%8000;
}
else
Teleport_Timer -= diff;
DoMeleeAttackIfReady();
}
示例15: UpdateAI
void UpdateAI(const uint32 diff)
{
if(!UpdateVictim())
return;
if (checkTimer2 < diff)
{
if (!m_creature->IsWithinDistInMap(&wLoc, 50))
EnterEvadeMode();
else
DoZoneInCombat();
checkTimer2 = 3000;
}
else
checkTimer2 -= diff;
if(BerserkTimer < diff)
{
AddSpellToCastWithScriptText(m_creature, SPELL_BERSERK, YELL_BERSERK);
BerserkTimer = 60000;
}else BerserkTimer -= diff;
if(Phase == PHASE_LYNX || Phase == PHASE_ENRAGE)
{
if(SaberlashTimer < diff)
{
AddSpellToCastWithScriptText(m_creature->getVictim(), SPELL_SABER_LASH, RAND(YELL_SABER_ONE, YELL_SABER_TWO));
SaberlashTimer = 5000 + rand() % 10000;
}else SaberlashTimer -= diff;
if(FrenzyTimer < diff)
{
AddSpellToCast(m_creature, SPELL_FRENZY);
FrenzyTimer = (10+rand()%5)*1000;
}else FrenzyTimer -= diff;
if(Phase == PHASE_LYNX)
if(CheckTimer < diff)
{
if(m_creature->GetHealth() * 4 < m_creature->GetMaxHealth() * (3 - TransformCount))
EnterPhase(PHASE_SPLIT);
CheckTimer = 1000;
}else CheckTimer -= diff;
}
if(Phase == PHASE_HUMAN || Phase == PHASE_ENRAGE)
{
if(TotemTimer < diff)
{
AddSpellToCast(m_creature, SPELL_SUMMON_TOTEM);
TotemTimer = 20000;
}else TotemTimer -= diff;
if(ShockTimer < diff)
{
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,GetSpellMaxRange(SPELL_EARTHSHOCK), true))
{
if(target->IsNonMeleeSpellCasted(false))
AddSpellToCast(target,SPELL_EARTHSHOCK);
else
AddSpellToCast(target,SPELL_FLAMESHOCK);
ShockTimer = 10000 + rand()%5000;
}
}else ShockTimer -= diff;
if(Phase == PHASE_HUMAN)
if(CheckTimer < diff)
{
if( ((m_creature->GetHealth()*100) / m_creature->GetMaxHealth() <= 20)/*m_creature->GetHealth() * 10 < m_creature->GetMaxHealth()*/)
EnterPhase(PHASE_MERGE);
else
{
Unit *Lynx = Unit::GetUnit(*m_creature, LynxGUID);
if(Lynx && ((Lynx->GetHealth()*100) / Lynx->GetMaxHealth() <= 20)/*Lynx->GetHealth() * 10 < Lynx->GetMaxHealth()*/)
EnterPhase(PHASE_MERGE);
}
CheckTimer = 1000;
}else CheckTimer -= diff;
}
if(Phase == PHASE_MERGE)
{
if(CheckTimer < diff)
{
Unit *Lynx = Unit::GetUnit(*m_creature, LynxGUID);
if(Lynx)
{
Lynx->GetMotionMaster()->MoveFollow(m_creature, 0, 0);
m_creature->GetMotionMaster()->MoveFollow(Lynx, 0, 0);
if(m_creature->IsWithinDistInMap(Lynx, 6.0f))
{
if(TransformCount < 3)
EnterPhase(PHASE_LYNX);
else
EnterPhase(PHASE_ENRAGE);
}
}
CheckTimer = 1000;
}else CheckTimer -= diff;
}
//.........这里部分代码省略.........