Autohotkey как пользоваться poe
The 1st line assign a hotkey, here is the function key 1 "F1".
The 2nd line is a autohotkey command. "Send" is meaning typing something on the keyboard and in this case it will type "Hello World!!"
"Return" means the end of the macro.
4) learn about function
F1::
SayHelloWorld()
Return
SayHelloWorld() Send, Hello World!!
>
This macro will do exactly same thing with the above macro, type "Hello World!!" when you hit "F1". But this time, when you hit "F1" it calls a function called "SayHelloWorld()" and the function "do" the type Hello World things.
You might question why it need to be wroten like that but I will explain later.
5) If I want the macro only on PoE .
$F1::
IfWinActive Path of Exile
DoSomething()
>Else Send,
>
Return
Now we can have all the macros listed on the top of the script and the functions at the bottom of the script. Whenever you want to change the hotkey, you can just edit first few lines.
6) Write a /oos macro
$F1::
IfWinActive Path of Exile
oos()
>Else Send,
>
Return
The 1st half is easy, its just copy and paste from the (5) and change the function to "oos()".
For the 2nd half is the function oos(). It first hit the "enter"(), then type in "/oos" and then hit enter again.
[Removed by Support]
8) PoE UI and windowed full-screen
I would also recommend to change the video setting to windowed full-screen so we can use some tooltips function. But if you dont intend to touch any video settings. You can stop reading now.
Autohotkey has a build-in function to pop-up a small "tooltip" for message, but it only work on "windowed full-screen" or "window" modes.
Here is an example for 1080p resolution.
$F1::
IfWinActive Path of Exile
Resync()
>Else Send,
>
Return
; oos + remaining
Resync() Send /oos
x := 1820
y := 1055
ShowToolTips("Sync-ed", 2000, x, y)
Send /remaining
>
ShowToolTips(content, offTime, px, py) ToolTip, %content%, px, py
SetTimer, RemoveToolTip, %offTime%
>
RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
Return
Dont get scary when you hear the name. Window-spy is autohotkey function to get the x,y coordinate of active window or mouse pointer. You can just right-click the green H icon of autokey and play with it yourself and you will know how to use it, pretty easy.
For that you can edit the (x,y) for where you want the tool tips to show.
It need to use with the tooltips function. Make sure you have those lines. ( but if you have that always, no need to deplicate)
ShowToolTips(content, offTime, px, py) ToolTip, %content%, px, py
SetTimer, RemoveToolTip, %offTime%
>
RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
Return
If( Clipboard != "" ) Info := Clipboard
StringSplit, LineArray, Info, `n
IsNotOrbOrGem := RegExMatch(LineArray1, "Currency|Gem")>0?false:true
If( IsNotOrbOrGem ) <
HaveName := RegExMatch(LineArray1, "Rare|Unique")>0?true:false
StringTrimRight Item_name, LineArray2, 1
Result = %Item_name%
Item_type := LineArray4
Identified := RegExMatch( Info, "Unidentified")>0?false:true
If( HaveName && Identified ) StringTrimRight, Item_name, LineArray3, 1
Result = %Result%, %Item_name%
Item_type := LineArray5
>
Loop %LineArray0%
line := LineArray%a_index%
seek := "Itemlevel: "
StringGetPos, pos, line, %seek%
If( pos>=0 ) StringTrimRight, line, line, 1
If( IsAboveSixty && !Identified )
line = %line% `(60+`)
Result = %Result%`n%line%
>
>
IsWeapon := RegExMatch( Item_type, "One Handed Sword|Two Handed Sword|One Handed Mace|Two Handed Mace|One Handed Axe|Two Handed Axe|Wand|Dagger|Bow|Claw|Staff" )>0?true:false
If ( IsWeapon && Identified ) dmin := 0
dmax := 0
aps := 0
qty := 0
percent_dmg := 0
amin := 0
amax := 0
fmin := 0
fmax := 0
cmin := 0
cmax := 0
lmin := 0
lmax := 0
Loop %LineArray0%
line := LineArray%a_index%
seek := "Quality: +"
StringGetPos, pos, line, %seek%
If( pos>=0 ) Result = %Result%`n%line%
StringTrimLeft, rest, line, 10
StringGetPos, pos, rest, `%
StringTrimRight, qty, rest, StrLen(rest)-pos
qty += 0
>
seek := "Physical Damage: "
StringGetPos, pos, line, %seek%
If( pos>=0 ) Result = %Result%`n%line%
StringTrimLeft, rest, line, 17
StringGetPos, pos, rest, -
StringTrimRight, dmin, rest, StrLen(rest)-pos
dmin += 0
StringTrimLeft, rest, rest, pos+1
seek := " (augmented)"
StringGetPos, pos, rest, %seek%
If( pos > 0) StringGetPos, pos, rest, %A_SPACE%
StringTrimRight, dmax, rest, StrLen(rest)-pos
>Else dmax := rest
>
dmax += 0
>
seek := "Attacks per Second: "
StringGetPos, pos, line, %seek%
If( pos>=0 ) Result = %Result%`n%line%
StringTrimLeft, aps, line, 20
aps += 0
>
seek := "% increased Physical Damage"
StringGetPos, pos, line, %seek%
If( pos>=0 ) Result = %Result%`n%line%
StringTrimRight, percent_dmg, line, 28
percent_dmg += 0
>
seek := "Adds "
StringGetPos, pos, line, %seek%
If( pos>=0 ) Result = %Result%`n%line%
StringTrimLeft, line, line, 5
seek := " Physical Damage"
StringGetPos, pos2, line, %seek%
If( pos2>=0 ) StringTrimRight, rest, line, 17
StringGetPos, pos, rest, -
StringTrimRight, amin, rest, StrLen(rest)-pos
amin += 0
StringTrimLeft, amax, rest, pos+1
amax += 0
>
seek := " Fire Damage"
StringGetPos, pos2, line, %seek%
If( pos2>=0 ) StringTrimRight, rest, line, 13
StringGetPos, pos, rest, -
StringTrimRight, fmin, rest, StrLen(rest)-pos
fmin += 0
StringTrimLeft, fmax, rest, pos+1
fmax += 0
>
seek := " Cold Damage"
StringGetPos, pos2, line, %seek%
If( pos2>=0 ) StringTrimRight, rest, line, 13
StringGetPos, pos, rest, -
StringTrimRight, cmin, rest, StrLen(rest)-pos
cmin += 0
StringTrimLeft, cmax, rest, pos+1
cmax += 0
>
seek := " Lightning Damage"
StringGetPos, pos2, line, %seek%
If( pos2>=0 ) StringTrimRight, rest, line, 18
StringGetPos, pos, rest, -
StringTrimRight, lmin, rest, StrLen(rest)-pos
lmin += 0
StringTrimLeft, lmax, rest, pos+1
lmax += 0
>
>
>
SetFormat, float, 0.2
base_min := dmin/(1+(percent_dmg + qty)/100)-amin
base_max := dmax/(1+(percent_dmg + qty)/100)-amax
p_min := (base_min + amin)*(1 + percent_dmg/100 + qty/100)
p_max := (base_max + amax)*(1 + percent_dmg/100 + qty/100)
total_dps := (p_min + p_max + ele_dmg)*aps*0.5
p_dps := (p_min + p_max)*aps*0.5
e_dps := (ele_dmg)*aps*0.5
p_percent := (p_min + p_max)/(p_min + p_max + ele_dmg)*100
e_percent := ele_dmg/(p_min + p_max + ele_dmg)*100
; dps @ q20
p_min_q20 := (base_min + amin)*(1 + percent_dmg/100 + 0.2)
p_max_q20 := (base_max + amax)*(1 + percent_dmg/100 + 0.2)
total_dps_q20 := (p_min_q20 + p_max_q20 + ele_dmg)*aps*0.5
p_dps_q20 := (p_min_q20 + p_max_q20)*aps*0.5
p_percent_q20 := (p_min_q20 + p_max_q20)/(p_min_q20 + p_max_q20 + ele_dmg)*100
e_percent_q20 := ele_dmg/(p_min_q20 + p_max_q20 + ele_dmg)*100
Result = %Result%`n`nDPS`@%qty%q`: %total_dps%`nP_dps: %p_dps% `(%p_percent%`%`), E_dps: %e_dps% `(%e_percent%`%`)`n`nDPS`@20q`: %total_dps_q20%`nP_dps: %p_dps_q20% `(%p_percent_q20%`%`), E_dps: %e_dps% `(%e_percent_q20%`%`)
>
>Else Result = No Found
>
If ( Result != "No Found" ) ShowToolTips(Result, 4000, 10, 10)
>
>
>
If anyone like my idea and want to update my code, feel free but pls to share.
12) PoE Wiki autosearch
Info := Clipboard
StringSplit, LineArray, Info, `n
IsNormal := RegExMatch(LineArray1, "Normal")>0?true:false
IsUnique := RegExMatch(LineArray1, "Unique")>0?true:false
IsRare := RegExMatch(LineArray1, "Rare")>0?true:false
IsGem := RegExMatch(LineArray1, "Gem")>0?true:false
Check = 0
If( IsNormal or IsUnique or IsGem ) Item_name := LineArray2
Check = 1
>Else If( IsRare ) Item_name := LineArray3
Check = 1
>
If( Check ) ; replace space to + for search string
If( RegExMatch(Item_name, "Superior ")> 0 )
StringTrimLeft, Item_name, Item_name, 9
StringReplace, Search, Item_name, %A_SPACE%, +, All
; run firefox
; Browser = C:\Program Files (x86)\Mozilla Firefox\firefox.exe
; run chrome
Browser = C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
13) complete script
$F1::
IfWinActive Path of Exile
Resync()
>Else Send,
>
Return
$F4::
IfWinActive Path of Exile
DPSCal()
>Else Send,
>
Return
$F5::
IfWinActive Path of Exile
AutoSearch()
>Else Send,
>
Return
ShowToolTips(content, offTime, px, py) ToolTip, %content%, px, py
SetTimer, RemoveToolTip, %offTime%
>
RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
Return
If( Clipboard != "" ) Info := Clipboard
StringSplit, LineArray, Info, `n
IsNotOrbOrGem := RegExMatch(LineArray1, "Currency|Gem")>0?false:true
If( IsNotOrbOrGem ) <
HaveName := RegExMatch(LineArray1, "Rare|Unique")>0?true:false
StringTrimRight Item_name, LineArray2, 1
Result = %Item_name%
Item_type := LineArray4
Identified := RegExMatch( Info, "Unidentified")>0?false:true
If( HaveName && Identified ) StringTrimRight, Item_name, LineArray3, 1
Result = %Result%, %Item_name%
Item_type := LineArray5
>
Loop %LineArray0%
line := LineArray%a_index%
seek := "Itemlevel: "
StringGetPos, pos, line, %seek%
If( pos>=0 ) StringTrimRight, line, line, 1
If( IsAboveSixty && !Identified )
line = %line% `(60+`)
Result = %Result%`n%line%
>
>
IsWeapon := RegExMatch( Item_type, "One Handed Sword|Two Handed Sword|One Handed Mace|Two Handed Mace|One Handed Axe|Two Handed Axe|Wand|Dagger|Bow|Claw|Staff" )>0?true:false
If ( IsWeapon && Identified ) dmin := 0
dmax := 0
aps := 0
qty := 0
percent_dmg := 0
amin := 0
amax := 0
fmin := 0
fmax := 0
cmin := 0
cmax := 0
lmin := 0
lmax := 0
Loop %LineArray0%
line := LineArray%a_index%
seek := "Quality: +"
StringGetPos, pos, line, %seek%
If( pos>=0 ) Result = %Result%`n%line%
StringTrimLeft, rest, line, 10
StringGetPos, pos, rest, `%
StringTrimRight, qty, rest, StrLen(rest)-pos
qty += 0
>
seek := "Physical Damage: "
StringGetPos, pos, line, %seek%
If( pos>=0 ) Result = %Result%`n%line%
StringTrimLeft, rest, line, 17
StringGetPos, pos, rest, -
StringTrimRight, dmin, rest, StrLen(rest)-pos
dmin += 0
StringTrimLeft, rest, rest, pos+1
seek := " (augmented)"
StringGetPos, pos, rest, %seek%
If( pos > 0) StringGetPos, pos, rest, %A_SPACE%
StringTrimRight, dmax, rest, StrLen(rest)-pos
>Else dmax := rest
>
dmax += 0
>
seek := "Attacks per Second: "
StringGetPos, pos, line, %seek%
If( pos>=0 ) Result = %Result%`n%line%
StringTrimLeft, aps, line, 20
aps += 0
>
seek := "% increased Physical Damage"
StringGetPos, pos, line, %seek%
If( pos>=0 ) Result = %Result%`n%line%
StringTrimRight, percent_dmg, line, 28
percent_dmg += 0
>
seek := "Adds "
StringGetPos, pos, line, %seek%
If( pos>=0 ) Result = %Result%`n%line%
StringTrimLeft, line, line, 5
seek := " Physical Damage"
StringGetPos, pos2, line, %seek%
If( pos2>=0 ) StringTrimRight, rest, line, 17
StringGetPos, pos, rest, -
StringTrimRight, amin, rest, StrLen(rest)-pos
amin += 0
StringTrimLeft, amax, rest, pos+1
amax += 0
>
seek := " Fire Damage"
StringGetPos, pos2, line, %seek%
If( pos2>=0 ) StringTrimRight, rest, line, 13
StringGetPos, pos, rest, -
StringTrimRight, fmin, rest, StrLen(rest)-pos
fmin += 0
StringTrimLeft, fmax, rest, pos+1
fmax += 0
>
seek := " Cold Damage"
StringGetPos, pos2, line, %seek%
If( pos2>=0 ) StringTrimRight, rest, line, 13
StringGetPos, pos, rest, -
StringTrimRight, cmin, rest, StrLen(rest)-pos
cmin += 0
StringTrimLeft, cmax, rest, pos+1
cmax += 0
>
seek := " Lightning Damage"
StringGetPos, pos2, line, %seek%
If( pos2>=0 ) StringTrimRight, rest, line, 18
StringGetPos, pos, rest, -
StringTrimRight, lmin, rest, StrLen(rest)-pos
lmin += 0
StringTrimLeft, lmax, rest, pos+1
lmax += 0
>
>
>
SetFormat, float, 0.2
base_min := dmin/(1+(percent_dmg + qty)/100)-amin
base_max := dmax/(1+(percent_dmg + qty)/100)-amax
p_min := (base_min + amin)*(1 + percent_dmg/100 + qty/100)
p_max := (base_max + amax)*(1 + percent_dmg/100 + qty/100)
total_dps := (p_min + p_max + ele_dmg)*aps*0.5
p_dps := (p_min + p_max)*aps*0.5
e_dps := (ele_dmg)*aps*0.5
p_percent := (p_min + p_max)/(p_min + p_max + ele_dmg)*100
e_percent := ele_dmg/(p_min + p_max + ele_dmg)*100
; dps @ q20
p_min_q20 := (base_min + amin)*(1 + percent_dmg/100 + 0.2)
p_max_q20 := (base_max + amax)*(1 + percent_dmg/100 + 0.2)
total_dps_q20 := (p_min_q20 + p_max_q20 + ele_dmg)*aps*0.5
p_dps_q20 := (p_min_q20 + p_max_q20)*aps*0.5
p_percent_q20 := (p_min_q20 + p_max_q20)/(p_min_q20 + p_max_q20 + ele_dmg)*100
e_percent_q20 := ele_dmg/(p_min_q20 + p_max_q20 + ele_dmg)*100
Result = %Result%`n`nDPS`@%qty%q`: %total_dps%`nP_dps: %p_dps% `(%p_percent%`%`), E_dps: %e_dps% `(%e_percent%`%`)`n`nDPS`@20q`: %total_dps_q20%`nP_dps: %p_dps_q20% `(%p_percent_q20%`%`), E_dps: %e_dps% `(%e_percent_q20%`%`)
>
>Else Result = No Found
>
If ( Result != "No Found" ) ShowToolTips(Result, 4000, 10, 10)
>
>
>
Info := Clipboard
StringSplit, LineArray, Info, `n
IsNormal := RegExMatch(LineArray1, "Normal")>0?true:false
IsUnique := RegExMatch(LineArray1, "Unique")>0?true:false
IsRare := RegExMatch(LineArray1, "Rare")>0?true:false
IsGem := RegExMatch(LineArray1, "Gem")>0?true:false
Check = 0
If( IsNormal or IsUnique or IsGem ) Item_name := LineArray2
Check = 1
>Else If( IsRare ) Item_name := LineArray3
Check = 1
>
If( Check ) ; replace space to + for search string
If( RegExMatch(Item_name, "Superior ")> 0 )
StringTrimLeft, Item_name, Item_name, 9
Multiscript
В принципе, к программам для боттинга можно отнести и Multiscript. Если хотите, можете использовать и его. В связи с анти-читинговыми инициативами GGG пользоваться оригинальным мультискриптом должно быть опасно. Поэтому мы создадим собственную версию.
Теперь мы имеем мультискрипт, который поверхностно защищён от анти-чита. По-хорошему, чем меньшим количеством читов мы пользуемся, тем меньше шанс, что нас обнаружат. Так что если у вас есть возможность, не используйте мультискрипт.
Виртуальная машина vmware
EB отличается тем, что не пишет в память игры, кликает по окошку. Поэтому компьютер, на котором работает бот, по сути не может быть использован для чего-то другого, например для просмотра фильма, или опять же для игры на мейн аккаунте. Так что мы будем использовать виртуальные машины.
Скачайте vmware, рекомендуется версия 7.х, там нет глюка с мерцанием изображения. Хотя подойдёт любая, в частности 10.х и 11.х работают.
Создайте новую ОС: я использую win8, но подойдёт что угодно, хоть windows xp. Цельный заранее выделенный жёсткий диск размером 30гб+, 2гб+ оперативной памяти (затем можно будет пытаться настраивать и уменьшать, если захочется). По умолчанию аппаратное видео ускорение включено, всякие звуковые адаптеры и USB можете удалить. CD/DVD для начала оставьте, оттуда будет ставиться ОС и если захотите VMware Tools.
Устанавливаете ОС, там в свойствах системы выберите максимальную производительность, уберите заставку на рабочем столе, установите постоянный размер своп файла, например 2гб. Отключите UAC, затем погуглите как и отключите его через политику групп по-настоящему. Установите все обновления для ОС.
Следующий момент достаточно важный. Я надеюсь, что у вас есть SSD. Без ССД жизнь намного более уныла. И даже если сама виртуальная машина на HDD, пусть хотя бы PoE лежит на SSD. Делается это так:
Расшарьте необходимые папки с основного компьютера на виртуальную машину.
Как вы видите, сама по себе игра лежит на SSD диске c:\!Boost , чего и вам настоятельно желаю. Если же у вас нет SSD, то не отчаивайтесь. Возможно вам показан --nopreload и побольше оперативки виртуальной машине.
Такая шара окажется на диске Z: в виртуальной ОС, и оттуда можно будет запускать пое в разы, на порядки быстрее.
Если вы имеете несколько виртуальных машин с ботами, такой сетап так же подойдёт. PoE прекрасно может работать из одной папки с общим доступом. Даже записи логов всего лишь перемешиваются в одном лог файле.
А вот EB хоть и может работать из одной папки, но в логи пишет только первый инстанс. Поэтому для дебага придётся запускать ЕБ из уникальной папки.
Дополнительно по виртуальной машине рекомендую:
- дефрагментировать как виртуальный диск средствами vmware, так и внешний hdd сторонней программой
- по возможности спрятать факт использования виртуальной машины: переименуйте видео драйвер, сделайте вменяемое имя компьютера, измените мак адрес на нейтральный, отключите возможность обнаружения виртуальной среды средствами вмваре, не используйте вмваре тулз.
- отключить ненужные сервисы и программы из автозагрузки
По второму пункту неплохо сработает добавление в .vmx файл виртуальной машины следующих строк, хотя лично мне неудобно не иметь VMTools:
Необходимые дополнительные программы вроде тотал коммандера, умного блокнота и т.п., я рекомендую так же использовать с SSD диска, т.е. из шары, если тело виртуальной ОС живёт на HDD.
Для того, чтобы Path of Exile заработала на нашей новой системе, там необходимо будет поставить DirectX и C++ redist, это продукты майкрософта, скачивать их следует исключительно с официальных сайтов, исключений тут нет. Погуглите.
Итак, теперь у нас есть вполне годная для ботоводства операционная система. Запустите Path of Exile, дождитесь появления экрана ввода логина и пароля. Отлично! А теперь закройте игру и давайте приступим к необходимым шагам, которые я опишу в следующих статьях.
Дальнейший рассказ пойдёт о Exiled Bot
Настройка Path of Exile для боттинга
Ботоводим с помощью Exiled Bot, в виртуальных машинах. Поэтому мы хотим экономить ресурсы компьютера.
Настраиваем клиент PoE
Уменьшаем требования к графике:
В файле c:\Users\ИмяПользователя\Documents\My Games\Path of Exile\production_Config.ini пропишите
В частности важны texture_filtering и texture_quality . Эти настройки дадут нам нетребовательный к графике клиент, это будет выглядеть некрасиво, но нам нужна эффективность, а не красота.
Переходим на тёмную сторону: боты в PoE
Итак, мы хотим освободиться от необходимости нажимать даже две кнопки на мышке. Переходим на тёмную сторону: боты.
На данный момент мне известно два бота для Path of Exile: Exiled Bot и ExileBuddy. Сразу необходимо заметить, что оба бота платные. Но Exiled Bot (далее EB) можно бесплатно использовать до 45 уровня персонажа. Чем я вам и рекомендую воспользоваться.
Параметры командной строки
Далее, укажем параметры командной строки для запуска игры. Я запускаю игру из-под администратора.
z:\poe\PathOfExile.exe --nosound -gc 2 --nopreload
--nosound отключит звук
-gc 2 прикажет использовать более агрессивную сборку мусора, что должно экономить оперативную память. Ещё более агрессивная сборка gc 1
--nopreload прикажет игре не подгружать контент заранее, поэтому загрузка игры станет практически моментальной; однако за это вы можете поплатиться лагами при появлении новых монстров или эффектов
Теперь наша игра запускается моментально, но всё ещё пытается использовать так много процессора, как может. Нажав дефолтную кнопку F1 в игре вы можете убедиться, что игра отрисовывает или сотни FPS, или около 60, если вы включили vsync.
Dxtory
Устанавливаем и настраиваем Dxtory, отличная маленькая программка, которая делает своё дело. Устанавливаем лимит FPS на комфортное для вас число. Если установить меньше 20, бот начинает работать заметно хуже, я рекомендую 20+.
PoE-ItemInfo и POE-TradeMacro для русского языка
Хочу представить вашему вниманию адаптированные версии скриптов POE-ItemInfo и POE-TradeMacro для русского языка в игре.
Оригинальные скрипты очень популярны, т.к. позволяют упростить процесс определения “ценности” и стоимости предметов в игре.
POE-ItemInfo входит в состав POE-TradeMacro и соответственно весь функционал POE-ItemInfo включен в POE-TradeMacro , поэтому рекомендуется использовать именно POE-TradeMacro .
Установка
2. Скачиваем архив с файлами скрипта POE-TradeMacro-Ru
3. Распаковываем в удобное для вас место на диске (кроме Рабочего стола)
4. Заходим внутрь извлеченной папки и запускаем файл Run_TradeMacro.ahk, в системном трее должен появиться значок с черно-белым логотипом Path of Exile
5. Запускаем игру, текущим языком должен быть выбран русский
6. Переходим в Настройки - Графика, необходимо установить Режим отображения: На весь экран в окне
7. Выбираем персонажа, грузимся на локацию, открываем инвентарь, наводим указатель мыши на любой предмет и нажимаем Ctrl + D
8. Видим всплывающее окошко, пользуемся
Для обновления скрипта
- удалите папку со старой версией скрипта
- разархивируйте и поместите взамен предыдущей папку с новой версией
POE-TradeMacro-Ru
Основные сочетания клавиш:
Ctrl + C Просмотр информации о предмете (через встроенный PoE-ItemInfo ).
Ctrl + D Быстрый поиск предмета на poe.trade.
Ctrl + Alt + D Расширенный поиск предмета с учетом модов.
Ctrl + I Открывает специальную форму поиска, в которой можно задать имя предмета (на английском), его тип, редкость и т.д.
Ctrl + W Просмотр страницы с описанием предмета на русской WiKi.
Ctrl + Q Переход на страницу поиска предмета на poe.trade.
Ctrl + E Позволяет определить возраст вашего предмета размещенного в торговой вкладке - как долго предмет находится в продаже.
Ctrl + L Переключает текущую лигу для которой будут определяться цены.
Адаптировано не всё, но уже в текущем состоянии скрипт готов к использованию.
Читайте также: