import "steammessages.proto";
import "dota_shared_enums.proto";
import "dota_gcmessages_common.proto";
import "econ_gcmessages.proto";
import "network_connection.proto";
import "dota_gcmessages_common_match_management.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

enum EPoorNetworkConditionsType {
	k_EPoorNetworkConditions_None = 0;
	k_EPoorNetworkConditions_Unknown = 1;
	k_EPoorNetworkConditions_MassDisconnect = 2;
	k_EPoorNetworkConditions_ExcessBadQosIntervals = 3;
}

enum EAbilityAbuseType {
	k_EAbilityAbuseType_None = 0;
	k_EAbilityAbuseType_Io_Relocate = 1;
	k_EAbilityAbuseType_Chen_Test_Of_Faith = 2;
	k_EAbilityAbuseType_Bane_Nightmare = 3;
	k_EAbilityAbuseType_Bloodseeker_Bloodrage = 4;
	k_EAbilityAbuseType_Outworld_Astral_Imprisonment = 5;
	k_EAbilityAbuseType_Shadow_Demon_Disruption = 6;
	k_EAbilityAbuseType_Grimstroke_InkSwell = 7;
}

enum EIntentionalFeedingType {
	k_EIntentionalFeedingType_None = 0;
	k_EIntentionalFeedingType_ExcessiveDeaths = 1;
	k_EIntentionalFeedingType_MultipleCourierPurchases = 2;
	k_EIntentionalFeedingType_MultipleCourierDeaths = 4;
	k_EIntentionalFeedingType_LowActivity = 8;
	k_EIntentionalFeedingType_LowDamage = 16;
	k_EIntentionalFeedingType_HighUnspentGold = 32;
	k_EIntentionalFeedingType_SoldTooMuchItemValue = 64;
	k_EIntentionalFeedingType_TooManyDroppedItems = 128;
	k_EIntentionalFeedingType_ExcessiveTowerDamage = 256;
	k_EIntentionalFeedingType_LastHitsDenies = 512;
	k_EIntentionalFeedingType_XPPM = 1024;
	k_EIntentionalFeedingType_SuspiciousOrders = 2048;
}

enum ESuspiciousActivity {
	k_ESuspiciousActivity_VAC_MultipleInstances = 1;
	k_ESuspiciousActivity_IntentionalFeeding = 100;
	k_ESuspiciousActivity_SuspectedBotFarming = 101;
	k_ESuspiciousActivity_AttemptedToCrashServer = 102;
}

enum ESuspiciousBuildType {
	k_ESuspiciousBuildType_None = 0;
	k_ESuspiciousBuildType_NoGoldSpent = 1;
	k_ESuspiciousBuildType_NoItems = 2;
	k_ESuspiciousBuildType_NoSignificantItems = 3;
	k_ESuspiciousBuildType_TooManyBoots = 4;
	k_ESuspiciousBuildType_Bot1 = 101;
	k_ESuspiciousBuildType_Bot2 = 102;
	k_ESuspiciousBuildType_Bot3 = 103;
	k_ESuspiciousBuildType_Bot4 = 104;
	k_ESuspiciousBuildType_Bot5 = 105;
}

message CMsgPoorNetworkConditions {
	message Player {
		optional uint32 account_id = 1;
		optional .ENetworkDisconnectionReason disconnect_reason = 2 [default = NETWORK_DISCONNECT_INVALID];
		optional uint32 num_bad_intervals = 3;
		optional uint32 peak_loss_pct = 4;
	}

	optional .EPoorNetworkConditionsType detection_type = 1 [default = k_EPoorNetworkConditions_None];
	repeated .CMsgPoorNetworkConditions.Player players = 2;
}

message CMsgGameserverCrash {
	optional uint64 match_id = 1;
	optional fixed64 lobby_id = 2;
	optional .DOTA_GameState game_state = 3 [default = DOTA_GAMERULES_STATE_INIT];
	optional fixed32 sentinel_save_time = 4;
	optional fixed64 custom_game_id = 11;
	optional uint32 tournament_id = 12;
	optional fixed64 server_steam_id = 5;
	optional fixed32 server_public_ip_addr = 6;
	optional uint32 server_port = 7;
	optional uint32 server_cluster = 8;
	optional uint32 pid = 9;
	optional uint32 engine = 10;
}

message CMsgConnectedPlayers {
	message Player {
		optional fixed64 steam_id = 1;
		optional uint32 hero_id = 2;
		optional .CMsgLeaverState leaver_state = 3;
		optional .ENetworkDisconnectionReason disconnect_reason = 4 [default = NETWORK_DISCONNECT_INVALID];
	}

	enum SendReason {
		INVALID = 0;
		HEARTBEAT = 1;
		GAME_STATE = 2;
		FIRST_BLOOD = 3;
		PLAYER_CONNECTED = 4;
		PLAYER_HERO = 5;
		PLAYER_DISCONNECTED_CONSEQUENCES = 6;
		PLAYER_DISCONNECTED_NOCONSEQUENCES = 7;
		GAMESTATE_TIMEOUT = 10;
		MASS_DISCONNECT = 11;
		KILLS = 13;
		BUILDING_STATE = 14;
	}

	repeated .CMsgConnectedPlayers.Player connected_players = 1;
	repeated .CMsgConnectedPlayers.Player disconnected_players = 7;
	optional .DOTA_GameState game_state = 2 [default = DOTA_GAMERULES_STATE_INIT];
	optional bool first_blood_happened = 6;
	optional bool legacy_mass_disconnect = 9;
	optional .CMsgPoorNetworkConditions poor_network_conditions = 10;
	optional .CMsgConnectedPlayers.SendReason send_reason = 8 [default = INVALID];
	optional uint32 radiant_kills = 11;
	optional uint32 dire_kills = 12;
	optional int32 radiant_lead = 14;
	optional uint32 building_state = 15;
}

