с карденатай ето я случяйно ашибся када переписывал....там в чёмто другом праблема:(
Может близко стоять надо?
я разабрался в чём там праблема.....там кагда хп моба=0 вылетают паакеты нескалько из каторых дроп айтим причём они идут падрят с интервалам в t причём t стремиться к нулю и t> чем время обработки скрипта вобшем праблема в движке он запускает скрипт для первого пакета а, пака скрипт выпалняеться приходят несколко других пакетав.Вот и палучяеться что кагда скрипт атправляет пакет паднять кол-во пришедших на клиент паетав дроп айтим>1ого,но следуйший абрабатываемый пакет это не тот пакет каторый был после 1ого дроп айтима а тот пакет каторый идёт за пакетам каторый атаслал скрипт.
Добавлено спустя 1 час 1 минуту 42 секунды:
Ёпт ^выше описано^ это глюк с скриптам сборшикам лута(каторый писал я ) :) но баг движка астаёться в силе:)
l2phx наезжает на строчку в этой строке:
ListCount:=ReadH(j); //количество итемов не должно превышать max!
И что это значит?это он выделяет когда ещё неподключился к клиенту,а когда подключается,то постоянно выдаёт ошибки
У тебя какие хроники? Для С4 и Интерлюдии отличается скрипт.
Скопируй в свой скрипт взамен своего, и расскоментируй нужную часть, закоменти ненужную:
Код:
procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
var
i, ss, ww, j, ObjID, ItemID, lvl, ListCount: integer;
begin
ss:=1; //индекс в массиве скроллов
ww:=1; //индекс в массиве предметов
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов не должно превышать значение в константе max!
if ListCount>max then ListCount:=max; //если больше, то игнорируем и используем значение из max!
j:=8; //смещение для ObjectID
//Пробегаем по Инвентарю и сохраняем ObjectID соответствующие необходимым ItemID
for i:=1 to ListCount do begin
ObjID:=ReadD(j); //ObjectID
ItemID:=ReadD(j); //ItemID
j:=j+14;
Lvl:=ReadD(j); //Level
case ItemID of
scroll: begin
ScrlBase[ss]:=ObjID;
inc(ss);
end;
weapon: begin
WpnBase[1,ww]:=ObjID;
WpnBase[2,ww]:=lvl;
inc(ww);
end;
end;
//для С4
j:=j+2;
//для Интерлюдии
//j:=j+10;
end;
dec(ColvoWpn);
dec(ColvoScrl);
end;
Замени у себя еще проедуру INIT на эту, здесь сразу запрашивается список предметов:
Код:
procedure Init; //Вызывается при включении скрипта
var
i:integer;
begin
CurEnchLvl:=0;
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimerHP;
timer.enabled:=false;
timer.interval:=5000; //время задержки
add:=false;
//RequestItemList запрашиваем пакет списка предметов
buf:=hstr('0F');
SendToServerEx(Name);
end;
Добавлено спустя 17 минут 25 секунд:
Цитата:
Сообщение от Druids
l2phx наезжает на строчку в этой строке:
ListCount:=ReadH(j); //количество итемов не должно превышать max!
И что это значит?это он выделяет когда ещё неподключился к клиенту,а когда подключается,то постоянно выдаёт ошибки
Не забудь поправить под себя вот эти константы:
Код:
const
Name='NLObP'; //заменить на имя своего чара
Scroll=957; // чем будем точить, например 957 - ItemID Crystall Scroll Enchant Weapon (Grade D)
Weapon=129; //что будем точить, например 129 - ItemID Sword of Revolution
MaxEnchLvl=21; //поставить максимальный желаемый уровень заточки, не факт что доточится =)
Добавлено спустя 7 минут 56 секунд:
Re: Re:
Цитата:
Сообщение от PunkRediska
я разабрался в чём там праблема.....там кагда хп моба=0 вылетают паакеты нескалько из каторых дроп айтим причём они идут падрят с интервалам в t причём t стремиться к нулю и t> чем время обработки скрипта вобшем праблема в движке он запускает скрипт для первого пакета а, пака скрипт выпалняеться приходят несколко других пакетав.Вот и палучяеться что кагда скрипт атправляет пакет паднять кол-во пришедших на клиент паетав дроп айтим>1ого,но следуйший абрабатываемый пакет это не тот пакет каторый был после 1ого дроп айтима а тот пакет каторый идёт за пакетам каторый атаслал скрипт.
Все верно пишешь. Только надо учесть, что сама прога успевает посмотреть все пакеты, так как она их шифрует/дешифрует. Не успевает клиент за скриптом. Для этого пакетики мы в базу складываем, а потом заставляем клиента все пакетики исполнить. У меня лично, все предметы собирает, но бывает и подглючивает.
я разабрался в чём там праблема.....там кагда хп моба=0 вылетают паакеты нескалько из каторых дроп айтим причём они идут падрят с интервалам в t причём t стремиться к нулю и t> чем время обработки скрипта вобшем праблема в движке он запускает скрипт для первого пакета а, пака скрипт выпалняеться приходят несколко других пакетав.Вот и палучяеться что кагда скрипт атправляет пакет паднять кол-во пришедших на клиент паетав дроп айтим>1ого,но следуйший абрабатываемый пакет это не тот пакет каторый был после 1ого дроп айтима а тот пакет каторый идёт за пакетам каторый атаслал скрипт.
Все верно пишешь. Только надо учесть, что сама прога успевает посмотреть все пакеты, так как она их шифрует/дешифрует. Не успевает клиент за скриптом. Для этого пакетики мы в базу складываем, а потом заставляем клиента все пакетики исполнить. У меня лично, все предметы собирает, но бывает и подглючивает.
тоесть шёчики в скриптах ка4 с драконьчекам,лакаматив и т.д. нужны что бы все каманды выпалнялись клиентам своевременно?Я чесно гаваря плохо панемаю как именно пашют эти скрипты так-как там дофига процедур и функций , а их работу я панемаю в обших чертах,тоесть я панемаю как пашет процедура панемаю зачем она ,но писать их неумею и ненаю как они вызываються:)
Добавлено спустя 19 минут 56 секунд:
слушай NLObP я канешно читаю правила форума 4 раза на день,но всё таки памаги пожжалуйсто с такой ситуацией:
я нашол место где стаит 3 яшика рядам и сразу захател написать скрипт бот,но так как я незнаю как описывать процедуры решил писать систему скриптав каторые работая одновременно заменяли 1 нармальный скрипт вот они->
1.открывалка
var i:integer;
begin
if FromServer and (pck[1]=#$16) then begin
buf:=#$04+hstr('(readd(2))+(readd(14))+(readd(18)) +(readd(22))') + #$00;
SendToServer;
buf:=hstr('04 C2 B9 1E 10 A3 55 01 00 C3 46 01 00 09 F4 FF FF 00 ');
SendToServer; SendToServer;
i:=1;
end;
buf:=hstr('04 3D 97 1E 10 D5 55 01 00 3B 46 01 00 F8 F3 FF FF 00');
SendToServer;
end.
2.если чест огрызаеться
begin
if fromserver and (pck[1]=#$05) then begin
buf:=#$04+hstr('(readd(6))+(readd(15))+(readd(19)) +(readd(23))')+#$00#$00;
SendToServer;
buf:=hstr('2F 07 01 00 00 00 00 00 00 00 ');
SendToServer;
end;
end.
3.сабрать лут
var
I,a:integer; s,r:string;
begin
if FromServer and (pck[1]=#$0C)
then begin
buf:=#$04+pck[6]+pck[7]+pck[8]+pck[9]+pck[14]+pck[15]+pck[16]+pck[17]+pck[18]+pck[19]+pck[20]+pck[21]+pck[22]+pck[23]+pck[24]+pck[25]+#$00;
SendToServer;
end;end.
суть скриптав ясна,вскрывать бокс ,если чест то кил чест, и саберать лут в обоих случаях.естественно написал спамагательные скрипты :жрать хп,ультима,тест на наличее рядам чара(если чар то сесть на прадажу д армор точки за-500к с надписью "афк на долго";
эти скрипты я писал буквально час ,а с их некаректной работай не магу справиться чясами.NLObP памаги мне пажжалусто малини скрипт каторый их бы заменял пожалуйсто,а то я уже за-и-пался и за флудился ппц!:)кста если решишся памочь,то мож сможеш и вспамагательные скрипты в 1 сабрать?:)
P.S. серв интерлюдия, ява:(
вся фишка чтоб передать ID таргета самонеру через пакетхак,а не через сервер. просто тупой ассист не катит. по твоему куску не видно откуда берется IDAssistTarget.
Добавлено спустя 2 минуты 46 секунд:
даже добавлю что IDAssistTarget надо брать из пакетов клиента командира (а не пакетов сервера).
ID таргета суммонеру никак не передашь.
Управление суммоном идет пакетом RequestActionUse. Суммон аттакует цель в таргете у хозяина, таргет должен быть в зоне видимости. Да и если цель есть в таргете у хозяина, но находится далеко - суммон не идет ее бить.
Соответственно все разговоры о каче с суммонами идут прахом.
вся фишка чтоб передать ID таргета самонеру через пакетхак,а не через сервер. просто тупой ассист не катит. по твоему куску не видно откуда берется IDAssistTarget.
Добавлено спустя 2 минуты 46 секунд:
даже добавлю что IDAssistTarget надо брать из пакетов клиента командира (а не пакетов сервера).
ID таргета суммонеру никак не передашь.
Управление суммоном идет пакетом RequestActionUse. Суммон аттакует цель в таргете у хозяина, таргет должен быть в зоне видимости. Да и если цель есть в таргете у хозяина, но находится далеко - суммон не идет ее бить.
Соответственно все разговоры о каче с суммонами идут прахом.
ты не прав, то что сумон атакует цель которая находится в таргете хозяина это все работа клиента, а пакет атаки сумона прост - тупо ИД таргета и его координаты, и пофиг где хозяин. А ид моба и его координаты мы берем от коммандира.
Я со своим скриптом уводил на кач сумона за пол карты от его хозяина
Скрипт на бота-мага. Бьет магией, отбегает, подбирает выпавшие предметы.
Можно совместно качать 'Hachling of Star'
Код:
//Бот_маг with 'Hachling of Star' by NLObP
{
Социальное действие YES включить
Социальное действие NO выключить
Скрипт распространяется как есть, и я не несу ответственности за то, что
ВЫ натворили у себя, его используя.
}
//******************************************************************************
Const
Name='NLObP'; //имя чара
Pet=''; //имя Пета
max=500; //max количество контролируемых мобов
Radius=1500; //радиус участка для поиска мобов
DeltaZ=250; //глубина/высота до мобов
Distance=600; //дистанция до моба
icebolt=1184; //ice bolt
windstrike=1177; //Wind Strike
//******************************************************************************
VAR
NameChar: string;
CharID, PetID, Attacker, ObjectID: integer;
CentrKachX,CentrKachY,CentrKachZ,RadiusKachX,RadiusKachY: integer;
CentrKachXex,CentrKachYex,RadiusKachXex,RadiusKachYex: extended;
tempX,tempY, tempLenght: extended;
tempZ, ColvoMobs: integer;
xe,ye: extended;
x,y,z,ox,oy,oz,n: integer;
MobCurHP, MobMaxHP, CurHP, MaxHP, CurMP, MaxMP: integer;
BotCoordX,BotCoordY,BotCoordZ: integer; //координаты бота
BotCoordXext,BotCoordYext,BotCoordZext:extended;
MinPutID: integer; //указывает индекс моба в базе путь до которого самый короткий
MinPutLenght: extended; //расстояния до ближайшего моба
timer1: TTimer; //основной таймер
timer2: TTimer; //вспомогательный
timerA: TTimer; //вспомогательный
i, itm, SocialID: integer; // вспомогательная
time1, time2: integer;
AddMob, UnderAttack, scrready, NeedBackup, fire: 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}
//******************************************************************************
procedure Init; //Вызывается при включении скрипта
begin
UnderAttack:=false;
itm:=0;
NeedBackup:=false;
scrready:=false;
colvomobs:=0;
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1;
timer1.enabled:=False;
timer1.interval:=1500; //каждые 2 сек ищем ближайшего моба для атаки
timerA:=TTimer.Create(nil);
timerA.OnTimer:=@OnTimerA;
timerA.enabled:=False;
timerA.interval:=1500; //каждые 2 сек магическая атака
timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=false;
timer2.interval:=5000;
//RequestItemList
buf:=hstr('0F');
SendToServerEx(Name);
end;
//******************************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free;
timer2.Free;
timerA.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) then begin
if tick>0 then result:=true;
tick:=t;
end;
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 OnTimer2(Sender: TObject);
begin
UnderAttack:=false; //отцепимся от атакуемого
if itm>0 then needbackup:=true;
end;
//******************************************************************************
//0E=StatusUpdate:h(ObjectID)d(AttribCount)d(AttrID)d(AttrValue)
procedure StatusUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do begin
case pck[i*8+10] of
#$09: MobCurHP:=ReadD(i*8+14);
#$0A: MobMaxHP:=ReadD(i*8+14);
end;
end;
if (MobCurHP<=0) then begin
underattack:=false;
say('Убили!');
end;
end;
//******************************************************************************
procedure OnTimer1(Sender: TObject);
begin
//не вычисляем, если уже атакуем
if UnderAttack then exit;
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;
end;
end;
end;
if (minputid<>0) then begin
Attacker:=MobBase[1,MinPutID];
TargetAttacker(Attacker);
say('Атакуем моба!');
end
else MoveCenter;
end;
//******************************************************************************
//01=MoveBackwardToLocation:d(targetX)d(targetY)d(targetZ)d(originX)d(originY)d(originZ)d(moveByMouse)
procedure MoveDistance;
begin
xe:=MobBase[2,MinPutID]+Distance/4+round(random*(Distance/4));
ye:=MobBase[3,MinPutID]+Distance/4+round(random*(Distance/4));
x:=round(xe);
y:=round(ye);
z:=MobBase[4,MinPutID];
buf:=#$01;
WriteD(x);
WriteD(y);
WriteD(z);
WriteD(BotCoordx);
WriteD(BotCoordy);
WriteD(BotCoordz);
WriteD(01);
SendToServerEx(Name);
say('держим дистанцию');
end;
procedure MoveCenter;
begin
buf:=#$01;
WriteD(CentrKachx);
WriteD(CentrKachy);
WriteD(CentrKachz);
WriteD(BotCoordx);
WriteD(BotCoordy);
WriteD(BotCoordz);
WriteD(01);
SendToServerEx(Name);
say('бежим в центр');
end;
//******************************************************************************
procedure TargetAtt;
begin
buf:=#$04;
WriteD(Attacker);
WriteD(BotCoordX);
WriteD(BotCoordY);
WriteD(BotCoordZ);
WriteC(00);
SendToServerEx(Name);
end;
//***************************************************************
//2F=RequestMagicSkillUse:h(MagicID)d(CtrlPressed)b(ShiftPressed)
procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$2F;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;
//******************************************************************************
procedure OnTimerA(Sender: TObject);
begin
MagicSkillUse(windstrike);
MoveDistance;
say('magic attack');
end;
//******************************************************************************
procedure TargetAttacker(Attacker: Integer);
begin
TargetAtt;
timerA.enabled:=true;
UnderAttack:=true; //зацепимся за атакуемого
end;
//******************************************************************************
// вызывается при приходе каждого пакета если скрипт включен
//******************************************************************************
begin
//****************************************************************************
//не пропускаем пустые пакеты
if pck='' then exit;
//****************************************************************************
//16=NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d(X)d(Y)d(Z)d(Heading)d(d)d(Maspd)d(Paspd)d(runSpd)d(walkSpd)d(swimRSpd)d(swimWSpd)d(flRSpd)d(flWSpd)d(FlyRSpd)d(FlyWSpd)f(ProperMul)f(Paspd)f(CollisRadius)f(CollisHeight)d(RHand)d(d)d(LHand)b(nameabove)b(isRun)b(isInFight)b(isAlikeDead)b(isSummoned)s(Name)s(Title)d(d)d(d)d(karma?)d(abnEffect)d(d)d(d)d(d)d(d)b(c)b(Team)f(collisRadius)f(collisHeight)d(d)
//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));
//проверям, не под землей ли моб(в катакомбах)
tempZ:=BotCoordZ-ReadD(22);
if tempz<0 then tempZ:=tempz*(-1);
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;
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));
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;
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;
for i:=1 to max do begin
//если нашли Чара в базе Мобов, то удаляем его
if (MobBase[1,i]=ReadD(18)) then begin
MobBase[1,i]:=0; //x
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0; //x
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
dec(colvomobs);
say('Нашли Чара в базе Мобов, удаляем его'+' ColvoMobs='+inttostr(colvomobs));
end;
end;
end;
//****************************************************************************
//MoveToLocation, коректируем координаты мобов в базе
if FromServer and (ConnectName=Name) and (pck[1]=#$01) then begin
AddMob:=true;
//проверка, входит моб в радиус действия?
tempX:=ReadD(6); //x
tempY:=ReadD(10); //y
tempLenght:=sqrt((CentrKachXex-tempX)*(CentrKachXex-tempX)+(CentrKachYex-tempY)*(CentrKachYex-tempY));
tempZ:=BotCoordZ-ReadD(14);
if tempz<0 then tempZ:=tempz*(-1);
if tempZ<=DeltaZ then begin
if (int(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)) 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
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);
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; //убили атакующего моба
timerA.enabled:=False;
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
dec(colvomobs);
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; //ObjectID
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
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; //убили атакующего моба
timerA.enabled:=False;
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
dec(colvomobs);
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; //ObjectID
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
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
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);
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;
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;
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;
//****************************************************************************
//каждые две сек подбираем предмет
if Wait(time1,2) 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;
//******************************************************************************
//StatusUpdate
if FromServer and (ConnectName=Name) and (pck[1]=#$0E) and (Attacker=ReadD(2)) then StatusUpdate;
//****************************************************************************
if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
SocialID:=ReadD(2);
pck:='';
case SocialID of
//социальное действие Yes для начала
6: begin
//if CharID=0 then exit;
CentrKachX:=BotCoordX;
CentrKachY:=BotCoordY;
CentrKachZ:=BotCoordZ;
CentrKachXex:=BotCoordXext;
CentrKachYex:=BotCoordYext;
Say('Команда Старт!!!');
say('Получили координаты центра');
say('X='+inttostr(BotCoordX)+' Y='+inttostr(BotCoordY));
timer1.enabled:=true;
exit;
end;
//социальное действие No для окончания
5: begin
//if CharID=0 then exit;
timer1.enabled:=false;
timer2.enabled:=false;
timerA.enabled:=False;
underattack:=false;
Say('Команда Стоп!!!');
exit;
end;
end;
end;
end.
Можете как-нибудь добавить в скрипт для автоматизации рыбалки несколько действий?
1)Если вылазиет моб и атакует (или у перса хп опускаеца ниже определенного уровня), то перц не начинает ловить рыбу а использует оружие (вручную вводится его ИД) и валит моба (или атакующего). Затем снова берет удочку и крючки и возобновляет рыбалку.
подскажите пожалуйста, как будет выглядеть скриптик для поднятия определенной вещи с земли(вещь заранее известна), какой командой это делается, а затем, чтоб подняло только что брошенную вещь. Заранее спасибо.
это для 1ной канкретной веши
const name='PunkyBoy';
var
I,a:integer; s,r:string;
begin
if FromServer and (pck[1]=#$0C)and (connectname=name) and (pck[10]+pck[11]+pck[12]+pck[13]=#$39#$00#$00#$00)\\id веши иначе можо записать как readd[10]=hstr('айди');
then
begin
buf:=#$04+pck[6]+pck[7]+pck[8]+pck[9]+pck[14]+pck[15]+pck[16]+pck[17]+pck[18]+pck[19]+pck[20]+pck[21]+pck[22]+pck[23]+pck[24]+pck[25]+#$00;
SendToServerex(name);
Не могу понять в чем проблема.
Поправил Name='Свойник';
Запускию скрипт.
В привате получаю 1 одеть и снять: удочку, крючек!
2 в процессе рыбалки использовать один раз фишин-шот!
Проделываю все эти действия
Получаю в приват Автоматизация ловли рыбы готово к работе!
пишу 1 в чат= не фурычит
Использую СоцДействие Yes =не фурычит происходит тока СоцДействие Yes
Раскоментировал отладочные сообщения подcчета сосок и крючков и пытаюсь ловить, подсчет ведется.
Проверил ItemID с сервером = совпадают
Не пойму куда рыть, подскажите плиз..
Не могу понять в чем проблема.
[skip]
Не пойму куда рыть, подскажите плиз..
Может не в том месте стоял, где ловить можно. Количество шотов и количество крючков верно пишет?
Какой у тебя сервер и какой именно скрипт используешь? В личку пиши.