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

Marketer для шарда Inceptum[Stealth 6.5.2]

Only working scripts
Post Reply
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Marketer для шарда Inceptum[Stealth 6.5.2]

Post by drabadan »

На шарде, на котором я сейчас играю, нет веб интерфейса для маркета, а вендоров дохрена. Подумалось погадалось, написал простой поисковик по вендорам. Скрипт незамысловатый, нет всяких проверок - перепроверок. Попытался сделать просто работоспособную и полезную версию. Если кому пригодится буду рад, что оказался кому-то полезен.

Приходим на маркет, запускаем скрипт ждем пока не напишет апдейт финишед! На данный момент апдейт занимает около 10 минут и желательно закрыть окно клиента, ибо слишком дохрена сумок! Скрипт не считает контейнерами подарочный сумки, впишу чуть позже, стелс их не распознает как контейнеры. После того как скрипт создаст массив итемов, с ним нужно общаться определенным языком.
Ниже приведу примеры:
ищем кольца с лрк.
1. Запрос - help me find!
2. ring lower reagent cost
ищем пс на таминг
1. help me find!
2. taming price
ищем локти с лрк
1. help me find!
2. sleeves lower reagent
вообще я думаю, суть можно уловить. Первый запрос переводит скрипт в режим жду запроса, второй ищет 1 слово в названии товара и дальше уже чего душа пожелает. Если не хочется искать чего то конкретного - пишем просто ring price и будут вообще все кольца которые нашел скрипт!

Буду рад советам по оптимизации и дополнениям!
Спасибо за внимание.

Скрипт на маркет

Code: Select all

program Marketer;

type
 TItem = record
  Name     : String;
  Id       : Cardinal;
  Props    : Array of String;
  Vendor   : String;
  VendorId : Cardinal;
 end;

var
 Items : Array of TItem;
 //Item : TItem;

procedure WaitLag(WaitMS : Integer);
begin
 CheckLag(60000);
 Wait(WaitMS);
end;

function GetFoundItems(var Items: Array Of Cardinal): Integer;
var List: TStringList; i: Integer;
begin
  List := TStringList.Create;
  if GetFindedList(List) = False then Result := 0
  else begin
    SetLength(Items, List.Count);
    for i := 0 to Length(Items)-1 do Items[i] := StrToInt('$'+List.Strings[i]);
    Result := Length(Items);
  end;
  List.Free;
end;

procedure SetItemProps(var fItem : TItem);
var
 Sl : TStringList;  
 i : Integer;
begin
 Sl := TStringList.Create;
 
 StrBreakApart(AnsiLowerCase(GetToolTip(fItem.Id)), '|', Sl);
 
 if Sl.Count > 0 then
  for i := 0 to Sl.Count-1 do
   begin
    SetLength(fItem.Props, Length(fItem.Props) + 1);
   fItem.Props[High(fItem.Props)] := Sl.Strings[i];
   //AddToSystemJournal(Sl.Strings[i]);
   end;
 
 Sl.Free;
end;

procedure SetItemsInContainer(VendorId, Container : Cardinal);
var
 i : Integer;
 fItems : Array of Cardinal;
begin
 UseObject(Container);
 WaitLag(300);
 FindType($FFFF, Container);
 if GetFoundItems(fItems) > 0 then
  for i := 0 to Length(fItems)-1 do   
   begin    
    SetLength(Items, Length(Items)+1);
    Items[High(Items)].Id := fItems[i];
    SetItemProps(Items[High(Items)]);
    Items[High(Items)].VendorId := VendorId;
    Items[High(Items)].Vendor := GetName(VendorId);
    if IsContainer(fItems[i]) then 
     SetItemsInContainer(VendorId, fItems[i]);
    Wait(50);
   end;
end;

procedure MainProc;
var
 fVendors, fItems : Array of Cardinal;  
 i, k, m : Integer;
 VendorTypes : Array of Word;
