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

квест "Четыре Кубка", пусті Байпаси - захист від ботів?

Рег
25 Окт 2015
Сообщения
6
Реакции
0
В процесі створення скрипта для здавання Saled Box наткнувся на проблемний діалог, який незміг "натиснути" скриптом, в квесті "Четыре Кубка" ("Four Goblets" Imperial Tomb)

Діалог "Please open the boxes"

Зберіг діалог в html, щоб побачити що ж там за проблема:

<html><body><font color="FFFFFF">Ghost of Wigoth:</font><br>If you like, I can open the <font color="LEVEL">Sealed Boxes</font> for you. Are you still gathering <font color="LEVEL">relics of the Elmoreden Empire</font>? If you bring me <font color="LEVEL">1000 relics, I'll trade them for a grade S weapon recipe</font>. Call it nostalgia.<br><a action="bypass -h 00">Please open the boxes.</a></body></html>

Помітив що байпас - нулі.

Cпроби пройти діалог використовуючи: Engine.DlgSel(1); нічого не дає.

Спробував поритись в пам'яті L2.exe за допомогою Hex редактора, в пошуках правильного байпасу [info]по шикарній інструкції: http://rawr.su/topic/1948-parsing-bajpassov-s-pomoschyu-hex-redaktora/[/info]

побачив той самий нуль:


.C.a.l.l. .i.t. .n.o.s.t.a.l.g.i.a...<.b.r.>.<.a. .a.c.t.i.o.n.=.".b.y.p.a.s.s. .-.h. .0.0.".>.P.l.e.a.s.e. .o.p.e.n. .t.h.e. .b.o.x.e.s...<./.a.>.<./.b.o.d.y.>.<./.h.t.m.l.>.
mn0fb5ch93stcm5kg9tzxnsx7.png


Варіантів рішення проблеми є 2:
1) Скрипт "Клікер", клікає мишкою у визначену координатами точку екрану на діалог, треба підібрати координати під Ваш діалог.....
В даного методу є великий мінус - працює тільки на активному вікні, постійно тикамає мишкою в точку на екрані.
Це створює великі незручності.

2) Якщо вдається знайти правильний байпас (дякуючи підтримці форумчам мені це вдалося), відправляємо на цей діалог байпас: Engine.BypassToServer('00'); // 00 - це наш байпас

Приведу повний текст скрипта, для варіанту 1) клікер.


uses SysUtils, Classes;
function SetCursorPos(x, y : integer): boolean; stdcall; external 'user32.dll';
function mouse_event(dwFlags, dx, dy, dwData: byte; dwExtraInfo: integer): void; stdcall; external 'user32.dll';

var
action: TL2Action;
item: TL2Item;

procedure mouseClick(_delay : integer = 100);
begin
mouse_event($2, 0, 0, 0, 0);
delay(_delay);
mouse_event($4, 0, 0, 0, 0);
end;

begin
print('Перед запуском скрипта треба відкрити інтентар, і переключитись на закладку квест ітемів.');
Engine.FaceControl(0,false);
while engine.status = lsOnline do
begin
// якщо є хоч 1 Saled Box - розпакуємо його
// перевіримо чи ми в правильному місці біля НПС
if user.inrange(169544, -91304, -2896,600,250) then begin
Engine.MoveTo(169544, -91304, -2896);
while (Inventory.Quest.ByID(7255, item) and (item.count > 0) ) do // квест ітем Saled Box
begin
if (Inventory.Quest.ByID(7255, item) and (item.count < 10) ) then begin
print('В нас лишилось ' + IntToStr(item.count) + ' Saled Box');
Engine.BlinkWindow(true);
PlaySound('Sounds/msg.wav',false);
delay(500+random(300));
end;
Engine.SetTarget(31454); // НПС Ghost of Wigoth
delay(500+random(200));
engine.attack(300+random(200));
delay(500+random(300));
Engine.DlgSel(1); //Quest
delay(400+random(300));
//Engine.DlgSel(1); //open не відкривається, тому клікаємо мишкою
//-------------
SetCursorPos(1190,620); // координати на екрані, куди я підтягнув діалог "open the boxes"
mouseClick();
Delay(2000+random(1000));
//-------------
end;
print('В нас закінчились ящики');
break;
end;
print('Хз де ти, але це не те місце де можна здати квест');
break;
end;
end.
Перед запуском скрипта треба відкрити інтентар, і переключитись на закладку квест ітемів. щоб вони обновились в списку і стали доступні Адреналіну, інакше отримаєте від скрипта напис "В нас закінчились ящики".

Ну і на закуску, варіант 2) з "нормальним" повноцінним рішенням, за допомогою відправки байпасу:

uses SysUtils, Classes
var
action: TL2Action;
item: TL2Item;

begin
print('Перед запуском скрипта треба відкрити інтентар, і переключитись на закладку квест ітемів.');
Engine.FaceControl(0,false);
while engine.status = lsOnline do
begin
// якщо є хоч 1 Saled Box - розпакуємо його
// перевіримо чи ми в правильному місці біля НПС
if user.inrange(169544, -91304, -2896,600,250) then begin
Engine.MoveTo(169544, -91304, -2896);
while (Inventory.Quest.ByID(7255, item) and (item.count > 0) ) do // квест ітем Saled Box
begin
if (Inventory.Quest.ByID(7255, item) and (item.count < 10) ) then begin
print('В нас лишилось ' + IntToStr(item.count) + ' Saled Box');
Engine.BlinkWindow(true);
PlaySound('Sounds/msg.wav',false);
delay(500+random(300));
end;
Engine.SetTarget(31454); // НПС Ghost of Wigoth
delay(500+random(200));
engine.attack(300+random(200));
delay(500+random(300));
Engine.DlgSel(1); //Quest
delay(400+random(300));
Engine.BypassToServer('00'); // 00 - байпас нашого діалогу
Delay(700+random(300));
//-------------
end;
print('В нас закінчились ящики');
break;
end;
print('Хз де ти, але це не те місце де можна здати квест');
break;
end;
end.

Даний скрипт успішно протестований на x50, відкрито більше 1.5к ітемів.

Можливо закріпити тему як завершений скрипт? Чи створити окрему?
 
Байпасс не пустой там два нуля, это и есть байпас т.е. engine.BypassToServer('00');
 
Встречал пару серверов(птс), где при парсинге байпаса просто небыло, но там отлично работала "engine.DlgSel('текст')" потому я не особо парился :)

<a action="bypass -h 00"> //красным текст для байпаса
так же вроде-бы на EupoPVP встречал, что при каждом открытии диалога, рандомило этот байпас, поищу скину пример(если остался)
 
наверно отлично...хорошо что кодер не на хохлятском написал...
 
@turango, то чувство, когда ты "хохол" и не ограничен в знании языка. :Kappa:
 
Назад
Сверху