import "steammessages.proto";

option optimize_for = SPEED;
option cc_generic_services = false;

enum ETFGCMsg {
	k_EMsgGCReportWarKill = 5001;
	k_EMsgGCVoteKickBanPlayer = 5018;
	k_EMsgGCVoteKickBanPlayerResult = 5019;
	k_EMsgGCKickPlayer_DEPRECATED = 5020;
	k_EMsgGCStartedTraining_DEPRECATED = 5021;
	k_EMsgGCFreeTrial_ChooseMostHelpfulFriend = 5022;
	k_EMsgGCRequestTF2Friends = 5023;
	k_EMsgGCRequestTF2FriendsResponse = 5024;
	k_EMsgGCReplay_SubmitContestEntry = 5026;
	k_EMsgGCReplay_SubmitContestEntryResponse = 5027;
	k_EMsgGCSaxxy_Awarded = 5029;
	k_EMsgGCFreeTrial_ThankedBySomeone = 5028;
	k_EMsgGCFreeTrial_ThankedSomeone = 5030;
	k_EMsgGCFreeTrial_ConvertedToPremium = 5031;
	k_EMsgGCMeetThePyroSilliness_BananaCraft_DEPRECATED = 5032;
	k_EMsgGCMVMARG_HighFiveSuccessResponse_DEPRECATED = 5033;
	k_EMsgGCMVMARG_HighFiveOnClient_DEPRECATED = 5034;
	k_EMsgGCCoaching_AddToCoaches = 5200;
	k_EMsgGCCoaching_AddToCoachesResponse = 5201;
	k_EMsgGCCoaching_RemoveFromCoaches = 5202;
	k_EMsgGCCoaching_RemoveFromCoachesResponse = 5203;
	k_EMsgGCCoaching_FindCoach = 5204;
	k_EMsgGCCoaching_FindCoachResponse = 5205;
	k_EMsgGCCoaching_AskCoach = 5206;
	k_EMsgGCCoaching_AskCoachResponse = 5207;
	k_EMsgGCCoaching_CoachJoinGame = 5208;
	k_EMsgGCCoaching_CoachJoining = 5209;
	k_EMsgGCCoaching_CoachJoined = 5210;
	k_EMsgGCCoaching_LikeCurrentCoach = 5211;
	k_EMsgGCCoaching_RemoveCurrentCoach = 5212;
	k_EMsgGCCoaching_AlreadyRatedCoach = 5213;
	k_EMsgGC_Duel_Request = 5500;
	k_EMsgGC_Duel_Response = 5501;
	k_EMsgGC_Duel_Results = 5502;
	k_EMsgGC_Duel_Status = 5503;
	k_EMsgGC_Halloween_ReservedItem_DEPRECATED = 5600;
	k_EMsgGC_Halloween_GrantItem_DEPRECATED = 5601;
	k_EMsgGC_Halloween_GrantItemResponse_DEPRECATED = 5604;
	k_EMsgGC_Halloween_Cheat_QueryResponse_DEPRECATED = 5605;
	k_EMsgGC_Halloween_ItemClaimed_DEPRECATED = 5606;
	k_EMsgGC_Halloween_ReservedItem = 5607;
	k_EMsgGC_Halloween_GrantItem = 5608;
	k_EMsgGC_Halloween_GrantItemResponse = 5609;
	k_EMsgGC_Halloween_Cheat_QueryResponse_DEPRECATED_2 = 5610;
	k_EMsgGC_Halloween_ItemClaimed_DEPRECATED_2 = 5611;
	k_EMsgGC_Halloween_ServerBossEvent = 5612;
	k_EMsgGC_Halloween_Merasmus2012 = 5613;
	k_EMsgGC_Halloween_UpdateMerasmusLootLevel = 5614;
	k_EMsgGC_GameServer_LevelInfo = 5700;
	k_EMsgGC_GameServer_AuthChallenge = 5701;
	k_EMsgGC_GameServer_AuthChallengeResponse = 5702;
	k_EMsgGC_GameServer_CreateIdentity = 5703;
	k_EMsgGC_GameServer_CreateIdentityResponse = 5704;
	k_EMsgGC_GameServer_List = 5705;
	k_EMsgGC_GameServer_ListResponse = 5706;
	k_EMsgGC_GameServer_AuthResult = 5707;
	k_EMsgGC_GameServer_ResetIdentity = 5708;
	k_EMsgGC_GameServer_ResetIdentityResponse = 5709;
	k_EMsgGC_Client_UseServerModificationItem = 5710;
	k_EMsgGC_Client_UseServerModificationItem_Response = 5711;
	k_EMsgGC_GameServer_UseServerModificationItem = 5712;
	k_EMsgGC_GameServer_UseServerModificationItem_Response = 5713;
	k_EMsgGC_GameServer_ServerModificationItemExpired = 5714;
	k_EMsgGC_GameServer_ModificationItemState = 5715;
	k_EMsgGC_GameServer_AckPolicy = 5716;
	k_EMsgGC_GameServer_AckPolicyResponse = 5717;
	k_EMsgGC_QP_ScoreServers = 5800;
	k_EMsgGC_QP_ScoreServersResponse = 5801;
	k_EMsgGC_QP_PlayerJoining = 5802;
	k_EMsgGC_PickupItemEligibility_Query_DEPRECATED = 6000;
	k_EMsgGC_PickupItemEligibility_Query_DEPRECATED_2 = 6001;
	k_EMsgGC_IncrementKillCountAttribute_DEPRECATED = 6100;
	k_EMsgGC_IncrementKillCountResponse_DEPRECATED = 6101;
	k_EMsgGCGameMatchSignOut = 6204;
	k_EMsgGCCreateOrUpdateParty = 6233;
	k_EMsgGCAbandonCurrentGame = 6235;
	k_EMsgForceSOCacheResend = 6237;
	k_EMsgGCRequestChatChannelList = 6260;
	k_EMsgGCRequestChatChannelListResponse = 6261;
	k_EMsgGCReadyUp = 6270;
	k_EMsgGCKickedFromMatchmakingQueue = 6271;
	k_EMsgGCLeaverDetected = 6272;
	k_EMsgGCLeaverDetectedResponse = 6287;
	k_EMsgGCPlayerFailedToConnect = 6288;
	k_EMsgGCExitMatchmaking = 6289;
	k_EMsgGCAcceptInvite = 6291;
	k_EMsgGCAcceptInviteResponse = 6292;
	k_EMsgGCMatchmakingProgress = 6293;
	k_EMsgGCMvMVictoryInfo = 6294;
	k_EMsgGCGameServerMatchmakingStatus = 6295;
	k_EMsgGCCreateOrUpdatePartyReply = 6296;
	k_EMsgGCMvMVictory = 6297;
	k_EMsgGCMvMVictoryReply = 6298;
	k_EMsgGCGameServerKickingLobby = 6299;
	k_EMsgGCLeaveGameAndPrepareToJoinParty = 6300;
	k_EMsgGCRemovePlayerFromLobby = 6301;
	k_EMsgGCSetLobbySafeToLeave = 6302;
	k_EMsgGC_UpdatePeriodicEvent = 6400;
	k_EMsgGC_DuckLeaderboard_IndividualUpdate = 6401;
	k_EMsgGC_ClientVerificationChallenge = 6500;
	k_EMsgGC_ClientVerificationChallengeResponse = 6501;
	k_EMsgGC_ClientVerificationVerboseResponse = 6502;
	k_EMsgGC_ClientSetItemSlotAttribute = 6503;
	k_EMsgGC_PlayerSkillRating_Adjustment = 6504;
	k_EMsgGC_SpyVsEngyWar_IndividualUpdate = 6505;
	k_EMsgGC_SpyVsEngyWar_JoinWar = 6506;
	k_EMsgGC_SpyVsEngyWar_RequestGlobalStats = 6507;
	k_EMsgGC_SpyVsEngyWar_GlobalStatsResponse = 6508;
	k_EMsgGC_SpyVsEngyWar_SetKillCamMessage = 6509;
	k_EMsgGCDev_GrantWarKill = 10001;
}