begin
 FindDistance := 20;
 VendorTypes:= [$0191, $0190];
 for i := 0 to 1 do
  begin
   FindType(VendorTypes[i], Ground);
   if GetFoundItems(fVendors) > 0 then
    for k := 0 to Length(fVendors)-1 do
     begin
      FindType($FFFF, fVendors[k]);
      if GetFoundItems(fItems) > 0 then
       for m := 0 to Length(fItems)-1 do
        if IsContainer(fItems[m]) then
         begin
          SetItemsInContainer(fVendors[k], fItems[m]);
          AddToSystemJournal('Updating goods at vendor: ' + GetName(fVendors[k]) + ' Currently found: ' + IntToStr(Length(Items)));
          Wait(100);
         end;
     end;
  end;
  AddToSystemJournal('Update complete!'); 
end;

procedure SearchItems(ItemName, Props : String);
var
 i, k, m, l : Integer;
begin
 ClearInfoWindow;
 if Length(Items) > 0 then
  for i := 0 to Length(Items)-1 do
   if Length(Items[i].Props) > 0 then
    if BMSearch(1, Items[i].Props[0], ItemName) > 0 then
     for k := 1 to Length(Items[i].Props)-1 do
      if BMSearch(1, Items[i].Props[k], Props) >0 then
       begin
        //ClearInfoWindow;
        Inc(l);
        FillNewWindow(IntToStr(l) + ') ' + Items[i].Props[0] + '; Found at Vendor: ' + Items[i].Vendor + ';');
        FillNewWindow('$' + IntToHex(Items[i].Id, 8));
        for m := 1 to Length(Items[i].Props)-1 do
         begin
          FillNewWindow(Items[i].Props[m]);
          Wait(50);
         end;
        FillNewWindow('                                                              ');
        Wait(50);
        Break;
       end;
  AddToSystemJournal('Search complete.'); 
end;

procedure OnSpeech(Text,SenderName : String; SenderID : Cardinal);
var
 i, k : Integer;
 cTime : TDateTime;
 Sl : TStringList;
 str, str1 : String;
begin 
 if (Text = ('help me find!')) then
  begin
   UOSay('Yes! You can try...');
   Waitlag(100);
   cTime := Now;
   ClearJournal;
   for i := 0 to 40 do
    begin
     WaitLag(500);
     str := LastJournalMessage;
     
     if (str > '') and (LineId = SenderId) then
     begin
      str := Copy(str, Length(GetName(Self))+3, Length(str)-1);
      AddToSystemJournal(str);
      Sl := TStringList.Create;
      StrBreakApart(str, ' ', Sl);      
      for k := 1 to Sl.Count-1 do
       str1 := str1 + ' ' + Sl.Strings[k];
      str1 := Trim(str1);
            
      SearchItems(Sl.Strings[0], str1);
      
      AddToSystemJournal(Sl.Strings[0] + ' ' + str1);
      exit;
     end;
    end;
  end;                                    
end;


begin
 SetEventProc(evUnicodeSpeech, 'OnSpeech');
 MainProc;
 while True do 
  Wait(1000);
end.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Marketer для шарда Inceptum[Stealth 6.5.2]

Post by Vizit0r »

CloseClientUIWindow с параметром wtContainer отлично закрывает контейнеры в граф. клиенте.
Это так, намек.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Stels
Novice
Novice
Posts: 118
Joined: 15.02.2011 12:15

Re: Marketer для шарда Inceptum[Stealth 6.5.2]

Post by Stels »

Запустил скрипт :))
Это какой-то ппц :))))
В общем он просканировал, все гуд

Написал anvil price и скрипт начал творить нереальное :) все кол-во предметов, что он просканировал он начал выводить в инфо виндоус :) еле смог завершить процесс т.к. инфо окно всегда становится активным при выводе новой строчки :) Так и не узнал есть ли anvil'ы на рынке :)
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Marketer для шарда Inceptum[Stealth 6.5.2]

Post by drabadan »

Stels wrote:Запустил скрипт :))
Это какой-то ппц :))))
В общем он просканировал, все гуд

Написал anvil price и скрипт начал творить нереальное :) все кол-во предметов, что он просканировал он начал выводить в инфо виндоус :) еле смог завершить процесс т.к. инфо окно всегда становится активным при выводе новой строчки :) Так и не узнал есть ли anvil'ы на рынке :)
хз хз, он уже у 4 человек работает стабильно. мб есть какая то загвоздка, загогулинка?
Stels
Novice
Novice
Posts: 118
Joined: 15.02.2011 12:15

