League Of Legends - Tools

Post gaming related scripts
Pozix
Posts: 1
Joined: 14 Jun 2018, 19:55

League Of Legends - Tools

14 Jun 2018, 20:16

League of Legends - Tools Collection


Disclaimer:

This tool is not complete.
It is an updated, revised and fixed amalgam of Sanctus' Picker and Ruevil2's Tools.
I will probably update it soon™.
If you find any bugs, please report them in this thread.

Features:
  • Auto-Login
  • Multiple Account Support
    • -- Handles any number of accounts.
      -- Choose account from tray menu, defaults to first account upon opening.
  • Auto-Join Queue
    • -- Champion picker will be fired on 5v5 Blind & 3v3 Blind.
    • 5v5
      • 5v5 Blind
      • 5v5 Draft
      • 5v5 Ranked
    • 3v3
      • 3v3 Blind
      • 3v3 Ranked
    • ARAM
    • Rotating Game Mode
  • Auto Accept Game
    • -- Note: Will not work if client isn't focused (league client popup on match found isn't considered focus) Needs update._
      -- Will work if you don't alt tab or recover focus.
  • Automatic Champ List Update
    • -- Links to 6 Different build pages for each champion._
      -- Free champions are indicated by a larger icon.
  • Champion Sales
    • -- Shows current champion sales in a list.
      -- Shows original price -> sale price.
  • Skin Sales
    • -- Shows current skin sales in a list.
      -- Clicking one of these links shows a pic of the skin.
  • Streamers
    • -- Loads the Top 100 streamers list from Twitch.tv, ranked by viewer count.
  • Change VO/Text (Needs update)
    • -- This tool allows you to change the voice and text packs to a different language.
      -- This will cause the launcher to update/download the new packs.
  • Screen-Edge Move (Needs update)
    • -- This prevents the mouse from moving your view when it touches the edge of + the screen.
  • Auto Update (Not implemented)
Shortcuts:
  • F12 Reload
Code:

Code: Select all

