PDA

Просмотр полной версии : Скрипт авто БД, СВС


AD!
20.03.2009, 07:54
Отрывая от сердца)
Скрипт для бд и свс! для интерлюд, тестился только на шоке
Моно в тему жесткого скриптинга перенести если подходит по нормативам ;)

Работает под хБ сервер (мод PanAm), исправлена ошибка следования за лидером.
Не выводит пассивные скилы.


{
AutoBD_SVS by Ad
Принимает пати танцует или поет, и следует по необходимости!
Для того чтобы нормально следовал за целью, нужно основным чаром что нибудь в чат написать, чтобы запомнился айди.

name- ник БД или СВСа
name2- ник того перса который будет кидать пати и за кем будет следовать БД или СВС.

Запускать скрипт ТОЛЬКО ПОСЛЕ того как БД или СВС уже вошел в игру.

Благодарность PanAm за мод)
}

Const
name2='МойНик';
name='никБДилиСВС';

//ID пакетов Kamael, HB, Gracia
//От клиента
ACTION_ID = #$1F;
REQUESTITEMLIST_ID = #$14;
REQUESTANSWERJOINPARTY_ID = #$43;
REQUESTWITHDRAWALPARTY_ID = #$44;
REQUESTMAGICSKILLUSE_ID = #$39;
REQUESTSOCIALACTION_ID = #$34;
REQUESTSSKILLLIST_ID = #$50;
//от сервера
USERINFO_ID = #$32;
ASKJOINPARTY_ID = #$39;
SAY2_ID = #$4A;
SKILLLIST_ID = #$5F;
MAGICSKILLLAUNCHED_ID = #$54;

