Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

АвтоЛС

Рег
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.
На свой страх и риск.
Код:
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.
 

Вложения

  • Full_LS.txt
    1.4 MB · Просмотры: 82
Ага, только твой скрипт палится хотя бы по тому, что последовательность пакетов не полная. Клиент должен слать 3 пакета, а не 1 в цикле ;)

Выводить можно не в лог, а на клиент пакетами, как у меня было сделано в году так 2014м.
 
Там жеж написано, тестилось на скруде. Из-за модификации интерфейса (а в окошке вставки ЛСов там добавлена кнопка "Повторить", и не требует повторной укладки итемов), там именно такая вот последовательность.
Но если все же гложет необходимость подсмотреть чего там именно происходит, то можно так (мне было удобнее сохранять именно пакеты сразу, разбор проводился уже в другом софте, т.к. бывало что структуру приходилось подбирать) -
Код:
procedure OnCliPacket(ID, ID2: Cardinal; Data: Pointer; Size: Word);
var
  charName : String;
  character: TL2Live;
  i, j: cardinal;
  packet: TL2Packet;
  Pck:PChar;

begin
  case intToHex(id, 2) of
    'D0' :
    begin
      // data - указатель на данные
      //Size - размер пакета без ID
      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;
      if id2<>0 then begin
        print('C->S : '+inttohex(ID,2)+' '+inttohex(ID2,2)+' '+pckHex);
        ClpckList.Add(inttohex(ID,2)+' '+inttohex(ID2,2)+' '+pckHex);
        ClpckList.add('');
        ClpckList.SaveToFile('FromClient.pck');
        end else begin
        print('C->S : '+inttohex(ID,2)+' '+pckHex);
        ClpckList.Add(inttohex(ID,2)+' '+pckHex);
        ClpckList.add('');
        ClpckList.SaveToFile('FromClient.pck');
        
        end;
      //end;
    //end;
    end;
  end;
end;
Но, как давным-давно показала практика, сервера вполне лояльно относятся к пропуску прелюдии в виде
D026=RequestConfirmTargetItem:h(subID)d(ObjectID)
D027=RequestConfirmRefinerItem:h(subID)d(TargetItemObjID)d(RefinerItemObjID)
D028=RequestConfirmGemStone:h(subID)d(TargetItemObjID)d(RefinerItemObjID)d(GemStoneItemObjID)q(GemStoneCount)
 
тоже делал такое , проверял свой на аверке нормально работало.
 
На всех явах прокатиться без проблем
 
BreadfanLock написал(а):
Тестилось на ХФ, скруд50.
Под ИЛ надо имзенить состав запроса на RequestRefine:h(psz)c(Id)h(SubId)d(targetOID)d(refinerOID)d(gemstoneOID)d(Count), и смотреть какой ответ с сервера приходит.
 
а не легче искать в списке скилов, нужные скилы?) чем разбирать пакет
 
может и легче. Если 1)Одета пушка в которую ловишь и 2) ловишь активные\пасивные скилы, а не статы.
 
Запустил на сервере scryde x1200 (Epilogue). ЛСы перебирает, но почему-то нифига не останавливается, что бы я не задавал в While. Понимаю, что инфы дал не больше, чем козел молока, но может у Вас, как у разработчика, есть мысли, что может идти не так ?
Большое спасибо!
 
if (pos('ктивное',stat12text)>0)then print(stat12text);
if (pos('ктивное',stat34text)>0)then print(stat34text);
замени на

print(stat12text);
print(stat34text);
и посмотри, соответствует ли выводимые названия лсов в логе тому, что пишется в клиенте.
 
Спустя два дня использования вашего скрипта (спасибо огромное, так или иначе, скрипт определенно хорош, все проблемы, уверен, связаны с моими кривыми руками, или с кривой настройкой ЛСов на сервере) заметил следующее:

Использую скрипт для поимки ЛСов (6 штук в арбалеты) "ДМ + точность 2.78", и никаких иных, лишь об этом ЛСе дальше речь и пойдет.
За 2 прошедших дня, бот перетыкал около 55-60к ЛСов, и поймал лишь один экземпляр искомого. (исходя из такой статистики, в меня закрались сомнения, что бот все же пропускает по какой-то причине определенные варианты).
Сейчас мой цикл (которому удалось поймать 1 вариант из 60к попыток) выглядит так:

