コード例 #1
0
ファイル: SmartAI.cpp プロジェクト: Alluring/TrinityCore
void SmartAI::MoveInLineOfSight(Unit* who)
{
    if (!who) return;
    GetScript()->OnMoveInLineOfSight(who);
    if (me->HasReactState(REACT_PASSIVE) || AssistPlayerInCombat(who))
        return;

    if (!CanAIAttack(who))
        return;

    if (me->IsHostileTo(who))
    {
        float fAttackRadius = me->GetAttackDistance(who);
        if (me->IsWithinDistInMap(who, fAttackRadius) && me->IsWithinLOSInMap(who))
        {
            if (!me->getVictim())
            {
                who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);
                AttackStart(who);
            }
            else/* if (me->GetMap()->IsDungeon())*/
            {
                who->SetInCombatWith(me);
                me->AddThreat(who, 0.0f);
            }
        }
    }

    //if (me->canStartAttack(who, false))
    //    AttackStart(who);
}
コード例 #2
0
        void UpdateAI(const uint32 diff)
        {
            if (!UpdateVictim())
                return;

            if (NapalmTimer <= diff)
            {
                    if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
                    {
                        if(CanAIAttack(pTarget))
                            DoCast(pTarget,SPELL_NAPALM,true);
                    }
                    NapalmTimer = 5000;
            }
            else
                NapalmTimer-=diff;
        }
コード例 #3
0
ファイル: SmartAI.cpp プロジェクト: lasyan3/TrinityCore
bool SmartAI::AssistPlayerInCombatAgainst(Unit* who)
{
    if (me->HasReactState(REACT_PASSIVE) || !IsAIControlled())
        return false;

    if (!who || !who->GetVictim())
        return false;

    // experimental (unknown) flag not present
    if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST))
        return false;

    // not a player
    if (!who->EnsureVictim()->GetCharmerOrOwnerPlayerOrPlayerItself())
        return false;

    if (!who->isInAccessiblePlaceFor(me))
        return false;

    if (!CanAIAttack(who))
        return false;

    // we cannot attack in evade mode
    if (me->IsInEvadeMode())
        return false;

    // or if enemy is in evade mode
    if (who->GetTypeId() == TYPEID_UNIT && who->ToCreature()->IsInEvadeMode())
        return false;

    if (!me->IsValidAssistTarget(who->GetVictim()))
        return false;

    // too far away and no free sight
    if (me->IsWithinDistInMap(who, SMART_MAX_AID_DIST) && me->IsWithinLOSInMap(who))
    {
        me->EngageWithTarget(who);
        return true;
    }

    return false;
}
コード例 #4
0
ファイル: SmartAI.cpp プロジェクト: Palabola/WoD
void SmartAI::MoveInLineOfSight(Unit* who)
{
    if (!who)
        return;

    GetScript()->OnMoveInLineOfSight(who);

    if (me->HasReactState(REACT_PASSIVE) || AssistPlayerInCombat(who))
        return;

    if (!CanAIAttack(who))
        return;

    if (!me->CanStartAttack(who, false))
        return;

    if (me->IsHostileTo(who))
    {
        float fAttackRadius = me->GetAttackDistance(who);
        if (me->IsWithinDistInMap(who, fAttackRadius) && me->IsWithinLOSInMap(who))
        {
            if (!me->GetVictim())
            {
                // Clear distracted state on combat
                if (me->HasUnitState(UNIT_STATE_DISTRACTED))
                {
                   me->ClearUnitState(UNIT_STATE_DISTRACTED);
                   me->GetMotionMaster()->Clear();
                }

                AttackStart(who);
            }
            else/* if (me->GetMap()->IsDungeon())*/
            {
                who->SetInCombatWith(me);
                me->AddThreat(who, 0.0f);
            }
        }
    }
}
コード例 #5
0
 void DamageTaken(Unit *who, uint32 &damage)
 {
     if(!CanAIAttack(who))
         damage = 0;
 }
コード例 #6
0
 void MoveInLineOfSight(Unit* who) override
 {
     if (!_inCombat && who->GetTypeId() == TYPEID_PLAYER && !who->ToPlayer()->IsGameMaster() && CanAIAttack(who))
     {
         _inCombat = true;
         DoZoneInCombat();
         me->SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_STAND_STATE, UNIT_STAND_STATE_STAND);
         events.ScheduleEvent(EVENT_SUBMERGE, 10s);
     }
 }