static int elemental_ai_sub_timer_activesearch(struct block_list *bl, va_list ap) { struct elemental_data *ed; struct block_list **target; int dist; nullpo_ret(bl); ed = va_arg(ap,struct elemental_data *); target = va_arg(ap,struct block_list**); //If can't seek yet, not an enemy, or you can't attack it, skip. if( (*target) == bl || !status_check_skilluse(&ed->bl, bl, 0, 0) ) return 0; if( battle_check_target(&ed->bl,bl,BCT_ENEMY) <= 0 ) return 0; switch( bl->type ) { case BL_PC: if( !map_flag_vs(ed->bl.m) ) return 0; default: dist = distance_bl(&ed->bl, bl); if( ((*target) == NULL || !check_distance_bl(&ed->bl, *target, dist)) && battle_check_range(&ed->bl,bl,ed->db->range2) ) { //Pick closest target? (*target) = bl; ed->target_id = bl->id; ed->min_chase = dist + ed->db->range3; if( ed->min_chase > AREA_SIZE ) ed->min_chase = AREA_SIZE; return 1; } break; } return 0; }
int elemental_set_target( struct map_session_data *sd, struct block_list *bl ) { struct elemental_data *ed = sd->ed; nullpo_ret(ed); nullpo_ret(bl); if( ed->bl.m != bl->m || !check_distance_bl(&ed->bl, bl, ed->db->range2) ) return 0; if( !status_check_skilluse(&ed->bl, bl, 0, 0) ) return 0; if( ed->target_id == 0 ) ed->target_id = bl->id; return 1; }
/** * Make sure pet can attack from given config values. * @param sd : player requesting (owner) * @param bl : target * @param type : pet's attack rate type * @return 0 */ int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type) { struct pet_data *pd; int rate; pd = sd->pd; Assert((pd->master == 0) || (pd->master->pd == pd)); if(bl == NULL || bl->type != BL_MOB || bl->prev == NULL || pd->pet.intimate < battle_config.pet_support_min_friendly || pd->pet.hungry < 1 || pd->pet.class_ == status_get_class(bl)) return 0; if(pd->bl.m != bl->m || !check_distance_bl(&pd->bl, bl, pd->db->range2)) return 0; if (!status_check_skilluse(&pd->bl, bl, 0, 0)) return 0; if(!type) { rate = pd->petDB->attack_rate; rate = rate * pd->rate_fix / 1000; if(pd->petDB->attack_rate > 0 && rate <= 0) rate = 1; } else { rate = pd->petDB->defence_attack_rate; rate = rate * pd->rate_fix / 1000; if(pd->petDB->defence_attack_rate > 0 && rate <= 0) rate = 1; } if(rnd()%10000 < rate) { if(pd->target_id == 0 || rnd()%10000 < pd->petDB->change_target_rate) pd->target_id = bl->id; } return 0; }