message CMsgGameServerInfo {
	enum ServerType {
		UNSPECIFIED = 0;
		GAME = 1;
		PROXY = 2;
		TENSORFLOW = 3;
		DOTA_ONLY = 4;
		CUSTOM_GAME_ONLY = 5;
	}

	enum CustomGames {
		BOTH = 0;
		NONE = 1;
		ONLY = 2;
	}

	optional fixed32 server_public_ip_addr = 1;
	optional fixed32 server_private_ip_addr = 2;
	optional uint32 server_port = 3;
	optional uint32 server_tv_port = 4;
	optional uint32 assigned_server_tv_port = 22;
	optional bytes legacy_server_steamdatagram_address = 27;
	optional string server_key = 5;
	optional bool server_hibernation = 6;
	optional .CMsgGameServerInfo.ServerType server_type = 7 [default = UNSPECIFIED];
	optional uint32 server_region = 8;
	optional float server_loadavg = 9;
	optional float server_tv_broadcast_time = 10;
	optional float server_game_time = 11;
	optional fixed64 server_relay_connected_steam_id = 12;
	optional uint32 relay_slots_max = 13;
	optional int32 relays_connected = 14;
	optional int32 relay_clients_connected = 15;
	optional fixed64 relayed_game_server_steam_id = 16;
	optional uint32 parent_relay_count = 17;
	optional fixed64 tv_secret_code = 18;
	optional uint32 server_version = 19;
	optional uint32 server_cluster = 20;
	optional .CMsgGameServerInfo.CustomGames allow_custom_games = 23 [default = BOTH];
	optional uint32 build_version = 24;
	optional uint32 tf_server_count = 25;
	optional uint32 srcds_instance = 26;
	optional bool dev_force_server_type = 28;
}

message CMsgLeaverDetected {
	optional fixed64 steam_id = 1;
	optional .DOTALeaverStatus_t leaver_status = 2 [default = DOTA_LEAVER_NONE];
	optional .CMsgLeaverState leaver_state = 4;
	optional uint32 server_cluster = 5;
	optional .ENetworkDisconnectionReason disconnect_reason = 6 [default = NETWORK_DISCONNECT_INVALID];
	optional .CMsgPoorNetworkConditions poor_network_conditions = 7;
}

message CMsgLeaverDetectedResponse {
	optional uint32 result = 1;
}

message CMsgDOTAFantasyFinalPlayerStats {
	repeated .CMsgDOTAFantasyPlayerStats stats = 2;
}

message CMsgDOTAFantasyLivePlayerStats {
	repeated .CMsgDOTAFantasyPlayerStats stats = 2;
}

message CMsgDOTAFantasyMatch {
	optional uint64 match_id = 1;
	optional uint32 league_id = 2;
	optional uint32 series_id = 3;
	optional uint32 start_time = 4;
	optional uint32 series_type = 5;
	optional uint32 team_1 = 6;
	optional uint32 team_2 = 7;
}

message CMsgDOTAUpdateClippy {
	repeated uint32 good_team_hero_ids = 1;
	repeated uint32 bad_team_hero_ids = 2;
}

message CMsgServerToGCRealtimeStats {
	optional .CMsgDOTARealtimeGameStatsTerse delayed = 1;
}

message CMsgGCToServerRealtimeStatsStartStop {
	optional bool delayed = 1;
}

message CMsgGCToServerUpdateSteamBroadcasting {
	optional bool active = 1;
}

message CMsgSignOutGameplayStats {
	message CPlayer {
		optional fixed64 steam_id = 1;
		optional uint32 player_slot = 2;
		optional uint32 hero_id = 3;
		repeated .CMatchPlayerTimedStats timed_player_stats = 4;
	}

	message CTeam {
		optional bool is_winning_team = 1;
		optional bool is_radiant_team = 2;
		repeated .CMatchTeamTimedStats timed_team_stats = 3;
		repeated .CMsgSignOutGameplayStats.CPlayer players = 4;
	}

	repeated .CMsgSignOutGameplayStats.CTeam teams = 1;
}