enum EServerModificationItemType {
	kGameServerModificationItem_Halloween = 1;
}

enum TF_MatchmakingMode {
	TF_Matchmaking_INVALID = 0;
	TF_Matchmaking_QUICKPLAY = 1;
	TF_Matchmaking_TOBOR = 2;
	TF_Matchmaking_LADDER = 3;
}

enum TF_Matchmaking_WizardStep {
	TF_Matchmaking_WizardStep_INVALID = 0;
	TF_Matchmaking_WizardStep_TOBOR_PLAY_FOR_BRAGGING_RIGHTS = 1;
	TF_Matchmaking_WizardStep_TOBOR_TOUR_OF_DUTY = 2;
	TF_Matchmaking_WizardStep_TOBOR_CHALLENGE = 3;
	TF_Matchmaking_WizardStep_QUICKPLAY = 4;
	TF_Matchmaking_WizardStep_SEARCHING = 5;
	TF_Matchmaking_WizardStep_LADDER = 6;
}

enum TF_GC_GameState {
	TF_GC_GAMESTATE_STATE_INIT = 0;
	TF_GC_GAMESTATE_WAIT_FOR_PLAYERS_TO_LOAD = 1;
	TF_GC_GAMESTATE_STRATEGY_TIME = 3;
	TF_GC_GAMESTATE_GAME_IN_PROGRESS = 5;
	TF_GC_GAMESTATE_POST_GAME = 6;
	TF_GC_GAMESTATE_DISCONNECT = 7;
	TF_GC_GAMESTATE_LAST = 8;
}

