L2PacketHackФорум программы L2PacketHack, всё что с ней связано находится тут.
Правила раздела!
Категорически запрещено:
* Просить пакеты/скрипты на шмот/адену/другие вещи;
* Просить (помочь) взломать/сломать сервак/аккаунт или раздеть/наказать кого-то на любом серваке;
* Просить научить работать с программой, если не понимаете элементарных вещей в отношениях клиент-сервер (так как, если вы их понимаете, то вопросов по основным возможностям программы быть недолжно);
* Все посты не удовлетворяющие этим запретам, а так же не относящиеся к теме будут удаляться при первой возможности.
* Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы.
* Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
* Данные запреты неподлежат обсуждению.
//QaK:отдельная тема по подкючению пакетхака к серверу >>>>>>>>тут
любые вопросы по данной тематике в этом топе будут удаляться без предупреждения.
Код:
const
mp='8A 1B 15 01 10';
hp='8A 1A 15 01 10';
begin
if fromclient and (pck[1]=#$38#$F5#$00#$EF#$00#$00#$00#$03#$00#$00#$00) then
begin
buf:=hstr(hp);
SendToServer;
end;
if fromclient and (pck[2]=#$33#$F5#$00#$EF#$00#$40#$00#$03#$00#$00#$00) then
begin
buf:=hstr(mp);
SendToServer;
end;
end.
где я ошибся?
Последний раз редактировалось QaK, 30.08.2010 в 18:56.
Прошу помочь разобраться, пишу скрипт (бота) он должен при первом сообщении в пм (в примере это 2356 ), сохранять ид отправителя и реагировать на команды в пм тока с этим ид.
Вот рабочий пример :
Код:
if FromServer and (ConnectName=name)
and (pck[1]=#$4A) and (pck[18]=#$37) and (pck[19]=#$04) and (pck[20]=#$34) and (pck[21]=#$04) and (pck[22]=#$61) and (pck[23]=#$00) and (pck[24]=#$70) and (pck[25]=#$00) and (pck[26]=#$6F) and (pck[27]=#$00) and (pck[28]=#$32) and (pck[29]=#$04) and (pck[30]=#$00) and (pck[31]=#$00) then
begin
idi1:=pck[2];
idi2:=pck[3];
idi3:=pck[4];
idi4:=pck[5];
end;
if FromServer and (ConnectName=name)
and (pck[1]=#$4A) and (pck[18]=#$31) and (pck[19]=#$00) and (pck[20]=#$00) and (pck[21]=#$00) and (pck[2]=idi1) and (pck[3]=idi2) and (pck[4]=idi3) and (pck[5]=idi4) then
begin
buf:=Hstr('46');
SendTOServerEx(name);
end;
Всё работало нормально для ника jeklin748 а для других не работало а дело в том что длина пакета 4А(входящего пм) зависит от ника точней его длины и букв написавшего его, как заделать так чтобы присваивание значений шло с конца пакета ? А ещё если допустим ник присвоить name:=Reads(10) как заделать так чтобы следующее присваивание было после Reads(10) то есть присваивало следующий байт.
Прошу помочь разобраться если вопрос не понять то что непонятно?
Последний раз редактировалось T][P, 13.04.2009 в 00:22.
Const
BotName = 'Имя бота';
Password = '2356';
var
MasterID : integer; //ID хозяина
MasterName : string; //Гик хохяина
Command :string; //Команда
i : integer;
Name : string;
beginif FromServer and(ConnectName=BotName)and(pck[1]=#$4A)thenbegin
i :=10; //Устанавливаем смещение до ника
Name :=ReadS(i); //Сохраняем ник
Command :=ReadS(i); //Считываем текстif Command=Password thenbegin//если это пароль
MasterID :=ReadD(2); //Сохраняем ID написавшего
MasterName := Name; //и его никend;
end;
end.
Добавлено через 3 минуты
Цитата:
Сообщение от T][P
А ещё если допустим ник присвоить name:=Reads(10) как заделать так чтобы следующее присваивание было после Reads(10) то есть присваивало следующий байт.
как в примере - надо использовать переменную, функция ReadS увеличит ее на длину строки
delphi Код:
i :=10;
Name :=ReadS(i);
Command :=ReadS(i);
Добавлено через 18 минут T][P,
buf:=Hstr('46'); лучше buf:=#$46;
не знаю как это будет работать, но иожно попробывать сразу слать и клиенту 7E=LogOutOk:
Последний раз редактировалось PanAm, 13.04.2009 в 14:59.
Причина: Добавлено сообщение
buf:=Hstr('46'); лучше buf:=#$46;
не знаю как это будет работать, но иожно попробывать сразу слать и клиенту 7E=LogOutOk:
Пакет 46 выкидывает в меню выбора чара. Попробую использовать 7Е.
Да хотел ещё спросить какой процедурой или функцией можно пакетник от клиента отсоединить, не теряя подключения? Где-то видел, но не магу вспомнить где.
{БОТ - Воин помошник от Alexus
версия: 0.3 (бета)
дата: 08.04.08
Описание:
Универсальный скрипт для война - помошника в каче.
Помошник бегает за вами куда бы вы не пошли и атакует ваши цели по ассисту,
как только вы сами начнете атаку (двойным кликом мыши по цели).
Либо может быть вагончиком в паровозе ботов и бегать за Локомотивом
Возможности:
1. Может бегать и за живим игроком и за ботом - локомотивом (от Alexus)
1. Бегает за Вами, не отлипает.
2. Помогает бить врагов.
3. Умеет лечиться (тип банки легко настраивается).
4. Скрипту неважно, находятся ли персы в пати или нет.
5. Работает на С4 и С6 серверах.
Инструкция:
1. Запускаем ПакетХак.
2. Если используем совместно с ботом - Локомотивом (от Alexus), то в "Списке скриптов" ставим этот скрипт ниже локомотива.
2. Запускаем оба клиента игры.
3. Задаем (ниже) реальные имена командира и помошника.
4. Внимательно настраиваем остальные константы в Секции настройки.
5. Запускаем скрипт.
}
//######################## Секция настройки ######################################################
const
interlude = true; // C6 - true, C4 - false;
CommanderName = 'x'; // Ник командира
AssistantName = 'x'; // Ник помошника
CommanderBot = true; // Командир - это "бот - Локомотив", или человек?
HPMedium = 70; // % с которого начинаем лечиться банками
HPBottleID = 1061; // ItemID 1060=Lesser Healing Potion; 1061=Healing Potion; 1539=Greater Healing Potion;
DrinkDelay = 14; // минимальное время задержки повторного питься бутылки (10 - 20 сек)
InvRazmer = 79; // Размер инвенторя у ассистента -1 (если инвентарь 80, то писать надо 79, если 100, то писать 99)
//#################################################################################################
var
CommanderX, CommanderY, CommanderZ : integer; // Мои статы
CommanderID, CommanderHP, CommanderMaxHP: integer;
AssistX, AssistY, AssistZ : integer; // Статы помошника
AssistID, AssistHP, AssistMaxHP: integer;
AssistMP, AssistMaxMP : integer;
AssistHPlevelProcent : integer;
TargetID : integer;
time1: integer;
Inventory: array[0..InvRazmer, 0..9] of integer; // инвентарь (itemType1, ObjectID, ItemID, count, itemType2, CustType1, isEquipped, BodyPart, EnchantLevel, CustType2)
HPBottleObjID: integer; // ObjectID бутыли
HpBottleCount: integer; // количество бутылей
procedure Init; //Вызывается при включении скрипта
begin
CommanderID:= 0; // обнуляем ВСЕ данные
CommanderX:= 0;
CommanderY:= 0;
CommanderZ:= 0;
CommanderID:= 0;
CommanderHP:= 0;
CommanderMaxHP:= 0;
// MyMP:= 0;
// MyMaxMP:= 0;
AssistID:= 0;
AssistX:= 0;
AssistY:= 0;
AssistZ:= 0;
AssistID:= 0;
AssistHP:= 0;
AssistMaxHP:= 0;
AssistMP:= 0;
AssistMaxMP:= 0;
TargetID:=0;
time1:=1;
buf:= #$14; //запрашиваем пакеты с инвентарем и userinfo
SendToServerEx(AssistantName);
SendToServerEx(CommanderName);
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 InventoryCreate;
var
i,k, offset : integer;
begin
if interlude then offset:= 8 else offset:=0;
for i:=0 to InvRazmer do
if (i<ReadH(4)) then begin
Inventory[i,0]:=ReadH(i*(28+offset)+6); // itemType1
Inventory[i,1]:=ReadD(i*(28+offset)+8); // ObjectId
Inventory[i,2]:=ReadD(i*(28+offset)+12); // ItemID
Inventory[i,3]:=ReadD(i*(28+offset)+16); // count
Inventory[i,4]:=ReadH(i*(28+offset)+20); // itemType2
Inventory[i,5]:=ReadH(i*(28+offset)+22); // CustType1
Inventory[i,6]:=ReadH(i*(28+offset)+24); // isEquipped
Inventory[i,7]:=ReadD(i*(28+offset)+26); // BodyPart
Inventory[i,8]:=ReadH(i*(28+offset)+30); // EnchantLevel
Inventory[i,9]:=ReadH(i*(28+offset)+32); // CustType2
end else
for k:=0 to 9 do Inventory[i,k]:=0; // забиваем нулями
end;
function GetInv(obj,up,down:integer): integer; // up и down не проверяются
var // 0-itemType1, 1-ObjectId, 2-ItemID, 3-count, 4-itemType2, 5-CustType1, 6-isEquipped, 7-BodyPart, 8-EnchantLevel, 9-CustType2
i: integer;
begin
for i:=0 to InvRazmer do if (Inventory[i,up]=obj) then
begin
Result:=Inventory[i,down];
exit;
end;
Result:=-1;
end;
procedure UseItemObjID(ItemObjID:integer); //Использовать предмет с заданным ItemID
begin
buf:=#$19;
WriteD(ItemObjID);
WriteD(0);
SendToServerEx(AssistantName);;
end;
//############################################################################################
procedure AssistUserInfo; // обновление данных о ассистенте
var
i:word;
begin
AssistID:=ReadD(18);
AssistX:=ReadD(2);
AssistY:=ReadD(6);
AssistZ:=ReadD(10);
i:=22;
ReadS(i);
if interlude then i:=i+48 else i:=i+44;
AssistMaxHP:=ReadD(i);
AssistHP:=ReadD(i);
AssistMaxMP:=ReadD(i); // чисто информативно
AssistMP:=ReadD(i);
// i:=i+363; пока не используется
// MyMaxCP:=ReadD(i);
// MyCP:=ReadD(i);
end;
procedure AssistStatusUpdate; // обновление данных о ассистенте
var
i:integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$00: AssistHP:=ReadD(i*8+14);
#$01: AssistMaxHP:=ReadD(i*8+14);
#$0C: AssistMP:=ReadD(i*8+14);
#$0D: AssistMaxMP:=ReadD(i*8+14);
// #$23: MyCP:=ReadD(i*8+14); пока не используется
// #$24: MyMaxCP:=ReadD(i*8+14);
end;
if AssistMaxHP > 0 then AssistHPlevelProcent:= Round((AssistMaxHP/100)*HPMedium);
end;
procedure CommanderUserInfo; // обновление данных о себе
var
i:word;
begin
CommanderID:=ReadD(18);
CommanderX:=ReadD(2);
CommanderY:=ReadD(6);
CommanderZ:=ReadD(10);
i:=22;
ReadS(i);
if interlude then i:=i+48 else i:=i+44;
CommanderMaxHP:=ReadD(i);
CommanderHP:=ReadD(i);
end;
procedure Action; // команда действия
begin
buf:=#$1F; //action
WriteD(TargetID);
WriteD(AssistX);
WriteD(AssistY);
WriteD(AssistZ);
WriteC(0);
SendToServerEx(AssistantName);
end;
procedure DrinkBottle; // пьем бутылки и следим за их количеством
begin
if HPBottleCount > 0 then
begin
UseItemObjID(HPBottleObjID);
dec (HPBottleCount);
end;
end;
begin // Далее обработка входящих пакетов
if pck = '' then exit;
if (ConnectName = CommanderName) and FromServer then
case pck[1] of
#$31: if ReadS(22) = CommanderName then CommanderUserInfo;
end;
if (ConnectName = AssistantName) and FromServer then
case pck[1] of
#$31: if ReadS(22) = AssistantName then AssistUserInfo;
#$18: if AssistID=ReadD(2) then // StatusUpdate:h(ObjectID)d(Attributes)
begin
AssistStatusUpdate;
if (AssistHP > 0) and (AssistHP < AssistHPlevelProcent) then if Wait(time1, DrinkDelay) then DrinkBottle; // пьем бутылки с интервалом в 19 сек
if (AssistHP > 0) and (AssistHP > AssistHPlevelProcent) then time1:=1;
end;
#$11: begin
InventoryCreate; // Инвентарь
HPBottleObjID:= getinv(HPBottleID, 2,1);
HPBottleCount:= getinv(HPBottleID, 2,3);
end;
//#$21: InventoryUpdate;
end;
if (ConnectName = AssistantName) and FromServer and CommanderBot then
case pck[1] of
#$2F: if CommanderID = ReadD(2) then
begin
TargetID:= CommanderID;
Action; Action;
end;
#$33, #$72 : if CommanderID = ReadD(2) then //Attack:d(AttackerID)d(TargetID)d(Damage)b(Flags)d(X)d(Y)d(Z)h(Hits)
begin
TargetID:= ReadD(6);
Action; Action;
end;
end;
if (ConnectName = CommanderName) and FromClient and (not CommanderBot) then
case pck[1] of
#$2F: begin
TargetID:= CommanderID;
Action; Action;
end;
#$31: begin
TargetID:= ReadD(2); // Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ)b(ActionID)
Action;
end;
end;
end.__________________
уже пробовал править ИД пакетов, но чтото не очень получилось. PanAm,если этот милый человек вновь мне поможет, то буду рад выложить отредоктированный под ХБ скриптик.
Загвозда как всегда, по всему скрипту искал пакеты эти, а в одном месте даже не понял что это за пакет. Отсутствие знания паскаля даёт свои отпечатки.
Добавлено через 2 минуты
Код:
procedure UseItemObjID(ItemObjID:integer); //Использовать предмет с заданным ItemID
begin
buf:=#$14;
вот что это за пакетик???
Последний раз редактировалось lamer, 16.04.2009 в 21:52.
Причина: Добавлено сообщение
buf:=#$14;
..... SendToServerEx(AssistantName);;
Значит это пакет от клиента, и до Т1 это всегда было
14=UseItem:d(ObjectID)d(d)
Аналог в Т1 это
19=UseItem:d(ObjectID)d(Unknown)
Объясняю как изменять скрипт при переходе на другие хроники. Например с Интерлюдии на Грацию.
Берем packetsT0.ini - здесь описан формат пакетов интерлюдии. Лежит в папке .\SETTINGS пакетхака версий больше 100.
Берем packetsT1.ini - здесь описан формат пакетов грации. Лежит также в папке .\SETTINGS.
Смотрим, что в основном теле begin ... end. отлавливается, первое что видим
Код:
if (ConnectName = NickName) and FromServer then // разбор пакетов от сервера
case pck[1] of
#$01: MoveToLocation01;
смотрим в packetst0.ini пакет с ID=01 от сервера (FromServer) это MoveToLocation
ищем соответствие пакету MoveToLocationв packetst1.ini и находим пакет 2F=MoveToLocation от сервера (FromServer). Меняем ID=01 на ID=2F в скрипте получаем
Код:
if (ConnectName = NickName) and FromServer then // разбор пакетов от сервера
case pck[1] of
#$2F: MoveToLocation01;
Вот счас поработал над 3мя скриптами, не уверен что всё верно зделал, так как не всегда знаю где пакет от сервера, а где от клиента. Но надеюсь что работать будет. Есчё раз спс за подробное разьяснение для нуба.
Добавлено через 7 часов 0 минут
В посте выше отредоктированный скрипт, но почемуто не работает, видимо здесь нужно есчё поменять формат пакета, но как это определить и поменять незнаю. Если ктонить натолкнёт на правильный путь, буду благодарен.
Последний раз редактировалось lamer, 16.04.2009 в 21:54.
Причина: Добавлено сообщение