На шарде, на котором я сейчас играю, нет веб интерфейса для маркета, а вендоров дохрена. Подумалось погадалось, написал простой поисковик по вендорам. Скрипт незамысловатый, нет всяких проверок - перепроверок. Попытался сделать просто работоспособную и полезную версию. Если кому пригодится буду рад, что оказался кому-то полезен.
Приходим на маркет, запускаем скрипт ждем пока не напишет апдейт финишед! На данный момент апдейт занимает около 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 и будут вообще все кольца которые нашел скрипт!
Буду рад советам по оптимизации и дополнениям!
Спасибо за внимание.
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.
Re: Marketer для шарда Inceptum[Stealth 6.5.2]
Posted: 27.11.2014 10:08
by Vizit0r
CloseClientUIWindow с параметром wtContainer отлично закрывает контейнеры в граф. клиенте.
Это так, намек.
Re: Marketer для шарда Inceptum[Stealth 6.5.2]
Posted: 20.12.2014 15:58
by Stels
Запустил скрипт )
Это какой-то ппц )))
В общем он просканировал, все гуд
Написал anvil price и скрипт начал творить нереальное все кол-во предметов, что он просканировал он начал выводить в инфо виндоус еле смог завершить процесс т.к. инфо окно всегда становится активным при выводе новой строчки Так и не узнал есть ли anvil'ы на рынке
Re: Marketer для шарда Inceptum[Stealth 6.5.2]
Posted: 20.12.2014 16:04
by drabadan
Stels wrote:Запустил скрипт )
Это какой-то ппц )))
В общем он просканировал, все гуд
Написал anvil price и скрипт начал творить нереальное все кол-во предметов, что он просканировал он начал выводить в инфо виндоус еле смог завершить процесс т.к. инфо окно всегда становится активным при выводе новой строчки Так и не узнал есть ли anvil'ы на рынке
хз хз, он уже у 4 человек работает стабильно. мб есть какая то загвоздка, загогулинка?
Re: Marketer для шарда Inceptum[Stealth 6.5.2]
Posted: 20.12.2014 16:06
by Stels
drabadan wrote:
хз хз, он уже у 4 человек работает стабильно. мб есть какая то загвоздка, загогулинка?
А он нормально реагирует на то, если предмет отсутствует?
Re: Marketer для шарда Inceptum[Stealth 6.5.2]
Posted: 20.12.2014 16:15
by drabadan
Stels wrote:
drabadan wrote:
хз хз, он уже у 4 человек работает стабильно. мб есть какая то загвоздка, загогулинка?
А он нормально реагирует на то, если предмет отсутствует?
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.
Re: Marketer для шарда Inceptum[Stealth 6.5.2]
Posted: 23.03.2015 16:12
by Clockwerk
У меня при любом запросе выдаёт пустое окно.
Версия стелза 6.5.2
В чём может быть причина?
Re: Marketer для шарда Inceptum[Stealth 6.5.2]
Posted: 23.03.2015 23:44
by Vizit0r
пустое окно - это как?
Re: Marketer для шарда Inceptum[Stealth 6.5.2]
Posted: 24.03.2015 0:44
by MaskedPerson
Я думаю он имел ввиду пустое окно с результатами.
Re: Marketer для шарда Inceptum[Stealth 6.5.2]
Posted: 24.03.2015 1:31
by Vizit0r
а, пропустил FillNewWindow при беглом просмотре.
Re: Marketer для шарда Inceptum[Stealth 6.7.1]
Posted: 14.10.2015 0:03
by drabadan
Обновил программку спасибо Crom696 за его ScriptSDK!
Первые шаги в шарпе.
Переписал под шарп, пока без ГУИ и прочего. Проходит всех вендоров в ренже 20 тайлов, становитесь примерно по центру маркета!
После парсинга всех вендоров, которых найдет, начнет создавать документ ексель. Процесс этот достаточно долгий, у меня получилось примерно 11 тысяч строк.
Если кому пригодится - пишите, что исправить, что добавить.
drabadan wrote:Обновил программку спасибо Crom696 за его ScriptSDK!
Первые шаги в шарпе.
Переписал под шарп, пока без ГУИ и прочего. Проходит всех вендоров в ренже 20 тайлов, становитесь примерно по центру маркета!
После парсинга всех вендоров, которых найдет, начнет создавать документ ексель. Процесс этот достаточно долгий, у меня получилось примерно 11 тысяч строк.
Если кому пригодится - пишите, что исправить, что добавить.