import "valveextensions.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

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

	message Player {
		optional int32 player_id = 1 [(map_key) = true];
		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;
		optional uint32 primary_unit_handle = 9 [default = 4294967295];
		optional int32 mmr = 10;
		optional .CMsgBotWorldState.Vector location = 11;
	}

	message Ability {
		optional uint32 handle = 1 [(map_key) = true];
		optional uint32 ability_id = 2;
		optional uint32 slot = 3;
		optional uint32 caster_handle = 5 [default = 4294967295];
		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 uint32 handle = 7 [(map_key) = true];
		optional string name = 1;
		optional uint32 stack_count = 2;
		optional uint32 ability_handle = 3 [default = 4294967295];
		optional uint32 ability_id = 4;
		optional float remaining_duration = 5;
		repeated uint32 auxiliary_units_handles = 6;
	}

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

	message TrackingProjectile {
		optional uint32 handle = 10 [(map_key) = true];
		optional uint32 caster_handle = 1 [default = 4294967295];
		optional .CMsgBotWorldState.UnitType caster_unit_type = 9 [default = INVALID];
		optional int32 caster_player_id = 2;
		optional uint32 ability_handle = 3 [default = 4294967295];
		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 [default = 4294967295];
		optional .CMsgBotWorldState.UnitType caster_unit_type = 7 [default = INVALID];
		optional int32 caster_player_id = 3;
		optional uint32 ability_handle = 4 [default = 4294967295];
		optional uint32 ability_id = 5;
		optional uint32 radius = 6;
	}

	message Courier {
		optional uint32 handle = 1 [(map_key) = true];
		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 [default = 4294967295];
		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 [default = 4294967295];
		optional int32 attacker_player_id = 4;
		optional uint32 attacker_unit_handle = 5 [default = 4294967295];
		optional uint32 ability_id = 6;
	}

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

	message EventRoshanKilled {
		optional int32 killer_player_id = 1;
		optional uint32 killer_unit_handle = 2 [default = 4294967295];
	}

	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 [(map_key) = true];
		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 [default = 4294967295];
		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 [default = 4294967295];
		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;
		optional bool is_specially_undeniable = 94;
		repeated .CMsgBotWorldState.Ability abilities = 90 [(map_field) = true];
		repeated .CMsgBotWorldState.Ability items = 91 [(map_field) = true];
		repeated .CMsgBotWorldState.Modifier modifiers = 92 [(map_field) = true];
		repeated .CMsgBotWorldState.TrackingProjectile incoming_tracking_projectiles = 93 [(map_field) = true];
		optional uint32 action_type = 100;
		optional uint32 ability_target_handle = 101 [default = 4294967295];
		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;
	}

	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 [(map_field) = true];
	repeated .CMsgBotWorldState.Unit units = 11 [(map_field) = true];
	repeated .CMsgBotWorldState.DroppedItem dropped_items = 12 [(diff_encode_field) = 112];
	repeated int32 dropped_items_deltas = 112;
	repeated .CMsgBotWorldState.RuneInfo rune_infos = 13 [(diff_encode_field) = 113];
	repeated int32 rune_infos_deltas = 113;
	repeated .CMsgBotWorldState.TeleportInfo incoming_teleports = 14;
	repeated .CMsgBotWorldState.LinearProjectile linear_projectiles = 15 [(map_field) = true];
	repeated .CMsgBotWorldState.AvoidanceZone avoidance_zones = 16;
	repeated .CMsgBotWorldState.Courier couriers = 17 [(map_field) = true];
	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;
}
