GithubHelp home page GithubHelp logo

timzaman / dotaservice Goto Github PK

View Code? Open in Web Editor NEW
109.0 8.0 19.0 3.32 MB

DotaService is a service to play Dota 2 through gRPC

License: Other

Python 34.14% Lua 60.71% C++ 5.14%
dota2 service reinforcement-learning grpc python37 asyncio

dotaservice's People

Contributors

nostrademous avatar timzaman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dotaservice's Issues

dota2 docker running problem

recently I rebuild the docker image, but after launching dota2, it reports a network error
QQ截图20190311115442

it seems some recent dota2's update cause this issue, any idea about how to resolve this?

How can i know a unit is visible to a team?

it seems that the observe() can get all units in the game. But if I pass a handle in DOTA_UNIT_ORDER_ATTACK_TARGET action which is not in bot's vision, the GetBotByHandle will fail (and it should fail).
Thus I need a way to know if a unit is visible to bot.

lane creep not spawn

I test the game mode = DOTA_GAMEMODE_MO and game mode = DOTA_GAMEMODE_1V1MID, but sometimes the lane creep doesn't spawn, do I miss something?

Using Generic Hero Values

As we train the AI to do actions we should train on general data values rather than values trained to specific hero names/IDs. What I mean, rather than training an Antimage bot and then separately on say Earthshaker, we should rather train on a hero with certain characteristics like "base move speed", "turn rate", "attack range", etc.

The learned behavior for map navigation say for a hero with same base movement speed and turn rate should be the same irregardless of what hero it actually is.

Similarly, we can do this for units and abilities/items to generalize the learning process.

I have written a python file to auto-generate JSON files for heroes, units, and abilities from the Dota2 provided .txt files. I've pushed the script in the other repo to separate it from the dotaservice.

Link: https://github.com/pydota2/pydota2/blob/master/patching/generate_json_files.py

Here is what the python file pulls from the Dota2 resource files for Antimage:

    "1": {
        "Name": "npc_dota_hero_antimage",
        "Talents": {
            "Talent_1": "special_bonus_strength_10",
            "Talent_2": "special_bonus_attack_speed_20",
            "Talent_3": "special_bonus_unique_antimage_3",
            "Talent_4": "special_bonus_agility_15",
            "Talent_5": "special_bonus_unique_antimage_5",
            "Talent_6": "special_bonus_unique_antimage",
            "Talent_7": "special_bonus_unique_antimage_4",
            "Talent_8": "special_bonus_unique_antimage_2"
        },   
        "ArmorPhysical": -1,
        "AttackRate": 1.4, 
        "AttackRange": 150, 
        "ProjectileSpeed": 0,
        "AttributeBaseStrength": 23,
        "AttributeStrengthGain": 1.3, 
        "AttributeBaseIntelligence": 12,
        "AttributeIntelligenceGain": 1.8, 
        "AttributeBaseAgility": 22,
        "AttributeAgilityGain": 2.8, 
        "MovementSpeed": 310, 
        "MovementTurnRate": 0.5
    }, 

Reason for this design is to allow for much faster/easier response to new Dota2 patches coming down in the future. All you need to do is run the python script and it will auto generate the data which we can use in agent training.

Action.actionDelay nil error

I think this attribute should be required in proto file or really optional.
now if i don't assign this value, bot script will crash at bot_nevermore.lua:146
act_at_step = step + action.actionDelay -- TODO(tzaman) does this still work if not defined?

Collaborative GCP Bucket

Do you think it is wise to create a collaborative GCP bucket (each person will obviously have their own credentials)?

With the code as currently checked in it will try to access the 'dotaservice' bucket which none but you will have access to. Obviously easy to change but was debating the above question.

how to cast skill?

I look the dotaclient code, it seems right now it can only use three types of actions: move, attack and do nothing.
I want to cast the q,w,e,r skills in NeverMore, so is there a way to do that?

DebugDrawLine doesn't draw the correct line

I notice in the game, when I order hero to move to some destination, what DebugDrawLine draw on the map is so far away from the correct position.
the DebugDrawCircle api also not draw the circle at the correct position.

it is not the big deal, but without these api, it seems hard to debug the lua code, any suggestion?

get_unit returns None

Below error probably caused by the Hero not being present in the world state (wut?!)

Client

x=-2406, y=-796, reward=0.0
Traceback (most recent call last):
  File "client.py", line 306, in <module>
    asyncio.run(main())
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 568, in run_until_complete
    return future.result()
  File "client.py", line 241, in main
    reward = get_reward(prev_state=prev_state, state=state)
  File "client.py", line 77, in get_reward
    xp = get_total_xp(level=unit.level, xp_needed_to_level=unit.xp_needed_to_level)
AttributeError: 'NoneType' object has no attribute 'level'

Server

(...)
(python) action= {'actionType': 'DOTA_UNIT_ORDER_MOVE_TO_POSITION', 'moveToLocation': {'location': {'x': -2355.25537109375, 'y': -905.2532958984375, 'z': 0.0}}, 'dota_time': -16.234458923339844}
Script function 'Think' on bot npc_dota_hero_nevermore took 9.823ms
(py) worldstate @ dotatime=-15.234474182128906, gamestate=4
DotaService::step()
(python) action= {'actionType': 'DOTA_UNIT_ORDER_MOVE_TO_POSITION', 'moveToLocation': {'location': {'x': -2105.71923828125, 'y': -1095.6365966796875, 'z': 0.0}}, 'dota_time': -15.234474182128906}
Script function 'Think' on bot npc_dota_hero_nevermore took 8.761ms
(py) worldstate @ dotatime=-14.234489440917969, gamestate=4
DotaService::step()
(python) action= {'actionType': 'DOTA_UNIT_ORDER_MOVE_TO_POSITION', 'moveToLocation': {'location': {'x': -2398.65966796875, 'y': -497.1832275390625, 'z': 0.0}}, 'dota_time': -14.234489440917969}
Script function 'Think' on bot npc_dota_hero_nevermore took 8.750ms
(py) worldstate @ dotatime=-13.234504699707031, gamestate=4
/Users/tzaman/dev/dotaservice/dotaservice/dotaservice.py:243: RuntimeWarning: Unexpected end-group tag: Not all data was converted
  parsed_data.ParseFromString(data)
(py) worldstate @ dotatime=0.0, gamestate=0

Is there a method to pause the game?

DotaServiceStub.reset takes 45~50 seconds on my host.
If there is a "pause" method, maybe i can build a resource pool of dota2 instance.
since my host is weak in IO but plenty of memory.

Dotaservice's `reset` crash: worlstate related?

Server:

Traceback (most recent call last):
  File "/root/dotaservice/dotaservice/dotaservice.py", line 261, in _worldstate_listener
    parsed_data = await self._data_from_reader(reader)
  File "/root/dotaservice/dotaservice/dotaservice.py", line 243, in _data_from_reader
    parsed_data.ParseFromString(data)
google.protobuf.message.DecodeError: Error parsing message
LUARDY	{"step":30,"dota_time":-88.933349609375}
(lua) looking for loadfile =	bots/live_config_auto
(py) lua_config =  {'step': 30, 'dota_time': -88.933349609375}
(py) lua config received= {'step': 30, 'dota_time': -88.933349609375}
(py) writing live config= {'calibration_dota_time': -89.23334503173828}
(lua) live_config =	{ ["calibration_dota_time"] = -89.233345031738,} 
Script function 'Think' on bot npc_dota_hero_nevermore took 361.868ms
DotaService::step()
(python) action= {'actionType': 'DOTA_UNIT_ORDER_MOVE_TO_POSITION', 'moveToLocation': {'location': {'x': -6400.0, 'y': -6400.00390625, 'z': 0.0}}, 'dota_time': -89.23334503173828}
Request was cancelled
Traceback (most recent call last):
  File "/root/.local/lib/python3.7/site-packages/grpclib/server.py", line 327, in request_handler
    await method.func(stream)
  File "/root/dotaservice/dotaservice/dotaservice.py", line 362, in step
    data = await self.dota_game.worldstate_queue.get()
  File "/usr/lib/python3.7/asyncio/queues.py", line 159, in get
    await getter
concurrent.futures._base.CancelledError

some basic questions

First, really thanks to your guys work, it makes developing dota2 ai bot much much easier.

so several basic questions:

  1. it seems dotaservice use a dota2 headless client, is it based on the official dota2 client(how to make?) and can it update with the official update?
  2. does the headless client support ai vs ai mode like the mode in the official client's lobby? I want to implement the self-play training using this mode
  3. does dotaservice has the api doc, or where can i find the api code?

Really thanks!

Create self-play

  • Determine how and where we want to separate Dire & Radiant data/logic. We could just create two instances of DotaService class (and add specifying teamID and associated port to listen on as class parameters) and create an array/tuple of tasks and make the loop run on it (https://github.com/TimZaman/dotaservice/blob/master/dotaservice/dotaservice.py#L508-L515). However, we could also make it internal to the DotaService class through better functionalization.

  • Separate Dire & Radiant example clients

Docker: pull access denied for dota

I am trying to get dotaservice running in docker containers, following the instructions in the docker README. I successfully built the dota image, but when I try to run the command to build the dotaservice image, I get the following error:

Step 1/9 : FROM dota:latest pull access denied for dota, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

I'm admittedly pretty bad with Docker, so this may be an obvious error that I'm missing, but any help getting past it would be much appreciated!

Capture end-of-game signal

When the game ends, the server ticks stop abruptly. There is no worldstate being sent out any more. That means we need to capture this end-game signal (through a simple timeout?) and then process how the game ended, and who won, probably through the logs. Here is a typcal entry:

01/17/2019 - 07:55:01: Script function 'Think' on bot npc_dota_hero_nevermore took 22.171ms
01/17/2019 - 07:55:02: [Server] Client tried to execute invalid order (20). Unit is dead.
01/17/2019 - 07:55:02: Building: npc_dota_badguys_fort destroyed at 182.889038.
01/17/2019 - 07:55:02: [SpawnGroup] SynchronouslySpawnGroup for group 'CL:  [18: dota | world_layer_dire_destruction | <none>]' took 1ms
01/17/2019 - 07:55:02: S:Gamerules: entering state 'DOTA_GAMERULES_STATE_POST_GAME'
01/17/2019 - 07:55:02: CDOTAUserMsg_PlayerMMR check: lobbyType=-1, GameEndReason=0
01/17/2019 - 07:55:02: CDOTAGCServerSystem::MatchSignOut gathering sign out stats. Duration in minutes = 3.048706
01/17/2019 - 07:55:02:    Player 0 Account 0 TotalGold = 1068.000000 TotalXP = 1433.000000 nGoldPerMinute = 350 nXPPerMinute = 470
01/17/2019 - 07:55:02:    Player 0 Account 0 TotalGold = 278.000000 TotalXP = 0.000000 nGoldPerMinute = 91 nXPPerMinute = 0
01/17/2019 - 07:55:02:    Player 0 Account 0 TotalGold = 278.000000 TotalXP = 0.000000 nGoldPerMinute = 91 nXPPerMinute = 0
01/17/2019 - 07:55:02:    Player 0 Account 0 TotalGold = 278.000000 TotalXP = 0.000000 nGoldPerMinute = 91 nXPPerMinute = 0
01/17/2019 - 07:55:02:    Player 0 Account 0 TotalGold = 278.000000 TotalXP = 0.000000 nGoldPerMinute = 91 nXPPerMinute = 0
01/17/2019 - 07:55:02:    Player 0 Account 0 TotalGold = 388.000000 TotalXP = 1200.000000 nGoldPerMinute = 127 nXPPerMinute = 393
01/17/2019 - 07:55:02:    Player 0 Account 0 TotalGold = 278.000000 TotalXP = 0.000000 nGoldPerMinute = 91 nXPPerMinute = 0
01/17/2019 - 07:55:02:    Player 0 Account 0 TotalGold = 278.000000 TotalXP = 0.000000 nGoldPerMinute = 91 nXPPerMinute = 0
01/17/2019 - 07:55:02:    Player 0 Account 0 TotalGold = 278.000000 TotalXP = 0.000000 nGoldPerMinute = 91 nXPPerMinute = 0
01/17/2019 - 07:55:02:    Player 0 Account 0 TotalGold = 278.000000 TotalXP = 0.000000 nGoldPerMinute = 91 nXPPerMinute = 0
01/17/2019 - 07:55:02: Match signout:  duration = 182 (182.922363) good guys win = 1
01/17/2019 - 07:55:02:   Match start date: Thu Jan 17 07:51:52 2019
01/17/2019 - 07:55:02:   Num players on teams:  Good: 5  Bad: 5
01/17/2019 - 07:55:02: Team 0 Player 0 m_unAccountID = 0  Items: 0, 0, 0, 0, 0, 0, 0, 0, 0
01/17/2019 - 07:55:02:   LastHit = 3  Deny = 0  ClaimedMiss = 11  ClaimedDeny = 0  Miss = 3
01/17/2019 - 07:55:02:   Level: 4 Gold: 1668  KDA: 2 / 0 / 0
01/17/2019 - 07:55:02:   Actual Player Damage: 290 Actual Building Damage: 0 Actual Healing: 0
01/17/2019 - 07:55:02:   Scaled Player Damage: 553 Scaled Building Damage: 0 Scaled Healing: 0
01/17/2019 - 07:55:02:   XP per min: 350  Gold per min: 470  Claimed Farm: 653  Support Gold 0
01/17/2019 - 07:55:02: Team 0 Player 1 m_unAccountID = 0  Items: 0, 0, 0, 0, 0, 0, 0, 0, 0
01/17/2019 - 07:55:02:   LastHit = 0  Deny = 0  ClaimedMiss = 0  ClaimedDeny = 0  Miss = 0
01/17/2019 - 07:55:02:   Level: 1 Gold: 878  KDA: 0 / 0 / 0
01/17/2019 - 07:55:02:   Actual Player Damage: 0 Actual Building Damage: 0 Actual Healing: 0
01/17/2019 - 07:55:02:   Scaled Player Damage: 0 Scaled Building Damage: 0 Scaled Healing: 0
01/17/2019 - 07:55:02:   XP per min: 91  Gold per min: 0  Claimed Farm: 0  Support Gold 0
01/17/2019 - 07:55:02: Team 0 Player 2 m_unAccountID = 0  Items: 0, 0, 0, 0, 0, 0, 0, 0, 0
01/17/2019 - 07:55:02:   LastHit = 0  Deny = 0  ClaimedMiss = 0  ClaimedDeny = 0  Miss = 0
01/17/2019 - 07:55:02:   Level: 1 Gold: 878  KDA: 0 / 0 / 0
01/17/2019 - 07:55:02:   Actual Player Damage: 0 Actual Building Damage: 0 Actual Healing: 0
01/17/2019 - 07:55:02:   Scaled Player Damage: 0 Scaled Building Damage: 0 Scaled Healing: 0
01/17/2019 - 07:55:02:   XP per min: 91  Gold per min: 0  Claimed Farm: 0  Support Gold 0
01/17/2019 - 07:55:02: Team 0 Player 3 m_unAccountID = 0  Items: 0, 0, 0, 0, 0, 0, 0, 0, 0
01/17/2019 - 07:55:02:   LastHit = 0  Deny = 0  ClaimedMiss = 0  ClaimedDeny = 0  Miss = 0
01/17/2019 - 07:55:02:   Level: 1 Gold: 878  KDA: 0 / 0 / 0
01/17/2019 - 07:55:02:   Actual Player Damage: 0 Actual Building Damage: 0 Actual Healing: 0
01/17/2019 - 07:55:02:   Scaled Player Damage: 0 Scaled Building Damage: 0 Scaled Healing: 0
01/17/2019 - 07:55:02:   XP per min: 91  Gold per min: 0  Claimed Farm: 0  Support Gold 0
01/17/2019 - 07:55:02: Team 0 Player 4 m_unAccountID = 0  Items: 0, 0, 0, 0, 0, 0, 0, 0, 0
01/17/2019 - 07:55:02:   LastHit = 0  Deny = 0  ClaimedMiss = 0  ClaimedDeny = 0  Miss = 0
01/17/2019 - 07:55:02:   Level: 1 Gold: 878  KDA: 0 / 0 / 0
01/17/2019 - 07:55:02:   Actual Player Damage: 0 Actual Building Damage: 0 Actual Healing: 0
01/17/2019 - 07:55:02:   Scaled Player Damage: 0 Scaled Building Damage: 0 Scaled Healing: 0
01/17/2019 - 07:55:02:   XP per min: 91  Gold per min: 0  Claimed Farm: 0  Support Gold 0
01/17/2019 - 07:55:02: Team 1 Player 0 m_unAccountID = 0  Items: 0, 0, 0, 0, 0, 0, 0, 0, 0
01/17/2019 - 07:55:02:   LastHit = 3  Deny = 0  ClaimedMiss = 8  ClaimedDeny = 0  Miss = 7
01/17/2019 - 07:55:02:   Level: 4 Gold: 841  KDA: 0 / 2 / 0
01/17/2019 - 07:55:02:   Actual Player Damage: 294 Actual Building Damage: 0 Actual Healing: 0
01/17/2019 - 07:55:02:   Scaled Player Damage: 577 Scaled Building Damage: 0 Scaled Healing: 0
01/17/2019 - 07:55:02:   XP per min: 127  Gold per min: 393  Claimed Farm: 759  Support Gold 0
01/17/2019 - 07:55:02: Team 1 Player 1 m_unAccountID = 0  Items: 0, 0, 0, 0, 0, 0, 0, 0, 0
01/17/2019 - 07:55:02:   LastHit = 0  Deny = 0  ClaimedMiss = 0  ClaimedDeny = 0  Miss = 0
01/17/2019 - 07:55:02:   Level: 1 Gold: 878  KDA: 0 / 0 / 0
01/17/2019 - 07:55:02:   Actual Player Damage: 0 Actual Building Damage: 0 Actual Healing: 0
01/17/2019 - 07:55:02:   Scaled Player Damage: 0 Scaled Building Damage: 0 Scaled Healing: 0
01/17/2019 - 07:55:02:   XP per min: 91  Gold per min: 0  Claimed Farm: 0  Support Gold 0
01/17/2019 - 07:55:02: Team 1 Player 2 m_unAccountID = 0  Items: 0, 0, 0, 0, 0, 0, 0, 0, 0
01/17/2019 - 07:55:02:   LastHit = 0  Deny = 0  ClaimedMiss = 0  ClaimedDeny = 0  Miss = 0
01/17/2019 - 07:55:02:   Level: 1 Gold: 878  KDA: 0 / 0 / 0
01/17/2019 - 07:55:02:   Actual Player Damage: 0 Actual Building Damage: 0 Actual Healing: 0
01/17/2019 - 07:55:02:   Scaled Player Damage: 0 Scaled Building Damage: 0 Scaled Healing: 0
01/17/2019 - 07:55:02:   XP per min: 91  Gold per min: 0  Claimed Farm: 0  Support Gold 0
01/17/2019 - 07:55:02: Team 1 Player 3 m_unAccountID = 0  Items: 0, 0, 0, 0, 0, 0, 0, 0, 0
01/17/2019 - 07:55:02:   LastHit = 0  Deny = 0  ClaimedMiss = 0  ClaimedDeny = 0  Miss = 0
01/17/2019 - 07:55:02:   Level: 1 Gold: 878  KDA: 0 / 0 / 0
01/17/2019 - 07:55:02:   Actual Player Damage: 0 Actual Building Damage: 0 Actual Healing: 0
01/17/2019 - 07:55:02:   Scaled Player Damage: 0 Scaled Building Damage: 0 Scaled Healing: 0
01/17/2019 - 07:55:02:   XP per min: 91  Gold per min: 0  Claimed Farm: 0  Support Gold 0
01/17/2019 - 07:55:02: Team 1 Player 4 m_unAccountID = 0  Items: 0, 0, 0, 0, 0, 0, 0, 0, 0
01/17/2019 - 07:55:02:   LastHit = 0  Deny = 0  ClaimedMiss = 0  ClaimedDeny = 0  Miss = 0
01/17/2019 - 07:55:02:   Level: 1 Gold: 878  KDA: 0 / 0 / 0
01/17/2019 - 07:55:02:   Actual Player Damage: 0 Actual Building Damage: 0 Actual Healing: 0
01/17/2019 - 07:55:02:   Scaled Player Damage: 0 Scaled Building Damage: 0 Scaled Healing: 0
01/17/2019 - 07:55:02:   XP per min: 91  Gold per min: 0  Claimed Farm: 0  Support Gold 0
01/17/2019 - 07:55:02: KILLEATER: Signing out with 0 adjustments
01/17/2019 - 07:55:02: KILLEATER: Message has 0 player blocks
01/17/2019 - 07:55:02: Not submitting stats. Both teams must have human players.
01/17/2019 - 07:55:02: match_id: 0
01/17/2019 - 07:55:02: region_id: 4294967295
01/17/2019 - 07:55:02: players {
01/17/2019 - 07:55:02:   account_id: 107576
01/17/2019 - 07:55:02:   ip: 2130706433
01/17/2019 - 07:55:02:   avg_ping_ms: 0
01/17/2019 - 07:55:02:   packet_loss: 0
01/17/2019 - 07:55:02:   ping_deviation: 0.28598091
01/17/2019 - 07:55:02:   full_resends: 0
01/17/2019 - 07:55:02: }
01/17/2019 - 07:55:02: cluster_id: 0
01/17/2019 - 07:55:02: 
COMBAT SUMMARY
01/17/2019 - 07:55:02: --- Shadow Fiend ---
01/17/2019 - 07:55:02:   Total Damage Done: 0
01/17/2019 - 07:55:02:     - ability damage -
01/17/2019 - 07:55:02:     other damage done: 0
01/17/2019 - 07:55:02: --- Sniper ---
01/17/2019 - 07:55:02:   Total Damage Done: 0
01/17/2019 - 07:55:02:     - ability damage -
01/17/2019 - 07:55:02:     other damage done: 0
01/17/2019 - 07:55:02: --- Sniper ---
01/17/2019 - 07:55:02:   Total Damage Done: 0
01/17/2019 - 07:55:02:     - ability damage -
01/17/2019 - 07:55:02:     other damage done: 0
01/17/2019 - 07:55:02: --- Sniper ---
01/17/2019 - 07:55:02:   Total Damage Done: 0
01/17/2019 - 07:55:02:     - ability damage -
01/17/2019 - 07:55:02:     other damage done: 0
01/17/2019 - 07:55:02: --- Sniper ---
01/17/2019 - 07:55:02:   Total Damage Done: 0
01/17/2019 - 07:55:02:     - ability damage -
01/17/2019 - 07:55:02:     other damage done: 0
01/17/2019 - 07:55:02: --- Shadow Fiend ---
01/17/2019 - 07:55:02:   Total Damage Done: 0
01/17/2019 - 07:55:02:     - ability damage -
01/17/2019 - 07:55:02:     other damage done: 0
01/17/2019 - 07:55:02: --- Sniper ---
01/17/2019 - 07:55:02:   Total Damage Done: 0
01/17/2019 - 07:55:02:     - ability damage -
01/17/2019 - 07:55:02:     other damage done: 0
01/17/2019 - 07:55:02: --- Sniper ---
01/17/2019 - 07:55:02:   Total Damage Done: 0
01/17/2019 - 07:55:02:     - ability damage -
01/17/2019 - 07:55:02:     other damage done: 0
01/17/2019 - 07:55:02: --- Sniper ---
01/17/2019 - 07:55:02:   Total Damage Done: 0
01/17/2019 - 07:55:02:     - ability damage -
01/17/2019 - 07:55:02:     other damage done: 0
01/17/2019 - 07:55:02: --- Sniper ---
01/17/2019 - 07:55:02:   Total Damage Done: 0
01/17/2019 - 07:55:02:     - ability damage -
01/17/2019 - 07:55:02:     other damage done: 0
01/17/2019 - 07:55:02: 
01/17/2019 - 07:55:02: C:Gamerules: entering state 'DOTA_GAMERULES_STATE_POST_GAME'
01/17/2019 - 07:55:02: [Client] CDOTA_Hud_Main::EventGameRulesStateChanged DOTA_GAMERULES_STATE_POST_GAME
01/17/2019 - 07:55:02: [Client] CDOTA_Hud_Main::CreateGameEndScreen Creating GameEnd
01/17/2019 - 07:55:05: [HostStateManager] CHostStateMgr::QueueNewRequest( Quitting, 3 )
01/17/2019 - 07:55:05: [Client] CL:  Disconnecting from server: NETWORK_DISCONNECT_EXITING
01/17/2019 - 07:55:05: [NetSteamConn] Closing Steam Net Connection on socket 'client' to loopback:1, handle 10000 (1059 NETWORK_DISCONNECT_EXITING)
01/17/2019 - 07:55:05: [NetSteamConn] Disassociating NetChan       client                      [-1] (unknown) from Steam Net Connection handle 10000
01/17/2019 - 07:55:05: [NetSteamConn] Removing Steam Net Connection for loopback:1, handle 10000
01/17/2019 - 07:55:05: [HLTV Server] SourceTV shutting down
01/17/2019 - 07:55:05: [HLTV Server] CHLTVServer::Shutdown
01/17/2019 - 07:55:05: [HLTV Server] Completed SourceTV demo "replays/auto-20190117-0751-start-dotaservice.dem", recording time 289.9
01/17/2019 - 07:55:05: [Server] CNetworkGameServerBase::SetServerState (ss_active -> ss_dead)
01/17/2019 - 07:55:05: [stringtables] CNetworkStringTableContainer::RemoveAllTables:  removing 20 tables
01/17/2019 - 07:55:05: [Server] SV:  Server shutting down: 59
01/17/2019 - 07:55:05: [Server] CNetworkGameServerBase::SetServerState (ss_active -> ss_dead)
01/17/2019 - 07:55:05: [Server] SV:  Disconnect client 'Tim' from server(1): NETWORK_DISCONNECT_SHUTDOWN
01/17/2019 - 07:55:05: [NetSteamConn] Closing Steam Net Connection on socket 'server' to loopback:0, handle 20001 (1001 NETWORK_DISCONNECT_SHUTDOWN)
01/17/2019 - 07:55:05: [NetSteamConn] Disassociating NetChan          Tim                      [-1] (unknown) from Steam Net Connection handle 20001
01/17/2019 - 07:55:05: [NetSteamConn] Removing Steam Net Connection for loopback:0, handle 20001
01/17/2019 - 07:55:05: [Server] SV:  AsyncUnloadSpawnGroup( 18 ) -- no such group
01/17/2019 - 07:55:05: [Server] SV:  AsyncUnloadSpawnGroup( 16 ) -- no such group
01/17/2019 - 07:55:05: [Client] CL:  IGameSystem::LoopDeactivateAllSystems
01/17/2019 - 07:55:05: WriteSteamRemoteStorageFileAsync( "scripts/control_groups.txt" ) -> at 216.329
01/17/2019 - 07:55:05: [stringtables] CNetworkStringTableContainer::RemoveAllTables:  removing 20 tables
01/17/2019 - 07:55:05: [Server] SV:  IGameSystem::LoopDeactivateAllSystems
01/17/2019 - 07:55:05: [Host] HO:  IGameSystem::LoopDeactivateAllSystems
01/17/2019 - 07:55:05: [stringtables] CNetworkStringTableContainer::RemoveAllTables:  removing 20 tables
01/17/2019 - 07:55:06: **** Unable to localize '#GameUI_Language_Latam_Spanish' on panel 'latam'
01/17/2019 - 07:55:06: **** Unable to localize '#GameUI_Language_Vietnamese' on panel 'vietnamese'
01/17/2019 - 07:55:06: **** Unable to localize '#GameUI_Language_Latam_Spanish' on panel 'latam'
01/17/2019 - 07:55:06: **** Unable to localize '#GameUI_Language_Vietnamese' on panel 'vietnamese'
01/17/2019 - 07:55:06: [Client] CL:  CGameRulesGameSystem::GameShutdown uninstalled game rules
01/17/2019 - 07:55:06: [Client] CL:  CGameRules::CGameRules destructed
01/17/2019 - 07:55:06: WriteSteamRemoteStorageFileAsync( "voice_ban.dt" ) -> at 216.823
01/17/2019 - 07:55:06: [Server] SV:  CGameRulesGameSystem::GameShutdown uninstalled game rules
01/17/2019 - 07:55:06: [Server] SV:  CGameRules::CGameRules destructed
01/17/2019 - 07:55:06: [HostStateManager] Quitting

what the usage of actionDelay?

I'm curious about what type of action need some delay before executing this action?

for _, action in pairs(data.actions) do
if action.player == player_id then
if action.actionDelay == nil then
-- Make sure this defaults to 0 if not present
action.actionDelay = curr_step
else
action.actionDelay = curr_step + action.actionDelay
end
table.insert(actions, action)

Multiple Agents

Since we are moving to multi-agent design I wanted to raise the question of how many agents do we actually want.

At start there are two possibilities:

  1. One Agent Per Hero (5 agents per Team)
  2. One Master Agent that controls 5 heroes

*3) One Agent Per Hero and Per Controllable Unit (meaning summons (Nerconomicon, Warlock Ultimate, Beastmaster Hawk & Boar, etc.), illusions (Manta, Illusion Rune, Wall of Replica, Disruption, etc.), clones (Meepo), doubles (Arc Warden Ultimate) or dominated (i.e., Helm of Dominator, Enchantress, Chen, etc.) units) - typically these are controlled by the same agent that is controlling the owning Hero that caused the summon/domination to occur, but doesn't have to be.

Each approach has its pros and cons in terms of flexibility (co-play with humans, etc.), agent action synchronization (via shared world state model versus independent world models), training time, and so forth. OpenAI went with #1 above, but we do not necessarily have to, although I think I would prefer #1 above as well.

Next, there are a few other things that could be their own agents:
a) Courier - there is one courier per team - it can be controlled by any Hero Agent and even in real games it often gets abused by numerous players at once. We could make it its own agent.
b) Glyph Usage - anyone on the team can use the Glyph (when available)
c) Minimap Scan - anyone on the team can use the Minimap Scan function

*d) One Team Agent to control a), b) and c) as a single entity

Just wanted to throw this out there to think about and post your thoughts.

AI vs Human/Buildin-AI play mode

Hi,
I'm trying to figure out how to hold a AI vs human game. after training, it maybe need to play with human to do the evaluation.
when I start from steam, it works fine. but because our AI rely on the world state info, so I think the launch option is necessary,

'-botworldstatetosocket_radiant {}'.format(self.PORT_WORLDSTATES[TEAM_RADIANT]),
'-botworldstatetosocket_dire {}'.format(self.PORT_WORLDSTATES[TEAM_DIRE]),

but when I launch the game with the HOST_MODE_GUI_MENU mode, I got the crash in the dota2 client after entering the hero picking phase.

besides, I also want to test the AI with the buildin-AI first and then self-play, but how to use the buildin-AI? when I create the buildin-AI in HOST_MODE_GUI_MENU mode, I also got the crash in dota2 client.

does anyone knows the solution? Thanks~

ValueError: hero 0 not found in state

During a random training on K8s i saw. It reports a pre-game game state without any units. Obviously that's not a controllable situation, as there is nothing to control or act upon. So we should only push worldstates that have controllable entities.

Both reports below were seen in dockerized instances on k8s.

Traceback (most recent call last):
  File "client.py", line 401, in <module>
    asyncio.run(main())
  File "/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 573, in run_until_complete
    return future.result()
  File "client.py", line 365, in main
    actor_output = await asyncio.gather(*[a() for a in actors])
  File "client.py", line 297, in __call__
    action = select_action(obs, step=step)
  File "client.py", line 150, in select_action
    unit = get_hero_unit(world_state)
  File "client.py", line 209, in get_hero_unit
    raise ValueError("hero {} not found in state:\n{}".format(id, state))
ValueError: hero 0 not found in state:
team_id: 2
game_time: 73.89921569824219
dota_time: -87.30003356933594
game_state: 4
hero_pick_state: 1
time_of_day: 0.0
glyph_cooldown: 341.1992492675781
glyph_cooldown_enemy: 341
players {
  player_id: 0
  team_id: 2
}
players {
  player_id: 1
  team_id: 2
}
players {
  player_id: 2
  team_id: 2
}
players {
  player_id: 3
  team_id: 2
}
players {
  player_id: 4
  team_id: 2
}
players {
  player_id: 5
  team_id: 3
}
players {
  player_id: 6
  team_id: 3
}
players {
  player_id: 7
  team_id: 3
}
players {
  player_id: 8
  team_id: 3
}
players {
  player_id: 9
  team_id: 3
}

and another one i dug up:

ValueError: hero 0 not found in state:
team_id: 2
game_time: 74.89920043945312
dota_time: -88.4000244140625
game_state: 4
hero_pick_state: 1
time_of_day: 0.0
glyph_cooldown: 343.2992248535156
glyph_cooldown_enemy: 343
players {
  player_id: 0
  team_id: 2
}
players {
  player_id: 1
  team_id: 2
}
players {
  player_id: 2
  team_id: 2
}
players {
  player_id: 3
  team_id: 2
}
players {
  player_id: 4
  team_id: 2
}
players {
  player_id: 5
  team_id: 3
}
players {
  player_id: 6
  team_id: 3
}
players {
  player_id: 7
  team_id: 3
}
players {
  player_id: 8
  team_id: 3
}
players {
  player_id: 9
  team_id: 3
}

how to remove the fog of war?

I use 'HOST_MODE_GUI' to launch dota, everything goes fine except I can't see the hero, it seems the fog of war cover the map.
I have tried add launch option '-render True' or '-allvision', but not work...

Client PIP Requirements

Can you add to the requirements.txt or add a requirements.pip specifying all other pip packages being used by the client.py and other pieces?

Your recent check in added google.cloud for example but seems I don't have the right pip package installed.