//ID пакетов Interlude
//От клиента
{ ACTION_ID = #$04;
REQUESTITEMLIST_ID = #$0F;
REQUESTANSWERJOINPARTY_ID = #$2A;
REQUESTWITHDRAWALPARTY_ID = #$2B;
REQUESTMAGICSKILLUSE_ID = #$2F;
REQUESTSOCIALACTION_ID = #$1B;
REQUESTSSKILLLIST_ID = #$3F;
//от сервера
USERINFO_ID = #$04;
ASKJOINPARTY_ID = #$39;
SAY2_ID = #$4A;
SKILLLIST_ID = #$58;
MAGICSKILLLAUNCHED_ID = #$76; }


Var
Msg : TMemo;
FormMain : TForm; //Создаваемая форма
useskill: TTimer;
skills:string;
skillid,skillidold:integer;
party_have,iswork,skillhave:boolean;
skillbase: array[1..200,0..3] of integer;
SkillsName : TStringList;
listbox1,listbox2: TListBox;
GB1: TGroupBox;
Button1,Button2,Button3,Button4: TButton;
Lb1,Lb2: Tlabel;
cb3:tcheckbox;
myOID,myX,myY,myZ: integer;
targetOID:integer;

function Create_FormMain : TForm;
Var
Yes : boolean;
begin
Yes := FALSE;
Result := TForm.Create(nil);

Result.Caption := 'AutoBD v.0.0.1';
Result.Left := 397;
Result.Top := 233;
Result.Width := 450;
Result.Height := 650;
Result.FormStyle := fsNormal;
Result.Position := poDesigned;
Result.BorderStyle := bsSizeable;
Result.BorderWidth := 0;
Result.WindowState := wsNormal;
Result.Color := clBtnFace;
Result.Font.Name := 'Tahoma';
Result.Font.Size := 8;
Result.Font.Color := clWindowText;
Result.Font.CharSet:= 1;
Result.OnClose := @FormClose;

Msg := TMemo.Create(Result);
Msg.Parent := Result;
Msg.Left := 0;
Msg.Top := 400;
Msg.Width := 200;
Msg.Height := 200;
Msg.Visible := TRUE;
Msg.Tag := 0;
Msg.Enabled := TRUE;
Msg.Hint := '';
Msg.ShowHint := FALSE;
Msg.Font.Name := 'Tahoma';
Msg.Font.Size := 8;
Msg.Font.Color := clWindowText;
Msg.Color := clWindow;
Msg.TabOrder := 2;
Msg.TabStop := TRUE;
Msg.Align := alBottom;
Msg.WordWrap := TRUE;
Msg.Alignment := taLeftJustify;
Msg.WantTabs := FALSE;
Msg.WantReturns := TRUE;
Msg.HideSelection := TRUE;
Msg.MaxLength := 0;
Msg.OEMConvert := FALSE;
Msg.ReadOnly := FALSE;
Msg.ScrollBars := ssNone;

GB1 := TGroupBox.Create(Result);
GB1.Parent := result;
GB1.Align := alRight;
GB1.Left := 1;
GB1.Top := 2;
GB1.Width := 100;
GB1.Height := 95;
GB1.Visible := TRUE;
GB1.Tag := 0;
GB1.Enabled := TRUE;
GB1.Hint := '';
GB1.ShowHint := FALSE;
GB1.Caption := 'НЕПРИНИМАЕТ ПАТИ';
GB1.Align := alTOP;
GB1.Color := clBtnFace;
GB1.Font.Name := 'Tahoma';
GB1.Font.Size := 8;
GB1.Font.Color := clWindowText;
GB1.Font.CharSet := 1;
GB1.TabOrder := 3;
GB1.TabStop := FALSE;

listbox1 := Tlistbox.Create(Result);
listbox1.Parent := Result;
listbox1.Left := 0;
listbox1.Top := 100;
listbox1.Width := 180;
listbox1.Height := 200;
listbox1.Visible := TRUE;
listbox1.Tag := 0;
listbox1.Enabled := TRUE;
listbox1.Hint := '';
listbox1.ShowHint := FALSE;
listbox1.Font.Name := 'Tahoma';
listbox1.Font.Size := 8;
listbox1.Font.Color := clWindowText;
listbox1.Color := clWindow;
listbox1.TabOrder := 2;
listbox1.TabStop := TRUE;
listbox1.Align := alLeft;
listbox1.OnDblClick :=@button3click;

listbox2 := Tlistbox.Create(Result);
listbox2.Parent := Result;
listbox2.Left := 0;
listbox2.Top := 100;
listbox2.Width := 180;
listbox2.Height := 200;
listbox2.Visible := TRUE;
listbox2.Tag := 0;
listbox2.Enabled := TRUE;
listbox2.Hint := '';
listbox2.ShowHint := FALSE;
listbox2.Font.Name := 'Tahoma';
listbox2.Font.Size := 8;
listbox2.Font.Color := clWindowText;
listbox2.Color := clWindow;
listbox2.TabOrder := 2;
listbox2.TabStop := TRUE;
listbox2.Align := alRight;
listbox2.OnDblClick :=@button4click;

Button1 := TButton.Create(Result);
Button1.Parent := gb1;
Button1.Left := 10;
Button1.Top := 30;
Button1.Width := 75;
Button1.Height := 25;
Button1.Visible := TRUE;
Button1.Tag := 0;
Button1.Enabled := true;
Button1.Hint := '';
Button1.ShowHint := FALSE;
Button1.Caption := 'Вкл';
Button1.Font.Name := 'Tahoma';
Button1.Font.Size := 8;
Button1.Font.Color := clWindowText;
Button1.Font.CharSet := 1;
Button1.TabOrder := 1;
Button1.TabStop := TRUE;
Button1.Cancel := FALSE;
Button1.ModalResult := 0;
Button1.OnClick := @Button1click;

Button2 := TButton.Create(Result);
Button2.Parent := gb1;
Button2.Left := 100;
Button2.Top := 30;
Button2.Width := 75;
Button2.Height := 25;
Button2.Visible := TRUE;
Button2.Tag := 0;
Button2.Enabled := true;
Button2.Hint := '';
Button2.ShowHint := FALSE;
Button2.Caption := 'Выкл';
Button2.Font.Name := 'Tahoma';
Button2.Font.Size := 8;
Button2.Font.Color := clWindowText;
Button2.Font.CharSet := 1;
Button2.TabOrder := 1;
Button2.TabStop := TRUE;
Button2.Cancel := FALSE;
Button2.ModalResult := 0;
Button2.OnClick := @Button2click;

Button3 := TButton.Create(Result);
Button3.Parent := result;
Button3.Left := 200;
Button3.Top := 140;
Button3.Width := 40;
Button3.Height := 25;
Button3.Visible := TRUE;
Button3.Tag := 0;
Button3.Enabled := True;
Button3.Hint := '';
Button3.ShowHint := FALSE;
Button3.Caption := '>>>>';
Button3.Font.Name := 'Tahoma';
Button3.Font.Size := 8;
Button3.Font.Color := clWindowText;
Button3.Font.CharSet := 1;
Button3.TabOrder := 1;
Button3.TabStop := TRUE;
Button3.Cancel := FALSE;
Button3.ModalResult := 0;
Button3.OnClick := @button3click;

Button4 := TButton.Create(Result);
Button4.Parent := result;
Button4.Left := 200;
Button4.Top := 220;
Button4.Width := 40;
Button4.Height := 25;
Button4.Visible := TRUE;
Button4.Tag := 0;
Button4.Enabled := True;
Button4.Hint := '';
Button4.ShowHint := FALSE;
Button4.Caption := '<<<<';
Button4.Font.Name := 'Tahoma';
Button4.Font.Size := 8;
Button4.Font.Color := clWindowText;
Button4.Font.CharSet := 1;
Button4.TabOrder := 1;
Button4.TabStop := TRUE;
Button4.Cancel := FALSE;
Button4.ModalResult := 0;
Button4.OnClick := @button4click;

Lb1:= Tlabel.Create(result);
Lb1.Parent := GB1;
Lb1.Left := 140;
Lb1.Top := 30+200;
Lb1.Align := alLeft;
Lb1.Layout := tlBottom;
Lb1.Visible := TRUE;
Lb1.Tag := 0;
Lb1.Enabled := TRUE;
Lb1.Hint := '';
Lb1.ShowHint := FALSE;
Lb1.Caption := 'Все Скилы';
Lb1.Font.Name := 'Tahoma';
Lb1.Font.Size := 10;
Lb1.Font.Color := clWindowText;
Lb1.Font.CharSet := 1;

Lb2:= Tlabel.Create(result);
Lb2.Parent := GB1;
Lb2.Left := 140;
Lb2.Top := 30+200;
Lb2.Align := alRight;
Lb2.Layout := tlBottom;
Lb2.Visible := TRUE;
Lb2.Tag := 0;
Lb2.Enabled := TRUE;
Lb2.Hint := '';
Lb2.ShowHint := FALSE;
Lb2.Caption := 'Те которые использовать';
Lb2.Font.Name := 'Tahoma';
Lb2.Font.Size := 10;
Lb2.Font.Color := clWindowText;
Lb2.Font.CharSet := 1;

cb3:= TCheckbox.Create(result);
cb3.Parent := GB1;
cb3.Left := 220;
cb3.Top := 60;
cb3.Width := 220;
cb3.Checked := TRUE;
cb3.Visible := TRUE;
cb3.Tag := 0;
cb3.Enabled := TRUE;
cb3.Hint := '';
cb3.ShowHint := FALSE;
cb3.Caption := 'Следовать послы выхода из пати';
cb3.Font.Name := 'Tahoma';
cb3.Font.Size := 10;
cb3.Font.Color := clWindowText;
cb3.Font.CharSet := 1;

Yes := TRUE;

Result.Show;
msg.Lines.Add(timetostr(now)+': '+'Autodance, by Ad');
msg.Lines.Add(timetostr(now)+': '+'Работаем с чаром: '+Name);

end;

procedure button1click(Sender: TButton);
begin
iswork:=true;
GB1.Caption := 'ПРИНИМАЕТ ПАТИ';
end;

procedure button2click(Sender: TButton);
begin
iswork:=false;
GB1.Caption := 'НЕПРИНИМАЕТ ПАТИ';
end;

procedure perreshet;
var i:integer;
str:string;
begin
str:='';
for i:=1 to ListBox2.items.Count do
begin
str:=str+Copy(ListBox2.Items.Strings[i-1],1+pos(':',ListBox2.Items.Strings[i-1]),pos(' ',ListBox2.Items.Strings[i-1])-4)+':';
end;
skills:=str;
end;

procedure button3click(Sender: TButton);
var m:integer;
begin

if ListBox1.Items.Count>0 then
begin
m:=ListBox1.ItemIndex;
if (ListBox1.Items.Count=1) then m:=0
else
if m=ListBox1.Items.Count-1 then dec(m);

ListBox2.Items.Add(ListBox1.Items.Strings[ListBox1.ItemIndex]);
ListBox1.Items.Delete(ListBox1.ItemIndex);
ListBox1.ItemIndex:=m;
perreshet;
end;

end;

procedure Button4Click(Sender: TObject);
var m:integer;
begin

if ListBox2.Items.Count>0 then
begin
m:=ListBox2.ItemIndex;
if (ListBox2.Items.Count=1) then m:=0
else
if m=ListBox2.Items.Count-1 then dec(m);

ListBox1.Items.Add(ListBox2.Items.Strings[ListBox2.ItemIndex]);
ListBox2.Items.Delete(ListBox2.ItemIndex);
ListBox2.ItemIndex:=m;
perreshet;
end;

end;

procedure FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caNone;
end;

procedure Free_FormMain;
begin
TRY
if FormMain<>NIL then begin
FormMain.Free;
FormMain:=NIL;
end;
FINALLY
END;
end;

procedure SendMesg(msg:string); //отправка сообщений клиенту
begin
buf:=SAY2_ID;
WriteD(0);
WriteD(2);
WriteS('->БОГ');
WriteS(msg);
SendToClientEx(Name);
end;

procedure Init; //Вызывается при включении скрипта
begin

skillsName:=TStringList.Create;
try
skillsName.LoadFromFile('.\settings\SkillsID.ini') ;
except
msg.Lines.Add('itemsid.ini не найден!');
exit;
end;

skillid:=0;
iswork:=false;
useskill:=TTimer.Create(nil);
useskill.OnTimer:=@timerskill;
useskill.interval:=200; //время задержки
useskill.enabled:=true;
skillhave:=false;
party_have:=false;
FormMain:=Create_FormMain;
buf:=REQUESTSSKILLLIST_ID;
SendToServerEx(name);

buf:=REQUESTITEMLIST_ID;
SendToServerEx(name);

end;

procedure timerskill;
begin
if skillid<>0 then
begin
msg.lines.add('Юзаю скилл');
MagicSkillUse(skillid);
skillidold:=skillID;
skillID:=0;
end;

end;

procedure Free; //Вызывается при выключении скрипта
begin
useskill.free;
Free_FormMain;
end;

procedure UserInfo; //обновление данных о себе
var
i:word;
begin
MyOID:=ReadD(18);
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
end;

procedure MagicSkillUse(MagicID:integer);
begin
buf:=REQUESTMAGICSKILLUSE_ID;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;

procedure createskillbase;
var
i, j,n: integer;
begin
for i:=1 to 200 do begin
skillbase[i,0]:=0;
skillbase[i,1]:=0;
skillbase[i,2]:=0;
end;
n:=0;
J:=6;
I:=1;
listbox1.items.Clear;
while I<200 do
begin
skillbase[i,0]:=ReadD(j);
skillbase[i,1]:=ReadD(j);
skillbase[i,2]:=ReadD(j);
if skillbase[i,2]=0 then break;
j:=j+1;
inc(n);
if skillbase[i,0]=0 then
listbox1.items.Add('ID:'+inttostr(skillbase[i,2])+' '+SkillsName.Values[IntToStr(skillbase[i,2])]+' LVL:'+inttostr(skillbase[i,1]));
inc(i);
end;
if N>0 then skillhave:=true;

end;

procedure Target(Attacker: Integer);
begin
buf:=ACTION_ID;
WriteD(Attacker);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(00);
SendToServerEx(Name);
end;

procedure TargetAttacker(Attacker: Integer);
begin
if Attacker<>0 then begin
msg.Lines.Add('Attacker='+IntToStr(Attacker)+' Player='+IntToStr(MyOID));
Target(Attacker);
delay(800);
Target(Attacker);
delay(800);
Target(Attacker);
end;
end;

procedure buffok;
begin
if ReadD(6)=skillIDold then begin
msg.lines.add('Прописываем следующий скилл');
if Length(skills)>0 then begin
skillID:=strtoint(Copy(Skills,1,pos(':',Skills)-1));
delete(Skills,1,pos(':',Skills));
end else
if party_have=true then begin
if cb3.Checked=true then
begin
msg.lines.add('Cледуем за '+name2);
TargetAttacker(targetOID);
end;
msg.lines.add('Разрываем пати');
delay(200);
buf:=REQUESTWITHDRAWALPARTY_ID;
SendToServerEx(name);
party_have:=false;
end;
end;
end;

var
temp : String;

begin
if pck='' then exit;
if (LowerCase(ConnectName)=LowerCase(Name)) and FromClient then
case pck[1] of
REQUESTSOCIALACTION_ID:
case ReadD(2) of
//социальное действие Yes для старта
6: begin
iswork:=true;
GB1.Caption:= 'ПРИНИМАЕТ ПАТИ';
end;
//социальное действие No для остановки
5: begin
iswork:=false;
GB1.Caption:= 'НЕПРИНИМАЕТ ПАТИ';
end;
end;
end;

if (ConnectName=Name) and FromServer then
begin
case pck[1] of
ASKJOINPARTY_ID: if iswork then
begin
temp:=ReadS(2);
if LowerCase(temp)=LowerCase(name2) then
begin
perreshet;
Delay(100);
buf:=REQUESTANSWERJOINPARTY_ID+HStr('01 00 00 00');
SendToServerEx(name);
msg.Lines.Add('Принимаю пати');
party_have:=true;
Delay(200);
if Length(skills)>0 then
begin
msg.Lines.Add('Прописываю скилл');
skillID:=strtoint(Copy(Skills,1,pos(':',Skills)-1));
delete(Skills,1,pos(':',Skills));
end;
pck:='';
end else msg.Lines.Add('Проигнорирован запрос пати от: '+temp);
end;

MAGICSKILLLAUNCHED_ID: begin
if (MyOID=ReadD(2)) then buffok;
end;
USERINFO_ID: begin //пакет с инфой о моём чаре
UserInfo;
end;
SAY2_ID: begin //пакет с инфой о том за кем бежать
if LowerCase(ReadS(10))=LowerCase(name2) then
begin
TargetOID:=ReadD(2);
msg.lines.add('Нашли цель следовния: '+inttostr(TARGETOID));
end;
end;
SKILLLIST_ID: begin
if skillhave=false then createskillbase;
end;
end;
end;

end.

Grinch
20.03.2009, 07:58
хз свой я видимо не смогу оторвать от сердца :) у меня он на автопилоте бегает за любым чаром который прописан в скрипте, но принимает пати от любого другого кто прописан там. а в целом разницы думаю нет