message CMsgGameMatchSignOut {
	message CTeam {
		message CPlayer {
			message CCustomGameData {
				optional uint32 dota_team = 1;
				optional bool winner = 2;
			}

			message HeroDamageReceived {
				optional uint32 pre_reduction = 1;
				optional uint32 post_reduction = 2;
				optional .CMsgGameMatchSignOut.CTeam.CPlayer.HeroDamageType damage_type = 3 [default = HERO_DAMAGE_PHYSICAL];
			}

			enum HeroDamageType {
				HERO_DAMAGE_PHYSICAL = 0;
				HERO_DAMAGE_MAGICAL = 1;
				HERO_DAMAGE_PURE = 2;
			}

			optional fixed64 steam_id = 1;
			optional uint32 hero_id = 3;
			repeated uint32 items = 4;
			optional uint32 gold = 5;
			optional uint32 kills = 6;
			optional uint32 deaths = 7;
			optional uint32 assists = 8;
			optional uint32 leaver_status = 9;
			optional uint32 last_hits = 10;
			optional uint32 denies = 11;
			optional uint32 gold_per_min = 12;
			optional uint32 xp_per_minute = 13;
			optional uint32 gold_spent = 14;
			optional uint32 level = 15;
			optional uint32 scaled_hero_damage = 16;
			optional uint32 scaled_tower_damage = 17;
			optional uint32 scaled_hero_healing = 18;
			optional uint32 time_last_seen = 19;
			optional uint32 support_ability_value = 20;
			optional uint64 party_id = 21;
			optional uint32 claimed_farm_gold = 27;
			optional uint32 support_gold = 28;
			optional uint32 claimed_denies = 29;
			optional uint32 claimed_misses = 30;
			optional uint32 misses = 31;
			optional uint32 net_worth = 34;
			optional uint32 hero_damage = 37;
			optional uint32 tower_damage = 38;
			optional uint32 hero_healing = 39;
			repeated .CMatchPlayerAbilityUpgrade ability_upgrades = 32;
			repeated .CMatchAdditionalUnitInventory additional_units_inventory = 33;
			repeated .CMatchPlayerPermanentBuff permanent_buffs = 40;
			optional .CMsgGameMatchSignOut.CTeam.CPlayer.CCustomGameData custom_game_data = 35;
			optional uint32 match_player_flags = 36;
			repeated uint32 talent_ability_ids = 41;
			optional uint32 hero_pick_order = 42;
			optional bool hero_was_randomed = 43;
			optional bool hero_was_dota_plus_suggestion = 50;
			optional uint32 lane = 45;
			optional bool is_using_plus_guide = 47;
			repeated .CMsgGameMatchSignOut.CTeam.CPlayer.HeroDamageReceived hero_damage_received = 48;
			optional uint32 seconds_dead = 51;
			optional uint32 gold_lost_to_death = 52;
			optional uint32 command_count = 53;
			optional uint32 mouse_click_cast_command_count = 54;
			optional uint32 teleports_used = 55;
			optional uint32 cavern_crawl_map_variant = 56;
		}

		repeated .CMsgGameMatchSignOut.CTeam.CPlayer players = 1;
	}

	message CAdditionalSignoutMsg {
		optional uint32 id = 1;
		optional bytes contents = 2;
	}

	message CSocialFeedMatchEvent {
		optional uint32 account_id = 1;
		optional uint32 timestamp = 2;
		optional uint32 event_type = 3;
		optional int32 game_time = 4;
		optional uint32 replay_time = 5;
	}

	message CCustomGameData {
		optional uint32 publish_timestamp = 1;
	}

	message EventGameLeaderboardEntry {
		optional string name_suffix = 1;
		optional int32 score = 2;
		optional uint32 extra_data_1 = 3;
		optional uint32 extra_data_2 = 4;
		optional uint32 extra_data_3 = 5;
		optional uint32 extra_data_4 = 6;
		optional uint32 extra_data_5 = 7;
	}

	message WardPlacement {
		optional uint32 player_id = 1;
		optional uint32 team_id = 2;
		optional uint32 placed_time = 3;
		optional uint32 building_state = 4;
		optional uint32 creep_state = 5;
		optional bool roshan_alive = 6;
		optional uint32 position_x = 7;
		optional uint32 position_y = 8;
	}

	optional uint64 match_id = 1 [(key_field) = true];
	optional uint32 duration = 2;
	optional bool good_guys_win = 3;
	optional fixed32 date = 4;
	repeated uint32 num_players = 5;
	repeated .CMsgGameMatchSignOut.CTeam teams = 6;
	repeated uint32 tower_status = 8;
	repeated uint32 barracks_status = 9;
	optional uint32 cluster = 10;
	optional string server_addr = 11;
	optional uint32 first_blood_time = 12;
	optional uint32 event_score = 14;
	repeated .CMatchHeroSelectEvent picks_bans = 15;
	repeated .CMsgDOTAFantasyPlayerStats fantasy_stats = 41;
	repeated .CMsgEconPlayerStrangeCountAdjustment player_strange_count_adjustments = 17;
	optional bool automatic_surrender = 18;
	optional uint32 server_version = 19;
	optional bool legacy_mass_disconnect = 21;
	optional .CMsgPoorNetworkConditions poor_network_conditions = 35;
	repeated .CMsgGameMatchSignOut.CAdditionalSignoutMsg additional_msgs = 20;
	repeated .CMsgGameMatchSignOut.CSocialFeedMatchEvent social_feed_events = 36;
	optional sint32 average_networth_delta = 22;
	optional .CMsgGameMatchSignOut.CCustomGameData custom_game_data = 37;
	optional uint32 match_flags = 38;
	repeated uint32 team_scores = 39;
	optional uint32 pre_game_duration = 40;
	repeated .CMsgGameMatchSignOut.EventGameLeaderboardEntry event_game_leaderboard_entries = 42;
	repeated .CMsgGameMatchSignOut.WardPlacement ward_placements = 43;
	optional .CMsgSignOutGameplayStats gameplay_stats = 44;
	repeated .CExtraMsgBlock extra_messages = 54;
}

message CMsgSignOutDraftInfo {
	optional uint32 radiant_captain_account_id = 1;
	optional uint32 dire_captain_account_id = 2;
	repeated .CMatchHeroSelectEvent picks_bans = 3;
}

message CMsgSignOutBotInfo {
	optional bool allow_cheats = 1;
	optional .DOTABotDifficulty bot_difficulty_radiant = 2 [default = BOT_DIFFICULTY_PASSIVE];
	optional bool created_lobby = 3;
	optional .DOTABotDifficulty bot_difficulty_dire = 5 [default = BOT_DIFFICULTY_PASSIVE];
}

message CMsgSignOutPlayerStats {
	optional int32 account_id = 1;
	optional uint64 match_id = 2;
	optional uint32 rank = 3;
	optional uint32 hero_id = 4;
	optional uint32 rampages = 5;
	optional uint32 triple_kills = 6;
	optional uint32 first_blood_claimed = 7;
	optional uint32 first_blood_given = 8;
	optional uint32 couriers_killed = 9;
	optional uint32 aegises_snatched = 10;
	optional uint32 cheeses_eaten = 11;
	optional uint32 creeps_stacked = 12;
	optional float fight_score = 13;
	optional float farm_score = 14;
	optional float support_score = 15;
	optional float push_score = 16;
	optional uint32 kills = 17;
	optional uint32 deaths = 18;
	optional uint32 assists = 19;
	optional uint32 last_hits = 20;
	optional uint32 denies = 21;
	optional float gpm = 22;
	optional float xppm = 23;
	optional float net_worth = 24;
	optional float damage = 25;
	optional float heals = 26;
	optional uint32 rapiers_purchased = 27;
	optional uint32 observer_wards_placed = 28;
	optional uint32 wards_destroyed = 29;
}

