oauo

TF2 Longest Sightlines

Jul 23rd, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.27 KB | None | 0 0
  1. open FSharp.Json
  2. open FSharp.Data
  3. open System
  4.  
  5. //On fetching data if data is [] then it is the end
  6. //http://api.heatmaps.tf/maps/ctf_2fort/kills?fields=["killer_class","killer_x","killer_y","killer_z","victim_x","victim_y","victim_z"]&limit=5000&offset=0
  7. //sniper class: 2
  8.  
  9. //Data for kills
  10. type Kills =
  11.     { map_data: MapData; fields: string list; data: float list list }
  12. and MapData =
  13.     { name: string; offset_x: int; offset_y: int; scale: float; kill_count: int }
  14.  
  15. //Return a list of kills from heatmaps.tf with limit and offset
  16. let FetchData map (limit:int) (page:int) =
  17.  
  18.     //Throttle requests to max 20/sec, heatmaps.tf requests max requests be 20/sec
  19.     let event = new System.Threading.AutoResetEvent(false)
  20.     let timer = new System.Timers.Timer(50.0)
  21.     timer.Elapsed.Add (fun _ -> event.Set() |> ignore)
  22.  
  23.     timer.Start()
  24.     event.WaitOne() |> ignore
  25.  
  26.     //printfn "Fetching page %i for %s" page map
  27.     Http.RequestString ("http://api.heatmaps.tf/maps/" + map + "/kills?fields=[%22killer_class%22,%22killer_x%22,%22killer_y%22,%22killer_z%22,%22victim_x%22,%22victim_y%22,%22victim_z%22]&limit=" + string limit + "&offset=" + string (limit*page))
  28.  
  29. //Return length between 2 points using heatmapt.tf fields formatting
  30. let CalculateDistance (values:float list) =
  31.     let x = values.[1] - values.[4]
  32.     let y = values.[2] - values.[5]
  33.     let z = values.[3] - values.[6]
  34.     pown x 2 + pown y 2 + pown z 2
  35.     |> sqrt
  36.  
  37. //Parse map data to get a list of kills from snipers
  38. let rec ParseData map (offset:int): float list =
  39.     //printfn "Parsing offset %i of %s" offset map
  40.     let data = Json.deserialize<Kills> (FetchData map 5000 offset)
  41.     if data.data = [] || offset = 20 then
  42.         []
  43.     else
  44.         data.data
  45.         |> List.filter (fun x -> x.[0] = 2.0)
  46.         |> List.map (fun x -> CalculateDistance x)
  47.         |> List.append (ParseData map (offset+1))
  48.    
  49. //Take parsed data and get useful data
  50. let ProcessData map =
  51.     let data = ParseData map 0
  52.     Console.ForegroundColor <- ConsoleColor.Yellow
  53.     printfn "Longest kill in %A was %A" map (data |> List.max)
  54.  
  55. [<EntryPoint>]
  56. let main argv =
  57.     Console.ForegroundColor <- ConsoleColor.Blue
  58.     ProcessData "ctf_2fort"
  59.    
  60.     System.Console.ReadKey() |> ignore
  61.     0
Add Comment
Please, Sign In to add comment