Показать сообщение отдельно
Старый 17.05.2008, 04:30   #14
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию

Суперский скрипт от Alexsl с панелью управления. Из чата тоже можно.
Работает Rec Save Go Back Stop согласно описания ниже.
Остальное заготовка для рыбалки.
delphi Код:
/////////////////////////////////////////////////////////////// // для: L2PacketHack by xkor // посл. редактирование: 14.05.2008, 15:03msk, alexsl // модифицировано by NLObP 17.05.2008 // назначение: перемещение чара по указанному маршруту // // краткая инструкция: // //                     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 = 'NLObP';// <------------------------------   interlude = false;   debug = true;   // эта переменная указывает уничтожить пакет или нет если он обработан   // может данные нужны для других скриптов   EraseCommandFromChat = true;   //*******************************************************   RecordFilesPath = 'c:\'; // путь где хранятся наши файлы   RecordPathName = 'recordmove'; // файл по умолчанию   RecordFileExt = '.txt';// расширение по умолчанию   RangeToCheckPoint = 150; // дистанция до чекпоинта при которой считается , что мы достигли оного   MoveTrigerDelay = 800; // срабатывание таймера на движение  0,8 сек   cmdPrefix = '===';// с этих символов начинается команда   cmdDlm    = ' ';// разделитель параметров команды, параметры не должены содержать разделитель   // команды в общий чат                            // пример   cmdRecordPath = 'rec';   // в общий чат "===rec giran1"   cmdSavePath = 'save';    // в общий чат "===save"   cmdMove = 'go';         // в общий чат "===go giran1"   cmdBack = 'back';        // в общий чат "===back giran1"   cmdStop = 'stop';       // останавливает следование по маршруту   //******************************************************* var   // movement data   MovePath,                   //  данные по которому мы будем двигатся в данный момент   RecordPath: TStringList;    //  данные для записи пути   RecordPathFileName: 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;   splitter1, splitter2 : Tsplitter;   msg, stats: TMemo;   form1: TForm;   Panel1 : Tpanel;   Button1,Button2,Button3,Button4,Button5,Button6,Button7,Button8 : TButton;   GroupBox1,GroupBox2,GroupBox3,GroupBox4 : TGroupBox;   ComboBox1,ComboBox2,ComboBox3,ComboBox4,ComboBox5,ComboBox6,ComboBox7,ComboBox8 : TComboBox;   CheckBox1,CheckBox2,CheckBox3,CheckBox4,CheckBox5,CheckBox6,CheckBox7,CheckBox8,CheckBox9,CheckBox10,CheckBox11,checkBox12,CheckBox13,CheckBox14,CheckBox15,CheckBox16,CheckBox17,CheckBox18: TCheckBox;   Label1,Label2,Label3,Label4:TLabel;   Edit1:TEdit; //*************************************************************** procedure Init; begin   MoveTimer := TTimer.Create(nil);   MoveTimer.Enabled := False;   MoveTimer.Interval := MoveTrigerDelay;   MoveTimer.OnTimer := @OnMove;   RecordPathFileName:='';   buf:=hstr('0F');   SendToServerEX(MyNick);   RecordPath:=TStringList.Create;   MovePath:=TStringList.Create;   //форма   form1:=TForm.Create(nil);   with form1 do   begin     Left:=0;     Top:=0;     Caption:='FishBot by NLObP v.0.10';     ClientHeight:=494;     ClientWidth:=613;     OnClose:=@FormClose;   end;   Panel1:=TPanel.Create(form1);   with Panel1 do   begin     parent:=form1;     Left:=0;     Top:=0;     Width:=425;     Height:=379;     Align:=alLeft;     TabOrder:=0;   end;   //статистика   Stats:=TMemo.Create(form1);   with Stats do   begin     parent:=form1;     Left:=428;     Top:=0;     Width:=185;     Height:=379;     Align:=alClient;     TabOrder:=1;     ScrollBars:=2;   end;   //сообщения   Msg:=TMemo.Create(form1);   with Msg do   begin     parent:=form1;     Left:=0;     Top:=382;     Width:=613;     Height:=112;     Align:=alBottom;     TabOrder:=2;     ReadOnly:=true;     ScrollBars:=2;     msg.Lines.Add('...');   end;   //разделители   splitter2:=Tsplitter.Create(form1);   with splitter2 do   begin     parent:=form1;     Top:=0;     Left:=425; //    Height:=379;     Width:=3;     Align:=alLeft;   end;   splitter1:=Tsplitter.Create(form1);   with splitter1 do   begin     parent:=form1;     Left:=0;     Height:=3;     Align:=alBottom;   end;   GroupBox1:=TGroupBox.Create(Panel1);   with GroupBox1 do   begin     parent:=Panel1;     Left:=1;     Top:=1;     Width:=423;     Height:=76;     Align:=alTop;     Caption:=' Movement ';     TabOrder:=0;   end;   Label1:=TLabel.Create(GroupBox1);   with Label1 do   begin     parent:=GroupBox1;     Left:=9;     Top:=18;     Width:=47;     Height:=13;     Caption:='FileName:';   end;   Button4:=TButton.Create(GroupBox1);   with Button4 do   begin     parent:=GroupBox1;     Left:=251;     Top:=42;     Width:=75;     Height:=25;     Caption:='Back';     TabOrder:=0;     OnClick:=@Button4Click;   end;   Button7:=TButton.Create(GroupBox1);   with Button7 do   begin     parent:=GroupBox1;     Left:=329;     Top:=42;     Width:=75;     Height:=25;     Caption:='Stop';     TabOrder:=1;     OnClick:=@Button7Click;   end;   Button3:=TButton.Create(GroupBox1);   with Button3 do   begin     parent:=GroupBox1;     Left:=173;     Top:=42;     Width:=75;     Height:=25;     Caption:='Go';     TabOrder:=2;     OnClick:=@Button3Click;   end;   Button2:=TButton.Create(GroupBox1);   with Button2 do   begin     parent:=GroupBox1;     Left:=90;     Top:=42;     Width:=75;     Height:=25;     Caption:='Save';     TabOrder:=3;     OnClick:=@Button2Click;   end;   Button1:=TButton.Create(GroupBox1);   with Button1 do   begin     parent:=GroupBox1;     Left:=9;     Top:=42;     Width:=75;     Height:=25;     Caption:='Rec';     TabOrder:=4;     OnClick:=@Button1Click;   end;   Edit1:=TEdit.Create(GroupBox1);   with Edit1 do   begin     parent:=GroupBox1;     Left:=56;     Top:=15;     Width:=109;     Height:=21;     TabOrder:=5;     Text:='recordmove';   end;   ComboBox8:=TComboBox.Create(GroupBox1);   with ComboBox8 do   begin     parent:=GroupBox1;     Left:=173;     Top:=15;     Width:=231;     Height:=21; //    Anchors:=[akLeft, akTop, akRight];     ItemHeight:=13;     TabOrder:=6;     Text:='ComboBox8';     OnChange:=@ComboBox8Change;   end;   GroupBox2:=TGroupBox.Create(Panel1);   with GroupBox2 do   begin     parent:=Panel1;     Left:=1;     Top:=77;     Width:=423;     Height:=239;     Align:=alNone;     //Anchors:=[akLeft, akTop, akRight];     Caption:=' Fishing ';     TabOrder:=1;   end;   Label2:=TLabel.Create(GroupBox2);   with Label2 do   begin     parent:=GroupBox2;     Left:=32;     Top:=164;     Width:=43;     Height:=13;     Caption:='FisherMan';   end;   ComboBox7:=TComboBox.Create(GroupBox2);   with ComboBox7 do   begin     parent:=GroupBox2;     Left:=90;     Top:=161;     Width:=314;     Height:=21;     //Anchors:=[akLeft, akTop, akRight];     ItemHeight:=13;     TabOrder:=0;     Text:='ComboBox7';     OnChange:=@ComboBox7Change;   end;   ComboBox6:=TComboBox.Create(GroupBox2);   with ComboBox6 do   begin     parent:=GroupBox2;     Left:=90;     Top:=137;     Width:=314;     Height:=21;     //Anchors:=[akLeft, akTop, akRight];     ItemHeight:=13;     TabOrder:=1;     Text:='ComboBox1';     OnChange:=@ComboBox6Change;   end;   CheckBox1:=TCheckBox.Create(GroupBox2);   with CheckBox1 do   begin     parent:=GroupBox2;     Left:=32;     Top:=18;     Width:=55;     Height:=17;     Caption:='Rod';     TabOrder:=2;     OnClick:=@CheckBox1Click;   end;   ComboBox1:=TComboBox.Create(GroupBox2);   with ComboBox1 do   begin     parent:=GroupBox2;     Left:=90;     Top:=16;     Width:=314;     Height:=21;     //Anchors:=[akLeft, akTop, akRight];     ItemHeight:=13;     TabOrder:=3;     Text:='ComboBox1';     OnChange:=@ComboBox1Change;   end;   ComboBox5:=TComboBox.Create(GroupBox2);   with ComboBox5 do   begin     parent:=GroupBox2;     Left:=90;     Top:=113;     Width:=314;     Height:=21;     //Anchors:=[akLeft, akTop, akRight];     ItemHeight:=13;     TabOrder:=4;     Text:='ComboBox1';     OnChange:=@ComboBox5Change;   end;   Button5:=TButton.Create(GroupBox2);   with Button5 do   begin     parent:=GroupBox2;     Left:=173;     Top:=206;     Width:=75;     Height:=25;     Caption:='Start';     TabOrder:=5;     OnClick:=@Button5Click;   end;   Button6:=TButton.Create(GroupBox2);   with Button6 do   begin     parent:=GroupBox2;     Left:=263;     Top:=206;     Width:=75;     Height:=25;     Caption:='Stop';     TabOrder:=6;     OnClick:=@Button6Click;   end;   CheckBox2:=TCheckBox.Create(GroupBox2);   with CheckBox2 do   begin     parent:=GroupBox2;     Left:=32;     Top:=39;     Width:=55;     Height:=23;     Caption:='Lure';     TabOrder:=7;     OnClick:=@CheckBox2Click;   end;   CheckBox3:=TCheckBox.Create(GroupBox2);   with CheckBox3 do   begin     parent:=GroupBox2;     Left:=32;     Top:=64;     Width:=55;     Height:=22;     Caption:='Weapon';     TabOrder:=8;     OnClick:=@CheckBox3Click;   end;   CheckBox4:=TCheckBox.Create(GroupBox2);   with CheckBox4 do   begin     parent:=GroupBox2;     Left:=32;     Top:=90;     Width:=52;     Height:=17;     Caption:='Shield';     TabOrder:=9;     OnClick:=@CheckBox4Click;   end;   CheckBox5:=TCheckBox.Create(GroupBox2);   with CheckBox5 do   begin     parent:=GroupBox2;     Left:=32;     Top:=115;     Width:=52;     Height:=17;     Caption:='FShot';     TabOrder:=10;     OnClick:=@CheckBox5Click;   end;   CheckBox6:=TCheckBox.Create(GroupBox2);   with CheckBox6 do   begin     parent:=GroupBox2;     Left:=32;     Top:=139;     Width:=52;     Height:=17;     Caption:='HPotion';     TabOrder:=11;     OnClick:=@CheckBox6Click;   end;   ComboBox2:=TComboBox.Create(GroupBox2);   with ComboBox2 do   begin     parent:=GroupBox2;     Left:=90;     Top:=40;     Width:=314;     Height:=21;     //Anchors:=[akLeft, akTop, akRight];     ItemHeight:=13;     TabOrder:=12;     Text:='ComboBox1';     OnChange:=@ComboBox2Change;   end;   ComboBox3:=TComboBox.Create(GroupBox2);   with ComboBox3 do   begin     parent:=GroupBox2;     Left:=90;     Top:=64;     Width:=314;     Height:=21;     //Anchors:=[akLeft, akTop, akRight];     ItemHeight:=13;     TabOrder:=13;     Text:='ComboBox1';     OnChange:=@ComboBox3Change;   end;   ComboBox4:=TComboBox.Create(GroupBox2);   with ComboBox4 do   begin     parent:=GroupBox2;     Left:=90;     Top:=88;     Width:=314;     Height:=21;     //Anchors:=[akLeft, akTop, akRight];     ItemHeight:=13;     TabOrder:=14;     Text:='ComboBox1';     OnChange:=@ComboBox4Change;   end;   CheckBox10:=TCheckBox.Create(GroupBox2);   with CheckBox10 do   begin     parent:=GroupBox2;     Left:=32;     Top:=189;     Width:=38;     Height:=17;     Caption:='PFO';     TabOrder:=15;     OnClick:=@CheckBox10Click;   end;   CheckBox11:=TCheckBox.Create(GroupBox2);   with CheckBox11 do   begin     parent:=GroupBox2;     Left:=32;     Top:=210;     Width:=45;     Height:=17;     Caption:='GFO';     TabOrder:=16;     OnClick:=@CheckBox11Click;   end;   GroupBox3:=TGroupBox.Create(Panel1);   with GroupBox3 do   begin     parent:=Panel1;     Left:=1;     Top:=318;     Width:=104;     Height:=51;     Align:=alNone;     Caption:=' Trade ';     TabOrder:=2;   end;   Button8:=TButton.Create(GroupBox3);   with Button8 do   begin     parent:=GroupBox3;     Left:=12;     Top:=20;     Width:=75;     Height:=25;     Caption:='Start';     TabOrder:=0;     OnClick:=@Button8Click;   end;   GroupBox4:=TGroupBox.Create(Panel1);   with GroupBox4 do   begin     parent:=Panel1;     Left:=111;     Top:=318;     Width:=313;     Height:=51;     //Anchors:=[akLeft, akTop, akRight];     Caption:=' Ready ';     TabOrder:=3;   end;   CheckBox7:=TCheckBox.Create(GroupBox4);   with CheckBox7 do   begin     parent:=GroupBox4;     Left:=16;     Top:=24;     Width:=73;     Height:=17;     Caption:='Fisherman';     TabOrder:=0;   end;   CheckBox8:=TCheckBox.Create(GroupBox4);   with CheckBox8 do   begin     parent:=GroupBox4;     Left:=95;     Top:=24;     Width:=58;     Height:=17;     Caption:='Fishing';     TabOrder:=1;   end;   CheckBox9:=TCheckBox.Create(GroupBox4);   with CheckBox9 do   begin     parent:=GroupBox4;     Left:=159;     Top:=24;     Width:=57;     Height:=17;     Caption:='Moving';     TabOrder:=2;   end;   form1.Show; end; //*************************************************************** //Вызывается при выключении скрипта //*************************************************************** procedure 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');   end;   Button1.Free;   Button2.Free;   Button3.Free;   Button4.Free;   Button5.Free;   Button6.Free;   Button7.Free;   Button8.Free;   ComboBox1.Free;   ComboBox2.Free;   ComboBox3.Free;   ComboBox4.Free;   ComboBox5.Free;   ComboBox6.Free;   ComboBox7.Free;   ComboBox8.Free;   CheckBox1.Free;   CheckBox2.Free;   CheckBox3.Free;   CheckBox4.Free;   CheckBox5.Free;   CheckBox6.Free;   CheckBox7.Free;   CheckBox8.Free;   CheckBox9.Free;   CheckBox10.Free;   CheckBox11.Free;   checkBox12.Free;   CheckBox13.Free;   CheckBox14.Free;   CheckBox15.Free;   CheckBox16.Free;   CheckBox17.Free;   CheckBox18.Free;   Label1.Free;   Label2.Free;   Label3.Free;   Label4.Free;   Edit1.Free;   GroupBox1.Free;   GroupBox2.Free;   GroupBox3.Free;   GroupBox4.Free;   Panel1.Free;   splitter1.free;   splitter2.free;   msg.Free;   stats.Free;   form1.Free; end; procedure Edit1Change(Sender: TObject); begin //   RecordPathFileName:=Edit1.text; end; procedure Button1Click(Sender: TObject); begin //   RecordPathFileName:=Edit1.text;   StartRecord; end; procedure Button2Click(Sender: TObject); begin //   StopRecord; end; procedure Button3Click(Sender: TObject); begin //идти в конец пути   RecordPathFileName:=Edit1.text;   try     MovePath.LoadFromFile(RecordFilesPath+RecordPathFileName+RecordFileExt);   except     SendMsg('файл пути не найден');     exit;   end;   GoToPath(true); end; procedure Button4Click(Sender: TObject); begin //идти в начало пути   RecordPathFileName:=Edit1.text;   try     MovePath.LoadFromFile(RecordFilesPath+RecordPathFileName+RecordFileExt);   except     SendMsg('файл пути не найден');     exit;   end;   GoToPath(false); end; procedure Button5Click(Sender: TObject); begin // end; procedure Button6Click(Sender: TObject); begin // end; procedure Button7Click(Sender: TObject); begin //   MoveToPathEnabled:=False;   //SendMsg('Движение остановлено'); end; procedure Button8Click(Sender: TObject); begin // end; procedure CheckBox10Click(Sender: TObject); begin // end; procedure CheckBox11Click(Sender: TObject); begin // end; procedure CheckBox1Click(Sender: TObject); begin // end; procedure CheckBox2Click(Sender: TObject); begin // end; procedure CheckBox3Click(Sender: TObject); begin // end; procedure CheckBox4Click(Sender: TObject); begin // end; procedure CheckBox5Click(Sender: TObject); begin // end; procedure CheckBox6Click(Sender: TObject); begin // end; procedure ComboBox1Change(Sender: TObject); begin // end; procedure ComboBox2Change(Sender: TObject); begin // end; procedure ComboBox3Change(Sender: TObject); begin // end; procedure ComboBox4Change(Sender: TObject); begin // end; procedure ComboBox5Change(Sender: TObject); begin // end; procedure ComboBox6Change(Sender: TObject); begin // end; procedure ComboBox7Change(Sender: TObject); begin // end; procedure ComboBox8Change(Sender: TObject); begin // end; //****************************************************************************** procedure FormClose(Sender: TObject; var Action: TCloseAction); begin   //Action:=caNone; end; procedure debugmsg(s: string); begin   if debug then     SendMsg(s); end; function GetValue(ValName: string): string; begin   result:=RecordPath.Values[ValName]; end; procedure SetValue(ValName: string; Value: string); begin   RecordPath.Values[ValName]:=Value; end; procedure StartRecord; begin   if SavePathEnabled then     exit;   if MoveToPathEnabled then   begin     SendMsg('Во время следования по маршруту запись не возможна');     exit;   end;   RecordPath.Clear;   PointsCount:=0;   SendMsg('Начата запись маршрута');   SavePathEnabled := True end; procedure StopRecord; begin   if not SavePathEnabled then     exit;   // записываем   RecordPath.SaveToFile(GetRecordFileName);   SendMsg('Запись маршрута завершена');   SavePathEnabled := False; end; function GetRecordFileName: string; begin   result:=RecordFilesPath+RecordPathFileName+RecordFileExt; end; procedure SendMsg(msg:string)// отправка системных сообщений клиенту begin   buf:=#$4A;   WriteD(0);   WriteD(10);   WriteS('');   WriteS(msg);   SendToClientEx(MyNick); end; procedure ParseMoveClient; var   i,x,y,z: integer; s: string; begin   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);   SendMsg('добавлен чекпоинт № '+inttostr(PointsCount)); end; function delta(xpos1, ypos1, xpos2, ypos2:extended):integer; //возвращает переменную rezu которая является растоянием между 2 точками var   dx,dy,summa: extended; begin   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');   end; end; function GetMinCheckPoint(PointsList: TStringList): integer; var   i,m,min_dist: integer;   s: string;   x,y,z: integer; begin   result:=-1;   min_dist:=-1;   // проверка на наличие маршрута   if PointsList.Count=0 then   begin     exit;     MoveTimer.Enabled:=False;     MoveToPathEnabled:=False;     SendMsg('Нет данных по маршруту');     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 end; procedure GoToPath(ToForward: boolean); var   x,y,z,i: integer;   s: string; begin   MoveToPathEnabled:= not MoveToPathEnabled;   MoveToForward:=ToForward;   if not MoveToPathEnabled then   begin     MoveTimer.Enabled:=False;     SendMsg('Следование по маршруту остановлено');     exit;   end;   //   // предположительно путь уже прописан в MovePath   //   SendMsg('Пробуем выйти на путь...');   // сперва идем к ближайшему чекпоинту   i:= GetMinCheckPoint(MovePath);   if i<0 then   begin     SendMsg('чекпоинт не найден');     MoveToPathEnabled:=False;   end else   begin     SendMsg('найден ближайший чекпоинт бежим туды');     MoveToPathEnabled:=True;     MoveStepIndex:=i;     if debug then       SendMsg('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:=True; end; //*************************************************************** procedure OnMove(Sender: TObject); var   x,y,z: integer; s: string; begin   inc(old_time);// счетчик, сколько тиков прошло с последнего клика. исп. при следованию по маршруту   if not MoveToPathEnabled then   begin     try       TTimer(Sender).Enabled:=False;     except     end;     SendMsg('Движение остановлено');     exit;   end;   // возможно мы пали смертью храбрых, то не дергаемся пока   if myHP<=0 then   begin     sendmsg('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         MoveToPathEnabled:=False;         SendMsg('Мы по идее в конечной точке');         exit;       end       else       begin         inc(MoveStepIndex);       end;     end     else     begin        if MoveStepIndex>0 then dec(MoveStepIndex)        else        begin           MoveToPathEnabled:=False;           SendMsg('Мы по идее в начальной точке');           exit;        end;     end;     // мы достигли чекпоинта идем далее     SendMsg('бежим к #'+inttostr(MoveStepIndex));     s:=MovePath[MoveStepIndex];     x:=ExtractValue(s,1);     y:=ExtractValue(s,2);     z:=ExtractValue(s,3);     MoveTo(x,y,z);   end; end; function ExtractValue(sData: string;nIndex: integer): integer; var   s: string;   i,j: integer; begin   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   end; end; //****************************************************************** //Идти в точку с координатами 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:=#$01;   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):boolean; begin      if delta(targetx, targety, MyX, MyY)<=distanciya      then result:=true else result:=false; end; procedure UserInfo;            // обновление донных о себе var   i:word; begin   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); end; procedure 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 end; procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения begin end; function iif(Bool: Boolean;aTrue: variant; aFalse: variant): variant; begin   if Bool then     result:=aTrue   else     result:=aFalse; end; function ParseCmd(cmd: string):boolean; var   s: string;   i,j,k: integer;   params: array[0..9] of string; // до 10 параметров, должно хватить 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);       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;         debugmsg('parm is one');       end;     until pos(cmdDlm,S)=0;     if j>-1 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        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        begin          SendMsg('хз куда бежать, укажите имя');          exit;        end;        try          MovePath.LoadFromFile(RecordFilesPath+params[1]+RecordFileExt);        except          SendMsg('файл пути не найден');          exit;        end;        GoToPath(true);     end     else     if params[0]=cmdBack then     begin        if params[1]='' then        begin          SendMsg('хз куда бежать, укажите имя');          exit;        end;        try          MovePath.LoadFromFile(RecordFilesPath+params[1]+RecordFileExt);        except          SendMsg('файл пути не найден');          exit;        end;        GoToPath(false);     end     else     if (params[0]=cmdStop) and MoveToPathEnabled then       MoveToPathEnabled:=False;   except     debugmsg('error in ParseCmd,params='+cmd);   end; end; //основная часть скрипта //вызывается при приходе каждого пакета если скрипт включен var   i: integer; begin   if FromClient and (ConnectName=MyNick)then     case pck[1] of {      #$1B:  // social               case pck[2] of                 #$06: StartRecord; //Yes                 #$05: StopRecord;//No                 #$04: begin GoToPath(true); pck:=''; end;               end; //case }      #$01: // move               ParseMoveClient;      #$38: // say2            // если это команда и она обработана и надо очистить чат             if ParseCmd(ReadS(2)) and EraseCommandFromChat then               pck:='';// kill packet      #$48:            begin              myx:=ReadD(2);              myY:=ReadD(6);              myZ:=ReadD(10);            end;     end; // case   if FromServer and (ConnectName=MyNick) then     case pck[1] of       #$04: UserInfo;       #$0E: StatusUpdate;     end; // case end.
NLObP вне форума   Ответить с цитированием
За это сообщение NLObP нажился 2 спасибками от: