Даже если заменить как ты говоришь пишет что нет скролов _interluda.net вот тут например проверь там пвп и бабло достаеться быстро :) есть энчат и кристал заточки
Ок. Попробую.
Попробовал. Как я и говорил - все работат.
Для работы скрипта необходимо его инициализировать - это значит получить пакет ItemList(1B). Обычно это делается открытием инвентаря. На сервере interluda.net потребовалось, что нибудь купить/продать.
Дополнительно надо не забыть поправить константы:
const
Name='имя';
Scroll=955; // 955 - ItemID Scroll: Enchant Weapon (Grade D)
Weapon=129; // 129 - ItemID Sword of Revolution
MaxEnchLvl=21; //max уровень заточки
max=100; //max количество предметов в базе - это сколько места в инвентаре
Исправить как часто точить:
timer.interval:=5000; //время задержки
И условие, должно быть не менее двух вещей, иначе скрипт останавливается.
Прямо сейчас заточил до 21 два меча Sword of Revolution.
ItemList(1B) - вот в этом и вопрос почему при открытии инвентаря не срабатывала инициилизация, возможно ли что админы начнут делать защиту исходя из того что большинство для инициилизации скриптов требуют определенного действия?
угу если ты решил посмотреть скока у тебя заточек осталось или чё поднял, сразу автобан :) => много КоЛ на разбан => админы заработают денег :twisted:
Добавлено спустя 1 минуту 43 секунды:
Re: Re:
Цитата:
Сообщение от NLObP
Цитата:
Сообщение от NLObP
Цитата:
Сообщение от user123
Даже если заменить как ты говоришь пишет что нет скролов _interluda.net вот тут например проверь там пвп и бабло достаеться быстро :) есть энчат и кристал заточки
Ок. Попробую.
Попробовал. Как я и говорил - все работат.
Для работы скрипта необходимо его инициализировать - это значит получить пакет ItemList(1B). Обычно это делается открытием инвентаря. На сервере interluda.net потребовалось, что нибудь купить/продать.
Дополнительно надо не забыть поправить константы:
const
Name='имя';
Scroll=955; // 955 - ItemID Scroll: Enchant Weapon (Grade D)
Weapon=129; // 129 - ItemID Sword of Revolution
MaxEnchLvl=21; //max уровень заточки
max=100; //max количество предметов в базе - это сколько места в инвентаре
Исправить как часто точить:
timer.interval:=5000; //время задержки
И условие, должно быть не менее двух вещей, иначе скрипт останавливается.
Прямо сейчас заточил до 21 два меча Sword of Revolution.
скока сломал ? считал
или при авто заточке главное ритм поймать :)
ItemList(1B) - вот в этом и вопрос почему при открытии инвентаря не срабатывала инициилизация, возможно ли что админы начнут делать защиту исходя из того что большинство для инициилизации скриптов требуют определенного действия?
Вряд ли можно, что нибудь тут админам сделать, ведь эти пакеты нужны для нормальной работы клиента. Например при открытии инвентаря приходит пакет ItemListPacket(1B), хочет админ или нет. Просто в нашем случае скрипт включается после того как он пришел и повторное окрытие уже ни чего не дает, потому что клиент уже получал этот пакет, возможно при входе перса. Все зависит от сервера, в нем может быть оптимизация посылки пакетов для уменьшения трафика. Тут надо ориентироваться на определенный сервер - ява он или офф.
Цитата:
Сообщение от Grinch
угу если ты решил посмотреть скока у тебя заточек осталось или чё поднял, сразу автобан :) => много КоЛ на разбан => админы заработают денег
Для определения количества предметов выполняются стандартные команды клиента: открыть инвентарь, поднять/бросить на землю предмет, купить в магазине и ничем повредить не могут. Нам нужны только для того, чтобы сервер прислал пакет ItemListPacket(1B) или InventoryUpdate(27), надо только определить какое из этих действий нам подходит. А вот если с помощью пакетхака начнешь использовать теже заточки, которых в инвентаре уже нет, вот тогда и запалял тебя. Поэтому нам и надо отслеживать и не пускать на сервер все пакеты, которые обычно клиент не может послать.
Добавлено спустя 11 минут 48 секунд:
Цитата:
Сообщение от Grinch
скока сломал ? считал
или при авто заточке главное ритм поймать :)
На том серваке до 25 можно смело точить. Так что ничего не сломал. Мой скрипт только на облегчение жизни, но никакие ритмы он поймать не может, это надо отдельно обдумывать и писать другой скрипт. Здесь только на удачу, покупаешь побольше мечей, еще больше заточек и ждешь. Повторяешь снова если не доточилось до нужного уровня. Один меч в любом случае остается. :D
Прочитал всю темку. Сам пока не пробовал ничего т.к. на работе сижу, но сразу возникла идея.
Вообщем почему бы не сделать что то типа своего языка макросов?
Например самое банальное что пришло в голову:
у бота есть надор пакетов, хотяб таких вот
b1='2F 10 04 00 00 00 00 00 00 00'; // Shield
b2='2F 0B 04 00 00 00 00 00 00 00'; // Mental Shield
b3='2F 23 04 00 00 00 00 00 00 00'; // Empower
b4='2F B4 04 00 00 00 00 00 00 00'; // Wind Walk
b5='2F 36 04 00 00 00 00 00 00 00'; // Concentration
Идея в том, чтоб бот получив команду типа "1,3,5", бафнул бы Shield, Empower, Concentration
Ну это самое простое, а вообще можно это все расширить, причем не вводом кучи команд, а просто добавлением еще одного пакета, например
b6='** ** ** ** ** ** ** ** ** **'; // что нибудь
Тогда возникает несколько вопросов...
1. Почему я ни у кого не видел массива команд? Я просто паскаль не знаю особо, так самые азы токо...
Но почему там бы не сделать что то типа такого
а потом просто посылать команды в чат, и обрабатывать их
Код:
// str - команда полученная например в приват
while(str!="") // пока строка не пустая...
{
int l = str.IndexOf(','); // позиция первой ','
if(l==-1) l = str.Length; // если нету ','
buf = command[int.Parse(str.Substring(0, l))]; // получение команды по ее номеру
SendToServerEx(<че тут писать то хоть?>);
// и че то типа задержки тут надо наверное...
str.Remove(0, l); // удаление выполненной команды из строки
}
2. Любую команду можно записать аналогично вот этому b1='2F 10 04 00 00 00 00 00 00 00'?
или это токо скилы так?
3. Можно ли как то запускать готовые макросы(игровые)?
Например сделать макрос типа "delay n"/"target ***"/"assist" и тому подобные, и использовать такой макрос забив его в массив команд, так же как и скилы?
Хотя я почти уверен что нельзя... Это же клиент вроде как макрос выполняет а не сервер, так?
Можно ли как то из скрипта использовать встроенные переменные типа %self, %target, %partyN?
Короче пока сам толком не понял чего хочу, но если все это довести до ума, то такой скрипт можно будет подогнать почти под любые нужды, просто добавив команды и в самом клиенте сдалать макросы типа "имя_бафера 1,2,7,10,15 - где цифры это собственно и есть сами команды
друзья нужна помощ!
нужно написать скрипт купли-продажи
вот как изменить усе айтем чтоб в пакет дописывалис обджек иди (98штук) я не знаю(
а вопше пакет выглядит так
В дополнение к скрипту "кач дракона" выкладываю "ботика".
Возможности скрипта: Сам атакует, сам подбирает дроп относительно выбранного нами центра.
Внесены изменения для отличия игроков от мобов, работает в случае если игрок прибежал из-за границы видимости. Если он рядом то бот принимает его за цель. Атаковать не будет, так как не зажат контрол.
Все сообщения по SAY можно закомментить, они только для отладки скрипта. Скрипт в процессе разработки.
Изменяем константы: Name, Pet, Radius, DeltaZ, по желанию max. Для инициализации скрипта надо получить пакет UserInfo(04). Как пример: открыть инвентарь, напасть на моба. Включить работу скрипта соц.действие Yes. Остановить No.
Спасибо Ворону за его "Локомотив"!
Код:
//БОТ with 'Hachling of Star' by NLObP
//******************************************************************************
Const
Name='NLObP'; //имя чара
Pet=''; //имя Пета
max=50; //max количество контролируемых мобов
Radius=1500; //радиус участка для поиска мобов
DeltaZ=250; //глубина/высота до мобов
//******************************************************************************
VAR
NameChar: string;
CentrKachX,CentrKachY,RadiusKachX,RadiusKachY, CharID, PetID, Attacker, ObjectID: integer;
CentrKachXex,CentrKachYex,RadiusKachXex,RadiusKachYex: extended;
tempX,tempY, tempLenght: extended;
tempZ: integer;
ColvoMobs, ColvoMobs2: integer;
CurHP, MaxHP, CurMP, MaxMP, time1 :integer;
BotCoordX,BotCoordY,BotCoordZ: integer; //координаты бота
BotCoordXext,BotCoordYext,BotCoordZext:extended;
MinPutID: integer; //указывает индекс моба в базе путь до которого самый короткий
MinPutLenght: extended; //квадрат расстояния до ближайшего моба
timer1: TTimer; //основной таймер
timer2: TTimer; //вспомогательный
i, itm, SocialID:integer; // вспомогательная
AddMob, UnderAttack, scrready: boolean;
NeedBackup:boolean;
ItemBase: array[1..4,1..max] of integer; // описатель предметов
CharBase: array[1..4,1..max] of integer; // описатель игроков (которых не атакуем)
MobBase: array[1..4,1..max] of integer; // описатель мобов вокруг
MobBaseExt: array[1..4,1..max] of extended; // описатель мобов вокруг вспомогательная
{
1 - ID
2 - X
3 - Y
4 - Z
5 - Attakable //агрессивные?
}
//******************************************************************************
procedure Init; //Вызывается при включении скрипта
begin
UnderAttack:=false;
itm:=0;
NeedBackup:=false;
scrready:=false;
colvomobs:=0;
colvomobs2:=0;
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1; //
timer1.enabled:=False; //
timer1.interval:=2000;
timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=false; //
timer2.interval:=15000;
end;
//******************************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free;
timer2.Free;
end;
//******************************************************************************
//для отладки скрипта
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//*******************************************************************
function Wait(var tick:integer; Timewait: Integer): Boolean;
// сквозная проверка без остановки скрипта (c)dmitry501
// modifed by Sh00rGo
var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait/1000) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;
//******************************************************************************
procedure OnTimer2(Sender: TObject);
begin
//say('Вышло время');
UnderAttack:=false; //отцепимся от атакуемого
if itm>0 then needbackup:=true;
end;
//******************************************************************************
procedure ReqGetItem;
begin
if itm=0 then begin
timer1.enabled:=true; //включаем отсчет времени
needbackup:=false;
exit;
end;
timer1.enabled:=false; //выключаем отсчет времени
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]<>0) then begin //ObjectID
say('ReqGetItem');
//даем команду подобрать вещь
buf:=#$04;
WriteD(ItemBase[1,i]);
WriteD(ItemBase[2,i]);
WriteD(ItemBase[3,i]);
WriteD(ItemBase[4,i]);
WriteH(00);
SendToServerEx(Name);
end;
end;
end;
//******************************************************************************
procedure OnTimer1(Sender: TObject);
begin
if UnderAttack then begin
TargetAttacker(Attacker);
exit;
end;
//say('Вычисляем ближайшего');
MinPutID:=0;
MinPutLenght:=99999999;
///ищем самого близково к нам моба
for i:=1 to max do begin
if (MobBaseExt[1,i]<>0) then begin
tempX:=MobBaseExt[2,i];
tempY:=MobBaseExt[3,i];
//теорема Пифагора c^2=a^2+b^2
tempLenght:=int(sqrt((BotCoordXext-tempx)*(BotCoordXext-tempx)+(BotCoordYext-tempy)*(BotCoordYext-tempy)));
if (tempLenght<MinPutLenght) and (PetID<>MobBase[1,i]) and (CharID<>MobBase[1,i]) then begin
MinPutLenght:=tempLenght;
MinPutID:=i;
//say('MinPutID='+inttostr(MinPutID)+' MinPutLenght='+Floattostr(MinPutLenght));
end;
end;
end;
say('MinPutID='+inttostr(MinPutID)+' MinPutLenght='+Floattostr(MinPutLenght));
if (minputid<>0) then begin
Attacker:=MobBase[1,MinPutID];
TargetAttacker(Attacker);
say('Attack!');
UnderAttack:=true; //зацепимся за атакуемого
end;
end;
//******************************************************************************
procedure TargetAtt;
begin
buf:=#$04;
WriteD(Attacker);
WriteD(BotCoordX);
WriteD(BotCoordY);
WriteD(BotCoordZ);
WriteC(00);
SendToServerEx(Name);
end;
//******************************************************************************
procedure TargetAttacker(Attacker: Integer);
begin
TargetAtt;
TargetAtt;
end;
//******************************************************************************
// вызывается при приходе каждого пакета если скрипт включен
//******************************************************************************
begin
//****************************************************************************
if pck='' then exit;
//****************************************************************************
//NPCInfo, запоминаем мобов
if FromServer and (ConnectName=Name) and (pck[1]=#$16) then begin
AddMob:=true;
//проверка, входит моб в радиус действия?
tempX:=ReadD(14); //x
tempY:=ReadD(18); //y
tempLenght:=sqrt((CentrKachXex-tempX)*(CentrKachXex-tempX)+(CentrKachYex-tempY)*(CentrKachYex-tempY));
//say('tempX='+Floattostr(tempX)+' tempY='+Floattostr(int(tempY)));
//say('Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
tempZ:=BotCoordZ-ReadD(22);
if tempz<0 then tempZ:=tempz*(-1);
//say('TempZ='+inttostr(tempz));
//say('BotCoordZ='+inttostr(BotCoordZ));
//say('MobCoordZ='+inttostr(readd(22)));
if tempZ<=DeltaZ then begin
if (tempLenght<Radius) then begin
for i:=1 to max do begin
//если нашли Моба в базе, то коректируем его координаты на новые
if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
MobBase[2,i]:=ReadD(14); //x
MobBase[3,i]:=ReadD(18); //y
MobBase[4,i]:=ReadD(22); //z
//Ext массив
MobBaseExt[2,i]:=ReadD(14); //x
MobBaseExt[3,i]:=ReadD(18); //y
MobBaseExt[4,i]:=ReadD(22); //z
AddMob:=false;
//say('Корректируем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
//say('Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
//запоминаем моба в свободную ячейку
MobBase[1,i]:=ReadD(2); //ObjectID
MobBase[2,i]:=ReadD(14); //x
MobBase[3,i]:=ReadD(18); //y
MobBase[4,i]:=ReadD(22); //z
//Ext массив
MobBaseExt[1,i]:=ReadD(2); //ObjectID
MobBaseExt[2,i]:=ReadD(14); //x
MobBaseExt[3,i]:=ReadD(18); //y
MobBaseExt[4,i]:=ReadD(22); //z
inc(colvomobs);
say('Запоминаем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
//say('Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
break;
end;
end;
end;
end;
end;
//****************************************************************************
//CharInfo, запоминаем мобов
if FromServer and (ConnectName=Name) and (pck[1]=#$03) then begin
AddMob:=true;
for i:=1 to max do begin
//если нашли Моба в базе, то коректируем его координаты на новые
if (CharBase[1,i]=ReadD(18)) then begin
CharBase[2,i]:=ReadD(2); //x
CharBase[3,i]:=ReadD(6); //y
CharBase[4,i]:=ReadD(10); //z
AddMob:=false;
//say('Корректируем координаты Игрока');
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (CharBase[1,i]=0) and AddMob then begin
//запоминаем моба в свободную ячейку
CharBase[1,i]:=ReadD(18); //ObjectID
CharBase[2,i]:=ReadD(2); //x
CharBase[3,i]:=ReadD(6); //y
CharBase[4,i]:=ReadD(10); //z
NameChar:=ReadS(22);
say('Приближается Игрок '+NameChar+'!!!');
break;
end;
end;
end;
//****************************************************************************
//MoveToLocation, коректируем координаты мобов в базе
if FromServer and (ConnectName=Name) and (pck[1]=#$01) then begin
//say('MoveToLocation');
AddMob:=true;
//проверка, входит моб в радиус действия?
tempX:=ReadD(6); //x
tempY:=ReadD(10); //y
tempLenght:=sqrt((CentrKachXex-tempX)*(CentrKachXex-tempX)+(CentrKachYex-tempY)*(CentrKachYex-tempY));
//say('CentrKachXex='+Floattostr(CentrKachXex)+' CentrKachYex='+Floattostr(CentrKachYex));
//say('tempX='+Floattostr(tempX)+' tempY='+Floattostr(tempY));
//say('Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(tempLenght));
tempZ:=BotCoordZ-ReadD(14);
if tempz<0 then tempZ:=tempz*(-1);
//say('TempZ='+inttostr(tempz));
//say('BotCoordZ='+inttostr(BotCoordZ));
//say('MobCoordZ='+inttostr(readd(14)));
if tempZ<=DeltaZ then begin
if (int(tempLenght)<Radius) then begin
//say('Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
//перебираем базу и ищем там моба который бежит
for i:=1 to max do begin
//если нашли Моба в базе, то коректируем его координаты на новые
if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) and (CharBase[1,i]<>ReadD(2)) then begin //ObjectID
MobBase[2,i]:=ReadD(6); //x
MobBase[3,i]:=ReadD(10); //y
MobBase[4,i]:=ReadD(14); //z
//Ext массив
MobBaseExt[2,i]:=ReadD(6); //x
MobBaseExt[3,i]:=ReadD(10); //y
MobBaseExt[4,i]:=ReadD(14); //z
//say('Корректируем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
//say('>Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
//запоминаем моба в свободную ячейку
MobBase[1,i]:=ReadD(2); //ObjectID
MobBase[2,i]:=ReadD(6); //x
MobBase[3,i]:=ReadD(10); //y
MobBase[4,i]:=ReadD(14); //z
//Ext массив
MobBaseExt[1,i]:=ReadD(2); //ObjectID
MobBaseExt[2,i]:=ReadD(6); //x
MobBaseExt[3,i]:=ReadD(10); //y
MobBaseExt[4,i]:=ReadD(14); //z
inc(colvomobs);
//colvomobs:=colvomobs+1;
say('Запоминаем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
//say('>Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
break;
end;
end;
end;
end;
end;
//****************************************************************************
//MagicSkillUse 48, Attack 05
if FromServer and (ConnectName=Name) and ((pck[1]=#$48) or (pck[1]=#$05)) then begin
if UnderAttack then exit; //сначало убъем одного
Attacker:=ReadD(2);
ObjectID:=ReadD(6);
if (Attacker<>ObjectID) and (CharID=ObjectID) then begin
UnderAttack:=true; //нас атакуют
needbackup:=false;
Say('Нас атакуют!');
TargetAttacker(Attacker);
end;
end;
//****************************************************************************
//если принят пакет Die
if FromServer and (ConnectName=Name) and (pck[1]=#$06) then begin
//ищем моба в базе
if (Attacker=ReadD(2)) then begin
UnderAttack:=false; //убили атакующего моба
//say('UnderAttack=false');
timer2.enabled:=true; //включаем отсчет времени
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
dec(colvomobs);
//say('Удаляем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
MobBase[1,i]:=0; //ObjectID
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0;
MobBaseExt[2,i]:=0;
MobBaseExt[3,i]:=0;
MobBaseExt[4,i]:=0;
break;
end;
end;
end;
//****************************************************************************
//если принят пакет DeleteObject
if FromServer and (ConnectName=Name) and (pck[1]=#$12) then begin
//ищем моба в базе
//say('DeleteObject');
if (Attacker=ReadD(2)) then begin
UnderAttack:=false; //убили атакующего моба
//say('UnderAttack=false');
timer2.enabled:=true; //включаем отсчет времени
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
//say('Удаляем координаты Моба');
dec(colvomobs);
//say('Удаляем координаты Моба'+' colvomobs='+inttostr(colvomobs));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
MobBase[1,i]:=0; //ObjectID
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0;
MobBaseExt[2,i]:=0;
MobBaseExt[3,i]:=0;
MobBaseExt[4,i]:=0;
break;
end;
end;
for i:=1 to max do begin
//если нашли в базе, то удаляем
if (CharBase[1,i]=ReadD(2)) then begin
CharBase[2,i]:=0; //x
CharBase[3,i]:=0; //y
CharBase[4,i]:=0; //z
//say('Удаляем координаты Игрока');
end;
end;
end;
//****************************************************************************
//ValidatePosition если принят пакет от клиента с моими кординатами то
if FromClient and (ConnectName=Name) and (pck[1]=#$48) then begin
//запоминаем мои координаты
BotCoordX:=ReadD(2);
BotCoordY:=ReadD(6);
BotCoordZ:=ReadD(10);
//ext
BotCoordXext:=ReadD(2);
BotCoordYext:=ReadD(6);
BotCoordZext:=ReadD(10);
//say('Запоминаем координаты Бота');
//say('Бот X='+inttostr(BotCoordX)+' Y='+inttostr(BotCoordY)+' Z='+inttostr(BotCoordZ));
//say('Бот Xext='+floattostr(BotCoordXext)+' Yext='+floattostr(BotCoordYext)+' Zext='+floattostr(BotCoordZext));
end;
//****************************************************************************
//если от сервака принят пакет с ИД и Координатами членов пати то
if FromServer and (ConnectName=Name) and (pck[1]=#$a7) then begin
//запоминаем ИД командира
CharID:=ReadD(6);
if scrready then exit
else begin
Say('Скрипт готов к работе. Запомнил ИД лидера');
scrready:=true;
end;
end;
//****************************************************************************
//если от сервака принят пакет с UserInfo
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then begin
//Запоминаем собственный ИД
CharID:=ReadD(18);
if scrready then exit
else begin
Say('Скрипт готов к работе. Запомнил ИД лидера');
scrready:=true;
end;
end;
//****************************************************************************
//если от сервака принят пакет с PetInfo
if FromServer and (PetID=0) and (ConnectName=Name) and (pck[1]=#$b1) then PetID:=ReadD(6);
//****************************************************************************
//DropItem - выпала вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0C) then begin
//чужие вещи не берем
if (Attacker=ReadD(2)) then begin
timer1.enabled:=false; //выключаем бота
AddMob:=true;
//перебираем базу
for i:=1 to max do begin
//если нашли, то корректируем его координаты на новые
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
AddMob:=false;
inc(itm);
NeedBackup:=true;
say('Корректируем данные по предмету');
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(6); //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
inc(itm);
NeedBackup:=true;
say('Добавили данные по предмету');
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;
//****************************************************************************
//Пока отключил. Бежит сломя голову за тридевять земель, не обращая внимания что лежит рядом.
//To Do: Сделать проверку на расстояние.
//SpawnItem - выляется вещь
{if FromServer and (ConnectName=Name) and (pck[1]=#$0B) then begin
timer1.enabled:=false; //выключаем бота
AddMob:=true;
//перебираем базу
for i:=1 to max do begin
//если нашли, то корректируем его координаты на новые
if (ItemBase[1,i]=ReadD(2)) then begin //ObjectID
ItemBase[2,i]:=ReadD(10); //x
ItemBase[3,i]:=ReadD(14); //y
ItemBase[4,i]:=ReadD(18); //z
AddMob:=false;
inc(itm);
NeedBackup:=true;
say('Корректируем данные по предмету');
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) and AddMob then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(2); //ObjectID
ItemBase[2,i]:=ReadD(10); //x
ItemBase[3,i]:=ReadD(14); //y
ItemBase[4,i]:=ReadD(18); //z
inc(itm);
NeedBackup:=true;
say('Добавили данные по предмету');
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;}
//****************************************************************************
if Wait(time1,2000) and NeedBackup and (underAttack=false) then ReqGetItem;
//****************************************************************************
//определяем реальность поднятия вещи
//GetItem
if FromServer and (ConnectName=Name) and (pck[1]=#$0D) then begin
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[1,i]:=0; //x
ItemBase[2,i]:=0; //x
ItemBase[3,i]:=0; //y
ItemBase[4,i]:=0; //z
dec(itm);
//say('Удаляем данные по предмету');
end;
end;
if itm=0 then begin
needbackup:=false;
timer1.enabled:=true;
end;
say('ColvoItm='+inttostr(itm));
end;
//****************************************************************************
if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
SocialID:=ReadD(2);
case SocialID of
//социальное действие Yes для начала
6: begin
//if CharID=0 then exit;
CentrKachX:=BotCoordX;
CentrKachY:=BotCoordY;
CentrKachXex:=BotCoordXext;
CentrKachYex:=BotCoordYext;
//say('Получили координаты центра');
say('X='+inttostr(BotCoordX)+' Y='+inttostr(BotCoordY));
timer1.enabled:=true;
Say('Команда Старт!!!');
exit;
end;
//социальное действие No для окончания
5: begin
//if CharID=0 then exit;
timer1.enabled:=false;
Say('Команда Стоп!!!');
exit;
end;
end;
end;
end.
фак... ппц ... респект!!!! слов нет :) ждём продолжения
Добавлено спустя 7 минут 55 секунд:
Re:
Цитата:
Сообщение от DeVolf
друзья нужна помощ!
нужно написать скрипт купли-продажи
вот как изменить усе айтем чтоб в пакет дописывалис обджек иди (98штук) я не знаю(
а вопше пакет выглядит так
да что та есть похожие) но увы ...)
так что мне некто не может помоч?
В чем помоч-то?
Добавлено спустя 59 минут 57 секунд:
Re: ДА БУДЕТ БОТ!
Немного подправил скрипт Бота.
Внес изменения в кач дракона, чтобы он мог атаковать и без маны.
Код:
//автоматический кач 'Hatchling of the Stars' by NLObP
//******************************************************************************
// Для работы скрипта:
// 1 - Саммоним дракона
// 2 - кладем ему еду
//******************************************************************************
// На автомате, при нападении хозяина на моба дракон автоматически ассистит
// при необходимости лечит себя, после боя следует за хозяином.
//******************************************************************************
//******************************************************************************
// константы и переменные скрипта
//******************************************************************************
const
Owner='NLObP'; //ник перса хозяина
Pet=''; //имя Пета
var
OwnerID, PetID, TargetID : Integer; //ИД хозяина, пета, ИД таргета
CoordX, CoordY, CoordZ : String; //координаты пета
Cmd :String; //команда пету
CurHP, MaxHP, CurMP, MaxMP, i : Integer;
tick: Integer;
timerA: TTimer;
timerB: TTimer;
timerHP: TTimer;
MagicAtck:boolean;
//******************************************************************************
// Подпрограммы
//******************************************************************************
//(c)dmitry501
//если ставить sleep() то скрипт останавливается на время, но и пакеты тоже
//не принимаются и не отправляются, так вот эта функция позваляет избежать этого
function Pause(Timewait: Integer):Boolean;
// сквозная проверка без остановки скрипта
var
t : integer;
begin
result:=false;
t:= Round(Time*86400);
if t>(tick+Timewait) then
begin
tick:=t;
result:=true;
end;
end;
//все сообщения ботов в приватном чате патилидера
//видны только нам
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(ConnectName);
WriteS(msg);
SendToClientEx(Owner);
end;
procedure OnTimerA(Sender: TObject);
begin
//пакет RequestActionUse;
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
//Say('магическая атака пета');
end;
procedure OnTimerB(Sender: TObject);
begin
//пакет RequestActionUse;
buf:=hstr('45 10 00 00 00 00 00 00 00 00'); //атака пета
SendToServerEX(Owner);
end;
procedure OnTimerHP(Sender: TObject);
begin
buf:=hstr('45 EE 03 00 00 00 00 00 00 00'); //пет лечиться
SendToServerEX(Owner);
end;
//******************************************************************************
// Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
MagicAtck:=true; //магическая атака
OwnerID:=0;
PetID:=0;
timerA:=TTimer.Create(nil);
timerA.OnTimer:=@OnTimerA;
timerA.enabled:=false;
timerA.interval:=5000; //время отката магии пета
timerB:=TTimer.Create(nil);
timerB.OnTimer:=@OnTimerB;
timerB.enabled:=false;
timerB.interval:=5000; //время отката
timerHP:=TTimer.Create(nil);
timerHP.OnTimer:=@OnTimerHP;
timerHP.enabled:=false;
timerHP.interval:=2000; //время отката лечения пета
end;
//******************************************************************************
// Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
timerA.Free;
timerB.Free;
timerHP.Free;
end;
//******************************************************************************
// Вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//не обрабатываем пустые пакеты
if pck='' then exit;
//если от сервака принят пакет с UserInfo
if FromServer and (OwnerID=0) and (ConnectName=Owner) and (pck[1]=#$04) then begin
//Запоминаем собственный ИД
OwnerID:=ReadD(18);
Say('Скрипт готов к работе!');
end;
//пакет Attack
//атаковать, если хозяин напал на цель
if FromServer and (ConnectName=Owner) and (pck[1]=#$05) and (OwnerID=ReadD(2)) then begin
if (TargetID<>0) and (OwnerID<>TargetID) then begin
if magicatck then begin
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
Say('Атакую магией!');
TimerA.enabled:=true;
TimerB.enabled:=false;
//Say('Включили таймер');
end
else begin
Say('Атакую цель!');
TimerB.enabled:=true;
TimerA.enabled:=false;
end;
end;
end;
//пакет MagicSkillUse
//атаковать, если хозяин напал на цель магией
if FromServer and (ConnectName=Owner) and (pck[1]=#$48) and (OwnerID=ReadD(2)) then begin
if (TargetID<>0) and (OwnerID<>TargetID) then begin
if magicatck then begin
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
Say('Атакую магией!');
TimerA.enabled:=true;
TimerB.enabled:=false;
//Say('Включили таймер');
end
else begin
Say('Атакую цель!');
TimerB.enabled:=true;
TimerA.enabled:=false;
end;
end;
end;
//пакет TargetSelect
//если принят пакет со сменой таргета
if FromServer and (ConnectName=Owner) and (pck[1]=#$a6) then begin
//запоминаем ИД таргета для ассиста
TargetID:=ReadD(2);
//Say('Это ИД таргета.');
end;
//пакет TargetUnselected
//командир отменил цель
if FromServer and (ConnectName=Owner) and (pck[1]=#$2a) and (OwnerID=ReadD(2)) then begin
TargetID:=0;
buf:=hstr('45 11 00 00 00 00 00 00 00 00'); //stop current action
SendToServerEX(Owner);
//Say('Стоп!');
TimerA.enabled:=false;
TimerB.enabled:=false;
//Say('Выключили таймер');
end;
//если от сервака принят пакет с PetInfo
if FromServer and (PetID=0) and (ConnectName=Owner) and (pck[1]=#$b1) then begin
//Запоминаем ИД пета
PetID:=ReadD(6);
//смещение переменное, зависит от имени Пета(LenName*2+2) и имени Чара(LenName*2+2)
//126 байт до имени Пета(LenName*2+2) и имени Чара(LenName*2+2) после 20 байт (+1 начало CurHP)
i:=126+(Length(Pet)*2+2)+(Length(Owner)*2+2)+20+1;
CurHP:=ReadD(i);
MaxHP:=ReadD(i);
CurMP:=ReadD(i);
MaxMP:=ReadD(i);
if (CurHP<MaxHP)
then TimerHP.enabled:=true
else TimerHP.enabled:=false;
if (CurMP<MaxMP/2) then MagicAtck:=false else MagicAtck:=true; //магическая атака
end;
//пакет PetStatusUpdate
//проверяем на жизнь пета
if FromServer and (ConnectName=Owner) and (pck[1]=#$b5) and (PetID=ReadD(6)) then begin
//смещение переменное, зависит от имени Пета(LenName*2+2)
//21 байт до имени Пета(LenName*2+2) после 8 байт (+1 начало CurHP)
i:=21+(Length(Pet)*2+2)+8+1;
CurHP:=ReadD(i);
MaxHP:=ReadD(i);
CurMP:=ReadD(i);
MaxMP:=ReadD(i);
//Say('Считываем параметры пета');
if (CurHP<MaxHP)
then TimerHP.enabled:=true
else TimerHP.enabled:=false;
if (CurMP<MaxMP/2) then MagicAtck:=false else MagicAtck:=true; //магическая атака
end;
end.