message CMsgSignOutCommunicationSummary {
	message PlayerCommunication {
		optional uint32 account_id = 1;
		optional uint32 pings = 2;
		optional uint32 max_pings_per_interval = 3;
		optional uint32 teammate_pings = 4;
		optional uint32 max_teammate_pings_per_interval = 5;
		optional uint32 team_chat_messages = 6;
		optional uint32 all_chat_messages = 7;
		optional uint32 chat_wheel_messages = 8;
		optional uint32 pauses = 9;
		optional uint32 unpauses = 10;
		optional uint32 lines_drawn = 11;
		optional uint32 voice_chat_seconds = 12;
		optional uint32 chat_mutes = 13;
		optional uint32 voice_mutes = 14;
	}

	repeated .CMsgSignOutCommunicationSummary.PlayerCommunication players = 1;
}

message CMsgGameMatchSignoutResponse {
	message PlayerMetadata {
		optional uint32 hero_id = 1;
		optional uint32 avg_kills_x16 = 2;
		optional uint32 avg_deaths_x16 = 3;
		optional uint32 avg_assists_x16 = 4;
		optional uint32 avg_gpm_x16 = 5;
		optional uint32 avg_xpm_x16 = 6;
		optional uint32 best_kills_x16 = 7;
		optional uint32 best_assists_x16 = 8;
		optional uint32 best_gpm_x16 = 9;
		optional uint32 best_xpm_x16 = 10;
		optional uint32 win_streak = 11;
		optional uint32 best_win_streak = 12;
		optional uint32 games_played = 13;
	}

	optional uint64 match_id = 1;
	optional fixed32 replay_salt = 2;
	repeated .CLobbyTimedRewardDetails timed_reward_details = 3;
	repeated .CDOTALobbyMember xp_reward_details = 4;
	optional uint32 leagueid = 5;
	optional fixed32 metadata_private_key = 7;
	optional .CMsgDOTAMatch match_details = 8;
	repeated .CMsgGameMatchSignoutResponse.PlayerMetadata players_metadata = 9;
}

message CMsgTimedRewardContainer {
	repeated .CLobbyTimedRewardDetails timed_reward_details = 1;
}

message CMsgGameMatchSignOutPermissionRequest {
	optional uint32 server_version = 1;
	optional uint32 local_attempt = 2;
	optional uint32 total_attempt = 3;
	optional uint32 seconds_waited = 4;
}

message CMsgGameMatchSignOutPermissionResponse {
	optional bool permission_granted = 1 [default = false];
	optional bool abandon_signout = 2 [default = false];
	optional uint32 retry_delay_seconds = 3 [default = 0];
}

message CMsgGameMatchSignOutEventGameData {
	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	optional string game_name = 2;
	optional string map_name = 3;
	optional bytes event_game_data = 4;
	optional uint32 start_time = 5;
}

message CMsgDOTALiveScoreboardUpdate {
	message Team {
		message Player {
			message HeroAbility {
				optional uint32 ability_id = 1;
				optional uint32 ability_level = 2;
			}

			enum DOTAUltimateState {
				k_EDOTAUltimateStateNotLearned = 0;
				k_EDOTAUltimateStateCooldown = 1;
				k_EDOTAUltimateStateNeedsMana = 2;
				k_EDOTAUltimateStateReady = 3;
			}

			optional uint32 player_slot = 1;
			optional string player_name = 2;
			optional string hero_name = 3;
			optional uint32 hero_id = 4;
			optional uint32 kills = 5;
			optional uint32 deaths = 6;
			optional uint32 assists = 7;
			optional uint32 last_hits = 8;
			optional uint32 denies = 9;
			optional uint32 gold = 10;
			optional uint32 level = 11;
			optional float gold_per_min = 12;
			optional float xp_per_min = 13;
			optional .CMsgDOTALiveScoreboardUpdate.Team.Player.DOTAUltimateState ultimate_state = 14 [default = k_EDOTAUltimateStateNotLearned];
			optional float ultimate_cooldown = 15;
			optional uint32 item0 = 16;
			optional uint32 item1 = 17;
			optional uint32 item2 = 18;
			optional uint32 item3 = 19;
			optional uint32 item4 = 20;
			optional uint32 item5 = 21;
			optional uint32 respawn_timer = 22;
			optional uint32 account_id = 23;
			optional float position_x = 24;
			optional float position_y = 25;
			optional uint32 net_worth = 26;
			repeated .CMsgDOTALiveScoreboardUpdate.Team.Player.HeroAbility abilities = 27;
		}

		repeated .CMsgDOTALiveScoreboardUpdate.Team.Player players = 1;
		optional uint32 score = 2;
		optional uint32 tower_state = 3;
		optional uint32 barracks_state = 4;
		repeated uint32 hero_picks = 5;
		repeated uint32 hero_bans = 6;
	}

	optional uint32 tournament_id = 1;
	optional uint32 tournament_game_id = 2;
	optional float duration = 3;
	optional int32 hltv_delay = 4;
	optional .CMsgDOTALiveScoreboardUpdate.Team team_good = 5;
	optional .CMsgDOTALiveScoreboardUpdate.Team team_bad = 6;
	optional uint32 roshan_respawn_timer = 7;
	optional uint32 league_id = 8;
	optional uint64 match_id = 9;
}

message CMsgDOTARequestPlayerResources {
	optional fixed64 steam_id = 1;
	optional uint32 player_id = 2;
}

message CMsgDOTARequestPlayerResourcesResponse {
	optional fixed64 steam_id = 1;
	optional uint32 rank = 2;
	optional uint32 player_id = 3;
	optional bool prevent_text_chat = 4;
	optional bool prevent_voice_chat = 5;
	optional bool low_priority = 6;
	optional bool is_new_player = 8;
	optional bool is_guide_player = 9;
}