Re: Marketer для шарда Inceptum[Stealth 6.5.2]

Post by Stels »

drabadan wrote: хз хз, он уже у 4 человек работает стабильно. мб есть какая то загвоздка, загогулинка?
А он нормально реагирует на то, если предмет отсутствует?
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Marketer для шарда Inceptum[Stealth 6.5.2]

Post by drabadan »

Stels wrote:
drabadan wrote: хз хз, он уже у 4 человек работает стабильно. мб есть какая то загвоздка, загогулинка?
А он нормально реагирует на то, если предмет отсутствует?
если не находит, то просто пустое окошко вылазит.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Marketer для шарда Inceptum[Stealth 6.5.2]

Post by drabadan »

сделал не большие фиксы, добавил ельфов.
Исходник

Code: Select all

program Marketer;

type
 TItem = record
  Name     : String;
  Id       : Cardinal;
  Props    : Array of String;
  Vendor   : String;
  VendorId : Cardinal;
 end;

var
 Items : Array of TItem;
 //Item : TItem;

procedure WaitLag(WaitMS : Integer);
begin
 CheckLag(60000);
 Wait(WaitMS);
end;

function GetFoundItems(var Items: Array Of Cardinal): Integer;
var List: TStringList; i: Integer;
begin
  List := TStringList.Create;
  if GetFindedList(List) = False then Result := 0
  else begin
    SetLength(Items, List.Count);
    for i := 0 to Length(Items)-1 do Items[i] := StrToInt('$'+List.Strings[i]);
    Result := Length(Items);
  end;
  List.Free;
end;

procedure SetItemProps(var fItem : TItem);
var
 Sl : TStringList;  
 i : Integer;
begin
 Sl := TStringList.Create;
 
 StrBreakApart(AnsiLowerCase(GetToolTip(fItem.Id)), '|', Sl);
 
 if Sl.Count > 0 then
  for i := 0 to Sl.Count-1 do
   begin
    SetLength(fItem.Props, Length(fItem.Props) + 1);
   fItem.Props[High(fItem.Props)] := Sl.Strings[i];
   //AddToSystemJournal(Sl.Strings[i]);
   end;
 
 Sl.Free;
end;

procedure SetItemsInContainer(VendorId, Container : Cardinal);
var
 i : Integer;
 fItems : Array of Cardinal;
begin
 UseObject(Container);
 Wait(300);
 FindType($FFFF, Container);
 if GetFoundItems(fItems) > 0 then
  for i := 0 to Length(fItems)-1 do   
   begin    
    SetLength(Items, Length(Items)+1);
    Items[High(Items)].Id := fItems[i];
    SetItemProps(Items[High(Items)]);
    Items[High(Items)].VendorId := VendorId;
    Items[High(Items)].Vendor := GetToolTip(VendorId);
    if IsContainer(fItems[i]) then 
     SetItemsInContainer(VendorId, fItems[i]);
    //Wait(50);
   end;
end;

procedure MainProc;
var
 fVendors, fItems : Array of Cardinal;  
 i, k, m : Integer;
 VendorTypes : Array of Word;
begin
 FindDistance := 20;
 VendorTypes:= [$0191, $0190, $025E, $025D];
 for i := 0 to High(VendorTypes) do
  begin
   FindType(VendorTypes[i], Ground);
   if GetFoundItems(fVendors) > 0 then
    for k := 0 to Length(fVendors)-1 do
     begin
      FindType($FFFF, fVendors[k]);
      if GetFoundItems(fItems) > 0 then
       for m := 0 to Length(fItems)-1 do
        if IsContainer(fItems[m]) then
         begin
          SetItemsInContainer(fVendors[k], fItems[m]);
          AddToSystemJournal('Updating goods at vendor: ' + GetName(fVendors[k]) + ' Currently found: ' + IntToStr(Length(Items)));
          //Wait(100);
         end;
     end;
  end;
  AddToSystemJournal('Update complete!'); 
end;

procedure SearchItems(ItemName, Props : String);
var
 i, k, m, l : Integer;