Thinker
21.03.2009, 21:10
хз свой я видимо не смогу оторвать от сердца
жмот :)

lamer
11.04.2009, 07:32
Чтото он у меня не захотел работать, но видимо это изза ХБ. Прошу отписаться по этому поводу..

Grinch
11.04.2009, 11:07
lamer, те тут тех. подержка что ли? правь под ХБ и все

lamer
11.04.2009, 11:54
lamer, те тут тех. подержка что ли? правь под ХБ и все

еслиб умел, ужеб исправил...

lamer
14.04.2009, 18:00
блин народ, ну подскажите что и как изменить, если смогу поправить выложу исправленный.

NLObP
15.04.2009, 12:40
блин народ, ну подскажите что и как изменить, если смогу поправить выложу исправленный.

Берешь packetsТ0.ini от интерлюдии и packetsТ1.ini грации, ищешь соответствие между ними. Меняешь в скрипте ID пакетов интерлюдии на ID пакетов грации. Дополнительно, может быть менялся формат пакета, тоже надо будет поправить.

lamer
15.04.2009, 15:06
Спасибо что не игнорируете, терь извиваем дальше мой нубо мозг.
Берешь packetsТ0.ini от интерлюдии и packetsТ1.ini грации. Сначало подумал, что речь идёт об этом
procedure Init; //Вызывается при включении скрипта
begin

skillsName:=TStringList.Create;
try
skillsName.LoadFromFile('.\SkillsID.ini');
except
msg.Lines.Add('itemsid.ini не найден!');
exit;
end;
Но потом всётаки решил, что не может 5 строчек менять работу всего скрипта (при моей проблемме), значит надо искать правильный путь. Давным давно гдето наталкивался на описание этого гемора, (вроде это при переходе шоков с С4 на ИЛ было). Ну пол дня по форуму мотаюсь не нашёл.
Итог - наставте на путь истенный, плиз.

PanAm
15.04.2009, 15:35
Для ревизии выше 100, из-за изменения структуры папок надо переписат
skillsName.LoadFromFile('.\SkillsID.ini');
на
skillsName.LoadFromFile('.\settings\SkillsID.ini') ;

alexteam
15.04.2009, 16:05
Try except в релизе 3.5.2.102 и выше не желателен вообще. ОСОБЕННО В ИНИТЕ!
если его убрать, редактор пх сразу покажет проблему подсветив это место, и написав что за ошибка произошла в статусбаре. как следствие исключит возможность запускать скрипт с заведомо непроизведенным полноценно инитом.
с блоком трайекцепт - как минимум подсвечивать он ничего не будет.
как максимум он пройдет дальше в ините скрипта и уже в теле скрипта натворит делов. либо в фрии.

Добавлено через 5 минут
особенно это касается релизов в промежутке 3.5.1.84 - 3.5.2.100. там возможен дезлок и как результат - невозможность снять галочку с скрипта либо вызвать тестфрии. при обращении к несуществующему обьекту в фрии.
рекомендую обновиться. и поубирать трайексепты в инитах.

PanAm
15.04.2009, 16:23
Вот немного подредактировал скрипт (да простит меня автор)
Логику не менял, только переписал для более удобного портирования на различные хроники.
{
AutoBD_SVS by Ad
Принимает пати танцует или поет, и следует по необходимости!
Для того чтобы нормально следовал за целью, нужно основным чаром что нибудь в чат написать, чтобы запомнился айди.

name- ник БД или СВСа
name2- ник того перса который будет кидать пати и за кем будет следовать БД или СВС.

Запускать скрипт ТОЛЬКО ПОСЛЕ того как БД или СВС уже вошел в игру.
}

Const
name2='МойНик';
name='никБДилиСВС';

//ID пакетов
//От клиента
ACTION_ID = #$04;
REQUESTITEMLIST_ID = #$0F;
REQUESTANSWERJOINPARTY_ID = #$2A;
REQUESTWITHDRAWALPARTY_ID = #$2B;
REQUESTMAGICSKILLUSE_ID = #$2F;
REQUESTSOCIALACTION_ID = #$1B;
REQUESTSSKILLLIST_ID = #$3F;
//от сервера
USERINFO_ID = #$04;
ASKJOINPARTY_ID = #$39;
SAY2_ID = #$4A;
SKILLLIST_ID = #$58;
MAGICSKILLLAUNCHED_ID = #$76;


Var
Msg : TMemo;
FormMain : TForm; //Создаваемая форма
useskill: TTimer;
skills:string;
skillid,skillidold:integer;
party_have,iswork,skillhave:boolean;
skillbase: array[1..200,1..2] of integer;
SkillsName : TStringList;
listbox1,listbox2: TListBox;
GB1: TGroupBox;
Button1,Button2,Button3,Button4: TButton;
Lb1,Lb2: Tlabel;
cb3:tcheckbox;
myOID,myX,myY,myZ: integer;
targetOID:integer;

function Create_FormMain : TForm;
Var
Yes : boolean;
begin
Yes := FALSE;
Result := TForm.Create(nil);

Result.Caption := 'AutoBD v.0.0.1';
Result.Left := 397;
Result.Top := 233;
Result.Width := 450;
Result.Height := 650;
Result.FormStyle := fsNormal;
Result.Position := poDesigned;
Result.BorderStyle := bsSizeable;
Result.BorderWidth := 0;
Result.WindowState := wsNormal;
Result.Color := clBtnFace;
Result.Font.Name := 'Tahoma';
Result.Font.Size := 8;
Result.Font.Color := clWindowText;
Result.Font.CharSet:= 1;
Result.OnClose := @FormClose;

Msg := TMemo.Create(Result);
Msg.Parent := Result;
Msg.Left := 0;
Msg.Top := 400;
Msg.Width := 200;
Msg.Height := 200;
Msg.Visible := TRUE;
Msg.Tag := 0;
Msg.Enabled := TRUE;
Msg.Hint := '';
Msg.ShowHint := FALSE;
Msg.Font.Name := 'Tahoma';
Msg.Font.Size := 8;
Msg.Font.Color := clWindowText;
Msg.Color := clWindow;
Msg.TabOrder := 2;
Msg.TabStop := TRUE;
Msg.Align := alBottom;
Msg.WordWrap := TRUE;
Msg.Alignment := taLeftJustify;
Msg.WantTabs := FALSE;
Msg.WantReturns := TRUE;
Msg.HideSelection := TRUE;
Msg.MaxLength := 0;
Msg.OEMConvert := FALSE;
Msg.ReadOnly := FALSE;
Msg.ScrollBars := ssNone;