message CMsgDOTARequestBatchPlayerResources {
	repeated uint32 account_ids = 1 [packed = true];
	repeated uint32 rank_types = 4 [packed = true];
}

message CMsgDOTARequestBatchPlayerResourcesResponse {
	message Result {
		optional uint32 account_id = 1;
		optional bool prevent_text_chat = 2;
		optional bool prevent_voice_chat = 3;
		optional uint32 rank = 4;
		optional bool rank_calibrated = 5;
		optional bool low_priority = 6;
		optional bool is_new_player = 7;
		optional bool is_guide_player = 8;
	}

	repeated .CMsgDOTARequestBatchPlayerResourcesResponse.Result results = 6;
}

message CMsgDOTAPlayerFailedToConnect {
	repeated fixed64 failed_loaders = 1;
	repeated fixed64 abandoned_loaders = 2;
}

message CMsgGCToRelayConnect {
	optional uint32 source_tv_public_addr = 1;
	optional uint32 source_tv_private_addr = 2;
	optional uint32 source_tv_port = 3;
	optional uint64 game_server_steam_id = 4;
	optional uint32 parent_count = 5;
	optional fixed64 tv_unique_secret_code = 6;
	optional fixed64 source_tv_steamid = 7;
}

message CMsgGCGCToLANServerRelayConnect {
	optional fixed64 relay_steamid = 1;
}

message CMsgGCToRelayConnectResponse {
}

message CMsgGCBanStatusRequest {
	optional uint32 account_id = 1;
}

message CMsgGCBanStatusResponse {
	optional uint32 result = 1;
	optional bool low_priority = 2;
	optional bool text_chat_banned = 3;
	optional bool voice_chat_banned = 4;
}

message CMsgTournamentItemEvent {
	optional fixed32 killer_account_id = 1;
	optional fixed32 victim_account_id = 2;
	optional .DOTA_TournamentEvents event_type = 3 [default = TE_FIRST_BLOOD];
	optional int32 tv_delay = 4;
	optional int32 dota_time = 5;
	optional float replay_time = 6;
	optional string loot_list = 7;
	optional uint32 event_team = 8;
	optional uint32 multi_kill_count = 9;
	optional uint32 winner_score = 10;
	optional uint32 loser_score = 11;
	repeated .CProtoItemHeroStatue hero_statues = 12;
}

message CMsgTournamentItemEventResponse {
	optional .DOTA_TournamentEvents event_type = 1 [default = TE_FIRST_BLOOD];
	optional uint32 viewers_granted = 6;
}

message CMsgTeamFanfare {
	optional uint64 match_id = 1;
}

message CMsgResponseTeamFanfare {
	optional uint32 fanfare_goodguys = 1;
	optional uint32 fanfare_badguys = 2;
}

message CMsgGameServerUploadSaveGame {
	optional uint32 game_time = 1;
	optional bytes save_game_data = 2;
	optional uint64 lobby_id = 3;
	repeated uint64 player_steam_ids = 4;
}

message CMsgGameServerSaveGameResult {
	enum Result {
		SaveSuccessful = 0;
		SessionNotFound = 1;
		DatabaseError = 2;
		TooBig = 3;
	}

	optional .CMsgGameServerSaveGameResult.Result result = 1 [default = SaveSuccessful];
}

message CMsgGameServerGetLoadGame {
	optional uint32 save_id = 1;
}

message CMsgGameServerGetLoadGameResult {
	optional bytes save_game_data = 1;
}

message CMsgDOTAGenerateDiretidePrizeList {
	optional uint32 prize_list = 1;
	optional uint32 highest_roshan_level = 2;
}

message CMsgDOTAGenerateDiretidePrizeListResponse {
	repeated uint32 item_defs = 1;
	repeated fixed64 steam_ids = 2;
	optional uint32 prize_list = 3;
}

message CMsgDOTARewardDiretidePrizes {
	optional uint32 team = 1;
	optional uint32 prize_list = 2;
}

message CMsgDOTADiretidePrizesRewardedResponse {
	optional uint32 prize_list = 1;
}

message CMsgDOTAAwardEventPoints {
	message AwardPoints {
		optional uint32 account_id = 1;
		optional int32 points = 2;
		optional int32 premium_points = 3;
		optional uint32 trade_ban_time = 5;
		optional bool eligible_for_periodic_adjustment = 6 [default = false];
		optional uint32 point_cap_periodic_resource_id = 7 [default = 0];
	}

	repeated .CMsgDOTAAwardEventPoints.AwardPoints award_points = 1;
	optional uint64 match_id = 2;
	optional .EEvent event_id = 4 [default = EVENT_ID_NONE];
	optional uint32 timestamp = 5;
	optional uint32 audit_action = 6;
}

message CMsgServerToGCSignoutAwardAdditionalDrops {
	message AdditionalDrops {
		optional string loot_list = 1;
		repeated uint32 player_account_ids = 2;
		optional bool no_trade = 3;
		optional bool randomize_reward = 4;
	}

	repeated .CMsgServerToGCSignoutAwardAdditionalDrops.AdditionalDrops drops = 1;
	optional uint64 match_id = 2;
}

message CMsgDOTAFrostivusTimeElapsed {
	message User {
		optional uint32 account_id = 1;
		optional uint32 time_elapsed_s = 2;
	}

	optional uint32 seconds = 1;
	repeated .CMsgDOTAFrostivusTimeElapsed.User users = 2;
	optional uint64 match_id = 3;
}

message CMsgGCToServerPingRequest {
	optional fixed64 request_id = 1;
	optional uint64 request_time = 2;
}

message CMsgGCToServerPingResponse {
	optional fixed64 request_id = 1;
	optional uint64 request_time = 2;
	optional uint32 cluster = 3;
}

