- Рег
- 24 Авг 2016
- Сообщения
- 118
- Реакции
- 0
Использован класс предоставленный rsd.
примитивный перебор ЛСов в нужной палке. В скрипте задать ИД необходимых итемов, Открыть окна вставки-снятия, запасшись расходниками (если в сумке более одной палки с одинаковым ИД, то скинуть ненужные в ВХ). Контроль попавшихся статов в строке -
while (pos('часть',stat12text)>0)or(pos('неуяз',stat12text)>0)or
(pos('часть',stat34text)>0)or(pos('неуяз',stat34text)>0) do delay(1000);
ищем по словам (в примере тормознет если будут статы наподобие "отражает часть урона блаблабла", и "эффект временной неуязвимости..." как-то так) Что именно ловить - скилы или прибавку статов - без разницы. Одета или снята пуха - без разницы. Не использует mouse_event и иже с ними. Работает на смартгварде.
Скрипт кинуть в папку scripts. Туда же файл Full_LS.txt.
В логе будет выводить инфу о пойманных активных скилах. ЕСЛИ выводимое несоответствует истине - то копать надо смещения в строках
tmp:=copy(pckHex,3,2)+copy(pckHex,1,2);
tmp:=copy(pckHex,11,2)+copy(pckHex,9,2);
Если сочтет что поймано чет "нужное", то приостановит работу. Если фактически стат не нужен - руками вынуть его и работа продолжится.
Тестилось на ХФ, скруд50.
На свой страх и риск.
примитивный перебор ЛСов в нужной палке. В скрипте задать ИД необходимых итемов, Открыть окна вставки-снятия, запасшись расходниками (если в сумке более одной палки с одинаковым ИД, то скинуть ненужные в ВХ). Контроль попавшихся статов в строке -
while (pos('часть',stat12text)>0)or(pos('неуяз',stat12text)>0)or
(pos('часть',stat34text)>0)or(pos('неуяз',stat34text)>0) do delay(1000);
ищем по словам (в примере тормознет если будут статы наподобие "отражает часть урона блаблабла", и "эффект временной неуязвимости..." как-то так) Что именно ловить - скилы или прибавку статов - без разницы. Одета или снята пуха - без разницы. Не использует mouse_event и иже с ними. Работает на смартгварде.
Скрипт кинуть в папку scripts. Туда же файл Full_LS.txt.
В логе будет выводить инфу о пойманных активных скилах. ЕСЛИ выводимое несоответствует истине - то копать надо смещения в строках
tmp:=copy(pckHex,3,2)+copy(pckHex,1,2);
tmp:=copy(pckHex,11,2)+copy(pckHex,9,2);
Если сочтет что поймано чет "нужное", то приостановит работу. Если фактически стат не нужен - руками вынуть его и работа продолжится.
Тестилось на ХФ, скруд50.
На свой страх и риск.
Код:
uses SysUtils, Classes;
const
Weapon_ID = 6313;
LS_ID = 14166;
Gem_ID = 2130;
Gem_Count = 20;
type
TNetworkPacket = class
public
Current: Integer;
procedure WriteD(value: Cardinal);
procedure WriteH(value: Word);
procedure WriteC(value: Byte);
procedure WriteQ(value: int64);
function ToHex(): String;
private
data: Array[0..10240] of Byte;
end;
procedure TNetworkPacket.WriteD;
begin
(PCardinal(@data[Current])^):= value;
Current:= Current + sizeof(Cardinal);
end;
procedure TNetworkPacket.WriteQ;
begin
(PCardinal(@data[Current])^):= value;
Current:= Current + sizeof(int64);
end;
procedure TNetworkPacket.WriteH;
begin
(PWord(@data[Current])^):= value;
Current:= Current + sizeof(Word);
end;
procedure TNetworkPacket.WriteC;
begin
(PByte(@data[Current])^):= value;
Current:= Current + sizeof(Byte);
end;
function TNetworkPacket.ToHex;
var
i: Cardinal;
begin
result:= '';
for i:= 0 to Current - 1 do
begin
result:= result + IntToHex(data[i], 2);
end;
end;
var
Weapon_OID:integer = 0;
LS_OID:integer = 0;
Gem_OID:integer = 0;
wait_Result:boolean = false;
Item:TL2Item;
packet: TNetworkPacket;
LS_Skills:TStringList;
idx:integer;
stat12:integer;
stat34:integer;
stat12text:string;
stat34text:string;
procedure OnPacket(ID, ID2: Cardinal; Data: Pointer; Size: Word);
var
i:integer;
tmp:string;
pckHex:string;
begin
case intToHex(id, 2) of
'FE' :
begin
case id2 of
//FE56=ExVariationResult:d(stat12)d(stat34)d(:)
$56:begin
pckHex:='';
if size<>0 then begin
for i:=0 to Size-1 do begin
pckHex:=pckHex+intToHex((pbyte(pointer(integer(data) + i))^),2);
end;
end;
tmp:=copy(pckHex,3,2)+copy(pckHex,1,2);
stat12:=strtoint('$'+tmp);
stat12text:=LS_Skills.Values[inttostr(stat12)];
tmp:=copy(pckHex,11,2)+copy(pckHex,9,2);
stat34:=strtoint('$'+tmp);
stat34text:=LS_Skills.Values[inttostr(stat34)];
if (pos('ктивное',stat12text)>0)then print(stat12text);
if (pos('ктивное',stat34text)>0)then print(stat34text);
//print('---------------------------------------------------------');
end;
//FE58=ExVariationCancelResult:h(subID)d(result)d(:)
$58:begin
delay(500);
stat12text:='';
stat34text:='';
end;
end;
end;
end;
end;
begin
if ItemList.ByID(Weapon_ID, Item) then Weapon_OID:=Item.Oid else Script.Stop;
if ItemList.ByID(LS_ID, Item) then LS_OID:=Item.Oid else Script.Stop;
if ItemList.ByID(Gem_ID, Item) then Gem_OID:=Item.Oid else Script.Stop;
LS_Skills:=TStringList.Create;
try
LS_Skills.LoadFromFile('.\Scripts\Full_LS.txt');
except
Print('Не найден файл Full_LS.txt');
Script.Stop;
end;
stat12text:='';
stat34text:='';
while (Engine.Status=lsOnline) do begin
delay(500);
packet:= TNetworkPacket.Create();
packet.WriteC($D0);
packet.WriteH($41);
packet.WriteD(Weapon_OID);
packet.WriteD(LS_OID);
packet.WriteD(Gem_OID);
packet.WriteQ(Gem_Count);
Engine.SendToServer(packet.ToHex());
delay(500);
while ((stat12text='')and(stat34text='')) do delay(500);
while (pos('часть',stat12text)>0)or(pos('неуяз',stat12text)>0)or
(pos('часть',stat34text)>0)or(pos('неуяз',stat34text)>0) do delay(1000);
if Not((stat12text='')and(stat34text=''))then begin
packet:= TNetworkPacket.Create();
packet.WriteC($D0);
packet.WriteH($43);
packet.WriteD(Weapon_OID);
Engine.SendToServer(packet.ToHex());
end;
end;
end.