enum TF_GC_TEAM {
	TF_GC_TEAM_DEFENDERS = 0;
	TF_GC_TEAM_INVADERS = 1;
	TF_GC_TEAM_BROADCASTER = 2;
	TF_GC_TEAM_SPECTATOR = 3;
	TF_GC_TEAM_PLAYER_POOL = 4;
	TF_GC_TEAM_NOTEAM = 5;
}

enum TFLobbyReadyState {
	TFLobbyReadyState_UNDECLARED = 0;
	TFLobbyReadyState_ACCEPTED = 1;
	TFLobbyReadyState_DECLINED = 2;
}

enum ChatChannelType_t {
	ChatChannelType_Regional = 0;
	ChatChannelType_Custom = 1;
	ChatChannelType_Party = 2;
	ChatChannelType_Lobby = 3;
}

enum ServerMatchmakingState {
	ServerMatchmakingState_INVALID = 0;
	ServerMatchmakingState_NOT_PARTICIPATING = 1;
	ServerMatchmakingState_EMPTY = 2;
	ServerMatchmakingState_ACTIVE_SLOTS_AVAILABLE = 3;
	ServerMatchmakingState_ACTIVE_FULL = 4;
}

message CMsgTFGoldenWrenchBroadcast {
	optional int32 wrench_number = 1;
	optional bool deleted = 2;
	optional string user_name = 3;
}

message CMsgTFSaxxyBroadcast {
	optional int32 category_number = 1;
	optional string user_name = 2;
}

message CMsgGCTFSpecificItemBroadcast {
	optional uint32 item_def_index = 1;
	optional bool was_destruction = 2;
	optional string user_name = 3;
}

message CSOTFDuelSummary {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 duel_wins = 2;
	optional uint32 duel_losses = 3;
	optional uint32 last_duel_account_id = 4;
	optional uint32 last_duel_timestamp = 5;
	optional uint32 last_duel_status = 6;
}

message CSOTFMapContribution {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 def_index = 2 [(key_field) = true];
	optional uint32 contribution_level = 3;
}

message CMsgTFVoteKickBanPlayer {
	optional uint32 account_id_subject = 1;
	optional uint32 kick_reason = 2;
}

message CMsgTFVoteKickBanPlayerResult {
	optional uint32 account_id_initiator = 1;
	optional uint32 account_id_subject = 2;
	optional uint32 kick_reason = 3;
	optional bool kick_successful = 4;
	optional uint32 num_yes_votes = 5;
	optional uint32 num_no_votes = 6;
	optional uint32 num_possible_votes = 7;
}

message CMsgTFFreeTrialChooseMostHelpfulFriend {
	optional uint32 account_id_friend = 1;
}

message CMsgTFRequestTF2Friends {
	repeated uint32 account_ids = 1;
}

message CMsgTFRequestTF2FriendsResponse {
	repeated uint32 account_ids = 1;
}

message CSOTFPlayerInfo {
	optional uint32 num_new_users_helped = 1;
}

message CMsgTFThankedBySomeone {
	optional uint64 thanker_steam_id = 1;
}

message CMsgTFThankedSomeone {
}

message CMsgTFFreeTrialConvertedToPremium {
}

message CMsgSaxxyAwarded {
	optional uint32 category = 1;
	repeated string winner_names = 2;
}

message CMsgReplaySubmitContestEntry {
	optional string youtube_url = 1;
	optional uint32 category = 2;
}

message CMsgReplaySubmitContestEntryResponse {
	optional bool success = 1;
}

message CReplayCachedContestData {
	optional fixed32 timestamp = 1;
	optional uint32 num_votes_last_day = 2;
	repeated uint32 video_entry_ids = 3;
	optional uint32 num_flags_last_day = 4;
}

message CMsgTFCoaching_AddToCoaches {
}

message CMsgTFCoaching_RemoveFromCoaches {
}

message CMsgTFCoaching_FindCoach {
	optional uint32 account_id_friend_as_coach = 1;
}

message CMsgTFCoaching_FindCoachResponse {
	optional bool found_coach = 1;
	optional uint32 num_likes = 2;
	optional string coach_name = 3;
}

message CMsgTFCoaching_AskCoach {
	optional uint32 account_id_student = 1;
	optional bool student_is_friend = 2;
}

message CMsgTFCoaching_AskCoachResponse {
	optional bool accept_coaching_assignment = 1;
}

message CMsgTFCoaching_CoachJoinGame {
	optional bool join_game = 1;
	optional uint32 server_address = 2;
	optional uint32 server_port = 3;
	optional uint32 account_id_student = 4;
}

message CMsgTFCoaching_CoachJoining {
	optional uint32 account_id_coach = 1;
	optional uint32 account_id_student = 2;
}

message CMsgTFCoaching_CoachJoined {
	optional uint32 account_id_coach = 1;
}

message CMsgTFCoaching_LikeCurrentCoach {
	optional bool like_coach = 1;
}

message CMsgTFCoaching_RemoveCurrentCoach {
	optional uint32 account_id_coach = 1;
}