If not A_IsAdmin { Run *RunAs "%A_ScriptFullPath%" ExitApp } #SingleInstance, Force #Persistent #InstallMouseHook #InstallKeybdHook CoordMode,Mouse,Window CoordMode,Pixel,Window OnExit, ExitSub ver = v6.05 Confine = True UpdateCheck = 0 Menu, Tray, NoStandard Menu, Tray, UseErrorLevel Menu, Tray, Tip, League Tools %ver% ComObjError(0) WebRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1") IfExist C:\Riot Games\League of Legends\LeagueClient.exe { RiotPathF := "C:\Riot Games\League of Legends\LeagueClient.exe" RiotBasePath := "C:\Riot Games\League of Legends" } else { x = 0 SelectLeague: FileSelectFile, RiotPath, M3, C:\, Select League Launcher, *.exe StringReplace, RiotPathF, RiotPath, `n, \ StringSplit, RiotPath, RiotPath, `n If !RiotPathF { x++ If x = 3 Goto, LauncherNotFound Goto, SelectLeague } } Menu, Tray, Icon, %RiotPathF%, 1 ;TrayTip, League Tools %ver%, League launcher found., %tsecs% LauncherNotFound: IfNotExist, %A_ScriptDir%\Data { MsgBox % "This is the first run of League Tools. Choosing default configuration." GoSub, SetFirstRun GoSub, ReadSettings Gosub, SettingsSub } else GoSub, ReadSettings Menu, GuidesLoading, Add, Loading, Tools Menu, GuidesLoading, Disable, Loading Menu, ChampSalesLoading, Add, Loading, Tools Menu, ChampSalesLoading, Disable, Loading Menu, SkinSalesLoading, Add, Loading, Tools Menu, SkinSalesLoading, Disable, Loading Menu, ProStreamsLoading, Add, Loading, Tools Menu, ProStreamsLoading, Disable, Loading Menu, AutoSelection, Add, 5v5 Blind, AutoStart Menu, AutoSelection, Add, 5v5 Draft, AutoStart Menu, AutoSelection, Add, 5v5 Ranked Solo/Duo, AutoStart Menu, AutoSelection, Add, 5v5 Ranked Flex, AutoStart Menu, AutoSelection, Add Menu, AutoSelection, Add, 3v3 Blind, AutoStart Menu, AutoSelection, Add, 3v3 Ranked Flex, AutoStart Menu, AutoSelection, Add Menu, AutoSelection, Add, ARAM, AutoStart Menu, GroupOrSolo, Add, Solo, Tools Menu, GroupOrSolo, Add, Group, Tools Menu, GroupOrSolo, Disable, Group Menu, GroupOrSolo, Check, Solo Menu, Tray, Add, Champ Guides, :GuidesLoading Menu, Tray, Add, Champ Sales, :ChampSalesLoading Menu, Tray, Add, Skin Sales, :SkinSalesLoading Menu, Tray, Add, Pro Streams, :ProStreamsLoading /* Menu, Tray, Add, Test, Test Test() { if WinExist("ahk_class RCLIENT") { global CntA := 0 global CntB := 0 global Var1 global Var2 col := "0x0d2946" ;dist := Distance("0x0d2946", col) dist := 192 Gui, Test: New, -SysMenu, League Tools %ver% Gui, Test: Add, Text, x10 y20 w120 h15, % "Over " . Floor(dist) Gui, Test: Add, Text,vVar1 x150 y20 w80 h15, vCntA Gui, Test: Add, Text, x10 y40 w120 h15, % "Under " . Floor(dist) Gui, Test: Add, Text,vVar2 x150 y40 w80 h15, vCntB Gui, Test: Show, w250 h100 Loop { If (!ColorCross(529, 684, col, dist)) { vCntA += 1 GuiControl,,Var1,%vCntA% } Else { vCntB += 1 GuiControl,,Var2,%vCntB% } Sleep 250 } } } */ If RiotPathF { Loop, { If (Login%A_Index%) Menu, Accounts, Add, % Login%A_Index%, Tools else break } If (Login%lgn%) { Menu, Accounts, Check, % Login%lgn% Menu, Accounts, NoDefault if !ErrorLevel Menu, Tray, Add, Select Account, :Accounts Menu, Tray, Add, Login, LoginOnly ;Auto Start not completed Menu, Tray, Add, Group or Solo, :GroupOrSolo Menu, Tray, Add, Auto Start, :AutoSelection Menu, Tray, Add, Auto Accept and pick, AutoAcceptAndPick Menu, Tray, Add, Auto Accept, AutoAccept Menu, Tray, Add, Auto Pick, AutoPick } } ;Menu, Tray, Add, Change VO/Text, ChangeVO ;Menu, Tray, Add, Screenedge Off, Tools Menu, Tray, Add Menu, Tray, Add, Settings, SettingsSub Menu, Tray, Add, Reload, ReloadSub Menu, Tray, Add, Exit, ExitSub SetTimer, LoadData, -500 TrayTip, League Tools %ver%, League Tools loaded., %tsecs% return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;NOT FINISHED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AutoPick: { myGui("x860 y400", "League of Legends AHK AutoPicker", 0) } Return AutoStart: { ;Considerations to start game ; Must Have: ; Login ; Pass ; RiotPath ; WhichQueueType ; GroupOrSolo ;MsgBox % Login%lgn% "`n`n" RiotPathF "`n`n" A_ThisMenuItem global t := A_ThisMenuItem /* If !lgn lgn = 1 If (Login%lgn%) { ;Login(Login%lgn%, Pass%lgn%, RiotpathF) ;Start(t, sGroup) } else return */ If (InStr(t, "Blind")) { myGui("x860 y400", "League of Legends AHK AutoPicker", 1) } Else { Start(t, sGroup) } /* If sGroup Err := AutoAccept(QueueWaitTime + 500) Else Err := AutoAccept(QueueWaitTime) If (Err = 1) { Tooltip, Queue took over %QueueWaitTime% seconds. Please adjust this. Sleep 5000 ToolTip } */ } return myGui(position, title, start) { global tChamp global tPosition global startFlag startFlag := start gui, new gui, Default gui, +LastFound +LabelMyGui gui, add, groupbox, w200 h150, LOL AutoPicker gui, font, s8, Arial gui, add, text, xm12 ym20 section gui, add, text, yp center, Choose the hero to play gui, Add, ComboBox, vtChamp w120 r10 gAC, Aatrox|Ahri|Akali|Alistar|Amumu|Anivia|Annie|Ashe|Aurelion Sol|Azir|Bard|Blitzcrank|Brand|Braum|Caitlyn|Camille|Cassiopeia|Cho'Gath|Corki|Darius|Diana|Dr. Mundo|Draven|Ekko|Elise|Evelynn|Ezreal|Fiddlesticks|Fiora|Fizz|Galio|Gangplank|Garen|Gnar|Gragas|Graves|Hecarim|Heimerdinger|Illaoi|Irelia|Ivern|Janna|Jarvan IV|Jax|Jayce|Jhin|Jinx|Kai'Sa|Kalista|Karma|Karthus|Kassadin|Katarina|Kayle|Kayn|Kennen|Kha'Zix|Kindred|Kled|Kog'Maw|LeBlanc|Lee Sin|Leona|Lissandra|Lucian|Lulu|Lux|Malphite|Malzahar|Maokai|Master Yi|Miss Fortune|Mordekaiser|Morgana|Nami|Nasus|Nautilus|Nidalee|Nocturne|Nunu|Olaf|Orianna|Ornn|Pantheon|Poppy|Pyke|Quinn|Rakan|Rammus|Rek'Sai|Renekton|Rengar|Riven|Rumble|Ryze|Sejuani|Shaco|Shen|Shyvana|Singed|Sion|Sivir|Skarner|Sona|Soraka|Swain|Syndra|Tahm Kench|Taliyah|Talon|Taric|Teemo|Thresh|Tristana|Trundle|Tryndamere|Twisted Fate|Twitch|Udyr|Urgot|Varus|Vayne|Veigar|Vel'Koz|Vi|Viktor|Vladimir|Volibear|Warwick|Wukong|Xayah|Xerath|Xin Zhao|Yasuo|Yorick|Zac|Zed|Ziggs|Zilean|Zoe|Zyra ;gui, Add, ComboBox, vtChamp w120 r10 gAC, % tempChamps gui, add,text, yp+25 center, Choose the lane to call gui, Add, ComboBox, vtPosition w120 r10 gAC, ADC|Support|Top|Jungle|Mid gui, add, button, yp+30 gDone, OK gui, show, % position, % title return AC: AutoComplete(A_GuiControl) Return Done: { global flag := 0 gui,submit,nohide gui, destroy msgbox Hero that will automatically be picked : %tChamp% msgbox Position that will be automaticly called: %tPosition% ClipSaved := ClipboardAll If startFlag { Start(t, sGroup) } champ_select: Loop { WinWaitActive ahk_class RCLIENT { if !flag { search_box: Loop { PixelSearch, FoundaX, FoundaY, 735, 93, 757, 114, 0x697170, 0, Fast ;Find Search Box ; .574, if ErrorLevel = 0 { BlockInput, On Clipboard = %tChamp% MouseClick, left, 766, 104 ;Search champion Sleep 20 Send, ^v Sleep 20 MouseClick, left, 75, 680 ;Select Chat Sleep 20 Clipboard = %tPosition% Send, ^v{Enter} Sleep 275 MouseClick, Left, 382, 166 ;Champion select Sleep 20 ;MouseClick, left, 922, 735 ;Enter BlockInput, Off Sleep, 1000 flag := 1 break search_box } } } PixelSearch, FoundbX, FoundbY, 582, 589, 590, 590, 0xb2ad07, 0, Fast ;Find lock-in border if ErrorLevel = 0 { Clipboard = ClipSaved break champ_select } } } return } } ;AutoComplete Section AutoComplete(ctrl) { static lf = "`n" If GetKeyState("Delete") or GetKeyState("Backspace") Return SetControlDelay, -1 SetWinDelay, -1 GuiControlGet, h, Hwnd, %ctrl% ControlGet, haystack, List, , , ahk_id %h% GuiControlGet, needle, , %ctrl% StringMid, text, haystack, pos := InStr(lf . haystack, lf . needle) , InStr(haystack . lf, lf, false, pos) - pos If text != { if pos != 0 { ControlSetText, , %text%, ahk_id %h% ControlSend, , % "{Right " . StrLen(needle) . "}+^{End}", ahk_id %h% } } } Start(type1, sGroup) { ;Types ;5v5 ; Blind ; Draft ; Ranked Solo/Duo ; Ranked Flex ;3v3 ; Blind ; Ranked Flex ;ARAM ;Positions are mostly correct and will work well enough. rotating game style not done at all if WinExist("ahk_class RCLIENT") { WinActivate, ahk_class RCLIENT Sleep, 500 WinGetPos,,, w, h, A Sleep, 250 MouseClick, left, (w*.10), (h*.05),,0 Sleep, 25 MouseClick, left, (w*.10), (h*.05),,0 ;;;;;;;;;;;;;;;;;;;;;;;;; Sleep, 3500 ;Replace this with a check for loaded status ;;;;;;;;;;;;;;;;;;;;;;;;; If (InStr(type1, "5v5")) { If (InStr(type1, "Blind")) w1 := (w * 0.1), h1 := (h * 0.305), w2 := (w * 0.1), h2 := (h * 0.743) else If (InStr(type1, "Draft")) w1 := (w * 0.1), h1 := (h * 0.305), w2 := (w * 0.1), h2 := (h * 0.784) else If (InStr(type1, "Solo")) w1 := (w * 0.1), h1 := (h * 0.305), w2 := (w * 0.1), h2 := (h * 0.826) else If (InStr(type1, "Flex")) w1 := (w * 0.1), h1 := (h * 0.305), w2 := (w * 0.1), h2 := (h * 0.868) } else If (InStr(type1, "3v3")) { If (InStr(type1, "Blind")) w1 := (w * 0.294), h1 := (h * 0.305), w2 := (w * 0.294), h2 := (h * 0.715) If (InStr(type1, "Flex")) w1 := (w * 0.294), h1 := (h * 0.305), w2 := (w * 0.294), h2 := (h * 0.756) } else If (InStr(type1, "ARAM")) w1 := (w * 0.486), h1 := (h * 0.303), w2 := 0, h2 := 0 MouseClick, left, w1, h1,,0 Sleep, 25 MouseClick, left, w1, h1,,0 Sleep, 250 If w2 && h2 { Sleep, 250 MouseClick, left, w2, h2,,0 Sleep, 25 MouseClick, left, w2, h2,,0 Sleep, 250 } ;Confirm Click MouseMove, (w*.421),(h*.944) MouseClick, left, (w*.421),(h*.944),,0 ;;;;;;;;;;;;;;;;;;;;;;;;; Sleep, 5000 ;Replace this with a check for loaded status ;;;;;;;;;;;;;;;;;;;;;;;;; if sGroup = 1 { ;If group then click invite button and wait MouseMove, (w*0.),(h*0.) MouseClick, left, (w*0.),(h*0.),,0 Sleep, 100 } ;If solo then go to find match, (same coords as confirm button) MouseMove, (w*.421),(h*.944) MouseClick, left, (w*.421),(h*.944),,0 ;Sleep, %StartSleep% Sleep, 100 Loop { WinWaitActive ahk_class RCLIENT { WinGetPos,,, mWi, mHi, A x := Floor((mWi * 0.501)) ;641 y := Floor((mHi * 0.772)) ;555 PixelSearch, FoundaX, FoundaY, x, y, x+1, y+1, 0xc7c7a3, 0, Fast If ErrorLevel = 0 { Sleep, 400 MouseMove, %x%, %y% Click, %x%, %y% break } } } Return } } Return AutoAccept: { Loop { WinWaitActive ahk_class RCLIENT { WinGetPos,,, mWi, mHi, A x := Floor((mWi * 0.501)) ;641 y := Floor((mHi * 0.772)) ;555 PixelSearch, FoundaX, FoundaY, x, y, x+1, y+1, 0xc7c7a3, 0, Fast If ErrorLevel = 0 { Sleep, 400 MouseMove, %x%, %y% Click, %x%, %y% break } } } } Return AutoAcceptAndPick: { myGui("x860 y400", "League of Legends AHK AutoPicker", 0) Loop { WinWaitActive ahk_class RCLIENT { WinGetPos,,, mWi, mHi, A x := Floor((mWi * 0.501)) ;641 y := Floor((mHi * 0.772)) ;555 PixelSearch, FoundaX, FoundaY, x, y, x+1, y+1, 0xc7c7a3, 0, Fast If ErrorLevel = 0 { Sleep, 400 MouseMove, %x%, %y% Click, %x%, %y% break } } } } Return ;NOT FINISHED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Login(u="", p="", installloc="") { StartColor := "0x28231E" Run, %installloc% WinWaitActive ahk_class RCLIENT b = 0 Loop, { Sleep, 250 if WinExist("ahk_class RCLIENT") { WinActivate, ahk_class RCLIENT WinGetPos,,, w, h, A PixelGetColor, b_Play, (w*.85), (h*.27), RGB ;1088, 194 colorA := "0x28231E" ColDist := Distance(colorA, b_Play) ;TrayTip, League Tools %ver%, Color Distance: %ColDist% If ColDist < 55 break } } Sleep, 100 WinActivate, ahk_class RCLIENT WinWaitActive ahk_class RCLIENT WinGetPos,,, w, h, A b = 0 Sleep, 100 If !p InputBox, temppass, Mot de passe, Entrez votre mot de passe. Il ne sera pas sauvegarder. Sleep, 100 WinActivate, ahk_class RCLIENT If u { MouseClick, Left, (w*.85), (h*.27),,0 MouseClick, Left, (w*.85), (h*.27),,0 Sleep, 100 SendRaw, %u% } else return Sleep, 100 Send {Tab} Sleep, 100 If temppass SendInput {Raw}%temppass% If p { ObfPass := Obf(p, 0, 1234) SendInput {Raw}%ObfPass% } else return temppass := ObfPass := Sleep, 100 Send {enter} Sleep, 100 ;Checking for loaded client Loop, { Sleep, 500 IfWinActive, ahk_class RCLIENT { WinGetPos,,, w, h, A PixelGetColor, b_Play, (w*.098), (h*.044), RGB colorA := "0x16313F" ColDist := Distance(colorA, b_Play) ;TrayTip, League Tools %ver%, Color Distance: %ColDist% If ColDist < 55 break } } return } LoginOnly: { global t := A_ThisMenuItem If !lgn lgn = 1 Login(Login%lgn%, Pass%lgn%, RiotpathF) } return ChangeVO: { MsgBox, 4, WARNING, This option will change the voice and text language of League.`n`nWould you like to continue? (press Yes or No) IfMsgBox No return else { Gui, ChangeVO:Add, Text,, ( Warning: This will change the language for League of Legends. This changes voices and text. These changes are made to the following file, \Riot Games\League of Legends\Config\LeagueClientSettings.yaml A backup file is kept under the same folder, renamed to the .old extension. Not all languages are available for all regions. Warning: This will cause the league client to download an update to the new language set. ) Gui, ChangeVO:Add, DropDownList, vVOchoice, en_US|es_ES|fr_FR|de_DE|it_IT|pl_PL|ko_KR|ro_RO|el_GR|pt_BR| Gui, ChangeVO:Add, Button, Default gSetVO, OK Gui, ChangeVO:Add, Button, gCancelVO, Cancel Gui, ChangeVO:Show } } return SetVO: { Gui, ChangeVO:Submit IfExist, % RiotBasePath "\Config\LeagueClientSettings.yaml" { FileRead, LeagueClientSettings, % RiotBasePath "\Config\LeagueClientSettings.yaml" LeagueClientSettingsF := RegExReplace(LeagueClientSettings, "i)(locale: .).*(.\R)", "$1" VOchoice "$2") FileMove, % RiotBasePath "\Config\LeagueClientSettings.yaml", % RiotBasePath "\Config\LeagueClientSettings.old", 1 FileAppend, %LeagueClientSettingsF%, % RiotBasePath "\Config\LeagueClientSettings.yaml" } else MsgBox, % "LeagueClientSettings.yaml Not Found. Cannot change voice overs." } return CancelVO: { Gui, ChangeVO:Destroy } return Tools: { ;MsgBox % A_ThisMenu "`n`n" A_ThisMenuItem If A_ThisMenuItem = ScreenEdge Off { Menu, Tray, ToggleCheck, ScreenEdge Off Menu, Tray, Rename, ScreenEdge Off, ScreenEdge On SetTimer, ScreenEdge, 250 } else If A_ThisMenuItem = ScreenEdge On { Menu, Tray, ToggleCheck, ScreenEdge On Menu, Tray, Rename, ScreenEdge On, ScreenEdge Off SetTimer, ScreenEdge, Off Sleep, 100 ClipCursor(Confine) } else If A_ThisMenu = Accounts { lgn := A_ThisMenuItemPos Loop, { If !(Login%A_Index%) break Menu, Accounts, UnCheck, % Login%A_Index% } Menu, Accounts, Check, % Login%lgn% } else If A_ThisMenu = GroupOrSolo { If A_ThisMenuItem = Solo { Menu, GroupOrSolo, Check, Solo Menu, GroupOrSolo, UnCheck, Group sGroup = 0 } else If A_ThisMenuItem = Group { Menu, GroupOrSolo, Check, Group Menu, GroupOrSolo, UnCheck, Solo sGroup = 1 } } } return Sales: { ;MsgBox % A_ThisMenu "`n`n" A_ThisMenuItem If (A_ThisMenu = "SkinSaleNames") SplashImage, %A_ScriptDir%\Data\Skins\%A_ThisMenuItem%_splash.png, M2, %A_ThisMenuItem%, , %A_ThisMenuItem% } return Guides: { ;MsgBox % A_ThisMenu "`n`n" A_ThisMenuItem CName := A_ThisMenu ;LOLNexus StringReplace, n, CName, ', , All StringReplace, n, n, `., , All StringReplace, n, n, %A_Space%, -, All ;LOLKing StringLower, a, CName StringReplace, a, a, %A_Space%, , All StringReplace, a, a, `., , All StringReplace, a, a, ', , All ;ProBuilds StringReplace, b, CName, ', %A_Space%, All StringReplace, b, b, `., %A_Space%, All StringLower, b, b, T StringReplace, b, b, %A_space%, , All ;SoloMid StringReplace, c, CName, %A_Space%, , All ;LolCounter IfEqual, A_ThisMenuItem, LolCounter, Run, http://lolcounter.com/champions/%n% ;Op.GG IFEqual, A_ThisMenuItem, Op.GG, Run, http://na.op.gg/champion/%a% ;MobaFire - Naming convention changed, non conformative new stylem - Test Guide page IfEqual, A_ThisMenuItem, MobaFire, Run, http://www.mobafire.com/league-of-legends/%n%-guide ;case sensitive(Lowercase), no punctuation, no spaces IfEqual, A_ThisMenuItem, LOLKing, Run, http://www.lolking.net/guides/champion/%a% ;Not case sensitive, spaces become -, no punctuation IfEqual, A_ThisMenuItem, LOLNexus, Run, http://www.lolnexus.com/champions/%n% ;Not case sensitive, no spaces, periods left in, ' left in IfEqual, A_ThisMenuItem, SoloMid, Run, http://www.solomid.net/guides/%c% ;Case sensitive(title), no spaces, no punctuation IfEqual, A_ThisMenuItem, ProBuilds, Run, http://www.probuilds.net/champions/details/%b% ;Not case sensitive IfEqual, A_ThisMenuItem, Lol-Game.ru, Run, http://lol-game.ru/guides/%CName%/ ;TBD IfEqual, A_ThisMenuItem, lol.inven.co.kr, Run, http://lol.inven.co.kr/dataninfo/champion/manualTool.php } return Streams: { ;MsgBox % A_ThisMenu "`n`n" A_ThisMenuItem If (A_ThisMenu = "AStreams") Run, https://www.azubu.tv/%A_ThisMenuItem% Else If (A_ThisMenu = "TStreams") Run, http://www.twitch.tv/%A_ThisMenuItem% } return ScreenEdge: { If WinActive("ahk_class RCLIENT") ClipCursor( Confine, 13, 13, A_screenwidth-13, A_screenheight-13) } return LoadData: { If ChampList && !(IsObject(ChampDataObj)) && !ChampListLoaded && !ChampListError { ;TrayTip, League Tools %ver%, Getting champion list. URL := "https://ddragon.leagueoflegends.com/api/versions.json" WebRequest.Open("GET", URL, true) WebRequest.Send() WebRequest.WaitForResponse() VersionDataObj := JSON.Load(WebRequest.ResponseText) versionCurrentFile := FileOpen(A_ScriptDir "\Data\version.txt", "r") versionCurrent := versionCurrentFile.Read() versionCurrentFile.Close() If (VersionDataObj[2] != versionCurrent){ versionLive := FileOpen(A_ScriptDir "\Data\version.txt", "w") versionLive.Write(VersionDataObj[2]) versionLive.Close() ChampDataURL := "http://ddragon.leagueoflegends.com/cdn/" VersionDataObj[2] "/data/en_US/champion.json" WebRequest.Open("GET", ChampDataURL) WebRequest.Send() ChampData := WebRequest.ResponseText() If ChampData { Try { ChampDataObj := JSON.Load(ChampData) listLive := FileOpen(A_ScriptDir "\Data\champions.json", "w") listLive.Write(ChampData) listLive.Close() ;MsgBox % ChampDataObj["version"] } catch e { Goto, ChampError } } Else { Goto ChampError } } Else { listLive := FileOpen(A_ScriptDir "\Data\champions.json", "r") ChampData := listLive.Read() listLive.Close() ChampDataObj := JSON.Load(ChampData) } /* FreeChampURL := "https://www.championrotation.net/" WebRequest.Open("GET", FreeChampURL) WebRequest.Send() StringReplace, FreeChampData, % WebRequest.ResponseText(), `", , All ;" If FreeChampData { P := 0 Loop, { P := RegExMatch(FreeChampData, "i)name itemprop=name>(.*?)<", ChampName, (P + 5)) If !P break ChampDataObj.data[ChampName1].freeToPlay := True } } else Goto ChampError */ freeLive := FileOpen(A_ScriptDir "\Data\f2p.json", "r") ftpData := freeLive.Read() freeLive.Close() ftpDataObj := JSON.Load(ftpData) /* URL := "https://euw1.api.riotgames.com/lol/platform/v3/champions?freeToPlay=true&api_key=RGAPI-65254498-92ea-405e-bc68-bbe2b30abe5c" WebRequest.Open("GET", URL, true) WebRequest.Send() WebRequest.WaitForResponse() ftpData := WebRequest.ResponseText ftpDataObj := JSON.Load(ftpData) freeLive := FileOpen(A_ScriptDir "\Data\f2p.json", "w") freeLive.Write(ftpData) freeLive.Close() for k, v in ftpDataObj["champions"] { haystack := ChampDataObj.data needle := v.id HasVal(haystack, needle) { if !(IsObject(haystack)) || (haystack.Length() = 0) return 0 for index, value in haystack if (value = needle) MsgBox Found tempFree := tempFree . "`n" . index return index return 0 } } */ MenuSize = 0 For k, v in ChampDataObj.data { cID := v.key, cName := v.name, cTitle := v.title Menu, %cName%, Add, %cTitle%, Guides Menu, %cName%, Disable, %cTitle% Menu, %cName%, Add Menu, %cName%, Add, OP.GG, Guides Menu, %cName%, Add, MobaFire, Guides Menu, %cName%, Add, LOLKing, Guides Menu, %cName%, Add, LOLNexus, Guides Menu, %cName%, Add, SoloMid, Guides Menu, %cName%, Add, ProBuilds, Guides Menu, %cName%, Add, LolCounter, Guides } For k, v in ChampDataObj.data tempList := tempList . "`n" . v.name Menu, GuidesLoading, Delete Sort, tempList, U Loop, Parse, tempList, `n { If !A_LoopField continue If (MenuSize > 790) { Menu, GuidesLoading, Add, %A_LoopField%, :%A_LoopField%, +BarBreak MenuSize = 0 } Else { Menu, GuidesLoading, Add, %A_LoopField%, :%A_LoopField% MenuSize := MenuSize + 20 } } Menu, Tray, Insert, Champ Sales, Champ Guides, :GuidesLoading ;TrayTip, League Tools %ver%, Champion list loaded successfully. SetTimer, LoadData, -500 ChampListLoaded := 1 return ChampError: TrayTip, League Tools %ver%, There was a problem loading the Champion list. ChampListError := 1 SetTimer, LoadData, -500 return } If Sales && !(IsObject(ChampDataObj.ChampSales)) && !SkinListLoaded && !SkinListError { ;TrayTip, League Tools %ver%, Getting sales. SalesURL := "http://na.leagueoflegends.com/en/news/store/sales" WebRequest.Open("GET", SalesURL) WebRequest.Send() SalesStr := WebRequest.ResponseText() StringReplace, SalesStr, SalesStr, ", , All ;" Q := 0 CheckNextSale: Q := RegExMatch(SalesStr, "i)a href=/en/news/store/sales/champion-and-skin-sale-(.*?) title", Sdates, Q + 1000) If Sdates1 { StringSplit, SalesD, Sdates1, - Date1 := A_YYYY . SalesD1 . "00000000" Date2 := A_YYYY . SalesD2 . "00000000" DateDay1 := DateDay2 := DateDay1 -= Date1, Seconds DateDay2 -= Date2, Seconds if (DateDay1 > 0 and DateDay2 < 86400) { ;Sales Found RegExMatch(SalesStr, "i)a href=(/en/news/store/sales/champion-and-skin-sale-.*?) title", CurSales, Q) CurSalesURL := "http://na.leagueoflegends.com" CurSales1 WebRequest.Open("GET", CurSalesURL) WebRequest.Send() CurSalesStr := WebRequest.ResponseText() StringReplace, CurSalesStr, CurSalesStr, ", , All ;" RegExMatch(CurSalesStr, "i)(Champion Sales.*?)</div></div>", ChampSales) P := 1 Loop, { P := RegExMatch(ChampSales1, "i)/loading/(.*?)_0.jpg", ChampName, P + 1) RegExMatch(ChampSales1, "i)777777>(.*?)</strike", ChampHiPrice, P + 1) RegExMatch(ChampSales1, "i)strike> (.*?)</p>", ChampLoPrice, P + 1) If !ChampName1 break else ChampDataObj.ChampSales[A_Index] := {SaleName: ChampName1, HiPrice: ChampHiPrice1, LoPrice: ChampLoPrice1} } RegExMatch(CurSalesStr, "i)(Skin Sales.*?)</div></div>", SkinSales) P := 1 Loop, { P := RegExMatch(SkinSales1, "i)cboxElement href=(.*?)</h4>", SkinName, P + 1) If !SkinName1 break else { RegExMatch(SkinName1, "i)(.*?.jpg)", sURL) RegExMatch(SkinName1, "i)(.*?.jpg)", tURL) RegExMatch(SkinName1, "i)<h4>(.*)", sName) ChampDataObj.SkinSales[A_Index] := {SaleName: sName1, sURL: sURL1, tURL: tURL1} } } } else Goto, CheckNextSale } Menu, ChampSalesLoading, Delete For k, v in ChampDataObj.ChampSales { Menu, % "Sale" . v.SaleName, Add, % v.HiPrice " ---> " v.LoPrice, Tools Menu, ChampSaleNames, Add, % v.SaleName, % ":Sale" v.SaleName } Menu, Tray, Insert, Skin Sales, Champ Sales, :ChampSaleNames Menu, SkinSalesLoading, Delete For k, v in ChampDataObj.SkinSales { Menu, SkinSaleNames, Add, % v.SaleName, Sales } Menu, Tray, Insert, Pro Streams, Skin Sales, :SkinSaleNames ;TrayTip, League Tools %ver%, Sales loaded successfully. SetTimer, LoadData, -500 SkinListLoaded := 1 return SalesError: ;TrayTip, League Tools %ver%, There was a problem loading the sales. Sales := 0 return } ;StreamCheck before picture check If Streams { Menu, ProStreamsLoading, NoDefault If !ErrorLevel { ;TrayTip, League Tools %ver%, Pro Streams Loading - This should only dislpay once. GoSub, StreamCheck SetTimer, LoadData, -500 return } } ;Check for pictures If ChampListLoaded { ;TrayTip, League Tools %ver%, Getting champion icons. DDver := ChampDataObj.version For k,v in ChampDataObj.data { n1 := v.id n2 := v.name IfNotExist, %A_ScriptDir%\Data\ChampIcons\%n1%.png { urlchamp = http://ddragon.leagueoflegends.com/cdn/%DDver%/img/champion/%n1%.png UrlDownloadToFile, %urlchamp%, %A_ScriptDir%\Data\ChampIcons\%n1%.png If ErrorLevel CIconErr := 1 } If v.freeToPlay { Menu, GuidesLoading, Icon, %n2%, %A_ScriptDir%\Data\ChampIcons\%n1%.png,,30 MenuSize := MenuSize + 30 } else { Menu, GuidesLoading, Icon, %n2%, %A_ScriptDir%\Data\ChampIcons\%n1%.png,,20 MenuSize := MenuSize + 20 } } Loop % ChampDataObj.ChampSales.Length() { sName := ChampDataObj.ChampSales[A_Index].SaleName Menu, ChampSaleNames, Icon, %sName%, %A_ScriptDir%\Data\ChampIcons\%sName%.png } ;TrayTip, League Tools %ver%, Champ Icons downloaded. } ;Skin download If SkinListLoaded { ;TrayTip, League Tools %ver%, Getting skin icons. Loop % ChampDataObj.SkinSales.Length() { sName := ChampDataObj.SkinSales[A_Index].SaleName sURL := ChampDataObj.SkinSales[A_Index].sURL tURL := ChampDataObj.SkinSales[A_Index].tURL If !(FileExist(A_ScriptDir "\Data\Skins\" sName "_splash.png")) UrlDownloadToFile, % ChampDataObj.SkinSales[A_Index].sURL, %A_ScriptDir%\Data\Skins\%sName%_splash.png If !(FileExist(A_ScriptDir "\Data\Skins\" sName "_thumb.png")) UrlDownloadToFile, % ChampDataObj.SkinSales[A_Index].tURL, %A_ScriptDir%\Data\Skins\%sName%_thumb.png If ErrorLevel SIconErr := 1 Menu, SkinSaleNames, Icon, %sName%, %A_ScriptDir%\Data\Skins\%sName%_thumb.png,,20 } ;TrayTip, League Tools %ver%, Skin icons downloaded. } ;SetTimer, UpdateCheck, -1000 } return StreamCheck: { /* Example Calls 'twitch': 'https://api.twitch.tv/kraken/streams?game=League+of+Legends&limit=100', 'azubu': 'http://api.azubu.tv/public/channel/live/list/game/league-of-legends', 'hitbox': 'http://api.hitbox.tv/media/live/list', 'youtube': 'https://gdata.youtube.com/feeds/api/users/lolchampseries/live/events?v=2&itemsPerPage=100&inline=true&alt=json&status=active' */ TwitchURL := "https://api.twitch.tv/kraken/streams?game=League+of+Legends&limit=100&stream_type=live&client_id=pbta8w0375tir2u2victdhoe6ip4bbk" WebRequest.Open("GET", TwitchURL) WebRequest.Send() TwitchData := WebRequest.ResponseText() Try TwitchDataObj := JSON.Load(TwitchData) catch e TrayTip, League Tools %ver%, There was a problem loading Twitch streamers. ;Create Menus and Attach Menu, TStreams, Delete Menu, AStreams, Delete Menu, ProStreamsLoading, Delete Menu, Pro Streams, Delete MenuSize = 0 Loop % TwitchDataObj.streams.MaxIndex() { If (MenuSize > 620) { Menu, TStreams, Add, % TwitchDataObj.streams[A_Index].channel.name, Streams, +BarBreak MenuSize = 0 } Else { Menu, TStreams, Add, % TwitchDataObj.streams[A_Index].channel.name, Streams MenuSize := MenuSize + 20 } } Menu, Pro Streams, Add, AzubuTV, :AStreams Menu, Pro Streams, Add, TwitchTV, :TStreams ;Menu, Tray, Insert, Login, Pro Streams, :Pro Streams Menu, Accounts, NoDefault if !ErrorLevel Menu, Tray, Insert, Select Account, Pro Streams, :Pro Streams else Menu, Tray, Insert, Change VO/Text, Pro Streams, :Pro Streams SetTimer, StreamCheck, -100000 } return ;UpdateCheck: ;{ ; ;AHK Core Update check ; whr := ComObjCreate("WinHttp.WinHttpRequest.5.1") ; whr.Open("GET", "https://autohotkey.com/download/1.1/version.txt", true) ; whr.Send() ; whr.WaitForResponse() ; version1 := whr.ResponseText ; ver1 := A_AhkVersion ; If !(Version1 = ver1) ; Traytip, League Tools %ver%, Core AHK update available, 2 ; ; ;Script update check ; UpdateURL := "https://autohotkey.com/boards/viewtopic.php?f=19&t=10818" ; WebRequest.Open("GET", UpdateURL, true) ; WebRequest.Send() ; WebRequest.WaitForResponse() ; Data := WebRequest.ResponseText() ; RegExMatch(Data, "i)<title>League Tools (.*?) ", Version) ; ; If !(Version1 = ver) ; Traytip, League Tools %ver%, League Tools update available!, 2 ;} ;return SettingsSub: { Gui, Settings: New, -SysMenu, League Tools %ver% Gui, Settings: Add, Text, x10 y10 w60 h20 +0x200, Hotkeys: Gui, Settings: Add, Text, x35 y30 w60 h20 +0x200, Login 1: Gui, Settings: Add, Edit, x130 y30 w60 h20 vLogin1Key, %Login1Key% Gui, Settings: Add, Text, x35 y50 w60 h20 +0x200, Login 2: Gui, Settings: Add, Edit, x130 y50 w60 h20 vLogin2Key, %Login2Key% Gui, Settings: Add, Text, x35 y70 w60 h20 +0x200, Login 3: Gui, Settings: Add, Edit, x130 y70 w60 h20 vLogin3Key, %Login3Key% Gui, Settings: Add, Text, x35 y90 w75 h20 +0x200, Restart Queue: Gui, Settings: Add, Edit, x130 y90 w60 h20 vReStartQKey, %ReStartQKey% Gui, Settings: Add, Text, x35 y110 w75 h20 +0x200, Reload Script: Gui, Settings: Add, Edit, x130 y110 w60 h20 vReloadKey, %ReloadKey% Gui, Settings: Add, Text, x35 y160 w60 h20 +0x200, Region ;Reg := "NA" RegList := "RU|TR|BR|OCE|LAS|EUNE|EUW|NA|KR|LAN|" If Reg { selReg := Reg . "|" StringReplace, RegList, RegList, %selReg%, , All selReg := Reg . "||" RegList := Reglist . selReg } Gui, Settings: Add, DropDownList, x128 y160 w60 Sort vReg, %RegList% Gui, Settings: Add, Text, x35 y180 w60 h20 +0x200, Locale ;Loc := "en_US" LocList := "en_US|es_ES|fr_FR|de_DE|it_IT|pl_PL|ko_KR|ro_RO|el_GR|pt_BR|" If Loc { selLoc := Loc . "|" StringReplace, LocList, LocList, %selLoc%, , All selLoc := Loc . "||" LocList := LocList . selLoc } Gui, Settings: Add, DropDownList, x128 y180 w60 Sort vLoc, %LocList% Gui, Settings: Add, Text, x10 y210 w60 h20 +0x200, Defaults: Gui, Settings: Add, Text, x35 y230 w75 h20 +0x200, Default Login Gui, Settings: Add, Edit, x130 y230 w60 h20 vLgn, %lgn% Gui, Settings: Add, Text, x35 y250 w75 h20 +0x200, Queue Wait(ms) Gui, Settings: Add, Edit, x130 y250 w60 h20 vQueueWaitTime, %QueueWaitTime% Gui, Settings: Add, Text, x10 y280 h20 +0x200, Toaster Mode: (0 = Don't load this) Gui, Settings: Add, Text, x35 y300 w75 h20 +0x200, ChampList Gui, Settings: Add, Edit, x130 y300 w60 h20 vChampList, %ChampList% Gui, Settings: Add, Text, x35 y320 w75 h20 +0x200, Streams Gui, Settings: Add, Edit, x130 y320 w60 h20 vStreams, %Streams% Gui, Settings: Add, Text, x35 y340 w75 h20 +0x200, Sales Gui, Settings: Add, Edit, x130 y340 w60 h20 vSales, %Sales% Gui, Settings: Add, Text, x200 y8 w130 h20 +0x200, Login Information: Gui, Settings: Add, Listview, x224 y32 w249 h300 gLoginChange AltSubmit -Hdr, Auto Login Information:|Pass LV_ModifyCol(2, 1) Loop, { If !Login%A_Index% break LV_Add(, Login%A_Index%, Pass%A_Index%) } Gui, Settings: Add, Button, x225 y335 w60 h15 gLoginAdd, Add Gui, Settings: Add, Button, x295 y335 w60 h15 gLoginRemove, Remove Gui, Settings: Add, Button, x304 y392 w80 h23 gSettingsOK, &OK Gui, Settings: Add, Button, x392 y392 w80 h23 gSettingsCancel, &Cancel Gui, Settings: Show, w481 h424 WinWaitClose, League Tools } return SettingsOK: { Gui, Settings: Submit ;Verify good results before writing If !NewLoginKey1 NewLoginKey1 := "F7" If !NewLoginKey2 NewLoginKey2 := "F8" If !NewLoginKey3 NewLoginKey3 := "F9" If !ReStartQKey ReStartQKey := "F10" If !ReloadSubKey ReloadSubKey := "F12" ;Write good results and destroy the unnecessary GUI elements GoSub, WriteSettings GoSub, ReadSettings Gui, Settings: Destroy Menu, Accounts, Delete ;Menu, Login, Delete ;Menu, Group or Solo, Delete Loop, { If Login%A_Index% Menu, Accounts, Add, % Login%A_Index%, Tools else break } ;Menu, Tray, Insert, Screenedge Off, Auto Start, :AutoSelection ;Menu, Tray, Insert, Screenedge On, Auto Start, :AutoSelection ;Menu, Tray, Insert, Auto Start, Group or Solo, :GroupOrSolo ;Menu, Tray, Insert, Group or Solo, Login Only, LoginOnly Menu, Tray, Insert, Login, Select Account, :Accounts } return SettingsCancel: { Gui, Settings: Destroy } return LoginChange: { If (A_GuiEvent = "DoubleClick") { LoginNum := A_EventInfo Gui +OwnDialogs InputBox, Login%LoginNum%, League Tools %ver%, Enter new username If ErrorLevel return InputBox, Pass%LoginNum%, League Tools %ver%, Enter new password, HIDE If ErrorLevel return If (Login%LoginNum%) && (Pass%LoginNum%) { ObfPass := Obf(Pass%LoginNum%, 1, 1234) LV_Modify(LoginNum, , Login%LoginNum%, ObfPass) } } If (A_GuiEvent = "Normal") global SelectedRow := A_EventInfo } return LoginAdd: { Gui +OwnDialogs InputBox, Login, League Tools %ver%, Enter new username InputBox, Pass, League Tools %ver%, Enter new password, HIDE ObfPass := Obf(Pass, 1, 1234) LV_Add(, Login, ObfPass) } return LoginRemove: { If SelectedRow = 0 return LV_Delete(SelectedRow) SelectedRow := 0 } return ReloadSub: { GoSub, WriteSettings reload } return ExitSub: { GoSub, WriteSettings ExitApp } return SetFirstRun: { IfNotExist, %A_ScriptDir%\Data { FileCreateDir, %A_ScriptDir%\Data FileCreateDir, %A_ScriptDir%\Data\Skins FileCreateDir, %A_ScriptDir%\Data\ChampIcons } config= ( [Login1] Username= Password= [Login2] Username= Password= [Login3] Username= Password= [Region] Reg=%Reg% [Locale] Loc=%Loc% [DefaultLogin] lgn=1 [QueueTime] QueueWaitTime=300 [Toaster] ChampList=1 Sales=1 Streams=1 [Hotkeys] Login1Key=F7 Login2Key=F8 Login3Key=F9 ReStartQKey=F10 ReloadKey=F12 ) FileAppend, %config%, %A_ScriptDir%\Data\Config.Ini } return ReadSettings: { IniRead, Reg, %A_ScriptDir%\Data\Config.ini, Region, Reg IniRead, Loc, %A_ScriptDir%\Data\Config.ini, Locale, Loc IniRead, lgn, %A_ScriptDir%\Data\Config.ini, DefaultLogin, lgn, 1 IniRead, QueueWaitTime, %A_ScriptDir%\Data\Config.ini, QueueTime, QueueWaitTime, 500 IniRead, Key1, %A_ScriptDir%\Data\Config.ini, Keys, Key1 IniRead, Login1Key, %A_ScriptDir%\Data\Config.ini, Hotkeys, Login1Key, F7 IniRead, Login2Key, %A_ScriptDir%\Data\Config.ini, Hotkeys, Login2Key, F8 IniRead, Login3Key, %A_ScriptDir%\Data\Config.ini, Hotkeys, Login3Key, F9 IniRead, ReStartQKey, %A_ScriptDir%\Data\Config.ini, Hotkeys, ReStartQKey, F10 IniRead, ReloadKey, %A_ScriptDir%\INI\Data\Config.ini, Hotkeys, ReloadKey, F12 IniRead, ChampList, %A_ScriptDir%\Data\Config.ini, Toaster, ChampList, 1 IniRead, Streams, %A_ScriptDir%\Data\Config.ini, Toaster, Streams, 1 IniRead, Sales, %A_ScriptDir%\Data\Config.ini, Toaster, Sales, 1 Loop, { IniRead, Login%A_Index%, %A_ScriptDir%\Data\Config.ini, Login%A_Index%, Username IniRead, Pass%A_Index%, %A_ScriptDir%\Data\Config.ini, Login%A_Index%, Password IfInString, Login%A_Index%, ERROR { Login%A_Index% := break } else Login[A_Index] := {Name: Login%A_Index%, Pass: Pass%A_Index%} } } return WriteSettings: { IniWrite, %Login1Key%, %A_ScriptDir%\Data\Config.ini, HotKeys, Login1Key IniWrite, %Login2Key%, %A_ScriptDir%\Data\Config.ini, HotKeys, Login2Key IniWrite, %Login3Key%, %A_ScriptDir%\Data\Config.ini, HotKeys, Login3Key IniWrite, %ReStartQKey%, %A_ScriptDir%\Data\Config.ini, HotKeys, ReStartQKey IniWrite, %ReloadKey%, %A_ScriptDir%\Data\Config.ini, HotKeys, ReloadKey IniWrite, %Reg%, %A_ScriptDir%\Data\Config.ini, Region, Reg IniWrite, %Loc%, %A_ScriptDir%\Data\Config.ini, Locale, Loc IniWrite, %lgn%, %A_ScriptDir%\Data\Config.ini, DefaultLogin, lgn IniWrite, %QueueWaitTime%, %A_ScriptDir%\Data\Config.ini, QueueTime, QueueWaitTime IniWrite, %ChampList%, %A_ScriptDir%\Data\Config.ini, Toaster, ChampList IniWrite, %Sales%, %A_ScriptDir%\Data\Config.ini, Toaster, Sales IniWrite, %Streams%, %A_ScriptDir%\Data\Config.ini, Toaster, Streams IniWrite, %Key1%, %A_ScriptDir%\Data\Config.ini, Keys, Key1 Loop, { LV_GetText(Login, A_Index, 1) If !Login break LV_GetText(Pass, A_Index, 2) IniWrite, %Login%, %A_ScriptDir%\Data\Config.ini, Login%A_Index%, Username IniWrite, %Pass%, %A_ScriptDir%\Data\Config.ini, Login%A_Index%, Password } } return ColorCross(x, y, col) { v := 25 per := 100/765 PixelGetColor, a, x, (y + 1), RGB PixelGetColor, b, x, (y - 1), RGB PixelGetColor, c, (x + 1), y, RGB PixelGetColor, d, (x - 1), y, RGB CDA := Distance(col, a) CDB := Distance(col, b) CDC := Distance(col, c) CDD := Distance(col, d) ;MsgBox % "CDA: " . CDA . ", CDB: " . CDB . ", CDC: " . CDC . ", CDD: " . CDD . " `nCol: " . col . "`nRED: " . test . "`nGREEN: " . col>>8&255 . "`nBLUE: " . col&255 . "`nAverage: " . ((((CDA + CDC)/2) + ((CDB+CDD)/2))/2) re := ( ( ( ( CDA*per ) + ( CDB*per ) ) / 2 ) + ( ( ( CDC*per ) + ( CDD*per ) ) / 2 ) / 2 ) if (re < v) return True Else return False } Distance(c1, c2) { ; function by [VxE], return value range = [0, 441.67295593006372] ;return Sqrt((((c1>>16)-(c2>>16))**2)+(((c1>>8&255)-(c2>>8&255))**2)+(((c1&255)-(c2&255))**2)) ; function from wikipedia Color Difference, colors compared are in RGB format (0xRRGGBB), return value range = [0, 765] return Sqrt( ( 2*( ( c1>>16 ) - ( c2>>16 ) )**2 ) + ( 4*( ( c1>>8&255 ) - ( c2>>8&255 ) )**2 ) + ( 3*( ( c1&255 ) - ( c2&255 ) )**2 ) + ( ( ( ( ( c1>>16 ) + ( c2>>16 ) ) / 2 ) * ( ( ( c1>>16 ) - ( c2>>16 ) )**2 - ( ( c1&255 ) - ( c2&255 ) )**2 ) ) / ( 256 ) ) ) } Obf(x,y,Seed=12345) { String=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 -=.,?':;/\!@#$`%^&*()_+| Random, ,Seed Loop, Parse, x { Pos:=InStr(String,A_LoopField,1) Random, Offset , 1, 86 Coded.=SubStr(String, y ? (Pos+Offset)>86 ? Pos+Offset-86 : Pos+Offset : (Pos-Offset)<1 ? Pos-Offset+86 : Pos-Offset,1) } Return Coded } ClipCursor(Confine=True, x1=0 , y1=0, x2=1920, y2=1080) { VarSetCapacity(R,16,0), NumPut(x1,&R+0),NumPut(y1,&R+4),NumPut(x2,&R+8),NumPut(y2,&R+12) Return Confine ? DllCall( "ClipCursor", UInt,&R ) : DllCall( "ClipCursor" ) } class JSON { class Load extends JSON.Functor { Call(self, ByRef text, reviver:="") { this.rev := IsObject(reviver) ? reviver : false this.keys := this.rev ? {} : false static quot := Chr(34), bashq := "\" . quot , json_value := quot . "{[01234567890-tfn" , json_value_or_array_closing := quot . "{[]01234567890-tfn" , object_key_or_object_closing := quot . "}" key := "" is_key := false root := {} stack := [root] next := json_value pos := 0 while ((ch := SubStr(text, ++pos, 1)) != "") { if InStr(" `t`r`n", ch) continue if !InStr(next, ch, 1) this.ParseError(next, text, pos) holder := stack[1] is_array := holder.IsArray if InStr(",:", ch) { next := (is_key := !is_array && ch == ",") ? quot : json_value } else if InStr("}]", ch) { ObjRemoveAt(stack, 1) next := stack[1]==root ? "" : stack[1].IsArray ? ",]" : ",}" } else { if InStr("{[", ch) { static json_array := Func("Array").IsBuiltIn || ![].IsArray ? {IsArray: true} : 0 (ch == "{") ? ( is_key := true , value := {} , next := object_key_or_object_closing ) ; ch == "[" : ( value := json_array ? new json_array : [] , next := json_value_or_array_closing ) ObjInsertAt(stack, 1, value) if (this.keys) this.keys[value] := [] } else { if (ch == quot) { i := pos while (i := InStr(text, quot,, i+1)) { value := StrReplace(SubStr(text, pos+1, i-pos-1), "\\", "\u005c") static tail := A_AhkVersion<"2" ? 0 : -1 if (SubStr(value, tail) != "\") break } if (!i) this.ParseError("'", text, pos) value := StrReplace(value, "\/", "/") , value := StrReplace(value, bashq, quot) , value := StrReplace(value, "\b", "`b") , value := StrReplace(value, "\f", "`f") , value := StrReplace(value, "\n", "`n") , value := StrReplace(value, "\r", "`r") , value := StrReplace(value, "\t", "`t") pos := i ; update pos i := 0 while (i := InStr(value, "\",, i+1)) { if !(SubStr(value, i+1, 1) == "u") this.ParseError("\", text, pos - StrLen(SubStr(value, i+1))) uffff := Abs("0x" . SubStr(value, i+2, 4)) if (A_IsUnicode || uffff < 0x100) value := SubStr(value, 1, i-1) . Chr(uffff) . SubStr(value, i+6) } if (is_key) { key := value, next := ":" continue } } else { value := SubStr(text, pos, i := RegExMatch(text, "[\]\},\s]|$",, pos)-pos) static number := "number", integer :="integer" if value is %number% { if value is %integer% value += 0 } else if (value == "true" || value == "false") value := %value% + 0 else if (value == "null") value := "" else this.ParseError(next, text, pos, i) pos += i-1 } next := holder==root ? "" : is_array ? ",]" : ",}" } ; If InStr("{[", ch) { ... } else is_array? key := ObjPush(holder, value) : holder[key] := value if (this.keys && this.keys.HasKey(holder)) this.keys[holder].Push(key) } } ; while ( ... ) return this.rev ? this.Walk(root, "") : root[""] } ParseError(expect, ByRef text, pos, len:=1) { static quot := Chr(34), qurly := quot . "}" line := StrSplit(SubStr(text, 1, pos), "`n", "`r").Length() col := pos - InStr(text, "`n",, -(StrLen(text)-pos+1)) msg := Format("{1}`n`nLine:`t{2}`nCol:`t{3}`nChar:`t{4}" , (expect == "") ? "Extra data" : (expect == "'") ? "Unterminated string starting at" : (expect == "\") ? "Invalid \escape" : (expect == ":") ? "Expecting ':' delimiter" : (expect == quot) ? "Expecting object key enclosed in double quotes" : (expect == qurly) ? "Expecting object key enclosed in double quotes or object closing '}'" : (expect == ",}") ? "Expecting ',' delimiter or object closing '}'" : (expect == ",]") ? "Expecting ',' delimiter or array closing ']'" : InStr(expect, "]") ? "Expecting JSON value or array closing ']'" : "Expecting JSON value(string, number, true, false, null, object or array)" , line, col, pos) static offset := A_AhkVersion<"2" ? -3 : -4 throw Exception(msg, offset, SubStr(text, pos, len)) } Walk(holder, key) { value := holder[key] if IsObject(value) { for i, k in this.keys[value] { v := this.Walk(value, k) if (v != JSON.Undefined) value[k] := v else ObjDelete(value, k) } } return this.rev.Call(holder, key, value) } } class Dump extends JSON.Functor { Call(self, value, replacer:="", space:="") { this.rep := IsObject(replacer) ? replacer : "" this.gap := "" if (space) { static integer := "integer" if space is %integer% Loop, % ((n := Abs(space))>10 ? 10 : n) this.gap .= " " else this.gap := SubStr(space, 1, 10) this.indent := "`n" } return this.Str({"": value}, "") } Str(holder, key) { value := holder[key] if (this.rep) value := this.rep.Call(holder, key, ObjHasKey(holder, key) ? value : JSON.Undefined) if IsObject(value) { static type := A_AhkVersion<"2" ? "" : Func("Type") if (type ? type.Call(value) == "Object" : ObjGetCapacity(value) != "") { if (this.gap) { stepback := this.indent this.indent .= this.gap } is_array := value.IsArray if (!is_array) { for i in value is_array := i == A_Index until !is_array } str := "" if (is_array) { Loop, % value.Length() { if (this.gap) str .= this.indent v := this.Str(value, A_Index) str .= (v != "") ? v . "," : "null," } } else { colon := this.gap ? ": " : ":" for k in value { v := this.Str(value, k) if (v != "") { if (this.gap) str .= this.indent str .= this.Quote(k) . colon . v . "," } } } if (str != "") { str := RTrim(str, ",") if (this.gap) str .= stepback } if (this.gap) this.indent := stepback return is_array ? "[" . str . "]" : "{" . str . "}" } } else ; is_number ? value : "value" return ObjGetCapacity([value], 1)=="" ? value : this.Quote(value) } Quote(string) { static quot := Chr(34), bashq := "\" . quot if (string != "") { string := StrReplace(string, "\", "\\") , string := StrReplace(string, quot, bashq) , string := StrReplace(string, "`b", "\b") , string := StrReplace(string, "`f", "\f") , string := StrReplace(string, "`n", "\n") , string := StrReplace(string, "`r", "\r") , string := StrReplace(string, "`t", "\t") static rx_escapable := A_AhkVersion<"2" ? "O)[^\x20-\x7e]" : "[^\x20-\x7e]" while RegExMatch(string, rx_escapable, m) string := StrReplace(string, m.Value, Format("\u{1:04x}", Ord(m.Value))) } return quot . string . quot } } Undefined[] { get { static empty := {}, vt_empty := ComObject(0, &empty, 1) return vt_empty } } class Functor { __Call(method, ByRef arg, args*) { if IsObject(method) return (new this).Call(method, arg, args*) else if (method == "") return (new this).Call(arg, args*) } } } F12:: reload

Return to “Gaming”

Who is online

Users browsing this forum: No registered users and 11 guests