Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Определение ID нпц по нику

тут можно задать вопрос по скриптингу
Post Reply
Blade
Neophyte
Neophyte
Posts: 13
Joined: 06.04.2016 0:44

Определение ID нпц по нику

Post by Blade »

Всем привет.
Я тут подумываю написать нормальный скрипт для автозакупки по РБ, но хочу сделать максимально четко и по уму - обойтись без массива с айдишниками вендоров. Уверен, что сделать это можно, подскажите какие использовать функции, и если можно киньте пример где нечто подобное было уже реализовано- дальше я сам разберусь.
Суть такая - вбиваешь в массив все названия вендоров которые нужны для текущей закупки (допустим скупаем реги- тогда массив будет по типу ['The Mage', 'The Alchemiest', 'The Scribe'].
У нас 1 руна на магазин. Чар прилетает, и в области экрана либо определенного количество тайлов вокруг себя сканирует все живое, находит ники, в которых содержится один из элементов нашего массива, определяет его координаты, подходит и закупает со списка покупок.
Собственно говоря, жирным я выделил то что не знаю как сделать.
Спасибо за помощь!
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Определение ID нпц по нику

Post by drabadan »

Blade wrote:Всем привет.
Я тут подумываю написать нормальный скрипт для автозакупки по РБ, но хочу сделать максимально четко и по уму - обойтись без массива с айдишниками вендоров. Уверен, что сделать это можно, подскажите какие использовать функции, и если можно киньте пример где нечто подобное было уже реализовано- дальше я сам разберусь.
Суть такая - вбиваешь в массив все названия вендоров которые нужны для текущей закупки (допустим скупаем реги- тогда массив будет по типу ['The Mage', 'The Alchemiest', 'The Scribe'].
У нас 1 руна на магазин. Чар прилетает, и в области экрана либо определенного количество тайлов вокруг себя сканирует все живое, находит ники, в которых содержится один из элементов нашего массива, определяет его координаты, подходит и закупает со списка покупок.
Собственно говоря, жирным я выделил то что не знаю как сделать.
Спасибо за помощь!

Code: Select all

var VendorList : Array of Cardinal;
function GetVendors(ofType : String; AllThatFound : Array of Cardinal) : Integer;
var
 i : Integer;
begin 
 SetLength(VendorList, 0);
 for i := Low(AllThatFound) to High(AllThatFound) do
  if(Pos(ofType, GetToolTip(AllThatFound[i]) > 0) then begin
   SetLength(VendorList, Length(VendorList) + 1);
   VendorList[High(VendorList)] := AllThatFound[i];
 end;
 Result := Length(VendorList);
end;

Примерно так, если ето ранка. Если не ранка то там чуток по другому надо делать. Писал "на коленке" прям здесь, не компилил.
Blade
Neophyte
Neophyte
Posts: 13
Joined: 06.04.2016 0:44

Re: Определение ID нпц по нику

Post by Blade »

drabadan wrote: Примерно так, если ето ранка. Если не ранка то там чуток по другому надо делать. Писал "на коленке" прям здесь, не компилил.
Не ранка, Пол. Идею примерно понял, только надо будет сделать наверно чтобы функция возвращала сам массив, а не его длину, и в идеале еще бы как-то получать результирующий массив со всех названий вендоров для скупки, по которому уже делать обход-скупку. Я не помню, в стелсе (паскале) как-то можно складывать массивы, как в пхп например?

Code: Select all

$a = array('1');
$b = array('2');
$c = array();
$c = array_merge($a, $b) // c ['1','2']
И главный вопрос - как при каждом рекалле для этой функции наполнять массив AllThatFound?
Last edited by Blade on 17.05.2016 23:30, edited 1 time in total.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Определение ID нпц по нику

Post by drabadan »

Blade wrote:
drabadan wrote: Примерно так, если ето ранка. Если не ранка то там чуток по другому надо делать. Писал "на коленке" прям здесь, не компилил.
Не ранка, Пол. Идею примерно понял, только надо будет сделать наверно чтобы функция возвращала сам массив, а не его длину. Главный вопрос - как при каждом рекалле для этой функции наполнять массив AllThatFound?
я не правильно прочитал... Увиделось, что жирным выделено то, что вы как раз знаете как реализовать. Ну проверять же вендоров, а они как минимум 2х типов. Ищите в ренже 20 $190 $191 заполняйте массивчик. Вообще по хорошему, если идти в ногу со временем и использовать стелс 7 - то лучше реализовывать через класс со своими функциями, если просто паскальскрипт то я базовый функционал заполнения написал вам выше.

Давайте будем последовательно двигаться, попробуйте нам сюда написать что вам вернет в сисжорнал следующий скрипт.

Code: Select all

program GetTTip;
begin
AddToSystemJournal(GetToolTip(Self));
end.

//лучше, конечно, чтоб вы вместо селф использовали айдишник любого вендора.
program GetTTip;
begin
AddToSystemJournal(GetToolTip($0000011) +' ' + GetName($0000001));
end.
З.Ы. Складывать массивы нет необходимости. Архитектурно ето как то странно, плодить массивы и потом целиком их конкатенировать. Наполняйте сразу нужный.
Blade
Neophyte
Neophyte
Posts: 13
Joined: 06.04.2016 0:44

Re: Определение ID нпц по нику

Post by Blade »

Что такое 190 и 191, тип вендоров мужчины и женщины человека? А как забить этот массив, если FindType возвращает только одно значение?
Ну вернет по всей видимости ваша функция Name The Scribe (Human) или типа того.
В паскальные ООП дебри макаться не хочу, цель написать простой скриптик, единственную часть которого я не понимаю - как раз где и как брать на каждый рекалл динамический массив из айдишников нужных мне вендоров :)
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Определение ID нпц по нику

Post by drabadan »

Рабочий трешачек.

Code: Select all

program getVendors;

var
 VendorTypes : Array of String;
 VendorFound : Array of Cardinal;
 
procedure Initialize();
begin
 VendorTypes := ['Scribe', 'Mage', 'Putin', 'Ninja'];
 
 FindDistance := 20;
 MoveOpenDoor := True;
end;


function GetFoundItems(OfType : Word): Integer;
var 
 List: TStringList; 
 i, k: Integer;
 tmpBitch : Cardinal;
begin
  FindType(OfType, Ground);
  List := TStringList.Create;
  if GetFindedList(List) = False then Result := 0
  else begin      
    for i := 0 to List.Count-1 do begin
     tmpBitch := StrToInt('$'+List.Strings[i]);
     for k := Low(VendorTypes) to High(VendorTypes) do
       if(Pos(VendorTypes[k], GetToolTip(tmpBitch)) > 0) then begin
        SetLength(VendorFound, Length(VendorFound) + 1);
        VendorFound[High(VendorFound)] := tmpBitch;        
       end;
      end;
    Result := 0;
  end;
  List.Free;
end;


procedure ShopActions;
var i : Ineteger;
begin
 GetFoundItems($0190);
 GetFoundItems($0191);  
 
 AddTOSystemJournal(IntTOStr(Length(VendorFound))); 
 for i := Low(VendorFound) to High(VendorFound) do begin
  newMoveXY(GetX(VendorFound[i]), GetY(VendorFound[i]), true, 1, true);
  {Купи у етого вендора чо там надо}
 end;
  
 Length(VendorFound, 0);
end; 
 
begin
 Initialize();
 
 ShopActions();
 
end. 
Last edited by drabadan on 18.05.2016 9:08, edited 1 time in total.
Blade
Neophyte
Neophyte
Posts: 13
Joined: 06.04.2016 0:44

Re: Определение ID нпц по нику

Post by Blade »

Спасибо еще раз огромное :)
Все работает
Blade
Neophyte
Neophyte
Posts: 13
Joined: 06.04.2016 0:44

Re: Определение ID нпц по нику

Post by Blade »

Обозначу проблему - опять же, может кто-то сталкивался и знает решение.
Скрипт готов, все отлично, но проблема в самом шарде :)
Короче говоря, бывает что вендоров заглючивает, и покупаемый товар у них не появляется. Притом когда им повторно сказать buy, это не помогает. Нужно проскролить меню их покупок до конца, и уже потом еще раз сказать buy.
Какие могут быть решения с точки зрения стелса? Не знаю какой именно сигнал дает серверу этот проскролл до конца на клиенте, но может его можно вызвать какими-то манипуляциями?
Пробовал элементарно перед покупкой продавать вендору золото - чтобы он сказал "это не продается" и тогда может он расчехлится и обновит свои закрома - не помогло.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Определение ID нпц по нику

