Пишу игру, в которой столкнулась с тысячью проблем. На данном этапе мне нужно заставить монстра передвигаться по квадратному полю (на одну клетку). Именно монстра, так как поле большое, и дублировать неписей под это дело нет никакого желания. Используется bg_monster, так как только он генерирует GID требуемый командой unitwalk. Проблема в том, что мобы отказываются ходить даже в заранее заданном направлении. Весь скрипт велик , поэтому выложу лишь значимые в данный момент части. генерация моба: if ($moblvl == 31) { set $@game[getarg(0)],30; set .m, getarraysize($@orcind); //debugmes " arraysize orcind "+getarraysize($@orcind)+" "; for (set .@j,0; .@j<81; set .@j,.@j+1) { //debugmes " elof orcind from j "+getelementofarray($@orcind,.@j)+" "; if (getelementofarray($@orcind,.m)==0); { set $@game[getarg(0)],30; set $@orcs[.m],.m; set $@orcind[.m],getarg(0); set $@orcx[.m],$x; set $@orcy[.m],$y; //debugmes " getarg0 "+getarg(0)+" "; //debugmes " cicle m "+.m+" "; //debugmes " elof orcs ot m "+getelementofarray ($@orcs,.m)+" "; //debugmes " elof orcx ot m "+getelementofarray ($@orcx,.m)+" "; //debugmes " elof orcy ot m "+getelementofarray ($@orcy,.m)+" "; //debugmes " elof orcind ot m "+getelementofarray ($@orcind,.m)+" "; setd "$orc_"+.m, bg_monster( 0, $mapname$,$x,$y,"Orc baby",2920+4000,""); //set $orc_1, bg_monster( 0, $mapname$,$x,$y,"Orc baby",2920+4000,""); debugmes " orc gid from m "+("$orc_"+.m)+" "+ getd("$orc_"+.m)+" "; debugmes " m "+.m+" "; //monster( $mapname$,$x,$y, "Orc baby",2920,1,""+.m+"::OnMywalkingmodead"); callfunc ("searchsimilar", @temp); } } } Функция передвижения моба //------------------------------------------------------ORCMOVE function script orcmove { //debugmes " arraysize orcind(f-n orcmove befor loop) "+getarraysize($@orcind)+" "; if (getarraysize($@orcind)>0 ){ set .@k,-1; for(set .@i,0; .@i<(getarraysize($@orcind)); set .@i,.@i+1) { set .@k,.@k+1; set .@b, 0; //debugmes " i(f-n orcmove) "+.@k+" "; //debugmes " elof orcind from i(f-n orcmove) "+.@b+" "; //debugmes " elof orcind from 0(f-n orcmove) "+getelementofarray($@orcind,0)+" "; //debugmes " arraysize orcind(f-n orcmove) "+getarraysize($@orcind)+" "; debugmes " k "+.@k+" "; //debugmes " elfo orcin from k "+getelementofarray($@orcind,.@k)+" "; if (getelementofarray($@game,getelementofarray($@orcind,.@k)+1) == 0) {setarray .@direction[.@b],1; set .@b,.@b+1;} if (getelementofarray($@game,getelementofarray($@orcind,.@k)-1) == 0) {setarray .@direction[.@b],2; set .@b,.@b+1;} if (getelementofarray($@game,getelementofarray($@orcind,.@k)+11) == 0) {setarray .@direction[.@b],3; set .@b,.@b+1;} if (getelementofarray($@game,getelementofarray($@orcind,.@k)-11) == 0) {setarray .@direction[.@b],4; set .@b,.@b+1;} debugmes " "+.@direction[0]+" "+.@direction[1]+" "+.@direction[2]+" "+.@direction[3]+" "; //debugmes " arrayysizy dirs "+getarraysize(.@direction)+" "; //debugmes " elof orcin from k "+getelementofarray($@orcind,.@k)+" "; //debugmes " elof game from elof orcin from k "+getelementofarray($@game,getelementofarray($@orcind,.@k)+1)+" "; if ( getelementofarray(.@direction,1) !=0 || getelementofarray(.@direction,2) !=0 || getelementofarray(.@direction,3) !=0 ) { //debugmes " "+.@direction[0]+" "+.@direction[1]+" "+.@direction[2]+" "+.@direction[3]+" "; set .@n, getarraysize(.@direction); //debugmes " arraysize dirs "+.@n+" "; set .@l, rand(0,.@n); //debugmes " rand from dirs "+.@l+" "; set .@r, getelementofarray(.@direction,.@l); //debugmes " el from rand from dirs "+.@r+" "; if (.@r == 1) { debugmes " random "+1+" "; set $@orcx[.@k],getelementofarray($@orcx,.@k)+1; debugmes " k "+.@k+" "; debugmes " orc "+("$orc_"+.@k)+" "+getd("$orc_"+.@k)+" "; //unitwalk getd("$orc_"+.@k),getelementofarray($@orcx,.@k),getelementofarray($@orcy,.@k); unitwalk getd("$orc_"+.@k),117,80; set $@game[getelementofarray($@orcind,.@k)],0; set $@orcind[.@k],getelementofarray($@orcind,.@k)+1; set $@game[getelementofarray($@orcind,.@k)],30; cleararray .@direction[0],0,getarraysize(.@direction); debugmes " done "; } else if (.@r == 2) { debugmes " random "+2+" "; set $@orcx[.@k],getelementofarray($@orcx,.@k)-1; debugmes " k "+.@k+" "; debugmes " orc "+("$orc_"+.@k)+" "+getd("$orc_"+.@k)+" "; //unitwalk getd("$orc_"+.@k),getelementofarray($@orcx,.@k),getelementofarray($@orcy,.@k); unitwalk getd("$orc_"+.@k),117,80; set $@game[getelementofarray($@orcind,.@k)],0; set $@orcind[.@k],getelementofarray($@orcind,.@k)-1; set $@game[getelementofarray($@orcind,.@k)],30; cleararray .@direction[0],0,getarraysize(.@direction); debugmes " done "; } else if (.@r == 3) { debugmes " random "+3+" "; set $@orcy[.@k],getelementofarray($@orcy,.@k)+11; debugmes " k "+.@k+" "; debugmes " orc "+("$orc_"+.@k)+" "+getd("$orc_"+.@k)+" "; //unitwalk getd("$orc_"+.@k),getelementofarray($@orcx,.@k),getelementofarray($@orcy,.@k); unitwalk getd("$orc_"+.@k),117,80; set $@game[getelementofarray($@orcind,.@k)],0; set $@orcind[.@k],getelementofarray($@orcind,.@k)+11; set $@game[getelementofarray($@orcind,.@k)],30; cleararray .@direction[0],0,getarraysize(.@direction); debugmes " done "; } else if (.@r == 4) { debugmes " random "+4+" "; set $@orcy[.@k],getelementofarray($@orcy,.@k)-11; debugmes " k "+.@k+" "; debugmes " orc "+("$orc_"+.@k)+" "+getd("$orc_"+.@k)+" "; //unitwalk getd("$orc_"+.@k),getelementofarray($@orcx,.@k),getelementofarray($@orcy,.@k); unitwalk getd("$orc_"+.@k),117,80; set $@game[getelementofarray($@orcind,.@k)],0; set $@orcind[.@k],getelementofarray($@orcind,.@k)-11; set $@game[getelementofarray($@orcind,.@k)],30; cleararray .@direction[0],0,getarraysize(.@direction); debugmes " done "; } } else { return; } //{ // set .@near,rand(3); //if .@near ==0 //if .@near ==1 //if .@near ==2 //if .@near ==3 //areamonster $mapname$,$x,$y,$x,$y,"Orc Baby",2920+4000,1,""+$j+"::OnMyWalkingMobDead"; //} } return; } else return; } вывод дебагов с консоли. [Debug]: script debug : 2000004 110386580 : done [Debug]: script debug : 2000004 110386580 : k 0 [Debug]: script debug : 2000004 110386580 : 2 3 4 0 [Debug]: script debug : 2000004 110386580 : random 3 [Debug]: script debug : 2000004 110386580 : k 0 [Debug]: script debug : 2000004 110386580 : orc $orc_0 110389158 [Debug]: script debug : 2000004 110386580 : done [Debug]: script debug : 2000004 110386580 : k 1 [Debug]: script debug : 2000004 110386580 : 1 2 3 4 [Debug]: script debug : 2000004 110386580 : random 4 [Debug]: script debug : 2000004 110386580 : k 1 [Debug]: script debug : 2000004 110386580 : orc $orc_1 110389160 [Debug]: script debug : 2000004 110386580 : done [Debug]: script debug : 2000004 110386580 : k 0 [Debug]: script debug : 2000004 110386580 : 1 2 3 4 [Debug]: script debug : 2000004 110386580 : random 3 [Debug]: script debug : 2000004 110386580 : k 0 [Debug]: script debug : 2000004 110386580 : orc $orc_0 110389158 [Debug]: script debug : 2000004 110386580 : done [Debug]: script debug : 2000004 110386580 : k 1 [Debug]: script debug : 2000004 110386580 : 1 2 3 4 eathena 15238 (вроде) модификации есть: костюмы, автобай, телепортменю и еще одна (возможно из-за нее все) для скрипта goddameit вроде, которая позволяет моба атаковать мобов(не работает, кстати) BUILDIN_FUNC(getmobxy) { int num, id; char *name; struct mob_data *md = NULL; TBL_PC *sd = st->rid?map_id2sd(st->rid):NULL; id = script_getnum(st,2); if(!(md = (struct mob_data *)map_id2bl(id)) || md->bl.type != BL_MOB || !data_isreference(script_getdata(st,3)) ){ script_pushint(st,0); return 0; } num=st->stack->stack_data[st->start+3].u.num; name=(char *)(str_buf+str_data[num&0x00ffffff].str); setd_sub(st,sd,name,0,(void *)(int)md->bl.x,script_getref(st,3)); setd_sub(st,sd,name,1,(void *)(int)md->bl.y,script_getref(st,3)); script_pushint(st,1); return 0; } // BUILDIN_DEF(getmobxy,"i*"),