Downloading https://files.pythonhosted.org/packages/ba/b1/7c54d1950e7808df06642274e677dbcedba57f75307adf2e5ad8d39e5e0e/google_cloud-0.34.0-py2.py3-none-any.whl
Installing collected packages: google.cloud
Successfully installed google.cloud

Andrzejs-MacBook-Pro:dotaservice andrzej.gorski$ python3.7 examples/client.py
Traceback (most recent call last):
File "examples/client.py", line 10, in
from google.cloud import storage
ModuleNotFoundError: No module named 'google.cloud'

Turns out the actual pip is google-cloud-storage, a requirements.pip would have made that easier.

Other pip packages currently not mentioned include: tensorboardX, torch

I can do this but not sure if you care about specific versions or not

the head length of world state message is not correct

I notice a weird thing, sometimes the head length of world state message is not equal to 4, and this trig the recv thread exit

data = await reader.read(cls.WORLDSTATE_PAYLOAD_BYTES)
if len(data) != cls.WORLDSTATE_PAYLOAD_BYTES:
# raise ValueError('Invalid worldstate payload')
return None

this problems become frequent when I increase host_timescale, and I try to skip this error, but it seems no hope for finding the correct message position again..

botcpp_dire.so and stuck at the map loading screen

I notice the error log after launching the game
screenshot from 2019-01-08 03-55-47

it seems needs to compile both botcpp_radiant.so and botcpp_dire.so, I use the same command except the -o option parameter to compile both libraries.

g++ -shared -o botcpp_radiant.so -fPIC botcpp_radiant.cpp dota_gcmessages_common_bot_script.pb.cc -std=c++11 -lprotobuf

I also modified the code to copy .so to bots folder

# shutil.copy('/Users/tzaman/dev/dotaservice/botcpp/botcpp_radiant.so', bot_path)

but this throws many errors and terminate the game
screenshot from 2019-01-08 01-44-31

I also test the dotaservice without copy libraries and only copy radiant libraries, although not come to above error, the game all stuck at the map loading screen(in gui mode) and my client can not receive any normal observation.

from grpclib.client import Channel
from dotaservice.protos.DotaService_grpc import DotaServiceStub
from dotaservice.protos.DotaService_pb2 import GameConfig
from dotaservice.protos.DotaService_pb2 import Actions
from dotaservice.protos.DotaService_pb2 import ObserveConfig, Status
from dotaservice.protos.DotaService_pb2 import TEAM_RADIANT, TEAM_DIRE
import asyncio
from dotaservice.protos.dota_gcmessages_common_bot_script_pb2 import CMsgBotWorldState
from dotaservice.protos.dota_shared_enums_pb2 import DOTA_GAMEMODE_1V1MID

import time

async def game_init():
    await env.reset(GameConfig(ticks_per_observation=3, host_mode=1, game_mode=DOTA_GAMEMODE_1V1MID))
    print("init finish")
    for i in range(1000):
        response = await env.observe(ObserveConfig(team_id=TEAM_RADIANT))
        if response.status != Status.Value('OK'):
            print("response status %s"%str(response.status))
        obs = response.world_state
        dota_time = obs.dota_time
        print("cur time %s" %str(dota_time))
        time.sleep(1)

    print("finish")
    return

# Connect to the DotaService.
cur_loop = asyncio.get_event_loop()
env = DotaServiceStub(Channel('127.0.0.1', 13337, loop=cur_loop))

# Get the initial observation.
cur_loop.run_until_complete(game_init())

below is the dota console log save in bots folder

01/08/2019 - 04:43:27: WARNING: CDirWatcher not implemented
01/08/2019 - 04:43:27: ERROR: HangWatchdogInternal_BeginScope() - Hang watchdog not implemented for this platform!
01/08/2019 - 04:43:27: ERROR: HangWatchdogInternal_EndScope() - Hang watchdog not implemented for this platform!
01/08/2019 - 04:43:27: [Filesystem] ---------------
01/08/2019 - 04:43:27: [Filesystem] Path ID:             File Path:
01/08/2019 - 04:43:27: [Filesystem] ADDONS               "/root/Steam/steamapps/common/dota 2 beta/game/dota_addons/" 
01/08/2019 - 04:43:27: [Filesystem] CONTENT              "/root/Steam/steamapps/common/dota 2 beta/content/dota/" 
01/08/2019 - 04:43:27: [Filesystem] CONTENT              "/root/Steam/steamapps/common/dota 2 beta/content/core/" 
01/08/2019 - 04:43:27: [Filesystem] CONTENTADDONS        "/root/Steam/steamapps/common/dota 2 beta/content/dota_addons/" 
01/08/2019 - 04:43:27: [Filesystem] CONTENTROOT          "/root/Steam/steamapps/common/dota 2 beta/content/" 
01/08/2019 - 04:43:27: [Filesystem] DEFAULT_WRITE_PATH   "/root/Steam/steamapps/common/dota 2 beta/game/dota/pak01.vpk" (vpk) /root/Steam/steamapps/common/dota 2 beta/game/dota/pak01.vpk
01/08/2019 - 04:43:27: [Filesystem] DEFAULT_WRITE_PATH   "/root/Steam/steamapps/common/dota 2 beta/game/dota/" 
01/08/2019 - 04:43:27: [Filesystem] EXECUTABLE_PATH      "/root/Steam/steamapps/common/dota 2 beta/game/bin/linuxsteamrt64/" 
01/08/2019 - 04:43:27: [Filesystem] GAME                 "/root/Steam/steamapps/common/dota 2 beta/game/dota/pak01.vpk" (vpk) /root/Steam/steamapps/common/dota 2 beta/game/dota/pak01.vpk
01/08/2019 - 04:43:27: [Filesystem] GAME                 "/root/Steam/steamapps/common/dota 2 beta/game/core/pak01.vpk" (vpk) /root/Steam/steamapps/common/dota 2 beta/game/core/pak01.vpk
01/08/2019 - 04:43:27: [Filesystem] GAME                 "/root/Steam/steamapps/common/dota 2 beta/game/dota/" 
01/08/2019 - 04:43:27: [Filesystem] GAME                 "/root/Steam/steamapps/common/dota 2 beta/game/core/" 
01/08/2019 - 04:43:27: [Filesystem] GAMEBIN              "/root/Steam/steamapps/common/dota 2 beta/game/dota/bin/linuxsteamrt64/" 
01/08/2019 - 04:43:27: [Filesystem] GAMEBIN              "/root/Steam/steamapps/common/dota 2 beta/game/dota/bin/" 
01/08/2019 - 04:43:27: [Filesystem] GAMEBIN              "/root/Steam/steamapps/common/dota 2 beta/game/core/bin/linuxsteamrt64/" 
01/08/2019 - 04:43:27: [Filesystem] GAMEBIN              "/root/Steam/steamapps/common/dota 2 beta/game/core/bin/" 
01/08/2019 - 04:43:27: [Filesystem] GAMEROOT             "/root/Steam/steamapps/common/dota 2 beta/game/" 
01/08/2019 - 04:43:27: [Filesystem] MOD                  "/root/Steam/steamapps/common/dota 2 beta/game/dota/pak01.vpk" (vpk) /root/Steam/steamapps/common/dota 2 beta/game/dota/pak01.vpk
01/08/2019 - 04:43:27: [Filesystem] MOD                  "/root/Steam/steamapps/common/dota 2 beta/game/dota/" 
01/08/2019 - 04:43:27: [Filesystem] PLATFORM             "/root/Steam/steamapps/common/dota 2 beta/game/core/pak01.vpk" (vpk) /root/Steam/steamapps/common/dota 2 beta/game/core/pak01.vpk
01/08/2019 - 04:43:27: [Filesystem] PLATFORM             "/root/Steam/steamapps/common/dota 2 beta/game/core/" 
01/08/2019 - 04:43:27: [Filesystem] SHADER_SOURCE        "/root/Steam/steamapps/common/dota 2 beta/src/shaders/dota/" 
01/08/2019 - 04:43:27: [Filesystem] SHADER_SOURCE        "/root/Steam/steamapps/common/dota 2 beta/src/shaders/core/" 
01/08/2019 - 04:43:27: [Filesystem] SHADER_SOURCE        "/root/Steam/steamapps/common/dota 2 beta/src/shaders/dota_addons/" 
01/08/2019 - 04:43:27: [Filesystem] SHADER_SOURCE        "/root/Steam/steamapps/common/dota 2 beta/src/shaders/dota_core/" 
01/08/2019 - 04:43:27: [Filesystem] SHADER_SOURCE_MOD    "/root/Steam/steamapps/common/dota 2 beta/src/shaders/dota/" 
01/08/2019 - 04:43:27: [Filesystem] SHADER_SOURCE_ROOT   "/root/Steam/steamapps/common/dota 2 beta/src/shaders/" 
01/08/2019 - 04:43:27: [CommandLine] command line arguments:
01/08/2019 - 04:43:27: [CommandLine] -botworldstatetosocket_frames 30 -botworldstatetosocket_radiant 12120 -botworldstatetosocket_dire 12121 -con_logfile scripts/vscripts/bots/console.log -con_timestamp -console -insecure -sw -noip -nowatchdog +clientport 27006 +dota_1v1_skip_strategy 1 +dota_surrender_on_disconnect 0 +host_timescale 1 +hostname dotaservice +sv_cheats 1 +sv_hibernate_when_empty 0 +tv_delay 0 +tv_enable 1 +tv_title d98ef9c6-1329-11e9-ab64-2c4d54ecfe97 +tv_autorecord 1 +tv_transmitall 1 -dedicated -fill_with_bots +map start gamemode 11 +sv_lan 1
01/08/2019 - 04:43:27: [Networking] Network System Initialized
01/08/2019 - 04:43:27: [Networking] 10.23.112.15: enp2s0 
01/08/2019 - 04:43:27: [Networking] 127.0.0.1: lo 
01/08/2019 - 04:43:27: Physics Console Communications is not initialized
01/08/2019 - 04:43:27: [SplitScreen] Game supporting (4) split screen players
01/08/2019 - 04:43:28:  failed to dlopen libtensorflow.so error=libtensorflow.so: cannot open shared object file: No such file or directory
01/08/2019 - 04:43:28: [Networking] CEntitySystem::BuildEntityNetworking (parallel build of server) took 250.865 msecs for 859 out of 877 classes
01/08/2019 - 04:43:29: Failed to load mutations file! scripts/battlepass/ti2018/mutations.txt
01/08/2019 - 04:43:29: [ResourceSystem] Error loading resource file "soundevents/soundevents_test.vsndevts_c" (Error: ERROR_FILEOPEN)
01/08/2019 - 04:43:29: Attempted to set unknown configuration value <unknown>!
01/08/2019 - 04:43:29: name[ 0 ] changing from 'unnamed' to 'xsj.guagua'
01/08/2019 - 04:43:29: Error in user configuration file
01/08/2019 - 04:43:29: name[ 0 ] changing from 'xsj.guagua' to 'xsj.guagua'
01/08/2019 - 04:43:29: [HostStateManager] CHostStateMgr::QueueNewRequest( Idle (console), 1 )
01/08/2019 - 04:43:29: [EngineServiceManager] SwitchToLoop console requested:  id [1] addons []
01/08/2019 - 04:43:29: [HostStateManager] Idle (console)
01/08/2019 - 04:43:29: [HostStateManager] CHostStateMgr::QueueNewRequest( Loading (start), 2 )
01/08/2019 - 04:43:29: [EngineServiceManager] SwitchToLoop levelload requested:  id [2] addons []
01/08/2019 - 04:43:30: [Server] SV:  Level loading started for 'start'
01/08/2019 - 04:43:30: [Steam] Running SteamAPI_RunCallbacks for first time
01/08/2019 - 04:43:30: [Client] CL:  CLoopModeLevelLoad::MaybeSwitchToGameLoop switching to "game" loopmode with addons ()
01/08/2019 - 04:43:30: [EngineServiceManager] SwitchToLoop game requested:  id [2] addons []
01/08/2019 - 04:43:30: [Server] CNetworkGameServerBase::SetServerState (ss_dead -> ss_waitingforgamesessionmanifest)
01/08/2019 - 04:43:30: [Server] SV:  maxplayers set to 64
01/08/2019 - 04:43:30: [Networking] TCP/UDP Disabled.
01/08/2019 - 04:43:30: [Networking] Network socket 'server' opened on port 27015
01/08/2019 - 04:43:30: Initializing script VM...
01/08/2019 - 04:43:30: ...done
01/08/2019 - 04:43:30: [Server] SV:  Executing dedicated server config file
01/08/2019 - 04:43:30: S:Gamerules: entering state 'DOTA_GAMERULES_STATE_INIT'
01/08/2019 - 04:43:30: [Server] SV:  CGameRulesGameSystem::GameInit installed game rules
01/08/2019 - 04:43:30: Radiant bot scripting using script path /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots
01/08/2019 - 04:43:30: LoadScript: /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots/hero_selection.lua, scope name HeroSelectionScriptScope
01/08/2019 - 04:43:30: [VScript] Decode sucessful:	table: 0x002330b0
01/08/2019 - 04:43:30: LoadScript: /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots/team_desires.lua, scope name TeamDesiresScriptScope
01/08/2019 - 04:43:30: LoadScript: /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots/team_desires.lua not found!
01/08/2019 - 04:43:30: About to load botcpp from /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots/botcpp_radiant.so
01/08/2019 - 04:43:30: Could not open botcpp: /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots/botcpp_radiant.so: cannot open shared object file: No such file or directory
01/08/2019 - 04:43:30: Dire bot scripting using script path /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots
01/08/2019 - 04:43:30: LoadScript: /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots/hero_selection.lua, scope name HeroSelectionScriptScope
01/08/2019 - 04:43:30: [VScript] Decode sucessful:	table: 0x003330b0
01/08/2019 - 04:43:30: LoadScript: /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots/team_desires.lua, scope name TeamDesiresScriptScope
01/08/2019 - 04:43:30: LoadScript: /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots/team_desires.lua not found!
01/08/2019 - 04:43:30: About to load botcpp from /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots/botcpp_dire.so
01/08/2019 - 04:43:30: Could not open botcpp: /root/Steam/steamapps/common/dota 2 beta/game/dota/scripts/vscripts/bots/botcpp_dire.so: cannot open shared object file: No such file or directory
01/08/2019 - 04:43:30: [Server] SV:  Spawn Server: start
01/08/2019 - 04:43:30: [Server] CNetworkGameServerBase::SetServerState (ss_waitingforgamesessionmanifest -> ss_loading)
01/08/2019 - 04:43:30: [Server] CNetworkGameServerBase::SetServerState (ss_dead -> ss_waitingforgamesessionmanifest)
01/08/2019 - 04:43:30: [Server] SV:  maxplayers set to 64
01/08/2019 - 04:43:30: [Networking] TCP/UDP Disabled.
01/08/2019 - 04:43:30: [Networking] Network socket 'hltv' opened on port 27020
01/08/2019 - 04:43:30: [HLTV Server] Starting SourceTV server listening on port 27020.
01/08/2019 - 04:43:30: [Server] CNetworkGameServerBase::SetServerState (ss_loading -> ss_active)
01/08/2019 - 04:43:30: [Server] SV:  IGameSystem::LoopActivateAllSystems
01/08/2019 - 04:43:30: [Host] HO:  IGameSystem::LoopActivateAllSystems
01/08/2019 - 04:43:30: Height map file (maps/start.vhcg) not found, this will make ground height traces more expensive! Recompile the map to generate a height map.
01/08/2019 - 04:43:30: [Server] SV:  64 player server started
01/08/2019 - 04:43:30: [Server] SV:  WriteInitialSpawnGroups sending 1 groups
01/08/2019 - 04:43:30: [HLTV Server] Recording SourceTV replay to replays/auto-20190108-0443-start-dotaservice.dem...
01/08/2019 - 04:43:30: [HLTV Server] playdemo replays/auto-20190108-0443-start-dotaservice.dem
01/08/2019 - 04:43:30: [HostStateManager] Loading (start)
01/08/2019 - 04:43:30: S:Gamerules: entering state 'DOTA_GAMERULES_STATE_CUSTOM_GAME_SETUP'
01/08/2019 - 04:43:30: S:Gamerules: entering state 'DOTA_GAMERULES_STATE_HERO_SELECTION'
01/08/2019 - 04:43:30: SV: Started streaming map dota spawngroup 2
01/08/2019 - 04:43:30: [Server] CDOTA_PlayerResource: Adding player SteamID 90071996842377217 to slot 0 FakeClient=1 preferred slot = -1
01/08/2019 - 04:43:30: [Server] PR:SetPlayerName 0:[I:0:0] "d98ef9c6_R0 (Bot)"
01/08/2019 - 04:43:30: [Server] CDOTA_PlayerResource: Adding player SteamID 90071996842377218 to slot 1 FakeClient=1 preferred slot = -1
01/08/2019 - 04:43:30: [Server] PR:SetPlayerName 1:[I:0:0] "d98ef9c6_R1 (Bot)"
01/08/2019 - 04:43:30: [Server] CDOTA_PlayerResource: Adding player SteamID 90071996842377219 to slot 2 FakeClient=1 preferred slot = -1
01/08/2019 - 04:43:30: [Server] PR:SetPlayerName 2:[I:0:0] "d98ef9c6_R2 (Bot)"
01/08/2019 - 04:43:30: [Server] CDOTA_PlayerResource: Adding player SteamID 90071996842377220 to slot 3 FakeClient=1 preferred slot = -1
01/08/2019 - 04:43:30: [Server] PR:SetPlayerName 3:[I:0:0] "d98ef9c6_R3 (Bot)"
01/08/2019 - 04:43:30: [Server] CDOTA_PlayerResource: Adding player SteamID 90071996842377221 to slot 4 FakeClient=1 preferred slot = -1
01/08/2019 - 04:43:30: [Server] PR:SetPlayerName 4:[I:0:0] "d98ef9c6_R4 (Bot)"
01/08/2019 - 04:43:30: [Server] CDOTA_PlayerResource: Adding player SteamID 90071996842377222 to slot 5 FakeClient=1 preferred slot = -1
01/08/2019 - 04:43:30: [Server] PR:SetPlayerName 5:[I:0:0] "d98ef9c6_D0 (Bot)"
01/08/2019 - 04:43:30: [Server] CDOTA_PlayerResource: Adding player SteamID 90071996842377223 to slot 6 FakeClient=1 preferred slot = -1
01/08/2019 - 04:43:30: [Server] PR:SetPlayerName 6:[I:0:0] "d98ef9c6_D1 (Bot)"
01/08/2019 - 04:43:30: [Server] CDOTA_PlayerResource: Adding player SteamID 90071996842377224 to slot 7 FakeClient=1 preferred slot = -1
01/08/2019 - 04:43:30: [Server] PR:SetPlayerName 7:[I:0:0] "d98ef9c6_D2 (Bot)"
01/08/2019 - 04:43:30: [Server] CDOTA_PlayerResource: Adding player SteamID 90071996842377225 to slot 8 FakeClient=1 preferred slot = -1
01/08/2019 - 04:43:30: [Server] PR:SetPlayerName 8:[I:0:0] "d98ef9c6_D3 (Bot)"
01/08/2019 - 04:43:30: [Server] CDOTA_PlayerResource: Adding player SteamID 90071996842377226 to slot 9 FakeClient=1 preferred slot = -1
01/08/2019 - 04:43:30: [Server] PR:SetPlayerName 9:[I:0:0] "d98ef9c6_D4 (Bot)"
01/08/2019 - 04:43:30: [Server] PR:SetSelectedHero 0:[I:0:0] npc_dota_hero_nevermore(11)
01/08/2019 - 04:43:30: [Server] PR:SetSelectedHero 1:[I:0:0] npc_dota_hero_sniper(35)
01/08/2019 - 04:43:30: [Server] PR:SetSelectedHero 2:[I:0:0] npc_dota_hero_sniper(35)
01/08/2019 - 04:43:30: [Server] PR:SetSelectedHero 3:[I:0:0] npc_dota_hero_sniper(35)
01/08/2019 - 04:43:30: [Server] PR:SetSelectedHero 4:[I:0:0] npc_dota_hero_sniper(35)
01/08/2019 - 04:43:30: [Server] PR:SetSelectedHero 5:[I:0:0] npc_dota_hero_nevermore(11)
01/08/2019 - 04:43:30: [Server] PR:SetSelectedHero 6:[I:0:0] npc_dota_hero_sniper(35)
01/08/2019 - 04:43:30: [Server] PR:SetSelectedHero 7:[I:0:0] npc_dota_hero_sniper(35)
01/08/2019 - 04:43:30: [Server] PR:SetSelectedHero 8:[I:0:0] npc_dota_hero_sniper(35)
01/08/2019 - 04:43:30: [Server] PR:SetSelectedHero 9:[I:0:0] npc_dota_hero_sniper(35)
01/08/2019 - 04:43:30: [HLTV Server] SourceTV broadcast active.
01/08/2019 - 04:43:30: S:Gamerules: entering state 'DOTA_GAMERULES_STATE_STRATEGY_TIME'
01/08/2019 - 04:43:30: [Server] Unable to load grid nav: file not found for world prefabs/promotional_radiant_fountain
01/08/2019 - 04:43:30: [Server] Unable to load grid nav: file not found for world prefabs/promotional_dire_fountain
01/08/2019 - 04:43:31: [Server] SV:  ServerSteamID=[A:1:3874839552:11736] (90122402158435328).
01/08/2019 - 04:43:31: [Server] SV:  CDOTAGCServerSystem - couldn't add listener because Steam wasn't ready
01/08/2019 - 04:43:31: [SteamNetSockets] Gameserver logged on to Steam, assigned SteamID [A:1:3874839552:11736]
01/08/2019 - 04:43:31: [Server] SV:  VAC secure mode disabled.
01/08/2019 - 04:43:32: [GCClient] Received server welcome from GC.
01/08/2019 - 04:43:32: [SOCache] CMsgClientWelcome subscribed: 0 up-to-date, 0 out-of-date
01/08/2019 - 04:43:32: Version out of date (GC wants 3312, we are 3311)!
01/08/2019 - 04:43:32: Version out of date (GC wants 3312, we are 3311)!
01/08/2019 - 04:44:00: S:Gamerules: entering state 'DOTA_GAMERULES_STATE_TEAM_SHOWCASE'
01/08/2019 - 04:44:12: S:Gamerules: entering state 'DOTA_GAMERULES_STATE_WAIT_FOR_MAP_TO_LOAD'
01/08/2019 - 04:44:13: S:Gamerules: entering state 'DOTA_GAMERULES_STATE_PRE_GAME'
01/08/2019 - 04:44:13: m_flPreGameStartTime set to 31.13
01/08/2019 - 04:44:13: m_flStateTransitionTime set to 121.13
01/08/2019 - 04:44:13: Height map file (maps/prefabs/promotional_radiant_fountain.vhcg) not found, this will make ground height traces more expensive! Recompile the map to generate a height map.
01/08/2019 - 04:44:13: Height map file (maps/prefabs/promotional_dire_fountain.vhcg) not found, this will make ground height traces more expensive! Recompile the map to generate a height map.
01/08/2019 - 04:44:15: [VScript] LUARDY	{"step":60,"dota_time":-87.933364868164}
01/08/2019 - 04:44:15: [VScript] (lua) looking for loadfile =	bots/live_config_auto
01/08/2019 - 04:44:25: [VScript] (lua) received live_config =	{ 
  calibration_dota_time = -88.233360290527 
}
01/08/2019 - 04:44:25: Script function 'Think' on bot npc_dota_hero_nevermore took 10097.265ms
01/08/2019 - 04:44:25: [VScript] LUARDY	{"step":60,"dota_time":-87.86669921875}
01/08/2019 - 04:44:25: [VScript] (lua) looking for loadfile =	bots/live_config_auto
01/08/2019 - 04:44:25: [VScript] (lua) received live_config =	{ 
  calibration_dota_time = -88.233360290527 
}