message CMsgGCToServerConsoleCommand {
	optional string console_command = 1;
}

message CMsgServerGetEventPoints {
	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	repeated uint32 account_id = 2;
}

message CMsgServerGetEventPointsResponse {
	message Points {
		optional uint32 account_id = 1;
		optional uint32 points_total = 2;
		optional bool owned = 4;
	}

	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	repeated .CMsgServerGetEventPointsResponse.Points points = 2;
}

message CMsgServerGrantSurveyPermission {
	message Survey {
		optional uint32 account_id = 1;
		optional uint32 question_id = 2;
		optional uint32 expire_time = 3;
		optional uint64 survey_key = 4;
		optional uint64 extra_data = 5;
		optional uint64 extra_data_32 = 6;
	}

	repeated .CMsgServerGrantSurveyPermission.Survey surveys = 1;
}

message CMsgServerGrantSurveyPermissionResponse {
	optional uint32 result = 1;
}

message CMsgServerToGCMatchConnectionStats {
	message Player {
		optional uint32 account_id = 1;
		optional fixed32 ip = 2;
		optional uint32 avg_ping_ms = 3;
		optional float packet_loss = 5;
		optional float ping_deviation = 6;
		optional uint32 full_resends = 7;
	}

	optional uint64 match_id = 1;
	optional uint32 region_id = 2;
	optional uint32 league_id = 3;
	repeated .CMsgServerToGCMatchConnectionStats.Player players = 4;
	optional uint32 cluster_id = 5;
}

message CMsgServerGCUpdateSpectatorCount {
	optional uint32 spectator_count = 1;
}

message CSerializedCombatLog {
	message Dictionary {
		message DictString {
			required uint32 id = 1;
			required string value = 2;
		}

		repeated .CSerializedCombatLog.Dictionary.DictString strings = 1;
	}

	optional uint32 version = 1;
	optional .CSerializedCombatLog.Dictionary dictionary = 2;
	repeated .CMsgDOTACombatLogEntry entries = 3;
}

message CMsgServerToGCGetAdditionalEquips {
	repeated uint32 account_ids = 1;
}

message CMsgServerToGCGetAdditionalEquipsResponse {
	message CUserEquips {
		optional uint32 account_id = 1;
		repeated .CAdditionalEquipSlot equips = 2;
	}

	repeated .CMsgServerToGCGetAdditionalEquipsResponse.CUserEquips equips = 1;
}

message CMsgServerToGCGetProfileCard {
	repeated uint32 account_ids = 1;
}

message CMsgServerToGCGetProfileCardResponse {
	repeated .CMsgDOTAProfileCard cards = 1;
}

message CMsgServerToGCVictoryPredictions {
	message Record {
		optional uint32 account_id = 1;
		optional uint64 item_id = 2;
		repeated uint64 item_ids = 5;
	}

	repeated .CMsgServerToGCVictoryPredictions.Record records = 1;
}

message CMsgSuspiciousActivity {
	optional uint32 account_id = 1;
	optional .ESuspiciousActivity activity = 2 [default = k_ESuspiciousActivity_VAC_MultipleInstances];
	optional sint32 intdata1 = 3;
	optional sint32 intdata2 = 4;
	optional uint32 time = 5;
}

message CMsgServerToGCRequestStatus {
}

message CMsgServerToGCRequestStatus_Response {
	optional uint32 response = 1;
}

message CMsgSignOutAssassinMiniGameInfo {
	repeated fixed64 winning_players = 1;
	repeated fixed64 losing_players = 2;
	repeated fixed64 arcana_owners = 3;
	optional bool assassin_won = 4;
	optional uint32 target_hero_id = 5;
	optional bool contract_completed = 6;
	optional float contract_complete_time = 7;
	optional bool pa_is_radiant = 8;
}

message CMsgServerToGCGetIngameEventData {
	optional .EEvent event = 1 [default = EVENT_ID_NONE];
}

message CMsgGCToServerIngameEventDataOraclePA {
	repeated uint32 target_hero_ids = 1;
}

message CMsgServerToGCKillSummaries {
	message KillSummary {
		optional uint32 killer_hero_id = 1;
		optional uint32 victim_hero_id = 2;
		optional uint32 kill_count = 3;
	}

	optional uint32 ingameevent_id = 1;
	repeated .CMsgServerToGCKillSummaries.KillSummary summaries = 2;
}

message CMsgGCToServerPredictionResult {
	message Prediction {
		enum EResult {
			k_eResult_ItemGranted = 1;
			k_eResult_Destroyed = 2;
		}

		optional uint32 item_def = 1;
		optional uint32 num_correct = 2;
		optional uint32 num_fails = 3;
		optional .CMsgGCToServerPredictionResult.Prediction.EResult result = 4 [default = k_eResult_ItemGranted];
		repeated uint32 granted_item_defs = 6;
	}

	optional uint32 account_id = 1;
	optional uint64 match_id = 2;
	optional bool correct = 3;
	repeated .CMsgGCToServerPredictionResult.Prediction predictions = 4;
}

message CMsgServerToGCLockCharmTrading {
	optional uint32 account_id = 1;
	optional uint64 item_id = 2;
}

message CMsgSignOutUpdatePlayerChallenge {
	message Challenge {
		optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
		optional uint32 slot_id = 2;
		optional uint32 sequence_id = 3;
		optional uint32 progress = 4;
		optional uint32 challenge_rank = 5;
	}

	optional uint32 account_id = 1;
	repeated .CMsgSignOutUpdatePlayerChallenge.Challenge completed = 2;
	repeated .CMsgSignOutUpdatePlayerChallenge.Challenge rerolled = 3;
	optional uint64 match_id = 4;
	optional uint32 hero_id = 5;
}

message CMsgServerToGCRerollPlayerChallenge {
	optional uint32 account_id = 1;
	optional .CMsgClientToGCRerollPlayerChallenge reroll_msg = 2;
}

