- Рег
- 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.>.
Варіантів рішення проблеми є 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к ітемів.
Можливо закріпити тему як завершений скрипт? Чи створити окрему?
Діалог "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.>.
Варіантів рішення проблеми є 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к ітемів.
Можливо закріпити тему як завершений скрипт? Чи створити окрему?