and I redirect dotaservice's log to local file, it looks like before enter the game the world state is received normally, but after enter the game it disappear and the observe function wait 10 seconds to raise a timeout error.

2019-01-08 05:53:07,031 INFO     DotaService 0.3.2 serving on :13337
2019-01-08 05:53:14,207 INFO     DotaService::reset()
2019-01-08 05:53:14,207 DEBUG    config=
ticks_per_observation: 30
host_mode: HOST_MODE_DEDICATED

2019-01-08 05:53:14,221 DEBUG    ::reset is awaiting lua config..
2019-01-08 05:53:18,036 DEBUG    demo_path_rel=replays/auto-20190108-0553-start-dotaservice.dem
2019-01-08 05:53:18,808 DEBUG    Received world_state: dotatime=-29.16666603088379, gamestate=3, team=2
2019-01-08 05:53:18,809 DEBUG    Received world_state: dotatime=-29.16666603088379, gamestate=3, team=3
2019-01-08 05:53:19,809 DEBUG    Received world_state: dotatime=-28.166667938232422, gamestate=3, team=2
2019-01-08 05:53:19,809 DEBUG    Received world_state: dotatime=-28.166667938232422, gamestate=3, team=3
2019-01-08 05:53:20,809 DEBUG    Received world_state: dotatime=-27.166667938232422, gamestate=3, team=2
2019-01-08 05:53:20,809 DEBUG    Received world_state: dotatime=-27.166667938232422, gamestate=3, team=3
2019-01-08 05:53:21,808 DEBUG    Received world_state: dotatime=-26.166669845581055, gamestate=3, team=2
2019-01-08 05:53:21,809 DEBUG    Received world_state: dotatime=-26.166669845581055, gamestate=3, team=3
2019-01-08 05:53:22,808 DEBUG    Received world_state: dotatime=-25.166669845581055, gamestate=3, team=2
2019-01-08 05:53:22,809 DEBUG    Received world_state: dotatime=-25.166669845581055, gamestate=3, team=3
2019-01-08 05:53:23,808 DEBUG    Received world_state: dotatime=-24.166671752929688, gamestate=3, team=2
2019-01-08 05:53:23,809 DEBUG    Received world_state: dotatime=-24.166671752929688, gamestate=3, team=3
2019-01-08 05:53:24,808 DEBUG    Received world_state: dotatime=-23.166671752929688, gamestate=3, team=2
2019-01-08 05:53:24,809 DEBUG    Received world_state: dotatime=-23.166671752929688, gamestate=3, team=3
2019-01-08 05:53:25,808 DEBUG    Received world_state: dotatime=-22.16666030883789, gamestate=3, team=2
2019-01-08 05:53:25,809 DEBUG    Received world_state: dotatime=-22.16666030883789, gamestate=3, team=3
2019-01-08 05:53:26,808 DEBUG    Received world_state: dotatime=-21.16664695739746, gamestate=3, team=2
2019-01-08 05:53:26,809 DEBUG    Received world_state: dotatime=-21.16664695739746, gamestate=3, team=3
2019-01-08 05:53:27,808 DEBUG    Received world_state: dotatime=-20.16663360595703, gamestate=3, team=2
2019-01-08 05:53:27,808 DEBUG    Received world_state: dotatime=-20.16663360595703, gamestate=3, team=3
2019-01-08 05:53:28,808 DEBUG    Received world_state: dotatime=-19.1666202545166, gamestate=3, team=2
2019-01-08 05:53:28,808 DEBUG    Received world_state: dotatime=-19.1666202545166, gamestate=3, team=3
2019-01-08 05:53:29,808 DEBUG    Received world_state: dotatime=-18.166606903076172, gamestate=3, team=2
2019-01-08 05:53:29,809 DEBUG    Received world_state: dotatime=-18.166606903076172, gamestate=3, team=3
2019-01-08 05:53:30,808 DEBUG    Received world_state: dotatime=-17.166593551635742, gamestate=3, team=2
2019-01-08 05:53:30,809 DEBUG    Received world_state: dotatime=-17.166593551635742, gamestate=3, team=3
2019-01-08 05:53:31,808 DEBUG    Received world_state: dotatime=-16.166580200195312, gamestate=3, team=2
2019-01-08 05:53:31,809 DEBUG    Received world_state: dotatime=-16.166580200195312, gamestate=3, team=3
2019-01-08 05:53:32,808 DEBUG    Received world_state: dotatime=-15.166566848754883, gamestate=3, team=2
2019-01-08 05:53:32,809 DEBUG    Received world_state: dotatime=-15.166566848754883, gamestate=3, team=3
2019-01-08 05:53:33,808 DEBUG    Received world_state: dotatime=-14.166580200195312, gamestate=3, team=2
2019-01-08 05:53:33,809 DEBUG    Received world_state: dotatime=-14.166580200195312, gamestate=3, team=3
2019-01-08 05:53:34,808 DEBUG    Received world_state: dotatime=-13.166595458984375, gamestate=3, team=2
2019-01-08 05:53:34,809 DEBUG    Received world_state: dotatime=-13.166595458984375, gamestate=3, team=3
2019-01-08 05:53:35,808 DEBUG    Received world_state: dotatime=-12.166610717773438, gamestate=3, team=2
2019-01-08 05:53:35,809 DEBUG    Received world_state: dotatime=-12.166610717773438, gamestate=3, team=3
2019-01-08 05:53:36,808 DEBUG    Received world_state: dotatime=-11.1666259765625, gamestate=3, team=2
2019-01-08 05:53:36,808 DEBUG    Received world_state: dotatime=-11.1666259765625, gamestate=3, team=3
2019-01-08 05:53:37,808 DEBUG    Received world_state: dotatime=-10.166641235351562, gamestate=3, team=2
2019-01-08 05:53:37,809 DEBUG    Received world_state: dotatime=-10.166641235351562, gamestate=3, team=3
2019-01-08 05:53:38,808 DEBUG    Received world_state: dotatime=-9.166656494140625, gamestate=3, team=2
2019-01-08 05:53:38,808 DEBUG    Received world_state: dotatime=-9.166656494140625, gamestate=3, team=3
2019-01-08 05:53:39,808 DEBUG    Received world_state: dotatime=-8.166671752929688, gamestate=3, team=2
2019-01-08 05:53:39,809 DEBUG    Received world_state: dotatime=-8.166671752929688, gamestate=3, team=3
2019-01-08 05:53:40,808 DEBUG    Received world_state: dotatime=-7.16668701171875, gamestate=3, team=2
2019-01-08 05:53:40,808 DEBUG    Received world_state: dotatime=-7.16668701171875, gamestate=3, team=3
2019-01-08 05:53:41,808 DEBUG    Received world_state: dotatime=-6.1667022705078125, gamestate=3, team=2
2019-01-08 05:53:41,809 DEBUG    Received world_state: dotatime=-6.1667022705078125, gamestate=3, team=3
2019-01-08 05:53:42,808 DEBUG    Received world_state: dotatime=-5.166717529296875, gamestate=3, team=2
2019-01-08 05:53:42,809 DEBUG    Received world_state: dotatime=-5.166717529296875, gamestate=3, team=3
2019-01-08 05:53:43,808 DEBUG    Received world_state: dotatime=-4.1667327880859375, gamestate=3, team=2
2019-01-08 05:53:43,808 DEBUG    Received world_state: dotatime=-4.1667327880859375, gamestate=3, team=3
2019-01-08 05:53:44,808 DEBUG    Received world_state: dotatime=-3.166748046875, gamestate=3, team=2
2019-01-08 05:53:44,808 DEBUG    Received world_state: dotatime=-3.166748046875, gamestate=3, team=3
2019-01-08 05:53:45,808 DEBUG    Received world_state: dotatime=-2.1667633056640625, gamestate=3, team=2
2019-01-08 05:53:45,808 DEBUG    Received world_state: dotatime=-2.1667633056640625, gamestate=3, team=3
2019-01-08 05:53:46,808 DEBUG    Received world_state: dotatime=-1.166778564453125, gamestate=3, team=2
2019-01-08 05:53:46,808 DEBUG    Received world_state: dotatime=-1.166778564453125, gamestate=3, team=3
2019-01-08 05:53:47,808 DEBUG    Received world_state: dotatime=-0.1667938232421875, gamestate=3, team=2
2019-01-08 05:53:47,808 DEBUG    Received world_state: dotatime=-0.1667938232421875, gamestate=3, team=3
2019-01-08 05:53:48,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:48,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:49,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:49,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:50,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:50,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:51,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:51,809 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:52,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:52,809 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:53,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:53,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:54,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:54,809 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:55,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:55,809 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:56,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:56,809 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:57,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:57,809 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:58,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:58,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:53:59,808 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=2
2019-01-08 05:53:59,809 DEBUG    Received world_state: dotatime=-12.10013198852539, gamestate=8, team=3
2019-01-08 05:54:00,990 DEBUG    Received world_state: dotatime=-89.23334503173828, gamestate=4, team=2
2019-01-08 05:54:00,993 DEBUG    Received world_state: dotatime=-89.23334503173828, gamestate=4, team=3
2019-01-08 05:54:01,989 DEBUG    Received world_state: dotatime=-88.23336029052734, gamestate=4, team=2
2019-01-08 05:54:01,992 DEBUG    Received world_state: dotatime=-88.23336029052734, gamestate=4, team=3
2019-01-08 05:54:02,273 DEBUG    lua_config={'step': 60, 'dota_time': -87.966697692871}
2019-01-08 05:54:02,273 DEBUG    ::reset: lua config received={'step': 60, 'dota_time': -87.966697692871}
2019-01-08 05:54:12,282 DEBUG    Writing live_config={'calibration_dota_time': -88.23336029052734}
2019-01-08 05:54:12,288 DEBUG    DotaService::observe()
2019-01-08 05:54:12,921 DEBUG    Received world_state: dotatime=-87.2333755493164, gamestate=4, team=2
2019-01-08 05:54:13,927 DEBUG    DotaService::observe()
2019-01-08 05:54:24,936 DEBUG    DotaService::observe()
2019-01-08 05:54:35,949 DEBUG    DotaService::observe()
2019-01-08 05:54:46,961 DEBUG    DotaService::observe()
2019-01-08 05:54:57,972 DEBUG    DotaService::observe()
2019-01-08 05:55:08,985 DEBUG    DotaService::observe()
2019-01-08 05:55:19,996 DEBUG    DotaService::observe()
2019-01-08 05:55:31,008 DEBUG    DotaService::observe()
2019-01-08 05:55:42,021 DEBUG    DotaService::observe()
2019-01-08 05:55:53,030 DEBUG    DotaService::observe()
2019-01-08 05:56:04,034 DEBUG    DotaService::observe()
2019-01-08 05:56:15,047 DEBUG    DotaService::observe()
2019-01-08 05:56:26,057 DEBUG    DotaService::observe()
2019-01-08 05:56:37,068 DEBUG    DotaService::observe()
2019-01-08 05:56:48,080 DEBUG    DotaService::observe()
2019-01-08 05:56:59,093 DEBUG    DotaService::observe()

