PDA

Просмотр полной версии : Управление другим чаром из 1 окна


spiritofsands
29.01.2010, 12:08
Наконец-то закончил скрипт для Interlude. Он повторяет действия чара во втором окне.
Мain - главный чар, slave - второе окно. Чары должны быть одинаковыми (т.е. иметь одинаковые скиллы).
Основные возможности:
- slave принимает пати от main;
- slave бежит за main;
- slave выделяет того, кого выделил main;
- slave снимает таргет синхронно с main;
- slave юзает скиллы, используемые main;
- slave использует "/unstuck" синхронно с main по команде "-u".
Команды пишутся в общий чат. Планируется будущая доработка скрипта.
Оставляйте свои комментарии/предложения.

spiritofsands
29.01.2010, 12:13
Скрипт меняющий команду "/gmlist" на "-gmlist". Писал для себя, т.к. не хотелось каждый раз запускать впф к ИГ боту. Так проще.

spiritofsands
30.01.2010, 05:43
Доработал скрипт, но осталась одна проблема: иногда чар со 2 окна использует скилл на гл. персонажа вместо его таргета. Как можно это исправить?

SeregaZ
30.01.2010, 21:48
а ты поставь доп проверку на таргет.
иф ид таргет = ид мой таргет, то юзать скил
елсе асист мне

spiritofsands
30.01.2010, 22:51
Так эта проверка есть, но иногда бот бьет мейна. Приведу скрипт тут:

