{"id":20526306,"url":"https://github.com/powerbroker2/warthunder","last_synced_at":"2025-04-12T09:42:52.853Z","repository":{"id":56350092,"uuid":"189673206","full_name":"PowerBroker2/WarThunder","owner":"PowerBroker2","description":"Python package to query and access vehicle telemetry data while in War Thunder battles","archived":false,"fork":false,"pushed_at":"2024-07-03T23:45:04.000Z","size":999,"stargazers_count":58,"open_issues_count":2,"forks_count":12,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-10T11:34:35.873Z","etag":null,"topics":["access-vehicle-telemetry","acmi","air-battle","c-plus-plus","library","python","python-library","tacview","telemetry","vehicle","warthunder"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PowerBroker2.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-01T00:25:42.000Z","updated_at":"2025-01-26T06:53:33.000Z","dependencies_parsed_at":"2024-11-24T04:02:49.462Z","dependency_job_id":null,"html_url":"https://github.com/PowerBroker2/WarThunder","commit_stats":{"total_commits":247,"total_committers":2,"mean_commits":123.5,"dds":"0.15384615384615385","last_synced_commit":"65288e8f2245a0d0ee2327fbb1a00ddd0d051f63"},"previous_names":[],"tags_count":37,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PowerBroker2%2FWarThunder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PowerBroker2%2FWarThunder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PowerBroker2%2FWarThunder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PowerBroker2%2FWarThunder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PowerBroker2","download_url":"https://codeload.github.com/PowerBroker2/WarThunder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248549776,"owners_count":21122925,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["access-vehicle-telemetry","acmi","air-battle","c-plus-plus","library","python","python-library","tacview","telemetry","vehicle","warthunder"],"created_at":"2024-11-15T23:13:36.877Z","updated_at":"2025-04-12T09:42:52.822Z","avatar_url":"https://github.com/PowerBroker2.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![GitHub version](https://badge.fury.io/gh/PowerBroker2%2FWarThunder.svg)](https://badge.fury.io/gh/PowerBroker2%2FWarThunder) [![PyPI version](https://badge.fury.io/py/WarThunder.svg)](https://badge.fury.io/py/WarThunder)\n\n# Overview\nPython package to access vehicle telemetry and match data in real-time while in War Thunder air battles (NOT tanks). Here are some things you can access/do with this package:\n- Get telemetry information on your vehicle and others identified on user's mini map\n  - Data available for both user and other match player's vehicles:\n    - Location in latitude/longitude (DD)\n    - Heading angle\n    - Airspeed\n  - Data avilable only for user's vehicle:\n    - Pitch angle\n    - Roll angle\n    - Flap state\n    - Gear state\n    - Altitude\n- Data on other objects identified on user's mini map\n  - Object's location in latitude/longitude (DD)\n    - Airfields have 2 locations, one for each end of the runway\n  - Object's faction (friendly or enemy)\n  - Object's type (fighter, bomber, heavy tank, etc)\n- Map name\n- Chat comments (anything typed into chat)\n- Match events (death, crash, etc)\n- Log data in an [ACMI format](https://www.tacview.net/documentation/acmi/en/) compatible with [Tacview](https://www.tacview.net/)\n\nThis library makes use of War Thunder's localhost server pages (http://localhost:8111/indicators, http://localhost:8111/state, http://localhost:8111/map.img, http://localhost:8111/map_obj.json, and http://localhost:8111/map_info.json, and more!) that the game automatically serves when you launch a game match. If it is an air battle, these pages will include JSON formatted data with valid airplane telemetry. This telemetry is then converted and returned to the calling function/user.\n\nThe data can then be easily used for any custom application (i.e. telemetry datalogger and grapher).\n\n# Example Use-Case:\nhttps://github.com/PowerBroker2/Thunder_Viewer\n\n# To Install\n`pip install WarThunder`\n\n# Example Python Script\n```python\nfrom WarThunder import telemetry\nfrom WarThunder import mapinfo\nfrom pprint import pprint\n\n\ndef find_map_info():\n    print('------------------------------------------------------')\n    print('Map Info:')\n    print('\\tName:\\t\\t\\t\\t\\t{}'.format(telem.map_info.grid_info['name']))\n    print('\\tUpper Left Hand Corner Coordinate:\\t[{}, {}]'.format(telem.map_info.grid_info['ULHC_lat'], telem.map_info.grid_info['ULHC_lon']))\n    print('\\tSize:\\t\\t\\t\\t\\t{}km x {}km'.format(telem.map_info.grid_info['size_km'], telem.map_info.grid_info['size_km']))\n    print('')\n\ndef find_all_bomb_points():\n    print('------------------------------------------------------')\n    find_bomb_points(True)\n    find_bomb_points(False)\n\ndef find_all_airfields():\n    print('------------------------------------------------------')\n    find_airfields(True)\n    find_airfields(False)\n\ndef find_all_planes():\n    print('------------------------------------------------------')\n    find_planes(True)\n    find_planes(False)\n\ndef find_all_tanks():\n    print('------------------------------------------------------')\n    find_tanks(True)\n    find_tanks(False)\n\ndef find_all_AAAs():\n    print('------------------------------------------------------')\n    find_AAAs(True)\n    find_AAAs(False)\n    \ndef find_basic_telemetry():\n    print('------------------------------------------------------')\n    print('Basic Telemetry:')\n    pprint(telem.basic_telemetry)\n    print('')\n    \ndef find_comments():\n    print('------------------------------------------------------')\n    print('Comments:')\n    comments = telem.get_comments()\n    \n    if comments:\n        pprint(comments)\n    else:\n        print('\\tNone')\n    print('')\n    \ndef find_events():\n    print('------------------------------------------------------')\n    print('Events:')\n    events = telem.get_events()\n    \n    if events:\n        pprint(events)\n    else:\n        print('\\tNone')\n    print('')\n\ndef find_bomb_points(friendly=True):\n    if friendly:\n        print('Friendly Bomb Points:')\n        bomb_points = [obj for obj in telem.map_info.defend_points() if obj.friendly]\n    else:\n        print('Enemy Bomb Points:')\n        bomb_points = [obj for obj in telem.map_info.bombing_points() if not obj.friendly]\n    \n    if bomb_points:\n        for bomb_point in bomb_points:\n            print('\\tBombing Point: {}'.format(bomb_point.position_ll))\n    else:\n        print('\\tNone')\n    print(' ')\n\ndef find_airfields(friendly=True):\n    if friendly:\n        print('Friendly Airfields:')\n        airfields = [obj for obj in telem.map_info.airfields() if obj.friendly]\n    else:\n        print('Enemy Airfields:')\n        airfields = [obj for obj in telem.map_info.airfields() if not obj.friendly]\n    \n    if airfields:\n        for airfield in airfields:\n            print('\\tEast Coordinate:\\t{}'.format(airfield.east_end_ll))\n            print('\\tSouth Coordinate:\\t{}'.format(airfield.south_end_ll))\n            print('\\tRunway Heading:\\t\\t{} °'.format(airfield.runway_dir))\n            print('\\tRunway Length:\\t\\t{} km'.format(mapinfo.coord_dist(*airfield.east_end_ll, *airfield.south_end_ll)))\n            print('')\n    else:\n        print('\\tNone')\n    print('')\n\ndef find_planes(friendly=True):\n    if friendly:\n        print('Friendly Planes:')\n        planes = [obj for obj in telem.map_info.planes() if obj.friendly]\n    else:\n        print('Enemy Planes:')\n        planes = [obj for obj in telem.map_info.planes() if not obj.friendly]\n    \n    if planes:\n        for plane in planes:\n            print('\\tPosition:\\t{}'.format(plane.position_ll))\n            print('\\tHeading:\\t{}'.format(plane.hdg))\n            print('')\n    else:\n        print('\\tNone')\n    print('')\n    \n\ndef find_tanks(friendly=True):\n    if friendly:\n        print('Friendly Tanks:')\n        tanks = [obj for obj in telem.map_info.tanks() if obj.friendly]\n    else:\n        print('Enemy Tanks:')\n        tanks = [obj for obj in telem.map_info.tanks() if not obj.friendly]\n    \n    if tanks:\n        for tank in tanks:\n            print('\\tPosition:\\t{}'.format(tank.position_ll))\n            print('\\tHeading:\\t{}'.format(tank.hdg))\n            print('')\n    else:\n        print('\\tNone')\n    print('')\n\ndef find_AAAs(friendly=True):\n    if friendly:\n        print('Friendly AAAs:')\n        AAAs = [obj for obj in telem.map_info.AAAs() if obj.friendly]\n    else:\n        print('Enemy AAAs:')\n        AAAs = [obj for obj in telem.map_info.AAAs() if not obj.friendly]\n    \n    if AAAs:\n        for AAA in AAAs:\n            print('\\tPosition:\\t{}'.format(AAA.position_ll))\n    else:\n        print('\\tNone')\n    print('')\n\n\nif __name__ == '__main__':\n    try:\n        telem = telemetry.TelemInterface()\n        \n        while not telem.get_telemetry():\n            pass\n        \n        find_map_info()\n        find_all_airfields()\n        find_all_planes()\n        find_all_tanks()\n        find_all_bomb_points()\n        find_all_AAAs()\n        find_basic_telemetry()\n        find_comments()\n        find_events()\n        \n    except KeyboardInterrupt:\n        print('Closing')\n```\n\n# Example Output:\n\n```\n------------------------------------------------------\nMap Info:\n        Name:                                   Ruhr\n        Upper Left Hand Corner Coordinate:      [51.73829303094487, 6.437537416826182]\n        Size:                                   65km x 65km\n\n------------------------------------------------------\nFriendly Airfields:\n        East Coordinate:        [51.43642186048186, 6.930164507472621]\n        South Coordinate:       [51.42827500146132, 6.9187980201946795]\n        Runway Heading:         41.012963528358455 °\n        Runway Length:          1.2019773371283782 km\n\n\nEnemy Airfields:\n        None\n\n------------------------------------------------------\nFriendly Planes:\n        Position:       [51.44442707177771, 6.9048435542278]\n        Heading:        191.7501316630443\n\n        Position:       [51.444117867741056, 6.904189278772745]\n        Heading:        191.7327479963323\n\n        Position:       [51.44454697658904, 6.904059699788993]\n        Heading:        191.73257970022075\n\n        Position:       [51.44424583467913, 6.903432678896212]\n        Heading:        191.73146722121177\n\n\nEnemy Planes:\n        None\n\n------------------------------------------------------\nFriendly Tanks:\n        None\n\nEnemy Tanks:\n        Position:       [51.448172861547235, 6.883101199222394]\n        Heading:        0\n\n\n------------------------------------------------------\nFriendly Bomb Points:\n        None\n \nEnemy Bomb Points:\n        None\n \n------------------------------------------------------\nFriendly AAAs:\n        Position:       [51.43844836391245, 6.925201117152168]\n        Position:       [51.43829338882834, 6.9249774559908275]\n        Position:       [51.438609103385076, 6.925442639430436]\n        Position:       [51.4276199323936, 6.924573106340005]\n        Position:       [51.42778836500274, 6.924790301773768]\n        Position:       [51.427463714376124, 6.924367280891929]\n        Position:       [51.438792600079246, 6.9392408728402595]\n\nEnemy AAAs:\n        None\n\n------------------------------------------------------\nBasic Telemetry:\n{'IAS': 0,\n 'airframe': 'bf_110g_4',\n 'altitude': 59.221455,\n 'flapState': 0,\n 'gearState': 100,\n 'heading': 40.639851,\n 'lat': 51.428588129131136,\n 'lon': 6.919188108689251,\n 'pitch': 10.894329,\n 'roll': 0.010828}\n\n------------------------------------------------------\nComments:\n        None\n\n------------------------------------------------------\nEvents:\n{'events': [], 'damage': [{'id': 1, 'msg': 'yn1/error/82220002', 'sender': '', 'enemy': False, 'mode': ''}]}\n{'damage': [{'enemy': False,\n             'id': 1,\n             'mode': '',\n             'msg': 'yn1/error/82220002',\n             'sender': ''}],\n 'events': []}\n ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpowerbroker2%2Fwarthunder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpowerbroker2%2Fwarthunder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpowerbroker2%2Fwarthunder/lists"}