BUILDIN_FUNC(unitwalk) { struct block_list* bl; struct unit_data *ud = NULL; const char *cmd = script_getfuncname(st), *done_label = ""; uint8 off = 5; bl = map_id2bl(script_getnum(st,2)); if (!bl) { ShowError("buildin_unitwalk: Invalid unit with ID '%d'.\n", script_getnum(st,2)); script_pushint(st, 0); return SCRIPT_CMD_FAILURE; } ud = unit_bl2ud(bl); if (!strcmp(cmd,"unitwalk")) { int x = script_getnum(st,3); int y = script_getnum(st,4); if (script_pushint(st, unit_can_reach_pos(bl,x,y,0))) add_timer(gettick()+50, unit_delay_walktoxy_timer, bl->id, (x<<16)|(y&0xFFFF)); // Need timer to avoid mismatches } else { struct block_list* tbl = map_id2bl(script_getnum(st,3)); if (!tbl) { ShowError("buildin_unitwalk: Bad target destination.\n"); script_pushint(st, 0); return SCRIPT_CMD_FAILURE; } else if (script_pushint(st, unit_can_reach_bl(bl, tbl, distance_bl(bl, tbl)+1, 0, NULL, NULL))) add_timer(gettick()+50, unit_delay_walktobl_timer, bl->id, tbl->id); // Need timer to avoid mismatches off = 4; } if (ud && script_hasdata(st, off)) { done_label = script_getstr(st, off); check_event(st, done_label); safestrncpy(ud->walk_done_event, done_label, sizeof(ud->walk_done_event)); } return SCRIPT_CMD_SUCCESS; }