// Управление вторым окном
// by spiritofsands
//
const
namemain='Lockhorn'; // ник главного чара
nameslave='Ikhanna'; // ник второго окна
var
ToX, ToY, ToZ, OrigX, OrigY, OrigZ, i, mid, q, p, tid, tx, ty, tz, tick,
partyID1, pID1x, pID1y, pID1z, ctid, atk : integer;
d:string;
procedure Init; //Вызывается при включении скрипта
begin
send2msg('target self');
q:=2;
end;
procedure Free; //Вызывается при выключении скрипта
begin
end;
procedure Send2Msg(Msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(Msg);
SendToClientEx(namemain);
end;
begin
if (pck[1]=#$04) and (connectname=namemain) and (q=2) then
begin
i:=2;
mid:=readd(i);
pck:='';
send2msg('id');
q:=0;
end;
if fromserver and (connectname=nameslave) then
case pck[1] of
#$39: // party
begin
i:=2;
send2msg('party request');
if (reads(i))=namemain then
begin
send2msg('join '+namemain+'s party');
buf:=#$2A#$01#$00#$00#$00;
SendToServerEX(Nameslave);
end;
end;
#$A7: // partymember 1 id and pos
begin
i:=2;
p:=readd(i);
partyID1:=readd(i);
pID1x:=readd(i);
pID1y:=readd(i);
pID1z:=readd(i);
buf:=#$04;
writed(partyID1);
writed(pID1x);
writed(pID1y);
writed(pID1z);
buf:= buf + hstr('00');
SendToServerEX(Nameslave);
end;
#$29:
begin
if atk=1 then // atk if target<>main
begin
i:=2;
p:=readd(i);
ctid:=readd(i);
if (ctid<>partyid1) then
begin
buf:=d;
sendtoserverEx(nameslave);
atk:=0;
end;
end;
end;
end;
if fromclient and (connectname=namemain) then // from main client
case pck[1] of
#$04: // target
begin
i:=2;
tid:=readd(i);
tx:=readd(i);
ty:=readd(i);
tz:=readd(i);
buf:=#$04;
writemask('ddddc', [Tid, Tx, Ty, tz, 0]);
sendtoserverEx(nameslave);
//Send2Msg('on target');
end;
#$21: // npc dialog
begin
buf:=pck;
sendtoserverEx(nameslave);
//Send2Msg('dialog proceed');
end;
#$37: // cancel target
begin
buf:=pck;
sendtoserverEx(nameslave);
//Send2Msg('target canceled');
end;
#$2F: // use skill
begin
d:=pck;
buf:=#$04; //
writemask('ddddc', [Tid, Tx, Ty, tz, 0]); // assist
sendtoserverEx(nameslave); //
atk:=1;
//Send2Msg('skill used');
end;
#$38: // -u = /unstuck all
begin
i:=2;
if reads(i)='-u' then
begin
pck:='';
buf:=#$AA#$34#$00#$00#$00;
sendtoserverEx(namemain);
sendtoserverEx(nameslave);
end;
end;
#$A7:
begin
buf:=pck;
sendtoserverEx(nameslave);
end;
end;
end.

Нужный фрагмент подчеркнут.

SeregaZ
01.02.2010, 01:59
не... чото у тебя не так. у меня четкое равно, а утебя больше-меньше. исправь по моей задумке и попробуй.

второй вариант:
можно еще попробовать убрать "нажатый ctrl" при использовании скила. моба он будет бить полюбому, в пвп - если противник флагнут, то тоже атаковать можно без ctrl. проблема возникнет если ты первый флагаешься - бот не будет бить до тех пор, пока таргет наконец не флагнется. и самое главное будучи в пати - он без ctrl не будет стрелять в мейна, даже если взял его по ошибке в таргет.

spiritofsands
03.02.2010, 02:11
не... чото у тебя не так. у меня четкое равно, а утебя больше-меньше. исправь по моей задумке и попробуй.


Больше-меньше это неравно. Т.Е. юзать если таргет не главный чар. Ctrl убирать не буду. Прийдется изменить систему движения за главным чаром, чтоб бот его не брал в таргет.

Добавлено через 5 часов 58 минут
Подправил систему следования за главным персонажем, добавлена константа растояния. Теперь бот не выделяет его => нет глюка с атакой мастера.

// Управление вторым окном
// by spiritofsands
//
const
namemain='Lockhorn'; // ник главного чара
nameslave='Ikhanna'; // ник второго окна
len=50; // расстояние между персонажами
var
ToX, ToY, ToZ, OrigX, OrigY, OrigZ, i, mid, q, p, tid, tx, ty, tz, tick,
partyID1, pID1x, pID1y, pID1z, ctid, atk : integer;
d:string;
procedure Init; //Вызывается при включении скрипта
begin
send2msg('target self');
q:=2;
end;

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

procedure Send2Msg(Msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(Msg);
SendToClientEx(namemain);
end;

begin
if (pck[1]=#$04) and (connectname=namemain) and (q=2) then
begin
i:=2;
mid:=readd(i);
pck:='';
send2msg('id');
q:=0;
end;

if fromserver and (connectname=nameslave) then
case pck[1] of
#$39: // party
begin
i:=2;
send2msg('party request');
if (reads(i))=namemain then
begin
send2msg('join '+namemain+'s party');
buf:=#$2A#$01#$00#$00#$00;
SendToServerEX(Nameslave);
end;
end;
{#$A7: // partymember 1 id and pos
begin
i:=2;
p:=readd(i);
partyID1:=readd(i);
pID1x:=readd(i);
pID1y:=readd(i);
pID1z:=readd(i);
buf:=#$04;
writed(partyID1);
writed(pID1x);
writed(pID1y);
writed(pID1z);
buf:= buf + hstr('00');
SendToServerEX(Nameslave);
end;}
end;
if fromclient and (connectname=namemain) then // from main client
case pck[1] of
#$04: // target
begin
i:=2;
tid:=readd(i);
tx:=readd(i);
ty:=readd(i);
tz:=readd(i);
buf:=#$04;
writemask('ddddc', [Tid, Tx, Ty, tz, 0]);
sendtoserverEx(nameslave);
//Send2Msg('on target');
end;
#$21: // npc dialog
begin
buf:=pck;
sendtoserverEx(nameslave);
//Send2Msg('dialog proceed');
end;
#$37: // cancel target
begin
buf:=pck;
sendtoserverEx(nameslave);
//Send2Msg('target canceled');
end;
#$2F: // use skill
begin
buf:=pck;
sendtoserverEx(nameslave);
//Send2Msg('skill used');
end;
#$38: // -u = /unstuck all
begin
i:=2;
if reads(i)='-u' then
begin
pck:='';
buf:=#$AA#$34#$00#$00#$00;
sendtoserverEx(namemain);
sendtoserverEx(nameslave);
end;
end;
#$01: //go to
begin
i:=2;
tox:=readd(i);
toy:=readd(i);
toz:=readd(i);
origx:=readd(i);
origy:=readd(i);
origz:=readd(i);
buf:=#$01;
writed(tox-len);
writed(toy-((len*toy) div (tox)));
writed(toz-((len*toz) div (tox)));
writed(origx);
writed(origy);
writed(origz);
writed(1);
sendtoserverEx(nameslave);
end;
#$A7:
begin
buf:=pck;
sendtoserverEx(nameslave);
end;
end;
end.


Добавлено через 51 минуту
Появилась новая проблема - бот ходит только с одной координатной стороны главного чара. Как можно усовершенствовать скрипт, чтобы бот ходил сзади/сбоку чара?

SeregaZ
03.02.2010, 15:24
рандом +- 100, к примеру, к текущим координатам мастера по х и у.

sinles
04.02.2010, 15:51
MyX, MyY, MyZ - мои координаты
TX, TY, TZ - координаты цели за которой следовать

coof := -70/sqrt((MyX-TX)^2+(MyY-TY)^2+(MyZ-TZ)^2);
rx := round(TX + coof*(MyX-TX));
ry := round(TY + coof*(MyY-TY));
rz := round(TZ + coof*(MyZ-TZ));

rx, ry, rz - координаты четко сзади цели на некотором удалении от нее.

*round - округление.

SeregaZ
04.02.2010, 17:35
кстати чтоб совсем уж не отличить - сделай начало движения по таймеру. к примеру через 1 секунду после начала движения мастера. а то одновременное начало движения ну совсем уж картину палит. а если с паузой - то типа "человек, увидел, что сопати двинулся - то двинулся следом."

sinles
04.02.2010, 18:26
но как определить мэйн чар пошел воевать или просто чуть изменил курс ?

SeregaZ
04.02.2010, 21:02
думаю можно сделать на проверку начала кастования скила. то есть если мастер кастует что-то - значит война :) и надо ему поасистить

alexteam
04.02.2010, 21:36
startautoattack/stopautoattack

spiritofsands
12.02.2010, 15:47
Буду переделывать скрипт под Hellbound.
В планах:
- slave-чар будет идти по случайно выбранным координарам рядом с мейном;
- будет ходить с случайной задержкой (0.5-1.5 сек);
- добавление функций: синхронная продажа, добавление поддержки бафферов и бд/свс;
- список скиллов, которыми можно пользоватся боту;
- добавление поддержки файтеров;
- позже добавление многооконности;

Добавлено через 2 минуты
но как определить мэйн чар пошел воевать или просто чуть изменил курс ?
Бот идет, если жмешь мышкой по земле, кастует скилл на таргет главного чара одновременно с ним.

Добавлено через 2 минуты
думаю можно сделать на проверку начала кастования скила. то есть если мастер кастует что-то - значит война :) и надо ему поасистить

Давно есть такое...

. . .
case pck[1] of
#$2F: // use skill
begin
buf:=pck;
sendtoserverEx(nameslave);
//Send2Msg('skill used');
end;
. . .

Fer123
12.02.2010, 16:52
Еще можно сделать команду чата чтоб через main можно slave'ом писать

spiritofsands
15.02.2010, 20:41
кстати чтоб совсем уж не отличить - сделай начало движения по таймеру. к примеру через 1 секунду после начала движения мастера. а то одновременное начало движения ну совсем уж картину палит. а если с паузой - то типа "человек, увидел, что сопати двинулся - то двинулся следом."

Поподробнее про таймер пжл

Добавлено через 18 минут
Что не так с функцией?

function randlen(min,max:integer):integer;
begin
randomize;
case round(random) of
1:
begin
randomize;
randlen:=min+random(max-min)+1;
end;
0:
begin
randomize;
randlen:=-(min+random(max-min)+1);
end;
end;
end;

SeregaZ
15.02.2010, 20:59
а я уже интересовался раньше этим вопросом :) вот такой код мне посоветовали:
procedure OnTimer01(Sender: TObject);
begin
Timer01.interval := 1000+round(random()*1000);
case a of
1:begin
buf:=HStr('04 70 19 10 48 5E C7 01 00 FF 2A 01 00 51 F5 FF FF 00');
SendToServer;
inc(a);
end;
2:begin
buf:=HStr('04 70 19блаблабла****

spiritofsands
16.02.2010, 00:31
Доработал скрипт и изменил его для Hellbound.

Основные возможности:
- slave принимает пати от main;
- slave бежит близко (рандом) к main через случайное время (от 1 до 2 сек);
- slave выделяет того, кого выделил main;
- slave снимает таргет синхронно с main;
- slave юзает скиллы, используемые main;
- покупает/продает предметы синхронно с main;
- если main пишет в пм slave, то slave пишет это сообщение в общий чат.

В планах:
- выбор, в какой чат будет писать slave;
- использование скиллов через случайный интервал; // посоветуйте какой оптимальный
- возможность автохила/речарджа main'а (с поправкой на профу slave);
- возможность задавать свои макро-команды (например на "-buff" можно будет задать набор скиллов);
- готовые наборы макро-команд для разных профессий;
- добавление "аналогичных" скилловых команд (например на скилл "Spoil" y main'a, slave будет использовать "Wind Strike");
- список скиллов, которыми может пользоватся slave;
- добавление поддержки обычной атаки :);
- позже добавление многооконности;

Оставляйте свои комментарии/пожелания.

spiritofsands
16.02.2010, 00:34
Сам скрипт слишком большой, выложу как файл.

spiritofsands
16.02.2010, 17:55
Немного переделал антигмлист:
- задается тип игры;
- работает на Interlude и Hellbound.
- меняет команду "/gmlist" на "-gmlist"


// Antigmlist v1.0
// Замена команды /gmlist на -gmlist
// by spiritofsands
const
game='hb'; // 'int' для interlude и 'hb' для Hellbound <= менять тип игры тут
var gmlist,inmsg:string;
procedure Init; //Вызывается при включении скрипта
begin
if game='int' then
begin
gmlist:=#$81;
inmsg:=#$38;
end;
if game='hb' then
begin
gmlist:=#$8B;
inmsg:=#$49;
end;
end;
procedure Free; //Вызывается при выключении скрипта
begin
end;
begin
if (fromclient) then
begin
case pck[1] of
gmlist: pck:='';
inmsg:
begin
if (reads(2)='-gmlist') then
begin
pck:='';
buf:=gmlist;
sendtoserver;
end;
end;
end;
end;
end.


Добавлено через 17 часов 13 минут
Есть проблема: когда пытаешся что-то подобрать, бот считает это таргетом цели и бежит сам подбирать. Как исправить?

alexteam
16.02.2010, 18:19
Вести базу обжектайдишек предметов лежащих на полу.

SeregaZ
17.02.2010, 02:04
а ты сделай как раз подбор автоматический :) нафига хозяином бегать, отвлекатся - не царское это дело дроп подбирать :)
правда действительно нужен будет массив для учета итемов, которые вы выбили. чтобы к примеру - убил 1 моба, выпало адена и сталь, бот бежит, поднимает адену, тут агрится другой моб, ты оперативно его снимаешь, и с него тоже еще падает адена и к примеру стоун оф пурити - слейв может забыть про тут не доподобранную сталь с 1 моба и бежать поднимать дроп со второго моба. нужен массив со сдвигом :) помнится я сто лет назад задавал вопрос... но потом мне дали порулить ингейм ботом, и я забыл про ту идею автоматизации квеста гномику. закончилось все бафом у бафера, взятием-сдачей квеста и добегания до точки и возврат. а непосредственно сам фарм с учетом квест итемов, хп, дропа - так и осталось не реализованным :)