GB1 := TGroupBox.Create(Result);
GB1.Parent := result;
GB1.Align := alRight;
GB1.Left := 1;
GB1.Top := 2;
GB1.Width := 100;
GB1.Height := 95;
GB1.Visible := TRUE;
GB1.Tag := 0;
GB1.Enabled := TRUE;
GB1.Hint := '';
GB1.ShowHint := FALSE;
GB1.Caption := 'НЕПРИНИМАЕТ ПАТИ';
GB1.Align := alTOP;
GB1.Color := clBtnFace;
GB1.Font.Name := 'Tahoma';
GB1.Font.Size := 8;
GB1.Font.Color := clWindowText;
GB1.Font.CharSet := 1;
GB1.TabOrder := 3;
GB1.TabStop := FALSE;

listbox1 := Tlistbox.Create(Result);
listbox1.Parent := Result;
listbox1.Left := 0;
listbox1.Top := 100;
listbox1.Width := 180;
listbox1.Height := 200;
listbox1.Visible := TRUE;
listbox1.Tag := 0;
listbox1.Enabled := TRUE;
listbox1.Hint := '';
listbox1.ShowHint := FALSE;
listbox1.Font.Name := 'Tahoma';
listbox1.Font.Size := 8;
listbox1.Font.Color := clWindowText;
listbox1.Color := clWindow;
listbox1.TabOrder := 2;
listbox1.TabStop := TRUE;
listbox1.Align := alLeft;
listbox1.OnDblClick :=@button3click;

listbox2 := Tlistbox.Create(Result);
listbox2.Parent := Result;
listbox2.Left := 0;
listbox2.Top := 100;
listbox2.Width := 180;
listbox2.Height := 200;
listbox2.Visible := TRUE;
listbox2.Tag := 0;
listbox2.Enabled := TRUE;
listbox2.Hint := '';
listbox2.ShowHint := FALSE;
listbox2.Font.Name := 'Tahoma';
listbox2.Font.Size := 8;
listbox2.Font.Color := clWindowText;
listbox2.Color := clWindow;
listbox2.TabOrder := 2;
listbox2.TabStop := TRUE;
listbox2.Align := alRight;
listbox2.OnDblClick :=@button4click;

Button1 := TButton.Create(Result);
Button1.Parent := gb1;
Button1.Left := 10;
Button1.Top := 30;
Button1.Width := 75;
Button1.Height := 25;
Button1.Visible := TRUE;
Button1.Tag := 0;
Button1.Enabled := true;
Button1.Hint := '';
Button1.ShowHint := FALSE;
Button1.Caption := 'Вкл';
Button1.Font.Name := 'Tahoma';
Button1.Font.Size := 8;
Button1.Font.Color := clWindowText;
Button1.Font.CharSet := 1;
Button1.TabOrder := 1;
Button1.TabStop := TRUE;
Button1.Cancel := FALSE;
Button1.ModalResult := 0;
Button1.OnClick := @Button1click;

Button2 := TButton.Create(Result);
Button2.Parent := gb1;
Button2.Left := 100;
Button2.Top := 30;
Button2.Width := 75;
Button2.Height := 25;
Button2.Visible := TRUE;
Button2.Tag := 0;
Button2.Enabled := true;
Button2.Hint := '';
Button2.ShowHint := FALSE;
Button2.Caption := 'Выкл';
Button2.Font.Name := 'Tahoma';
Button2.Font.Size := 8;
Button2.Font.Color := clWindowText;
Button2.Font.CharSet := 1;
Button2.TabOrder := 1;
Button2.TabStop := TRUE;
Button2.Cancel := FALSE;
Button2.ModalResult := 0;
Button2.OnClick := @Button2click;

Button3 := TButton.Create(Result);
Button3.Parent := result;
Button3.Left := 200;
Button3.Top := 140;
Button3.Width := 40;
Button3.Height := 25;
Button3.Visible := TRUE;
Button3.Tag := 0;
Button3.Enabled := True;
Button3.Hint := '';
Button3.ShowHint := FALSE;
Button3.Caption := '>>>>';
Button3.Font.Name := 'Tahoma';
Button3.Font.Size := 8;
Button3.Font.Color := clWindowText;
Button3.Font.CharSet := 1;
Button3.TabOrder := 1;
Button3.TabStop := TRUE;
Button3.Cancel := FALSE;
Button3.ModalResult := 0;
Button3.OnClick := @button3click;

Button4 := TButton.Create(Result);
Button4.Parent := result;
Button4.Left := 200;
Button4.Top := 220;
Button4.Width := 40;
Button4.Height := 25;
Button4.Visible := TRUE;
Button4.Tag := 0;
Button4.Enabled := True;
Button4.Hint := '';
Button4.ShowHint := FALSE;
Button4.Caption := '<<<<';
Button4.Font.Name := 'Tahoma';
Button4.Font.Size := 8;
Button4.Font.Color := clWindowText;
Button4.Font.CharSet := 1;
Button4.TabOrder := 1;
Button4.TabStop := TRUE;
Button4.Cancel := FALSE;
Button4.ModalResult := 0;
Button4.OnClick := @button4click;

Lb1:= Tlabel.Create(result);
Lb1.Parent := GB1;
Lb1.Left := 140;
Lb1.Top := 30+200;
Lb1.Align := alLeft;
Lb1.Layout := tlBottom;
Lb1.Visible := TRUE;
Lb1.Tag := 0;
Lb1.Enabled := TRUE;
Lb1.Hint := '';
Lb1.ShowHint := FALSE;
Lb1.Caption := 'Все Скилы';
Lb1.Font.Name := 'Tahoma';
Lb1.Font.Size := 10;
Lb1.Font.Color := clWindowText;
Lb1.Font.CharSet := 1;

Lb2:= Tlabel.Create(result);
Lb2.Parent := GB1;
Lb2.Left := 140;
Lb2.Top := 30+200;
Lb2.Align := alRight;
Lb2.Layout := tlBottom;
Lb2.Visible := TRUE;
Lb2.Tag := 0;
Lb2.Enabled := TRUE;
Lb2.Hint := '';
Lb2.ShowHint := FALSE;
Lb2.Caption := 'Те которые использовать';
Lb2.Font.Name := 'Tahoma';
Lb2.Font.Size := 10;
Lb2.Font.Color := clWindowText;
Lb2.Font.CharSet := 1;

cb3:= TCheckbox.Create(result);
cb3.Parent := GB1;
cb3.Left := 220;
cb3.Top := 60;
cb3.Width := 220;
cb3.Checked := TRUE;
cb3.Visible := TRUE;
cb3.Tag := 0;
cb3.Enabled := TRUE;
cb3.Hint := '';
cb3.ShowHint := FALSE;
cb3.Caption := 'Следовать послы выхода из пати';
cb3.Font.Name := 'Tahoma';
cb3.Font.Size := 10;
cb3.Font.Color := clWindowText;
cb3.Font.CharSet := 1;

Yes := TRUE;

Result.Show;
msg.Lines.Add(timetostr(now)+': '+'Autodance, by Ad');
msg.Lines.Add(timetostr(now)+': '+'Работаем с чаром: '+Name);

end;

procedure button1click(Sender: TButton);
begin
iswork:=true;
GB1.Caption := 'ПРИНИМАЕТ ПАТИ';
end;

procedure button2click(Sender: TButton);
begin
iswork:=false;
GB1.Caption := 'НЕПРИНИМАЕТ ПАТИ';
end;

procedure perreshet;
var i:integer;
str:string;
begin
str:='';
for i:=1 to ListBox2.items.Count do
begin
str:=str+Copy(ListBox2.Items.Strings[i-1],1+pos(':',ListBox2.Items.Strings[i-1]),pos(' ',ListBox2.Items.Strings[i-1])-4)+':';
end;
skills:=str;
end;

procedure button3click(Sender: TButton);
var m:integer;
begin

if ListBox1.Items.Count>0 then
begin
m:=ListBox1.ItemIndex;
if (ListBox1.Items.Count=1) then m:=0
else
if m=ListBox1.Items.Count-1 then dec(m);

ListBox2.Items.Add(ListBox1.Items.Strings[ListBox1.ItemIndex]);
ListBox1.Items.Delete(ListBox1.ItemIndex);
ListBox1.ItemIndex:=m;
perreshet;
end;