begin
 ClearInfoWindow;
 if Length(Items) > 0 then
  for i := 0 to Length(Items)-1 do
   if Length(Items[i].Props) > 0 then
    if BMSearch(1, Items[i].Props[0], ItemName) > 0 then
     for k := 1 to Length(Items[i].Props)-1 do
      if BMSearch(1, Items[i].Props[k], Props) >0 then
       begin
        //ClearInfoWindow;
        Inc(l);
        FillNewWindow(IntToStr(l) + ') ' + Items[i].Props[0] + '; Found at Vendor: ' + Items[i].Vendor + ';');
        FillNewWindow('$' + IntToHex(Items[i].Id, 8));
        for m := 1 to Length(Items[i].Props)-1 do
         begin
          FillNewWindow(Items[i].Props[m]);
          //Wait(50);
         end;
        FillNewWindow('                                                              ');
        //Wait(50);
        Break;
       end;
  AddToSystemJournal('Search complete.'); 
end;

procedure OnSpeech(Text,SenderName : String; SenderID : Cardinal);
var
 i, k : Integer;
 cTime : TDateTime;
 Sl : TStringList;
 str, str1 : String;
begin 
 if (Text = ('help me find!')) then
  begin
   UOSay('Yes! You can try...');
   Waitlag(100);
   cTime := Now;
   ClearJournal;
   for i := 0 to 40 do
    begin
     WaitLag(500);
     str := LastJournalMessage;
     
     if (str > '') and (LineId = SenderId) then
     begin
      str := Copy(str, Length(GetName(Self))+3, Length(str)-1);
      AddToSystemJournal(str);
      Sl := TStringList.Create;
      StrBreakApart(str, ' ', Sl);      
      for k := 1 to Sl.Count-1 do
       str1 := str1 + ' ' + Sl.Strings[k];
      str1 := Trim(str1);
            
      SearchItems(Sl.Strings[0], str1);
      
      AddToSystemJournal(Sl.Strings[0] + ' ' + str1);
      exit;
     end;
    end;
  end;                                    
end;


begin
 SetEventProc(evUnicodeSpeech, 'OnSpeech');
 MainProc;
 while True do 
  Wait(1000);
end.
Last edited by drabadan on 14.10.2015 0:03, edited 1 time in total.
Clockwerk
Posts: 2
Joined: 23.03.2015 16:09

Re: Marketer для шарда Inceptum[Stealth 6.5.2]

Post by Clockwerk »

У меня при любом запросе выдаёт пустое окно.
Версия стелза 6.5.2
В чём может быть причина?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Marketer для шарда Inceptum[Stealth 6.5.2]

Post by Vizit0r »

пустое окно - это как?
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
MaskedPerson
Neophyte
Neophyte
Posts: 31
Joined: 14.03.2015 12:39

Re: Marketer для шарда Inceptum[Stealth 6.5.2]

Post by MaskedPerson »

Я думаю он имел ввиду пустое окно с результатами.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Marketer для шарда Inceptum[Stealth 6.5.2]

Post by Vizit0r »

а, пропустил FillNewWindow при беглом просмотре.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Marketer для шарда Inceptum[Stealth 6.7.1]

Post by drabadan »

Обновил программку спасибо Crom696 за его ScriptSDK!
Первые шаги в шарпе.

Переписал под шарп, пока без ГУИ и прочего. Проходит всех вендоров в ренже 20 тайлов, становитесь примерно по центру маркета!
После парсинга всех вендоров, которых найдет, начнет создавать документ ексель. Процесс этот достаточно долгий, у меня получилось примерно 11 тысяч строк.

Если кому пригодится - пишите, что исправить, что добавить.

Скомпиленный архив
Исходный код
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Marketer для шарда Inceptum[Stealth 6.7.1]

Post by drabadan »

drabadan wrote:Обновил программку спасибо Crom696 за его ScriptSDK!
Первые шаги в шарпе.

Переписал под шарп, пока без ГУИ и прочего. Проходит всех вендоров в ренже 20 тайлов, становитесь примерно по центру маркета!
После парсинга всех вендоров, которых найдет, начнет создавать документ ексель. Процесс этот достаточно долгий, у меня получилось примерно 11 тысяч строк.

Если кому пригодится - пишите, что исправить, что добавить.

Прикрутил ГУИ.
Скомпиленный архив
Исходный код
Post Reply