message CMsgSignOutWagerStats {
	message Player {
		optional uint32 account_id = 1;
		optional uint32 winnings = 2;
		optional uint32 max_wager = 3;
		optional uint32 wager = 4;
	}

	repeated .CMsgSignOutWagerStats.Player players = 1;
	optional .EEvent event_id = 2 [default = EVENT_ID_NONE];
}

message CMsgSpendWager {
	message Player {
		optional uint32 account_id = 1;
		optional uint32 wager = 2;
		optional uint64 wager_token_item_id = 3;
	}

	repeated .CMsgSpendWager.Player players = 1;
	optional .EEvent event_id = 2 [default = EVENT_ID_NONE];
	optional uint32 timestamp = 3;
	optional uint64 match_id = 4;
	optional uint64 server_steam_id = 5;
}

message CMsgSignOutXPCoins {
	message Player {
		optional uint32 account_id = 1;
		optional uint32 xp_gained = 2;
		optional uint32 coins_spent = 3;
		optional uint64 wager_token_item_id = 4;
		optional uint32 rank_wager = 5;
	}

	repeated .CMsgSignOutXPCoins.Player players = 1;
	optional .EEvent event_id = 2 [default = EVENT_ID_NONE];
	optional uint64 match_id = 3;
	optional uint32 timestamp = 4;
}

message CMsgSignOutCommunityGoalProgress {
	message EventGoalIncrement {
		optional uint32 event_goal_id = 1;
		optional uint32 increment_amount = 2;
	}

	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	repeated .CMsgSignOutCommunityGoalProgress.EventGoalIncrement event_increments = 2;
}

message CMsgServerToGCPostMatchTip {
	optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
	optional uint64 match_id = 2;
	optional uint32 tipper_account_id = 3;
	optional uint32 recipient_account_id = 4;
	optional uint32 tip_amount = 5;
}

message CMsgServerToGCPostMatchTipResponse {
	enum Result {
		SUCCESS = 0;
		FAILURE = 1;
	}

	optional uint64 match_id = 1;
	optional uint32 tipper_account_id = 2;
	optional uint32 recipient_account_id = 3;
	optional .CMsgServerToGCPostMatchTipResponse.Result result = 4 [default = SUCCESS];
}

message CMsgServerToGCCloseCompendiumInGamePredictionVoting {
	optional uint64 match_id = 1;
	optional uint32 hltv_delay = 2;
}

message CMsgServerToGCCloseCompendiumInGamePredictionVotingResponse {
	optional bool result = 1;
}

message CMsgServerToGCCompendiumInGamePredictionResults {
	message PredictionResult {
		optional uint32 prediction_id = 1;
		optional uint32 prediction_value = 2;
		optional bool prediction_value_is_mask = 3;
	}

	optional uint64 match_id = 1;
	repeated .CMsgServerToGCCompendiumInGamePredictionResults.PredictionResult results = 2;
	optional uint32 league_id = 3;
	optional uint32 league_node_id = 4;
}

message CMsgServerToGCCompendiumInGamePredictionResultsResponse {
	optional bool result = 1;
}

message CMsgGCToGCCompendiumInGamePredictionResults {
	optional .CMsgServerToGCCompendiumInGamePredictionResults results = 1;
}

message CMsgServerToGCMatchPlayerItemPurchaseHistory {
	message ItemPurchase {
		optional uint32 item = 1;
		optional uint32 gold = 2;
		optional uint32 net_worth = 3;
		optional uint32 game_time = 4;
		repeated uint32 inventory_items = 5;
		repeated bool talents_skilled = 7;
	}

	message Player {
		optional uint32 player_slot = 1;
		optional uint32 account_id = 2;
		optional uint32 hero_id = 3;
		repeated uint32 allied_hero_ids = 4;
		repeated uint32 enemy_hero_ids = 5;
		repeated .CMsgServerToGCMatchPlayerItemPurchaseHistory.ItemPurchase item_purchases = 6;
	}

	optional uint64 match_id = 1;
	optional uint32 mmr = 2;
	repeated .CMsgServerToGCMatchPlayerItemPurchaseHistory.Player players = 3;
}

message CMsgServerToGCMatchStateHistory {
	message PlayerState {
		optional uint32 hero_id = 1;
		optional uint32 net_worth = 2;
		optional uint32 level = 3;
		optional uint32 deaths = 4;
		optional uint32 respawn_time = 5;
		optional bool has_buyback = 6;
		optional bool has_aegis = 7;
		optional bool has_rapier = 8;
		optional uint32 distance = 9;
	}

	message TeamState {
		optional uint32 team = 1;
		repeated .CMsgServerToGCMatchStateHistory.PlayerState player_states = 2;
		repeated uint32 tower_health_pct = 3;
		repeated uint32 barracks_health_pct = 4;
		optional uint32 ancient_health_pct = 5;
		optional uint32 glyph_cooldown = 6;
		optional uint32 kills = 7;
		optional uint32 creep_distance_safe = 8;
		optional uint32 creep_distance_mid = 9;
		optional uint32 creep_distance_off = 10;
	}

	message MatchState {
		optional uint32 game_time = 1;
		optional .CMsgServerToGCMatchStateHistory.TeamState radiant_state = 2;
		optional .CMsgServerToGCMatchStateHistory.TeamState dire_state = 3;
	}

	optional uint64 match_id = 1;
	optional bool radiant_won = 2;
	optional uint32 mmr = 3;
	repeated .CMsgServerToGCMatchStateHistory.MatchState match_states = 4;
}

message CMsgServerToGCCavernCrawlIsHeroActive {
	optional uint32 event_id = 1;
	optional uint32 account_id = 2;
	optional uint32 map_variant = 3;
	optional uint32 hero_id = 4;
	optional bool turbo_mode = 5;
}