while (pos('очн',stat12text)>0) and
(pos('ашу Физ. Атк. В PvP',stat34text)>0)
do Script.Stop;

Но сперва, при первом запуске адреналина, я выставил проверку на любой ДМ, без проверки на какие либо доп. статы. Строку в проверку цикла вырезал прямо из вашего фулл_лс.тхт, за исключением слов "предметное умение: ", так как на эпилог хрониках исп. слово "пассивный: ".
И, к моему глуб. разочарованию, спустя буквально 60 секунд бот пропускает первый ДМ. Я такой чешу репу, чешу, лезу в ваш файл и замечаю, что в вашей строке "увеличивает Вашу Физ. Атк. в PvP", буква "в" перед "PvP" - маленькая, а в окне пухи, где виден ЛС, на моем сервере она заглавная. Я поменял в вашем файле "в" на "В", и о чудо, бот тормознул на ДМ. Я успокоился, дописал нужные проверки статов и пошел спать, проснувшись на утро, я увидел желанный ЛС, но офигел от количества потраченного бабла - 30к ЛСов!!! Опять закрались сомнения: что-то он пропускает, ведь я руками ловил любой ЛС максимум за 10к вставок.

И тут до меня дошла одна глупая на первый взгляд мысль: в вашем файле пассивных ДМов - 10 штук (ну как и уровней, собственно у скилла), и "однострочных бонусных точностей" так же несколько (+1.1, + 1.5, +2.1, +2.78), но у меня на сервере лишь один вариант ДМ - 10 лвл. На скрайде нельзя поймать скилл НЕ ДЕСЯТОГО УРОВНЯ. (ДМа 9 лвл просто не существует, какими бы ЛСами, какого бы уровня ты не ловил, Скрайд всегда вставит тебе 10 лвл скилла). Аналогично и с доп прибавками: если на скрайде ты ловишь доп. бонус. точность "в одну строку", то это 100% +2.78, и ни что иначе (+1.1, +1.5, +2.1 и др. просто не существует). А теперь эпик фейл - "в" на "В" я поменял то лишь в одном вашем ДМе, а 9-ть остальных оставил, как были: с "в".

Простите, что так много текста, пожалуйста, уже почти конец...

Посему, уважаемый знаток, вопрос у меня такой:

Каким образом осуществляется алгоритм взаимодействия: пойманный ЛС в игре -> строка в цикле While -> вариант строки в вашем фулл_ЛС.тхт.

Может ли быть следующее:

бот поймал ДМ 10 лвл + точность 2.78 на моем сервере, но, в силу авторских правок и замены искомого администрацией, этот ДМ, на самом деле, является ДМ 9-го лвл, и точности там не 2.78, а 1.5 например, просто отображает на Скрайде всегда ДМ 10 и точность 2.78. И посему, бот распознаёт этот ЛС не как искомый и удаляет, хотя на самом деле, он именно искомым и является!?

P.S. Если вы до сюда дочитали - вы просто мой герой!
 
файл full_ls выпиливался из клиента скруда хф х50 в начале июля. Если есть отличия в ИД с эпилогом пвп - будут проблемы (хотя это маловероятно). Кстати - без разницы как пишется в клиенте, лишь бы совпадали ИД. В проверке писать именно как в файле.

Дело скорее в проверке -

while (pos('очн',stat12text)>0) and
(pos('ашу Физ. Атк. В PvP',stat34text)>0)

Это примерно как "остановить, если первый стат с точностью, а второй с "атакой в пвп", а если будет наоборот? Атака выпадет в первый стат, а точность во второй?
Пробуй расширить так -
Код:
while ((pos('очн',stat12text)>0)or(pos('очн',stat34text)>0)) and
    ((pos('ашу Физ. Атк. В PvP',stat12text)>0)or(pos('ашу Физ. Атк. В PvP',stat34text)>0))
 
Назад
Сверху