message CMsgTFQuickplay_ScoreServers {
	message ServerInfo {
		optional uint32 server_address = 1;
		optional uint32 server_port = 2;
		optional uint32 num_users = 3;
		optional uint64 steam_id = 4;
		optional uint32 max_users = 5;
		optional float user_score = 6;
	}

	repeated .CMsgTFQuickplay_ScoreServers.ServerInfo servers = 1;
}

message CMsgTFQuickplay_ScoreServersResponse {
	message ServerInfo {
		optional uint32 server_address = 1;
		optional uint32 server_port = 2;
		optional float total_score = 3;
		optional uint64 steam_id = 4;
		optional uint32 options_score = 5;
	}

	repeated .CMsgTFQuickplay_ScoreServersResponse.ServerInfo servers = 1;
}

message CMsgTFQuickplay_PlayerJoining {
	optional uint32 account_id = 1;
}

message CMsgGC_GameServer_LevelInfo {
	optional bool level_loaded = 1;
	optional string level_name = 2;
}

message CMsgGC_GameServer_AuthChallenge {
	optional string challenge_string = 1;
}

message CMsgGC_GameServer_AuthResult {
	optional bool authenticated = 1;
	optional int32 game_server_standing = 2;
	optional int32 game_server_standing_trend = 3;
	optional bool is_valve_server = 4;
	optional string message = 5;
}

message CMsgGC_GameServer_AuthChallengeResponse {
	optional uint32 game_server_account_id = 1;
	optional bytes hashed_challenge_string = 2;
}

message CMsgGC_GameServer_CreateIdentity {
	optional uint32 account_id = 1;
}

message CMsgGC_GameServer_CreateIdentityResponse {
	enum EStatus {
		kStatus_GenericFailure = 0;
		kStatus_TooMany = -1;
		kStatus_NoPrivs = -2;
		kStatus_Created = 1;
	}

	optional bool account_created = 1;
	optional uint32 game_server_account_id = 2;
	optional string game_server_identity_token = 3;
	optional .CMsgGC_GameServer_CreateIdentityResponse.EStatus status = 4 [default = kStatus_GenericFailure];
}

message CMsgGC_GameServer_List {
	optional uint32 account_id = 1;
}

message CMsgGC_GameServer_ListResponse {
	message GameServerIdentity {
		optional uint32 game_server_account_id = 1;
		optional string game_server_identity_token = 2;
		optional int32 game_server_standing = 3;
		optional int32 game_server_standing_trend = 4;
	}

	repeated .CMsgGC_GameServer_ListResponse.GameServerIdentity owned_game_servers = 1;
}

message CMsgGC_GameServer_ResetIdentity {
	optional uint32 game_server_account_id = 1;
}

message CMsgGC_GameServer_ResetIdentityResponse {
	optional bool game_server_identity_token_reset = 1;
	optional uint32 game_server_account_id = 2;
	optional string game_server_identity_token = 3;
}

message CMsgGC_GameServer_AckPolicy {
}

message CMsgGC_GameServer_AckPolicyResponse {
	optional uint32 result = 1;
	optional string message = 2;
}

message CMsgGC_Client_UseServerModificationItem {
	optional uint64 item_id = 1;
}

message CMsgGC_Client_UseServerModificationItem_Response {
	enum EServerModificationItemResponse {
		kServerModificationItemResponse_AlreadyInUse = 1;
		kServerModificationItemResponse_NotOnAuthenticatedServer = 2;
		kServerModificationItemResponse_ServerReject = 3;
		kServerModificationItemResponse_InternalError = 4;
		kServerModificationItemResponse_EventAlreadyActive = 5;
	}

	optional .CMsgGC_Client_UseServerModificationItem_Response.EServerModificationItemResponse response_code = 1 [default = kServerModificationItemResponse_AlreadyInUse];
}

message CMsgGC_GameServer_UseServerModificationItem {
	optional .EServerModificationItemType modification_type = 1 [default = kGameServerModificationItem_Halloween];
}

message CMsgGC_GameServer_UseServerModificationItem_Response {
	enum EServerModificationItemServerResponse {
		kServerModificationItemServerResponse_Accepted = 1;
		kServerModificationItemServerResponse_NoVoteCalled = 2;
		kServerModificationItemServerResponse_VoteFailed = 3;
	}

	optional .EServerModificationItemType modification_type = 1 [default = kGameServerModificationItem_Halloween];
	optional .CMsgGC_GameServer_UseServerModificationItem_Response.EServerModificationItemServerResponse server_response_code = 2 [default = kServerModificationItemServerResponse_Accepted];
}

message CMsgGC_GameServer_ServerModificationItemExpired {
	optional .EServerModificationItemType modification_type = 1 [default = kGameServerModificationItem_Halloween];
}

message CMsgGC_GameServer_ServerModificationItem {
	optional .EServerModificationItemType modification_type = 1 [default = kGameServerModificationItem_Halloween];
	optional bool active = 2;
}

