Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

Как объединить сценарии [How To] Merge scripts

Рег
11 Дек 2015
Сообщения
22
Реакции
0
[info]ru-icon.png Перевод на русский от rebelka: http://rawr.su/topic/2580-kak-obedinit-stcenarii-how-to-merge-scripts/?p=8303[/info]

1. Basics
  • Every script can have VAR block to declare variables and must have main body between BEGIN and END.
  • Notice, that main body got END. with dot at it end. And all other END; ends with semicolon.
  • No matter what - there must be always only ONE main body, even if you would merge 10 scripts.
So we got 2 test scripts:

Code:

var number1,number2: integer;
begin
print('Im script 1. lets print some numbers:');
print(number1);
print(number2);
end.


Code:

var
string1,string2: string;
begin
print('Im script 2. lets print some strings:');
print(string1);
print(string2);
end.

scripts are basic, so you shouldn't have problems with locating VAR block and main body xD

2. Changing script into procedure
  • We want our scripts to work together inside one file, that force us to make some changes inside them.
  • Each of the script which we want merged need to be first changed into procedure.
  • Sounds difficult? well its not :D
We need to put:

Code:

procedure Name;

before VAR word if present or BEGIN if not. You are free to give your procedures any name you want, but its good to use names which describe functionality of script/procedure (for better code readability).
Then we need to change END. of main script body to END;

Applying above instructions to our test scripts we will end up with:

Code:

Procedure TestScript1;
var number1,number2: integer;
begin
print('Im script 1. lets print some numbers:');
print(number1);
print(number2);
end;


Code:

Procedure TestScript2;
var
string1,string2: string;
begin
print('Im script 2. lets print some strings:');
print(string1);
print(string2);
end;

3. Time for magic!
  • Our merged script will contain all of the procedures we prepared in step 2. + its main body where we will call them.
  • Procedures are placed out of main body, separately.
  • "Magic" function to call them in separately threads is: Script.NewThread(@Name);
  • It takes procedure name as parameter and start it in thread immediately after execution.
  • Theoretically number of simultaneous threads is limited by memory/buffers but it will most prolly crash whole bot if you will run tons of it :D
  • Its good practice to put small delay (like 10-100) between starting of threads
  • For easy scripts its sometimes better to use this method instead of threads
  • Threads are running as long as called procedure is executing, however Stop button will kill all running threads.
  • If poorly written procedure will stop with error inside thread it will most often dont affect other running threads (excluding case where it cause whole bot to crash xD)
Merged script:


Code:

Procedure TestScript1;
var number1,number2: integer;
begin
print('Im script 1. lets print some numbers:');
print(number1);
print(number2);
end;

Procedure TestScript2;
var
string1,string2: string;
begin
print('Im script 2. lets print some strings:');
print(string1);
print(string2);
end;

begin //start of main body
Script.NewThread(@TestScript1); delay(50);
Script.NewThread(@TestScript2);
end. //end of main body



With that you can merge scrips.


Was take from internet.
 
Переведу для тех, кто не понимает :orly: . Заранее извиняюсь за неточности в переводе.

1. Основы
  • В каждом скрипте есть блок "VAR", который служит для объявления переменных, а также основное тело скрипта, написанное между BEGIN и END.
  • Заметьте, что основная часть на конце имеет END.(с точкой на конце).И все остальные END;( с точкой с запятой на конце).
  • В скрипте всегда должно быть только одно основное тело, даже если вы соединяете 10 скриптов.
Для примера возьмём два скрипта:


Код:

var number1,number2: integer;
begin
print('Я скрипт1. Давайте выведем несколько значений:');
print(number1);
print(number2);
end.
Код:



var
string1,string2: string;
begin
print('Я скрипт2. Давайте выведем несколько значений::');
print(string1);
print(string2);
end.
Скрипты очень простые, поэтому у Вас не должно возникнуть проблем с объявлением переменных и телом скрипта.


2. Трансформация скрипта в процедуру.
  • Мы хотим, чтобы несколько скриптов работали вместе и находились в одном файле. Давайте внесём в него изменения.
  • Скрипты, которые мы хотим совместить, сначала должны быть изменены в процедуру.
Мы должны сделать так:


Код:

procedure Name;

Вы можете выбирать любое имя процедуры, но лучше называть его в соответствии с выполняемой функцией.
Также вы должны изменить END.(в конце точка) на END;(в конце точка с запятой). Причина была описана выше.

После всех вышеперечисленных инструкций, протестируем новый скрипт:


Код:

Procedure TestScript1;
var number1,number2: integer;
begin
print(Я скрипт1. Давайте выведем несколько значений:');
print(number1);
print(number2);
end;
Code: Procedure TestScript2;
var
string1,string2: string;
begin
print('Я скрипт2. Давайте выведем несколько значений:');
print(string1);
print(string2);
end;

3. Время магии! :Kappa:
  • Наш совмещённый скрипт будет содержать все процедуры, которые мы приготовили во 2-м шаге + основное тело, в котором вы будете вызывать их.
  • Процедуры расположены вне основного тела скрипта.
  • "Магическая" функция, которая вызывает потоки: Script.NewThread(@Name);.
  • Имя процедуры берется как параметр и мгновенно включает включает поток.
  • Теоретически, количество потоков ограничено, но их лимит очень высок. Т.е. вы можете вызывать их практически бесконечно.
  • Хорошей практикой для Вас будет установка небольшой задержки (от 10 до 100мс) между стартом потоков.
  • Потоки включены, пока вызванная процедура исполняется. Кнопка "Stop" остановит все включённые потоки.
  • Неправильно написанная процедура вызовет ошибку, не повлияет на на остальные потоки.
Совмещённый скрипт:


Код:

Procedure TestScript1;
var number1,number2: integer;
begin
print('Im script 1. lets print some numbers:');
print(number1);
print(number2);
end;

Procedure TestScript2;
var
string1,string2: string;
begin
print('Im script 2. lets print some strings:');
print(string1);
print(string2);
end;

begin //start of main body
Script.NewThread(@TestScript1); delay(50);
Script.NewThread(@TestScript2);
end. //end of main body



С помощью этого вы можете соединять скрипты :dadada: :dadada: :dadada:
 
но ведь процедуры будут работать по очереди да?
кое что как потоки в C# нельзя организовать?
 
FAQ написал(а):
Script.NewThread(@TestScript1); delay(50); Script.NewThread(@TestScript2);
Script.NewThread(@TestScript1); delay(50);
Script.NewThread(@TestScript2);

создают новые потоки. Работать будут одновременно
 
Как прервать поток из основной программы?
 
никак, его нужно только завершать.
 
anks написал(а):
Script.NewThread(@TestScript1); delay(50); Script.NewThread(@TestScript2);
как поставить условие при выполнении 1го скрипта запуск 2го?
 
У меня на первую же строчку ругается
Procedure sweep;
var
int: integer;
mob: tl2npc;
sweep: tl2skill;

begin
while true do begin
for int:=0 to npclist.count-1 do begin
mob := npclist.items(int);
if mob.valid and mob.dead and mob.sweepable and (skilllist.byid(42,sweep) and (sweep.endtime = 0)) then
if (user.distto(mob) < 300) then //max range of sweeping
if engine.settarget(mob) then engine.useskill(sweep);
end;
delay(500);//0.5sec delay
end;
end;

Procedure capcha;
var Captcha:string;
begin
while (true) do
begin
Captcha := Engine.DlgText;
if (Pos('ОТКЛЮЧЕНЫ', Captcha) <> 0) then
PlaySound('Sounds/hp.wav',false);
Delay(1800);
end;
end;

begin //start of main body
Script.NewThread(@sweep); delay(50);
Script.NewThread(@capcha);
end. //end of main body

скрипт sweep(1): Syntax error
 
Dexik написал(а):
на первую же строчку ругается
Код:
Procedure sweep;
var
int: integer;
mob: tl2npc;
sweep: tl2skill;

begin
while true do begin
for int:=0 to npclist.count-1 do begin
mob := npclist.items(int);
if mob.valid and mob.dead and mob.sweepable and (skilllist.byid(42,sweep) and (sweep.endtime = 0)) then
if (user.distto(mob) < 300) then //max range of sweeping
if engine.settarget(mob) then engine.useskill(sweep);
end;
delay(500);//0.5sec delay
end;
end;

Procedure capcha;
var Captcha:string;
begin
while (true) do
begin
Captcha := Engine.DlgText;
if (Pos('ОТКЛЮЧЕНЫ', Captcha) <> 0) then
PlaySound('Sounds/hp.wav',false);
Delay(1800);
end;
end;

begin //start of main body
Script.NewThread(@sweep); delay(50);
Script.NewThread(@capcha);
end. //end of main body
 
[bw='#ff0000']Тест текста для BB-кода BADGE WHITE![/bw]​
[bd='#b2ff4d']Тест текста для BB-кода BADGE DARK![/bd]​
 
@BreadfanLock,

Не понимаю пока что ты изменил, но огромный тебе сэнкс и респект за это, заработало)
 
Доброго времени суток. Нашел два рабочих скрипта на ребаф и возврат на спот, объединил. Ну естественно только зацикленный возврат на спот повторяется. Подскажите плз как сделать что бы и ребаф повторялся :)
Код:
procedure baff;

