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; }
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; }
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; }
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; }