message CMsgGC_Halloween_ReservedItem {
	repeated float x = 1;
	repeated float y = 2;
	repeated float z = 3;
	optional uint32 spawn_meta_info = 7;
}

message CMsgGC_Halloween_GrantItem {
	optional uint32 recipient_account_id = 1;
	optional uint32 level_id = 2;
	optional bool flagged = 3;
}

message CMsgGC_Halloween_GrantItemResponse {
	optional uint32 recipient_account_id = 1;
}

message CMsgGC_Halloween_ItemClaimed {
}

message CMsgGC_PickupItemEligibility_Query {
	optional uint32 account_id = 1;
	optional uint32 seconds_ago = 2;
}

message CMsgGC_PickupItemEligibility_QueryResponse {
	optional uint32 account_id = 1;
	optional bool was_eligible = 2;
	optional uint32 level_id = 3;
}

message CSOTFPartyMember {
	optional bool owns_ticket = 2;
	optional uint32 completed_missions = 3;
	optional uint32 badge_level = 4;
	optional bool squad_surplus = 5;
	optional bool is_banned = 8 [default = false];
	optional bool owns_ladder_ticket = 9;
}

message CMsgMatchSearchCriteria {
	optional .TF_MatchmakingMode matchmaking_mode = 7 [default = TF_Matchmaking_INVALID];
	optional bool late_join_ok = 5;
	optional string mvm_mannup_tour = 10;
	repeated string mvm_missions = 9;
	optional bool play_for_bragging_rights = 6;
	optional uint32 quickplay_game_type = 8;
	optional uint32 ladder_type = 11;
}

message CMsgCreateOrUpdateParty {
	optional .CMsgMatchSearchCriteria search_criteria = 1;
	optional fixed64 steam_lobby_id = 3;
	optional bool squad_surplus = 4;
	optional .TF_Matchmaking_WizardStep wizard_step = 5 [default = TF_Matchmaking_WizardStep_INVALID];
	optional uint32 client_version = 6 [default = 1225];
}

message CMsgCreateOrUpdatePartyReply {
	optional uint32 result = 1;
	optional string message = 2;
	optional .TF_Matchmaking_WizardStep wizard_step = 3 [default = TF_Matchmaking_WizardStep_INVALID];
}

message CSOTFParty {
	enum State {
		UI = 0;
		FINDING_MATCH = 1;
		IN_MATCH = 2;
		AWAITING_RESERVATION_CONFIRMATION = 3;
	}

	optional uint64 party_id = 1 [(key_field) = true];
	optional fixed64 leader_id = 2;
	repeated fixed64 member_ids = 3;
	repeated .CSOTFPartyMember members = 13;
	repeated fixed64 pending_invites = 5;
	optional .CSOTFParty.State state = 6 [default = UI];
	optional .TF_Matchmaking_WizardStep wizard_step = 29 [default = TF_Matchmaking_WizardStep_INVALID];
	optional uint32 started_matchmaking_time = 7;
	repeated uint32 searching_players_by_group = 10;
	optional fixed64 steam_lobby_id = 27;
	optional .TF_MatchmakingMode matchmaking_mode = 30 [default = TF_Matchmaking_INVALID];
	optional bool search_late_join_ok = 23;
	optional string search_mvm_mannup_tour = 32;
	repeated string search_mvm_missions = 31;
	optional bool search_play_for_bragging_rights = 26;
	optional uint32 search_quickplay_game_type = 28;
	optional uint32 search_ladder_type = 33;
	optional uint32 prevent_match_until_date = 18;
	optional uint32 prevent_match_account_id = 19;
}

message CSOTFPartyInvite {
	message PartyMember {
		optional string name = 1;
		optional fixed64 steam_id = 2;
		optional uint32 avatar = 3;
	}

	optional uint64 group_id = 1 [(key_field) = true];
	optional fixed64 sender_id = 2;
	optional string sender_name = 3;
	repeated .CSOTFPartyInvite.PartyMember members = 4;
}

message CTFLobbyMember {
	enum ConnectState {
		INVALID = 0;
		RESERVATION_PENDING = 1;
		RESERVED = 2;
		CONNECTED = 3;
		DISCONNECTED = 5;
	}

	optional fixed64 id = 1 [(key_field) = true];
	optional .TF_GC_TEAM team = 3 [default = TF_GC_TEAM_DEFENDERS];
	optional .CTFLobbyMember.ConnectState connect_state = 13 [default = INVALID];
	optional string name = 6;
	optional float latitude = 8;
	optional float longitude = 9;
	optional .TFLobbyReadyState ready_state = 11 [default = TFLobbyReadyState_UNDECLARED];
	optional uint64 party_id = 12;
	optional bool squad_surplus = 14;
	optional uint32 badge_level = 15;
	optional uint32 abandon_time = 16 [default = 0];
	optional uint32 last_connect_time = 17;
	optional bool quitting_results_in_penalty = 18;
}