end;

procedure Button4Click(Sender: TObject);
var m:integer;
begin

if ListBox2.Items.Count>0 then
begin
m:=ListBox2.ItemIndex;
if (ListBox2.Items.Count=1) then m:=0
else
if m=ListBox2.Items.Count-1 then dec(m);

ListBox1.Items.Add(ListBox2.Items.Strings[ListBox2.ItemIndex]);
ListBox2.Items.Delete(ListBox2.ItemIndex);
ListBox2.ItemIndex:=m;
perreshet;
end;

end;

procedure FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caNone;
end;

procedure Free_FormMain;
begin
TRY
if FormMain<>NIL then begin
FormMain.Free;
FormMain:=NIL;
end;
FINALLY
END;
end;

procedure SendMesg(msg:string); //отправка сообщений клиенту
begin
buf:=SAY2_ID;
WriteD(0);
WriteD(2);
WriteS('->БОГ');
WriteS(msg);
SendToClientEx(Name);
end;

procedure Init; //Вызывается при включении скрипта
begin

skillsName:=TStringList.Create;
try
skillsName.LoadFromFile('.\settings\SkillsID.ini') ;
except
msg.Lines.Add('itemsid.ini не найден!');
exit;
end;

skillid:=0;
iswork:=false;
useskill:=TTimer.Create(nil);
useskill.OnTimer:=@timerskill;
useskill.interval:=200; //время задержки
useskill.enabled:=true;
skillhave:=false;
party_have:=false;
FormMain:=Create_FormMain;
buf:=REQUESTSSKILLLIST_ID;
SendToServerEx(name);

buf:=REQUESTITEMLIST_ID;
SendToServerEx(name);

end;

procedure timerskill;
begin
if skillid<>0 then
begin
msg.lines.add('Юзаю скилл');
MagicSkillUse(skillid);
skillidold:=skillID;
skillID:=0;
end;

end;

procedure Free; //Вызывается при выключении скрипта
begin
useskill.free;
Free_FormMain;
end;

procedure UserInfo; //обновление данных о себе
var
i:word;
begin
MyOID:=ReadD(18);
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
end;

procedure MagicSkillUse(MagicID:integer);
begin
buf:=REQUESTMAGICSKILLUSE_ID;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;

procedure createskillbase;
var
i, j,n: integer;
begin
for i:=1 to 200 do begin
skillbase[i,1]:=0;
skillbase[i,2]:=0;
end;
n:=0;
J:=10;
listbox1.items.Clear;
for I:=1 to 200 do begin
skillbase[i,1]:=ReadD(j);
skillbase[i,2]:=ReadD(j);
if skillbase[i,2]=0 then break;
j:=j+5;
inc(n);
listbox1.items.Add('ID:'+inttostr(skillbase[i,2])+' '+SkillsName.Values[IntToStr(skillbase[i,2])]+' LVL:'+inttostr(skillbase[i,1]));
end;
if N>0 then skillhave:=true;
end;

procedure Target(Attacker: Integer);
begin
buf:=ACTION_ID;
WriteD(Attacker);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(00);
SendToServerEx(Name);
end;

procedure TargetAttacker(Attacker: Integer);
begin
if Attacker<>0 then begin
msg.Lines.Add('Attacker='+IntToStr(Attacker)+' Player='+IntToStr(MyOID));
Target(Attacker);
delay(800);
Target(Attacker);
delay(800);
end;
end;

procedure buffok;
begin
if ReadD(6)=skillIDold then begin
msg.lines.add('Прописываем следующий скилл');
if Length(skills)>0 then begin
skillID:=strtoint(Copy(Skills,1,pos(':',Skills)-1));
delete(Skills,1,pos(':',Skills));
end else
if party_have=true then begin
msg.lines.add('Cледуем за '+name2);
if cb3.Checked=true then
TargetAttacker(targetOID);
msg.lines.add('Разрываем пати');
delay(200);
buf:=REQUESTWITHDRAWALPARTY_ID;
SendToServerEx(name);
party_have:=false;
end;
end;
end;

var
temp : String;

begin
if pck='' then exit;
if (ConnectName=Name) and FromClient then
case pck[1] of
REQUESTSOCIALACTION_ID:
case ReadD(2) of
//социальное действие Yes для старта
6: begin
iswork:=true;
GB1.Caption:= 'ПРИНИМАЕТ ПАТИ';
end;
//социальное действие No для остановки
5: begin
iswork:=false;
GB1.Caption:= 'НЕПРИНИМАЕТ ПАТИ';
end;
end;
end;

if (ConnectName=Name) and FromServer then
begin
case pck[1] of
ASKJOINPARTY_ID: if iswork then
begin
temp:=ReadS(2);
if temp=name2 then
begin
perreshet;
Delay(100);
buf:=REQUESTANSWERJOINPARTY_ID+#$01#$00#$00#$00;
SendToServerEx(name);
msg.Lines.Add('Принимаю пати');
party_have:=true;
Delay(200);
if Length(skills)>0 then
begin
msg.Lines.Add('Прописываю скилл');
skillID:=strtoint(Copy(Skills,1,pos(':',Skills)-1));
delete(Skills,1,pos(':',Skills));
end;
pck:='';
end else msg.Lines.Add('Проигнорирован запрос пати от: '+temp);
end;

MAGICSKILLLAUNCHED_ID: begin
if (MyOID=ReadD(2)) then buffok;
end;
USERINFO_ID: begin //пакет с инфой о моём чаре
UserInfo;
end;
SAY2_ID: begin //пакет с инфой о моём чаре
if ReadS(10)=name2 then
begin
TargetOID:=ReadD(2);
msg.lines.add('Нашли цель следовния: '+inttostr(TARGETOID));
end;
end;
SKILLLIST_ID: begin
if skillhave=false then createskillbase;
end;
end;
end;

end.

lamer
15.04.2009, 20:23
Вот немного подредактировал скрипт (да простит меня автор)
Логику не менял, только переписал для более удобного портирования на различные хроники.
вот только не понял что это дало..)

alexteam
15.04.2009, 21:23
айди пакетов вынесены в секцию const дабы не рыться в их поисках по всему скрипту.

lamer
15.04.2009, 22:18
Всё, сёдня башка уже взорвёться нах, отложу до завтра..
Вот только поправте меня если я не прав, мне счас нужно поменять ИД покетов на ХБшные и должно заработать?

alexteam
15.04.2009, 22:23
По идее да.

NLObP
15.04.2009, 22:23
Вот только поправте меня если я не прав, мне счас нужно поменять ИД покетов на ХБшные и должно заработать?

Да. Внимательно перечти топик ещё раз. =)

lamer
16.04.2009, 08:10
Это жесть!!! но это мой первый труд в реальном редактировании скрипта. Душа поёт (можно ник менять на lamer+)...
Подитожим.
Вероятнее всего нужно добавить есчё чтото чтоб бд за вами бежал, так как он только берёт в таргет. а не бежит за вами, ну или чтото с форматом пакета, но это я точно сам не додумаю.
И второе если запускать скрипт с \settings

skillsName.LoadFromFile('.\settings\SkillsID.ini'

то ПНХ выдаёт ошибку. Поэтому редактируем на оригинал и убераем.

Ну и вот исправленные пакеты, вроде всё работает (кроме следования).
//ID пакетов
//От клиента
ACTION_ID = #$1F;
REQUESTITEMLIST_ID = #$14;
REQUESTANSWERJOINPARTY_ID = #$43;
REQUESTWITHDRAWALPARTY_ID = #$44;
REQUESTMAGICSKILLUSE_ID = #$39;
REQUESTSOCIALACTION_ID = #$34;
REQUESTSSKILLLIST_ID = #$50;
//от сервера
USERINFO_ID = #$32;
ASKJOINPARTY_ID = #$39;
SAY2_ID = #$4A;
SKILLLIST_ID = #$5F;
MAGICSKILLLAUNCHED_ID = #$54;

Чуть незабыл, почемуто в таблице со скилами вылезают вещи чара. Но мне это особо не мешает, хотя я так понимаю это не правильно..)

Это оказываеться не шмот игрока, а пасивные скилы показывает(7 раз отмерь - один раз отреж), поспешил , не внимательность.. сори..

Scaem
16.04.2009, 10:01
выложите плс полный готовы йскрипт на ХБ ))

alexteam
16.04.2009, 12:47
.\settings\SkillsID.ini
Для ПХ с версией выше 3.5.1.100
.\SkillsID.ini
для версий ниже.