аааа... и еще учти, что пробегать может какойнить чар и спереть, что дропнул этот первый моб - нужно будет этот момент тоже иметь ввиду. а то другой человек сопрет сталь, а у слейва в массиве она будет продолжать числица. дроп со 2 моба он подобрал, данные обнулил - поворачивается к тому месту, где сталь лежала - а её уже нет и хобааа крит в ph

spiritofsands
23.02.2010, 23:03
Сломался хард, на котором хранилась новая версия скрипта... Хорошо хоть тут есть версии старые. Когда будет время - допишу.

mazatraker
27.02.2010, 20:29
Помогите. Не получается запустить скрипт так как не знаком с программированием.http://img12.imageshack.us/img12/6264/ppccc.th.png (http://img12.imageshack.us/i/ppccc.png/) что необходимо сделать?:D

alexteam
27.02.2010, 20:36
во первых, нужна делать скриншоты нормально, в статус баре описание ошибки, на скрине его не видно.
зы. скорей всего не последняя версия пх, в которой еще нет врайтмаск.

mazatraker
27.02.2010, 20:37
ну да там как раз ругается на write mask =) пойду качать последнюю. Спс

spiritofsands
20.03.2010, 14:45
Вообщем, вот версия для инт.

Roman32
28.02.2012, 22:43
как из 2ух окон сделать поболее?ну тоесть мне надо 5-10)

spiritofsands
29.02.2012, 00:41
как из 2ух окон сделать поболее?ну тоесть мне надо 5-10)

самый простой вариант - сделать копии скрипта, и в каждой имя второго окна разное, а главного - одно и то же.

не ожидал, что ним еще кто-то пользуется :)

Roman32
29.02.2012, 13:30
Спс скриптик ваще агонь!он самый последний или уже новые версии есть?)было бы не плохо чтоб все действия повторял)

spiritofsands
03.03.2012, 00:24
Последнее обновление - 20.03.2010. Когда играл - развивал еще. Так что на сегодняшний день это последняя версия. Вряд ли еще будет дополнена мной. В принципе, код с комментами, все довольно понятно, потому улучшить может кто угодно.