message CLobbyPendingPlayerReport {
	optional uint32 account_id = 1;
	optional fixed32 date = 2;
}

message CMsgGameMatchSignOut {
}

message CSOTFLobby {
	enum State {
		SERVERSETUP = 1;
		RUN = 2;
		POSTGAME = 3;
		NOTREADY = 5;
		SERVERASSIGN = 6;
	}

	enum LobbyType {
		INVALID = -1;
		MATCH = 0;
		PRACTICE = 1;
		TOURNAMENT = 2;
		TUTORIAL = 3;
	}

	optional uint64 lobby_id = 1 [(key_field) = true];
	repeated .CTFLobbyMember members = 2;
	repeated .CTFLobbyMember left_members = 7;
	optional fixed64 leader_id = 11;
	optional fixed64 server_id = 6 [default = 0];
	repeated fixed64 pending_invites = 10;
	optional .CSOTFLobby.State state = 4 [default = SERVERSETUP];
	optional string connect = 5;
	optional .CSOTFLobby.LobbyType lobby_type = 12 [default = INVALID];
	optional bool allow_cheats = 13;
	optional string game_name = 16;
	optional uint32 server_region = 21 [default = 0];
	optional .TF_GC_GameState game_state = 22 [default = TF_GC_GAMESTATE_STATE_INIT];
	optional uint32 num_spectators = 23;
	optional uint32 matchgroup = 25;
	optional float readyup_remaining_time = 26;
	optional bool leaver_detected = 27;
	optional bool allow_spectating = 31 [default = true];
	optional fixed64 load_game_lobby_id = 33;
	optional uint32 load_game_save_number = 34;
	optional string mannup_tour_name = 42;
	optional string map_name = 38;
	optional string mission_name = 39;
	optional uint32 match_group = 41;
	optional uint32 match_id = 30;
	optional fixed32 replay_salt = 35;
}

message CMsgExitMatchmaking {
}

message CMsgAcceptInvite {
	optional uint64 party_id = 1;
	optional fixed64 steamid_lobby = 2;
	optional uint32 client_version = 3 [default = 1225];
}

message CMsgAcceptInviteResponse {
	optional int32 result_code = 1;
}

message CMsgReadyUp {
	optional .TFLobbyReadyState state = 1 [default = TFLobbyReadyState_UNDECLARED];
}

message CMsgMatchmakingSearchCountRequest {
}

message CMsgMatchmakingSearchCountResponse {
	repeated uint32 searching_players_by_group = 1;
}

message CMsgKickedFromMatchmakingQueue {
}

message CMsgTFPlayerFailedToConnect {
	repeated fixed64 failed_loaders = 1;
}

message CMsgTFJoinChatChannel {
	optional string persona_name = 1;
	optional string channel_name = 2;
	optional string password = 3;
	optional .ChatChannelType_t channel_type = 4 [default = ChatChannelType_Regional];
}

message CMsgTFLeaveChatChannel {
	optional string channel_name = 1;
}

message CMsgTFJoinChatChannelResponse {
	message ChatMember {
		optional fixed64 steam_id = 1;
		optional string persona_name = 2;
	}

	optional uint32 response = 1;
	optional string channel_name = 2;
	optional fixed64 channel_id = 3;
	optional uint32 max_members = 4;
	repeated .CMsgTFJoinChatChannelResponse.ChatMember members = 5;
}

message CMsgTFOtherJoinedChatChannel {
	optional fixed64 channel_id = 1;
	optional string persona_name = 2;
	optional fixed64 steam_id = 3;
}

message CMsgTFOtherLeftChatChannel {
	optional fixed64 channel_id = 1;
	optional fixed64 steam_id = 2;
}

message CMsgTFRequestDefaultChatChannel {
}

message CMsgTFRequestDefaultChatChannelResponse {
	optional string channel_name = 1;
	optional fixed64 channel_id = 2;
}

message CMsgTFRequestChatChannelList {
}

message CMsgTFRequestChatChannelListResponse {
	message ChatChannel {
		optional string channel_name = 1;
		optional uint32 num_members = 2;
		optional .ChatChannelType_t channel_type = 3 [default = ChatChannelType_Regional];
	}

	repeated .CMsgTFRequestChatChannelListResponse.ChatChannel channels = 1;
}