// Buff
function Buff(value:string):boolean; 
var
  s:string;
  bypass:string;
  i:integer;
  b:boolean;
  mass:array [1..100] of string;
  Obj: TL2Buff;
begin
  Engine.Settarget('Buffer');
  Engine.DlgOpen();
  s:=Engine.DlgText;
  b:=true;
  i:=1;
  while b do
  begin
    Delete(s,1,Pos('<button',s)-1);
    mass[i]:=Copy(s,1,Pos('>',s));
    Delete(s,1,Length(mass[i]));
    inc(i);
    if Pos('<button',s) = 0 then
      b:=false;
  end;
  for i:=1 to 100 do
    if mass[i] <> '' then
        if Pos(value,mass[i]) <> 0 then
        begin
          bypass := mass[i];
          delete(bypass,1,pos('action="',bypass)+17);
          bypass:=Copy(bypass,1,pos('"',bypass)-1);
          break;
        end;
    Engine.ByPassToServer(bypass);
end;
begin
  
buff('Бафф'); //- Название нужной кнопки
end;


procedure tp;

var
obj: TL2NPC;
obj2: TL2Effect;

Enemy: TL2Live;
Begin
while 1<>2 do begin   // бесконечный цикл


// этот кусок не трогаем
      if User.Dead then    // умер- вырубаем интерфейс, возврат в город и пауза 15 секунд
       begin
       Engine.FaceControl(0,false);
Engine.gohome;
delay(5000);
end;
// этот кусок не трогаем



  //1 менять тут
// невъебический кусок - точеки респа решил не вставлять, что бы не мозолить глаза :)





  //2 менять тут


   
 // точка которая указаная в инренж этот точка в которую видут все точки респа,
 //ее просто можно скопировать  с конечной любой точки респа
       if User.inrange(147936, -55368, -2760, 250, 150) then begin    // бежим к ГК и тпишмся в руины
        delay(2550);
 
        // выделение нпц с ИД указанным в скобках,ид видны справа снизу в боте рядом с именем нпц 
            Engine.SetTarget (36494); //(31275);
          
          // открывем диалоговое окно и прожимаем строки ( у нас сначала 2 потом 15)
           delay(1550);
          Engine.DlgOpen();
          delay(1550);
          Engine.DlgSel(4);
        
   
   // эти точки ведут нас уже непосредственно на наш спот и по его достижению вкллючаем инфетфейс
    delay(1550);
 Engine.MoveTo(146098, -68795, -3728);
 Engine.MoveTo(144354, -69190, -3672);
 Engine.MoveTo(144050, -71350, -4110);
 
           Engine.FaceControl(0,true);
                   end;
       delay(550);
    end;     delay(550);
    end;

begin //start of main body
Script.NewThread(@baff); delay(15000);
Script.NewThread(@tp);
end. //end of main body
 
А подскажите команду на завершение потока. Есть ли такая вообще? Требуется прервать один из потоков по условию
 
Пытался объеденить 2 скрипта, жалуется на процедуру, помогите плиз!
procedure Striptiz(id_sh: Integer; odet : Boolean);
var find_item : TL2Item;
item_cnt, i : Integer;
begin
if(ItemList.ByID(id_sh, find_item)) then
if(find_item.Equipped xor odet) then // Проверяет: одета ли шмотка
Engine.UseItem(id_sh); // Снимаем или одеваем
end;

begin
while(true) do
begin
Striptiz(8822, true);
Delay(10000);
end;

procedure vozvrat;
var obj: TL2NPC;
obj2: TL2Effect;

Enemy: TL2Live;
Begin
while 1<>2 do begin // бесконечный цикл


// этот кусок не трогаем
if User.Dead then // умер- вырубаем интерфейс, возврат в город и пауза 15 секунд
begin
Engine.FaceControl(0,false);
Engine.gohome;
delay(15000);
end;
// этот кусок не трогаем





