您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ HandleReturnMovement函数代码示例

51自学网 2021-06-01 21:25:19
  C++
这篇教程C++ HandleReturnMovement函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中HandleReturnMovement函数的典型用法代码示例。如果您正苦于以下问题:C++ HandleReturnMovement函数的具体用法?C++ HandleReturnMovement怎么用?C++ HandleReturnMovement使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了HandleReturnMovement函数的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: SelectNextTarget

void PetAI::KilledUnit(Unit *victim) {	// Called from Unit::Kill() in case where pet or owner kills something	// if owner killed this victim, pet may still be attacking something else	if (me->getVictim() && me->getVictim() != victim)		return;	// Clear target just in case. May help problem where health / focus / mana	// regen gets stuck. Also resets attack command.	// Can't use _stopAttack() because that activates movement handlers and ignores	// next target selection	me->AttackStop();	me->GetCharmInfo()->SetIsCommandAttack(false);	Unit *nextTarget = SelectNextTarget();	if (nextTarget)		AttackStart(nextTarget);	else		HandleReturnMovement(); // Return}
开发者ID:dsstest,项目名称:ArkCORE,代码行数:20,


示例2: ClearCharmInfoFlags

void PetAI::_stopAttack(){    if (!me->isAlive())    {        sLog->outDebug(LOG_FILTER_GENERAL, "Creature stoped attacking cuz his dead [guid=%u]", me->GetGUIDLow());        me->GetMotionMaster()->Clear();        me->GetMotionMaster()->MoveIdle();        me->CombatStop();        me->getHostileRefManager().deleteReferences();        return;    }    me->AttackStop();    me->InterruptNonMeleeSpells(false);    me->SendMeleeAttackStop(); // Should stop pet's attack button from flashing    me->GetCharmInfo()->SetIsCommandAttack(false);    ClearCharmInfoFlags();    HandleReturnMovement();}
开发者ID:Arphenion-Dev,项目名称:Source,代码行数:20,


示例3: AttackStart

void PetAI::KilledUnit(Unit* victim){    // Called from Unit::Kill() in case where pet or owner kills something    // if owner killed this victim, pet may still be attacking something else    if (me->getVictim() && me->getVictim() != victim)        return;    // Clear target just in case. May help problem where health / focus / mana    // regen gets stuck. Also resets attack command.    // Can't use _stopAttack() because that activates movement handlers and ignores    // next target selection    me->AttackStop();    me->InterruptNonMeleeSpells(false);    me->SendMeleeAttackStop();  // Stops the pet's 'Attack' button from flashing    // Before returning to owner, see if there are more things to attack    if (Unit* nextTarget = SelectNextTarget(false))        AttackStart(nextTarget);    else        HandleReturnMovement(); // Return}
开发者ID:Ne3x,项目名称:TrinityCore,代码行数:21,


示例4: AttackStart

void PetAI::KilledUnit(Unit* victim){    // Called from Unit::Kill() in case where pet or owner kills something    // if owner killed this victim, pet may still be attacking something else    if (me->GetVictim() && me->GetVictim() != victim)        return;    // Xinef: if pet is channeling a spell and owner killed something different, dont interrupt it    if (me->HasUnitState(UNIT_STATE_CASTING) && me->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT) && me->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT) != victim->GetGUID())        return;    // Clear target just in case. May help problem where health / focus / mana    // regen gets stuck. Also resets attack command.    // Can't use _stopAttack() because that activates movement handlers and ignores    // next target selection    me->AttackStop();    me->InterruptNonMeleeSpells(false);    // Before returning to owner, see if there are more things to attack    if (Unit* nextTarget = SelectNextTarget(false))        AttackStart(nextTarget);    else        HandleReturnMovement(); // Return}
开发者ID:rynnokung,项目名称:azerothcore-wotlk,代码行数:24,


示例5: UpdateAllies

void PetAI::UpdateAI(const uint32 diff){    if (!me->isAlive() || !me->GetCharmInfo())        return;    Unit* owner = me->GetCharmerOrOwner();    if (m_updateAlliesTimer <= diff)        // UpdateAllies self set update timer        UpdateAllies();    else        m_updateAlliesTimer -= diff;    if (me->getVictim() && me->getVictim()->isAlive())    {        // is only necessary to stop casting, the pet must not exit combat        if (me->getVictim()->HasBreakableByDamageCrowdControlAura(me))        {            me->InterruptNonMeleeSpells(false);            return;        }        if (_needToStop())        {            sLog->outDebug(LOG_FILTER_GENERAL, "Pet AI stopped attacking [guid=%u]", me->GetGUIDLow());            _stopAttack();            return;        }        // Check before attacking to prevent pets from leaving stay position        if (me->GetCharmInfo()->HasCommandState(COMMAND_STAY))        {            if (me->GetCharmInfo()->IsCommandAttack() || (me->GetCharmInfo()->IsAtStay() && me->IsWithinMeleeRange(me->getVictim())))                DoMeleeAttackIfReady();        }        else            DoMeleeAttackIfReady();    }    else    {        if (me->HasReactState(REACT_AGGRESSIVE) || me->GetCharmInfo()->IsAtStay())        {            // Every update we need to check targets only in certain cases            // Aggressive - Allow auto select if owner or pet don't have a target            // Stay - Only pick from pet or owner targets / attackers so targets won't run by            //   while chasing our owner. Don't do auto select.            // All other cases (ie: defensive) - Targets are assigned by AttackedBy(), OwnerAttackedBy(), OwnerAttacked(), etc.            Unit* nextTarget = SelectNextTarget(me->HasReactState(REACT_AGGRESSIVE));            if (nextTarget)                AttackStart(nextTarget);            else                HandleReturnMovement();        }        else            HandleReturnMovement();    }    // Autocast (casted only in combat or persistent spells in any state)    if (!me->HasUnitState(UNIT_STATE_CASTING))    {        typedef std::vector<std::pair<Unit*, Spell*> > TargetSpellList;        TargetSpellList targetSpellStore;        for (uint8 i = 0; i < me->GetPetAutoSpellSize(); ++i)        {            uint32 spellID = me->GetPetAutoSpellOnPos(i);            if (!spellID)                continue;            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);            if (!spellInfo)                continue;            if (me->GetCharmInfo() && me->GetCharmInfo()->GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo))                continue;            if (spellInfo->IsPositive())            {                if (spellInfo->CanBeUsedInCombat())                {                    // check spell cooldown                    if (me->HasSpellCooldown(spellInfo->Id))                        continue;                    // Check if we're in combat or commanded to attack                    if (!me->isInCombat() && !me->GetCharmInfo()->IsCommandAttack())                        continue;                }                Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE, 0);                bool spellUsed = false;                // Some spells can target enemy or friendly (DK Ghoul's Leap)                // Check for enemy first (pet then owner)                Unit* target = me->getAttackerForHelper();                if (!target && owner)                    target = owner->getAttackerForHelper();                if (target)//.........这里部分代码省略.........
开发者ID:Ne3x,项目名称:TrinityCore,代码行数:101,


示例6: UpdateAllies

void PetAI::UpdateAI(const uint32 diff){    if (!me->isAlive())        return;    Unit* owner = me->GetCharmerOrOwner();    if (m_updateAlliesTimer <= diff)        // UpdateAllies self set update timer        UpdateAllies();    else        m_updateAlliesTimer -= diff;    // me->getVictim() can't be used for check in case stop fighting, me->getVictim() clear at Unit death etc.    // Must also check if victim is alive    if (me->getVictim() && me->getVictim()->isAlive())    {        // is only necessary to stop casting, the pet must not exit combat        if (me->getVictim()->HasBreakableByDamageCrowdControlAura(me))        {            me->InterruptNonMeleeSpells(false);            return;        }        if (_needToStop())        {            sLog->outDebug(LOG_FILTER_GENERAL, "Pet AI stopped attacking [guid=%u]", me->GetGUIDLow());            _stopAttack();            return;        }        DoMeleeAttackIfReady();    }    else if (owner && me->GetCharmInfo()) //no victim    {        // Only aggressive pets do target search every update.        // Defensive pets do target search only in these cases:        //  * Owner attacks something - handled by OwnerAttacked()        //  * Owner receives damage - handled by OwnerDamagedBy()        //  * Pet is in combat and current target dies - handled by KilledUnit()        if (me->HasReactState(REACT_AGGRESSIVE))        {            Unit* nextTarget = SelectNextTarget();            if (nextTarget)                AttackStart(nextTarget);            else            {                me->GetCharmInfo()->SetIsCommandAttack(false);                HandleReturnMovement();            }        }        else        {            me->GetCharmInfo()->SetIsCommandAttack(false);            HandleReturnMovement();        }    }    else if (owner && !me->HasUnitState(UNIT_STATE_FOLLOW)) // no charm info and no victim        HandleReturnMovement();    if (!me->GetCharmInfo())        return;    // Autocast (casted only in combat or persistent spells in any state)    if (!me->HasUnitState(UNIT_STATE_CASTING))    {        typedef std::vector<std::pair<Unit*, Spell*> > TargetSpellList;        TargetSpellList targetSpellStore;        for (uint8 i = 0; i < me->GetPetAutoSpellSize(); ++i)        {            uint32 spellID = me->GetPetAutoSpellOnPos(i);            if (!spellID)                continue;            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);            if (!spellInfo)                continue;            if (me->GetCharmInfo() && me->GetCharmInfo()->GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo))                continue;            if (spellInfo->IsPositive())            {                if (spellInfo->CanBeUsedInCombat())                {                    // check spell cooldown                    if (me->HasSpellCooldown(spellInfo->Id))                        continue;                    // Check if we're in combat or commanded to attack                    if (!me->isInCombat() && !me->GetCharmInfo()->IsCommandAttack())                        continue;                }                Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE, 0);                bool spellUsed = false;                // Some spells can target enemy or friendly (DK Ghoul's Leap)//.........这里部分代码省略.........
开发者ID:AlmasServer,项目名称:TrinityCore,代码行数:101,


示例7: UpdateAllies

void PetAI::UpdateAI(const uint32 diff){    if (!me->isAlive())        return;    Unit* owner = me->GetCharmerOrOwner();    if (m_updateAlliesTimer <= diff)        // UpdateAllies self set update timer        UpdateAllies();    else        m_updateAlliesTimer -= diff;    // me->getVictim() can't be used for check in case stop fighting, me->getVictim() clear at Unit death etc.    if (me->getVictim())    {        // is only necessary to stop casting, the pet must not exit combat        if (me->getVictim()->HasBreakableByDamageCrowdControlAura())        {            me->InterruptNonMeleeSpells(false);            return;        }        if (_needToStop())        {            sLog->outStaticDebug("Pet AI stopped attacking [guid=%u]", me->GetGUIDLow());            _stopAttack();            return;        }        DoMeleeAttackIfReady();    }    else if (owner && me->GetCharmInfo()) //no victim    {        Unit* nextTarget = SelectNextTarget();        if (me->HasReactState(REACT_PASSIVE))            _stopAttack();        else if (nextTarget)            AttackStart(nextTarget);        else            HandleReturnMovement();    }    else if (owner && !me->HasUnitState(UNIT_STATE_FOLLOW)) // no charm info and no victim        me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle());    if (!me->GetCharmInfo())        return;    // Autocast (casted only in combat or persistent spells in any state)    if (!me->HasUnitState(UNIT_STATE_CASTING))    {        typedef std::vector<std::pair<Unit*, Spell*> > TargetSpellList;        TargetSpellList targetSpellStore;        for (uint8 i = 0; i < me->GetPetAutoSpellSize(); ++i)        {            uint32 spellID = me->GetPetAutoSpellOnPos(i);            if (!spellID)                continue;            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);            if (!spellInfo)                continue;            if (me->GetCharmInfo() && me->GetCharmInfo()->GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo))                continue;            if (spellInfo->IsPositive())            {                // non combat spells allowed                // only pet spells have IsNonCombatSpell and not fit this reqs:                // Consume Shadows, Lesser Invisibility, so ignore checks for its                if (spellInfo->CanBeUsedInCombat())                {                    // allow only spell without spell cost or with spell cost but not duration limit                    int32 duration = spellInfo->GetDuration();                    if ((spellInfo->ManaCost || spellInfo->ManaCostPercentage || spellInfo->ManaPerSecond) && duration > 0)                        continue;                    // allow only spell without cooldown > duration                    int32 cooldown = spellInfo->GetRecoveryTime();                    if (cooldown >= 0 && duration >= 0 && cooldown > duration)                        continue;                }                Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE, 0);                bool spellUsed = false;                for (std::set<uint64>::const_iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar)                {                    Unit* target = ObjectAccessor::GetUnit(*me, *tar);                    //only buff targets that are in combat, unless the spell can only be cast while out of combat                    if (!target)                        continue;                    if (spell->CanAutoCast(target))                    {                        targetSpellStore.push_back(std::make_pair<Unit*, Spell*>(target, spell));//.........这里部分代码省略.........
开发者ID:Asdcrew,项目名称:TrinityCore,代码行数:101,


示例8: UpdateAllies

void PetAI::UpdateAI(const uint32 diff){    if (!me->isAlive())        return;    Unit* owner = me->GetCharmerOrOwner();    if (m_updateAlliesTimer <= diff)        // UpdateAllies self set update timer        UpdateAllies();    else        m_updateAlliesTimer -= diff;    // me->getVictim() can't be used for check in case stop fighting, me->getVictim() clear at Unit death etc.    if (me->getVictim())    {        // is only necessary to stop casting, the pet must not exit combat        if (me->getVictim()->HasBreakableByDamageCrowdControlAura(me))        {            me->InterruptNonMeleeSpells(false);            return;        }        if (_needToStop())        {            sLog->outStaticDebug("Pet AI stopped attacking [guid=%u]", me->GetGUIDLow());            _stopAttack();            return;        }        DoMeleeAttackIfReady();    }    else if (owner && me->GetCharmInfo()) //no victim    {        Unit* nextTarget = SelectNextTarget();        if (me->HasReactState(REACT_PASSIVE))            _stopAttack();        else if (nextTarget)            AttackStart(nextTarget);        else            HandleReturnMovement();    }    else if (owner && !me->HasUnitState(UNIT_STATE_FOLLOW)) // no charm info and no victim        me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle());    if (!me->GetCharmInfo())        return;    // Autocast (casted only in combat or persistent spells in any state)    if (!me->HasUnitState(UNIT_STATE_CASTING))    {        typedef std::vector<std::pair<Unit*, Spell*> > TargetSpellList;        TargetSpellList targetSpellStore;        for (uint8 i = 0; i < me->GetPetAutoSpellSize(); ++i)        {            uint32 spellID = me->GetPetAutoSpellOnPos(i);            if (!spellID)                continue;            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);            if (!spellInfo)                continue;            // Check global cooldown            if (me->GetCharmInfo() && me->GetCharmInfo()->GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo))                continue;            // Check spell cooldown            if (me->HasSpellCooldown(spellInfo->Id))                continue;            // Check if pet is in combat and if spell can be cast            if (me->isInCombat() && !spellInfo->CanBeUsedInCombat())                continue;            // Prevent spells like Furious Howl from constantly casting out of            //  combat when the cooldown is up            if (!me->isInCombat() && !spellInfo->NeedsToBeTriggeredByCaster())                continue;            // We have a spell we can cast, let's pick a target            if (spellInfo->IsPositive())            {                // These would be buff spells like Furious Howl, Consume Shadows, etc.                Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE, 0);                bool spellUsed = false;                for (std::set<uint64>::const_iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar)                {                    Unit* target = ObjectAccessor::GetUnit(*me, *tar);                    if (!target)                        continue;                    if (spell->CanAutoCast(target))                    {                        targetSpellStore.push_back(std::make_pair<Unit*, Spell*>(target, spell));                        spellUsed = true;//.........这里部分代码省略.........
开发者ID:HkLuna,项目名称:ArkCORE2,代码行数:101,


示例9: UpdateAllies

void PetAI::UpdateAI(uint32 diff){    if (!me->IsAlive() || !me->GetCharmInfo())        return;    Unit* owner = me->GetCharmerOrOwner();    if (m_updateAlliesTimer <= diff)        // UpdateAllies self set update timer        UpdateAllies();    else        m_updateAlliesTimer -= diff;    if (me->GetVictim() && me->GetVictim()->IsAlive())    {        // is only necessary to stop casting, the pet must not exit combat        if (me->GetVictim()->HasBreakableByDamageCrowdControlAura(me))        {            me->InterruptNonMeleeSpells(false);            return;        }        if (_needToStop())        {            ;//sLog->outStaticDebug("Pet AI stopped attacking [guid=%u]", me->GetGUIDLow());            _stopAttack();            return;        }        // Check before attacking to prevent pets from leaving stay position        if (me->GetCharmInfo()->HasCommandState(COMMAND_STAY))        {            if (me->GetCharmInfo()->IsCommandAttack() || (me->GetCharmInfo()->IsAtStay() && me->IsWithinMeleeRange(me->GetVictim())))                _doMeleeAttack();        }        else            _doMeleeAttack();    }    else if (!me->GetCharmInfo() || (!me->GetCharmInfo()->GetForcedSpell() && !me->HasUnitState(UNIT_STATE_CASTING)))    {        if (me->HasReactState(REACT_AGGRESSIVE) || me->GetCharmInfo()->IsAtStay())        {            // Every update we need to check targets only in certain cases            // Aggressive - Allow auto select if owner or pet don't have a target            // Stay - Only pick from pet or owner targets / attackers so targets won't run by            //   while chasing our owner. Don't do auto select.            // All other cases (ie: defensive) - Targets are assigned by AttackedBy(), OwnerAttackedBy(), OwnerAttacked(), etc.            Unit* nextTarget = SelectNextTarget(me->HasReactState(REACT_AGGRESSIVE));            if (nextTarget)                AttackStart(nextTarget);            else                HandleReturnMovement();        }        else            HandleReturnMovement();    }    // xinef: charm info must be always available    if (!me->GetCharmInfo())        return;    // Autocast (casted only in combat or persistent spells in any state)    if (!me->HasUnitState(UNIT_STATE_CASTING))    {        if (owner && owner->GetTypeId() == TYPEID_PLAYER && me->GetCharmInfo()->GetForcedSpell() && me->GetCharmInfo()->GetForcedTarget())        {            owner->ToPlayer()->GetSession()->HandlePetActionHelper(me, me->GetGUID(), abs(me->GetCharmInfo()->GetForcedSpell()), ACT_ENABLED, me->GetCharmInfo()->GetForcedTarget());            // xinef: if spell was casted properly and we are in passive mode, handle return            if (!me->GetCharmInfo()->GetForcedSpell() && me->HasReactState(REACT_PASSIVE))            {                if (me->HasUnitState(UNIT_STATE_CASTING))                {                    me->GetMotionMaster()->Clear(false);                    me->StopMoving();                }                else                    _stopAttack();            }            return;        }        // xinef: dont allow ghouls to cast spells below 75 energy        if (me->IsPet() && me->ToPet()->IsPetGhoul() && me->GetPower(POWER_ENERGY) < 75)            return;        typedef std::vector<std::pair<Unit*, Spell*> > TargetSpellList;        TargetSpellList targetSpellStore;        for (uint8 i = 0; i < me->GetPetAutoSpellSize(); ++i)        {            uint32 spellID = me->GetPetAutoSpellOnPos(i);            if (!spellID)                continue;            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);            if (!spellInfo)                continue;//.........这里部分代码省略.........
开发者ID:rynnokung,项目名称:azerothcore-wotlk,代码行数:101,


示例10: UpdateAllies

void PetAI::UpdateAI(const uint32 diff){    if (!m_creature->isAlive() || !m_creature->GetCharmInfo())        return;    Unit* owner = m_creature->GetCharmerOrOwner();    if (m_updateAlliesTimer <= diff)        // UpdateAllies self set update timer        UpdateAllies();    else        m_updateAlliesTimer -= diff;    // First checking if we have some taunt on us    Unit* tauntTarget = NULL;    const Unit::AuraList& tauntAuras = m_creature->GetAurasByType(SPELL_AURA_MOD_TAUNT);    if (!tauntAuras.empty())    {        Unit* caster = NULL;        // Auras are pushed_back, last caster will be on the end        Unit::AuraList::const_iterator aura = tauntAuras.end();        while (aura != tauntAuras.begin())        {            --aura;            caster = (*aura)->GetCaster();            if (caster && caster->isTargetableForAttack())            {                tauntTarget = caster;                break;            }        }        if (tauntTarget)            DoAttack(tauntTarget, true);    }    if (m_creature->getVictim() && m_creature->getVictim()->isAlive())    {                if (_needToStop())        {            _stopAttack();            return;        }        if (hasMelee)        {            // Check before attacking to prevent pets from leaving stay position            bool attacked = false;            if (m_creature->GetCharmInfo()->HasCommandState(COMMAND_STAY))            {                if (m_creature->GetCharmInfo()->IsCommandAttack() || (m_creature->GetCharmInfo()->IsAtStay() && m_creature->CanReachWithMeleeAttack(m_creature->getVictim())))                    attacked = DoMeleeAttackIfReady();            }            else                attacked = DoMeleeAttackIfReady();            if (attacked && owner)                if (Unit* v = m_creature->getVictim()) // Victim may have died between                    owner->SetInCombatWith(v);        }    }    else    {        if (m_creature->HasReactState(REACT_AGGRESSIVE) || m_creature->GetCharmInfo()->IsAtStay())        {            // Every update we need to check targets only in certain cases            // Aggressive - Allow auto select if owner or pet don't have a target            // Stay - Only pick from pet or owner targets / attackers so targets won't run by            //   while chasing our owner. Don't do auto select.            // All other cases (ie: defensive) - Targets are assigned by AttackedBy(), OwnerAttackedBy(), OwnerAttacked(), etc.            Unit* nextTarget = SelectNextTarget(m_creature->HasReactState(REACT_AGGRESSIVE));            if (nextTarget)                AttackStart(nextTarget);            else                HandleReturnMovement();        }        else            HandleReturnMovement();    }    // Autocast (casted only in combat or persistent spells in any state)    if (!m_creature->IsNonMeleeSpellCasted(false))    {        typedef std::vector<std::pair<Unit*, Spell*> > TargetSpellList;        TargetSpellList targetSpellStore;        for (uint8 i = 0; i < m_creature->GetPetAutoSpellSize(); ++i)        {            uint32 spellID = m_creature->GetPetAutoSpellOnPos(i);            if (!spellID)                continue;            SpellEntry const *spellInfo = sSpellMgr.GetSpellEntry(spellID);            if (!spellInfo)                continue;            if (m_creature->GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo))//.........这里部分代码省略.........
开发者ID:Maduse,项目名称:server,代码行数:101,


示例11: UpdateAllies

void PetAI::UpdateAI(uint32 diff){    if (!me->IsAlive() || !me->GetCharmInfo())        return;    Unit* owner = me->GetCharmerOrOwner();    if (_updateAlliesTimer <= diff)        // UpdateAllies self set update timer        UpdateAllies();    else        _updateAlliesTimer -= diff;    if (me->GetVictim() && me->EnsureVictim()->IsAlive())    {        // is only necessary to stop casting, the pet must not exit combat        if (!me->GetCurrentSpell(CURRENT_CHANNELED_SPELL) && // ignore channeled spells (Pin, Seduction)            me->EnsureVictim()->HasBreakableByDamageCrowdControlAura(me))        {            me->InterruptNonMeleeSpells(false);            return;        }        if (NeedToStop())        {            TC_LOG_TRACE("scripts.ai.petai", "PetAI::UpdateAI: AI stopped attacking %s", me->GetGUID().ToString().c_str());            StopAttack();            return;        }        // Check before attacking to prevent pets from leaving stay position        if (me->GetCharmInfo()->HasCommandState(COMMAND_STAY))        {            if (me->GetCharmInfo()->IsCommandAttack() || (me->GetCharmInfo()->IsAtStay() && me->IsWithinMeleeRange(me->GetVictim())))                DoMeleeAttackIfReady();        }        else            DoMeleeAttackIfReady();    }    else    {        if (me->HasReactState(REACT_AGGRESSIVE) || me->GetCharmInfo()->IsAtStay())        {            // Every update we need to check targets only in certain cases            // Aggressive - Allow auto select if owner or pet don't have a target            // Stay - Only pick from pet or owner targets / attackers so targets won't run by            //   while chasing our owner. Don't do auto select.            // All other cases (ie: defensive) - Targets are assigned by DamageTaken(), OwnerAttackedBy(), OwnerAttacked(), etc.            Unit* nextTarget = SelectNextTarget(me->HasReactState(REACT_AGGRESSIVE));            if (nextTarget)                AttackStart(nextTarget);            else                HandleReturnMovement();        }        else            HandleReturnMovement();    }    // Autocast (cast only in combat or persistent spells in any state)    if (!me->HasUnitState(UNIT_STATE_CASTING))    {        TargetSpellList targetSpellStore;        for (uint8 i = 0; i < me->GetPetAutoSpellSize(); ++i)        {            uint32 spellID = me->GetPetAutoSpellOnPos(i);            if (!spellID)                continue;            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);            if (!spellInfo)                continue;            if (me->GetSpellHistory()->HasGlobalCooldown(spellInfo))                continue;            // check spell cooldown            if (!me->GetSpellHistory()->IsReady(spellInfo))                continue;            if (spellInfo->IsPositive())            {                if (spellInfo->CanBeUsedInCombat())                {                    // Check if we're in combat or commanded to attack                    if (!me->IsInCombat() && !me->GetCharmInfo()->IsCommandAttack())                        continue;                }                Spell* spell = new Spell(me, spellInfo, TRIGGERED_NONE);                bool spellUsed = false;                // Some spells can target enemy or friendly (DK Ghoul's Leap)                // Check for enemy first (pet then owner)                Unit* target = me->getAttackerForHelper();                if (!target && owner)                    target = owner->getAttackerForHelper();                if (target)//.........这里部分代码省略.........
开发者ID:ElunaLuaEngine,项目名称:ElunaTrinityWotlk,代码行数:101,



注:本文中的HandleReturnMovement函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ HandleScope函数代码示例
C++ HandleRemoveDisables函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。