message CMsgGameServerMatchmakingStatus {
	message Player {
		optional fixed64 steam_id = 1;
		optional .CMsgGameServerMatchmakingStatus.PlayerConnectState connect_state = 2 [default = INVALID];
	}

	enum PlayerConnectState {
		INVALID = 0;
		CONNECTED = 1;
		RESERVED = 2;
	}

	enum Event {
		None = 0;
		MvMVictory = 1;
		MvMDefeat = 2;
		AcknowledgePlayers = 3;
	}

	optional uint32 server_version = 16 [default = 1225];
	optional .ServerMatchmakingState matchmaking_state = 1 [default = ServerMatchmakingState_INVALID];
	optional .TF_MatchmakingMode matchmaking_mode = 2 [default = TF_Matchmaking_INVALID];
	optional string map = 3;
	optional string tags = 4;
	optional uint32 bot_count = 5;
	optional uint32 num_spectators = 6;
	optional uint32 max_players = 7;
	optional uint32 slots_free = 8;
	optional uint32 server_region = 9;
	optional float server_loadavg = 10;
	optional bool server_trusted = 11;
	optional bool server_dedicated = 12;
	optional uint32 strict = 17;
	repeated .CMsgGameServerMatchmakingStatus.Player players = 13;
	optional .TF_GC_GameState game_state = 14 [default = TF_GC_GAMESTATE_STATE_INIT];
	optional .CMsgGameServerMatchmakingStatus.Event event = 15 [default = None];
	optional uint32 mvm_wave = 18;
	optional uint32 mvm_credits_acquired = 19;
	optional uint32 mvm_credits_dropped = 20;
	optional uint32 skillrating_force_average = 21;
}

message CMsgMatchmakingProgress {
	optional uint32 avg_wait_time_new = 4;
	optional uint32 avg_wait_time_join_late = 5;
	optional uint32 your_wait_time = 6;
	optional uint32 matching_worldwide_searching_players = 8;
	optional uint32 matching_near_you_searching_players = 9;
	optional uint32 total_worldwide_searching_players = 13;
	optional uint32 total_near_you_searching_players = 14;
	optional uint32 matching_worldwide_active_players = 15;
	optional uint32 matching_near_you_active_players = 16;
	optional uint32 total_worldwide_active_players = 17;
	optional uint32 total_near_you_active_players = 18;
	optional uint32 matching_worldwide_empty_gameservers = 19;
	optional uint32 matching_near_you_empty_gameservers = 20;
	optional uint32 total_worldwide_empty_gameservers = 21;
	optional uint32 total_near_you_empty_gameservers = 22;
	optional uint32 urgency_pct = 1;
}

message CMsgMvMVictoryInfo {
	message Item {
		optional .CMsgMvMVictoryInfo.GrantReason grant_reason = 1 [default = INVALID];
		optional bytes item_data = 2;
		optional fixed64 squad_surplus_claimer_steam_id = 3;
	}

	message Player {
		optional fixed64 steam_id = 1;
		optional bool badge_granted = 3;
		optional bool badge_progress_updated = 4;
		optional bool badge_leveled = 5;
		optional uint32 badge_level = 6;
		optional uint32 badge_progress_bits = 7;
		repeated .CMsgMvMVictoryInfo.Item items = 8;
		optional bool voucher_missing = 9;
	}

	enum GrantReason {
		INVALID = 0;
		BADGE_LEVELED = 1;
		SQUAD_SURPLUS = 2;
		MANN_UP = 3;
		HELP_A_NOOB = 4;
	}

	repeated .CMsgMvMVictoryInfo.Player players = 1;
	optional string tour_name = 2;
	optional string mission_name = 3;
}

message CGCMsgTFHelloResponse {
	optional uint32 version_check = 1;
	repeated uint64 version_checksum = 2;
	optional uint32 version_verbose = 3;
}

message CGCMsgTFSync {
	optional bytes version_checksum = 1;
	optional uint32 version_check = 2;
	optional uint32 version_check_ex = 3;
	optional uint32 version_check_ex2 = 4;
	optional bytes version_checksum_ex = 5;
}

message CGCMsgTFSyncEx {
	optional string version_checksum = 1;
	optional bytes version_checksum_ex = 2;
	optional uint32 version_check = 3;
}

message CMsgMvMVictory {
	message Player {
		optional fixed64 steam_id = 1;
		optional bool squad_surplus = 2;
	}

	optional uint32 legacy_mission_index = 1;
	optional string tour_name_mannup = 5;
	optional string mission_name = 6;
	repeated .CMsgMvMVictory.Player players = 2;
	optional uint64 lobby_id = 3;
	optional fixed32 event_time = 4;
}

message CMsgMvMMannUpVictoryReply {
	optional uint32 result = 1;
}

message CMsgGameServerKickingLobby {
	repeated fixed64 connected_players = 1;
}

message CMsgLeaveGameAndPrepareToJoinParty {
	optional fixed64 party_id = 1;
}

message CMsgRemovePlayerFromLobby {
	enum RemoveReason {
		VOTE_KICK = 0;
		IDLE_KICK = 1;
		ADMIN_KICK = 2;
		GAME_OVER = 3;
	}

	optional fixed64 steam_id = 1;
	optional .CMsgRemovePlayerFromLobby.RemoveReason remove_reason = 2 [default = VOTE_KICK];
}

message CMsgSetLobbySafeToLeave {
	optional fixed64 lobby_id = 1;
}