lamer
16.04.2009, 12:56
я так и думал..

NLObP
16.04.2009, 13:03
Подитожим.
Вероятнее всего нужно добавить есчё чтото чтоб бд за вами бежал, так как он только берёт в таргет. а не бежит за вами

В клиенте надо два раза кликнуть на чара, чтобы бежать за ним. В скрипте также надо послать два раза таргет от чара, на того, за которым надо бежать.

PS: Практически все действия аналогичны клиентским с переводом их на пакетный уровень.

PanAm
16.04.2009, 15:10
в принципе, можно в процедуре createskillbase отсеить пассивы.
Примерно так
нет возможности проверить работоспособность процедуры, может что намудрил со смещениями
procedure createskillbase;
var
i, j,SkillCount: integer;
begin
for i:=1 to 200 do begin
skillbase[i,1]:=0;
skillbase[i,2]:=0;
end;
J:=2;
listbox1.items.Clear;
SkillCount := ReadD(J);
for i:=1 to SkillCount do
if ReadD(j)=0 then begin
skillbase[i,1]:=ReadD(j);
skillbase[i,2]:=ReadD(j);
inc(j);
listbox1.items.Add('ID:'+inttostr(skillbase[i,2])+' '+SkillsName.Values[IntToStr(skillbase[i,2])]+' LVL:'+inttostr(skillbase[i,1]));
end else
J := J+9;
if SkillCount>0 then skillhave:=true;
end;

lamer
16.04.2009, 19:18
В клиенте надо два раза кликнуть на чара, чтобы бежать за ним. В скрипте также надо послать два раза таргет от чара, на того, за которым надо бежать.
Угу, ток я не програмайзер и переделывал пакеты в игре, заходил чаром и юзал чтоб ИД узнать, терь надо перепроверить. Кстати спс за разьяснение с Т0 и Т1. Правда там пару пакетов не нашёл перехода, но эт не в этой теме.
Перепроверю отредактированные пакеты и выложу скрипт целиком, как обещал..)

Добавлено через 1 час 29 минут
{
AutoBD_SVS by Ad
Принимает пати танцует или поет, и следует по необходимости!
Для того чтобы нормально следовал за целью, нужно основным чаром что нибудь в чат написать, чтобы запомнился айди.

name- ник БД или СВСа
name2- ник того перса который будет кидать пати и за кем будет следовать БД или СВС.

Запускать скрипт ТОЛЬКО ПОСЛЕ того как БД или СВС уже вошел в игру.
}

Const
name2='---';
name='---';

//ID пакетов
//От клиента
ACTION_ID = #$1F;
REQUESTITEMLIST_ID = #$14;
REQUESTANSWERJOINPARTY_ID = #$43;
REQUESTWITHDRAWALPARTY_ID = #$44;
REQUESTMAGICSKILLUSE_ID = #$39;
REQUESTSOCIALACTION_ID = #$34;
REQUESTSSKILLLIST_ID = #$50;
//от сервера
USERINFO_ID = #$32;
ASKJOINPARTY_ID = #$39;
SAY2_ID = #$4A;
SKILLLIST_ID = #$5F;
MAGICSKILLLAUNCHED_ID = #$54;


Var
Msg : TMemo;
FormMain : TForm; //Создаваемая форма
useskill: TTimer;
skills:string;
skillid,skillidold:integer;
party_have,iswork,skillhave:boolean;
skillbase: array[1..200,1..2] of integer;
SkillsName : TStringList;
listbox1,listbox2: TListBox;
GB1: TGroupBox;
Button1,Button2,Button3,Button4: TButton;
Lb1,Lb2: Tlabel;
cb3:tcheckbox;
myOID,myX,myY,myZ: integer;
targetOID:integer;

function Create_FormMain : TForm;
Var
Yes : boolean;
begin
Yes := FALSE;
Result := TForm.Create(nil);

Result.Caption := 'AutoBD v.0.0.1';
Result.Left := 397;
Result.Top := 233;
Result.Width := 450;
Result.Height := 650;
Result.FormStyle := fsNormal;
Result.Position := poDesigned;
Result.BorderStyle := bsSizeable;
Result.BorderWidth := 0;
Result.WindowState := wsNormal;
Result.Color := clBtnFace;
Result.Font.Name := 'Tahoma';
Result.Font.Size := 8;
Result.Font.Color := clWindowText;
Result.Font.CharSet:= 1;
Result.OnClose := @FormClose;

Msg := TMemo.Create(Result);
Msg.Parent := Result;
Msg.Left := 0;
Msg.Top := 400;
Msg.Width := 200;
Msg.Height := 200;
Msg.Visible := TRUE;
Msg.Tag := 0;
Msg.Enabled := TRUE;
Msg.Hint := '';
Msg.ShowHint := FALSE;
Msg.Font.Name := 'Tahoma';
Msg.Font.Size := 8;
Msg.Font.Color := clWindowText;
Msg.Color := clWindow;
Msg.TabOrder := 2;
Msg.TabStop := TRUE;
Msg.Align := alBottom;
Msg.WordWrap := TRUE;
Msg.Alignment := taLeftJustify;
Msg.WantTabs := FALSE;
Msg.WantReturns := TRUE;
Msg.HideSelection := TRUE;
Msg.MaxLength := 0;
Msg.OEMConvert := FALSE;
Msg.ReadOnly := FALSE;
Msg.ScrollBars := ssNone;

GB1 := TGroupBox.Create(Result);
GB1.Parent := result;
GB1.Align := alRight;
GB1.Left := 1;
GB1.Top := 2;
GB1.Width := 100;
GB1.Height := 95;
GB1.Visible := TRUE;
GB1.Tag := 0;
GB1.Enabled := TRUE;
GB1.Hint := '';
GB1.ShowHint := FALSE;
GB1.Caption := 'НЕПРИНИМАЕТ ПАТИ';
GB1.Align := alTOP;
GB1.Color := clBtnFace;
GB1.Font.Name := 'Tahoma';
GB1.Font.Size := 8;
GB1.Font.Color := clWindowText;
GB1.Font.CharSet := 1;
GB1.TabOrder := 3;
GB1.TabStop := FALSE;

listbox1 := Tlistbox.Create(Result);
listbox1.Parent := Result;
listbox1.Left := 0;
listbox1.Top := 100;
listbox1.Width := 180;
listbox1.Height := 200;
listbox1.Visible := TRUE;
listbox1.Tag := 0;
listbox1.Enabled := TRUE;
listbox1.Hint := '';
listbox1.ShowHint := FALSE;
listbox1.Font.Name := 'Tahoma';
listbox1.Font.Size := 8;
listbox1.Font.Color := clWindowText;
listbox1.Color := clWindow;
listbox1.TabOrder := 2;
listbox1.TabStop := TRUE;
listbox1.Align := alLeft;
listbox1.OnDblClick :=@button3click;

listbox2 := Tlistbox.Create(Result);
listbox2.Parent := Result;
listbox2.Left := 0;
listbox2.Top := 100;
listbox2.Width := 180;
listbox2.Height := 200;
listbox2.Visible := TRUE;
listbox2.Tag := 0;
listbox2.Enabled := TRUE;
listbox2.Hint := '';
listbox2.ShowHint := FALSE;
listbox2.Font.Name := 'Tahoma';
listbox2.Font.Size := 8;
listbox2.Font.Color := clWindowText;
listbox2.Color := clWindow;
listbox2.TabOrder := 2;
listbox2.TabStop := TRUE;
listbox2.Align := alRight;
listbox2.OnDblClick :=@button4click;

Button1 := TButton.Create(Result);
Button1.Parent := gb1;
Button1.Left := 10;
Button1.Top := 30;
Button1.Width := 75;
Button1.Height := 25;
Button1.Visible := TRUE;
Button1.Tag := 0;
Button1.Enabled := true;
Button1.Hint := '';
Button1.ShowHint := FALSE;
Button1.Caption := 'Вкл';
Button1.Font.Name := 'Tahoma';
Button1.Font.Size := 8;
Button1.Font.Color := clWindowText;
Button1.Font.CharSet := 1;
Button1.TabOrder := 1;
Button1.TabStop := TRUE;
Button1.Cancel := FALSE;
Button1.ModalResult := 0;
Button1.OnClick := @Button1click;

Button2 := TButton.Create(Result);
Button2.Parent := gb1;
Button2.Left := 100;
Button2.Top := 30;
Button2.Width := 75;
Button2.Height := 25;
Button2.Visible := TRUE;
Button2.Tag := 0;
Button2.Enabled := true;
Button2.Hint := '';
Button2.ShowHint := FALSE;
Button2.Caption := 'Выкл';
Button2.Font.Name := 'Tahoma';
Button2.Font.Size := 8;
Button2.Font.Color := clWindowText;
Button2.Font.CharSet := 1;
Button2.TabOrder := 1;
Button2.TabStop := TRUE;
Button2.Cancel := FALSE;
Button2.ModalResult := 0;
Button2.OnClick := @Button2click;

Button3 := TButton.Create(Result);
Button3.Parent := result;
Button3.Left := 200;
Button3.Top := 140;
Button3.Width := 40;
Button3.Height := 25;
Button3.Visible := TRUE;
Button3.Tag := 0;
Button3.Enabled := True;
Button3.Hint := '';
Button3.ShowHint := FALSE;
Button3.Caption := '>>>>';
Button3.Font.Name := 'Tahoma';
Button3.Font.Size := 8;
Button3.Font.Color := clWindowText;
Button3.Font.CharSet := 1;
Button3.TabOrder := 1;
Button3.TabStop := TRUE;
Button3.Cancel := FALSE;
Button3.ModalResult := 0;
Button3.OnClick := @button3click;

Button4 := TButton.Create(Result);
Button4.Parent := result;
Button4.Left := 200;
Button4.Top := 220;
Button4.Width := 40;
Button4.Height := 25;
Button4.Visible := TRUE;
Button4.Tag := 0;
Button4.Enabled := True;
Button4.Hint := '';
Button4.ShowHint := FALSE;
Button4.Caption := '<<<<';
Button4.Font.Name := 'Tahoma';
Button4.Font.Size := 8;
Button4.Font.Color := clWindowText;
Button4.Font.CharSet := 1;
Button4.TabOrder := 1;
Button4.TabStop := TRUE;
Button4.Cancel := FALSE;
Button4.ModalResult := 0;
Button4.OnClick := @button4click;

Lb1:= Tlabel.Create(result);
Lb1.Parent := GB1;
Lb1.Left := 140;
Lb1.Top := 30+200;
Lb1.Align := alLeft;
Lb1.Layout := tlBottom;
Lb1.Visible := TRUE;
Lb1.Tag := 0;
Lb1.Enabled := TRUE;
Lb1.Hint := '';
Lb1.ShowHint := FALSE;
Lb1.Caption := 'Все Скилы';
Lb1.Font.Name := 'Tahoma';
Lb1.Font.Size := 10;
Lb1.Font.Color := clWindowText;
Lb1.Font.CharSet := 1;

Lb2:= Tlabel.Create(result);
Lb2.Parent := GB1;
Lb2.Left := 140;
Lb2.Top := 30+200;
Lb2.Align := alRight;
Lb2.Layout := tlBottom;
Lb2.Visible := TRUE;
Lb2.Tag := 0;
Lb2.Enabled := TRUE;
Lb2.Hint := '';
Lb2.ShowHint := FALSE;
Lb2.Caption := 'Те которые использовать';
Lb2.Font.Name := 'Tahoma';
Lb2.Font.Size := 10;
Lb2.Font.Color := clWindowText;
Lb2.Font.CharSet := 1;

cb3:= TCheckbox.Create(result);
cb3.Parent := GB1;
cb3.Left := 220;
cb3.Top := 60;
cb3.Width := 220;
cb3.Checked := TRUE;
cb3.Visible := TRUE;
cb3.Tag := 0;
cb3.Enabled := TRUE;
cb3.Hint := '';
cb3.ShowHint := FALSE;
cb3.Caption := 'Следовать послы выхода из пати';
cb3.Font.Name := 'Tahoma';
cb3.Font.Size := 10;
cb3.Font.Color := clWindowText;
cb3.Font.CharSet := 1;

Yes := TRUE;

Result.Show;
msg.Lines.Add(timetostr(now)+': '+'Autodance, by Ad');
msg.Lines.Add(timetostr(now)+': '+'Работаем с чаром: '+Name);

end;

procedure button1click(Sender: TButton);
begin
iswork:=true;
GB1.Caption := 'ПРИНИМАЕТ ПАТИ';
end;

procedure button2click(Sender: TButton);
begin
iswork:=false;
GB1.Caption := 'НЕПРИНИМАЕТ ПАТИ';
end;

procedure perreshet;
var i:integer;
str:string;
begin
str:='';
for i:=1 to ListBox2.items.Count do
begin
str:=str+Copy(ListBox2.Items.Strings[i-1],1+pos(':',ListBox2.Items.Strings[i-1]),pos(' ',ListBox2.Items.Strings[i-1])-4)+':';
end;
skills:=str;
end;

procedure button3click(Sender: TButton);
var m:integer;
begin

if ListBox1.Items.Count>0 then
begin
m:=ListBox1.ItemIndex;
if (ListBox1.Items.Count=1) then m:=0
else
if m=ListBox1.Items.Count-1 then dec(m);

ListBox2.Items.Add(ListBox1.Items.Strings[ListBox1.ItemIndex]);
ListBox1.Items.Delete(ListBox1.ItemIndex);
ListBox1.ItemIndex:=m;
perreshet;
end;

end;

procedure Button4Click(Sender: TObject);
var m:integer;
begin

if ListBox2.Items.Count>0 then
begin
m:=ListBox2.ItemIndex;
if (ListBox2.Items.Count=1) then m:=0
else
if m=ListBox2.Items.Count-1 then dec(m);

ListBox1.Items.Add(ListBox2.Items.Strings[ListBox2.ItemIndex]);
ListBox2.Items.Delete(ListBox2.ItemIndex);
ListBox2.ItemIndex:=m;
perreshet;
end;

end;

procedure FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caNone;
end;

procedure Free_FormMain;
begin
TRY
if FormMain<>NIL then begin
FormMain.Free;
FormMain:=NIL;
end;
FINALLY
END;
end;

procedure SendMesg(msg:string); //отправка сообщений клиенту
begin
buf:=SAY2_ID;
WriteD(0);
WriteD(2);
WriteS('->БОГ');
WriteS(msg);
SendToClientEx(Name);
end;

procedure Init; //Вызывается при включении скрипта
begin

skillsName:=TStringList.Create;
try
skillsName.LoadFromFile('.\SkillsID.ini');
except
msg.Lines.Add('itemsid.ini не найден!');
exit;
end;

skillid:=0;
iswork:=false;
useskill:=TTimer.Create(nil);
useskill.OnTimer:=@timerskill;
useskill.interval:=200; //время задержки
useskill.enabled:=true;
skillhave:=false;
party_have:=false;
FormMain:=Create_FormMain;
buf:=REQUESTSSKILLLIST_ID;
SendToServerEx(name);

buf:=REQUESTITEMLIST_ID;
SendToServerEx(name);

end;

procedure timerskill;
begin
if skillid<>0 then
begin
msg.lines.add('Юзаю скилл');
MagicSkillUse(skillid);
skillidold:=skillID;
skillID:=0;
end;

end;

procedure Free; //Вызывается при выключении скрипта
begin
useskill.free;
Free_FormMain;
end;

procedure UserInfo; //обновление данных о себе
var
i:word;
begin
MyOID:=ReadD(18);
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
end;

procedure MagicSkillUse(MagicID:integer);
begin
buf:=REQUESTMAGICSKILLUSE_ID;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;

procedure createskillbase;
var
i, j,n: integer;
begin
for i:=1 to 200 do begin
skillbase[i,1]:=0;
skillbase[i,2]:=0;
end;
n:=0;
J:=10;
listbox1.items.Clear;
for I:=1 to 200 do begin
skillbase[i,1]:=ReadD(j);
skillbase[i,2]:=ReadD(j);
if skillbase[i,2]=0 then break;
j:=j+5;
inc(n);
listbox1.items.Add('ID:'+inttostr(skillbase[i,2])+' '+SkillsName.Values[IntToStr(skillbase[i,2])]+' LVL:'+inttostr(skillbase[i,1]));
end;
if N>0 then skillhave:=true;
end;

procedure Target(Attacker: Integer);
begin
buf:=ACTION_ID;
WriteD(Attacker);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(00);
SendToServerEx(Name);
end;

procedure TargetAttacker(Attacker: Integer);
begin
if Attacker<>0 then begin
msg.Lines.Add('Attacker='+IntToStr(Attacker)+' Player='+IntToStr(MyOID));
Target(Attacker);
delay(800);
Target(Attacker);
delay(800);
end;
end;

procedure buffok;
begin
if ReadD(6)=skillIDold then begin
msg.lines.add('Прописываем следующий скилл');
if Length(skills)>0 then begin
skillID:=strtoint(Copy(Skills,1,pos(':',Skills)-1));
delete(Skills,1,pos(':',Skills));
end else
if party_have=true then begin
msg.lines.add('Cледуем за '+name2);
if cb3.Checked=true then
TargetAttacker(targetOID);
msg.lines.add('Разрываем пати');
delay(200);
buf:=REQUESTWITHDRAWALPARTY_ID;
SendToServerEx(name);
party_have:=false;
end;
end;
end;

var
temp : String;

begin
if pck='' then exit;
if (ConnectName=Name) and FromClient then
case pck[1] of
REQUESTSOCIALACTION_ID:
case ReadD(2) of
//социальное действие Yes для старта
6: begin
iswork:=true;
GB1.Caption:= 'ПРИНИМАЕТ ПАТИ';
end;
//социальное действие No для остановки
5: begin
iswork:=false;
GB1.Caption:= 'НЕПРИНИМАЕТ ПАТИ';
end;
end;
end;

if (ConnectName=Name) and FromServer then
begin
case pck[1] of
ASKJOINPARTY_ID: if iswork then
begin
temp:=ReadS(2);
if temp=name2 then
begin
perreshet;
Delay(100);
buf:=REQUESTANSWERJOINPARTY_ID+#$01#$00#$00#$00;
SendToServerEx(name);
msg.Lines.Add('Принимаю пати');
party_have:=true;
Delay(200);
if Length(skills)>0 then
begin
msg.Lines.Add('Прописываю скилл');
skillID:=strtoint(Copy(Skills,1,pos(':',Skills)-1));
delete(Skills,1,pos(':',Skills));
end;
pck:='';
end else msg.Lines.Add('Проигнорирован запрос пати от: '+temp);
end;

MAGICSKILLLAUNCHED_ID: begin
if (MyOID=ReadD(2)) then buffok;
end;
USERINFO_ID: begin //пакет с инфой о моём чаре
UserInfo;
end;
SAY2_ID: begin //пакет с инфой о моём чаре
if ReadS(10)=name2 then
begin
TargetOID:=ReadD(2);
msg.lines.add('Нашли цель следовния: '+inttostr(TARGETOID));
end;
end;
SKILLLIST_ID: begin
if skillhave=false then createskillbase;
end;
end;
end;

end.

Проверил, всё верно переделал, такчто как обещал вылаживаю под ХБ. Спасибо автору за данный скрипт.
Вот если кто доделает следование за командиром, буду благодарен.

AD!
16.04.2009, 20:00
Скрипт доделан и обновлен в 1м посте, по идее должен следовать))

Pat
11.05.2009, 05:00
Уже неделю бьюсь с настройкой скрипта на варлока. Суть понимаю, скилы не чара а сумона и соответственно надо знать информацию PetInfo и еще наверно что то. Подскажите хотя бы намеками в каком направлении надо решать проблему. И еще не могу разобраться с переменными i, n и J , с теми что стоят в скрипте для СвС и БД скилы из \SkillsID.ini какие то левые выбираются, приходится в строке listbox1.items.Add('ID:'+inttostr(skillbase[i,2])+' '+SkillsName.Values[IntToStr(skillbase[i,2])]+' LVL:'+inttostr(skillbase[i,1])); прописывать вручную нужные ID

AD!
11.05.2009, 17:40
Айди этих скилов в пакетах не идут, их клиент знает, поэтому становится непонятно от чего отталкиваться, ведь вручную сопоставлять какой скилл какому пету принадлежит не очень охота.

п.с. может я плохо искал )) может и идут

Pat
12.05.2009, 12:44
Id петов известны их пакетхак отлавливает, пробелемма в другом-кастует скилы сумон а не чар и в данном скрипте каст начинается с принятия пати чаром а сумон не знает об этом:confused:

Добавлено через 6 часов 14 минут
А может пойти другим путем? На панели,например, F12 поставить нужный скил и исправить кусок скрипта по типу
procedure MagicSkillUse(ActionID:integer);
begin
buf:=#$45;
WriteD(ActionID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
и в строке
listbox1.items.Add('ID:'+inttostr(skillbase[i,2])+' '+SkillsName.Values[IntToStr(skillbase[i,2])]+' LVL:'+inttostr(skillbase[i,1]));
поставить ID нажатия клавиши F12?
Если не правильно может поправят знающие

QaK
12.05.2009, 12:53
Pat, панелька - это GUI, пакетами ф11 не нажмешь.

Pat
12.05.2009, 20:35
Вобщем опробовал я дома замену 2F на 45 вместо скилов поставил действие
procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$45;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
procedure createskillbase;
var
i, j, n: integer;
begin
for i:=1 to 200 do
begin
skillbase[i,1]:=0;
skillbase[i,2]:=0;
end;

n:=0;
J:=10;
listbox1.items.Clear;
for I:=1 to 200 do
begin
skillbase[i,1]:=ReadD(j);
skillbase[i,2]:=ReadD(j);
if skillbase[i,2]=0 then break;
j:=j+5;
inc(n);


listbox1.items.Add('ID:'+inttostr(1007)+' '+SkillsName.Values[IntToStr(1007)]);

end;

if N>0 then skillhave:=true;
end;
пати принимает скил самона кидает, но из пати не выходит, правлю интуитивно скрипт, но чувствую с дельфи и паскалем начну знакомится:)

PIONER
18.11.2009, 05:39
как поставить задержку перед принятием пати? чтоб не моментально одобрялась.

DpblH
24.12.2009, 00:54
здавствуйти:) прошу про кота поподробнее еси у когото получилось

sinles
24.12.2009, 15:23
Сколько программистов столько программ :)
Вот мой вариант такого скрипта.

Принцип работы практически тот же, но скилы вы выбираете совсем по другому.
Настройка:
Обратите внимания на первые строки Скрипта и установите нужные вам параметры. (их действие описано).
Инициализация:
Вы должны после старта скрипта в игре нажать эмоцию "Yes" затем использовать все скилы которые персонаж должен повторять по команде (по очереди тыкаете на них на панельке) когда закончите выбирать скилы нажмите "No". (скилы можно использовать любые, но если использовать скилы воздействующие на цель, то всё получит пати лидер) Эти действия на сервер переданы не будут (вы не потратите ману или КД)
Как использовать:
Если вы указали быть ОфПати то для получения танца/песни/еще чего вы должны ему просто дать пати, в противном случае написать в пати чат дс или ds.

П.с. Т1

DpblH
27.12.2009, 16:26
это всё канешно замечательно. но как настроить баф кота?

TAMBIK
27.12.2009, 17:04
DpblH,
http://coderx.ru/showpost.php?p=11661&postcount=545

DpblH
27.12.2009, 20:57
пытаюсь разобраться что к чему

maa
25.05.2010, 05:50
а для эпилога оф пати бд и свс есть?

Xen
25.05.2010, 09:12
выше скрипты чем не нравятся?) да, возможно копаться в чужом коде сложнее чем писать свой, но всеже.

maa
29.05.2010, 05:27
выше изложеный у меня на грации эпилог не работает, подскажите что делать

J-Fobos
29.05.2010, 06:19
выше изложеный у меня на грации эпилог не работает, подскажите что делать
выше выложенный скрипт написан для грации финал, он и не обьязан работать на епилоге :)
напишите свой, для епилога

Xen
29.05.2010, 08:29
Скрипт достаточно немного переделать, изменив пакеты, отвечающие за отправку на сервер + идущих к клиенту от скрипта (если есть). в основном дело ограничивается лишь изменением ид ("названий") пакетов (если сервер шифрует трафик, то еще и писать алгоритм переводящий стандартный пакет в "приемлемый" вид для конкретного сервера)

maa
29.05.2010, 15:00
Xen, ты знаешь ты всё так гладко расказал, но к сожалению я не умею этого делать, у меня есть скрипт который работатал на ШОках ХБ, теперь он показывает не те дансы или просто их не видит, наверно я скорее машину разобрал бы, чем пойму что с этим скриптом делать.

Xen
29.05.2010, 18:17
ТОгда не стоит, т.к. будут
отправлятся некорректные пакеты -> будешь палится в логах -> шанс бана возрастает в геометрической прогрессии

maa
30.05.2010, 01:10
Спасибо за совет, буду ждать когда кто мож потрудится и сделает .