ну геодата я пробывал раскопать файлы клиента единственно до чего добрался это программа для делания геодаты из файлов клиента картинку даже где то выкладывал.
мир состоит из 2-х типов геодаты рельеф и объектная т.е. рельеф он везде есть а объектная это каты, города, также есть третий тип но понему ходить нельзя он тупо является препятствием
ну геодата я пробывал раскопать файлы клиента единственно до чего добрался это программа для делания геодаты из файлов клиента картинку даже где то выкладывал.
мир состоит из 2-х типов геодаты рельеф и объектная т.е. рельеф он везде есть а объектная это каты, города, также есть третий тип но понему ходить нельзя он тупо является препятствием
ага вот глянул сейчас в папке мапс, там файлы стандартно запакованы.
Можеш ли выложить описание структуры?
ага вот глянул сейчас в папке мапс, там файлы стандартно запакованы.
Можеш ли выложить описание структуры?
панятия не имею какая там структура загугли может тебе повезёт
Добавлено через 7 часов 50 минут
возможно тебе повезло и в бекапе системы найду эти файлы, но вопрос в другом как раскрутить геодату сервера лутьше искать её и xkor вроде как то говорил что были у него какие то наработки в этом направление может поделиться опытом.
Суперский скрипт от 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 dobegin
Left:=0;
Top:=0;
Caption:='FishBot by NLObP v.0.10';
ClientHeight:=494;
ClientWidth:=613;
OnClose:=@FormClose;
end;
Panel1:=TPanel.Create(form1);
with Panel1 dobegin
parent:=form1;
Left:=0;
Top:=0;
Width:=425;
Height:=379;
Align:=alLeft;
TabOrder:=0;
end;
//статистика
Stats:=TMemo.Create(form1);
with Stats dobegin
parent:=form1;
Left:=428;
Top:=0;
Width:=185;
Height:=379;
Align:=alClient;
TabOrder:=1;
ScrollBars:=2;
end;
//сообщения
Msg:=TMemo.Create(form1);
with Msg dobegin
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 dobegin
parent:=form1;
Top:=0;
Left:=425;
// Height:=379;
Width:=3;
Align:=alLeft;
end;
splitter1:=Tsplitter.Create(form1);
with splitter1 dobegin
parent:=form1;
Left:=0;
Height:=3;
Align:=alBottom;
end;
GroupBox1:=TGroupBox.Create(Panel1);
with GroupBox1 dobegin
parent:=Panel1;
Left:=1;
Top:=1;
Width:=423;
Height:=76;
Align:=alTop;
Caption:=' Movement ';
TabOrder:=0;
end;
Label1:=TLabel.Create(GroupBox1);
with Label1 dobegin
parent:=GroupBox1;
Left:=9;
Top:=18;
Width:=47;
Height:=13;
Caption:='FileName:';
end;
Button4:=TButton.Create(GroupBox1);
with Button4 dobegin
parent:=GroupBox1;
Left:=251;
Top:=42;
Width:=75;
Height:=25;
Caption:='Back';
TabOrder:=0;
OnClick:=@Button4Click;
end;
Button7:=TButton.Create(GroupBox1);
with Button7 dobegin
parent:=GroupBox1;
Left:=329;
Top:=42;
Width:=75;
Height:=25;
Caption:='Stop';
TabOrder:=1;
OnClick:=@Button7Click;
end;
Button3:=TButton.Create(GroupBox1);
with Button3 dobegin
parent:=GroupBox1;
Left:=173;
Top:=42;
Width:=75;
Height:=25;
Caption:='Go';
TabOrder:=2;
OnClick:=@Button3Click;
end;
Button2:=TButton.Create(GroupBox1);
with Button2 dobegin
parent:=GroupBox1;
Left:=90;
Top:=42;
Width:=75;
Height:=25;
Caption:='Save';
TabOrder:=3;
OnClick:=@Button2Click;
end;
Button1:=TButton.Create(GroupBox1);
with Button1 dobegin
parent:=GroupBox1;
Left:=9;
Top:=42;
Width:=75;
Height:=25;
Caption:='Rec';
TabOrder:=4;
OnClick:=@Button1Click;
end;
Edit1:=TEdit.Create(GroupBox1);
with Edit1 dobegin
parent:=GroupBox1;
Left:=56;
Top:=15;
Width:=109;
Height:=21;
TabOrder:=5;
Text:='recordmove';
end;
ComboBox8:=TComboBox.Create(GroupBox1);
with ComboBox8 dobegin
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 dobegin
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 dobegin
parent:=GroupBox2;
Left:=32;
Top:=164;
Width:=43;
Height:=13;
Caption:='FisherMan';
end;
ComboBox7:=TComboBox.Create(GroupBox2);
with ComboBox7 dobegin
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 dobegin
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 dobegin
parent:=GroupBox2;
Left:=32;
Top:=18;
Width:=55;
Height:=17;
Caption:='Rod';
TabOrder:=2;
OnClick:=@CheckBox1Click;
end;
ComboBox1:=TComboBox.Create(GroupBox2);
with ComboBox1 dobegin
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 dobegin
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 dobegin
parent:=GroupBox2;
Left:=173;
Top:=206;
Width:=75;
Height:=25;
Caption:='Start';
TabOrder:=5;
OnClick:=@Button5Click;
end;
Button6:=TButton.Create(GroupBox2);
with Button6 dobegin
parent:=GroupBox2;
Left:=263;
Top:=206;
Width:=75;
Height:=25;
Caption:='Stop';
TabOrder:=6;
OnClick:=@Button6Click;
end;
CheckBox2:=TCheckBox.Create(GroupBox2);
with CheckBox2 dobegin
parent:=GroupBox2;
Left:=32;
Top:=39;
Width:=55;
Height:=23;
Caption:='Lure';
TabOrder:=7;
OnClick:=@CheckBox2Click;
end;
CheckBox3:=TCheckBox.Create(GroupBox2);
with CheckBox3 dobegin
parent:=GroupBox2;
Left:=32;
Top:=64;
Width:=55;
Height:=22;
Caption:='Weapon';
TabOrder:=8;
OnClick:=@CheckBox3Click;
end;
CheckBox4:=TCheckBox.Create(GroupBox2);
with CheckBox4 dobegin
parent:=GroupBox2;
Left:=32;
Top:=90;
Width:=52;
Height:=17;
Caption:='Shield';
TabOrder:=9;
OnClick:=@CheckBox4Click;
end;
CheckBox5:=TCheckBox.Create(GroupBox2);
with CheckBox5 dobegin
parent:=GroupBox2;
Left:=32;
Top:=115;
Width:=52;
Height:=17;
Caption:='FShot';
TabOrder:=10;
OnClick:=@CheckBox5Click;
end;
CheckBox6:=TCheckBox.Create(GroupBox2);
with CheckBox6 dobegin
parent:=GroupBox2;
Left:=32;
Top:=139;
Width:=52;
Height:=17;
Caption:='HPotion';
TabOrder:=11;
OnClick:=@CheckBox6Click;
end;
ComboBox2:=TComboBox.Create(GroupBox2);
with ComboBox2 dobegin
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 dobegin
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 dobegin
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 dobegin
parent:=GroupBox2;
Left:=32;
Top:=189;
Width:=38;
Height:=17;
Caption:='PFO';
TabOrder:=15;
OnClick:=@CheckBox10Click;
end;
CheckBox11:=TCheckBox.Create(GroupBox2);
with CheckBox11 dobegin
parent:=GroupBox2;
Left:=32;
Top:=210;
Width:=45;
Height:=17;
Caption:='GFO';
TabOrder:=16;
OnClick:=@CheckBox11Click;
end;
GroupBox3:=TGroupBox.Create(Panel1);
with GroupBox3 dobegin
parent:=Panel1;
Left:=1;
Top:=318;
Width:=104;
Height:=51;
Align:=alNone;
Caption:=' Trade ';
TabOrder:=2;
end;
Button8:=TButton.Create(GroupBox3);
with Button8 dobegin
parent:=GroupBox3;
Left:=12;
Top:=20;
Width:=75;
Height:=25;
Caption:='Start';
TabOrder:=0;
OnClick:=@Button8Click;
end;
GroupBox4:=TGroupBox.Create(Panel1);
with GroupBox4 dobegin
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 dobegin
parent:=GroupBox4;
Left:=16;
Top:=24;
Width:=73;
Height:=17;
Caption:='Fisherman';
TabOrder:=0;
end;
CheckBox8:=TCheckBox.Create(GroupBox4);
with CheckBox8 dobegin
parent:=GroupBox4;
Left:=95;
Top:=24;
Width:=58;
Height:=17;
Caption:='Fishing';
TabOrder:=1;
end;
CheckBox9:=TCheckBox.Create(GroupBox4);
with CheckBox9 dobegin
parent:=GroupBox4;
Left:=159;
Top:=24;
Width:=57;
Height:=17;
Caption:='Moving';
TabOrder:=2;
end;
form1.Show;
end;
//***************************************************************//Вызывается при выключении скрипта//***************************************************************procedure Free;
beginif RecordPath<>nil thentry
RecordPath.Free;
except
debugmsg('error free RecordPath');
end;
if MovePath<>nil thentry
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);
beginif 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;
beginif SavePathEnabled thenexit;
if MoveToPathEnabled thenbegin
SendMsg('Во время следования по маршруту запись не возможна');
exit;
end;
RecordPath.Clear;
PointsCount:=0;
SendMsg('Начата запись маршрута');
SavePathEnabled := Trueend;
procedure StopRecord;
beginifnot SavePathEnabled thenexit;
// записываем
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;
beginifnot SavePathEnabled thenexit;
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;
begintry
dx:= xpos1-xpos2;
dy:= ypos1-ypos2;
summa:= dx*dx+dy*dy;
if summa = 0then result:= 0else 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=0thenbeginexit;
MoveTimer.Enabled:=False;
MoveToPathEnabled:=False;
SendMsg('Нет данных по маршруту');
exit;
end;
tryfor i:=0to PointsList.count-1dobegin
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>0thenbeginif(result=-1)thenbegin
min_dist:=m;
result:=i;
endelseif m<min_dist thenbegin
min_dist:=m;
result:=i;
end;
end;
end;
except
debugMsg('error in GetMinCheckPoint');
end;//tryend;
procedure GoToPath(ToForward: boolean);
var
x,y,z,i: integer;
s: string;
begin
MoveToPathEnabled:= not MoveToPathEnabled;
MoveToForward:=ToForward;
ifnot MoveToPathEnabled thenbegin
MoveTimer.Enabled:=False;
SendMsg('Следование по маршруту остановлено');
exit;
end;
//// предположительно путь уже прописан в MovePath//
SendMsg('Пробуем выйти на путь...');
// сперва идем к ближайшему чекпоинту
i:= GetMinCheckPoint(MovePath);
if i<0thenbegin
SendMsg('чекпоинт не найден');
MoveToPathEnabled:=False;
endelsebegin
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)thenbegin
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;
begininc(old_time);// счетчик, сколько тиков прошло с последнего клика. исп. при следованию по маршрутуifnot MoveToPathEnabled thenbegintry
TTimer(Sender).Enabled:=False;
exceptend;
SendMsg('Движение остановлено');
exit;
end;
// возможно мы пали смертью храбрых, то не дергаемся покаif myHP<=0thenbegin
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)thenbeginif MoveToForward thenbeginif MoveStepIndex=MovePath.Count-1thenbegin
MoveToPathEnabled:=False;
SendMsg('Мы по идее в конечной точке');
exit;
endelsebegininc(MoveStepIndex);
end;
endelsebeginif MoveStepIndex>0thendec(MoveStepIndex)elsebegin
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 dobegin
i:=pos('|',S);
if i>=0thenbegin
s:=copy(s,i+1,length(s)-i);
inc(j);
endelsebreak;
end;
i:=pos('|',s);
if i>=0then
s:=copy(s,1,i-1);
try
result:=strtoint(s);
exceptend;
end;
//******************************************************************//Идти в точку с координатами x,y,zprocedure 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;
beginif delta(targetx, targety, MyX, MyY)<=distanciya
then result:=trueelse 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+48else i:=i+44;
MyMaxHP:=ReadD(i);
MyHP:=ReadD(i);
MyMaxMP:=ReadD(i); // чисто информативно
MyMP:=ReadD(i);
end;
procedure StatusUpdate; // обновление данных о себеvar
i: integer;
beginfor i:=0to ReadD(6)-1docase 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); //Вызывается при установке соединенияbeginend;
procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединенияbeginend;
function iif(Bool: Boolean;aTrue: variant; aFalse: variant): variant;
beginif Bool then
result:=aTrue
else
result:=aFalse;
end;
function ParseCmd(cmd: string):boolean;
var
s: string;
i,j,k: integer;
params: array[0..9] ofstring; // до 10 параметров, должно хватитьbegin
result:=False;
try
j:=-1;
i:=pos(cmdPrefix,trim(cmd));
if i=0thenexit;
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);
repeatinc(j);
k:=pos(cmdDlm,s);
if k>0thenbegin
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]);
endelsebegin
params[j]:=s;
debugmsg('parm is one');
end;
untilpos(cmdDlm,S)=0;
if j>-1thenbegininc(j);
params[j]:=s;
debugmsg('extract idx:'+inttostr(j) +' param:'+params[j]);
end;
if j=-1thenexit;
//*******************************************************// пропарсили команду// теперь выполняем//*******************************************************if params[0]=cmdRecordPath thenbeginif params[1]<>''then
RecordPathFileName:=params[1]
else
RecordPathFileName:=RecordPathName;
StartRecord;
endelseif params[0]=cmdSavePath thenbegin
StopRecord;
endelseif params[0]=cmdMove thenbeginif params[1]=''thenbegin
SendMsg('хз куда бежать, укажите имя');
exit;
end;
try
MovePath.LoadFromFile(RecordFilesPath+params[1]+RecordFileExt);
except
SendMsg('файл пути не найден');
exit;
end;
GoToPath(true);
endelseif params[0]=cmdBack thenbeginif params[1]=''thenbegin
SendMsg('хз куда бежать, укажите имя');
exit;
end;
try
MovePath.LoadFromFile(RecordFilesPath+params[1]+RecordFileExt);
except
SendMsg('файл пути не найден');
exit;
end;
GoToPath(false);
endelseif(params[0]=cmdStop)and MoveToPathEnabled then
MoveToPathEnabled:=False;
except
debugmsg('error in ParseCmd,params='+cmd);
end;
end;
//основная часть скрипта//вызывается при приходе каждого пакета если скрипт включенvar
i: integer;
beginif FromClient and(ConnectName=MyNick)thencase 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; // caseif FromServer and(ConnectName=MyNick)thencase pck[1] of
#$04: UserInfo;
#$0E: StatusUpdate;
end; // caseend.
///////////////////////////////////////////////////////////////// для: L2PacketHack by xkor // посл. редактирование: 14.05.2008, 15:03msk, alexsl // переделка под протокол русского оффа by Wanick 08.12.2008// назначение: перемещение чара по заранее записаным маршруту(м) // // краткая инструкция: // // 1. прописать ник в MyNick // // - для записи пути в файл: // 1. встаем на исходную позицию // 2. в чат пишим "===rec test1" (test1 - или другое имя без пробелов) // 3. бежим куда нужно. (желательно много не кликать на одно и тоже место. все клики записываются в файл) // 4. в чат пишим "===save" // 5. все. теперь данные записаны на диск, согласно настройкам и под именем test1 указ. в п.п.2 // // - записываем требуемые пути с разными маршрутами и названиями // // - использование // 1. бег до последнего чекпоинта(при достижении скрипт завершает работу): // пишим в чат "===go test1" (test1 - название записанного маршрута) // 2. бег до первого чекпоинта (при достижении скрипт завершает работу): // пишим в чат "===back test1" (test1 - название записанного маршрута) // 3. для остановки скрипта при передвижении: пишим в чат "===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;
const
MyNick = 'мой ник';// <------------------------------
interlude = false;
debug = false;
// эта переменная указывает уничтожить пакет или нет если он обработан // может данные нужны для других скриптов
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'; // останавливает следование по маршруту //******************************************************* procedure Init; //Вызывается при включении скрипта begin
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.Create;
end;
procedure Free; //Вызывается при выключении скрипта beginif RecordPath<>nil thentry
RecordPath.Free;
except
debugmsg('error free RecordPath');
end;
if MovePath<>nil thentry
MovePath.Free;
except
debugmsg('error free MovePath');
end;
end;
procedure debugmsg(s: string);
beginif 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;
beginif SavePathEnabled thenexit;
if MoveToPathEnabled thenbegin
SendMsg('Во время следования по маршруту запись не возможна');
exit;
end;
RecordPath.Clear;
PointsCount:=0;
SendMsg('Начата запись маршрута');
SavePathEnabled := Trueend;
procedure StopRecord;
beginifnot SavePathEnabled thenexit;
// записываем
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;
beginifnot SavePathEnabled thenexit;
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;
begintry
dx:= xpos1-xpos2;
dy:= ypos1-ypos2;
summa:= dx*dx+dy*dy;
if summa = 0then result:= 0else 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=0thenbeginexit;
MoveTimer.Enabled:=False;
MoveToPathEnabled:=False;
SendMsg('Нет данных по маршруту');
exit;
end;
tryfor i:=0to PointsList.count-1dobegin
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>0thenbeginif(result=-1)thenbegin
min_dist:=m;
result:=i;
endelseif m<min_dist thenbegin
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;
ifnot MoveToPathEnabled thenbegin
MoveTimer.Enabled:=False;
SendMsg('Следование по маршруту остановлено');
exit;
end;
// // предположительно путь уже прописан в MovePath //
SendMsg('Пробуем выйти на путь...');
// сперва идем к ближайшему чекпоинту
i:= GetMinCheckPoint(MovePath);
if i<0thenbegin
SendMsg('чекпоинт не найден');
MoveToPathEnabled:=False;
endelsebegin
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)thenbegin
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;
begininc(old_time);// счетчик, сколько тиков прошло с последнего клика. исп. при следованию по маршрутуifnot MoveToPathEnabled thenbegintry
TTimer(Sender).Enabled:=False;
exceptend;
SendMsg('Движение остановлено');
exit;
end;
// возможно мы пали смертью храбрых, то не дергаемся покаif myHP<=0thenbegin
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)thenbeginif MoveToForward thenbeginif MoveStepIndex=MovePath.Count-1thenbegin
MoveToPathEnabled:=False;
SendMsg('Мы по идее в конечной точке');
exit;
endelsebegininc(MoveStepIndex);
end;
endelsebeginif MoveStepIndex>0thendec(MoveStepIndex)elsebegin
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 dobegin
i:=pos('|',S);
if i>=0thenbegin
s:=copy(s,i+1,length(s)-i);
inc(j);
endelsebreak;
end;
i:=pos('|',s);
if i>=0then
s:=copy(s,1,i-1);
try
result:=strtoint(s);
exceptend;
end;
//****************************************************************** //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):boolean;
beginif delta(targetx, targety, MyX, MyY)<=distanciya
then result:=trueelse 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+48else i:=i+44;
MyMaxHP:=ReadD(i);
MyHP:=ReadD(i);
MyMaxMP:=ReadD(i); // чисто информативно
MyMP:=ReadD(i);
end;
procedure StatusUpdate; // обновление данных о себе var
i: integer;
beginfor i:=0to ReadD(6)-1docase 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); //Вызывается при установке соединения beginend;
procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения beginend;
function iif(Bool: Boolean;aTrue: variant; aFalse: variant): variant;
beginif Bool then
result:=aTrue
else
result:=aFalse;
end;
function ParseCmd(cmd: string):boolean;
var
s: string;
i,j,k: integer;
params: array[0..9] ofstring; // до 10 параметров, должно хватить begin
result:=False;
try
j:=-1;
i:=pos(cmdPrefix,trim(cmd));
if i=0thenexit;
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);
repeatinc(j);
k:=pos(cmdDlm,s);
if k>0thenbegin
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]);
endelsebegin
params[j]:=s;
debugmsg('parm is one');
end;
untilpos(cmdDlm,S)=0;
if j>-1thenbegininc(j);
params[j]:=s;
debugmsg('extract idx:'+inttostr(j) +' param:'+params[j]);
end;
if j=-1thenexit;
//******************************************************* // пропарсили команду // теперь выполняем //******************************************************* if params[0]=cmdRecordPath thenbeginif params[1]<>''then
RecordPathFileName:=params[1]
else
RecordPathFileName:=RecordPathName;
StartRecord;
endelseif params[0]=cmdSavePath thenbegin
StopRecord;
endelseif params[0]=cmdMove thenbeginif params[1]=''thenbegin
SendMsg('хз куда бежать, укажите имя');
exit;
end;
try
MovePath.LoadFromFile(RecordFilesPath+params[1]+RecordFileExt);
except
SendMsg('файл пути не найден');
exit;
end;
GoToPath(true);
endelseif params[0]=cmdBack thenbeginif params[1]=''thenbegin
SendMsg('хз куда бежать, укажите имя');
exit;
end;
try
MovePath.LoadFromFile(RecordFilesPath+params[1]+RecordFileExt);
except
SendMsg('файл пути не найден');
exit;
end;
GoToPath(false);
endelseif(params[0]=cmdStop)and MoveToPathEnabled then
MoveToPathEnabled:=False;
except
debugmsg('error in ParseCmd,params='+cmd);
end;
end;
//основная часть скрипта //вызывается при приходе каждого пакета если скрипт включен var
i: integer;
beginif FromClient and(ConnectName=MyNick)thencase pck[1] of{
#$1B: // social
case pck[2] of
#$06: StartRecord; //Yes
#$05: StopRecord;//No
#$04: begin GoToPath(true); pck:=''; end;
end; //case
}
#$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;
end; // case if FromServer and(ConnectName=MyNick)thencase pck[1] of
#$32: UserInfo;
#$18: StatusUpdate;
end; // case end.
для ру ОФФА проверял работает скорее всего и на Kamael пойдет
функцию sendMsg - закоментарил т.к. она встроена в последних версиях пакетхака
Последний раз редактировалось wanick, 08.12.2008 в 22:15.
А вот это скрипт переделан и доработан мной, управление скриптом прямо в игре
в шорткаты 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.Create;
end;
procedure Free; //Вызывается при выключении скрипта beginif RecordPath<>nil thentry
RecordPath.Free;
except
debugmsg('error free RecordPath');
end;
if MovePath<>nil thentry
MovePath.Free;
except
debugmsg('error free MovePath');
end;
end;
procedure debugmsg(s: string);
beginif debug then
SendMsgPM(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;
beginif SavePathEnabled thenexit;
if MoveToPathEnabled thenbegin
SendMsgPM('Во время следования по маршруту запись не возможна');
exit;
end;
RecordPath.Clear;
PointsCount:=0;
SendMsgPM('Начата запись маршрута');
SavePathEnabled := Trueend;
procedure StopRecord;
beginifnot SavePathEnabled thenexit;
// записываем
RecordPath.SaveToFile(GetRecordFileName);
SendMsgPM('Запись маршрута завершена');
SavePathEnabled := False;
end;
function GetRecordFileName: string;
begin
result:=RecordFilesPath+RecordPathFileName+RecordFileExt;
end;
procedure 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: string;
beginif MoveToPathEnabled thenbegin ParseCmd ('===stop'); OpenControl; end;
ifnot SavePathEnabled thenexit;
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));
end;
function delta(xpos1, ypos1, xpos2, ypos2:extended):integer; //возвращает переменную rezu которая является растоянием между 2 точками var
dx,dy,summa: extended;
begintry
dx:= xpos1-xpos2;
dy:= ypos1-ypos2;
summa:= dx*dx+dy*dy;
if summa = 0then result:= 0else 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=0thenbeginexit;
MoveTimer.Enabled:=False;
MoveToPathEnabled:=False;
SendMsgPM('Нет данных по маршруту');
exit;
end;
tryfor i:=0to PointsList.count-1dobegin
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>0thenbeginif(result=-1)thenbegin
min_dist:=m;
result:=i;
endelseif m<min_dist thenbegin
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;
ifnot MoveToPathEnabled thenbegin
MoveTimer.Enabled:=False;
SendMsgPM('Следование по маршруту остановлено');
exit;
end;
// // предположительно путь уже прописан в MovePath //
SendMsgPM('Пробуем выйти на путь...');
// сперва идем к ближайшему чекпоинту
i:= GetMinCheckPoint(MovePath);
if i<0thenbegin
SendMsgPM('чекпоинт не найден');
MoveToPathEnabled:=False;
endelsebegin//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)thenbegin
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;
begininc(old_time);// счетчик, сколько тиков прошло с последнего клика. исп. при следованию по маршрутуifnot MoveToPathEnabled thenbegintry
TTimer(Sender).Enabled:=False;
exceptend;
SendMsgPM('Движение остановлено');
exit;
end;
// возможно мы пали смертью храбрых, то не дергаемся покаif myHP<=0thenbegin
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)thenbeginif MoveToForward thenbeginif MoveStepIndex=MovePath.Count-1thenbegin
SendMsgPM('Вы в конечной точке');
MoveToPathEnabled:=False;
if isPatrol then
ParseCmd ('===back '+selectPathFileName);
OpenControl;
exit;
endelsebegininc(MoveStepIndex);
end;
endelsebeginif MoveStepIndex>0thendec(MoveStepIndex)elsebegin
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);
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 dobegin
i:=pos('|',S);
if i>=0thenbegin
s:=copy(s,i+1,length(s)-i);
inc(j);
endelsebreak;
end;
i:=pos('|',s);
if i>=0then
s:=copy(s,1,i-1);
try
result:=strtoint(s);
exceptend;
end;
//****************************************************************** //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):boolean;
beginif delta(targetx, targety, MyX, MyY)<=distanciya
then result:=trueelse 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+48else i:=i+44;
MyMaxHP:=ReadD(i);
MyHP:=ReadD(i);
MyMaxMP:=ReadD(i); // чисто информативно
MyMP:=ReadD(i);
end;
procedure StatusUpdate; // обновление данных о себе var
i: integer;
beginfor i:=0to ReadD(6)-1docase 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); //Вызывается при установке соединения beginend;
procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения beginend;
function iif(Bool: Boolean;aTrue: variant; aFalse: variant): variant;
beginif Bool then
result:=aTrue
else
result:=aFalse;
end;
function ParseCmd(cmd: string):boolean;
var
s: string;
i,j,k: integer;
params: array[0..9] ofstring; // до 10 параметров, должно хватить
isOne:boolean =false;
begin
result:=False;
try
j:=-1;
i:=pos(cmdPrefix,trim(cmd));
if i=0thenexit;
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);
repeatinc(j);
k:=pos(cmdDlm,s);
params[0] := '';
params[1] := '';
if k>0thenbegin
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]);
endelsebegin
params[j]:=s;
isOne := true;
debugmsg('parm is one');
end;
untilpos(cmdDlm,S)=0;
if(j>-1)AND(NOT isOne)thenbegininc(j);
params[j]:=s;
debugmsg('extract idx:'+inttostr(j) +' param:'+params[j]);
end;
if j=-1thenexit;
//******************************************************* // пропарсили команду // теперь выполняем //******************************************************* if params[0]=cmdRecordPath thenbegin
sendMsg(params[1]);
if(params[1] <> '')then
RecordPathFileName:=params[1]
else
RecordPathFileName:=RecordPathName;
StartRecord;
endelseif params[0]=cmdSavePath thenbegin
StopRecord;
endelseif params[0]=cmdMove thenbeginif(params[1] <> '')then
selectPathFileName:=params[1]
else
selectPathFileName:=RecordPathName;
try
MovePath.LoadFromFile(RecordFilesPath+selectPathFileName+RecordFileExt);
except
SendMsgPM('файл пути не найден');
exit;
end;
GoToPath(true);
endelseif params[0]=cmdBack thenbeginif(params[1] <> '')then
selectPathFileName:=params[1]
else
selectPathFileName:=RecordPathName;
try
MovePath.LoadFromFile(RecordFilesPath+selectPathFileName+RecordFileExt);
except
SendMsgPM('файл пути не найден');
exit;
end;
GoToPath(false);
endelseif(params[0]=cmdStop)and MoveToPathEnabled thenbegin
MoveToPathEnabled:=False;
isPatrol:= false;
endelseif(params[0] = cmdDelete)thenbegin SendMsgPM ('Удаление не работает'); exit; endelseif(params[0] = cmdPatrol)thenbegin
isPatrol := true;
if(params[1] <> '')then
selectPathFileName:=params[1]
else
selectPathFileName:=RecordPathName;
ParseCmd ('===go '+selectPathFileName);
end;
except
debugmsg('error in ParseCmd,params='+cmd);
end;
end;
procedure 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>';
ifnot show thenexit;
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; // временная переменнаяbeginif FromClient and(ConnectName=MyNick)thencase 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 thenbegin pck := ''; OpenControl; end;
#$23: // перехват наших действий в диалоговом окнеbegin
tmp1:= ReadS(2);
ifPos(menuID, tmp1) = 1thenbegin
pck:='';
tmp1 := Copy(tmp1, Length(menuID)+1, Length(tmp1)-Length(menuID));
MyRule(tmp1);
end;
end;
end; // caseif FromServer and(ConnectName=MyNick)thencase pck[1] of
#$32: UserInfo;
#$18: StatusUpdate;
//by Wanick
#$11:beginif isInit=falsethenbegin
buf:=pck;
SendToClient;
endelsebegin
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; //#11end; // caseif pck=''thenexit;
end.
Не получилось сделать выбор уже существующих маршрутов в combobox
из-за ограниченных возможностей FastScript в плагине, собираюсь сделать плагин там будет по проще.
если кто знает как из fastScript получить список фалов пишите
Последний раз редактировалось wanick, 11.12.2008 в 20:39.
Причина: забыл упоминуть скрипт для Оффа
я так пробовал проблема в том что TSearchRec, это запись(record) из sysutils.dll, а FastScript не позволяет использовать "uses sysutils;"
пробовал и через подгрузку dll делать, скорее всего не получилось, из-за того что SysUtils не лежит в папке с пакетхаком, и надо указывать полный путь от корня диска, а как определить путь в зависимости от системы я не знаю да и не искал, в скрипте нестал вводить переменную, путь до библиотеки SysUtils узеры могут испугатся )) , проще сделать плагин. что я и собираюсь сделать. а в плагине и "uses sysutils;" не проблема.