any suggestions?

Ubuntu, can not reset environment with steam turning on.

Hi, thanks for your reading first.

Environment

Ubuntu 18.04.1.
The newest steam, Dota2 client and code up to date (10/12/2018).

Problem

  1. Turn on steam.
  2. Start server, python3 -m dotaservice
  3. Run test code. This just do the init jobs (import lib, define variables ...) and calling state = await asyncio.wait_for(env.reset(config))

When i do as 1 2 3 (whether with and without rendering), the server will blocked at

(py) worldstate @ dotatime=-89.23334503173828, gamestate=4

The last few logs are showing below:

(py) worldstate @ dotatime=-12.10013198852539, gamestate=8
Act::
Observe:: cout
Observe:: cerr
(py) worldstate @ dotatime=-12.10013198852539, gamestate=8
Act::
S:Gamerules: entering state 'DOTA_GAMERULES_STATE_WAIT_FOR_MAP_TO_LOAD'
S:Gamerules: entering state 'DOTA_GAMERULES_STATE_PRE_GAME'
m_flPreGameStartTime set to 31.13
m_flStateTransitionTime set to 121.13
Height map file (maps/prefabs/promotional_radiant_fountain.vhcg) not found, this will make ground height traces more expensive! Recompile the map to generate a height map.
Height map file (maps/prefabs/promotional_dire_fountain.vhcg) not found, this will make ground height traces more expensive! Recompile the map to generate a height map.
Observe:: cout
Observe:: cerr
(py) worldstate @ dotatime=-89.23334503173828, gamestate=4

But when i do as 2 3 4, without turn on steam client, it can work correctly. Some logs are:

(py) worldstate @ dotatime=-12.10013198852539, gamestate=8
Act::
Observe:: cout
Observe:: cerr
(py) worldstate @ dotatime=-12.10013198852539, gamestate=8
Act::
S:Gamerules: entering state 'DOTA_GAMERULES_STATE_WAIT_FOR_MAP_TO_LOAD'
S:Gamerules: entering state 'DOTA_GAMERULES_STATE_PRE_GAME'
m_flPreGameStartTime set to 31.13
m_flStateTransitionTime set to 121.13
Height map file (maps/prefabs/promotional_radiant_fountain.vhcg) not found, this will make ground height traces more expensive! Recompile the map to generate a height map.
Height map file (maps/prefabs/promotional_dire_fountain.vhcg) not found, this will make ground height traces more expensive! Recompile the map to generate a height map.
Observe:: cout
Observe:: cerr
(py) worldstate @ dotatime=-89.23334503173828, gamestate=4
(py) lua_config =  {'step': 30, 'dota_time': -88.966682434082}
(py) lua config received= {'step': 30, 'dota_time': -88.966682434082}
(py) writing live config= {'calibration_dota_time': -89.23334503173828}
DotaService::step()

I compared the two logs, it seems without steam running, it can not load steam API. Can this be one reason of the block?
I doesn't know much about Steam and Dota2 APIs, and doesn't know how to debug this error.
Thanks for your helping!

Botcpp Work

This Issue/Post is mostly for tracking things tried. Below compiles and doesn't crash, but doesn't take an action.

What I put in my Act()

CMsgBotWorldState_Action_MoveToLocation * mtl_pb; 
CMsgBotWorldState_Vector * loc_pb; 

extern "C" void Act(int team_id, CMsgBotWorldState_Actions * actions_pb) {
    // Act seems to be called practically _exactly_ after Observe is called.
    // Since it is called once per team, all team-decisions need to be made here. That means
    // that we need to communicate all actions. Probably that means we need to return the actions
    // protobuf somehow. I think returning the protobuffer itself, from this function makes
    // the most sense.
    // This call is fully blocking the entire game, so possible they are indeed waiting for a 
    // synchronous return.

    cout << "Act\t" << (void*)actions_pb << endl;

    //if (game_state == 4 or game_state == 5) {
    if (actions_pb) {
        //CMsgBotWorldState_Actions * actions_pb = new CMsgBotWorldState_Actions();
        actions_pb = new CMsgBotWorldState_Actions();
        
        mtl_pb = new CMsgBotWorldState_Action_MoveToLocation();
        loc_pb = new CMsgBotWorldState_Vector();
        loc_pb->set_x(0.0);
        loc_pb->set_y(0.0);
        loc_pb->set_z(0.0);
        mtl_pb->set_allocated_location(loc_pb);
        mtl_pb->add_units(test_id);
        
        actions_pb->set_dota_time(dtime + 0.1);
        actions_pb->set_extradata("EXTRA");
        CMsgBotWorldState_Action * action_pb = actions_pb->add_actions();
        action_pb->set_actiontype(CMsgBotWorldState_Action_Type_DOTA_UNIT_ORDER_MOVE_TO_POSITION);
        action_pb->set_player(4);
        action_pb->set_actionid(0);
        action_pb->set_allocated_movetolocation(mtl_pb);
        
        CMsgBotWorldState_Actions_OceanAnnotation * oa_pb = new CMsgBotWorldState_Actions_OceanAnnotation();
        
        CMsgBotWorldState_Actions_OceanAnnotation_Hero * hero_pb = new CMsgBotWorldState_Actions_OceanAnnotation_Hero();
        hero_pb->set_playerid(4);
        
        oa_pb->add_heroes();
        actions_pb->set_allocated_oceanannotation(oa_pb);
        
        std::string s;
        google::protobuf::TextFormat::PrintToString(*actions_pb, &s);
        cout << "Our Message:\n" << s << endl;
    }
    return;
}

What I see in dotaservice:

dota_time: 43.8411026
actions {
  actionType: DOTA_UNIT_ORDER_MOVE_TO_POSITION
  player: 4
  actionID: 0
  moveToLocation {
    units: 5
    location {
      x: 0
      y: 0
      z: 0
    }
  }
}
extraData: "EXTRA"
oceanAnnotation {
  heroes {
  }
}

How to deal with Trees?

In the game, there are 2,207 trees (according to the internet anyways). Each tree occupies 64 x 64 units, centered at an x,y,z location and identified by an integer.

The protobuf sent by Dota2 only updates tree events when they are destroyed.

As a result, we will have to pre-seed all the trees into the game at start I think.

Thoughts?

Handling of corrupt world-state messages

This crashed both the dotaservice as well as the client. The worldstate that was sent was incomplete, probably because it was [intentionally] killed while sending the worldstate.

Service

(python) action= {'actionType': 'DOTA_UNIT_ORDER_MOVE_TO_POSITION', 'moveToLocation': {'location': {'x': 6852.0, 'y': -5764.0, 'z': 0.0}}, 'dota_time': 109.81683349609375}
Script function 'Think' on bot npc_dota_hero_nevermore took 7.483ms
(py) worldstate @ dotatime=110.81704711914062, gamestate=5
DotaService::step()
(python) action= {'actionType': 'DOTA_UNIT_ORDER_MOVE_TO_POSITION', 'moveToLocation': {'location': {'x': 6852.0, 'y': -5764.0, 'z': 0.0}}, 'dota_time': 110.81704711914062}
Script function 'Think' on bot npc_dota_hero_nevermore took 7.549ms
(py) worldstate @ dotatime=111.8172607421875, gamestate=5
DotaService::reset()
config=
 host_timescale: 10
ticks_per_observation: 30
render: false

kill: 30495: No such process
Application error
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/grpclib/server.py", line 327, in request_handler
    await method.func(stream)
  File "/Users/tzaman/Drive/code/dotaservice/dotaservice/dotaservice.py", line 305, in reset
    game_id=config.game_id,
  File "/Users/tzaman/Drive/code/dotaservice/dotaservice/dotaservice.py", line 75, in __init__
    self.bot_path = self._create_bot_path()
  File "/Users/tzaman/Drive/code/dotaservice/dotaservice/dotaservice.py", line 129, in _create_bot_path
    assert len(lua_files) == 5
AssertionError
/Users/tzaman/Library/Application Support/Steam/SteamApps/common/dota 2 beta/game/dota.sh: line 104: 30491 Killed: 9               ${STEAM_RUNTIME_PREFIX} ${GAME_DEBUGGER} "${GAMEROOT}"/${GAMEEXE} "$@"
Task exception was never retrieved
future: <Task finished coro=<DotaGame._worldstate_listener() done, defined at /Users/tzaman/Drive/code/dotaservice/dotaservice/dotaservice.py:241> exception=error('unpack requires a buffer of 4 bytes')>
Traceback (most recent call last):
  File "/Users/tzaman/Drive/code/dotaservice/dotaservice/dotaservice.py", line 253, in _worldstate_listener
    parsed_data = await self._data_from_reader(reader)
  File "/Users/tzaman/Drive/code/dotaservice/dotaservice/dotaservice.py", line 230, in _data_from_reader
    n_bytes = unpack("@I", data)[0]
struct.error: unpack requires a buffer of 4 bytes

Client

(..)
ep=351 reward sum=21237.75
last hero loc dotatime=111.8172607421875, x=6240.0, y=-5920.0
last hero loc dotatime=111.8172607421875, x=6752.0, y=-5664.0
Traceback (most recent call last):
  File "client.py", line 263, in <module>
    asyncio.run(main())
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 568, in run_until_complete
    return future.result()
  File "client.py", line 175, in main
    state = await env.reset(config)
  File "/usr/local/lib/python3.7/site-packages/grpclib/client.py", line 556, in __call__
    return await stream.recv_message()
  File "/usr/local/lib/python3.7/site-packages/grpclib/client.py", line 304, in recv_message
    await self.recv_initial_metadata()
  File "/usr/local/lib/python3.7/site-packages/grpclib/client.py", line 246, in recv_initial_metadata
    self._raise_for_grpc_status(headers_map, optional=True)
  File "/usr/local/lib/python3.7/site-packages/grpclib/client.py", line 215, in _raise_for_grpc_status
    raise GRPCError(grpc_status_enum, status_message)
grpclib.exceptions.GRPCError: (<Status.UNKNOWN: 2>, 'Internal Server Error')

Time sync of radiant/dire teams upon reset not stable.

Ex (0.3.2):

ValueError: dota_time discrepancy in depleting initial worldstate queue.
at reset (/root/dotaservice/dotaservice/dotaservice.py:439)
at request_handler (/root/.local/lib/python3.7/site-packages/grpclib/server.py:327)

can not get the enemy lane creep info in world state

I use the observe rpc with the dire team id, all info in the returned world state is ok, except there are no enemy(radiant) lane creep info, but actually the radiant lane creep is in our sight.

do you encounter this problem?

Hero not found in state on player-vs-bot

Making a lobby to play agianst the bot gives me troubles:

