bool CMobController::CheckDetection(CBattleEntity* PTarget)
{
    if (CanDetectTarget(PTarget) || CanPursueTarget(PTarget) || PMob->StatusEffectContainer->HasStatusEffect(EFFECT_BIND))
    {
        TapDeaggroTime();
    }

    if (m_Tick >= m_DeaggroTime + 25s)
    {
        return true;
    }
    return false;
}
示例#2
0
bool CAIController::TryDeaggro()
{
    if (PTarget == nullptr && (PMob->PEnmityContainer != nullptr && PMob->PEnmityContainer->GetHighestEnmity() == nullptr))
    {
        return true;
    }

    // target is no longer valid, so wipe them from our enmity list
    if (!PTarget || PTarget->isDead() ||
            PTarget->animation == ANIMATION_CHOCOBO ||
            PTarget->loc.zone->GetID() != PMob->loc.zone->GetID() ||
            PMob->StatusEffectContainer->GetConfrontationEffect() != PTarget->StatusEffectContainer->GetConfrontationEffect() ||
            PMob->allegiance == PTarget->allegiance)
    {
        PMob->PEnmityContainer->Clear(PTarget->id);
        PTarget = PMob->PEnmityContainer->GetHighestEnmity();
        PMob->SetBattleTargetID(PTarget ? PTarget->targid : 0);
        return TryDeaggro();
    }

    bool tryDetectDeaggro = false;
    bool tryTimeDeaggro = true;

    if (PMob->m_Aggro & AGGRO_SCENT)
    {
        // if mob is in water it will instant deaggro if target cannot be detected
        if (PMob->PAI->PathFind->InWater() || PTarget->StatusEffectContainer->HasStatusEffect(EFFECT_DEODORIZE))
        {
            tryDetectDeaggro = true;
        }

        // certain weather / deodorize will turn on time deaggro
        tryTimeDeaggro = PMob->m_disableScent;
    }

    //Hide allows you to lose aggro on certain types of enemies.
    //Generally works on monsters that don't track by scent, regardless of detection method.
    //Can work on monsters that track by scent if the proper conditions are met (double rain weather, crossing over water, etc.)
    if (tryTimeDeaggro && PTarget->StatusEffectContainer->HasStatusEffect(EFFECT_HIDE))
    {
        return true;
    }

    // I will now deaggro if I cannot detect my target
    if (tryDetectDeaggro && !CanDetectTarget(PTarget))
    {
        return true;
    }

    return false;
}
示例#3
0
bool CMobController::CanAggroTarget(CBattleEntity* PTarget)
{
    // don't aggro i'm neutral
    if (!PMob->m_Aggro || PMob->m_neutral || PMob->isDead())
    {
        return false;
    }

    // Don't aggro I'm an underground worm
    if ((PMob->m_roamFlags & ROAMFLAG_WORM) && PMob->IsNameHidden())
    {
        return false;
    }

    if (PTarget->isDead() || PTarget->animation == ANIMATION_CHOCOBO)
    {
        return false;
    }

    if (PMob->PMaster == nullptr && PMob->PAI->IsSpawned() && !PMob->PAI->IsEngaged() && CanDetectTarget(PTarget))
    {
        return true;
    }

    return false;
}
示例#4
0
bool CMobController::CanAggroTarget(CBattleEntity* PTarget)
{
    // Don't aggro I'm neutral
    if (!PMob->m_Aggro || PMob->m_neutral || PMob->isDead())
    {
        return false;
    }

    // Don't aggro I'm special
    if (PMob->getMobMod(MOBMOD_NO_AGGRO) > 0)
    {
        return false;
    }

    // Don't aggro I'm an underground worm
    if ((PMob->m_roamFlags & ROAMFLAG_WORM) && PMob->IsNameHidden())
    {
        return false;
    }

    if (PTarget->isDead() || PTarget->isMounted())
    {
        return false;
    }

    if (PMob->PMaster == nullptr && PMob->PAI->IsSpawned() && !PMob->PAI->IsEngaged() && CanDetectTarget(PTarget))
    {
        return true;
    }

    return false;
}
bool CMobController::CanAggroTarget(CBattleEntity* PTarget)
{
    // don't aggro i'm neutral
    if (!PMob->m_Aggro || PMob->m_neutral || PMob->isDead())
    {
        return false;
    }

    if (PTarget->isDead() || PTarget->animation == ANIMATION_CHOCOBO)
    {
        return false;
    }

    if (PMob->PMaster == nullptr && PMob->PAI->IsSpawned() && !PMob->PAI->IsEngaged() && CanDetectTarget(PTarget))
    {
        return true;
    }

    return false;
}