Нужна помощь в изменении скрипта помошник в PvP и PK. Попытался сделать пакеты на использование банок константами, но при старте скрипта ничего не происходит.
Код:
//by mks
//помошник в PvP и PK.
//пьет CP и HP пробирки в нужное время(можно добавить и MP для пвп серваков), и освобождает вас от небоходимости зажатия клавиши Ctrl, которая так меня раздражает!(думаю это раздражает и не только меня)
///////////////////////////////////////////////////////
///////////////Master PvP by MKS v.1.0/////////////////
///////////////////////////////////////////////////////
//после активации скрипта необходимо выпить сначала банку CP, потом HP для получения их ID
const
Name='kabUki'; //ник перса
PckUseCP='14 75 DC 4C 40 00 00 00 00';
PckUseHP='14 68 E6 4C 40 00 00 00 00';
var
CurHP,MaxHP,CurCP,MaxCP: integer;
CPuse,HPuse: string;
TimerCP,TimerHP: TTimer;
procedure Init; //Вызывается при включении скрипта
begin
TimerCP:=TTimer.Create(nil);
TimerCP.OnTimer:=@OnTimerCP;
TimerCP.enabled:=false;
TimerCP.interval:=1000; //интервал 1сек, т.к. чаще пить CP всеравно не будет, дабы не засорять трафик
TimerHP:=TTimer.Create(nil);
TimerHP.OnTimer:=@OnTimerHP;
TimerHP.enabled:=false;
TimerHP.interval:=15000; //интервал 15сек, т.к. действие одной бутылки = 15сек
end;
procedure OnTimerCP(Sender: TObject);
begin
buf:=HStr(PckUseCP);
SendToServerEx(Name);
end;
procedure OnTimerHP(Sender: TObject);
begin
buf:=HStr(PckUseHP);
SendToServerEx(Name);
end;
procedure Free; //Вызывается при выключении скрипта
begin
TimerCP.free;
TimerHP.free;
HPuse:='';
CPuse:='';
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
//пьем сначала CP, потом HP банку что б запомнить их ID(я решил взять эти пакеты целиком, дабы не усложнять)
// if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (CPuse='') then CPuse:=pck;
// if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (CPuse<>pck) and (HPuse='') then HPuse:=pck;
//считываем текущие и максимальные значения CP и HP
if FromServer and (pck[1]+pck[6]=#$0E#$04) then
begin
CurHP:=ReadD(14);
MaxHP:=ReadD(22);
CurCP:=ReadD(30);
MaxCP:=ReadD(38);
end;
//если вы используете не грэйтер CP то вместо 200 подставьте кол-во CP сколько восстанавливает 1 банка
//if (CurCP<MaxCP-200) and (CPuse<>'') then TimerCP.enabled:=true else TimerCP.enabled:=false;
//if (CurHP<MaxHP) and (HPuse<>'') then TimerHP.enabled:=true else TimerHP.enabled:=false;
if (CurCP<MaxCP-200) then TimerCP.enabled:=true else TimerCP.enabled:=false;
if (CurHP<MaxHP) then TimerHP.enabled:=true else TimerHP.enabled:=false;
//если используем скилы или заклинания добавляем флаг Ctrl, что б не надо было удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$2F) then pck[6]:=#$01;
//если наводим таргет, повторное нажатие по нему подменивается на атаку, опять же что б не удерживать контрол
//if FromClient and (ConnectName=Name) and (pck[1]=#$04) then pck[1]:=#$0A;
end.
KaBuKi, недостаточно информации, давай более развернуто, что как делаешь, в какой последовательности, версия пакетхака/хроники сервера и все такое прочее
Использую l2phx.3.4.1.83, версия протокола 660. Собственно изначальный скрипт работает отлично, но мне не нравится там необходимость при старте скрипта выпивать банки СР и НР, для того чтобы сохранились пакеты использования банок. Соответственно эти пакеты я через "просмотр" перехватил, задал константы на эти пакеты, некоторые условия убрал (CPuse<>'', HPuse<>'') в оригинальном скрипте убрал. Впринципе, можно удалить переменные CPuse и HPuse. Как я понял при приходе пакета StatusUpdate из него извлекаются текущие и максимальные значения СР и НР, если выполняются неравенства, то запускается таймер и начинают отсылаться пакеты на использование банок, но почему-то они не используются. Части скрипта которые я изменил - закомментил, так что различия между моим скриптом и оригиналом видны сразу. При старте скрипта и изменении НР и СР ничего не происходит.
Последний раз редактировалось KaBuKi, 07.06.2010 в 11:21.
Пакет RequestUseItem по определению константным быть не может, т.к. содержит в себе ObjID - идентификатор объекта в инвентаре, который в свою очередь может меняться. При грамотном подходе к реализации подобного скрипта, следует отслеживать инвентарь, анализировать его содержимое, но не как не константами забивать пакеты.
Пакет RequestUseItem по определению константным быть не может, т.к. содержит в себе ObjID - идентификатор объекта в инвентаре, который в свою очередь может меняться. При грамотном подходе к реализации подобного скрипта, следует отслеживать инвентарь, анализировать его содержимое, но не как не константами забивать пакеты.
А разве для предметов типа банок может быть другой ObjID? Содержит ли ObjID информацию о расположении предмета в инвентаре?
конечноже нет. хотя наверное ты неверно понял вопрос собеседника.. и ответил некоректно.
у клиента есть чёткая таблица соответствий графического образа и ОбжектИД.. он никогда не меняется. мб тока при апдейте клиента.. сервер присылает ИД обжекта клиент его показывает.. в соответствии с таблицей..
другое дело что ИтемИД ето ненадо путать с ОбжектИД .. например у тебя есть 2 кувалды в инвенторе.. выгледят одинаково.. но лежат в разных слотах и заточены поразному.. при етом у них будет одинаковый обжектИД но совершенно разный ИтемИД. Итем ИД- хранится на сервере. у клиента нет таблиц соответствий аналогично обжекту- для итемов..
более подробно ето так.. клиент логинится к серверу.. сервер наливает пакет чем наполнен рюкзак игрока.. говорит примерно так:
(ид пакета на инвентарь) (ОбжектИД) (итемИД) (характеристики итема).
клиент эту информацию помнит ровно 1 сеанс игры и не сохраняет ее нигде.. в новом конекте к серверу ОБЖЕКТ ИД останется темже самым.. но итемид сменится.
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
Тогда как следует поступить? Расположить банки в определенных ячейках инвентаря, а потом определять их ObjID и на основании его фомировать пакет на покупку?
0. Описать переменные для ID банок ЦП, ХП, (МП), переменные для хранения количества банок ЦП, ХП, (МП).
1. Написать обработку пакетов прилетающих от ГС: ItemListPacket, InventoryUpdate. анализируя ItemListPacket определять количество и ID банок. Анализируя InventoryUpdate анализировать изменение количества этих самых банок.
2. Написать алгоритм юзания банок по изменению ЦП, ХП, (МП). Если кончились - не юзать.
В таком раскладе - если ты включил галку скрипта уже во время игры, а не до загрузки чара, для инициализации переменных прийдется вызвать окно инвентаря (Ctrl+V), либо купить банки, либо ждать когда прилетит пакет инвентаря.
ЗЫ. Код писать не буду, лень, и все можно скопипастить из скриптов этой темы.
ЗЫЫ. Есть ID вещи, предмета, используется для определения его названия, описания, иконки в клиенте, и есть ObjID, для идентифицирования конкретного объекта для нужд сервера. В пакете RequestUseItem серверу отправляется именно ObjID.
Последний раз редактировалось Sherman, 07.06.2010 в 13:38.