Exception on Actor::call; retrying (0/5).:
hero 0 not found in state:
team_id: 2
game_time: 78.69914245605469
dota_time: -89.20001220703125
game_state: 4
hero_pick_state: 1
time_of_day: 0.2509956657886505
glyph_cooldown: 347.899169921875
glyph_cooldown_enemy: 347
players {
  player_id: 1
  hero_id: 35
  is_alive: true
  respawn_time: 6.0
  kills: 0
  deaths: 0
  assists: 0
  team_id: 3
}
players {
  player_id: 2
  hero_id: 11
  is_alive: true
  respawn_time: 6.0
  kills: 0
  deaths: 0
  assists: 0
  team_id: 2
}
players {
  player_id: 3
  hero_id: 91
  is_alive: true
  respawn_time: 6.0
  kills: 0
  deaths: 0
  assists: 0
  team_id: 2
}
players {
  player_id: 4
  hero_id: 91
  is_alive: true
  respawn_time: 6.0
  kills: 0
  deaths: 0
  assists: 0
  team_id: 2
}
players {
  player_id: 5
  hero_id: 91
  is_alive: true
  respawn_time: 6.0
  kills: 0
  deaths: 0
  assists: 0
  team_id: 2
}
players {
  player_id: 6
  hero_id: 91
  is_alive: true
  respawn_time: 6.0
  kills: 0
  deaths: 0
  assists: 0
  team_id: 2
}
players {
  player_id: 7
  hero_id: 91
  is_alive: true
  respawn_time: 6.0
  kills: 0
  deaths: 0
  assists: 0
  team_id: 3
}
players {
  player_id: 8
  hero_id: 91
  is_alive: true
  respawn_time: 6.0
  kills: 0
  deaths: 0
  assists: 0
  team_id: 3
}
players {
  player_id: 9
  hero_id: 91
  is_alive: true
  respawn_time: 6.0
  kills: 0
  deaths: 0
  assists: 0
  team_id: 3
}
players {
  player_id: 10
  hero_id: 91
  is_alive: true
  respawn_time: 6.0
  kills: 0
  deaths: 0
  assists: 0
  team_id: 3
}
units {
  handle: 41
  unit_type: TOWER
  name: "npc_dota_goodguys_tower3_bot"
  team_id: 2
  level: 3
  location {
    x: -3951.997802734375
    y: -6112.0
    z: 383.99993896484375
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 0
  ground_height: 384
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 2000
  health_max: 2000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 42
    ability_id: 5351
    slot: 0
    caster_handle: 41
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 42
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 43
  unit_type: TOWER
  name: "npc_dota_goodguys_tower3_mid"
  team_id: 2
  level: 3
  location {
    x: -4639.9990234375
    y: -4143.9990234375
    z: 384.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 45
  ground_height: 384
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 2000
  health_max: 2000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 44
    ability_id: 5351
    slot: 0
    caster_handle: 43
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 44
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 45
  unit_type: TOWER
  name: "npc_dota_goodguys_tower3_top"
  team_id: 2
  level: 3
  location {
    x: -6592.0
    y: -3407.998046875
    z: 384.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 90
  ground_height: 384
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 2000
  health_max: 2000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 46
    ability_id: 5351
    slot: 0
    caster_handle: 45
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 46
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 47
  unit_type: TOWER
  name: "npc_dota_goodguys_tower2_bot"
  team_id: 2
  level: 2
  location {
    x: -103.99784088134766
    y: -6320.0
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 0
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1900
  health_max: 1900
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 48
    ability_id: 5350
    slot: 0
    caster_handle: 47
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection"
    stack_count: 0
    ability_handle: 48
    ability_id: 5350
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 49
  unit_type: TOWER
  name: "npc_dota_goodguys_tower1_bot"
  team_id: 2
  level: 1
  location {
    x: 4924.00146484375
    y: -6127.9990234375
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 30
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1800
  health_max: 1800
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 110
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 110
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 12.0
  magic_resist: 0.0
}
units {
  handle: 50
  unit_type: TOWER
  name: "npc_dota_goodguys_tower2_mid"
  team_id: 2
  level: 2
  location {
    x: -3168.0009765625
    y: -3024.00146484375
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 45
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1900
  health_max: 1900
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 51
    ability_id: 5350
    slot: 0
    caster_handle: 50
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection"
    stack_count: 0
    ability_handle: 51
    ability_id: 5350
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 52
  unit_type: TOWER
  name: "npc_dota_goodguys_tower2_top"
  team_id: 2
  level: 2
  location {
    x: -6160.0
    y: -871.998046875
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 90
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1900
  health_max: 1900
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 53
    ability_id: 5350
    slot: 0
    caster_handle: 52
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection"
    stack_count: 0
    ability_handle: 53
    ability_id: 5350
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 54
  unit_type: TOWER
  name: "npc_dota_goodguys_tower1_top"
  team_id: 2
  level: 1
  location {
    x: -6256.0
    y: 1816.001953125
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 90
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1800
  health_max: 1800
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 110
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 110
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 12.0
  magic_resist: 0.0
}
units {
  handle: 55
  unit_type: TOWER
  name: "npc_dota_goodguys_tower4"
  team_id: 2
  level: 4
  location {
    x: -5711.99853515625
    y: -4863.99853515625
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 45
  ground_height: 384
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 2100
  health_max: 2100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 56
    ability_id: 5351
    slot: 0
    caster_handle: 55
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 56
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 21.0
  magic_resist: 0.0
}
units {
  handle: 57
  unit_type: BARRACKS
  name: "npc_dota_goodguys_melee_rax_mid"
  team_id: 2
  level: 1
  location {
    x: -4671.99560546875
    y: -4551.9990234375
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 135
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 2200
  health_max: 2200
  health_regen: 5.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 58
    ability_id: 5351
    slot: 0
    caster_handle: 57
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 58
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 13.0
  magic_resist: 0.0
}
units {
  handle: 59
  unit_type: BARRACKS
  name: "npc_dota_goodguys_range_rax_mid"
  team_id: 2
  level: 1
  location {
    x: -5060.0
    y: -4199.0
    z: 383.999755859375
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 315
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1300
  health_max: 1300
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 60
    ability_id: 5351
    slot: 0
    caster_handle: 59
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 60
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 9.0
  magic_resist: 0.0
}
units {
  handle: 61
  unit_type: BARRACKS
  name: "npc_dota_goodguys_melee_rax_bot"
  team_id: 2
  level: 1
  location {
    x: -4279.99609375
    y: -6360.001953125
    z: 384.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 90
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 2200
  health_max: 2200
  health_regen: 5.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 62
    ability_id: 5351
    slot: 0
    caster_handle: 61
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 62
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 13.0
  magic_resist: 0.0
}
units {
  handle: 63
  unit_type: BARRACKS
  name: "npc_dota_goodguys_range_rax_bot"
  team_id: 2
  level: 1
  location {
    x: -4279.00048828125
    y: -5853.0
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 270
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1300
  health_max: 1300
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 64
    ability_id: 5351
    slot: 0
    caster_handle: 63
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 64
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 9.0
  magic_resist: 0.0
}
units {
  handle: 65
  unit_type: BARRACKS
  name: "npc_dota_goodguys_melee_rax_top"
  team_id: 2
  level: 1
  location {
    x: -6335.998046875
    y: -3757.99609375
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 180
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 2200
  health_max: 2200
  health_regen: 5.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 66
    ability_id: 5351
    slot: 0
    caster_handle: 65
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 66
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 13.0
  magic_resist: 0.0
}
units {
  handle: 67
  unit_type: BARRACKS
  name: "npc_dota_goodguys_range_rax_top"
  team_id: 2
  level: 1
  location {
    x: -6844.0
    y: -3759.00048828125
    z: 383.99993896484375
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 0
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1300
  health_max: 1300
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 68
    ability_id: 5351
    slot: 0
    caster_handle: 67
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 68
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 9.0
  magic_resist: 0.0
}
units {
  handle: 69
  unit_type: BARRACKS
  name: "npc_dota_badguys_melee_rax_bot"
  team_id: 3
  level: 1
  location {
    x: 6591.9990234375
    y: 3392.016845703125
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 0
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 2200
  health_max: 2200
  health_regen: 5.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 70
    ability_id: 5351
    slot: 0
    caster_handle: 69
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 13.0
  magic_resist: 0.0
}
units {
  handle: 71
  unit_type: BARRACKS
  name: "npc_dota_badguys_range_rax_bot"
  team_id: 3
  level: 1
  location {
    x: 6064.0
    y: 3376.0
    z: 384.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 180
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1300
  health_max: 1300
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 72
    ability_id: 5351
    slot: 0
    caster_handle: 71
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 9.0
  magic_resist: 0.0
}
units {
  handle: 73
  unit_type: BARRACKS
  name: "npc_dota_badguys_range_rax_mid"
  team_id: 3
  level: 1
  location {
    x: 4336.0
    y: 4183.0
    z: 383.999755859375
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 135
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1300
  health_max: 1300
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 74
    ability_id: 5351
    slot: 0
    caster_handle: 73
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 9.0
  magic_resist: 0.0
}
units {
  handle: 75
  unit_type: BARRACKS
  name: "npc_dota_badguys_melee_rax_mid"
  team_id: 3
  level: 1
  location {
    x: 4702.01171875
    y: 3824.0126953125
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 315
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 2200
  health_max: 2200
  health_regen: 5.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 76
    ability_id: 5351
    slot: 0
    caster_handle: 75
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 13.0
  magic_resist: 0.0
}
units {
  handle: 77
  unit_type: BARRACKS
  name: "npc_dota_badguys_melee_rax_top"
  team_id: 3
  level: 1
  location {
    x: 3898.0166015625
    y: 5496.0009765625
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 270
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 2200
  health_max: 2200
  health_regen: 5.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 78
    ability_id: 5351
    slot: 0
    caster_handle: 77
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 13.0
  magic_resist: 0.0
}
units {
  handle: 79
  unit_type: BARRACKS
  name: "npc_dota_badguys_range_rax_top"
  team_id: 3
  level: 1
  location {
    x: 3894.0
    y: 6025.0
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 90
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1300
  health_max: 1300
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 80
    ability_id: 5351
    slot: 0
    caster_handle: 79
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 9.0
  magic_resist: 0.0
}
units {
  handle: 81
  unit_type: FORT
  name: "npc_dota_badguys_fort"
  team_id: 3
  level: 1
  location {
    x: 5527.9970703125
    y: 4999.998046875
    z: 376.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 373
  facing: 45
  ground_height: 384
  vision_range_daytime: 2600
  vision_range_nighttime: 2600
  health: 4500
  health_max: 4500
  health_regen: 12.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 82
    ability_id: 5351
    slot: 0
    caster_handle: 81
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 13.0
  magic_resist: 0.0
}
units {
  handle: 83
  unit_type: FORT
  name: "npc_dota_goodguys_fort"
  team_id: 2
  level: 1
  location {
    x: -5919.9931640625
    y: -5351.994140625
    z: 367.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 298
  facing: 345
  ground_height: 384
  vision_range_daytime: 2600
  vision_range_nighttime: 2600
  health: 4500
  health_max: 4500
  health_regen: 12.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 84
    ability_id: 5351
    slot: 0
    caster_handle: 83
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 84
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  armor: 13.0
  magic_resist: 0.0
}
units {
  handle: 85
  unit_type: TOWER
  name: "npc_dota_badguys_tower4"
  team_id: 3
  level: 4
  location {
    x: 4943.9990234375
    y: 4776.0
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 43
  ground_height: 384
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 2100
  health_max: 2100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 86
    ability_id: 5351
    slot: 0
    caster_handle: 85
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 21.0
  magic_resist: 0.0
}
units {
  handle: 87
  unit_type: TOWER
  name: "npc_dota_badguys_tower2_top"
  team_id: 3
  level: 2
  location {
    x: -0.00034500000765547156
    y: 6016.0
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 0
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1900
  health_max: 1900
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 88
    ability_id: 5350
    slot: 0
    caster_handle: 87
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 89
  unit_type: TOWER
  name: "npc_dota_badguys_tower1_top"
  team_id: 3
  level: 1
  location {
    x: -4672.00048828125
    y: 6016.0
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 0
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1800
  health_max: 1800
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 110
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 110
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  armor: 12.0
  magic_resist: 0.0
}
units {
  handle: 90
  unit_type: TOWER
  name: "npc_dota_badguys_tower2_mid"
  team_id: 3
  level: 2
  location {
    x: 2496.0
    y: 2111.999755859375
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 45
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1900
  health_max: 1900
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 91
    ability_id: 5350
    slot: 0
    caster_handle: 90
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 92
  unit_type: TOWER
  name: "npc_dota_badguys_tower1_mid"
  team_id: 3
  level: 1
  location {
    x: 523.999755859375
    y: 651.9996948242188
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 45
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1800
  health_max: 1800
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 110
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 110
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  armor: 12.0
  magic_resist: 0.0
}
units {
  handle: 93
  unit_type: TOWER
  name: "npc_dota_badguys_tower2_bot"
  team_id: 3
  level: 2
  location {
    x: 6208.0
    y: 383.99951171875
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 90
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1900
  health_max: 1900
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 94
    ability_id: 5350
    slot: 0
    caster_handle: 93
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 95
  unit_type: TOWER
  name: "npc_dota_badguys_tower3_bot"
  team_id: 3
  level: 3
  location {
    x: 6336.0
    y: 3031.99951171875
    z: 383.999755859375
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 90
  ground_height: 384
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 2000
  health_max: 2000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 96
    ability_id: 5351
    slot: 0
    caster_handle: 95
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 97
  unit_type: TOWER
  name: "npc_dota_badguys_tower3_top"
  team_id: 3
  level: 3
  location {
    x: 3551.999755859375
    y: 5776.0
    z: 384.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 0
  ground_height: 384
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 2000
  health_max: 2000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 98
    ability_id: 5351
    slot: 0
    caster_handle: 97
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 99
  unit_type: TOWER
  name: "npc_dota_badguys_tower3_mid"
  team_id: 3
  level: 3
  location {
    x: 4272.0
    y: 3759.0
    z: 384.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 45
  ground_height: 384
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 2000
  health_max: 2000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 100
    ability_id: 5351
    slot: 0
    caster_handle: 99
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 14.0
  magic_resist: 0.0
}
units {
  handle: 101
  unit_type: TOWER
  name: "npc_dota_badguys_tower4"
  team_id: 3
  level: 4
  location {
    x: 5279.99951171875
    y: 4431.9990234375
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 42
  ground_height: 384
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 2100
  health_max: 2100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 102
    ability_id: 5351
    slot: 0
    caster_handle: 101
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 21.0
  magic_resist: 0.0
}
units {
  handle: 103
  unit_type: TOWER
  name: "npc_dota_goodguys_tower4"
  team_id: 2
  level: 4
  location {
    x: -5391.99853515625
    y: -5191.99853515625
    z: 383.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 45
  ground_height: 384
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 2100
  health_max: 2100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 152
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 152
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 104
    ability_id: 5351
    slot: 0
    caster_handle: 103
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 104
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 21.0
  magic_resist: 0.0
}
units {
  handle: 105
  unit_type: TOWER
  name: "npc_dota_goodguys_tower1_mid"
  team_id: 2
  level: 1
  location {
    x: -1543.99853515625
    y: -1407.998291015625
    z: 255.9998779296875
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 45
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1800
  health_max: 1800
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 110
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 110
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_tower_aura"
    stack_count: 0
  }
  armor: 12.0
  magic_resist: 0.0
}
units {
  handle: 106
  unit_type: BUILDING
  name: "npc_dota_goodguys_fillers"
  team_id: 2
  level: 1
  location {
    x: -6589.78564453125
    y: -4206.744140625
    z: 368.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 302
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 107
    ability_id: 5351
    slot: 0
    caster_handle: 106
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 107
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 108
  unit_type: BUILDING
  name: "npc_dota_goodguys_fillers"
  team_id: 2
  level: 1
  location {
    x: -5838.1474609375
    y: -4292.375
    z: 368.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 221
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 109
    ability_id: 5351
    slot: 0
    caster_handle: 108
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 109
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 110
  unit_type: BUILDING
  name: "npc_dota_goodguys_fillers"
  team_id: 2
  level: 1
  location {
    x: -4752.0888671875
    y: -6080.0
    z: 368.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 304
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 111
    ability_id: 5351
    slot: 0
    caster_handle: 110
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 111
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 112
  unit_type: BUILDING
  name: "npc_dota_goodguys_fillers"
  team_id: 2
  level: 1
  location {
    x: -5248.0
    y: -4736.0
    z: 368.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 303
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 113
    ability_id: 5351
    slot: 0
    caster_handle: 112
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 113
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 114
  unit_type: BUILDING
  name: "npc_dota_goodguys_fillers"
  team_id: 2
  level: 1
  location {
    x: -4782.1474609375
    y: -5268.375
    z: 368.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 232
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 115
    ability_id: 5351
    slot: 0
    caster_handle: 114
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 115
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 116
  unit_type: BUILDING
  name: "npc_dota_badguys_fillers"
  team_id: 3
  level: 1
  location {
    x: 6326.2216796875
    y: 3798.05029296875
    z: 384.0384521484375
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 244
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  abilities {
    handle: 117
    ability_id: 5351
    slot: 0
    caster_handle: 116
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 118
  unit_type: BUILDING
  name: "npc_dota_badguys_fillers"
  team_id: 3
  level: 1
  location {
    x: 5520.9228515625
    y: 3949.039306640625
    z: 384.0384521484375
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 294
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  abilities {
    handle: 119
    ability_id: 5351
    slot: 0
    caster_handle: 118
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 120
  unit_type: BUILDING
  name: "npc_dota_badguys_fillers"
  team_id: 3
  level: 1
  location {
    x: 4894.154296875
    y: 4370.02392578125
    z: 392.2940673828125
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 46
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  abilities {
    handle: 121
    ability_id: 5351
    slot: 0
    caster_handle: 120
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 122
  unit_type: BUILDING
  name: "npc_dota_badguys_fillers"
  team_id: 3
  level: 1
  location {
    x: 4480.923828125
    y: 4989.0361328125
    z: 384.0382080078125
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 120
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  abilities {
    handle: 123
    ability_id: 5351
    slot: 0
    caster_handle: 122
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 124
  unit_type: BUILDING
  name: "npc_dota_badguys_fillers"
  team_id: 3
  level: 1
  location {
    x: 4411.02685546875
    y: 5753.46142578125
    z: 384.0382080078125
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 65
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  abilities {
    handle: 125
    ability_id: 5351
    slot: 0
    caster_handle: 124
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 126
  unit_type: TOWER
  name: "npc_dota_badguys_tower1_bot"
  team_id: 3
  level: 1
  location {
    x: 6269.3388671875
    y: -1728.74169921875
    z: 256.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 90
  ground_height: 256
  vision_range_daytime: 1900
  vision_range_nighttime: 800
  health: 1800
  health_max: 1800
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: 1500
  anim_cycle: 0.600006103515625
  base_damage: 110
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 110
  attack_range: 700
  attack_speed: 1.0
  attack_anim_point: 0.6000000238418579
  attack_acquisition_range: 700
  attack_projectile_speed: 750
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  armor: 12.0
  magic_resist: 0.0
}
units {
  handle: 127
  unit_type: SHRINE
  name: "npc_dota_goodguys_healers"
  team_id: 2
  level: 1
  location {
    x: 1317.41748046875
    y: -4163.599609375
    z: 387.3760070800781
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 310
  ground_height: 384
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 1750
  health_max: 1750
  health_regen: 5.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 128
    ability_id: 5351
    slot: 0
    caster_handle: 127
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  abilities {
    handle: 129
    ability_id: 6226
    slot: 1
    caster_handle: 127
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 389.2999572753906
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  modifiers {
    name: "modifier_filler_thinker"
    stack_count: 0
    ability_handle: 129
    ability_id: 6226
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 17.0
  magic_resist: 0.0
  shrine_cooldown: 389.2999572753906
  is_shrine_healing: false
}
units {
  handle: 130
  unit_type: SHRINE
  name: "npc_dota_goodguys_healers"
  team_id: 2
  level: 1
  location {
    x: -4348.0732421875
    y: 198.232177734375
    z: 384.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 310
  ground_height: 384
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 1750
  health_max: 1750
  health_regen: 5.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 131
    ability_id: 5351
    slot: 0
    caster_handle: 130
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  abilities {
    handle: 132
    ability_id: 6226
    slot: 1
    caster_handle: 130
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 389.2999572753906
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  modifiers {
    name: "modifier_filler_thinker"
    stack_count: 0
    ability_handle: 132
    ability_id: 6226
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 17.0
  magic_resist: 0.0
  shrine_cooldown: 389.2999572753906
  is_shrine_healing: false
}
units {
  handle: 133
  unit_type: SHRINE
  name: "npc_dota_badguys_healers"
  team_id: 3
  level: 1
  location {
    x: -1073.780517578125
    y: 3826.17529296875
    z: 416.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 0
  ground_height: 384
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 1750
  health_max: 1750
  health_regen: 5.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 134
    ability_id: 5351
    slot: 0
    caster_handle: 133
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  abilities {
    handle: 135
    ability_id: 6226
    slot: 1
    caster_handle: 133
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: false
  }
  armor: 17.0
  magic_resist: 0.0
  shrine_cooldown: 389.2999572753906
  is_shrine_healing: false
}
units {
  handle: 136
  unit_type: SHRINE
  name: "npc_dota_badguys_healers"
  team_id: 3
  level: 1
  location {
    x: 3446.219482421875
    y: 234.17523193359375
    z: 385.21563720703125
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 0
  ground_height: 384
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 1750
  health_max: 1750
  health_regen: 5.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  abilities {
    handle: 137
    ability_id: 5351
    slot: 0
    caster_handle: 136
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  abilities {
    handle: 138
    ability_id: 6226
    slot: 1
    caster_handle: 136
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: false
  }
  armor: 17.0
  magic_resist: 0.0
  shrine_cooldown: 389.2999572753906
  is_shrine_healing: false
}
units {
  handle: 139
  unit_type: BUILDING
  name: "npc_dota_badguys_fillers"
  team_id: 3
  level: 1
  location {
    x: 5286.2216796875
    y: 3374.04833984375
    z: 399.1309814453125
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 124
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  abilities {
    handle: 140
    ability_id: 5351
    slot: 0
    caster_handle: 139
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 141
  unit_type: BUILDING
  name: "npc_dota_badguys_fillers"
  team_id: 3
  level: 1
  location {
    x: 3783.576171875
    y: 4718.4921875
    z: 398.517578125
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 85
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  abilities {
    handle: 142
    ability_id: 5351
    slot: 0
    caster_handle: 141
    cast_range: 0
    channel_time: 0.0
    is_activated: true
    is_toggled: false
    is_stolen: false
    is_fully_castable: true
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 143
  unit_type: BUILDING
  name: "npc_dota_goodguys_fillers"
  team_id: 2
  level: 1
  location {
    x: -5597.78515625
    y: -3710.744140625
    z: 408.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 302
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 144
    ability_id: 5351
    slot: 0
    caster_handle: 143
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 144
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 145
  unit_type: BUILDING
  name: "npc_dota_goodguys_fillers"
  team_id: 2
  level: 1
  location {
    x: -4265.3359375
    y: -5161.84765625
    z: 384.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 96
  facing: 313
  ground_height: 384
  vision_range_daytime: 900
  vision_range_nighttime: 600
  health: 1000
  health_max: 1000
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: -2147483648
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 75
  bounty_gold_max: 75
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 146
    ability_id: 5351
    slot: 0
    caster_handle: 145
    level: 1
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: true
  }
  modifiers {
    name: "modifier_backdoor_protection_in_base"
    stack_count: 0
    ability_handle: 146
    ability_id: 5351
  }
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  armor: 10.0
  magic_resist: 0.0
}
units {
  handle: 147
  unit_type: BUILDING
  name: "dota_fountain"
  team_id: 3
  level: 1
  location {
    x: 7472.0
    y: 6912.0
    z: 512.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 143
  ground_height: 512
  vision_range_daytime: 1800
  vision_range_nighttime: 1800
  health: 500
  health_max: 500
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 230
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 230
  attack_range: 1200
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 1200
  attack_projectile_speed: 1400
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 148
  unit_type: BUILDING
  name: "dota_fountain"
  team_id: 2
  level: 1
  location {
    x: -7456.0
    y: -6938.0
    z: 528.0
  }
  is_alive: true
  player_id: -1
  bounding_radius: 144
  facing: 65
  ground_height: 512
  vision_range_daytime: 1800
  vision_range_nighttime: 1800
  health: 500
  health_max: 500
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 230
  base_damage_variance: 10
  bonus_damage: 0
  attack_damage: 230
  attack_range: 1200
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 1200
  attack_projectile_speed: 1400
  attacks_per_second: 6
  last_attack_time: 0.0
  bounty_xp: 0
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_invulnerable"
    stack_count: 0
  }
  modifiers {
    name: "modifier_fountain_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_fountain_truesight_aura"
    stack_count: 0
  }
  modifiers {
    name: "modifier_fountain_passive"
    stack_count: 0
  }
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 149
  unit_type: HERO
  name: "npc_dota_hero_nevermore"
  team_id: 2
  level: 1
  location {
    x: -6700.0
    y: -6700.00390625
    z: 512.0
  }
  is_alive: true
  player_id: 2
  bounding_radius: 24
  facing: 45
  ground_height: 512
  vision_range_daytime: 1800
  vision_range_nighttime: 800
  health: 488
  health_max: 488
  health_regen: 26.25
  mana: 291
  mana_max: 291
  mana_regen: 18.35999870300293
  base_movement_speed: 310
  current_movement_speed: 313
  anim_activity: 1534
  anim_cycle: 0.7390666007995605
  base_damage: 38
  base_damage_variance: 3
  bonus_damage: 0
  attack_damage: 38
  attack_range: 500
  attack_speed: 1.25
  attack_anim_point: 0.5
  attack_acquisition_range: 800
  attack_projectile_speed: 1200
  attacks_per_second: 0
  last_attack_time: 0.0
  bounty_xp: 40
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: false
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 150
    ability_id: 5059
    slot: 0
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 151
    ability_id: 5060
    slot: 1
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 152
    ability_id: 5061
    slot: 2
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 153
    ability_id: 5062
    slot: 3
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 154
    ability_id: 5063
    slot: 4
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 155
    ability_id: 5064
    slot: 5
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 156
    ability_id: 5949
    slot: 9
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 157
    ability_id: 5906
    slot: 10
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 158
    ability_id: 6875
    slot: 11
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 159
    ability_id: 6141
    slot: 12
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 160
    ability_id: 6670
    slot: 13
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 161
    ability_id: 6070
    slot: 14
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 162
    ability_id: 6912
    slot: 15
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 163
    ability_id: 6445
    slot: 16
    caster_handle: 149
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  items {
    handle: 164
    ability_id: 46
    slot: 15
    caster_handle: 149
    level: 1
    cast_range: 0
    channel_time: 3.0
    cooldown_remaining: 99.20001220703125
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
    charges: 1
    secondary_charges: 0
    is_combined_locked: false
  }
  modifiers {
    name: "modifier_fountain_aura_buff"
    stack_count: 0
    remaining_duration: 2.9666671752929688
  }
  action_type: 1
  is_using_ability: false
  primary_attribute: 1
  is_illusion: false
  respawn_time: 6.0
  buyback_cost: 150
  buyback_cooldown: 0.0
  spell_amplification: 0.012600000016391277
  armor: 3.999999761581421
  magic_resist: 0.2595999836921692
  evasion: 0.0
  xp_needed_to_level: 230
  ability_points: 1
  reliable_gold: 0
  unreliable_gold: 600
  last_hits: 0
  denies: 0
  net_worth: 650
  strength: 16
  agility: 20
  intelligence: 18
}
units {
  handle: 165
  unit_type: HERO
  name: "npc_dota_hero_wisp"
  team_id: 2
  level: 1
  location {
    x: -6750.0
    y: -6550.00390625
    z: 512.0
  }
  is_alive: true
  player_id: 3
  bounding_radius: 24
  facing: 45
  ground_height: 512
  vision_range_daytime: 1800
  vision_range_nighttime: 800
  health: 582
  health_max: 582
  health_regen: 31.225000381469727
  mana: 351
  mana_max: 351
  mana_regen: 22.209999084472656
  base_movement_speed: 280
  current_movement_speed: 281
  anim_activity: 1500
  anim_cycle: 0.711212158203125
  base_damage: 43
  base_damage_variance: 4
  bonus_damage: 0
  attack_damage: 43
  attack_range: 575
  attack_speed: 1.1399999856948853
  attack_anim_point: 0.15000000596046448
  attack_acquisition_range: 800
  attack_projectile_speed: 1200
  attacks_per_second: 0
  last_attack_time: 0.0
  bounty_xp: 40
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: false
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 166
    ability_id: 5485
    slot: 0
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 167
    ability_id: 5486
    slot: 1
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 168
    ability_id: 5487
    slot: 2
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 169
    ability_id: 6251
    slot: 3
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 170
    ability_id: 6251
    slot: 4
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 171
    ability_id: 5488
    slot: 5
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 172
    ability_id: 5489
    slot: 6
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 173
    ability_id: 5490
    slot: 7
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: false
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 174
    ability_id: 6017
    slot: 9
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 175
    ability_id: 6253
    slot: 10
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 176
    ability_id: 6265
    slot: 11
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 177
    ability_id: 6924
    slot: 12
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 178
    ability_id: 5957
    slot: 13
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 179
    ability_id: 7188
    slot: 14
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 180
    ability_id: 7070
    slot: 15
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 181
    ability_id: 6808
    slot: 16
    caster_handle: 165
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  items {
    handle: 182
    ability_id: 46
    slot: 15
    caster_handle: 165
    level: 1
    cast_range: 0
    channel_time: 3.0
    cooldown_remaining: 99.30001068115234
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
    charges: 1
    secondary_charges: 0
    is_combined_locked: false
  }
  modifiers {
    name: "modifier_wisp_tentacles"
    stack_count: 0
  }
  modifiers {
    name: "modifier_fountain_aura_buff"
    stack_count: 0
    remaining_duration: 2.9666671752929688
  }
  action_type: 1
  is_using_ability: false
  primary_attribute: 0
  is_illusion: false
  respawn_time: 6.0
  buyback_cost: 150
  buyback_cooldown: 0.0
  spell_amplification: 0.016100000590085983
  armor: 0.24000000953674316
  magic_resist: 0.2627500295639038
  evasion: 0.0
  xp_needed_to_level: 230
  ability_points: 1
  reliable_gold: 0
  unreliable_gold: 600
  last_hits: 0
  denies: 0
  net_worth: 650
  strength: 17
  agility: 14
  intelligence: 23
}
units {
  handle: 1
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -38.274539947509766
    y: -37.1405029296875
    z: 256.0
  }
  is_alive: true
  player_id: 3
  bounding_radius: 8
  facing: 224
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 167
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 2
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -38.274539947509766
    y: -37.1405029296875
    z: 256.0
  }
  is_alive: true
  player_id: 3
  bounding_radius: 8
  facing: 224
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 167
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 3
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -38.274539947509766
    y: -37.1405029296875
    z: 256.0
  }
  is_alive: true
  player_id: 3
  bounding_radius: 8
  facing: 224
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 167
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 4
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -38.274539947509766
    y: -37.1405029296875
    z: 256.0
  }
  is_alive: true
  player_id: 3
  bounding_radius: 8
  facing: 224
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 167
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 5
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -38.274539947509766
    y: -37.1405029296875
    z: 256.0
  }
  is_alive: true
  player_id: 3
  bounding_radius: 8
  facing: 224
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 167
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 183
  unit_type: HERO
  name: "npc_dota_hero_wisp"
  team_id: 2
  level: 1
  location {
    x: -6900.0
    y: -6425.00390625
    z: 512.0
  }
  is_alive: true
  player_id: 4
  bounding_radius: 24
  facing: 45
  ground_height: 512
  vision_range_daytime: 1800
  vision_range_nighttime: 800
  health: 582
  health_max: 582
  health_regen: 31.225000381469727
  mana: 351
  mana_max: 351
  mana_regen: 22.209999084472656
  base_movement_speed: 280
  current_movement_speed: 281
  anim_activity: 1500
  anim_cycle: 0.6756523847579956
  base_damage: 43
  base_damage_variance: 4
  bonus_damage: 0
  attack_damage: 43
  attack_range: 575
  attack_speed: 1.1399999856948853
  attack_anim_point: 0.15000000596046448
  attack_acquisition_range: 800
  attack_projectile_speed: 1200
  attacks_per_second: 0
  last_attack_time: 0.0
  bounty_xp: 40
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: false
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 184
    ability_id: 5485
    slot: 0
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 185
    ability_id: 5486
    slot: 1
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 186
    ability_id: 5487
    slot: 2
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 187
    ability_id: 6251
    slot: 3
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 188
    ability_id: 6251
    slot: 4
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 189
    ability_id: 5488
    slot: 5
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 190
    ability_id: 5489
    slot: 6
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 191
    ability_id: 5490
    slot: 7
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: false
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 192
    ability_id: 6017
    slot: 9
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 193
    ability_id: 6253
    slot: 10
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 194
    ability_id: 6265
    slot: 11
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 195
    ability_id: 6924
    slot: 12
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 196
    ability_id: 5957
    slot: 13
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 197
    ability_id: 7188
    slot: 14
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 198
    ability_id: 7070
    slot: 15
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 199
    ability_id: 6808
    slot: 16
    caster_handle: 183
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  items {
    handle: 200
    ability_id: 46
    slot: 15
    caster_handle: 183
    level: 1
    cast_range: 0
    channel_time: 3.0
    cooldown_remaining: 99.30001068115234
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
    charges: 1
    secondary_charges: 0
    is_combined_locked: false
  }
  modifiers {
    name: "modifier_wisp_tentacles"
    stack_count: 0
  }
  modifiers {
    name: "modifier_fountain_aura_buff"
    stack_count: 0
    remaining_duration: 2.9666671752929688
  }
  action_type: 1
  is_using_ability: false
  primary_attribute: 0
  is_illusion: false
  respawn_time: 6.0
  buyback_cost: 150
  buyback_cooldown: 0.0
  spell_amplification: 0.016100000590085983
  armor: 0.24000000953674316
  magic_resist: 0.2627500295639038
  evasion: 0.0
  xp_needed_to_level: 230
  ability_points: 1
  reliable_gold: 0
  unreliable_gold: 600
  last_hits: 0
  denies: 0
  net_worth: 650
  strength: 17
  agility: 14
  intelligence: 23
}
units {
  handle: 6
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -36.591854095458984
    y: -34.07286834716797
    z: 256.0
  }
  is_alive: true
  player_id: 4
  bounding_radius: 8
  facing: 222
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 185
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 7
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -36.591854095458984
    y: -34.07286834716797
    z: 256.0
  }
  is_alive: true
  player_id: 4
  bounding_radius: 8
  facing: 222
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 185
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 8
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -36.591854095458984
    y: -34.07286834716797
    z: 256.0
  }
  is_alive: true
  player_id: 4
  bounding_radius: 8
  facing: 222
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 185
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 9
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -36.591854095458984
    y: -34.07286834716797
    z: 256.0
  }
  is_alive: true
  player_id: 4
  bounding_radius: 8
  facing: 222
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 185
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 10
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -36.591854095458984
    y: -34.07286834716797
    z: 256.0
  }
  is_alive: true
  player_id: 4
  bounding_radius: 8
  facing: 222
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 185
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 201
  unit_type: HERO
  name: "npc_dota_hero_wisp"
  team_id: 2
  level: 1
  location {
    x: -6950.0
    y: -6275.00390625
    z: 512.0
  }
  is_alive: true
  player_id: 5
  bounding_radius: 24
  facing: 45
  ground_height: 512
  vision_range_daytime: 1800
  vision_range_nighttime: 800
  health: 582
  health_max: 582
  health_regen: 31.225000381469727
  mana: 351
  mana_max: 351
  mana_regen: 22.209999084472656
  base_movement_speed: 280
  current_movement_speed: 281
  anim_activity: 1500
  anim_cycle: 0.640092670917511
  base_damage: 43
  base_damage_variance: 4
  bonus_damage: 0
  attack_damage: 43
  attack_range: 575
  attack_speed: 1.1399999856948853
  attack_anim_point: 0.15000000596046448
  attack_acquisition_range: 800
  attack_projectile_speed: 1200
  attacks_per_second: 0
  last_attack_time: 0.0
  bounty_xp: 40
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: false
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 202
    ability_id: 5485
    slot: 0
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 203
    ability_id: 5486
    slot: 1
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 204
    ability_id: 5487
    slot: 2
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 205
    ability_id: 6251
    slot: 3
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 206
    ability_id: 6251
    slot: 4
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 207
    ability_id: 5488
    slot: 5
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 208
    ability_id: 5489
    slot: 6
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 209
    ability_id: 5490
    slot: 7
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: false
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 210
    ability_id: 6017
    slot: 9
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 211
    ability_id: 6253
    slot: 10
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 212
    ability_id: 6265
    slot: 11
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 213
    ability_id: 6924
    slot: 12
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 214
    ability_id: 5957
    slot: 13
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 215
    ability_id: 7188
    slot: 14
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 216
    ability_id: 7070
    slot: 15
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 217
    ability_id: 6808
    slot: 16
    caster_handle: 201
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  items {
    handle: 218
    ability_id: 46
    slot: 15
    caster_handle: 201
    level: 1
    cast_range: 0
    channel_time: 3.0
    cooldown_remaining: 99.31002044677734
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
    charges: 1
    secondary_charges: 0
    is_combined_locked: false
  }
  modifiers {
    name: "modifier_wisp_tentacles"
    stack_count: 0
  }
  modifiers {
    name: "modifier_fountain_aura_buff"
    stack_count: 0
    remaining_duration: 2.9666671752929688
  }
  action_type: 1
  is_using_ability: false
  primary_attribute: 0
  is_illusion: false
  respawn_time: 6.0
  buyback_cost: 150
  buyback_cooldown: 0.0
  spell_amplification: 0.016100000590085983
  armor: 0.24000000953674316
  magic_resist: 0.2627500295639038
  evasion: 0.0
  xp_needed_to_level: 230
  ability_points: 1
  reliable_gold: 0
  unreliable_gold: 600
  last_hits: 0
  denies: 0
  net_worth: 650
  strength: 17
  agility: 14
  intelligence: 23
}
units {
  handle: 11
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -34.63691711425781
    y: -31.272918701171875
    z: 256.0
  }
  is_alive: true
  player_id: 5
  bounding_radius: 8
  facing: 222
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 203
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 12
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -34.63691711425781
    y: -31.272918701171875
    z: 256.0
  }
  is_alive: true
  player_id: 5
  bounding_radius: 8
  facing: 222
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 203
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 13
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -32.1628532409668
    y: -29.039138793945312
    z: 256.0
  }
  is_alive: true
  player_id: 5
  bounding_radius: 8
  facing: 222
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 203
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 14
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -34.63691711425781
    y: -31.272918701171875
    z: 256.0
  }
  is_alive: true
  player_id: 5
  bounding_radius: 8
  facing: 222
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 203
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 15
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -34.63691711425781
    y: -31.272918701171875
    z: 256.0
  }
  is_alive: true
  player_id: 5
  bounding_radius: 8
  facing: 222
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 203
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 219
  unit_type: HERO
  name: "npc_dota_hero_wisp"
  team_id: 2
  level: 1
  location {
    x: -7100.0
    y: -6150.00390625
    z: 512.0
  }
  is_alive: true
  player_id: 6
  bounding_radius: 24
  facing: 45
  ground_height: 512
  vision_range_daytime: 1800
  vision_range_nighttime: 800
  health: 582
  health_max: 582
  health_regen: 31.225000381469727
  mana: 351
  mana_max: 351
  mana_regen: 22.209999084472656
  base_movement_speed: 280
  current_movement_speed: 281
  anim_activity: 1500
  anim_cycle: 0.6045328974723816
  base_damage: 43
  base_damage_variance: 4
  bonus_damage: 0
  attack_damage: 43
  attack_range: 575
  attack_speed: 1.1399999856948853
  attack_anim_point: 0.15000000596046448
  attack_acquisition_range: 800
  attack_projectile_speed: 1200
  attacks_per_second: 0
  last_attack_time: 0.0
  bounty_xp: 40
  bounty_gold_min: 0
  bounty_gold_max: 0
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: false
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  abilities {
    handle: 220
    ability_id: 5485
    slot: 0
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 221
    ability_id: 5486
    slot: 1
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 222
    ability_id: 5487
    slot: 2
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 223
    ability_id: 6251
    slot: 3
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 224
    ability_id: 6251
    slot: 4
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 225
    ability_id: 5488
    slot: 5
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 226
    ability_id: 5489
    slot: 6
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 227
    ability_id: 5490
    slot: 7
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: false
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 228
    ability_id: 6017
    slot: 9
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 229
    ability_id: 6253
    slot: 10
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 230
    ability_id: 6265
    slot: 11
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 231
    ability_id: 6924
    slot: 12
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 232
    ability_id: 5957
    slot: 13
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 233
    ability_id: 7188
    slot: 14
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 234
    ability_id: 7070
    slot: 15
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  abilities {
    handle: 235
    ability_id: 6808
    slot: 16
    caster_handle: 219
    level: 0
    cast_range: 0
    channel_time: 0.0
    cooldown_remaining: 0.0
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
  }
  items {
    handle: 236
    ability_id: 46
    slot: 15
    caster_handle: 219
    level: 1
    cast_range: 0
    channel_time: 3.0
    cooldown_remaining: 99.40000915527344
    is_activated: true
    is_toggled: false
    is_in_ability_phase: false
    is_channeling: false
    is_stolen: false
    is_fully_castable: false
    charges: 1
    secondary_charges: 0
    is_combined_locked: false
  }
  modifiers {
    name: "modifier_wisp_tentacles"
    stack_count: 0
  }
  modifiers {
    name: "modifier_fountain_aura_buff"
    stack_count: 0
    remaining_duration: 2.9666671752929688
  }
  action_type: 1
  is_using_ability: false
  primary_attribute: 0
  is_illusion: false
  respawn_time: 6.0
  buyback_cost: 150
  buyback_cooldown: 0.0
  spell_amplification: 0.016100000590085983
  armor: 0.24000000953674316
  magic_resist: 0.2627500295639038
  evasion: 0.0
  xp_needed_to_level: 230
  ability_points: 1
  reliable_gold: 0
  unreliable_gold: 600
  last_hits: 0
  denies: 0
  net_worth: 650
  strength: 17
  agility: 14
  intelligence: 23
}
units {
  handle: 16
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -32.753631591796875
    y: -28.37112045288086
    z: 256.0
  }
  is_alive: true
  player_id: 6
  bounding_radius: 8
  facing: 220
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 221
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 17
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -32.753631591796875
    y: -28.37112045288086
    z: 256.0
  }
  is_alive: true
  player_id: 6
  bounding_radius: 8
  facing: 220
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 221
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 18
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -32.753631591796875
    y: -28.37112045288086
    z: 256.0
  }
  is_alive: true
  player_id: 6
  bounding_radius: 8
  facing: 220
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 221
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 19
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -32.753631591796875
    y: -28.37112045288086
    z: 256.0
  }
  is_alive: true
  player_id: 6
  bounding_radius: 8
  facing: 220
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 221
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
units {
  handle: 20
  unit_type: INVALID
  name: "npc_dota_wisp_spirit"
  team_id: 2
  level: 1
  location {
    x: -32.753631591796875
    y: -28.37112045288086
    z: 256.0
  }
  is_alive: true
  player_id: 6
  bounding_radius: 8
  facing: 220
  ground_height: 256
  vision_range_daytime: 0
  vision_range_nighttime: 0
  health: 100
  health_max: 100
  health_regen: 0.0
  mana: 0
  mana_max: 0
  mana_regen: 0.0
  base_movement_speed: 0
  current_movement_speed: 100
  anim_activity: -1
  anim_cycle: 0.0
  base_damage: 0
  base_damage_variance: 0
  bonus_damage: 0
  attack_damage: 0
  attack_range: 0
  attack_speed: 1.0
  attack_anim_point: 0.0
  attack_acquisition_range: 0
  attack_projectile_speed: 0
  attacks_per_second: 1
  last_attack_time: 0.0
  bounty_xp: 12
  bounty_gold_min: 1
  bounty_gold_max: 1
  is_channeling: false
  is_attack_immune: false
  is_blind: false
  is_block_disabled: false
  is_disarmed: false
  is_evade_disabled: false
  is_hexed: false
  is_invisible: false
  is_invulnerable: true
  is_magic_immune: false
  is_muted: false
  is_nightmared: false
  is_rooted: false
  is_silenced: false
  is_specially_deniable: false
  is_stunned: false
  is_unable_to_miss: false
  has_scepter: false
  modifiers {
    name: "modifier_wisp_spirit_invulnerable"
    stack_count: 0
    ability_handle: 221
    ability_id: 5486
  }
  modifiers {
    name: "modifier_truesight"
    stack_count: 0
    remaining_duration: 0.46666717529296875
  }
  action_type: 2
  is_using_ability: false
  armor: 0.0
  magic_resist: 0.0
}
rune_infos {
  type: -1
  location {
    x: -1712.0
    y: 1184.0
    z: 176.0
  }
  status: 0
  time_since_seen: 78.69914245605469
}
rune_infos {
  type: -1
  location {
    x: 2394.590576171875
    y: -1857.83447265625
    z: 192.0
  }
  status: 0
  time_since_seen: 78.69914245605469
}
rune_infos {
  type: 5
  location {
    x: -4328.07763671875
    y: 1591.9674072265625
    z: 304.0
  }
  status: 0
  time_since_seen: 78.69914245605469
}
rune_infos {
  type: 5
  location {
    x: 4143.92236328125
    y: -1776.0325927734375
    z: 304.0
  }
  status: 0
  time_since_seen: 78.69914245605469
}
rune_infos {
  type: 5
  location {
    x: 3686.955078125
    y: -3624.810791015625
    z: 304.0
  }
  status: 0
  time_since_seen: 78.69914245605469
}
rune_infos {
  type: 5
  location {
    x: -3072.03662109375
    y: 3680.075927734375
    z: 192.0
  }
  status: 0
  time_since_seen: 78.69914245605469
}

Exception on Actor::call; retrying (1/5).:
(<Status.UNKNOWN: 2>, 'Internal Server Error')
Exception on Actor::call; retrying (2/5).:
Multiple exceptions: [Errno 61] Connect call failed ('::1', 13337), [Errno 61] Connect call failed ('127.0.0.1', 13337)
Exception on Actor::call; retrying (3/5).:
Multiple exceptions: [Errno 61] Connect call failed ('::1', 13337), [Errno 61] Connect call failed ('127.0.0.1', 13337)
Exception on Actor::call; retrying (4/5).:
Multiple exceptions: [Errno 61] Connect call failed ('::1', 13337), [Errno 61] Connect call failed ('127.0.0.1', 13337)
Traceback (most recent call last):
  File "client.py", line 406, in <module>
    asyncio.run(main())
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 568, in run_until_complete
    return future.result()
  File "client.py", line 373, in main
    for rewards, log_probs in actor_output:
TypeError: cannot unpack non-iterable NoneType object

Render in Macbook pro

Hi, @Nostrademous :

I use your fork version. It work good for my MacBook Pro. And I want to know, how to render the game? It like headless version.

the AI vs AI play mode

Hi guys,

I really curious about how some specific game modes are created in dotaservice (eg, the scripted ai vs scripted ai mode, the scripted ai vs buildin ai mode)? I go through some related code, maybe the game mode is specified in

args = [
script_path,
# '-botworldstatesocket_threaded',
'-botworldstatetosocket_frames {}'.format(self.ticks_per_observation),
'-botworldstatetosocket_radiant {}'.format(self.PORT_WORLDSTATE_RADIANT),
'-botworldstatetosocket_dire {}'.format(self.PORT_WORLDSTATE_DIRE),
'-con_logfile scripts/vscripts/bots/{}'.format(self.CONSOLE_LOG_FILENAME),
'-con_timestamp',
'-console',
'-insecure',
'-noip',
'-nowatchdog', # WatchDog will quit the game if e.g. the lua api takes a few seconds.
'+clientport 27006', # Relates to steam client.
'+dota_1v1_skip_strategy 1',
'+dota_surrender_on_disconnect 0',
'+host_timescale {}'.format(self.host_timescale),
'+hostname dotaservice',
'+sv_cheats 1',
'+sv_hibernate_when_empty 0',
'+tv_delay 0 ',
'+tv_enable 1',
'+tv_title {}'.format(self.game_id),
'+tv_autorecord 1',
'+tv_transmitall 1', # TODO(tzaman): what does this do exactly?
]
if self.host_mode == HostMode.Value('DEDICATED'):
args.append('-dedicated')
if self.host_mode == HostMode.Value('DEDICATED') or \
self.host_mode == HostMode.Value('GUI'):
args.append('-fill_with_bots')
args.extend(['+map', 'start gamemode {}'.format(self.game_mode)])
args.append('+sv_lan 1')
if self.host_mode == HostMode.Value('GUI_MENU'):
args.append('+sv_lan 0')
I also notice the self.game_mode enum definition, but according to https://dota2.gamepedia.com/Game_modes#Captains_Draft , I don't find the scripted ai play mode.

before come to dotaservice repo, I has googled a lot and try to find the solution to create the offline scripted ai vs scripted ai mode in lobby, but it seems current dota2 client disable the offline lobby creation and I can't get round this issue.

so I wonder how you guys slove this problem and if it is sloved by the command line paramter passed to dota2 client, where do you find the corresponding wiki/doc?

Thanks!

Dota2 Docker Error

With patch 7.21 I tried to rebuild the dota2 docker container after deleting the old image and get an error. Not sure the cause:

Success! App '570' fully installed.
Updating Workshop items for App '570'.
 Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
 Update state (0x3) reconfiguring, progress: 0.00 (0 / 0)
contentmanifest.cpp (650) : Assertion Failed: !m_bIsFinalized
 Update state (0x61) downloading, progress: 21.09 (31200656 / 147970880)
 Update state (0x61) downloading, progress: 48.39 (71596542 / 147970880)
 Update state (0x61) downloading, progress: 64.85 (95956964 / 147970880)
 Update state (0x61) downloading, progress: 81.15 (120074212 / 147970880)
 Update state (0x61) downloading, progress: 98.58 (145873728 / 147970880)
Error processing tar file(exit status 1): write /root/Steam/steamapps/common/dota 2 beta/game/dota/pak01_144.vpk: no space left on device

Command was:
docker build -t dota . -f docker/Dockerfile-dota --build-arg user=$STEAM_ID --build-arg pwd=$STEAM_PWD --build-arg guard=<CODE>

I'm surprised by the no space left on device

I have over 700GB left on my laptop's SSD Flash drive so... must be docker container issue

Dotaservice deadlocks itself

Agent:

$ tzaman@Tims-Mac-Pro dotaclient (master) $ kubectl logs dotaservice-deployment-8c499c96-2mgbd agent
2019-01-06 21:18:41,153 INFO     setup_model_cb(host=rmq.default.svc.cluster.local, port=5672)
2019-01-06 21:18:41,283 INFO     Received new model: version=284, size=1207326b
2019-01-06 21:18:41,287 INFO     Updated weights to version 284
2019-01-06 21:18:41,288 INFO     === Starting Episode 0.
2019-01-06 21:18:41,288 INFO     Starting game.
2019-01-06 21:18:41,290 ERROR    error on dispatch
Traceback (most recent call last):
  File "/usr/lib/python3.7/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.7/asyncio/base_events.py", line 573, in run_until_complete
    return future.result()
  File "agent.py", line 515, in main
    await game.play()
  File "agent.py", line 430, in play
    response = await asyncio.wait_for(self.dota_service.reset(self.config), timeout=120)
  File "/usr/lib/python3.7/asyncio/tasks.py", line 416, in wait_for
    return fut.result()
  File "/root/.local/lib/python3.7/site-packages/grpclib/client.py", line 588, in __call__
    await stream.send_message(message, end=True)
  File "/root/.local/lib/python3.7/site-packages/grpclib/client.py", line 163, in send_message
    await self.send_request()
  File "/root/.local/lib/python3.7/site-packages/grpclib/client.py", line 132, in send_request
    protocol = await self._channel.__connect__()
  File "/root/.local/lib/python3.7/site-packages/grpclib/client.py", line 477, in __connect__
    self._protocol = await self._create_connection()
  File "/root/.local/lib/python3.7/site-packages/grpclib/client.py", line 465, in _create_connection
    ssl=self._ssl)
  File "/usr/lib/python3.7/asyncio/base_events.py", line 948, in create_connection
    raise exceptions[0]
  File "/usr/lib/python3.7/asyncio/base_events.py", line 935, in create_connection
    await self.sock_connect(sock, address)
  File "/usr/lib/python3.7/asyncio/selector_events.py", line 475, in sock_connect
    return await fut
  File "/usr/lib/python3.7/asyncio/selector_events.py", line 505, in _sock_connect_cb
    raise OSError(err, f'Connect call failed {address}')
ConnectionRefusedError: [Errno 111] Connect call failed ('127.0.0.1', 13337)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/root/.local/lib/python3.7/site-packages/aioamqp/protocol.py", line 333, in run
    yield from self.dispatch_frame()
  File "/root/.local/lib/python3.7/site-packages/aioamqp/protocol.py", line 288, in dispatch_frame
    yield from channel.dispatch_frame(frame)
  File "/root/.local/lib/python3.7/site-packages/aioamqp/channel.py", line 111, in dispatch_frame
    yield from methods[(frame.class_id, frame.method_id)](frame)
  File "/root/.local/lib/python3.7/site-packages/aioamqp/channel.py", line 631, in basic_deliver
    content_body_frame = yield from self.protocol.get_frame()
  File "/root/.local/lib/python3.7/site-packages/aioamqp/protocol.py", line 264, in get_frame
    yield from frame.read_frame()
  File "/root/.local/lib/python3.7/site-packages/aioamqp/frame.py", line 462, in read_frame
    payload_data = yield from self.reader.readexactly(self.frame_length)
  File "/usr/lib/python3.7/asyncio/streams.py", line 679, in readexactly
    await self._wait_for_data('readexactly')
  File "/usr/lib/python3.7/asyncio/streams.py", line 473, in _wait_for_data
    await self._waiter
concurrent.futures._base.CancelledError

Dotaservice (0.3.2):

$ tzaman@Tims-Mac-Pro dotaclient (master) $ kubectl logs dotaservice-deployment-8c499c96-2mgbd dotaservice
2019-01-06 21:18:41,932 INFO     DotaService 0.3.2 serving on :13337

where does the proto files come from?

I was parsing dota2 replays using clarity. And I found proto files in this project useful, especially meaning of enums.
But some info is still missing, for example the meaning and range of rune types.
Thus I am curious where does this info comes from and if I can get more/latest info by my self.

Minimal Working Example of client.py

The example client.py script in the README.md (copied below) has a number of ambiguous and problematic aspects. Where should this script be located within the repo? Should protobuf be replaced with protos? Why does my IDS say Unresolved reference 'await'?

Could we have a minimal working example? I discovered this old example, but it appears to have been removed.

from grpclib.client import Channel
from protobuf.DotaService_grpc import DotaServiceStub
from protobuf.DotaService_pb2 import Action
from protobuf.DotaService_pb2 import Config

# Connect to the DotaService.
env = DotaServiceStub(Channel('127.0.0.1', 13337))

# Get the initial observation.
observation = await env.reset(Config())
for i in range(8):
    # Sample an action from the action protobuf
    action = Action.MoveToLocation(x=.., y=.., z=..)
    # Take an action, returning the resulting observation.
    observation = await env.step(action)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.