//1 менять тут
// этот кусок - точки респа выбранной деревни их просто заменить на нужную вам
if User.inrange(81376,148095,-3464, 250, 150) then begin
Engine.MoveTo(81376,148095,-3464);
Engine.MoveTo(81881,148025,-3467);
Engine.MoveTo(83027,148020,-3467);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(82292,149450,-3464, 250, 150) then begin
Engine.MoveTo(82292,149450,-3464);
Engine.MoveTo(82865,148876,-3467);
Engine.MoveTo(83054,148281,-3467);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(81562,147782,-3464, 250, 150) then begin
Engine.MoveTo(81562,147782,-3464);
Engine.MoveTo(82284,148077,-3467);
Engine.MoveTo(83077,148159,-3467);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(83409,148578,-3400, 250, 150) then begin
Engine.MoveTo(83409,148578,-3400);
Engine.MoveTo(83427,148206,-3403);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(81440,149119,-3464, 250, 150) then begin
Engine.MoveTo(81440,149119,-3464);
Engine.MoveTo(82200,149222,-3467);
Engine.MoveTo(82722,148485,-3467);
Engine.MoveTo(83087,148101,-3467);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(82496,148095,-3464, 250, 150) then begin
Engine.MoveTo(82496,148095,-3464);
Engine.MoveTo(83092,148094,-3467);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(83473,149223,-3400, 250, 150) then begin
Engine.MoveTo(83473,149223,-3400);
Engine.MoveTo(83355,148728,-3403);
Engine.MoveTo(83358,148292,-3403);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(82272,147801,-3464, 250, 150) then begin
Engine.MoveTo(82272,147801,-3464);
Engine.MoveTo(82565,148080,-3467);
Engine.MoveTo(83101,148099,-3467);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(82480,149087,-3464, 250, 150) then begin
Engine.MoveTo(82480,149087,-3464);
Engine.MoveTo(82623,148694,-3467);
Engine.MoveTo(83087,148157,-3467);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(81637,149427,-3464, 250, 150) then begin
Engine.MoveTo(81637,149427,-3464);
Engine.MoveTo(82229,149197,-3467);
Engine.MoveTo(82610,148669,-3467);
Engine.MoveTo(83088,148170,-3467);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(81062,148144,-3464, 250, 150) then begin
Engine.MoveTo(81062,148144,-3464);
Engine.MoveTo(81574,147997,-3467);
Engine.MoveTo(82302,147975,-3467);
Engine.MoveTo(83070,148109,-3467);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(83426,148835,-3400, 250, 150) then begin
Engine.MoveTo(83426,148835,-3400);
Engine.MoveTo(83422,148276,-3403);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(81033,148883,-3464, 250, 150) then begin
Engine.MoveTo(81033,148883,-3464);
Engine.MoveTo(81769,149191,-3467);
Engine.MoveTo(82322,149192,-3467);
Engine.MoveTo(82622,148656,-3467);
Engine.MoveTo(83079,148163,-3467);
Engine.MoveTo(83402,147946,-3403);
end;
if User.inrange(83415,148235,-3400, 250, 150) then begin
Engine.MoveTo(83415,148235,-3400);
Engine.MoveTo(83402,147946,-3403);
end;
// этот кусок - точки респа выбранной деревни







//2 менять тут



// точка которая указаная в инренж этот точка в которую видут все точки респа,
//ее просто можно скопировать с конечной любой точки респа
if User.inrange(83402,147946,-3403, 250, 150) then begin // бежим к ГК и тпишмся в руины
delay(2550);
// тут указываем путь к нубскому баферу либо сразу к гк если мы не бафаемся
Engine.MoveTo(-14136, 123752, -3104);
Engine.MoveTo(-12744, 123544, -3104);
Engine.MoveTo(-12280, 123432, -3088);
Engine.MoveTo(-12392, 122920, -3088);
// выделение нпц с ИД указанным в скобках,ид видны справа снизу в боте рядом с именем нпц
Engine.SetTarget(30080);
// открывем диалоговое окно и прожимаем строки ( у нас сначала 1 потом 11)
Engine.DlgOpen();
Engine.DlgSel(1);
Engine.DlgSel(11); // Драгон Валей

// эти точки ведут нас уже непосредственно на наш спот и по его достижению вкллючаем инфетфейс
Engine.MoveTo(71655, 118657, -3641);

Engine.FaceControl(0,true);
end;
delay(550);
end; delay(550);
begin //запуск основного тела
Script.NewThread(@vozvrat); delay(50);
Script.NewThread(@Striptiz);
end. //конец основного тела
 
Не совсем по теме, я далёк от скриптописания, могу написать только легкие , встать бафнуться пойти фармить и тому подобное.
Но сам принцип мне понятен вроде, да и когда то я пытался вникнуть.
И вот меня подводит память , было это еще по школе ...
Я помню какие то слова обозначали только цыфры , что обозначает :
  1. s:string;
  2. bypass:string;
  3. i:integer;
  4. b:boolean;
  5. mass:array [1..100] of string;
  6. // вот эти строки меня интересуют , кому не тяжело можете раз подробно описать что обозначает каждое слово и зачем они нужны. Я думаю опомнюсь чутка, вообще не уделял этому времени лет 5.
  7. Например bypass:string зачем вот? если можно просто потом написать в скрипте какой-нибудь байпасс и он будет работать.
 
Script.NewThread(@TestScript1); delay(50); Script.NewThread(@TestScript2);


условия на процедуру надо делать или по другому как то?
 
Назад
Сверху