#include "SunClientPrecompiledHeader.h" #include "AutobotActionTargeting.h" #include "Autobot/Autobot.h" #include "Autobot/Condition/AutobotCondition.h" #include "Autobot/Condition/AutobotConditionManager.h" #include "Autobot/Area/Field/AutobotAreaField.h" #include "ObjectManager.h" #include "Hero.h" #include "Monster.h" #include "HeroActionInput.h" #include "SkillInfoParser.h" #include "TargetDialog.h" #include "uiTargetMan/uiTargetMan.h" #include "uiPartyMan/uiPartyMan.h" #include "GameFramework.h" #include "SceneBase.h" //------------------------------------------------------------------------------ AutobotActionTargeting* AutobotActionTargeting::Instance() { static AutobotActionTargeting instance; return &instance; } //------------------------------------------------------------------------------ AutobotActionTargeting::AutobotActionTargeting() { } //------------------------------------------------------------------------------ AutobotActionTargeting::~AutobotActionTargeting() { } //------------------------------------------------------------------------------ bool AutobotActionTargeting::Execute(AutobotArea* owner) { bool is_update = false; if (AutobotConditionManager::Instance()->hunting().hunting_type() == AutobotCondition_Hunting::kHuntingType_Max) { //! »ç³ÉÀÌ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ½ return true; } if (AutobotConditionManager::Instance()->skill().GetAttackCount() <= 0) { //! µî·ÏµÈ °ø°Ý ½ºÅ³ÀÌ ¾øÀ»°æ¿ì¿¡´Â Ÿ°ÙÆÃÀ» ÇÏÁö ¾ÊÀ½ return true; } if (g_pHero->GetCurState() == STATE::MOVE) { is_update = true; } else if ((g_pHero->GetCurState() == STATE::IDLE) || (g_pHero->GetCurState() == STATE::SKILL)) { TargetDialog* target_dialog = GET_CAST_DIALOG(TargetDialog, IM_TARGET_MANAGER::TARGET_DIALOG); if ((target_dialog == NULL) || (target_dialog->IsVisible() == false)) { is_update = true; } else { Object* object = g_ObjectManager.GetObject(target_dialog->GetTargetKey()); if((object != NULL) && (object->IsKindOfObject(PLAYER_OBJECT) == TRUE)) { is_update = true; } } } if (is_update) { float range = AutobotConditionManager::Instance()->hunting().target_range(); if (g_HeroInput.UpdateTargetList(range, g_HeroInput.GetForwardTargeting(), TRUE) == TRUE) { g_pHero->m_CurTargetInfo.dwObjectKey = 0; g_HeroInput.OnNextTarget(); g_HeroInput.ProcessTargeting(); } } return true; } //------------------------------------------------------------------------------ bool AutobotActionTargeting::IsEnemyTarget(OUT DWORD* object_key) { TargetDialog* target_dialog = GET_CAST_DIALOG(TargetDialog, IM_TARGET_MANAGER::TARGET_DIALOG); if ((target_dialog == NULL) || (target_dialog->IsVisible() == FALSE)) { return false; } if (target_dialog->GetTargetKey() == g_pHero->GetObjectKey()) { return false; } //------------------------------------------------------------------------------ //! Á×¾ú´ÂÁö üũ ÇÑ´Ù. Object* object = g_ObjectManager.GetObject(target_dialog->GetTargetKey()); if((object == NULL) || (object->IsKindOfObject(CHARACTER_OBJECT) == FALSE)) { return false; } if (static_cast(object)->IsDead() == TRUE) { target_dialog->ShowInterface(FALSE); return false; } //------------------------------------------------------------------------------ if (object_key) { *object_key = target_dialog->GetTargetKey(); } uiPartyMan* party_manager = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY); if (party_manager != NULL) { return !(party_manager->IsPartyMember(target_dialog->GetTargetKey())); } return true; } //------------------------------------------------------------------------------ bool AutobotActionTargeting::IsFriendTarget(OUT DWORD* object_key) { TargetDialog* target_dialog = GET_CAST_DIALOG(TargetDialog, IM_TARGET_MANAGER::TARGET_DIALOG); if ((target_dialog == NULL) || (target_dialog->IsVisible() == FALSE)) { return false; } if (target_dialog->GetTargetKey() == g_pHero->GetObjectKey()) { return true; } if (object_key) { *object_key = target_dialog->GetTargetKey(); } uiPartyMan* party_manager = GET_DIALOG_MANAGER(uiPartyMan, UIMAN_PARTY); if (party_manager != NULL) { return (party_manager->IsPartyMember(target_dialog->GetTargetKey())); } return false; } //------------------------------------------------------------------------------ Monster* AutobotActionTargeting::GetNearestMonster() { Monster* nearest_object = NULL; float nearest_length = 100000.0f; Object_Map_Itr begin = g_ObjectManager.GetBegin(); Object_Map_Itr end = g_ObjectManager.GetEnd(); for (; begin != end; ++begin) { Object* object = begin->second; if (object->IsKindOfObject(MONSTER_OBJECT) == FALSE) { continue; } if ((AutobotConditionManager::Instance()->hunting().IsAvoidMonster(object->GetObjectKey()) == true) || (AutobotConditionManager::Instance()->hunting().IsMonsterInValidArea(object->GetObjectKey()) == false)) { continue; } Monster* monster = static_cast(object); RELATIONKIND::TYPE relation_type = GameFramework::GetCurrentScene()->GetRelationKindOfCharacter(monster, FALSE); if (relation_type == RELATIONKIND::Enemy) { if ((monster->IsDead() == TRUE) || (monster->IsObserverMode() == TRUE)) { continue; } WzVector gab = monster->GetPosition() - g_pHero->GetPosition(); float length = VectorLength(&gab); if (length < nearest_length) { nearest_length = length; nearest_object = monster; } } } return nearest_object; } //------------------------------------------------------------------------------ bool AutobotActionTargeting::HasAttackHeroByAvoidMonster() { if (g_pHero == NULL) { return false; } vector monster_vector; monster_vector.clear(); if (GameFunc::GetMonstetListTargetPlayer(monster_vector, g_pHero->GetObjectKey()) > 0) { vector::iterator begin = monster_vector.begin(); vector::iterator end = monster_vector.end(); for (; begin != end; ++begin) { if (AutobotConditionManager::Instance()->hunting().IsAvoidMonster(*begin)) { return true; } } } return false; } //------------------------------------------------------------------------------ void AutobotActionTargeting::TargetOff() { TargetDialog* target_dialog = GET_CAST_DIALOG(TargetDialog, IM_TARGET_MANAGER::TARGET_DIALOG); if ((target_dialog != NULL) && (target_dialog->IsVisible() == TRUE)) { target_dialog->ShowInterface(FALSE); } }