Показать сообщение отдельно
Старый 10.12.2008, 21:50   #16
Местный
 
Аватар для wanick
 
Регистрация: 20.09.2008
Сообщений: 133
Сказал Спасибо: 32
Имеет 54 спасибок в 22 сообщенях
wanick пока неопределено
По умолчанию

А вот это скрипт переделан и доработан мной, управление скриптом прямо в игре



в шорткаты 2 закладку 1 ячейку вставляется предмет по клику на который открывается управление скриптом


delphi Код:
/////////////////////////////////////////////////////////////// // для: L2PacketHack by xkor  // посл. редактирование: 14.05.2008, 15:03msk, alexsl // доработан и внедре интерфейс управления из Игры by Wanick 10.12.2008 4:45msk // назначение: перемещение чара по заранее записаным маршруту(м)  //    // краткая инструкция:  //  //                     1. прописать ник в MyNick    //  //    - для записи пути в файл:  //                     1. встаем на исходную позицию  //                     2. в чат пишим "===rec test1" (test1 - или другое имя без пробелов)  //                     3. бежим куда нужно. (желательно много не кликать на одно и тоже место. все клики записываются в файл)  //                     4. в чат пишим "===save"  //                     5. все. теперь данные записаны на диск, согласно настройкам и под именем test1 указ. в п.п.2  //  //    - записываем требуемые пути с разными маршрутами и названиями  //  //    - использование  //                   1. бег до последнего чекпоинта(при достижении скрипт завершает работу):  //                        пишим в чат "===go test1" (test1 - название записанного маршрута)  //                   2. бег до первого чекпоинта (при достижении скрипт завершает работу):  //                        пишим в чат "===back test1" (test1 - название записанного маршрута)  //                   3. для остановки скрипта при передвижении: пишим в чат "===stop"  //  //   как работает?: при запуске бежит к ближайшему чекпоинту и следует согласно направлению //   Использовались идеии, коды участников форума за, что спасибо  ///////////////////////////////////////////////////////////////////// const   MyNick = 'ваш Ник';// <------------------------------   interlude = false;    debug = false;   // эта переменная указывает уничтожить пакет или нет если он обработан    // может данные нужны для других скриптов    EraseCommandFromChat = true;    //*******************************************************    RecordFilesPath = 'c:\tmp\'; // путь где хранятся наши файлы   RecordPathName = 'recordmove'; // файл по умолчанию    RecordFileExt = '.txt';// расширение по умолчанию    RangeToCheckPoint = 150; // дистанция до чекпоинта при которой считается , что мы достигли оного   MoveTrigerDelay = 500; // срабатывание таймера на движение  0,5 сек   cmdPrefix = '===';// с этих символов начинается команда    cmdDlm    = ' ';// разделитель параметров команды, параметры не должены содержать разделитель    // команды в общий чат                             // пример    cmdRecordPath = 'rec';   // в общий чат "===rec giran1"    cmdSavePath = 'save';    // в общий чат "===save"    cmdMove = 'go';         // в общий чат "===go giran1"    cmdBack = 'back';        // в общий чат "===back giran1"    cmdStop = 'stop';       // останавливает следование по маршруту   cmdDelete = 'delete';     // в общий чат "===delete giran1"   cmdPatrol = 'patrol'// в общий чат "===patrol giran1"  - егает туда обратно по маршруту   //*******************************************************    QItemID = 765; // Свиток Заговорщика   RandomID = 1953719668; // случаны objectID; //******************************************************* var    // movement data    MovePath,                   //  данные по которому мы будем двигатся в данный момент    RecordPath: TStringList;    //  данные для записи пути    RecordPathFileName: string; // название файла для записи   selectPathFileName: string; // название файла движения   PointsCount: integer;       // кол-во поинтов в процессе записи пути    SavePathEnabled: boolean;   // флаг записи пути    MoveToPathEnabled: boolean; // флаг движения по пути    MoveToForward: boolean;     // направление движения да-вперед, нет - назад    MoveStepIndex: integer;     // текущ. чекпоинт (куды бежим сейчас)    MoveTimer: TTimer;          //    old_X,old_Y,old_Z,old_time: integer;   myX,myY,myZ: integer;       // наши статы    myID: integer;    myHP,myMP,myMaxHP,myMaxMP: integer// by wanick // id нашего диалогового окна для сартировки на перехвате   menuID :String = 'scr_'+ IntToStr (RandomID) +'?';   isInit,isPatrol:boolean; procedure Init; //Вызывается при включении скрипта  begin  isInit:=true;  MoveTimer := TTimer.Create(nil);  MoveTimer.Enabled := False;   MoveTimer.Interval := MoveTrigerDelay;   MoveTimer.OnTimer := @OnMove;   RecordPathFileName:=''//запрос на itemList вместе с ним приходит пакет UserInfo //нужен для первоначального определения позиции  buf:=hstr('14');  SendToServerEX(MyNick);  RecordPath:=TStringList.Create;   MovePath:=TStringList.Createendprocedure Free; //Вызывается при выключении скрипта  begin   if RecordPath<>nil then   try      RecordPath.Free;    except      debugmsg('error free RecordPath');    end;    if MovePath<>nil then    try      MovePath.Free;    except      debugmsg('error free MovePath');    endendprocedure debugmsg(s: string)begin    if debug then      SendMsgPM(s); endfunction GetValue(ValName: string): stringbegin    result:=RecordPath.Values[ValName];  endprocedure SetValue(ValName: string; Value: string)begin    RecordPath.Values[ValName]:=Value;  endprocedure StartRecord;  begin    if SavePathEnabled then      exit;    if MoveToPathEnabled then    begin      SendMsgPM('Во время следования по маршруту запись не возможна');     exit;    end;    RecordPath.Clear;    PointsCount:=0;    SendMsgPM('Начата запись маршрута');   SavePathEnabled := True  endprocedure StopRecord;  begin    if not SavePathEnabled then      exit;    // записываем    RecordPath.SaveToFile(GetRecordFileName);    SendMsgPM('Запись маршрута завершена');   SavePathEnabled := Falseendfunction GetRecordFileName: stringbegin    result:=RecordFilesPath+RecordPathFileName+RecordFileExt;  endprocedure SendMsgPM(msg:string)// отправка сообщений клиенту begin //62 CB 04 00 00 02 00 00 00 00 00 00 00 42 04 35 04 41 04 42 04   buf:=#$62;   WriteD(1227);   WriteD(2);   WriteD(0);   WriteS(msg);   SendToClientEx(MyNick)end; procedure ParseMoveClient;  var    i,x,y,z: integer; s: stringbegin   if MoveToPathEnabled then begin ParseCmd ('===stop'); OpenControl; end;   if not SavePathEnabled then      exit;    i:=2;    x:=readd(i);    y:=readd(i);    z:=readd(i);    inc(PointsCount);    s:='|'+inttostr(x)+'|'+inttostr(y)+'|'+inttostr(z)+'|';    RecordPath.Add(s);    SendMsgPM('добавлен чекпоинт № '+inttostr(PointsCount)); endfunction delta(xpos1, ypos1, xpos2, ypos2:extended):integer; //возвращает переменную rezu которая является растоянием между 2 точками  var    dx,dy,summa: extendedbegin    try    dx:= xpos1-xpos2;    dy:= ypos1-ypos2;    summa:= dx*dx+dy*dy;    if summa = 0 then result:= 0 else result:= Round(sqrt(summa));    debugmsg('delta='+inttostr(result));    except      debugmsg('error in delta');    endendfunction GetMinCheckPoint(PointsList: TStringList): integervar    i,m,min_dist: integer;    s: string;    x,y,z: integerbegin    result:=-1;    min_dist:=-1;    // проверка на наличие маршрута    if PointsList.Count=0 then    begin      exit;      MoveTimer.Enabled:=False;      MoveToPathEnabled:=False;      SendMsgPM('Нет данных по маршруту');     exit;    end;    try    for i:=0 to PointsList.count-1 do    begin      s:=PointsList[i];      y:=ExtractValue(s,2);      x:=ExtractValue(s,1);      debugMsg(s+' x:='+inttostr(x)+' y:='+inttostr(y));      m:=delta(x,y,myx,myy);      if m>0 then      begin              if (result=-1) then              begin                min_dist:=m;                result:=i;              end              else                if m<min_dist then                begin                  min_dist:=m;                  result:=i;                end;              end;    end;    except      debugMsg('error in GetMinCheckPoint');    end;//try  endprocedure GoToPath(ToForward: boolean)var    x,y,z,i: integer;    s: stringbegin    MoveToPathEnabled:= not MoveToPathEnabled;    MoveToForward:=ToForward;    if not MoveToPathEnabled then    begin      MoveTimer.Enabled:=False;      SendMsgPM('Следование по маршруту остановлено');     exit;    end;    //    // предположительно путь уже прописан в MovePath    //    SendMsgPM('Пробуем выйти на путь...');   // сперва идем к ближайшему чекпоинту    i:= GetMinCheckPoint(MovePath);    if i<0 then    begin      SendMsgPM('чекпоинт не найден');     MoveToPathEnabled:=False;    end else    begin      //SendMsgPM('найден ближайший чекпоинт бежим туды');     MoveToPathEnabled:=True;      MoveStepIndex:=i;      if debug then        SendMsgPM('checkpoint #'+inttostr(i));     s:=MovePath[MoveStepIndex];      x:=ExtractValue(s,1);      y:=ExtractValue(s,2);      z:=ExtractValue(s,3);     if (old_x<>x) and (old_y<>y) and (old_z<>z) then     begin       MoveTo(x,y,z);       old_x:=x;       old_y:=y;       old_z:=z;       old_time:=0;     end;   end;    MoveTimer.Enabled:=Trueend//*************************************************************** procedure OnMove(Sender: TObject)var    x,y,z: integer; s: stringbegin    inc(old_time);// счетчик, сколько тиков прошло с последнего клика. исп. при следованию по маршруту   if not MoveToPathEnabled then   begin     try       TTimer(Sender).Enabled:=False;     except     end;     SendMsgPM('Движение остановлено');     exit;    end;    // возможно мы пали смертью храбрых, то не дергаемся пока   if myHP<=0 then   begin     SendMsgPM('Die');     MoveToPathEnabled:=False;     exit;   end;   debugmsg('hp:'+inttostr(myhp));   try     // проверяем на существ. объекта      // при отладке всякое может быть      MovePath.Count;    except      TTimer(Sender).Enabled:=False;      exit;    end;    s:=MovePath[MoveStepIndex];    x:=ExtractValue(s,1);    y:=ExtractValue(s,2);    z:=ExtractValue(s,3);    if PosInRange(x,y,z,RangeToCheckPoint) then    begin      if MoveToForward then      begin        if MoveStepIndex=MovePath.Count-1 then        begin         SendMsgPM('Вы в конечной точке');         MoveToPathEnabled:=False;         if isPatrol then           ParseCmd ('===back '+selectPathFileName);         OpenControl;         exit;       end          else        begin          inc(MoveStepIndex);        end;      end      else      begin         if MoveStepIndex>0 then dec(MoveStepIndex)         else         begin            MoveToPathEnabled:=False;            SendMsgPM('Вы в начальной точке');           if isPatrol then              ParseCmd ('===go '+selectPathFileName);           OpenControl;           exit;         end;      end;      // мы достигли чекпоинта идем далее      SendMsgPM('бежим к #'+inttostr(MoveStepIndex));     s:=MovePath[MoveStepIndex];      x:=ExtractValue(s,1);      y:=ExtractValue(s,2);      z:=ExtractValue(s,3);      MoveTo(x,y,z);    endendfunction ExtractValue(sData: string;nIndex: integer): integervar    s: string;    i,j: integerbegin    i:=0;j:=0;s:='';    s:=sData;    while j<nIndex do    begin      i:=pos('|',S);      if i>=0 then      begin        s:=copy(s,i+1,length(s)-i);        inc(j);      end      else        break;    end;    i:=pos('|',s);    if i>=0 then      s:=copy(s,1,i-1);    try      result:=strtoint(s);    except    endend//******************************************************************  //Bot by Skymanrus  //modified by NLObP специально для Владера, моего сына!  //ПЕРЕМЕЩЕНИЕ:  //Идти в точку с координатами x,y,z  //MOVETO(x,y,z)  procedure MoveTo(TargetX,TargetY,TargetZ:integer)begin    //01=MoveBackwardToLocation:d(targetX)d(targetY)d(targetZ)d(originX)d(originY)d(originZ)d(moveByMouse)    buf:=#$0F;   WriteD(targetx); //куда    WriteD(targety);    WriteD(targetz);    WriteD(MyX); //откуда    WriteD(MyY);    WriteD(MyZ);    WriteD(1); //используем 1-мышь 0-клавиатура    SendToServerEx(MyNick)end//Ориентация на местности:  //Проверка находится ли заданная точка в пределах досягаемости. Если да, то выполняется кусок скрипта в фигурных скобках {}.  function PosInRange(targetx,targety,targetz,distanciya:integer):booleanbegin       if delta(targetx, targety, MyX, MyY)<=distanciya       then result:=true else result:=falseendprocedure UserInfo;            // обновление донных о себе  var    i:wordbegin    MyID:=ReadD(18);    MyX:=ReadD(2);    MyY:=ReadD(6);    MyZ:=ReadD(10);    i:=22;   ReadS(i);   if interlude then i:=i+48 else i:=i+44;   MyMaxHP:=ReadD(i);   MyHP:=ReadD(i);   MyMaxMP:=ReadD(i);        // чисто информативно   MyMP:=ReadD(i)endprocedure StatusUpdate;       // обновление данных о себе  var    i: integer; begin   for i:=0 to ReadD(6)-1 do    case pck[i*8+10] of      #$09: MyHP:=ReadD(i*8+14);      #$0A: MyMaxHP:=ReadD(i*8+14);      #$0B: MyMP:=ReadD(i*8+14);      #$0C: MyMaxMP:=ReadD(i*8+14);     end; end; //***************************************************************  procedure OnConnect(WithClient: Boolean); //Вызывается при установке соединения  begin  endprocedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения  begin  endfunction iif(Bool: Boolean;aTrue: variant; aFalse: variant): variantbegin    if Bool then      result:=aTrue    else      result:=aFalse;  endfunction ParseCmd(cmd: string):booleanvar    s: string;    i,j,k: integer;    params: array[0..9] of string; // до 10 параметров, должно хватить   isOne:boolean =false; begin    result:=False;   try     j:=-1;     i:=pos(cmdPrefix,trim(cmd));      if i=0 then        exit;      debugmsg('start ParseCmd: idx:'+inttostr(i)+' cmd: '+cmd);      result:=true;      k:=length(cmdPrefix);      s:=trim(lowercase(cmd));      s:=trim(copy(s,i+k,length(cmd)-i));      debugmsg('trim:'+s);     repeat       inc(j);        k:=pos(cmdDlm,s);       params[0] := '';       params[1] := '';       if k>0 then       begin          params[j]:=copy(s,1,k-1)//        s:=copy(s,k+length(cmdDlm),length(s)-k-length(cmdDlm));          s:=trim(copy(s,k+length(cmdDlm),length(s)-k));          debugmsg('extract idx:'+inttostr(j) +' param:'+params[j]);        end        else        begin          params[j]:=s;         isOne := true;         debugmsg('parm is one');        end;      until pos(cmdDlm,S)=0;      if (j>-1) AND (NOT isOne) then     begin        inc(j);        params[j]:=s;        debugmsg('extract idx:'+inttostr(j) +' param:'+params[j]);      end;     if j=-1 then       exit;      //*******************************************************      // пропарсили команду      // теперь выполняем      //*******************************************************      if params[0]=cmdRecordPath then      begin        sendMsg(params[1]);        if (params[1] <> '') then          RecordPathFileName:=params[1]         else           RecordPathFileName:=RecordPathName;         StartRecord;      end      else      if params[0]=cmdSavePath then      begin         StopRecord;      end      else      if params[0]=cmdMove then      begin        if (params[1] <> '') then          selectPathFileName:=params[1]        else           selectPathFileName:=RecordPathName;        try          MovePath.LoadFromFile(RecordFilesPath+selectPathFileName+RecordFileExt);        except           SendMsgPM('файл пути не найден');          exit;         end;         GoToPath(true);      end      else      if params[0]=cmdBack then      begin         if (params[1] <> '') then          selectPathFileName:=params[1]        else           selectPathFileName:=RecordPathName;        try          MovePath.LoadFromFile(RecordFilesPath+selectPathFileName+RecordFileExt);        except           SendMsgPM('файл пути не найден');          exit;         end;         GoToPath(false);      end      else      if (params[0]=cmdStop) and MoveToPathEnabled then  begin       MoveToPathEnabled:=False;       isPatrol:= false;     end     else     if (params[0] = cmdDelete) then begin SendMsgPM ('Удаление не работает'); exit; end     else     if (params[0] = cmdPatrol) then     begin          isPatrol := true;          if (params[1] <> '') then             selectPathFileName:=params[1]          else             selectPathFileName:=RecordPathName;          ParseCmd ('===go '+selectPathFileName);     end;   except     debugmsg('error in ParseCmd,params='+cmd);    endendprocedure OpenControl; var // первая часть tmpRS, textSR, textPath:string; //вторая часть textCombo:string; begin   tmpRS := 'rec';   if SavePathEnabled then tmpRS := 'save';   textSR := 'Начать запись';   if SavePathEnabled then textSR := 'Завершить запись';   textPath := 'Введите название пути:</td><td><edit length="15" var="RecordPathName" height=9 width=120>';   if SavePathEnabled then textPath := 'Идет запись пути: <font color="FF0000">'+RecordPathFileName+'</font>'; //--------------   textCombo := 'Выберите путь:</td><td><edit length="15" var="selectPathName" height=9 width=170>'; //  textCombo := 'Выберите пути:</td><td><combobox var="selectPathName" width=170 list="'+ getPathList +'">';   buf:=#$19;   WriteD(RandomID);   WriteS('<HTML><BODY> ' +'<font color="LEVEL">Создать новый маршрут:</font><br>' +'<table width=270 height=17>'    +'<tr>'           +'<td>'+ textPath +'</td>'    +'</tr>' +'</table>' +'<br>'+ cButton(textSR, '==='+tmpRS+' $RecordPathName', 110, 22, (not MoveToPathEnabled)) +'<img src="L2UI.SquareWhite" width=270 height=1><img src="L2UI.SquareBlank" width=270 height=4>' +'<font color="LEVEL">Использовать уже имеющийся маршрут:</font><br>' +'<table width=270 height=17>'    +'<tr>'           +'<td>'+ textCombo +'</td>'    +'</tr>' +'</table><br>' +'<table width=270 height=17>'    +'<tr>'           +'<td fixwidth=95>'+ cButton('Вперед', '===go $selectPathName', 95, 22, ((not MoveToPathEnabled) AND (not SavePathEnabled))) +'</td>'           +'<td fixwidth=95>'+ cButton('Стоп', '===stop', 95, 22, MoveToPathEnabled) +'</td>'           +'<td fixwidth=95>'+ cButton('Назад', '===back $selectPathName', 95, 22, ((not MoveToPathEnabled) AND (not SavePathEnabled))) +'</td>'    +'</tr>' +'</table><br>' +'<font color="LEVEL">а также можно:</font>' + cButton('Патрулировать путь', '===patrol $selectPathName', 145, 22, ((not MoveToPathEnabled) AND (not SavePathEnabled))) //+ cButton('Удалить выбраный путь', '===delete $selectPathName', 145, 22) +'<img src="L2UI.SquareWhite" width=270 height=1><img src="L2UI.SquareBlank" width=270 height=4>' +'скрипт сохранения маршрутов передвижения by <font color="LEVEL">alexsl</font>.<br>' +'Игровой интерфейс, доработка и расширение возможностей by <font color="LEVEL">Wanick</font>.<br>' +'Вопросы и обсуждения на сайте <font color="LEVEL">http://coderx.ru</font>' +'</BODY></HTML>');   WriteD(QItemID);   SendToClient; end; function cButton(var value, action:string; width, height:integer; show:boolean=true ):string; begin   Result := '<table border=1 cellspacing=1 cellpadding=0 bgcolor="b09979" width="'+ IntToStr(width) +'" height="'+ IntToStr(height) +'"><tr><td><center>'+value+'</center></td></tr></table>';   if not show then exit;   Result := '<button value="'+ value +'"'    +'action="bypass -h '+ menuID + action +'"'    +'width="'+ IntToStr(width) +'" height="'+ IntToStr(height) +'"'    +'back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">'; end; function getPathList:string; begin   Result := 'recordmove'; end; procedure MyRule (var sel:string); begin //sendMsg(sel); ParseCmd(sel); OpenControl; end; //основная часть скрипта  //вызывается при приходе каждого пакета если скрипт включен  var    i: integer;   tmp1: string; // временная переменная begin    if FromClient and (ConnectName=MyNick)then      case pck[1] of       #$0F: // move               ParseMoveClient;       #$49: // say2            // если это команда и она обработана и надо очистить чат              if ParseCmd(ReadS(2)) and EraseCommandFromChat then                pck:='';// kill packet       #$59:            begin               myx:=ReadD(2);               myY:=ReadD(6);               myZ:=ReadD(10);             end; //by wanick     #$19: //перехват пакета на использование наше вещи           if ReadD(2) = RandomID then begin pck := ''; OpenControl; end;     #$23: //  перехват наших действий в диалоговом окне       begin            tmp1:= ReadS(2);            if Pos (menuID, tmp1) = 1 then begin                     pck:='';                     tmp1 := Copy(tmp1, Length(menuID)+1, Length(tmp1)-Length(menuID));                     MyRule(tmp1);            end;       end;     end; // case   if FromServer and (ConnectName=MyNick) then      case pck[1] of        #$32: UserInfo;       #$18: StatusUpdate; //by Wanick      #$11:begin       if isInit=false then       begin            buf:=pck;            SendToClient;       end       else          begin             isInit:=false;             pck:='';             buf:=#$21;             buf := buf + HStr('01 00 02 00 04 00 ');             WriteD (RandomID);             WriteD(QItemID);             buf := buf + HStr('11 00 00 00 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FE FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F1 D8 FF FF');             SendToClient;             buf:=#$44;             buf := buf + HStr('01 00 00 00 0C 00 00 00 ');             WriteD(RandomID);             buf := buf + HStr('01 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00');             SendToClient;             pck:='';            // OpenControl;          end;      end; //#11     end; // case   if pck='' then exit; end.

Не получилось сделать выбор уже существующих маршрутов в combobox
из-за ограниченных возможностей FastScript в плагине, собираюсь сделать плагин там будет по проще.

если кто знает как из fastScript получить список фалов пишите

Последний раз редактировалось wanick, 11.12.2008 в 20:39. Причина: забыл упоминуть скрипт для Оффа
wanick вне форума   Ответить с цитированием
За это сообщение wanick нажился 7 спасибками от: