option optimize_for = SPEED;
option cc_generic_services = false;

message CMsgBotWorldState {
	message Vector {
		required float x = 1;
		required float y = 2;
		required float z = 3;
	}

	message Player {
		optional int32 player_id = 1;
		optional uint32 hero_id = 2;
		optional bool is_alive = 3;
		optional float respawn_time = 4;
		optional uint32 kills = 5;
		optional uint32 deaths = 6;
		optional uint32 assists = 7;
		optional uint32 team_id = 8;
	}

	message Ability {
		optional uint32 handle = 1;
		optional uint32 ability_id = 2;
		optional uint32 slot = 3;
		optional uint32 caster_handle = 5;
		optional uint32 level = 6;
		optional uint32 cast_range = 10;
		optional float channel_time = 11;
		optional float cooldown_remaining = 12 [default = 0];
		optional bool is_activated = 20;
		optional bool is_toggled = 21;
		optional bool is_in_ability_phase = 22;
		optional bool is_channeling = 23;
		optional bool is_stolen = 24;
		optional bool is_fully_castable = 25;
		optional uint32 charges = 30;
		optional uint32 secondary_charges = 31;
		optional bool is_combined_locked = 40;
		optional int32 power_treads_stat = 50 [default = -1];
	}

	message DroppedItem {
		optional uint32 item_id = 1;
		optional .CMsgBotWorldState.Vector location = 2;
	}

	message RuneInfo {
		optional int32 type = 1;
		optional .CMsgBotWorldState.Vector location = 2;
		optional uint32 status = 3;
		optional float time_since_seen = 4;
	}

	message TeleportInfo {
		optional int32 player_id = 1;
		optional .CMsgBotWorldState.Vector location = 2;
		optional float time_remaining = 3;
	}

	message Modifier {
		optional string name = 1;
		optional uint32 stack_count = 2;
		optional uint32 ability_handle = 3;
		optional uint32 ability_id = 4;
		optional float remaining_duration = 5;
		repeated uint32 auxiliary_units_handles = 6;
	}

	message LinearProjectile {
		optional uint32 handle = 1;
		optional uint32 caster_handle = 2;
		optional .CMsgBotWorldState.UnitType caster_unit_type = 9 [default = INVALID];
		optional int32 caster_player_id = 3;
		optional uint32 ability_handle = 4;
		optional uint32 ability_id = 5;
		optional .CMsgBotWorldState.Vector location = 6;
		optional .CMsgBotWorldState.Vector velocity = 7;
		optional uint32 radius = 8;
	}

	message TrackingProjectile {
		optional uint32 caster_handle = 1;
		optional .CMsgBotWorldState.UnitType caster_unit_type = 9 [default = INVALID];
		optional int32 caster_player_id = 2;
		optional uint32 ability_handle = 3;
		optional uint32 ability_id = 4;
		optional .CMsgBotWorldState.Vector location = 5;
		optional uint32 velocity = 6;
		optional bool is_dodgeable = 7;
		optional bool is_attack = 8;
	}

	message AvoidanceZone {
		optional .CMsgBotWorldState.Vector location = 1;
		optional uint32 caster_handle = 2;
		optional .CMsgBotWorldState.UnitType caster_unit_type = 7 [default = INVALID];
		optional int32 caster_player_id = 3;
		optional uint32 ability_handle = 4;
		optional uint32 ability_id = 5;
		optional uint32 radius = 6;
	}

	message Courier {
		optional uint32 handle = 1;
		optional .CMsgBotWorldState.CourierState state = 2 [default = COURIER_STATE_INIT];
		optional int32 player_id = 3;
	}

	message EventAbility {
		optional uint32 ability_id = 1;
		optional int32 player_id = 2;
		optional uint32 unit_handle = 3;
		optional .CMsgBotWorldState.Vector location = 4;
		optional bool is_channel_start = 5;
	}

	message EventDamage {
		optional uint32 damage = 1;
		optional int32 victim_player_id = 2;
		optional uint32 victim_unit_handle = 3;
		optional int32 attacker_player_id = 4;
		optional uint32 attacker_unit_handle = 5;
		optional uint32 ability_id = 6;
	}

	message EventCourierKilled {
		optional uint32 team_id = 1;
		optional uint32 courier_unit_handle = 2;
		optional int32 killer_player_id = 3;
		optional uint32 killer_unit_handle = 4;
	}

	message EventRoshanKilled {
		optional int32 killer_player_id = 1;
		optional uint32 killer_unit_handle = 2;
	}

	message EventTree {
		optional uint32 tree_id = 1;
		optional bool destroyed = 2;
		optional bool respawned = 3;
		optional .CMsgBotWorldState.Vector location = 4;
		optional bool delayed = 5;
	}

	message Unit {
		optional uint32 handle = 1;
		optional .CMsgBotWorldState.UnitType unit_type = 2 [default = INVALID];
		optional string name = 3;
		optional uint32 team_id = 4;
		optional uint32 level = 5;
		optional .CMsgBotWorldState.Vector location = 6;
		optional bool is_alive = 7;
		optional int32 player_id = 8;
		optional int32 bounding_radius = 10;
		optional int32 facing = 11;
		optional uint32 ground_height = 12;
		optional uint32 vision_range_daytime = 15;
		optional uint32 vision_range_nighttime = 16;
		optional int32 health = 20;
		optional int32 health_max = 21;
		optional float health_regen = 22;
		optional int32 mana = 25;
		optional int32 mana_max = 26;
		optional float mana_regen = 27;
		optional int32 base_movement_speed = 30;
		optional int32 current_movement_speed = 31;
		optional int32 anim_activity = 35;
		optional float anim_cycle = 36;
		optional int32 base_damage = 40;
		optional int32 base_damage_variance = 41;
		optional int32 bonus_damage = 42;
		optional int32 attack_damage = 43;
		optional int32 attack_range = 44;
		optional float attack_speed = 45;
		optional float attack_anim_point = 46;
		optional int32 attack_acquisition_range = 47;
		optional int32 attack_projectile_speed = 48;
		optional uint32 attack_target_handle = 49;
		optional string attack_target_name = 52;
		optional int32 attacks_per_second = 50 [default = -1];
		optional float last_attack_time = 51 [default = -1];
		optional uint32 bounty_xp = 60;
		optional uint32 bounty_gold_min = 61;
		optional uint32 bounty_gold_max = 62;
		optional bool is_channeling = 65;
		optional uint32 active_ability_handle = 66;
		optional bool is_attack_immune = 70;
		optional bool is_blind = 71;
		optional bool is_block_disabled = 72;
		optional bool is_disarmed = 73;
		optional bool is_dominated = 74;
		optional bool is_evade_disabled = 75;
		optional bool is_hexed = 76;
		optional bool is_invisible = 77;
		optional bool is_invulnerable = 78;
		optional bool is_magic_immune = 79;
		optional bool is_muted = 80;
		optional bool is_nightmared = 82;
		optional bool is_rooted = 83;
		optional bool is_silenced = 84;
		optional bool is_specially_deniable = 85;
		optional bool is_stunned = 86;
		optional bool is_unable_to_miss = 87;
		optional bool has_scepter = 88;
		repeated .CMsgBotWorldState.Ability abilities = 90;
		repeated .CMsgBotWorldState.Ability items = 91;
		repeated .CMsgBotWorldState.Modifier modifiers = 92;
		repeated .CMsgBotWorldState.TrackingProjectile incoming_tracking_projectiles = 93;
		optional uint32 action_type = 100;
		optional uint32 ability_target_handle = 101;
		optional string ability_target_name = 103;
		optional bool is_using_ability = 102;
		optional uint32 primary_attribute = 110;
		optional bool is_illusion = 111;
		optional float respawn_time = 112;
		optional uint32 buyback_cost = 113;
		optional float buyback_cooldown = 114;
		optional float spell_amplification = 115;
		optional float armor = 116;
		optional float magic_resist = 117;
		optional float evasion = 118;
		optional uint32 xp_needed_to_level = 120;
		optional uint32 ability_points = 121;
		optional int32 reliable_gold = 122 [default = -1];
		optional int32 unreliable_gold = 123 [default = -1];
		optional uint32 last_hits = 124;
		optional uint32 denies = 125;
		optional uint32 net_worth = 126;
		optional uint32 strength = 127;
		optional uint32 agility = 128;
		optional uint32 intelligence = 129;
		optional float remaining_lifespan = 130;
		optional bool flying_courier = 140;
		optional float shrine_cooldown = 150;
		optional bool is_shrine_healing = 151;
	}

	message Actions {
		message OceanAnnotation {
			message Hero {
				required int32 playerID = 1;
				optional float valueFunction = 2;
				optional float actionLogp = 3;
				optional float reward = 4;
				repeated int32 internalAction = 5;
				optional string actionName = 6;
				optional bytes detailedStats = 7;
			}

			repeated .CMsgBotWorldState.Actions.OceanAnnotation.Hero heroes = 1;
			optional string agentID = 5;
			repeated float rewards = 6;
			repeated string reward_names = 7;
		}

		message Header {
			optional float startTime = 1;
			optional string name = 2;
		}

		optional float dota_time = 1 [default = -100];
		repeated .CMsgBotWorldState.Action actions = 2;
		optional string extraData = 3;
		optional .CMsgBotWorldState.Actions.OceanAnnotation oceanAnnotation = 4;
		optional .CMsgBotWorldState.Actions.Header header = 5;
	}

	message Action {
		message MoveToLocation {
			repeated int32 units = 1;
			required .CMsgBotWorldState.Vector location = 2;
		}

		message MoveToTarget {
			repeated int32 units = 1;
			required int32 target = 2;
		}

		message AttackMove {
			repeated int32 units = 1;
			required .CMsgBotWorldState.Vector location = 2;
		}

		message AttackTarget {
			repeated int32 units = 1;
			required int32 target = 2;
			optional bool once = 3;
		}

		message HoldLocation {
			repeated int32 units = 1;
		}

		message Stop {
			repeated int32 units = 1;
		}

		message CastLocation {
			repeated int32 units = 1;
			required int32 abilitySlot = 2;
			required .CMsgBotWorldState.Vector location = 3;
		}

		message CastTarget {
			repeated int32 units = 1;
			required int32 abilitySlot = 2;
			required int32 target = 3;
		}

		message CastTree {
			repeated int32 units = 1;
			required int32 abilitySlot = 2;
			required int32 tree = 3;
		}

		message Cast {
			repeated int32 units = 1;
			required int32 abilitySlot = 2;
		}

		message CastToggle {
			repeated int32 units = 1;
			required int32 abilitySlot = 2;
		}

		message TrainAbility {
			required string ability = 1;
			optional int32 level = 2;
			optional int32 unit = 3;
		}

		message DropItem {
			optional int32 unit = 1;
			optional int32 slot = 2;
			optional .CMsgBotWorldState.Vector location = 3;
		}

		message PickUpItem {
			optional int32 unit = 1;
			optional int32 itemId = 2;
		}

		message PurchaseItem {
			optional int32 item = 1;
			optional string item_name = 2;
			optional int32 unit = 3;
		}

		message SellItem {
			optional int32 item = 1;
			optional int32 slot = 2;
			optional int32 unit = 3;
		}

		message SwapItems {
			required int32 slot_a = 1;
			required int32 slot_b = 2;
			optional int32 unit = 3;
		}

		message DisassembleItem {
			required int32 slot = 1;
		}

		message SetCombineLockItem {
			required int32 slot = 1;
			required bool value = 2;
		}

		message PickupRune {
			repeated int32 units = 1;
			required int32 rune = 2;
		}

		message Chat {
			required string message = 1;
			required bool to_allchat = 2;
		}

		message UseShrine {
			repeated int32 units = 1;
			required int32 shrine = 2;
		}

		message Courier {
			required int32 unit = 1;
			required int32 courier = 2;
			required int32 action = 3;
		}

		message GetActualIncomingDamage {
			required int32 unit = 1;
			required float nDamage = 2;
			required int32 nDamageType = 3;
		}

		message GetEstimatedDamageToTarget {
			required int32 unit = 1;
			required bool bCurrentlyAvailable = 2;
			required int32 hTarget = 3;
			required float fDuration = 4;
			required int32 nDamageTypes = 5;
		}

		message Glyph {
			required int32 unit = 1;
		}

		message SoftReset {
			optional string minigameConfig = 1;
			optional string snapshotData = 2;
		}

		message Buyback {
			required int32 unit = 1;
		}

		message ScriptingDebugDrawText {
			required .CMsgBotWorldState.Vector origin = 1;
			required string text = 2;
			required bool bViewCheck = 3;
			required float duration = 4;
		}

		message ScriptingDebugDrawLine {
			required .CMsgBotWorldState.Vector origin = 1;
			required .CMsgBotWorldState.Vector target = 2;
			required int32 r = 3;
			required int32 g = 4;
			required int32 b = 5;
			required bool ztest = 6;
			required float duration = 7;
		}

		message ScriptingDebugDrawScreenText {
			required float x = 1;
			required float y = 2;
			required int32 lineOffset = 3;
			required string text = 4;
			required int32 r = 5;
			required int32 g = 6;
			required int32 b = 7;
			required int32 a = 8;
			required float duration = 9;
		}

		message ScriptingDebugScreenTextPretty {
			required float x = 1;
			required float y = 2;
			required int32 lineOffset = 3;
			required string text = 4;
			required int32 r = 5;
			required int32 g = 6;
			required int32 b = 7;
			required int32 a = 8;
			required float duration = 9;
			required string font = 10;
			required float size = 11;
			required bool bBold = 12;
		}

		message ScriptingDebugDrawBox {
			required .CMsgBotWorldState.Vector origin = 1;
			required .CMsgBotWorldState.Vector minimum = 2;
			required .CMsgBotWorldState.Vector maximum = 3;
			required int32 r = 4;
			required int32 g = 5;
			required int32 b = 6;
			required int32 a = 7;
			required float duration = 8;
		}

		message ScriptingDebugDrawCircle {
			required .CMsgBotWorldState.Vector center = 1;
			required .CMsgBotWorldState.Vector vRgb = 2;
			required float a = 3;
			required float rad = 4;
			required bool ztest = 5;
			required float duration = 6;
		}

		message ScriptingDebugDrawClear {
		}

		message OceanWinGame {
			required string team = 1;
			optional float reward = 2;
		}

		message OceanReplayCorrectTime {
			required float delta = 1;
		}

		enum Type {
			DOTA_UNIT_ORDER_NONE = 0;
			DOTA_UNIT_ORDER_MOVE_TO_POSITION = 1;
			DOTA_UNIT_ORDER_MOVE_TO_TARGET = 2;
			DOTA_UNIT_ORDER_ATTACK_MOVE = 3;
			DOTA_UNIT_ORDER_ATTACK_TARGET = 4;
			DOTA_UNIT_ORDER_CAST_POSITION = 5;
			DOTA_UNIT_ORDER_CAST_TARGET = 6;
			DOTA_UNIT_ORDER_CAST_TARGET_TREE = 7;
			DOTA_UNIT_ORDER_CAST_NO_TARGET = 8;
			DOTA_UNIT_ORDER_CAST_TOGGLE = 9;
			DOTA_UNIT_ORDER_HOLD_POSITION = 10;
			DOTA_UNIT_ORDER_TRAIN_ABILITY = 11;
			DOTA_UNIT_ORDER_DROP_ITEM = 12;
			DOTA_UNIT_ORDER_GIVE_ITEM = 13;
			DOTA_UNIT_ORDER_PICKUP_ITEM = 14;
			DOTA_UNIT_ORDER_PICKUP_RUNE = 15;
			DOTA_UNIT_ORDER_PURCHASE_ITEM = 16;
			DOTA_UNIT_ORDER_SELL_ITEM = 17;
			DOTA_UNIT_ORDER_DISASSEMBLE_ITEM = 18;
			DOTA_UNIT_ORDER_MOVE_ITEM = 19;
			DOTA_UNIT_ORDER_CAST_TOGGLE_AUTO = 20;
			DOTA_UNIT_ORDER_STOP = 21;
			DOTA_UNIT_ORDER_TAUNT = 22;
			DOTA_UNIT_ORDER_BUYBACK = 23;
			DOTA_UNIT_ORDER_GLYPH = 24;
			DOTA_UNIT_ORDER_EJECT_ITEM_FROM_STASH = 25;
			DOTA_UNIT_ORDER_CAST_RUNE = 26;
			DOTA_UNIT_ORDER_PING_ABILITY = 27;
			DOTA_UNIT_ORDER_MOVE_TO_DIRECTION = 28;
			DOTA_UNIT_ORDER_PATROL = 29;
			DOTA_UNIT_ORDER_VECTOR_TARGET_POSITION = 30;
			DOTA_UNIT_ORDER_RADAR = 31;
			DOTA_UNIT_ORDER_SET_ITEM_COMBINE_LOCK = 32;
			DOTA_UNIT_ORDER_CONTINUE = 33;
			ACTION_CHAT = 40;
			ACTION_SWAP_ITEMS = 41;
			ACTION_USE_SHRINE = 42;
			ACTION_COURIER = 43;
			RPC_GET_ACTUAL_INCOMING_DAMAGE = 44;
			RPC_GET_ESTIMATED_DAMAGE_TO_TARGET = 45;
			OCEAN_FULL_UPDATE = 50;
			OCEAN_RELOAD_CODE = 51;
			OCEAN_SOFT_RESET = 52;
			OCEAN_HOLD_FRAMESKIP = 54;
			OCEAN_WIN_GAME = 63;
			OCEAN_REPLAY_CORRECT_TIME = 64;
			SCRIPTING_DEBUG_DRAW_TEXT = 55;
			SCRIPTING_DEBUG_DRAW_LINE = 56;
			SCRIPTING_DOTA_UNIT_ORDER_MOVE_TO_POSITION = 57;
			SCRIPTING_DEBUG_DRAW_SCREEN_TEXT = 58;
			SCRIPTING_DEBUG_DRAW_BOX = 59;
			SCRIPTING_DEBUG_DRAW_CIRCLE = 60;
			SCRIPTING_DEBUG_DRAW_CLEAR = 61;
			SCRIPTING_DEBUG_SCREEN_TEXT_PRETTY = 65;
			DOTA_UNIT_ORDER_MOVE_DIRECTLY = 62;
		}

		required .CMsgBotWorldState.Action.Type actionType = 1 [default = DOTA_UNIT_ORDER_NONE];
		optional int32 player = 2 [default = -1];
		optional int32 actionID = 4 [default = -1];
		optional int32 actionDelay = 10 [default = 0];
		oneof ActionData {
			.CMsgBotWorldState.Action.MoveToLocation moveToLocation = 101;
			.CMsgBotWorldState.Action.MoveToTarget moveToTarget = 102;
			.CMsgBotWorldState.Action.AttackMove attackMove = 103;
			.CMsgBotWorldState.Action.AttackTarget attackTarget = 104;
			.CMsgBotWorldState.Action.CastLocation castLocation = 105;
			.CMsgBotWorldState.Action.CastTarget castTarget = 106;
			.CMsgBotWorldState.Action.CastTree castTree = 107;
			.CMsgBotWorldState.Action.Cast cast = 108;
			.CMsgBotWorldState.Action.CastToggle castToggle = 109;
			.CMsgBotWorldState.Action.HoldLocation holdLocation = 110;
			.CMsgBotWorldState.Action.TrainAbility trainAbility = 111;
			.CMsgBotWorldState.Action.DropItem dropItem = 112;
			.CMsgBotWorldState.Action.PickUpItem pickUpItem = 114;
			.CMsgBotWorldState.Action.PickupRune pickupRune = 115;
			.CMsgBotWorldState.Action.PurchaseItem purchaseItem = 116;
			.CMsgBotWorldState.Action.SellItem sellItem = 117;
			.CMsgBotWorldState.Action.DisassembleItem disassembleItem = 118;
			.CMsgBotWorldState.Action.SetCombineLockItem setCombineLockItem = 132;
			.CMsgBotWorldState.Action.Stop stop = 121;
			.CMsgBotWorldState.Action.Chat chat = 140;
			.CMsgBotWorldState.Action.SwapItems swapItems = 141;
			.CMsgBotWorldState.Action.UseShrine useShrine = 142;
			.CMsgBotWorldState.Action.Courier courier = 143;
			.CMsgBotWorldState.Action.GetActualIncomingDamage getActualIncomingDamage = 144;
			.CMsgBotWorldState.Action.GetEstimatedDamageToTarget getEstimatedDamageToTarget = 145;
			.CMsgBotWorldState.Action.Glyph glyph = 146;
			.CMsgBotWorldState.Action.SoftReset softReset = 148;
			.CMsgBotWorldState.Action.Buyback buyback = 149;
			.CMsgBotWorldState.Action.ScriptingDebugDrawText scriptingDebugDrawText = 150;
			.CMsgBotWorldState.Action.ScriptingDebugDrawLine scriptingDebugDrawLine = 151;
			.CMsgBotWorldState.Action.ScriptingDebugDrawScreenText scriptingDebugDrawScreenText = 152;
			.CMsgBotWorldState.Action.ScriptingDebugDrawBox scriptingDebugDrawBox = 153;
			.CMsgBotWorldState.Action.ScriptingDebugDrawCircle scriptingDebugDrawCircle = 154;
			.CMsgBotWorldState.Action.ScriptingDebugDrawClear scriptingDebugDrawClear = 155;
			.CMsgBotWorldState.Action.ScriptingDebugScreenTextPretty scriptingDebugScreenTextPretty = 159;
			.CMsgBotWorldState.Action.MoveToLocation moveDirectly = 156;
			.CMsgBotWorldState.Action.OceanWinGame oceanWinGame = 157;
			.CMsgBotWorldState.Action.OceanReplayCorrectTime oceanReplayCorrectTime = 158;
		}
	}

	enum UnitType {
		INVALID = 0;
		HERO = 1;
		CREEP_HERO = 2;
		LANE_CREEP = 3;
		JUNGLE_CREEP = 4;
		ROSHAN = 5;
		TOWER = 6;
		BARRACKS = 7;
		SHRINE = 8;
		FORT = 9;
		BUILDING = 10;
		COURIER = 11;
		WARD = 12;
	}

	enum CourierState {
		COURIER_STATE_INIT = -1;
		COURIER_STATE_IDLE = 0;
		COURIER_STATE_AT_BASE = 1;
		COURIER_STATE_MOVING = 2;
		COURIER_STATE_DELIVERING_ITEMS = 3;
		COURIER_STATE_RETURNING_TO_BASE = 4;
		COURIER_STATE_DEAD = 5;
	}

	optional uint32 team_id = 1;
	optional float game_time = 2;
	optional float dota_time = 3;
	optional uint32 game_state = 4;
	optional uint32 hero_pick_state = 5;
	optional float time_of_day = 6;
	optional float glyph_cooldown = 7;
	optional uint32 glyph_cooldown_enemy = 8;
	repeated .CMsgBotWorldState.Player players = 10;
	repeated .CMsgBotWorldState.Unit units = 11;
	repeated .CMsgBotWorldState.DroppedItem dropped_items = 12;
	repeated .CMsgBotWorldState.RuneInfo rune_infos = 13;
	repeated .CMsgBotWorldState.TeleportInfo incoming_teleports = 14;
	repeated .CMsgBotWorldState.LinearProjectile linear_projectiles = 15;
	repeated .CMsgBotWorldState.AvoidanceZone avoidance_zones = 16;
	repeated .CMsgBotWorldState.Courier couriers = 17;
	repeated .CMsgBotWorldState.EventAbility ability_events = 20;
	repeated .CMsgBotWorldState.EventDamage damage_events = 21;
	repeated .CMsgBotWorldState.EventCourierKilled courier_killed_events = 22;
	repeated .CMsgBotWorldState.EventRoshanKilled roshan_killed_events = 23;
	repeated .CMsgBotWorldState.EventTree tree_events = 24;
}

