Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

О UseObject, MoveItem и CheckLag...

тут можно задать вопрос по скриптингу
Post Reply
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

О UseObject, MoveItem и CheckLag...

Post by grundick »

Мучают меня пара вопросов.Не так давно Эдред писал, что функции типа ЮзОбджект и МувАйтем построены так, что ЧекЛаг в принципе не нужен. Есть у меян скрипт, где чар долбит по улью с пчелами пока его здоровье не окажется меньше 20ти.Каждый удар снимает 3-5Хп.После каждого удара я вставил ЧекЛаг.

Code: Select all

 while life > 20 do
    begin
    UseObject(BeeHive);
    Wait(100);
    CheckLag;
    end;
Внимание ,вопрос: не будет ли чар дохнуть на лаге? На инжекте умирал.Я так поинмаю пакеты с ударами по улью копились в буфере и после разлагивания всем скопом отправлялись на сервер.

Второй вопрос касается функций по перемещению обьектов.Какую минимальную паузу я должен выдерживать после ,скажем, МувАйтема? Когда я могу быт ьуверен, что функция сработала? Есть ли в стелсклиенте в этих функциях какая то встроенная задержка?
Написал функцию для загрузки предметов из сундука в бекпак:

Code: Select all

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                 Процедура загрузки ресурсов типа Item из контейнера Container. Qauntity-требуемое количество,                      //
//                 Min-минимальное кол-во ресурсов в паке.Если русерсов меньше чем Min, происходит подгрузка.                         //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Procedure LoadItems(Item: word;Container: cardinal;Quantity,Min: integer);
Var 
   STime: TDateTime;
   S: String;
Begin

If (CountEx(Item,$FFFF,backpack)>=Min) then Exit;

UseObject(Container);  
wait(500);

If Dead or (Not Connected) then Exit;

FindType(Item,Container);

If FindQuantity=1 then
   begin
   If FindCount<Quantity then 
       begin
       FullllDisconnect; 
       raiseException(erCustomError,'В контейнере кончились подгружаемые ресурсы!');
       end
   Else
       begin
       Repeat
          STime:=Now;
	  CheckLag;
          FindType(Item,Container);
	  ClickOnObject(FindItem);
	  Wait(200);
	  S:=LastJournalMessage;
	  Delete(S,1,7);
          Grab(FindItem,1); 
          AddToSystemJournal('Берем единичные ресурсы '+S);
          Wait(250); 
	  FindType(Item,backpack);
	  If (InJournalBetweenTimes('at your feet.',stime,Now)<>-1) then raiseException(erCustomError,'У НАС ЯВНЫЙ ПЕРЕГРУЗ!!!РЕСУРСЫ ПОД НОГИ ПАДАЮТ!!!');
       Until (FindCount>=Quantity);
       end;
   Exit;
   end;

If FindQuantity>=Quantity then
   begin
   Stime:=Now;
   CheckLag;
   FindType(Item,Container);
   ClickOnObject(FindItem);
   Wait(200);
   S:=LastJournalMessage;
   Delete(S,1,7);
   Grab(FindItem,1); 
   AddToSystemJournal('Берем ресурсы '+S);
   Wait(250);
   If (InJournalBetweenTimes('at your feet.',stime,Now)<>-1) then raiseException(erCustomError,'У НАС ЯВНЫЙ ПЕРЕГРУЗ!!!РЕСУРСЫ ПОД НОГИ ПАДАЮТ!!!');
   end
Else
   begin
   FullllDisconnect; 
   raiseException(erCustomError,'В контейнере кончились подгружаемые ресурсы!');
   end;
End;
Казалось бы всё более менее грамотно(с моей точки зрения), тем не менее частенько выдает ошибку Drag error: object no finded.
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

Code: Select all

while life > 20 do 
    begin
       WaitConnection(5000);
       UseObject(BeeHive);
       Wait(500); 
    end;
Я бы написал так. Паузы меньше 500 (полсекунды) на юз предметов или перемещение на большинстве шардов приводят к блокировке. В результате ты проиграешь больше времени. Кстати, эта блокировка может для тебя выглядеть как лаг.

Во втором скрипте логика хромает. Что такое Quantity? Точнее, что передается в этот параметр? Сколько взять? А почему с этим параметром сравнивается FindCount? О каком вообще перемещении идет речь? О кучкующихся предметах, о некучкующихся, или универсальное перемещение? FindCount - это количество найденных стопок, а сколько в какой стопке - никак в этой переменной не отражается. А далее скрипт вдруг начинает оперировать с FindQuantity. А это - количество в первой найденной стопке. Странно все устроено...

Далее, для считывания названия используется клик одиночный по объекту и выделение части названия из строки журнала. Ладно. Но зачем это засунуто в цикл? Подобную операцию достаточно выполнить один раз в начале, зачем много раз повторять?

Далее. В последнем блоке (If FindQuantity>=Quantity then) я так понимаю, скрипт уже определился что перемещать. Но зачем-то снова идет поиск в исходном контейнере, зачем-то снова клик и чтение названия. Зачем?

