int attack_guide_find_best_weapon (entity *en) { entity *target, *aggressor; entity_sub_types best_weapon; // // check weapon // aggressor = get_local_entity_ptr_value (en, PTR_TYPE_TASK_LEADER); ASSERT (aggressor); target = get_local_entity_parent (aggressor, LIST_TYPE_TARGET); ASSERT (target); best_weapon = get_best_weapon_for_target (aggressor, target, BEST_WEAPON_RANGE_CHECK); if (best_weapon == ENTITY_SUB_TYPE_WEAPON_NO_WEAPON) { // // No suitable weapon at current range // best_weapon = get_best_weapon_for_target (aggressor, target, BEST_WEAPON_CRITERIA_MINIMAL); if (best_weapon == ENTITY_SUB_TYPE_WEAPON_NO_WEAPON) { // // Entity is not capable of destroying the target - abort the attack // delete_group_member_from_engage_guide (aggressor, en, TRUE); return FALSE; } } set_client_server_entity_int_value (aggressor, INT_TYPE_SELECTED_WEAPON, best_weapon); return TRUE; }
void terminate_entity_current_engage_task (entity *en) { entity *guide, *task; ASSERT (en); ASSERT (get_comms_model () == COMMS_MODEL_SERVER); guide = get_local_entity_parent (en, LIST_TYPE_FOLLOWER); if (guide) { task = get_local_entity_parent (guide, LIST_TYPE_GUIDE); if (get_local_entity_int_value (task, INT_TYPE_ENTITY_SUB_TYPE) == ENTITY_SUB_TYPE_TASK_ENGAGE) { delete_group_member_from_engage_guide (en, guide, FALSE); } } }