PDA

Просмотр полной версии : Примерчик плиз


LamerOK
06.02.2010, 10:28
Привет, знатоки, не мог бы ктото выложить пример скрипта, примитивного бота.


начало цикла
взять таргет на сближаюшую цель (моб любой)
пока хп цели >0 атака иначе
следующая
повторить
конец

пытался из других ботов (локомотивов ) разных авторов разобрать процедуру "атак" но хотелось бы отдельно с пояснением где что для чего какой пакет как поймато и тд...


заранее большое спасибо.
(сори кажетсья не втом разделе создал по запарке переместите плз если нада...

sinles
06.02.2010, 12:19
атака моба руками равносильна взятию его в цель 2 раза подряд:
buf:=#$1F;
WriteD(TargetOID); //Object id того кого взять в цель, второй раз произойдет атака.
WriteD(MyX); //х координата моего чара
WriteD(MyY); //у
WriteD(MyZ); //з
WriteC(00); //нажат ли контрол ?
SendToServerEx(Name); //отправка серверу

А что бы сделать выбор мобов по очереди нужно их всех запомнить, а потом при каждом выборе пересчитывать расстояние до каждого и выбирать ближайшего. К сожалению примера нет. Тебе нужно анализировать для этого пакет #$0C от сервера

*все написано относительно ХБ сервера

LamerOK
06.02.2010, 12:31
мобы имеют разные ID ? после того как я убью мобов, появяться новые их опять нада заносить в массив?

за форс атаку (ctrl) разве "00" ? не просто "0" и "1"

sinles
06.02.2010, 16:37
ID и OID (Object ID) разные понятия. Ид определяет тип монстра, это как класс в программировании. А ОИД это конкретны экземпляр моба (класса) который имеет конкретное место положения в мире хп и т.д.
Заметь что серверу нужно отправлять не ИД (тип) предметов и монстров, а ИД объектов предметов и монстров.
От сервера будут приходить пакеты о создании различных обьектов (#$0C - создание объекта моба) и о их удалении. Вот это тебе нужно просто взять и в режиме просмотра получаемых пакетов выяснить.

*нажат ли контрол - если отправлять 0 то будет бить игроков, а мобов будет. Что бы заставить бить всех отправлять нужно 01

LamerOK
06.02.2010, 18:51
пакет #$0C приодит в клиент с респом каждого моба? при попадении моба или чара в определенный радиус взаимодействия? или каждый интервал времени?

сегодня много наблюдал за пакетам клиент постоянно отправляет один и то же пакет, с одинаквым интервалом времени. чар просто стоит вокруг нет ничего и никого нет флуда в шаут трейд хч и тд.. а пакеты идут и идут обсолютно идентичные. какой их смысл?

SeregaZ
06.02.2010, 22:00
который пинг чтоль? это чтобы крикнуть серверу: "эээй! я еще тут, я из игры не вышел, не отключай меня!"

sinles
07.02.2010, 23:19
Вся игровая область поделена на зоны. Каждый раз когда ты попадаешь в новую зону сервер тебе сообщает обо всем что там находится, в том числе и о мобах(этот самый пакет НПЦинфо). Когда монстр умерает или исчизает, или уходит из области приходит пакет ДэлэйОбжэкт(ид не помню) и обьект который указан в пакете следует удалить, он нам точно не понадобится.

LamerOK
08.02.2010, 01:42
sinles, спс помог, еще есть вопрос, нада отследить когда моб атакует чара.
(понимаю глупо звучит наверно просто хочу сам во всем разобраться, по мере возникая сложностей я упрощаю по ставенную задачу. теперь просто хочу чтобы чар стол среди мобов и давал сдачи полезшим к нему аграм. тем самым избегу пока что непонятного для меня создания БД и массива мобов примрено так

взять данные атакующей цели
убедиться что мертва
ждать атаки дальше

тут проблема...
моб даже мертвый пока не исчез держиться в таргете.. в пакете содержится его ХП?
)
если не тружно конкретизируйте ваши советы для хроник ГрацияФинал, это не потому что мне влом посмотреть пакеты, на моем сервере видимо какято фигня но пости ВСЕ пакеты приходят "unknow(ID)" о оих очень много я не успеваю понять какой за что отвечает

sinles
08.02.2010, 10:18
составил вырезку из своего скрипта рыбалки (он умеет бить тех кто его ударил) Не проверял, но по идеи он должен бить тех кто нападает. Если нападет 2 моба он убьет одного, а потом когда его ударит другой переключится бить его.

const
Name='Sinner';
var
underAttack : boolean; //находимся ли мы в бою
myX,myY,myZ: integer; //наши статы
myOID: integer;
AttackerOID: integer;

procedure Init;
begin
underAttack := false;
end;

procedure Free;
begin
end;

procedure UserInfo; //обновление данных о себе
var
i:word;
begin
MyOID:=ReadD(18);
MyX:=ReadD(2);
MyY:=ReadD(6);
MyZ:=ReadD(10);
end;

//1F=Action:d(ObjectID)d(OrigX)d(OrigY)d(OrigZ)c(Act ionID)
procedure Target(Attacker: Integer);
begin
buf:=#$1F;
WriteD(Attacker);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(00);
SendToServerEx(Name);
delay(800);
end;

// вызывается при приходе каждого пакета, если скрипт включен
begin
//************************************************** ************************
//не обрабатываем пустые пакеты
if pck='' then exit;
if (ConnectName=Name) and FromServer then begin
case pck[1] of
//пакет Die (моб умер)
//00=Die:d(CharID)d(1)d(HasHideout)d(HasCastle)d(Fla gs)d(Sweepable)d(Access)
#$00: begin
if (AttackerOID=ReadD(2)) then begin
//мы убили свою цель
underattack:=false;
end;
if (MyOID=ReadD(2)) then begin //нас убили
//тут слудет остановить скрипт, что бы не палиться
end;
end;

#$32: UserInfo; //пакет с инфой о моём чаре

//************************************************** **********************
//s33=Attack:d(AttackerID)d(TargetID)d(Damage)c(Flag s)d(X)d(Y)d(Z)h(HitsSize:Loop.01.0003)d(TargetID)d (Damage)c(Flags)
#$33: begin
if (MyOID=ReadD(6)) and (MyOID<>ReadD(2)) then begin //на нас напали
if not underattack then begin
underattack:=true;
//сохраним OID напавшего
AttackerOID:=ReadD(2);
Target(AttackerOID); //
Target(AttackerOID); //дабл клик по мобу, начинаем атаку
end;
end;
end;
end;
end;
end.

LamerOK
08.02.2010, 13:49
procedure UserInfo; //обновление данных о себе
var
i:word; для чего это переменная? вроде не используеться нигде...

NLObP
12.02.2010, 02:38
LamerOK, забыл удалить наверное.