Это все чисто поверхностный просмотр скрипта. Куча лишних поисков, паузы минимальные (как писал выше, лучше установить в полсекунды), но при этом куча лишних пауз после всевозможных кликов (тоже лишних). Плюс еще чеклаги (которые, в свою очередь, состоят из кликов и пауз) - неудивительно что такой скрипт периодически не может переместить то, что нашел.

В папке инклюдов есть функция для перемещения. Возьми ее за образец, дополни своим определением имени (только сделай это один раз, до всяких циклов) и будет тебе счастье. Без всяких чеклагов.
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

Quantity - это количество предметов, которое необходимо загрузить из контейнера.Сравнивается оно с FindCount в том случае, если предметы одиночные (FindType(Item,Container); If FindQuantity=1 then).Перемещение универсальное.Сначала ищеться предмет по типу.Потом смотриться сколько предметов в найденной стопке.Если 1, то считаеться что предмет не кучкующийся.Для него отдельное перекладывание в цикле. Если предметов в найденной кучке больше одного, перекладывание производиться обычным Grab(); поиски отнюдь не лишние...скрипт делиться на две части, первая -когда предмет НЕ кучкуется, вторая -иначе.Пауза после клика(для определения названия перемещаемог опредмета) необходима, иначе LastJournalMessage не успевает обновиться. То, что загнал в цикл, это да, лохонулся :).ЧекЛаги ставил именно для предотвращения попытки взять предметы во время лага. На инжекте ЧекЛаг очень даже спасал...Вот :roll:
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

Бррр... Не нравится мне логика построения этого скрипта. Точно не могу сформулировать что именно не нравится, башка сегодня тугая какая-то, но что-то не нравится. Я в подобных случаях обычно (относительно своих скриптов) сажусь и пишу скрипт заново (если он не очень большой), не заглядывая в первоначальный вариант. А потом уже сравниваю.

Я такой скрипт писать не буду, написал их уже достаточно - смотри разные мои скрипты - там подобных функций куча.
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

Да ничего и не просил написать :) Я вообще вопросы задвал :) Вот сделал ещё вариант с другой защитой от перегруза.Фактически все тоже самое, кроме того, что вместо Grab использую DragItem & DropItem...С ним ни одной ошибки!

Code: Select all

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//           Процедура загрузки ресурсов типа Type, цвета Color  из контейнера Container. Qauntity-требуемое количество,              //
//                 Min-минимальное кол-во ресурсов в паке.Если русерсов меньше чем Min, происходит подгрузка.                         //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Procedure LoadItem(ItemType,ItemColor: word;Container: cardinal;Quantity,Min: integer);
Var 
    S: String;
    STime:TDateTime;

Begin

If (CountEx(ItemType,ItemColor,backpack)>=Min) then Exit;

UseObject(Container);  
wait(500);

If Dead or (Not Connected) then Exit;

FindTypeEx(ItemType,ItemColor,Container,false);

If FindQuantity=1 then
   begin
   If FindCount<Quantity then 
       begin
       FullllDisconnect; 
       raiseException(erCustomError,'В контейнере кончились подгружаемые ресурсы!');
       end
   Else
       begin
       Repeat
        //  CheckLag;
	  If Dead or (Not Connected) then Exit;
          FindTypeEx(ItemType,ItemColor,Container,false);
	  ClickOnObject(backpack);
          Wait(200);
	  S:=LastJournalMessage;
	  Delete(S,1,7);
          If Not DragItem(FindItem,1) then 
              begin
              AddToSystemJournal('ресурс не найден');
              Exit;
              end;
          AddToSystemJournal('Берем единичные ресурсы '+S);
          Wait(250);
	  If (Weight>(STR*4)) then  
	      begin
	      DropItem(Container,0,0,0);
	      raiseException(erCustomError,'У НАС ЯВНЫЙ ПЕРЕГРУЗ!!!МЫ НЕ МОЖЕМ ВЗЯТЬ РЕСУРСЫ!!!');
	      end
          Else DropItem(backpack,0,0,0);
	  FindTypeEx(ItemType,ItemColor,backpack,false);
	 
       Until (FindCount>=Quantity);
       end;
   Exit;
   end;

If FindQuantity>=Quantity then
   begin
   //  CheckLag;
   FindTypeEx(ItemType,ItemColor,Container,false);
   ClickOnObject(FindItem);
   Wait(200);
   S:=LastJournalMessage;
   Delete(S,1,7);
   If Not DragItem(FindItem,Quantity) then 
       begin
       AddToSystemJournal('ресурс не найден');
       Exit;
       end;
   AddToSystemJournal('Берем ресурсы '+S);
   Wait(250);
   If (Weight>(STR*4)) then  
	      begin
	      DropItem(Container,0,0,0);
	      raiseException(erCustomError,'У НАС ЯВНЫЙ ПЕРЕГРУЗ!!!МЫ НЕ МОЖЕМ ВЗЯТЬ РЕСУРСЫ!!!');
	      end
   Else DropItem(backpack,0,0,0);
   end
Else
   begin
   FullllDisconnect; 
   raiseException(erCustomError,'В контейнере кончились подгружаемые ресурсы!');
   end;
End;
Post Reply