Post by drabadan »

Blade wrote:Обозначу проблему - опять же, может кто-то сталкивался и знает решение.
Скрипт готов, все отлично, но проблема в самом шарде :)
Короче говоря, бывает что вендоров заглючивает, и покупаемый товар у них не появляется. Притом когда им повторно сказать buy, это не помогает. Нужно проскролить меню их покупок до конца, и уже потом еще раз сказать buy.
Какие могут быть решения с точки зрения стелса? Не знаю какой именно сигнал дает серверу этот проскролл до конца на клиенте, но может его можно вызвать какими-то манипуляциями?
Пробовал элементарно перед покупкой продавать вендору золото - чтобы он сказал "это не продается" и тогда может он расчехлится и обновит свои закрома - не помогло.
аж никакого, сервер присылает список товаров, а клиент уже под них создает гамп который присылает тебе. То есть "проскралливание" происходит на стороне клиента.
Blade
Neophyte
Neophyte
Posts: 13
Joined: 06.04.2016 0:44

Re: Определение ID нпц по нику

Post by Blade »

drabadan wrote:
Blade wrote:Обозначу проблему - опять же, может кто-то сталкивался и знает решение.
Скрипт готов, все отлично, но проблема в самом шарде :)
Короче говоря, бывает что вендоров заглючивает, и покупаемый товар у них не появляется. Притом когда им повторно сказать buy, это не помогает. Нужно проскролить меню их покупок до конца, и уже потом еще раз сказать buy.
Какие могут быть решения с точки зрения стелса? Не знаю какой именно сигнал дает серверу этот проскролл до конца на клиенте, но может его можно вызвать какими-то манипуляциями?
Пробовал элементарно перед покупкой продавать вендору золото - чтобы он сказал "это не продается" и тогда может он расчехлится и обновит свои закрома - не помогло.
аж никакого, сервер присылает список товаров, а клиент уже под них создает гамп который присылает тебе. То есть "проскралливание" происходит на стороне клиента.
Однако товар по факту не покупается, потому что его в списке нет, и через секунду если проскролить и снова нажать buy- уже появляется и покупается. Мистика?
Что с этим можно сделать?
Post Reply