молодец. убедись что ты т1 юзаешь, это раз. во вторых, перезапусти пх после правки.. как бэ.
Добавлено через 7 минут
Цитата:
как ты узнал что 657?
при правильном парсинге пакета по инишке детальной расшифровке пакета видно оффсет по которому значение брать.
правда с юзерлист не все так просто.
там 2 строковых типа (имя, титул) и один массив (перечень кубиков на персонаже). т.е. нельзя прописать статически параметр для реадд и чтобы оно работало везде.
да и с статус апдейт тоже не все просто, там цикл. как бэ. т.е. он как минимум может содержать разное кол-во элементов. и не обязательно там будет в наличии цп.
__________________
L2Ext - project closed.
Последний раз редактировалось alexteam, 14.03.2010 в 21:52.
Причина: Добавлено сообщение
В настройках стоит Т1, да я перезапускал л2пх
при правильном парсинге пакета по инишке детальной расшифровке пакета видно оффсет по которому значение брать.
уу как сложно. Ну да видел статус обдейт разный приходит, большой и маленький
Вобще то ищу рабочий или подстоить под свой сервер скрипт автоцп, авто хомяк не пашет, в списке не появляется ник перса
Последний раз редактировалось 0rfin, 14.03.2010 в 22:12.
да и с статус апдейт тоже не все просто, там цикл. как бэ. т.е. он как минимум может содержать разное кол-во элементов. и не обязательно там будет в наличии цп.
Ну так если не пришло СП в StatusUpdate значит оно и не изменилось, считаем что осталось старое значение.
Цитата:
Сообщение от 0rfin
как из StatusUpdate взять?
Я же готовый пример выложил как взять.
Добавлено через 3 часа 47 минут
Вобщем не поленился и переписал обработку UserInfo на более универсальную у себя в скриптах, теперь должно работать не зависимо от имени чара, титула и кубиков.
delphi Код:
procedure UserInfo;
var
i, CubicsSize, tmpCharObjectId: integer;
tmpMyName, tmpMyTitle: string;
begin
tmpCharObjectId:=ReadD(18);
if CharObjectId=0then CharObjectId:=tmpCharObjectId;
case tmpCharObjectId of
CharObjectId:
begin
MyCorX:=ReadD(2);
MyCorY:=ReadD(6);
MyCorZ:=ReadD(10);
i:=22;
tmpMyName:=ReadS(i);
i:=i+48;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
MaxMP:=ReadD(i);
CurMP:=ReadD(i);
i:= 552 + length(tmpMyName) * 2;
tmpMyTitle:=ReadS(i);
i:= i + 31;
CubicsSize:= ReadH(i);
i:= i + 28 + (CubicsSize * 2);
MaxCP:=ReadD(i);
CurCP:=ReadD(i);
end;
end;
end;
Последний раз редактировалось Vilson, 15.03.2010 в 04:32.
Причина: Добавлено сообщение
Из того что нашел на форуме, решил переделать скрипт под эпилог, вот что получилось
delphi Код:
const
Name='Infernal';
var
CurHP,MaxHP,CurCP,MaxCP,MyCorX,MyCorY,MyCorZ,MaxMP,CurMP: integer;
CPuse,HPuse,MPuse: string;
i, CubicsSize, CharObjectId, tmpCharObjectId: integer;
tmpMyName, tmpMyTitle: string;
TimerMP,TimerCP,TimerHP: TTimer;
procedure Init; //Вызывается при включении скриптаbegin
TimerCP:=TTimer.Create(nil);
TimerCP.OnTimer:=@OnTimerCP;
TimerCP.enabled:=false;
TimerCP.interval:=1000; //интервал 1сек, т.к. чаще пить CP всеравно не будет, дабы не засорять трафик
TimerMP:=TTimer.Create(nil);
TimerMP.OnTimer:=@OnTimerMP;
TimerMP.enabled:=false;
TimerMP.interval:=1000; //интервал 1сек, т.к. чаще пить MP всеравно не будет, дабы не засорять трафик
TimerHP:=TTimer.Create(nil);
TimerHP.OnTimer:=@OnTimerHP;
TimerHP.enabled:=false;
TimerHP.interval:=15000; //интервал 15сек, т.к. действие одной бутылки = 15секend;
procedure OnTimerCP(Sender: TObject);
begin
buf:=CPuse;
SendToServerEx(Name);
end;
procedure OnTimerMP(Sender: TObject);
begin
buf:=MPuse;
SendToServerEx(Name);
end;
procedure OnTimerHP(Sender: TObject);
begin
buf:=HPuse;
SendToServerEx(Name);
end;
procedure Free; //Вызывается при выключении скриптаbegin
TimerCP.free;
TimerMP.free;
TimerHP.free;
HPuse:='';
CPuse:='';
end;
//основная часть скрипта//вызывается при приходе каждого пакета если скрипт включенbegin//пьем сначала CP, потом HP банку что б запомнить их ID(я решил взять эти пакеты целиком, дабы не усложнять)if FromClient and(pck[1]=#$19)and(CPuse='')then CPuse:=pck;
if FromClient and(pck[1]=#$19)and(CPuse<>pck)and(HPuse='')then HPuse:=pck;
if FromClient and(pck[1]=#$19)and(CPuse<>pck)and(HPuse<>pck)and(MPuse='')then MPuse:=pck;
if FromServer and(pck[1]=#$32)thenbegin
MyCorX:=ReadD(2);
MyCorY:=ReadD(6);
MyCorZ:=ReadD(10);
i:=22;
tmpMyName:=ReadS(i);
i:=i+48;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
MaxMP:=ReadD(i);
CurMP:=ReadD(i);
i:= 552 + length(tmpMyName) * 2;
tmpMyTitle:=ReadS(i);
i:= i + 31;
CubicsSize:= ReadH(i);
i:= i + 28 + (CubicsSize * 2);
MaxCP:=ReadD(i);
CurCP:=ReadD(i);
end;
if FromServer and(pck[1]=#$18)thenbegin
CurHP:=ReadD(14);
CurCP:=ReadD(30);
CurMP:=ReadD(22);
// ShowMessage(IntToStr(CurMP));//если вы используете не грэйтер CP то вместо 200 подставьте кол-во CP сколько восстанавливает 1 банкаif(CurCP<MaxCP-200)then TimerCP.enabled:=trueelse TimerCP.enabled:=false;
if(CurHP<MaxHP)then TimerHP.enabled:=trueelse TimerHP.enabled:=false;
if(CurMP<MaxMP-2500)then TimerMP.enabled:=trueelse TimerMP.enabled:=false;
end;
end.
Проблема в том что использование банок начинается не сразу после изменения параметров, а только спустя интервал, заданный в таймере. Для Cp и MP это не критично при задержке в 1 сек, а для HP и в дальнейшем элексиров доставляет неудобства. Как это можно исправить?
Два примера тебе уже привели, приведу еще и третий, кусочек из моего скрипта:
delphi Код:
const
MyName = 'Nooooob';
TargetCheckTime = 500; //интервал для проверки возможности вернуть таргет после хейта/миража, 0.5 сек
InventorySize = 180;
GCPReuseTime = 800;
QHPReuseTime = 200; //маленький интервал делает практически не убиваемым, 10 юзов * 480 хп = 4800 хп/сек//но при этом клиент может тормозить на медленном инете из-за количества быстро отсылаемых пакетов//в случае притормаживания надо увеличить интервал срабатывания
GHPReuseTime = 14500;
MPReuseTime = 2000;
BSOEReuseTime = 120000; //!!если в течении двух минут после BSOE ХП не станет больше BSOEUsePercent опять используем BSOE
GCPUsePercent = 98; //% после достижения которого банки перестают использоватся
QHPUsePercent = 75;
GHPUsePercent = 97;
MPUsePercent = 30;
BSOEUsePercent = 15; //% HP при котором использовать BSOE//id итемов
GCPItemId = 5592; //Greater CP Potion
QHPItemId = 1540; //Quick Healing Potion
GHPItemId = 1539; //Greater Healing Potion
MPItemId = 728; //Mana Potion
BSOEItemId = 1538; //BSOE //............................procedure StatsUpdate;
var
i, tmpMaxHP, tmpCurHP, tmpMaxMP, tmpCurMP, tmpMaxCP, tmpCurCP, tmpCharObjectId :integer;
begin
tmpCharObjectId:=ReadD(2);
if(tmpCharObjectId<>CharObjectId)thenExit;
for i:=0to ReadD(6)-1docase pck[i*8+10] of
#$09: tmpCurHP:=ReadD(i*8+14);
#$0A: tmpMaxHP:=ReadD(i*8+14);
#$0B: tmpCurMP:=ReadD(i*8+14);
#$0C: tmpMaxMP:=ReadD(i*8+14);
#$21: tmpCurCP:=ReadD(i*8+14);
#$22: tmpMaxCP:=ReadD(i*8+14);
end;
if(tmpMaxHP<>0)then MaxHP:=tmpMaxHP;
if(tmpCurHP<>0)then CurHP:=tmpCurHP;
if(tmpMaxCP<>0)then MaxCP:=tmpMaxCP;
if(tmpCurCP<>0)then CurCP:=tmpCurCP;
if(tmpMaxMP<>0)then MaxMP:=tmpMaxMP;
if(tmpCurMP<>0)then CurMP:=tmpCurMP;
if(BSOEAutoUse)and(BSOEAmount>1)and(CurHP<>0)and(not TimerBSOE.Enabled)and(CurHP<((MaxHP*BSOEUsePercent)/100))thenbegin
UseItem(MyName, BSOEObjectId);
TimerBSOE.Enabled:=True;
end;
if(PotsAutoUse)thenbeginif(GCPAutoUse)and(GCPAmount>1)and(not TimerGCP.Enabled)and(CurCP<((MaxCP*GCPUsePercent)/100))thenbegin
UseItem(MyName, GCPObjectId);
TimerGCP.Enabled:=Trueend;
if(QHPAutoUse)and(QHPAmount>1)and(CurHP<>0)and(not TimerQHP.Enabled)and(CurHP<((MaxHP*QHPUsePercent)/100))thenbegin
UseItem(MyName, QHPObjectId);
TimerQHP.Enabled:=Trueend;
if(GHPAutoUse)and(GHPAmount>1)and(CurHP<>0)and(not TimerGHP.Enabled)and(CurHP<((MaxHP*GHPUsePercent)/100))thenbegin
UseItem(MyName, GHPObjectId);
TimerGHP.Enabled:=True;
end;
if(MPAutoUse)and(MPAmount>1)and(not TimerMP.Enabled)and(CurMP<((MaxMP*MPUsePercent)/100))thenbegin
UseItem(MyName, MPObjectId);
TimerMP.Enabled:=True;
end;
end;
end;
Запостил с секцией const что бы было более понятно о чем речь.
Цитата:
Сообщение от Infernale
Проблема в том что использование банок начинается
Кстати, при твем "упрощенном" подходе возникнет еще одна проблема - когда у тебя закончатся банки, а скрипт по прежнему будет отправлять ранее сохраненные пакеты на UseItem с уже не существующим id очень велика вероятность схватить бан аккаунта, потому как палево 100%. Советую не упрощать, а делать все по уму с чтением инвентаря, нахождением нужных банок и последующим подсчетом их количества.
Последний раз редактировалось Vilson, 07.04.2010 в 23:07.
Давно не читал форумю понял что щас уже не модно делиться скриптами, каждый ботит и скриптит у себя на ПК и отдать на пользование жалко.
Попробовал написать свое, все что накшел на форуме выкладываю тут:
написал для таких же как 0rfin
запускаем скрипт. либо жмем Соц действие ДА! либо свиток который хз как но появится на паннели во втором ряду в первой ячейке. дальше все по открывшемуся меню ) АЦП забыл, банки небыло.
не пишите что у меня кривые руки.
напишите лучше что сделал не так или сразу выложите готовую версию.