PDA

Просмотр полной версии : [Помогите]Прикрутить таймер к скрипту


afonbka
21.11.2010, 13:43
Всем наидобрейшего дня. Долго читал мануал и пытался прикрутить таймер к скрипту питья банок хп, но без результатно. Хотелось бы попросить тех, кто умеет это делать, помоч решить данную проблему. Я имею скрипт питья банок хп если CurHP<MaxHP. Но скрипт начинает флудить и пытается пить банки каждую секунду. Хотелось бы чтобы он повторял питье только через 11 секунд. Вот сам скрипт.

//автоматическое использование НР пробирок
const
Name = 'UberWark';

var MyID:Word;
OID:String;

begin
if FromServer and (pck[1]=#$21) and (ReadD(12)=1539) then
OID:=pck[8]+pck[9]+pck[10]+pck[11];

if FromServer and (pck[1]=#$32) then MyID:=ReadD(18);
if FromServer and (pck[1]=#$18) and (ReadD(2)=MyID) then
if ReadD(6)=4 then
if (ReadD(14)<=ReadD(11)) then
begin
SendToServerEx(Name);
buf:=HStr('19 D9 03 21 10 00 00 00 00');
SendToServer;
end;
end.

Спасибом не обижу. Прошу помощи по человечески. Мог бы сам сделать, не просл бы о помощи. Прошу понять..

J-Fobos
21.11.2010, 15:12
http://coderx.ru/showpost.php?p=30293&postcount=404

afonbka
21.11.2010, 16:19
слушай, а я не понимаю, ты хочешь чтоб у тебя вобще каждые 11 секунды включенного скрипта юзалась банка, или когда дойдет до опрделеннного уровня?
Чтобы когда хп стало меньше максимума, скрипт юзал банку хп каждые 11 секунд, пока хп не станет полное. и так каждый раз когда хп станет меньше чем максимум. Нужно подкрутить только таймер, так скрипт уже работает и хилит нормально. Но пытается пить банку каждую секунду, изза чего получается флуд, а надо чтоб пытался пить каждые 11 секунд, чтобы не флудил.

dyh9l
21.11.2010, 16:41
Чтобы когда хп стало меньше максимума, скрипт юзал банку хп каждые 11 секунд, пока хп не станет полное. и так каждый раз когда хп станет меньше чем максимум. Нужно подкрутить только таймер, так скрипт уже работает и хилит нормально. Но пытается пить банку каждую секунду, изза чего получается флуд, а надо чтоб пытался пить каждые 11 секунд, чтобы не флудил.
Вобщем скрипты писать я не умею, но чето попробывал накалякать, если будет работать, я буду рад :)
const
Name = 'UberWark';

var MyID:Word;
OID:String;
Timer01: TTimer;
TimerCyrcle01:integer;

procedure Init;
begin
Timer01:=TTimer.Create(nil); //выделяем памать и т.п.
Timer01.OnTimer:=@OnTimer01; //привязываем процедуру к событию
Timer01.enabled:=true; //начальное положение включен(true)/выключен(false)
Timer01.interval:=11000; //интервал(в милисекундах) как часто таймер срабатывает
Timercyrcle01:=1;
end;

procedure Free;
begin
Timer01.free;
end;

Procedure OnTimer01(Sender : TObject) ;
begin
case TimerCyrcle01 of
1: begin buf := hstr('19 D9 03 21 10 00 00 00 00') ;
SendToServer;
end;
end;
end;


begin
if FromServer and (pck[1]=#$21) and (ReadD(12)=1539) then
OID:=pck[8]+pck[9]+pck[10]+pck[11];

if FromServer and (pck[1]=#$32) then MyID:=ReadD(18);
if FromServer and (pck[1]=#$18) and (ReadD(2)=MyID) then
if ReadD(6)=4 then
if (ReadD(14)<ReadD(11)) then
begin
Timer01.enabled:=True;
end;
else
begin
Timre01.enabled:=False;
end;
end.

afonbka
21.11.2010, 16:49
ругаетсяна else

begin
Timer01.enabled:=True;
end;
else
begin
Timre01.enabled:=False;
end;

Я так понял, в твоем скрипте таймер стоит на проверку моего хп, а не на питье банок, или на то и другое стоит таймер?

dyh9l
21.11.2010, 16:54
begin
Timer01.enabled:=True;
end
else
begin
Timre01.enabled:=False;
end;
вот так попробуй

afonbka
21.11.2010, 16:57
теперь ругается вот на етот код:

Timre01.enabled:=False;

dyh9l
21.11.2010, 17:02
ну блин ошибся) чего не видно :) Timer01.enabled:=False;

Добавлено через 52 секунды
у меня таймер стоит вот на это
1: begin buf := hstr('19 D9 03 21 10 00 00 00 00') ;
SendToServer;
end;
а вот что это за пакет я хз чесно)

afonbka
21.11.2010, 17:02
тьфуты точно :) да я и сам не заметил различия. Запустился, сейчас гляну как в работе...

dyh9l
21.11.2010, 17:03
19 D9 03 21 10 00 00 00 00 - юзание хп банки?

afonbka
21.11.2010, 17:08
Неа, не работает :( вообще не пьет банки...

Добавлено через 36 секунд
19 D9 03 21 10 00 00 00 00 - юзание хп банки?

да. узание хп банки, чтобы не писать процедуру определения обектида.

NLObP
21.11.2010, 19:28
afonbka, дай лог пакетов при лечении банками, чтобы точно написать скрипт.


//автоматическое использование НР пробирок by NLObP
// 1-Изменяем Name='NLObP';
// 2-бросаем, подбираем или выпиваем Heal Potion

//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS"

const
Name='NLObP';

var
ColvoHP, CharObjID, ItemObjID: integer;
MaxHP, CurHP: integer;
TimerHP: TTimer;
Status: boolean;

procedure OnTimerHP(Sender: TObject);
begin
if ColvoHP=0 then exit;
buf:=#$14;
WriteD(ItemObjID);
WriteD(00);
SendToServerEx(Name);
ColvoHP:=ColvoHP-1; //количество хилок
if ColvoHP=0 then begin
Say('Хилок='+inttostr(ColvoHP));
Say('Кончились хилки! Закупите Heal Potion!');
end;
end;

procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;

procedure InitStats;
var
i: integer;
begin
//Запоминаем ИД
i:=18;
CharObjID:=ReadD(i);
//смещение переменное, зависит от имени (LenName*2+2)
i:=i+(Length(Name)*2+2)+44;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
//Say('MaxHP='+inttostr(MaxHP)+'CurHP='+inttostr(Cur HP));
if ItemObjID=0 then exit;
if (CurHP<=MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
end;

procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do begin
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
end;
end;
if ItemObjID=0 then exit;
if (CurHP<=MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
end;

//************************************************** ****************************
procedure ObjtoColvo(ItemObjID:integer);
var
i: integer;
begin
if ItemObjID=0 then exit;
for i:=0 to ReadD(4)-1 do begin
if ItemObjID=ReadD(i*28+8) then ColvoHP:=ReadD(i*28+16); //количество хилок
end;
end;

//************************************************** ****************************
// Вызывается при включении скрипта
//************************************************** ****************************
procedure Init;
begin
status:=false;
CharObjID:=0;
ItemObjID:=0;
timerHP:=TTimer.Create(nil);
timerHP.OnTimer:=@OnTimerHP;
timerHP.enabled:=false;
timerHP.interval:=5000; //время отката лечения
Say('Для начала работы скрипта бросаем, подбираем или выпиваем Heal Potion!');
end;

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

//************************************************** ****************************
// Вызывается при приходе каждого пакета, если скрипт включен
//************************************************** ****************************
begin
//************************************************** ****************************
//не обрабатываем пустые пакеты
if pck='' then exit;

//************************************************** ****************************
//InventoryUpdate
if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)=1060) or (ReadD(12)=1061)) then begin //Healing Potion, Lesser Healing Potion
ItemObjID:=ReadD(8);
ColvoHP:=ReadD(16); //количество хилок
if status then exit;
Say('Автоматическое использование Нeal Рotion готово к работе!');
Say('Хилок='+inttostr(ColvoHP));
status:=true;
end;

//************************************************** ****************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
ObjtoColvo(ItemObjID); //количество хилок
//Say('Хилок='+inttostr(ColvoHP));
end;

//************************************************** ****************************
//UserInfo
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then InitStats;

//************************************************** ****************************
//StatusUpdate
if FromServer and (ConnectName=Name) and (pck[1]=#$0E) and (CharObjID=ReadD(2)) then StatsUpdate;

end.


PS: требуется поправить ID пакетов и смещения в пакетах

NLObP
21.11.2010, 20:01
afonbka, можно всего сеанса. Тот скрипт для С4.

afonbka
21.11.2010, 20:23
Вот.. Зашел в игру, открыл инвентарь, выпил банку, вышел из игры.

afonbka
22.11.2010, 01:03
Я понимаю что для С4, пробывал модифицировать под фрею, но увы.. без результатно, запускается нормально, но не глотает банки, видать не определяет хп, и интересно откуда берутся ети цифры Read (33) например. В моем случае пакет 18 (статусупдейт) Read(14) = CurHP Read(11) = MaxHP

dyh9l
22.11.2010, 08:55
Я понимаю что для С4, пробывал модифицировать под фрею, но увы.. без результатно, запускается нормально, но не глотает банки, видать не определяет хп, и интересно откуда берутся ети цифры Read (33) например. В моем случае пакет 18 (статусупдейт) Read(14) = CurHP Read(11) = MaxHP

цифры берутся из расшифровки пакета

afonbka
22.11.2010, 12:09
а, понятно.. что нечего не понятно :) в расшифровке вродебы не указывается под каким ид тот или иной параметр пакета. Это я про детальную расшифровку (та что в окне phx) может быть другая какая есть..

supernewbie
22.11.2010, 12:29
это не ид, а номер байта

afonbka
22.11.2010, 13:46
или хотябы подскажите как сделать, чтобы в этом скрипте хп проверялось только у заданного конекта, а не у всех окон. Вот скрипт.

//автоматическое использование НР пробирок
const
Name = 'UberWark';

var MyID:Word;
OID:String;

begin
if FromServer and (pck[1]=#$32) then MyID:=ReadD(18);
if FromServer and (pck[1]=#$18) and (ReadD(2)=MyID) then
if ReadD(6)=4 then
if (ReadD(14)<=ReadD(11)) then
begin
buf:=HStr('19 D9 03 21 10 00 00 00 00');
SendToServerEx(Name);
end;
end.
Определяет хп у всех окон, например у бд неполное хп, варк жрет банки, у свс не полное хп, варк жрет банки, в общем определяет хп у всех окон, но пакет на питье отправляет все правильно. Прошу помоч реализовать :)

В общем надо, чтоыб вот эту процедуру

begin
if FromServer and (pck[1]=#$32) then MyID:=ReadD(18);
if FromServer and (pck[1]=#$18) and (ReadD(2)=MyID) then
if ReadD(6)=4 then
if (ReadD(14)<=ReadD(11)) then

скрипт выполнял толькона конекте (Name) То есть UberWark

Добавлено через 22 минуты
Думаю что вот так ето делается?

if FromServer and (ConnectName=Name)

Добавлено через 4 минуты
Но теперь он их пьет непереставая, несмотря неначье хп. Прошу помоч разобратся...

Добавлено через 9 минут
Вот так вот помоему получилось:

if FromServer and (ConnectName=(Name))

Добавлено через 1 минуту

Хотя нет, все также пьет по старому не перестовая и не смотря неначье хп. Помогите решить проблему.

Breadfan
22.11.2010, 15:22
if FromServer and (pck[1]=#$32) then MyID:=ReadD(18);
if FromServer and (pck[1]=#$18) and (ReadD(2)=MyID) then =>>
if FromServer and (connectname=name) and (pck[1]=#$32) then MyID:=ReadD(18);
if FromServer and (connectname=name) and (pck[1]=#$18) and (ReadD(2)=MyID) then

afonbka
22.11.2010, 16:46
Спасибо. сейчас проверю. До этого делал точно также, но давало ошибку в строке (connectname=name) а сейчас нет :) сейчас протестю. Спасибо все работает. Правдо первый раз загрузил, пил неперестовая, потом помудрил, удалил 1 функцию, потом снова добавил и норм все стало. Спасибо. Теперь буду мудрить чтобы привязать таймер. Прошу помоч если ктонито может..

//чёртово автоматическое использование грёбаных НР пробирок
const
Name='UberWark';

var MyID:Word;
OID:String;

begin
if FromServer and (connectname=name) and (pck[1]=#$32) then MyID:=ReadD(18);
if FromServer and (connectname=name) and (pck[1]=#$18) and (ReadD(2)=MyID) then
if ReadD(6)=4 then
if (ReadD(14)<=ReadD(11)) then
begin
buf:=HStr('19 D9 03 21 10 00 00 00 00');
SendToServerEx(Name);
end;
end.

Или подскажите хотябы как сделать на этот скрипт не таймер, а обычный Delay 10 секунд.

dyh9l
22.11.2010, 17:19
Спасибо. сейчас проверю. До этого делал точно также, но давало ошибку в строке (connectname=name) а сейчас нет :) сейчас протестю. Спасибо все работает. Правдо первый раз загрузил, пил неперестовая, потом помудрил, удалил 1 функцию, потом снова добавил и норм все стало. Спасибо. Теперь буду мудрить чтобы привязать таймер. Прошу помоч если ктонито может..

//чёртово автоматическое использование грёбаных НР пробирок
const
Name='UberWark';

var MyID:Word;
OID:String;

begin
if FromServer and (connectname=name) and (pck[1]=#$32) then MyID:=ReadD(18);
if FromServer and (connectname=name) and (pck[1]=#$18) and (ReadD(2)=MyID) then
if ReadD(6)=4 then
if (ReadD(14)<=ReadD(11)) then
begin
buf:=HStr('19 D9 03 21 10 00 00 00 00');
SendToServerEx(Name);
end;
end.

Или подскажите хотябы как сделать на этот скрипт не таймер, а обычный Delay 10 секунд.

c делеем будешь в лагах стоять

afonbka
22.11.2010, 17:26
да? спасибо что предупредил :) тогда надо думу думать как таймер привязать правильно, на весь скрипт...

Breadfan
22.11.2010, 17:44
где-то как-то так, или около того:const
Name='UberWark';

var MyID:Word;
OID:String;
useP:boolean;
Timer01:TTimer;
MinHP:integer;
procedure Init;
begin
Timer01:=TTimer.Create(nil); //выделяем памать и т.п.
Timer01.OnTimer:=@OnTimer01; //привязываем процедуру к событию
Timer01.enabled:=false; //начальное положение включен(true)/выключен(false)
Timer01.interval:=11000; //интервал(в милисекундах) как часто таймер срабатывает
MinHP:=7000; //уровень хп при котором пьет
end;

procedure Free; //Вызывается при выключении скрипта
begin
Timer01.enabled:=False;
Timer01.free;
end;

procedure OnTimer01; //проц-ра выполняющаяся по таймеру
begin
useP:=false; //спустя interval/1000 секунд после отправки пакета юза банки - сбрасываем флаг
end;

begin
if FromServer and (connectname=name) and (pck[1]=#$32) then MyID:=ReadD(18);
if FromServer and (connectname=name) and (pck[1]=#$18) and (ReadD(2)=MyID) then begin
if ReadD(6)=4 then begin
if (ReadD(10)=9) and (ReadD(14)<=MinHP) and (useP=false) then //HP<MinHP и банка не задействована
begin
useP:=True; //флаг - "работает ли сейчас банка" включить
Timer01.enabled:=True; //таймер включить
buf:=HStr('19 D9 03 21 10 00 00 00 00'); //пакет юз банки
SendToServerEx(Name);
end;
if (ReadD(10)=9) and (ReadD(14)>MinHP) and (useP) then begin
useP:=False; //хп выровняли, но флаг все еще установлен? сбрасываем
Timer01.enabled:=False; //таймер выключить
end;
end;
end;
end.
ЗЫ: требуется постоянно обновлять пакет использования банки, либо все-таки собраться с силами и переделать нормально

Но лучше http://coderx.ru/showpost.php?p=121935&postcount=12 вот этот переделать

afonbka
22.11.2010, 20:37
Спасибо большое, обновленный скрипт работает. Чуть позже всеже разберу пакет и узнаю номер байтов максимума хп. Тему можно закрыть. Всем спасибо..