message CMsgHalloween_ServerBossEvent {
	optional uint32 event_counter = 1;
	optional uint32 timestamp = 2;
	optional uint32 boss_type = 3;
	optional uint32 boss_level = 4;
	optional uint32 event_type = 5;
	optional uint32 players_involved = 6;
	optional float elapsed_time = 7;
}

message CMsgHalloween_Merasmus2012 {
	optional uint32 event_counter = 1;
	optional fixed32 time_submitted = 2;
	optional bool is_valve_server = 3;
	optional uint32 boss_level = 4;
	optional uint32 spawned_health = 5;
	optional uint32 remaining_health = 6;
	optional uint32 life_time = 7;
	optional uint32 bomb_kills = 8;
	optional uint32 staff_kills = 9;
	optional uint32 pvp_kills = 10;
	optional uint32 prophunt_time1 = 11;
	optional uint32 prophunt_time2 = 12;
	optional uint32 dmg_scout = 13;
	optional uint32 dmg_sniper = 14;
	optional uint32 dmg_soldier = 15;
	optional uint32 dmg_demo = 16;
	optional uint32 dmg_medic = 17;
	optional uint32 dmg_heavy = 18;
	optional uint32 dmg_pyro = 19;
	optional uint32 dmg_spy = 20;
	optional uint32 dmg_engineer = 21;
	optional uint32 scout_count = 22;
	optional uint32 sniper_count = 23;
	optional uint32 solider_count = 24;
	optional uint32 demo_count = 25;
	optional uint32 medic_count = 26;
	optional uint32 heavy_count = 27;
	optional uint32 pyro_count = 28;
	optional uint32 spy_count = 29;
	optional uint32 engineer_count = 30;
}

message CMsgUpdateHalloweenMerasmusLootLevel {
	message Player {
		optional fixed64 steam_id = 1;
	}

	repeated .CMsgUpdateHalloweenMerasmusLootLevel.Player players = 1;
	optional uint32 merasmus_level = 2;
}

message CAttribute_String {
	optional string value = 1;
}

message CAttribute_DynamicRecipeComponent {
	optional uint32 def_index = 1;
	optional uint32 item_quality = 2;
	optional uint32 component_flags = 3;
	optional string attributes_string = 4;
	optional uint32 num_required = 5;
	optional uint32 num_fulfilled = 6;
}

message CAttribute_DynamicRecipeComponent_COMPAT_NEVER_SERIALIZE_THIS_OUT {
	optional uint32 def_index = 1;
	optional uint32 item_def = 2;
	optional uint32 item_quality = 3;
	optional uint32 component_flags = 4;
	optional uint32 item_flags = 5;
	optional string attributes_string = 6;
	optional uint32 num_required = 7;
	optional uint32 item_count = 8;
	optional uint32 num_fulfilled = 9;
	optional uint32 items_fulfilled = 10;
}

message CAttribute_ItemSlotCriteria {
	optional string tags = 1;
}

message CMsgSetItemSlotAttribute {
	optional uint64 item_id = 1;
	optional uint64 slot_item_original_id = 2;
	optional uint32 slot_index = 3;
}

message CGCMsgTFPlayerSkillRatingAdjustment {
	message Player {
		optional fixed64 steam_id = 1;
		optional int32 adjustment = 3;
	}

	enum MatchType {
		PUBLIC = 0;
		BETA = 1;
	}

	repeated .CGCMsgTFPlayerSkillRatingAdjustment.Player players = 1;
	optional .CGCMsgTFPlayerSkillRatingAdjustment.MatchType match_type = 2 [default = PUBLIC];
}

message CSOTFSpyVsEngyWarData {
	optional uint32 account_id = 1 [(key_field) = true];
	optional uint32 affiliation = 2;
	optional uint32 points_for_engy = 3;
	optional uint32 points_for_spy = 4;
	optional uint32 kills_for_engy = 5;
	optional uint32 kills_for_spy = 6;
	optional string killcam_message = 7;
}

message CGCMsgGC_SpyVsEngyWar_IndividualUpdate {
	optional fixed64 steam_id = 1;
	optional uint32 engy_points_scored = 2;
	optional uint32 spy_points_scored = 3;
	optional uint32 engy_kills_scored = 4;
	optional uint32 spy_kills_scored = 5;
}

message CGCMsgGC_SpyVsEngyWar_JoinWar {
	optional uint32 affiliation = 1;
}

message CGCMsgGC_SpyVsEngyWar_SetKillCamMessage {
	optional string killcam_message = 1;
}

message CGCMsgGC_SpyVsEngyWar_RequestGlobalStats {
}

message CGCMsgGC_SpyVsEngyWar_GlobalStatsResponse {
	optional uint64 spy_score = 1;
	optional uint64 engy_score = 2;
}

message CGCMsgGC_PlayerDuckLeaderboard_IndividualUpdate {
	optional uint32 score = 2;
	optional uint32 type = 3;
	optional bytes score_id = 4;
	optional uint32 score_check = 5;
}