message CMsgServerToGCCavernCrawlIsHeroActiveResponse {
	message MapResults {
		optional uint32 path_id_completed = 1;
		optional uint32 room_id_claimed = 2;
	}

	optional bool result = 1;
	optional uint32 potential_winnings = 2;
	repeated .CMsgServerToGCCavernCrawlIsHeroActiveResponse.MapResults map_results = 3;
	optional uint32 potential_plus_shard_winnings = 4;
}

message CMsgGCtoServerTensorflowInstance {
	optional uint32 server_instance = 1;
}

message CMsgDetailedGameStats {
	message PlayerStatEntry {
		optional uint32 total_earned_gold = 1;
		optional uint32 total_networth = 2;
		optional uint32 level = 3;
		optional uint32 total_dps = 4;
		optional uint32 average_dps = 5;
		optional uint32 ability_damage_output = 6;
		optional uint32 base_health = 7;
		optional uint32 total_health = 8;
		optional uint32 total_mana = 9;
		optional float base_physical_damage_reduction_pct = 10;
		optional float total_physical_damage_reduction_pct = 11;
		optional float base_ability_damage_reduction_pct = 12;
		optional float total_ability_damage_reduction_pct = 13;
		optional float ability_damage_block = 14;
		optional float physical_damage_block = 15;
		optional uint32 mana_regen = 16;
		optional uint32 health_regen = 17;
		optional float physical_magic_dmg_pct = 18;
		optional uint32 kills = 19;
		optional uint32 deaths = 20;
		optional uint32 assists = 21;
		optional uint32 gold_from_kills = 22;
		optional uint32 gold_from_creeps = 23;
		optional uint32 gold_shared = 24;
		optional uint32 xp_from_kills = 25;
		optional uint32 xp_from_creeps = 26;
		optional uint32 total_xp = 27;
		optional uint32 ability_casts = 28;
		optional uint32 item_casts = 29;
		optional float total_time_stunned = 30;
		optional uint32 item_count = 31;
	}

	message GameStats {
		optional uint32 tower_death_time_t1 = 1;
		optional uint32 tower_death_time_t2 = 2;
		optional uint32 tower_death_time_t3 = 3;
	}

	message MinuteEntry {
		optional uint32 minute = 1;
		repeated .CMsgDetailedGameStats.PlayerStatEntry stats = 2;
	}

	message PlayerInfo {
		optional uint32 account_id = 1;
		optional uint32 hero_id = 2;
		optional uint32 player_slot = 3;
	}

	repeated .CMsgDetailedGameStats.MinuteEntry minutes = 1;
	repeated .CMsgDetailedGameStats.PlayerInfo player_info = 2;
	optional .CMsgDetailedGameStats.GameStats game_stats = 3;
}

message CMsgAllStarStats {
	message PlayerStats {
		optional uint32 account_id = 1;
		optional uint32 player_id = 2;
		repeated uint32 killstreak = 3;
		repeated uint32 num_multi_kills = 4;
		optional uint32 killstreak_ended = 5;
		optional uint32 roshan_kills = 6;
		optional uint32 first_bloods = 7;
		optional uint32 courier_kills = 8;
		optional uint32 tower_kills = 9;
		optional bool first_taunt = 10;
		optional bool first_high_five = 11;
		optional bool first_ceb = 12;
		optional bool first_tip = 13;
		optional bool first_rapier = 14;
		optional bool first_aegis_deny = 15;
		optional bool last_to_die = 16;
		optional bool first_to_wipe = 17;
		optional uint32 kills = 18;
		optional uint32 deaths = 19;
		optional uint32 assists = 20;
	}

	repeated .CMsgAllStarStats.PlayerStats player_stats = 1;
}

message CMsgNeutralItemStats {
	message NeutralItem {
		optional uint32 item_id = 1;
		optional uint32 time_dropped = 2;
		optional uint32 team = 3;
		optional uint32 time_last_equipped = 4;
		optional uint32 time_last_unequipped = 5;
		optional uint32 duration_equipped = 6;
	}

	repeated .CMsgNeutralItemStats.NeutralItem neutral_items = 1;
}

message CMsgGCToServerLobbyHeroBanRates {
	message HeroBanEntry {
		optional uint32 hero_id = 1;
		optional uint32 ban_count = 2;
		optional uint32 pick_count = 3;
	}

	repeated .CMsgGCToServerLobbyHeroBanRates.HeroBanEntry ban_data = 1;
}

message CMsgSignOutMVPStats {
	message Player {
		optional uint32 team_id = 1;
		optional uint32 team_networth_rank = 2;
		optional uint32 account_id = 3;
		optional uint32 hero_id = 4;
		optional uint32 role = 5;
		optional int32 kills = 6;
		optional int32 deaths = 7;
		optional int32 assists = 8;
		optional int32 xp = 9;
		optional int32 net_worth = 10;
		optional int32 item_value = 11;
		optional int32 support_gold_spent = 12;
		optional int32 wards_placed = 13;
		optional int32 wards_spotted_for_dewarding = 14;
		optional int32 camps_stacked = 15;
		optional int32 last_hits = 16;
		optional int32 denies = 17;
		optional int32 hero_damage = 18;
		optional int32 building_damage = 19;
		optional int32 other_damage = 20;
		optional int32 damage_taken = 21;
		optional int32 hero_healing = 22;
		optional int32 building_healing = 23;
		optional int32 other_healing = 24;
		optional int32 double_kills = 25;
		optional int32 triple_kills = 26;
		optional int32 ultra_kills = 27;
		optional int32 rampages = 28;
		optional int32 biggest_kill_streak = 29;
		optional int32 biggest_kill_assist_streak = 30;
		optional int32 first_blood = 31;
	}

	optional uint64 match_id = 1;
	optional uint32 game_mode = 2;
	optional uint32 winning_team = 3;
	optional float game_time = 4;
	repeated .CMsgSignOutMVPStats.Player players = 5;
}
