diff --git a/.travis.yml b/.travis.yml
index fd889d67..949d076a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,4 @@
language: node_js
node_js:
- - "8.9.1"
- - "9.2.0"
+ - "10.1.0"
+ - "8.11.1"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8bfad038..7f928dbd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# Changelog 6.1.0
+## General
+ * Removed some trailing util.log commands
+ * Protobuf updates
+ * Attempt to fix mocha not exiting
+ * Added profile request fuction that allows fetching profile page
+
# Changelog 6.0.0
## General
Fixed some chat channel bugs
diff --git a/README.md b/README.md
index ed5994f0..5a0efe7c 100644
--- a/README.md
+++ b/README.md
@@ -80,6 +80,7 @@ Dota 2 module
* [.requestChatChannels()](#module_Dota2.Dota2Client+requestChatChannels)
* [.requestPlayerMatchHistory(account_id, [options], [callback])](#module_Dota2.Dota2Client+requestPlayerMatchHistory)
* [.requestProfileCard(account_id, [callback])](#module_Dota2.Dota2Client+requestProfileCard)
+ * [.requestProfile(account_id, [callback])](#module_Dota2.Dota2Client+requestProfile)
* [.requestHallOfFame(week, [callback])](#module_Dota2.Dota2Client+requestHallOfFame)
* [.requestPlayerInfo(account_ids)](#module_Dota2.Dota2Client+requestPlayerInfo)
* [.requestTrophyList(account_id, [callback])](#module_Dota2.Dota2Client+requestTrophyList)
@@ -149,6 +150,7 @@ Dota 2 module
* ["chatChannelsData" (channels)](#module_Dota2.Dota2Client+event_chatChannelsData)
* ["playerMatchHistoryData" (requestId, matchHistoryResponse)](#module_Dota2.Dota2Client+event_playerMatchHistoryData)
* ["profileCardData" (account_id, profileCardResponse)](#module_Dota2.Dota2Client+event_profileCardData)
+ * ["profileData" (profileResponse)](#module_Dota2.Dota2Client+event_profileData)
* ["hallOfFameData" (week, featured_players, featured_farmer, hallOfFameResponse)](#module_Dota2.Dota2Client+event_hallOfFameData)
* ["playerInfoData" (playerInfoData)](#module_Dota2.Dota2Client+event_playerInfoData)
* ["trophyListData" (trophyListResponse)](#module_Dota2.Dota2Client+event_trophyListData)
@@ -218,6 +220,7 @@ Dota 2 module
* [.requestChatChannels()](#module_Dota2.Dota2Client+requestChatChannels)
* [.requestPlayerMatchHistory(account_id, [options], [callback])](#module_Dota2.Dota2Client+requestPlayerMatchHistory)
* [.requestProfileCard(account_id, [callback])](#module_Dota2.Dota2Client+requestProfileCard)
+ * [.requestProfile(account_id, [callback])](#module_Dota2.Dota2Client+requestProfile)
* [.requestHallOfFame(week, [callback])](#module_Dota2.Dota2Client+requestHallOfFame)
* [.requestPlayerInfo(account_ids)](#module_Dota2.Dota2Client+requestPlayerInfo)
* [.requestTrophyList(account_id, [callback])](#module_Dota2.Dota2Client+requestTrophyList)
@@ -287,6 +290,7 @@ Dota 2 module
* ["chatChannelsData" (channels)](#module_Dota2.Dota2Client+event_chatChannelsData)
* ["playerMatchHistoryData" (requestId, matchHistoryResponse)](#module_Dota2.Dota2Client+event_playerMatchHistoryData)
* ["profileCardData" (account_id, profileCardResponse)](#module_Dota2.Dota2Client+event_profileCardData)
+ * ["profileData" (profileResponse)](#module_Dota2.Dota2Client+event_profileData)
* ["hallOfFameData" (week, featured_players, featured_farmer, hallOfFameResponse)](#module_Dota2.Dota2Client+event_hallOfFameData)
* ["playerInfoData" (playerInfoData)](#module_Dota2.Dota2Client+event_playerInfoData)
* ["trophyListData" (trophyListResponse)](#module_Dota2.Dota2Client+event_trophyListData)
@@ -364,29 +368,29 @@ The lobby the bot is currently in. Falsy if the bot isn't in a lobby.
| --- | --- | --- | --- |
| game_name | string
| | Name of the lobby |
| pass_key | string
| | Lobby password |
-| server_region | [ServerRegion
](#module_Dota2.ServerRegion) | module:Dota2.ServerRegion.UNSPECIFIED
| Server region where the lobby will be created |
-| game_mode | DOTA_GameMode
| DOTA_GameMode.DOTA_GAMEMODE_AP
| Game mode |
-| game_version | DOTAGameVersion
| DOTAGameVersion.GAME_VERSION_STABLE
| Version of the game |
-| cm_pick | DOTA_CM_PICK
| DOTA_CM_PICK.DOTA_CM_RANDOM
| Who gets first pick |
-| allow_cheats | boolean
| false
| Whether or not to allow cheats |
-| fill_with_bots | boolean
| false
| Whether or not to fill empty slots with bots |
-| bot_difficulty_radiant | BotDifficulty
| module:Dota2.BotDifficulty.PASSIVE
| The bot difficulty for radiant bots, if fill_with_bots is true. |
-| bot_difficulty_dire | BotDifficulty
| module:Dota2.BotDifficulty.PASSIVE
| The bot difficulty for dire bots, if fill_with_bots is true. |
-| bot_radiant | number
| | Presumably the ID of the custom AI to be applied to radiant bots. |
-| bot_dire | number
| | Presumably the ID of the custom AI to be applied to dire bots. |
-| allow_spectating | boolean
| true
| Whether or not to allow spectating |
-| series_type | SeriesType
| NONE
| Whether or not the game is part of a series (Bo3, Bo5). |
-| radiant_series_wins | number
| 0
| # of games won so far, e.g. for a Bo3 or Bo5. |
-| dire_series_wins | number
| 0
| # of games won so far, e.g. for a Bo3 or Bo5. |
-| previous_match_override | number
| | In a series, the match ID of the previous game. If not supplied, the GC will try to find it automatically based on the teams and the players. |
-| allchat | boolean
| false
| Whether or not it's allowed to all-chat |
-| dota_tv_delay | LobbyDotaTVDelay
| LobbyDotaTV_120
| How much time the game should be delayed for DotaTV. |
-| leagueid | number
| | The league this lobby is being created for. The bot should be a league admin for this to work. |
-| custom_game_mode | string
| | Name of the custom game |
-| custom_map_name | string
| | Which map the custom game should be played on |
-| custom_difficulty | number
| | Difficulty of the custom game |
-| custom_game_id | [Long
](#external_Long) | | 64bit ID of the custom game mode |
-| pause_setting | LobbyDotaPauseSetting
| 0
| Pause setting: 0 - unlimited, 1 - limited, 2 - disabled |
+| [server_region] | [ServerRegion
](#module_Dota2.ServerRegion) | module:Dota2.ServerRegion.UNSPECIFIED
| Server region where the lobby will be created |
+| [game_mode] | DOTA_GameMode
| DOTA_GameMode.DOTA_GAMEMODE_AP
| Game mode |
+| [game_version] | DOTAGameVersion
| DOTAGameVersion.GAME_VERSION_STABLE
| Version of the game |
+| [cm_pick] | DOTA_CM_PICK
| DOTA_CM_PICK.DOTA_CM_RANDOM
| Who gets first pick |
+| [allow_cheats] | boolean
| false
| Whether or not to allow cheats |
+| [fill_with_bots] | boolean
| false
| Whether or not to fill empty slots with bots |
+| [bot_difficulty_radiant] | BotDifficulty
| module:Dota2.BotDifficulty.PASSIVE
| The bot difficulty for radiant bots, if fill_with_bots is true. |
+| [bot_difficulty_dire] | BotDifficulty
| module:Dota2.BotDifficulty.PASSIVE
| The bot difficulty for dire bots, if fill_with_bots is true. |
+| [bot_radiant] | number
| | Presumably the ID of the custom AI to be applied to radiant bots. |
+| [bot_dire] | number
| | Presumably the ID of the custom AI to be applied to dire bots. |
+| [allow_spectating] | boolean
| true
| Whether or not to allow spectating |
+| [series_type] | SeriesType
| NONE
| Whether or not the game is part of a series (Bo3, Bo5). |
+| [radiant_series_wins] | number
| 0
| # of games won so far, e.g. for a Bo3 or Bo5. |
+| [dire_series_wins] | number
| 0
| # of games won so far, e.g. for a Bo3 or Bo5. |
+| [previous_match_override] | number
| | In a series, the match ID of the previous game. If not supplied, the GC will try to find it automatically based on the teams and the players. |
+| [allchat] | boolean
| false
| Whether or not it's allowed to all-chat |
+| [dota_tv_delay] | LobbyDotaTVDelay
| LobbyDotaTV_120
| How much time the game should be delayed for DotaTV. |
+| [leagueid] | number
| | The league this lobby is being created for. The bot should be a league admin for this to work. |
+| [custom_game_mode] | string
| | Name of the custom game |
+| [custom_map_name] | string
| | Which map the custom game should be played on |
+| [custom_difficulty] | number
| | Difficulty of the custom game |
+| [custom_game_id] | [Long
](#external_Long) | | 64bit ID of the custom game mode |
+| [pause_setting] | LobbyDotaPauseSetting
| 0
| Pause setting: 0 - unlimited, 1 - limited, 2 - disabled |
@@ -549,6 +553,22 @@ Requires the GC to be [ready](#module_Dota2.Dota2Client+event_ready).
| account_id | number
| Dota 2 account ID of the player whose profile card the bot should fetch |
| [callback] | [requestCallback
](#module_Dota2..requestCallback) | Called with `err, CMsgDOTAProfileCard` |
+
+
+#### dota2Client.requestProfile(account_id, [callback])
+Sends a message to the Game Coordinator requesting `account_id`'s profile page.
+This method is heavily rate limited. When abused, the GC just stops responding.
+Even the regular client runs into this limit when you check too many profiles.
+Provide a callback or listen for [profileData](#module_Dota2.Dota2Client+event_profileData) event for Game Coordinator's response.
+Requires the GC to be [ready](#module_Dota2.Dota2Client+event_ready).
+
+**Kind**: instance method of [Dota2Client
](#module_Dota2.Dota2Client)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| account_id | number
| Dota 2 account ID of the player whose profile page the bot should fetch |
+| [callback] | [requestCallback
](#module_Dota2..requestCallback) | Called with `err, CMsgDOTAProfileResponse` |
+
#### dota2Client.requestHallOfFame(week, [callback])
@@ -640,7 +660,6 @@ All requests are staggered in 200ms intervals and time out after 2s.
Requires the GC to be [ready](#module_Dota2.Dota2Client+event_ready).
**Kind**: instance method of [Dota2Client
](#module_Dota2.Dota2Client)
-**Async**: Returns a list of promises that resolve to [FantasyPlayer](#module_Dota2.Dota2Client+requestPlayerCardsByPlayer.FantasyPlayer) objects
##### requestPlayerCardsByPlayer.FantasyPlayer : Object
@@ -1429,6 +1448,17 @@ Emitted in response to a [request for a player's profile card](#module_Dota2.Dot
| account_id | number
| Dota2 account ID of the player whose profile card was fetched. |
| profileCardResponse | CMsgDOTAProfileCard
| The raw response data containing the user's profile card. |
+
+
+#### "profileData" (profileResponse)
+Emitted in response to a [request for a player's profile page](#module_Dota2.Dota2Client+requestProfile)
+
+**Kind**: event emitted by [Dota2Client
](#module_Dota2.Dota2Client)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| profileResponse | CMsgProfileResponse
| The raw response data containing the user's profile page. |
+
#### "hallOfFameData" (week, featured_players, featured_farmer, hallOfFameResponse)
diff --git a/examples/example2.js b/examples/example2.js
index a7dd24db..c689bd8f 100644
--- a/examples/example2.js
+++ b/examples/example2.js
@@ -44,16 +44,15 @@ var onSteamLogOn = function onSteamLogOn(logonResp) {
// COMMUNITY
var accId = 103637655;
- // var playerInfo = 0;
+ var playerInfo = 1;
var playerInfo2 = 0;
// var playerInfo3 = 0;
- // if(playerInfo == 1){ // not working - maybe disabled by Valve
- // Dota2.requestProfile(accId, true);
- // Dota2.on("profileData", function (accId, data) {
- // util.log(JSON.stringify(data));
- // });
- // }
+ if(playerInfo == 1) {
+ Dota2.requestProfile(accId, function (err, data) {
+ util.log(JSON.stringify(data));
+ });
+ }
if(playerInfo2 == 1){
Dota2.requestProfileCard(accId, function (accId, data) {
diff --git a/handlers/chat.js b/handlers/chat.js
index 97dd69b0..a922f91f 100644
--- a/handlers/chat.js
+++ b/handlers/chat.js
@@ -311,11 +311,11 @@ var onUserLeftChannel = function onOtherLeftChannel(message) {
this.emit("chatLeave", channel.channel_name, userWhoLeft.steam_id, userWhoLeft);
this.emit("chatLeft", channel.channel_name);
if (this.debug)
- util.log("Left channel " + channel.channel_name);
+ this.Logger.debug("Left channel " + channel.channel_name);
} else {
this._leaveChatChannelById(userWhoLeft.channel_id);
if (this.debug)
- util.log("I left unknown channel " + userWhoLeft.channel_id);
+ this.Logger.debug("I left unknown channel " + userWhoLeft.channel_id);
}
} else {
if (channel) {
@@ -323,11 +323,11 @@ var onUserLeftChannel = function onOtherLeftChannel(message) {
// Delete member from cached chatChannel
channel.members = channel.members.filter(item => item.steam_id.notEquals(userWhoLeft.steam_id));
if (this.debug)
- util.log(userWhoLeft.steam_id + " left channel " + channel.channel_name);
+ this.Logger.debug(userWhoLeft.steam_id + " left channel " + channel.channel_name);
} else {
this._leaveChatChannelById(userWhoLeft.channel_id);
if (this.debug)
- util.log(userWhoLeft.steam_id + " left unknown channel " + userWhoLeft.channel_id);
+ this.Logger.debug(userWhoLeft.steam_id + " left unknown channel " + userWhoLeft.channel_id);
}
}
};
diff --git a/handlers/community.js b/handlers/community.js
index 34a790f3..fdcdbd29 100644
--- a/handlers/community.js
+++ b/handlers/community.js
@@ -68,6 +68,32 @@ Dota2.Dota2Client.prototype.requestProfileCard = function(account_id, callback)
onProfileCardResponse, callback);
};
+/**
+ * Sends a message to the Game Coordinator requesting `account_id`'s profile page.
+ * This method is heavily rate limited. When abused, the GC just stops responding.
+ * Even the regular client runs into this limit when you check too many profiles.
+ * Provide a callback or listen for {@link module:Dota2.Dota2Client#event:profileData|profileData} event for Game Coordinator's response.
+ * Requires the GC to be {@link module:Dota2.Dota2Client#event:ready|ready}.
+ * @alias module:Dota2.Dota2Client#requestProfile
+ * @param {number} account_id - Dota 2 account ID of the player whose profile page the bot should fetch
+ * @param {module:Dota2~requestCallback} [callback] - Called with `err, CMsgDOTAProfileResponse`
+ */
+Dota2.Dota2Client.prototype.requestProfile = function(account_id, callback) {
+ callback = callback || null;
+ var _self = this;
+
+ /* Sends a message to the Game Coordinator requesting `accountId`'s profile. Listen for `profileData` event for Game Coordinator's response. */
+ this.Logger.debug("Sending profile request");
+
+ var payload = {
+ "account_id": account_id
+ };
+ this.sendToGC( Dota2.schema.lookupEnum("EDOTAGCMsg").values.k_EMsgProfileRequest,
+ Dota2.schema.lookupType("CMsgProfileRequest").encode(payload).finish(),
+ onProfileResponse, callback);
+};
+
+
/**
* Sends a message to the Game Coordinator requesting the Hall of Fame data for `week`.
* Provide a callback or listen for the {@link module:Dota2.Dota2Client#event:hallOfFameData|hallOfFameData} event for the Game Coordinator's response.
@@ -180,6 +206,11 @@ Dota2.Dota2Client.prototype.requestPlayerStats = function(account_id, callback)
* @param {CMsgDOTAProfileCard} profileCardResponse - The raw response data containing the user's profile card.
*/
/**
+ * Emitted in response to a {@link module:Dota2.Dota2Client#requestProfile|request for a player's profile page}
+ * @event module:Dota2.Dota2Client#profileData
+ * @param {CMsgProfileResponse} profileResponse - The raw response data containing the user's profile page.
+ */
+ /**
* Emitted in response to a {@link module:Dota2.Dota2Client#requestHallOfFame|request for a player's profile card}
* @event module:Dota2.Dota2Client#hallOfFameData
* @param {number} week - Weeks since unix epoch for which the hall of fame data was fetched
@@ -284,6 +315,16 @@ var onProfileCardResponse = function onProfileCardResponse(message, callback) {
};
handlers[Dota2.schema.lookupEnum("EDOTAGCMsg").values.k_EMsgClientToGCGetProfileCardResponse] = onProfileCardResponse;
+var onProfileResponse = function onProfileResponse(message, callback) {
+ callback = callback || null;
+ var profileResponse = Dota2.schema.lookupType("CMsgProfileResponse").decode(message);
+
+ this.Logger.debug("Received profile page");
+ this.emit("profileData", profileResponse);
+ if (callback) callback(null, profileResponse);
+};
+handlers[Dota2.schema.lookupEnum("EDOTAGCMsg").values.k_EMsgProfileResponse] = onProfileResponse;
+
var onHallOfFameResponse = function onHallOfFameResponse(message, callback) {
callback = callback || null;
var hallOfFameResponse = Dota2.schema.lookupType("CMsgDOTAHallOfFameResponse").decode(message);
diff --git a/handlers/fantasy.js b/handlers/fantasy.js
index aa2b9b98..1b45381a 100644
--- a/handlers/fantasy.js
+++ b/handlers/fantasy.js
@@ -45,7 +45,7 @@ Dota2.Dota2Client.prototype.requestPlayerCardsByPlayer = function() {
// Sort cards per player
var players = playercards.reduce((players, card)=>{
var id_attr = card.attribute.filter(attr => attr.def_index == 424)[0];
- var account_id = Buffer.from(id_attr.value_bytes, 'base64').readUInt32LE();
+ var account_id = Buffer.from(id_attr.value_bytes, 'base64').readUInt32LE(0);
// Add player if we haven't seen him yet
if (!players[account_id]) players[account_id] = {'account_id': account_id, 'cards': []};
// Add this card
diff --git a/handlers/helper.js b/handlers/helper.js
index f80f6abb..bc0120a3 100644
--- a/handlers/helper.js
+++ b/handlers/helper.js
@@ -160,13 +160,13 @@ Dota2._parseOptions = function(options, possibleOptions) {
type = possibleOptions[option];
if (type == null) {
if (this.debug) {
- util.log("Option " + option + " is not possible.");
+ this.Logger.debug("Option " + option + " is not possible.");
}
continue;
}
if (typeof value !== type) {
if (this.debug) {
- util.log("Option " + option + " must be a " + type + ".");
+ this.Logger.debug("Option " + option + " must be a " + type + ".");
}
continue;
}
diff --git a/handlers/leagues.js b/handlers/leagues.js
index a5f60eb8..0395a353 100644
--- a/handlers/leagues.js
+++ b/handlers/leagues.js
@@ -73,7 +73,7 @@ var onLiveLeagueGameUpdate = function onLiveLeagueGameUpdate(message, callback)
callback = callback || null;
var response = Dota2.schema.lookupType("CMsgDOTALiveLeagueGameUpdate").decode(message);
- if (this.debugMore) util.log("Live league games: " + response.live_league_games + ".");
+ if (this.debugMore) this.Logger.debug("Live league games: " + response.live_league_games + ".");
this.emit("liveLeagueGamesUpdate", response.live_league_games);
if (callback) callback(null, response.live_league_games);
};
diff --git a/handlers/lobbies.js b/handlers/lobbies.js
index 29c95455..a1c3e4c6 100644
--- a/handlers/lobbies.js
+++ b/handlers/lobbies.js
@@ -677,8 +677,8 @@ var onInviteCreated = function onInviteCreated(message) {
var inviteCreated = Dota2.schema.lookupType("CMsgInvitationCreated").decode(message);
var is_online = !inviteCreated.user_offline;
- if (this.debug && is_online) util.log("Created invitation to online user " + inviteCreated.steam_id);
- if (this.debug && !is_online) util.log("Created invitation to offline user " + inviteCreated.steam_id);
+ if (this.debug && is_online) this.Logger.debug("Created invitation to online user " + inviteCreated.steam_id);
+ if (this.debug && !is_online) this.Logger.debug("Created invitation to offline user " + inviteCreated.steam_id);
this.emit("inviteCreated", inviteCreated.steam_id, inviteCreated.group_id, is_online);
}
handlers[Dota2.schema.lookupEnum("EGCBaseMsg").values.k_EMsgGCInvitationCreated] = onInviteCreated;
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..e6af215c
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,801 @@
+{
+ "name": "dota2",
+ "version": "6.1.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
+ },
+ "@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU="
+ },
+ "@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs="
+ },
+ "@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
+ },
+ "@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
+ "requires": {
+ "@protobufjs/aspromise": "1.1.2",
+ "@protobufjs/inquire": "1.1.0"
+ }
+ },
+ "@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
+ },
+ "@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
+ },
+ "@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
+ },
+ "@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
+ },
+ "@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
+ },
+ "@types/long": {
+ "version": "3.0.32",
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz",
+ "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA=="
+ },
+ "@types/node": {
+ "version": "8.10.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.13.tgz",
+ "integrity": "sha512-AorNXRHoPVxIUIVmr6uJXRnvlPOSNKAJF5jZ1JOj1/IxYMocZzvQooNeLU02Db6kpy1IVIySTOvuIxmUF1HrOg=="
+ },
+ "adm-zip": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz",
+ "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E="
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
+ },
+ "bytebuffer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz",
+ "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=",
+ "requires": {
+ "long": "3.2.0"
+ },
+ "dependencies": {
+ "long": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
+ "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s="
+ }
+ }
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
+ },
+ "colour": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz",
+ "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g="
+ },
+ "commander": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+ "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
+ },
+ "d": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "requires": {
+ "es5-ext": "0.10.38"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deferred": {
+ "version": "0.7.9",
+ "resolved": "https://registry.npmjs.org/deferred/-/deferred-0.7.9.tgz",
+ "integrity": "sha1-+2KuCqDboFypH+0gHC9QE2ejYKI=",
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "event-emitter": "0.3.5",
+ "next-tick": "1.0.0",
+ "timers-ext": "0.1.2"
+ }
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "es5-ext": {
+ "version": "0.10.38",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz",
+ "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==",
+ "requires": {
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38"
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "growl": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
+ "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+ },
+ "merge": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz",
+ "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo="
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "mocha": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.1.tgz",
+ "integrity": "sha512-kKKs/H1KrMMQIEsWNxGmb4/BGsmj0dkeyotEvbrAuQ01FcWRLssUNXCEUZk6SZtyJBi6EE7SL0zDDtItw1rGhw==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.1",
+ "commander": "2.11.0",
+ "debug": "3.1.0",
+ "diff": "3.5.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.2",
+ "growl": "1.10.3",
+ "he": "1.1.1",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "supports-color": "4.4.0"
+ }
+ },
+ "moment": {
+ "version": "2.22.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz",
+ "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ=="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optjs": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz",
+ "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4="
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "protobufjs": {
+ "version": "6.8.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz",
+ "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==",
+ "requires": {
+ "@protobufjs/aspromise": "1.1.2",
+ "@protobufjs/base64": "1.1.2",
+ "@protobufjs/codegen": "2.0.4",
+ "@protobufjs/eventemitter": "1.1.0",
+ "@protobufjs/fetch": "1.1.0",
+ "@protobufjs/float": "1.0.2",
+ "@protobufjs/inquire": "1.1.0",
+ "@protobufjs/path": "1.1.2",
+ "@protobufjs/pool": "1.1.0",
+ "@protobufjs/utf8": "1.1.0",
+ "@types/long": "3.0.32",
+ "@types/node": "8.10.13",
+ "long": "4.0.0"
+ }
+ },
+ "should": {
+ "version": "13.2.1",
+ "resolved": "https://registry.npmjs.org/should/-/should-13.2.1.tgz",
+ "integrity": "sha512-l+/NwEMO+DcstsHEwPHRHzC9j4UOE3VQwJGcMWSsD/vqpqHbnQ+1iSHy64Ihmmjx1uiRPD9pFadTSc3MJtXAgw==",
+ "dev": true,
+ "requires": {
+ "should-equal": "2.0.0",
+ "should-format": "3.0.3",
+ "should-type": "1.4.0",
+ "should-type-adaptors": "1.1.0",
+ "should-util": "1.0.0"
+ }
+ },
+ "should-equal": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz",
+ "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==",
+ "dev": true,
+ "requires": {
+ "should-type": "1.4.0"
+ }
+ },
+ "should-format": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz",
+ "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=",
+ "dev": true,
+ "requires": {
+ "should-type": "1.4.0",
+ "should-type-adaptors": "1.1.0"
+ }
+ },
+ "should-type": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz",
+ "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=",
+ "dev": true
+ },
+ "should-type-adaptors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz",
+ "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==",
+ "dev": true,
+ "requires": {
+ "should-type": "1.4.0",
+ "should-util": "1.0.0"
+ }
+ },
+ "should-util": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz",
+ "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
+ },
+ "steam": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/steam/-/steam-1.4.0.tgz",
+ "integrity": "sha1-vAPCvzZd298E2yd1NBPS3bg1sbE=",
+ "requires": {
+ "adm-zip": "0.4.7",
+ "buffer-crc32": "0.2.13",
+ "bytebuffer": "5.0.1",
+ "steam-crypto": "0.0.1",
+ "steam-resources": "git+https://github.com/seishun/node-steam-resources.git#1403939a12ba467a4b82c8ccbc279bbcdad43588"
+ },
+ "dependencies": {
+ "steam-resources": {
+ "version": "git+https://github.com/seishun/node-steam-resources.git#1403939a12ba467a4b82c8ccbc279bbcdad43588",
+ "requires": {
+ "bytebuffer": "5.0.0",
+ "protobufjs": "4.1.2"
+ },
+ "dependencies": {
+ "bytebuffer": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.0.tgz",
+ "integrity": "sha1-TpLJKvedXsPWpllVQSfj+NA9IOc=",
+ "requires": {
+ "long": "3.0.1"
+ },
+ "dependencies": {
+ "long": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/long/-/long-3.0.1.tgz",
+ "integrity": "sha1-uZKB/nmPpk6jt6dMj+ExUbMxCwU="
+ }
+ }
+ },
+ "protobufjs": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-4.1.2.tgz",
+ "integrity": "sha1-Cmsb0nz39YcLI9cxPdvnCBWHb8Q=",
+ "requires": {
+ "ascli": "1.0.0",
+ "bytebuffer": "4.1.0",
+ "glob": "5.0.15",
+ "yargs": "3.29.0"
+ },
+ "dependencies": {
+ "ascli": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.0.tgz",
+ "integrity": "sha1-A6gEDoYzgkQwBQlwhgKmWRa1OjE=",
+ "requires": {
+ "colour": "0.7.1",
+ "optjs": "3.2.2"
+ }
+ },
+ "bytebuffer": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-4.1.0.tgz",
+ "integrity": "sha1-TFgmngUqseSx9/82T9+zzogpBqo=",
+ "requires": {
+ "bufferview": "1.0.1",
+ "long": "2.4.0"
+ },
+ "dependencies": {
+ "bufferview": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bufferview/-/bufferview-1.0.1.tgz",
+ "integrity": "sha1-ev10pF+Tf6QiodM4wIu/3HbNcl0="
+ },
+ "long": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz",
+ "integrity": "sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8="
+ }
+ }
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "requires": {
+ "inflight": "1.0.4",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.0",
+ "once": "1.3.2",
+ "path-is-absolute": "1.0.0"
+ },
+ "dependencies": {
+ "inflight": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz",
+ "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=",
+ "requires": {
+ "once": "1.3.2",
+ "wrappy": "1.0.1"
+ },
+ "dependencies": {
+ "wrappy": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz",
+ "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk="
+ }
+ }
+ },
+ "minimatch": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz",
+ "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=",
+ "requires": {
+ "brace-expansion": "1.1.1"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz",
+ "integrity": "sha1-2l+3iu9MRMnkrPUlBk+zII66sEU=",
+ "requires": {
+ "balanced-match": "0.2.1",
+ "concat-map": "0.0.1"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz",
+ "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ }
+ }
+ }
+ }
+ },
+ "once": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz",
+ "integrity": "sha1-2P7sqTsDnsHc3ud0HJK9rF4oCBs=",
+ "requires": {
+ "wrappy": "1.0.1"
+ },
+ "dependencies": {
+ "wrappy": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz",
+ "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk="
+ }
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz",
+ "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI="
+ }
+ }
+ },
+ "yargs": {
+ "version": "3.29.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz",
+ "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=",
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "3.0.3",
+ "decamelize": "1.1.1",
+ "os-locale": "1.4.0",
+ "window-size": "0.1.2",
+ "y18n": "3.2.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
+ },
+ "cliui": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.0.3.tgz",
+ "integrity": "sha1-R23l40QskhsWW8+FVq7pww5+FE4=",
+ "requires": {
+ "string-width": "1.0.1",
+ "strip-ansi": "3.0.0",
+ "wrap-ansi": "1.0.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz",
+ "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=",
+ "requires": {
+ "code-point-at": "1.0.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.0"
+ },
+ "dependencies": {
+ "code-point-at": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz",
+ "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=",
+ "requires": {
+ "number-is-nan": "1.0.0"
+ },
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz",
+ "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es="
+ }
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "requires": {
+ "number-is-nan": "1.0.0"
+ },
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz",
+ "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es="
+ }
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz",
+ "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=",
+ "requires": {
+ "ansi-regex": "2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz",
+ "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc="
+ }
+ }
+ },
+ "wrap-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-1.0.0.tgz",
+ "integrity": "sha1-9XO7nuI89DiR8zYvXzWaHfo4/DQ=",
+ "requires": {
+ "string-width": "1.0.1"
+ }
+ }
+ }
+ },
+ "decamelize": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.1.1.tgz",
+ "integrity": "sha1-iHFHmmwEh/VlPUipkvHQOBym8DE="
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "requires": {
+ "lcid": "1.0.0"
+ },
+ "dependencies": {
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "requires": {
+ "invert-kv": "1.0.0"
+ },
+ "dependencies": {
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+ }
+ }
+ }
+ }
+ },
+ "window-size": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.2.tgz",
+ "integrity": "sha1-ENU/D47oZ+OoUfC+DjEAhyMp2zo="
+ },
+ "y18n": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.0.tgz",
+ "integrity": "sha1-O+xkyTtzDZJKYUjHZXV5MkM+NMg="
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "steam-crypto": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/steam-crypto/-/steam-crypto-0.0.1.tgz",
+ "integrity": "sha1-BHexgqKx/dlBiT28wi4Ok7FKu38="
+ },
+ "supports-color": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
+ "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ },
+ "timers-ext": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.2.tgz",
+ "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=",
+ "requires": {
+ "es5-ext": "0.10.38",
+ "next-tick": "1.0.0"
+ }
+ },
+ "winston": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.2.tgz",
+ "integrity": "sha512-4S/Ad4ZfSNl8OccCLxnJmNISWcm2joa6Q0YGDxlxMzH0fgSwWsjMt+SmlNwCqdpaPg3ev1HKkMBsIiXeSUwpbA==",
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ }
+ }
+}
diff --git a/package.json b/package.json
index d634baf0..47b8a866 100644
--- a/package.json
+++ b/package.json
@@ -1,22 +1,22 @@
{
"name": "dota2",
- "version": "6.0.1",
+ "version": "6.1.0",
"dependencies": {
"deferred": "^0.7.9",
- "long": "^3.2.0",
+ "long": "^4.0.0",
"merge": "^1.2.0",
- "moment": "^2.19.4",
- "protobufjs": "^6.8.3",
+ "moment": "^2.22.1",
+ "protobufjs": "^6.8.6",
"steam": "^1.4.0",
- "winston": "^2.3.1"
+ "winston": "^2.4.2"
},
"devDependencies": {
- "mocha": "^4.0.0",
- "should": "^13.1.3"
+ "mocha": "^5.1.1",
+ "should": "^13.2.1"
},
"scripts": {
"update": "bash update_proto.sh",
- "test": "mocha"
+ "test": "mocha --exit"
},
"readmeFilename": "README.md",
"description": "A node-steam plugin for Dota 2.",
diff --git a/proto/base_gcmessages.proto b/proto/base_gcmessages.proto
index aded4cf6..423212e8 100644
--- a/proto/base_gcmessages.proto
+++ b/proto/base_gcmessages.proto
@@ -21,6 +21,8 @@ enum EGCBaseMsg {
k_EMsgGCLobbyInviteResponse = 4513;
k_EMsgGCToClientPollFileRequest = 4514;
k_EMsgGCToClientPollFileResponse = 4515;
+ k_EMsgGCToGCPerformManualOp = 4516;
+ k_EMsgGCToGCPerformManualOpCompleted = 4517;
}
enum EGCBaseProtoObjectTypes {
@@ -224,7 +226,6 @@ message CSOEconItem {
optional uint32 origin = 9 [default = 0];
repeated .CSOEconItemAttribute attribute = 12;
optional .CSOEconItem interior_item = 13;
- optional bool in_use = 14 [default = false];
optional uint32 style = 15 [default = 0];
optional uint64 original_id = 16 [default = 0];
repeated .CSOEconItemEquipped equipped_state = 18;
@@ -241,23 +242,6 @@ message CSOEconClaimCode {
optional string code = 4;
}
-message CMsgStoreGetUserData {
- optional fixed32 price_sheet_version = 1;
-}
-
-message CMsgStoreGetUserDataResponse {
- optional int32 result = 1;
- optional int32 currency = 2;
- optional string country = 3;
- optional fixed32 price_sheet_version = 4;
- optional uint64 experiment_data = 5 [default = 0];
- optional int32 featured_item_idx = 6;
- optional bool show_hat_descriptions = 7 [default = true];
- optional bytes price_sheet = 8;
- optional int32 default_item_sort = 9 [default = 0];
- repeated uint32 popular_items = 10;
-}
-
message CMsgUpdateItemSchema {
optional bytes items_game = 1;
optional fixed32 item_schema_version = 2;
@@ -390,10 +374,6 @@ message CMsgGCBannedWordListResponse {
repeated .CMsgGCBannedWord word_list = 2;
}
-message CMsgGCToGCBannedWordListBroadcast {
- optional .CMsgGCBannedWordListResponse broadcast = 1;
-}
-
message CMsgGCToGCBannedWordListUpdated {
optional uint32 group_id = 1;
}
@@ -558,3 +538,13 @@ message CMsgGCToClientPollFileResponse {
optional uint32 file_size = 2;
}
+message CMsgGCToGCPerformManualOp {
+ optional uint64 op_id = 1;
+ optional uint32 group_code = 2;
+}
+
+message CMsgGCToGCPerformManualOpCompleted {
+ optional bool success = 1;
+ optional uint32 source_gc = 2;
+}
+
diff --git a/proto/dota_gcmessages_client.proto b/proto/dota_gcmessages_client.proto
index bd4e52c8..997e76b9 100644
--- a/proto/dota_gcmessages_client.proto
+++ b/proto/dota_gcmessages_client.proto
@@ -3,6 +3,7 @@ import "dota_shared_enums.proto";
import "dota_gcmessages_common.proto";
import "gcsdk_gcmessages.proto";
import "dota_gcmessages_common_match_management.proto";
+import "base_gcmessages.proto";
option optimize_for = SPEED;
option cc_generic_services = false;
@@ -85,11 +86,18 @@ enum EDOTATriviaAnswerResult {
k_EDOTATriviaAnswerResult_TriviaDisabled = 5;
}
-message CMsgClientSuspended {
- optional uint32 time_end = 1;
+enum EPurchaseHeroRelicResult {
+ k_EPurchaseHeroRelicResult_Success = 0;
+ k_EPurchaseHeroRelicResult_FailedToSend = 1;
+ k_EPurchaseHeroRelicResult_NotEnoughPoints = 2;
+ k_EPurchaseHeroRelicResult_InternalServerError = 3;
+ k_EPurchaseHeroRelicResult_PurchaseNotAllowed = 4;
+ k_EPurchaseHeroRelicResult_InvalidRelic = 5;
+ k_EPurchaseHeroRelicResult_AlreadyOwned = 6;
}
-message CMsgRequestInternationalTicket {
+message CMsgClientSuspended {
+ optional uint32 time_end = 1;
}
message CMsgBalancedShuffleLobby {
@@ -208,6 +216,7 @@ message CMsgDOTAPopup {
GENERIC_INFO = 69;
GENERIC_ERROR = 70;
RANK_TIER_UPDATED = 75;
+ CUSTOM_GAME_COOLDOWN_RESTRICTED = 76;
}
optional .CMsgDOTAPopup.PopupID id = 1 [default = NONE];
@@ -307,82 +316,21 @@ message CMsgGCToServerMatchDetailsResponse {
repeated .CMsgDOTAMatch matches = 1;
}
-message CMsgDOTAProfileRequest {
- optional uint32 account_id = 1;
- optional bool request_name = 2;
-}
-
-message CMsgDOTAProfileResponse {
- message PlayedHero {
- optional uint32 hero_id = 1;
- optional uint32 wins = 2;
- }
-
- message ShowcaseHero {
- optional uint32 hero_id = 1;
- repeated bytes object_data = 2;
- }
-
- message LeaguePass {
- optional uint32 league_id = 1;
- optional uint32 item_def = 2;
- }
-
- message EventTicket {
- optional uint32 event_id = 1;
- }
-
- message FeaturedItem {
- optional uint64 item_id = 1;
- optional bytes object_data = 2;
- optional uint32 slot_index = 3;
- }
-
- optional uint32 result = 1;
- optional .CSODOTAGameAccountClient game_account_client = 2;
- repeated .CMsgDOTAMatch latest_matches = 3;
- repeated .CMsgDOTAProfileResponse.PlayedHero heroes = 4;
- optional string player_name = 5;
- optional string team_name = 6;
- optional string team_tag = 7;
- optional uint64 team_logo = 8;
- optional .CMsgDOTAProfileResponse.ShowcaseHero showcase_hero = 9;
- repeated .CMsgDOTAProfileResponse.LeaguePass league_passes = 10;
- repeated .CMsgDOTAProfileResponse.EventTicket event_tickets = 11;
- optional uint32 team_id = 12;
- optional bool has_passport = 13;
- repeated .CMsgDOTAProfileResponse.FeaturedItem featured_items = 14;
- optional uint32 abandon_percent = 15;
-}
-
message CMsgDOTAProfileTickets {
message LeaguePass {
optional uint32 league_id = 1;
optional uint32 item_def = 2;
}
- message EventTicket {
- optional uint32 event_id = 1;
- }
-
optional uint32 result = 1;
optional uint32 account_id = 2;
repeated .CMsgDOTAProfileTickets.LeaguePass league_passes = 3;
- repeated .CMsgDOTAProfileTickets.EventTicket event_tickets = 4;
}
message CMsgClientToGCGetProfileTickets {
optional uint32 account_id = 1;
}
-message CMsgGCSteamProfileRequest {
- optional uint32 account_id = 1;
-}
-
-message CMsgGCSteamProfileRequestResponse {
- optional uint32 result = 1;
-}
-
message CMsgDOTAClearNotifySuccessfulReport {
}
@@ -419,6 +367,7 @@ message CMsgDOTAWelcome {
repeated .CMsgDOTAWelcome.CExtraMsg extra_messages = 26;
optional uint64 minimum_recent_item_id = 27;
optional .EEvent active_event = 28 [default = EVENT_ID_NONE];
+ optional uint32 additional_user_message = 29;
}
message CSODOTAGameHeroFavorites {
@@ -434,14 +383,6 @@ message CMsgDOTAHeroFavoritesRemove {
optional uint32 hero_id = 1;
}
-message CMsgSetShowcaseHero {
- optional uint32 showcase_hero_id = 1;
-}
-
-message CMsgSetFeaturedItems {
- repeated uint64 featured_item_id = 1;
-}
-
message CMsgDOTAFeaturedItems {
optional uint32 account_id = 1;
repeated uint64 featured_item_id = 2;
@@ -724,19 +665,31 @@ message CMsgGCGetHeroStandingsResponse {
optional uint32 losses_with_ally = 17;
optional uint32 wins_against_enemy = 18;
optional uint32 losses_against_enemy = 19;
+ optional uint32 networth_peak = 20;
+ optional uint32 lasthit_peak = 21;
+ optional uint32 deny_peak = 22;
+ optional uint32 damage_peak = 23;
+ optional uint32 longest_game_peak = 24;
+ optional uint32 healing_peak = 25;
+ optional float avg_lasthits = 26;
+ optional float avg_denies = 27;
}
repeated .CMsgGCGetHeroStandingsResponse.Hero standings = 1;
}
message CMsgGCGetHeroTimedStats {
- optional uint32 account_id = 1;
optional uint32 hero_id = 2;
}
message CMsgGCGetHeroTimedStatsResponse {
+ message RankChunkedStats {
+ optional uint32 rank_chunk = 1;
+ repeated .CMatchPlayerTimedStats timed_stats = 2;
+ }
+
optional uint32 hero_id = 1;
- repeated .CMatchPlayerTimedStats timed_stats = 2;
+ repeated .CMsgGCGetHeroTimedStatsResponse.RankChunkedStats rank_chunked_stats = 2;
}
message CMsgGCItemEditorReservationsRequest {
@@ -855,6 +808,7 @@ message CMsgDOTAClaimEventActionResponse {
SDOLoadFailure = 9;
EventNotOwned = 10;
Timeout = 11;
+ RequiresPlusSubscription = 12;
}
optional .CMsgDOTAClaimEventActionResponse.ResultCode result = 1 [default = Success];
@@ -955,7 +909,7 @@ message CMsgDOTAGetPlayerMatchHistoryResponse {
optional bool abandon = 10;
optional uint32 duration = 11;
optional uint32 engine = 12;
- optional bool active_prime_subscription = 13;
+ optional bool active_plus_subscription = 13;
optional bool seasonal_rank = 14;
optional uint32 tourney_id = 15;
optional uint32 tourney_round = 16;
@@ -1177,14 +1131,6 @@ message CMsgGCToClientHeroStatueCreateResult {
optional uint64 resulting_item = 1;
}
-message CMsgClientToGCRecordCompendiumStats {
- optional uint32 league_id = 1;
- optional uint32 view_duration_s = 2;
- optional uint32 videos_viewed = 3;
- optional uint32 page_turns = 4;
- optional uint32 links_followed = 5;
-}
-
message CMsgGCToClientEventStatusChanged {
optional .EEvent active_event = 2 [default = EVENT_ID_NONE];
}
@@ -1213,6 +1159,10 @@ message CMsgGCToClientPlayerStatsResponse {
optional float support_score = 17;
optional float push_score = 18;
optional float versatility_score = 19;
+ optional float mean_networth = 20;
+ optional float mean_damage = 21;
+ optional float mean_heals = 22;
+ optional uint32 rapiers_purchased = 23;
}
message CMsgClientToGCCustomGamePlayerCountRequest {
@@ -1420,7 +1370,7 @@ message CMsgClientToGCGetQuestProgressResponse {
optional uint32 time_completed = 2;
optional uint32 attempts = 3;
optional uint32 hero_id = 4;
- optional uint32 challenge_type = 5;
+ optional uint32 template_id = 5;
optional uint32 quest_rank = 6;
}
@@ -1480,6 +1430,8 @@ message CMsgGCToClientWageringResponse {
optional uint32 coins_max = 7;
optional uint32 rank_wagers_remaining = 8;
optional uint32 rank_wagers_max = 9;
+ optional uint32 prediction_tokens_remaining = 10;
+ optional uint32 prediction_tokens_max = 11;
}
message CMsgGCToClientWageringUpdate {
@@ -1640,6 +1592,7 @@ message CMsgArcanaVotes {
optional bool is_current_round_calibrating = 5;
optional uint32 closest_active_match_id = 6;
optional uint32 event_id = 7;
+ optional uint32 voting_start_time = 8;
}
message CMsgClientToGCRequestArcanaVotesRemaining {
@@ -1658,95 +1611,21 @@ message CMsgClientToGCRequestArcanaVotesRemainingResponse {
repeated .CMsgClientToGCRequestArcanaVotesRemainingResponse.MatchVote matches_previously_voted_for = 4;
}
-message CMsgClientToGCRequestEventPointLog {
+message CMsgClientToGCRequestEventPointLogV2 {
optional uint32 event_id = 1;
}
-message CMsgClientToGCRequestEventPointLogResponse {
- message QuestChallengeEvent {
- optional uint32 quest_id = 1;
- optional uint32 challenge_id = 2;
- optional uint32 rank = 3;
- }
-
- message WagerWonEvent {
- optional uint64 match_id = 1;
- }
-
- message TipGivenEvent {
- optional uint32 recipient_account_id = 1;
- optional string recipient_name = 2;
- }
-
- message TipReceivedEvent {
- optional uint32 giver_account_id = 1;
- optional string giver_name = 2;
- }
-
- message RecycledItemEvent {
- optional uint32 recipe_item_def_index = 1;
- }
-
- message ActionRewardEvent {
- optional uint32 action_id = 1;
- optional uint32 action_score = 2;
- }
-
- message MysteryItemReceivedEvent {
- optional bool community_goal_item = 1;
- }
-
- message CorrectPredictionEvent {
- optional uint32 prediction_id = 1;
- }
-
- message InGamePredictionCorrectEvent {
- optional uint64 match_id = 1;
- }
-
- message WeekendTourneyPayoutEvent {
- optional uint64 team_gid = 1;
- }
-
- message FantasyRewardEvent {
- optional uint32 percentile = 1;
- }
-
- message BracketRewardEvent {
- optional uint32 correct_answers = 1;
- }
-
- message WeeklyGameEvent {
- optional uint32 points_won = 1;
- }
-
- message ExploitCorrectionEvent {
- optional uint32 points_corrected = 1;
- }
-
- message EventPointTransaction {
- optional uint32 time = 1;
- optional int32 event_points = 2;
- optional bool compendium_activated_event = 3;
- optional bool point_item_used_event = 4;
- optional .CMsgClientToGCRequestEventPointLogResponse.WagerWonEvent wager_won_event = 5;
- optional .CMsgClientToGCRequestEventPointLogResponse.MysteryItemReceivedEvent mystery_item_received_event = 6;
- optional .CMsgClientToGCRequestEventPointLogResponse.QuestChallengeEvent quest_challenge_event = 7;
- optional .CMsgClientToGCRequestEventPointLogResponse.TipGivenEvent tip_given_event = 8;
- optional .CMsgClientToGCRequestEventPointLogResponse.TipReceivedEvent tip_received_event = 9;
- optional .CMsgClientToGCRequestEventPointLogResponse.RecycledItemEvent recycled_item_event = 10;
- optional .CMsgClientToGCRequestEventPointLogResponse.ActionRewardEvent action_reward_event = 11;
- optional .CMsgClientToGCRequestEventPointLogResponse.InGamePredictionCorrectEvent in_game_prediction_event = 12;
- optional .CMsgClientToGCRequestEventPointLogResponse.CorrectPredictionEvent prediction_event = 13;
- optional .CMsgClientToGCRequestEventPointLogResponse.FantasyRewardEvent fantasy_reward_event = 15;
- optional .CMsgClientToGCRequestEventPointLogResponse.BracketRewardEvent bracket_reward_event = 16;
- optional .CMsgClientToGCRequestEventPointLogResponse.WeeklyGameEvent weekly_game_event = 19;
- optional .CMsgClientToGCRequestEventPointLogResponse.ExploitCorrectionEvent exploit_correction_event = 20;
+message CMsgClientToGCRequestEventPointLogResponseV2 {
+ message LogEntry {
+ optional uint32 timestamp = 1;
+ optional uint32 audit_action = 2;
+ optional int32 event_points = 3;
+ optional uint64 audit_data = 4;
}
optional bool result = 1;
- repeated .CMsgClientToGCRequestEventPointLogResponse.EventPointTransaction transactions = 2;
- optional uint32 event_id = 3;
+ optional .EEvent event_id = 2 [default = EVENT_ID_NONE];
+ repeated .CMsgClientToGCRequestEventPointLogResponseV2.LogEntry log_entries = 3;
}
message CMsgClientToGCPublishUserStat {
@@ -1793,7 +1672,7 @@ message CMsgGCToClientQuestProgressUpdated {
optional uint32 time_completed = 2;
optional uint32 attempts = 3;
optional uint32 hero_id = 4;
- optional uint32 challenge_type = 5;
+ optional uint32 template_id = 5;
optional uint32 quest_rank = 6;
optional uint32 max_quest_rank = 7;
}
@@ -1802,10 +1681,6 @@ message CMsgGCToClientQuestProgressUpdated {
repeated .CMsgGCToClientQuestProgressUpdated.Challenge completed_challenges = 2;
}
-message CMsgGCToClientUpdateClientClippy {
- repeated uint32 hero_ids = 1;
-}
-
message CMsgDOTARedeemItem {
optional uint64 currency_id = 1;
optional uint32 purchase_def = 2;
@@ -2133,6 +2008,66 @@ message CMsgGCToClientBattlePassRollup_Winter2017 {
optional .CMsgGCToClientBattlePassRollup_Winter2017.FantasyChallenge fantasy_challenge = 9;
}
+message CMsgGCToClientBattlePassRollup_TI7 {
+ message Questlines {
+ optional string name = 1;
+ optional uint32 onestar = 2;
+ optional uint32 twostar = 3;
+ optional uint32 threestar = 4;
+ optional uint32 total = 5;
+ }
+
+ message Wagering {
+ optional uint32 total_wagered = 1;
+ optional uint32 total_won = 2;
+ optional uint32 average_won = 3;
+ optional uint32 success_rate = 4;
+ optional uint32 total_tips = 5;
+ }
+
+ message Achievements {
+ optional uint32 completed = 1;
+ optional uint32 total = 2;
+ optional uint32 points = 3;
+ }
+
+ message BattleCup {
+ optional uint32 wins = 1;
+ optional uint32 score = 2;
+ }
+
+ message Predictions {
+ optional uint32 correct = 1;
+ optional uint32 total = 2;
+ optional uint32 points = 3;
+ }
+
+ message Bracket {
+ optional uint32 correct = 1;
+ optional uint32 points = 2;
+ }
+
+ message PlayerCard {
+ optional uint32 account_id = 1;
+ optional uint32 quality = 2;
+ }
+
+ message FantasyChallenge {
+ optional float total_score = 1;
+ optional float percentile = 2;
+ }
+
+ optional uint32 battle_pass_level = 1;
+ repeated .CMsgGCToClientBattlePassRollup_TI7.Questlines questlines = 2;
+ optional .CMsgGCToClientBattlePassRollup_TI7.Wagering wagering = 3;
+ optional .CMsgGCToClientBattlePassRollup_TI7.Achievements achievements = 4;
+ optional .CMsgGCToClientBattlePassRollup_TI7.BattleCup battle_cup = 5;
+ optional .CMsgGCToClientBattlePassRollup_TI7.Predictions predictions = 6;
+ optional .CMsgGCToClientBattlePassRollup_TI7.Bracket bracket = 7;
+ repeated .CMsgGCToClientBattlePassRollup_TI7.PlayerCard player_cards = 8;
+ optional .CMsgGCToClientBattlePassRollup_TI7.FantasyChallenge fantasy_challenge = 9;
+}
+
message CMsgGCToClientBattlePassRollupRequest {
optional uint32 event_id = 1;
optional uint32 account_id = 2;
@@ -2142,6 +2077,7 @@ message CMsgGCToClientBattlePassRollupResponse {
optional .CMsgGCToClientBattlePassRollup_International2016 event_ti6 = 1;
optional .CMsgGCToClientBattlePassRollup_Fall2016 event_fall2016 = 2;
optional .CMsgGCToClientBattlePassRollup_Winter2017 event_winter2017 = 3;
+ optional .CMsgGCToClientBattlePassRollup_TI7 event_ti7 = 4;
}
message CMsgGCToClientBattlePassRollupListRequest {
@@ -2149,7 +2085,12 @@ message CMsgGCToClientBattlePassRollupListRequest {
}
message CMsgGCToClientBattlePassRollupListResponse {
- repeated uint32 event_id = 1;
+ message EventInfo {
+ optional uint32 event_id = 1;
+ optional uint32 level = 2;
+ }
+
+ repeated .CMsgGCToClientBattlePassRollupListResponse.EventInfo event_info = 1;
}
message CMsgClientToGCTransferSeasonalMMRRequest {
@@ -2283,6 +2224,12 @@ message CMsgGCToClientTipNotification {
optional uint32 event_id = 5;
}
+message CMsgGCToClientCommendNotification {
+ optional uint32 commender_account_id = 1;
+ optional string commender_name = 2;
+ optional uint32 flags = 3;
+}
+
message CMsgGCToClientAllStarVotesRequest {
optional uint32 event_id = 1;
}
@@ -2370,6 +2317,13 @@ message CMsgDOTADestroyLobbyResponse {
optional .CMsgDOTADestroyLobbyResponse.Result result = 1 [default = SUCCESS];
}
+message CMsgDOTAGetRecentPlayTimeFriendsRequest {
+}
+
+message CMsgDOTAGetRecentPlayTimeFriendsResponse {
+ repeated fixed32 account_ids = 1;
+}
+
message CMsgPurchaseItemWithEventPoints {
optional uint32 item_def = 1;
optional uint32 quantity = 2;
@@ -2388,6 +2342,8 @@ message CMsgPurchaseItemWithEventPointsResponse {
NOT_ENOUGH_POINTS = 6;
SQL_ERROR = 7;
FAILED_TO_SEND = 8;
+ SERVER_ERROR = 9;
+ NOT_ALLOWED = 10;
}
optional .CMsgPurchaseItemWithEventPointsResponse.Result result = 1 [default = SUCCESS];
@@ -2408,3 +2364,335 @@ message CMsgGCRequestItemRecommendationsResponse {
repeated uint32 recommended_item_ids = 1;
}
+message CMsgGCRequestSkillUpRecommendations {
+ optional uint32 mmr = 1;
+ optional uint32 hero_id = 2;
+ repeated uint32 allied_hero_ids = 3;
+ repeated uint32 enemy_hero_ids = 4;
+ repeated uint32 ability_ids = 5;
+}
+
+message CMsgGCRequestSkillUpRecommendationsResponse {
+ message AbilitySelection {
+ optional uint32 ability_id = 1;
+ optional float weight = 2;
+ }
+
+ repeated .CMsgGCRequestSkillUpRecommendationsResponse.AbilitySelection abilities = 1;
+}
+
+message CMsgClientToGCRecycleHeroRelic {
+ repeated uint64 item_ids = 1;
+}
+
+message CMsgClientToGCRecycleHeroRelicResponse {
+ enum Result {
+ SUCCESS = 1;
+ ERROR_INTERNAL = 2;
+ ERROR_FAILED_TO_FIND_HERO_RELIC = 3;
+ ERROR_ITEM_NOT_HERO_RELIC = 4;
+ ERROR_FAILED_EVENT_NOT_OWNED = 5;
+ }
+
+ optional .CMsgClientToGCRecycleHeroRelicResponse.Result result = 1 [default = SUCCESS];
+ optional uint32 dust_amount = 2;
+}
+
+message CMsgPurchaseHeroRelic {
+ optional uint32 hero_id = 1;
+ optional uint32 kill_eater_type = 2;
+}
+
+message CMsgPurchaseHeroRelicResponse {
+ optional .EPurchaseHeroRelicResult result = 1 [default = k_EPurchaseHeroRelicResult_Success];
+}
+
+message CMsgPurchaseHeroRandomRelic {
+ optional uint32 hero_id = 1;
+}
+
+message CMsgPurchaseHeroRandomRelicResponse {
+ optional .EPurchaseHeroRelicResult result = 1 [default = k_EPurchaseHeroRelicResult_Success];
+ optional uint32 kill_eater_type = 2;
+}
+
+message CMsgClientToGCRequestPlusWeeklyChallengeResult {
+ optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
+ optional uint32 week = 2;
+}
+
+message CMsgClientToGCRequestPlusWeeklyChallengeResultResponse {
+}
+
+message CMsgProfileRequest {
+ optional uint32 account_id = 1;
+}
+
+message CMsgProfileResponse {
+ message FeaturedHero {
+ optional uint32 hero_id = 1;
+ repeated .CSOEconItem equipped_econ_items = 2;
+ optional bool manually_set = 3;
+ }
+
+ message MatchInfo {
+ optional uint64 match_id = 1;
+ optional uint32 match_timestamp = 2;
+ optional sint32 performance_rating = 3;
+ optional uint32 hero_id = 4;
+ optional bool won_match = 5;
+ }
+
+ optional .CSOEconItem background_item = 1;
+ repeated .CMsgProfileResponse.FeaturedHero featured_heroes = 2;
+ repeated .CMsgProfileResponse.MatchInfo recent_matches = 3;
+ repeated .CMsgSuccessfulHero successful_heroes = 4;
+ optional .CMsgRecentMatchInfo recent_match_details = 5;
+}
+
+message CMsgProfileUpdate {
+ optional uint64 background_item_id = 1;
+ repeated uint32 featured_hero_ids = 2;
+}
+
+message CMsgProfileUpdateResponse {
+ enum Result {
+ SUCCESS = 0;
+ FAILURE = 1;
+ }
+
+ optional .CMsgProfileUpdateResponse.Result result = 1 [default = SUCCESS];
+}
+
+message CMsgTalentWinRates {
+ optional uint32 last_run = 1;
+ optional uint32 ability_id = 2;
+ optional uint32 game_count = 3;
+ optional uint32 win_count = 4;
+}
+
+message CMsgGlobalHeroAverages {
+ optional uint32 last_run = 1;
+ optional uint32 avg_gold_per_min = 3;
+ optional uint32 avg_xp_per_min = 4;
+ optional uint32 avg_kills = 5;
+ optional uint32 avg_deaths = 6;
+ optional uint32 avg_assists = 7;
+ optional uint32 avg_last_hits = 8;
+ optional uint32 avg_denies = 9;
+ optional uint32 avg_net_worth = 10;
+}
+
+message CMsgHeroGlobalDataRequest {
+ optional uint32 hero_id = 1;
+}
+
+message CMsgHeroGlobalDataResponse {
+ message GraphData {
+ optional uint32 day = 1;
+ optional float win_percent = 2;
+ optional float pick_percent = 3;
+ optional float ban_percent = 4;
+ }
+
+ message HeroDataPerRankChunk {
+ optional uint32 rank_chunk = 1;
+ repeated .CMsgTalentWinRates talent_win_rates = 2;
+ optional .CMsgGlobalHeroAverages hero_averages = 3;
+ repeated .CMsgHeroGlobalDataResponse.GraphData graph_data = 4;
+ }
+
+ optional uint32 hero_id = 1;
+ repeated .CMsgHeroGlobalDataResponse.HeroDataPerRankChunk hero_data_per_chunk = 2;
+}
+
+message CMsgPrivateMetadataKeyRequest {
+ optional uint64 match_id = 1;
+}
+
+message CMsgPrivateMetadataKeyResponse {
+ optional uint32 private_key = 1;
+}
+
+message CMsgActivatePlusFreeTrialRequest {
+}
+
+message CMsgActivatePlusFreeTrialResponse {
+ enum Result {
+ SUCCESS = 0;
+ ERROR_GENERIC = 1;
+ ERROR_ALREADY_IN_FREE_TRIAL = 2;
+ ERROR_ALREADY_USED_FREE_TRIAL = 3;
+ ERROR_OFFER_NOT_VALID = 4;
+ }
+
+ optional .CMsgActivatePlusFreeTrialResponse.Result result = 1 [default = SUCCESS];
+}
+
+message CMsgGCToClientCavernCrawlMapPathCompleted {
+ optional uint32 event_id = 1;
+ optional uint32 path_id_completed = 2;
+ optional uint32 hero_id_completed = 3;
+ optional bool received_ultra_rare_reward = 4;
+}
+
+message CMsgClientToGCCavernCrawlClaimRoom {
+ optional uint32 event_id = 1;
+ optional uint32 room_id = 2;
+}
+
+message CMsgClientToGCCavernCrawlClaimRoomResponse {
+ enum Result {
+ SUCCESS = 0;
+ ERROR_UNKNOWN = 1;
+ RECEIVED_ULTRA_RARE_REWARD = 2;
+ }
+
+ optional .CMsgClientToGCCavernCrawlClaimRoomResponse.Result result = 1 [default = SUCCESS];
+}
+
+message CMsgClientToGCCavernCrawlUseItemOnRoom {
+ optional uint32 event_id = 1;
+ optional uint32 room_id = 2;
+ optional uint32 item_type = 3;
+}
+
+message CMsgClientToGCCavernCrawlUseItemOnRoomResponse {
+ enum Result {
+ SUCCESS = 0;
+ ERROR_UNKNOWN = 1;
+ RECEIVED_ULTRA_RARE_REWARD = 2;
+ }
+
+ optional .CMsgClientToGCCavernCrawlUseItemOnRoomResponse.Result result = 1 [default = SUCCESS];
+}
+
+message CMsgClientToGCCavernCrawlUseItemOnPath {
+ optional uint32 event_id = 1;
+ optional uint32 path_id = 2;
+ optional uint32 item_type = 3;
+}
+
+message CMsgClientToGCCavernCrawlUseItemOnPathResponse {
+ enum Result {
+ SUCCESS = 0;
+ ERROR_UNKNOWN = 1;
+ RECEIVED_ULTRA_RARE_REWARD = 2;
+ }
+
+ optional .CMsgClientToGCCavernCrawlUseItemOnPathResponse.Result result = 1 [default = SUCCESS];
+}
+
+message CMsgClientToGCCavernCrawlRequestMapState {
+ optional uint32 event_id = 1;
+}
+
+message CMsgClientToGCCavernCrawlRequestMapStateResponse {
+ message SwappedChallenge {
+ optional uint32 path_id_1 = 1;
+ optional uint32 path_id_2 = 2;
+ }
+
+ message InventoryItem {
+ optional uint32 item_type = 1;
+ optional uint32 count = 2;
+ }
+
+ enum Result {
+ SUCCESS = 0;
+ ERROR_UNKNOWN = 1;
+ EVENT_NOT_OWNED = 2;
+ }
+
+ optional .CMsgClientToGCCavernCrawlRequestMapStateResponse.Result result = 1 [default = SUCCESS];
+ optional fixed64 claimed_rooms_1 = 2;
+ optional fixed64 claimed_rooms_2 = 3;
+ optional fixed64 revealed_rooms_1 = 4;
+ optional fixed64 revealed_rooms_2 = 5;
+ optional fixed64 completed_paths_1 = 6;
+ optional fixed64 completed_paths_2 = 7;
+ optional fixed64 completed_paths_3 = 8;
+ repeated .CMsgClientToGCCavernCrawlRequestMapStateResponse.SwappedChallenge swapped_challenge = 9;
+ repeated .CMsgClientToGCCavernCrawlRequestMapStateResponse.InventoryItem inventory_item = 10;
+ optional uint32 ultra_rare_reward_room_number = 11;
+}
+
+message CMsgDOTAMutationList {
+ message Mutation {
+ optional uint32 id = 1;
+ optional string name = 2;
+ optional string description = 3;
+ }
+
+ repeated .CMsgDOTAMutationList.Mutation mutations = 1;
+}
+
+message CMsgEventTipsSummaryRequest {
+ optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
+ optional uint32 account_id = 2;
+}
+
+message CMsgEventTipsSummaryResponse {
+ message Tipper {
+ optional uint32 tipper_account_id = 1;
+ optional uint32 tip_count = 2 [default = 1];
+ }
+
+ optional bool result = 1;
+ repeated .CMsgEventTipsSummaryResponse.Tipper tips_received = 2;
+}
+
+message CMsgSocialFeedRequest {
+ optional uint32 account_id = 1;
+ optional bool self_only = 2;
+}
+
+message CMsgSocialFeedResponse {
+ message FeedEvent {
+ optional uint64 feed_event_id = 1;
+ optional uint32 account_id = 2;
+ optional uint32 timestamp = 3;
+ optional uint32 comment_count = 4;
+ optional uint32 event_type = 5;
+ optional uint32 event_sub_type = 6;
+ optional uint64 param_big_int_1 = 7;
+ optional uint32 param_int_1 = 8;
+ optional uint32 param_int_2 = 9;
+ optional uint32 param_int_3 = 10;
+ optional string param_string = 11;
+ }
+
+ enum Result {
+ SUCCESS = 0;
+ FAILED_TO_LOAD_FRIENDS = 1;
+ FAILED_TO_LOAD_FEED_DATA = 2;
+ FAILED_TO_LOAD_FEED_ENTRY = 3;
+ FAILED_TO_LOAD_COMMENTS = 4;
+ FAILED_TOO_MANY_REQUESTS = 5;
+ }
+
+ optional .CMsgSocialFeedResponse.Result result = 1 [default = SUCCESS];
+ repeated .CMsgSocialFeedResponse.FeedEvent feed_events = 2;
+}
+
+message CMsgSocialFeedCommentsRequest {
+ optional uint64 feed_event_id = 1;
+}
+
+message CMsgSocialFeedCommentsResponse {
+ message FeedComment {
+ optional uint32 commenter_account_id = 1;
+ optional uint32 timestamp = 2;
+ optional string comment_text = 3;
+ }
+
+ enum Result {
+ SUCCESS = 0;
+ FAILED_TOO_MANY_REQUESTS = 1;
+ FAILED_TO_LOAD_COMMENTS = 2;
+ }
+
+ optional .CMsgSocialFeedCommentsResponse.Result result = 1 [default = SUCCESS];
+ repeated .CMsgSocialFeedCommentsResponse.FeedComment feed_comments = 3;
+}
+
diff --git a/proto/dota_gcmessages_client_chat.proto b/proto/dota_gcmessages_client_chat.proto
index 97278297..d6943958 100644
--- a/proto/dota_gcmessages_client_chat.proto
+++ b/proto/dota_gcmessages_client_chat.proto
@@ -126,10 +126,9 @@ message CMsgDOTAChatMessage {
optional uint32 suggest_pick_hero_id = 26;
optional string suggest_pick_hero_role = 27;
optional uint32 suggest_ban_hero_id = 30;
- optional bool terse = 28;
- optional bool ignore_muted = 31;
optional .CMsgDOTAChatMessage.TriviaAnswered trivia_answer = 32;
optional uint32 requested_ability_id = 33;
+ optional uint32 chat_flags = 34;
}
message CMsgDOTAChatMember {
diff --git a/proto/dota_gcmessages_client_match_management.proto b/proto/dota_gcmessages_client_match_management.proto
index 4a74ec8b..d846a5cd 100644
--- a/proto/dota_gcmessages_client_match_management.proto
+++ b/proto/dota_gcmessages_client_match_management.proto
@@ -52,6 +52,8 @@ message CMsgStartFindingMatch {
optional bool solo_queue = 14;
optional uint32 bot_script_index = 15;
optional uint32 steam_clan_account_id = 16;
+ optional bool is_challenge_match = 17;
+ optional uint32 lane_selection_flags = 18;
}
message CMsgStartFindingMatchResult {
@@ -130,6 +132,7 @@ message CMsgPracticeLobbySetDetails {
optional uint64 bot_radiant = 44;
optional uint64 bot_dire = 45;
optional .DOTASelectionPriorityRules selection_priority_rules = 46 [default = k_DOTASelectionPriorityRules_Manual];
+ optional bool custom_game_penalties = 47;
}
message CMsgPracticeLobbyCreate {
@@ -194,7 +197,6 @@ message CMsgClearPracticeLobbyTeam {
}
message CMsgPracticeLobbyList {
- optional bool tournament_games = 1;
optional string pass_key = 2;
optional uint32 region = 3;
optional .DOTA_GameMode game_mode = 4 [default = DOTA_GAMEMODE_NONE];
@@ -207,8 +209,6 @@ message CMsgPracticeLobbyListResponseEntry {
}
optional uint64 id = 1 [(key_field) = true];
- optional uint32 tournament_id = 3;
- optional uint32 tournament_game_id = 4;
repeated .CMsgPracticeLobbyListResponseEntry.CLobbyMember members = 5;
optional bool requires_pass_key = 6;
optional uint32 leader_account_id = 7;
@@ -227,7 +227,6 @@ message CMsgPracticeLobbyListResponseEntry {
}
message CMsgPracticeLobbyListResponse {
- optional bool tournament_games = 1;
repeated .CMsgPracticeLobbyListResponseEntry lobbies = 2;
}
@@ -450,3 +449,10 @@ message CMsgGCToClientSteamDatagramTicket {
optional bytes serialized_ticket = 16;
}
+message CMsgGCToClientRequestLaneSelection {
+}
+
+message CMsgGCToClientRequestLaneSelectionResponse {
+ optional uint32 lane_selection_flags = 1;
+}
+
diff --git a/proto/dota_gcmessages_client_team.proto b/proto/dota_gcmessages_client_team.proto
index 817d1dfd..1b740aa1 100644
--- a/proto/dota_gcmessages_client_team.proto
+++ b/proto/dota_gcmessages_client_team.proto
@@ -70,6 +70,9 @@ message CMsgDOTATeamInfo {
optional uint32 time_joined = 2;
optional bool admin = 3;
optional bool sub = 4;
+ optional string persona = 5;
+ optional string pro_name = 6;
+ optional bool pro = 7;
}
repeated .CMsgDOTATeamInfo.Member members = 1;
@@ -97,6 +100,10 @@ message CMsgDOTATeamInfo {
repeated uint64 recent_match_ids = 23;
}
+message CMsgDOTATeamInfoRequest {
+ optional .CMsgDOTATeamInfo result = 1;
+}
+
message CMsgDOTATeamsInfo {
optional uint32 league_id = 1;
repeated .CMsgDOTATeamInfo teams = 2;
diff --git a/proto/dota_gcmessages_common.proto b/proto/dota_gcmessages_common.proto
index cb208275..ac00ecf1 100644
--- a/proto/dota_gcmessages_common.proto
+++ b/proto/dota_gcmessages_common.proto
@@ -42,51 +42,6 @@ enum DOTA_TournamentEvents {
TE_BLACK_HOLE = 11;
}
-enum DOTA_COMBATLOG_TYPES {
- DOTA_COMBATLOG_INVALID = -1;
- DOTA_COMBATLOG_DAMAGE = 0;
- DOTA_COMBATLOG_HEAL = 1;
- DOTA_COMBATLOG_MODIFIER_ADD = 2;
- DOTA_COMBATLOG_MODIFIER_REMOVE = 3;
- DOTA_COMBATLOG_DEATH = 4;
- DOTA_COMBATLOG_ABILITY = 5;
- DOTA_COMBATLOG_ITEM = 6;
- DOTA_COMBATLOG_LOCATION = 7;
- DOTA_COMBATLOG_GOLD = 8;
- DOTA_COMBATLOG_GAME_STATE = 9;
- DOTA_COMBATLOG_XP = 10;
- DOTA_COMBATLOG_PURCHASE = 11;
- DOTA_COMBATLOG_BUYBACK = 12;
- DOTA_COMBATLOG_ABILITY_TRIGGER = 13;
- DOTA_COMBATLOG_PLAYERSTATS = 14;
- DOTA_COMBATLOG_MULTIKILL = 15;
- DOTA_COMBATLOG_KILLSTREAK = 16;
- DOTA_COMBATLOG_TEAM_BUILDING_KILL = 17;
- DOTA_COMBATLOG_FIRST_BLOOD = 18;
- DOTA_COMBATLOG_MODIFIER_REFRESH = 19;
- DOTA_COMBATLOG_NEUTRAL_CAMP_STACK = 20;
- DOTA_COMBATLOG_PICKUP_RUNE = 21;
- DOTA_COMBATLOG_REVEALED_INVISIBLE = 22;
- DOTA_COMBATLOG_HERO_SAVED = 23;
- DOTA_COMBATLOG_MANA_RESTORED = 24;
- DOTA_COMBATLOG_HERO_LEVELUP = 25;
- DOTA_COMBATLOG_BOTTLE_HEAL_ALLY = 26;
- DOTA_COMBATLOG_ENDGAME_STATS = 27;
- DOTA_COMBATLOG_INTERRUPT_CHANNEL = 28;
- DOTA_COMBATLOG_ALLIED_GOLD = 29;
- DOTA_COMBATLOG_AEGIS_TAKEN = 30;
- DOTA_COMBATLOG_MANA_DAMAGE = 31;
- DOTA_COMBATLOG_PHYSICAL_DAMAGE_PREVENTED = 32;
- DOTA_COMBATLOG_UNIT_SUMMONED = 33;
- DOTA_COMBATLOG_ATTACK_EVADE = 34;
- DOTA_COMBATLOG_TREE_CUT = 35;
- DOTA_COMBATLOG_SUCCESSFUL_SCAN = 36;
- DOTA_COMBATLOG_END_KILLSTREAK = 37;
- DOTA_COMBATLOG_BLOODSTONE_CHARGE = 38;
- DOTA_COMBATLOG_CRITICAL_DAMAGE = 39;
- DOTA_COMBATLOG_SPELL_ABSORB = 40;
-}
-
message CSODOTAGameAccountClient {
optional uint32 account_id = 1 [(key_field) = true];
optional uint32 wins = 3;
@@ -110,7 +65,6 @@ message CSODOTAGameAccountClient {
optional uint32 forgiving = 31;
optional uint32 account_disabled_until_date = 38;
optional uint32 account_disabled_count = 39;
- optional uint32 showcase_hero_id = 40;
optional uint32 match_disabled_until_date = 41;
optional uint32 match_disabled_count = 42;
optional .PartnerAccountType partner_account_type = 44 [default = PARTNER_NONE];
@@ -156,12 +110,30 @@ message CSODOTAGameAccountClient {
optional bool solo_seasonal_rank_transferred = 102;
optional uint64 favorite_team_packed = 103;
optional uint32 recent_report_time = 104;
+ optional uint32 custom_game_disabled_until_date = 105;
+ optional uint32 recent_win_time_1 = 106;
+ optional uint32 recent_win_time_2 = 107;
+ optional uint32 recent_win_time_3 = 108;
}
-message CSODOTAGameAccountPrime {
+message CSODOTAGameAccountPlus {
optional uint32 account_id = 1 [(key_field) = true];
optional uint32 original_start_date = 2;
- optional uint32 prime_flags = 3;
+ optional uint32 plus_flags = 3;
+ optional uint32 plus_status = 4;
+ optional uint32 prepaid_time_start = 5;
+ optional uint32 prepaid_time_balance = 6;
+ optional fixed32 next_payment_date = 7;
+ optional fixed64 steam_agreement_id = 8;
+}
+
+message CMsgLobbyPlayerPlusSubscriptionData {
+ message HeroBadge {
+ optional uint32 hero_id = 1;
+ optional uint32 hero_badge_xp = 2;
+ }
+
+ repeated .CMsgLobbyPlayerPlusSubscriptionData.HeroBadge hero_badges = 1;
}
message CMsgLobbyEventPoints {
@@ -170,6 +142,11 @@ message CMsgLobbyEventPoints {
optional uint32 message_id_end = 2;
}
+ message PeriodicResourceValues {
+ optional uint32 remaining = 1;
+ optional uint32 max = 2;
+ }
+
message AccountPoints {
optional uint32 account_id = 1;
optional uint32 normal_points = 2;
@@ -180,12 +157,13 @@ message CMsgLobbyEventPoints {
optional uint32 points_held = 7;
optional uint32 premium_points_held = 8;
optional uint32 favorite_team_foil_level = 9;
- optional uint32 wager_tokens_remaining = 10;
- optional uint32 wager_tokens_max = 11;
optional uint64 active_effects_mask = 12;
repeated .CMsgLobbyEventPoints.ChatWheelMessageRange unlocked_chat_wheel_message_ranges = 13;
- optional uint32 rank_wager_tokens_remaining = 14;
- optional uint32 rank_wager_tokens_max = 15;
+ optional .CMsgLobbyPlayerPlusSubscriptionData plus_subscription_data = 16;
+ optional .CMsgLobbyEventPoints.PeriodicResourceValues wager_tokens = 17;
+ optional .CMsgLobbyEventPoints.PeriodicResourceValues rank_wager_tokens = 18;
+ optional .CMsgLobbyEventPoints.PeriodicResourceValues tip_tokens = 19;
+ optional uint32 tip_amount = 20;
}
optional uint32 event_id = 1;
@@ -195,7 +173,7 @@ message CMsgLobbyEventPoints {
message CMsgLocalServerFakeLobbyData {
optional uint32 account_id = 1;
repeated .CMsgLobbyEventPoints event_points = 2;
- optional bool is_prime_subscriber = 3;
+ optional bool is_plus_subscriber = 3;
optional uint32 primary_event_id = 4;
}
@@ -359,78 +337,6 @@ message CAdditionalEquipSlot {
optional uint32 def_index = 3;
}
-message CMsgDOTACombatLogEntry {
- optional .DOTA_COMBATLOG_TYPES type = 1 [default = DOTA_COMBATLOG_INVALID];
- optional uint32 target_name = 2;
- optional uint32 target_source_name = 3;
- optional uint32 attacker_name = 4;
- optional uint32 damage_source_name = 5;
- optional uint32 inflictor_name = 6;
- optional bool is_attacker_illusion = 7;
- optional bool is_attacker_hero = 8;
- optional bool is_target_illusion = 9;
- optional bool is_target_hero = 10;
- optional bool is_visible_radiant = 11;
- optional bool is_visible_dire = 12;
- optional uint32 value = 13;
- optional int32 health = 14;
- optional float timestamp = 15;
- optional float stun_duration = 16;
- optional float slow_duration = 17;
- optional bool is_ability_toggle_on = 18;
- optional bool is_ability_toggle_off = 19;
- optional uint32 ability_level = 20;
- optional float location_x = 21;
- optional float location_y = 22;
- optional uint32 gold_reason = 23;
- optional float timestamp_raw = 24;
- optional float modifier_duration = 25;
- optional uint32 xp_reason = 26;
- optional uint32 last_hits = 27;
- optional uint32 attacker_team = 28;
- optional uint32 target_team = 29;
- optional uint32 obs_wards_placed = 30;
- optional uint32 assist_player0 = 31;
- optional uint32 assist_player1 = 32;
- optional uint32 assist_player2 = 33;
- optional uint32 assist_player3 = 34;
- optional uint32 stack_count = 35;
- optional bool hidden_modifier = 36;
- optional bool is_target_building = 37;
- optional uint32 neutral_camp_type = 38;
- optional uint32 rune_type = 39;
- repeated uint32 assist_players = 40;
- optional bool is_heal_save = 41;
- optional bool is_ultimate_ability = 42;
- optional uint32 attacker_hero_level = 43;
- optional uint32 target_hero_level = 44;
- optional uint32 xpm = 45;
- optional uint32 gpm = 46;
- optional uint32 event_location = 47;
- optional bool target_is_self = 48;
- optional uint32 damage_type = 49;
- optional bool invisibility_modifier = 50;
- optional uint32 damage_category = 51;
- optional uint32 networth = 52;
- optional uint32 building_type = 53;
- optional float modifier_elapsed_duration = 54;
- optional bool silence_modifier = 55;
- optional bool heal_from_lifesteal = 56;
- optional bool modifier_purged = 57;
- optional bool spell_evaded = 58;
- optional bool motion_controller_modifier = 59;
- optional bool long_range_kill = 60;
- optional uint32 modifier_purge_ability = 61;
- optional uint32 modifier_purge_npc = 62;
- optional bool root_modifier = 63;
- optional uint32 total_unit_death_count = 64;
- optional bool aura_modifier = 65;
- optional bool armor_debuff_modifier = 66;
- optional bool no_physical_damage_modifier = 67;
- optional uint32 modifier_ability = 68;
- optional bool modifier_hidden = 69;
-}
-
message CMsgDOTAProfileCard {
message Slot {
message Trophy {
@@ -478,6 +384,7 @@ message CMsgDOTAProfileCard {
k_eStat_Commends = 4;
k_eStat_GamesPlayed = 5;
k_eStat_FirstMatchDate = 6;
+ k_eStat_PreviousSeasonRank = 7;
}
optional uint32 account_id = 1;
@@ -489,19 +396,16 @@ message CMsgDOTAProfileCard {
optional .CMsgBattleCupVictory recent_battle_cup_victory = 7;
optional uint32 rank_tier = 8;
optional uint32 leaderboard_rank = 9;
+ optional bool is_plus_subscriber = 10;
+ optional uint32 plus_original_start_date = 11;
+ optional uint32 rank_tier_score = 12;
+ optional uint32 previous_rank_tier = 13;
}
message CSODOTAPlayerChallenge {
- enum EFlags {
- eFlag_InstantRerollUncompleted = 1;
- eFlag_QuestChallenge = 2;
- eFlag_MultiMatch = 3;
- }
-
optional uint32 account_id = 1 [(key_field) = true];
optional uint32 event_id = 2 [(key_field) = true];
optional uint32 slot_id = 3 [(key_field) = true];
- optional uint32 challenge_type = 4;
optional uint32 int_param_0 = 5;
optional uint32 int_param_1 = 6;
optional uint32 created_time = 7;
@@ -515,11 +419,13 @@ message CSODOTAPlayerChallenge {
optional uint32 max_quest_rank = 15;
optional uint32 instance_id = 16;
optional uint32 hero_id = 17;
+ optional uint32 template_id = 18;
}
message CMsgClientToGCRerollPlayerChallenge {
optional uint32 event_id = 1;
optional uint32 sequence_id = 3;
+ optional uint32 hero_id = 4;
}
message CMsgGCRerollPlayerChallengeResponse {
@@ -552,7 +458,7 @@ message CMsgDOTARealtimeGameStats {
}
message ItemDetails {
- optional uint32 id = 1;
+ optional uint32 item_ability_id = 1;
optional string name = 2;
optional int32 time = 3;
optional bool sold = 4;
@@ -999,7 +905,7 @@ message CMsgDOTAMatch {
repeated .CMatchAdditionalUnitInventory additional_units_inventory = 48;
repeated .CMatchPlayerPermanentBuff permanent_buffs = 57;
optional .CMsgDOTAMatch.Player.CustomGameData custom_game_data = 50;
- optional bool active_prime_subscription = 51;
+ optional bool active_plus_subscription = 51;
optional uint32 net_worth = 52;
optional uint32 bot_difficulty = 58;
optional uint32 hero_pick_order = 63;
@@ -1161,72 +1067,31 @@ message CMsgDOTABotDebugInfo {
repeated uint32 rune_status = 13;
}
-message CMsgDOTALeagueTournament {
- message NodeGroup {
- optional string name = 1;
- optional uint32 node_group_id = 2;
- optional uint32 parent_node_group_id = 3;
- optional uint32 advancing_node_group_id = 4;
- optional uint32 advancing_team_count = 5;
- optional uint32 team_count = 6;
- optional .CMsgDOTALeagueTournament.ENodeGroupType node_group_type = 7 [default = INVALID_GROUP_TYPE];
- optional .CMsgDOTALeagueTournament.ENodeType default_node_type = 8 [default = INVALID_NODE_TYPE];
- optional uint32 round = 9;
- optional uint32 max_rounds = 10;
- optional bool is_tiebreaker = 11;
- optional bool is_final_group = 12;
- optional bool is_completed = 13;
- repeated .CMsgDOTALeagueTournament.TeamStanding team_standings = 14;
- repeated .CMsgDOTALeagueTournament.Node nodes = 15;
- repeated .CMsgDOTALeagueTournament.NodeGroup node_groups = 16;
- }
-
- message Node {
- optional string name = 1;
- optional uint32 node_id = 2;
- optional uint32 node_group_id = 3;
- optional uint32 winning_node_id = 4;
- optional uint32 losing_node_id = 5;
- optional .CMsgDOTALeagueTournament.ENodeType node_type = 6 [default = INVALID_NODE_TYPE];
- optional uint32 scheduled_time = 7;
- optional uint32 team_id_1 = 10;
- optional uint32 team_id_2 = 11;
- optional uint32 series_id = 20;
- repeated uint64 matches = 21;
- optional uint32 team_1_wins = 22;
- optional uint32 team_2_wins = 23;
- optional bool is_completed = 24;
- }
-
- message TeamStanding {
- optional uint32 team_id = 1;
- optional uint32 node_wins = 2;
- optional uint32 node_losses = 3;
- optional uint32 match_wins = 4;
- optional uint32 match_losses = 5;
- optional uint32 score = 6;
- }
+message CMsgSuccessfulHero {
+ optional uint32 hero_id = 1;
+ optional float win_percent = 2;
+ optional uint32 longest_streak = 3;
+}
- enum ENodeGroupType {
- INVALID_GROUP_TYPE = 0;
- ORGANIZATIONAL = 1;
- ROUND_ROBIN = 2;
- SWISS = 3;
- BRACKET_SINGLE = 4;
- BRACKET_DOUBLE_SEED_LOSER = 5;
- BRACKET_DOUBLE_ALL_WINNER = 6;
- BRACKET_SHOWMATCH = 7;
- }
+message CMsgRecentMatchInfo {
+ optional uint64 match_id = 1;
+ optional .DOTA_GameMode game_mode = 2 [default = DOTA_GAMEMODE_NONE];
+ optional uint32 kills = 3;
+ optional uint32 deaths = 4;
+ optional uint32 assists = 5;
+ optional uint32 duration = 6;
+ optional uint32 player_slot = 7;
+ optional .EMatchOutcome match_outcome = 8 [default = k_EMatchOutcome_Unknown];
+ optional uint32 timestamp = 9;
+}
- enum ENodeType {
- INVALID_NODE_TYPE = 0;
- BEST_OF_ONE = 1;
- BEST_OF_THREE = 2;
- BEST_OF_FIVE = 3;
- BEST_OF_TWO = 4;
+message CMsgMatchTips {
+ message SingleTip {
+ optional uint32 source_account_id = 1;
+ optional uint32 target_account_id = 2;
}
- optional uint32 league_id = 1;
- repeated .CMsgDOTALeagueTournament.NodeGroup node_groups = 2;
+ optional .EEvent event_id = 1 [default = EVENT_ID_NONE];
+ repeated .CMsgMatchTips.SingleTip tips = 2;
}
diff --git a/proto/dota_gcmessages_common_match_management.proto b/proto/dota_gcmessages_common_match_management.proto
index d2b12368..30b0ba03 100644
--- a/proto/dota_gcmessages_common_match_management.proto
+++ b/proto/dota_gcmessages_common_match_management.proto
@@ -5,6 +5,13 @@ import "dota_shared_enums.proto";
option optimize_for = SPEED;
option cc_generic_services = false;
+enum ELaneSelectionFlags {
+ k_ELaneSelectionFlags_LANE_SELECTION_SAFELANE = 1;
+ k_ELaneSelectionFlags_LANE_SELECTION_OFFLANE = 2;
+ k_ELaneSelectionFlags_LANE_SELECTION_MIDLANE = 4;
+ k_ELaneSelectionFlags_LANE_SELECTION_OTHER = 8;
+}
+
enum LobbyDotaTVDelay {
LobbyDotaTV_10 = 0;
LobbyDotaTV_120 = 1;
@@ -17,15 +24,31 @@ enum LobbyDotaPauseSetting {
LobbyDotaPauseSetting_Disabled = 2;
}
+enum EReadyCheckStatus {
+ k_EReadyCheckStatus_Unknown = 0;
+ k_EReadyCheckStatus_NotReady = 1;
+ k_EReadyCheckStatus_Ready = 2;
+}
+
+enum EReadyCheckRequestResult {
+ k_EReadyCheckRequestResult_Success = 0;
+ k_EReadyCheckRequestResult_AlreadyInProgress = 1;
+ k_EReadyCheckRequestResult_NotInParty = 2;
+ k_EReadyCheckRequestResult_SendError = 3;
+ k_EReadyCheckRequestResult_UnknownError = 4;
+}
+
message CSODOTAPartyMember {
optional .PartnerAccountType partner_type = 1 [default = PARTNER_NONE];
optional bool is_coach = 2;
repeated uint32 region_ping_codes = 4 [packed = true];
repeated uint32 region_ping_times = 5 [packed = true];
optional uint32 region_ping_failed_bitmask = 6;
+ optional bool is_plus_subscriber = 10;
optional uint32 tourney_skill_level = 7;
optional uint32 tourney_buyin = 8;
optional uint32 tourney_prevent_until = 9;
+ optional uint32 lane_selection_flags = 11;
}
message CSODOTAParty {
@@ -78,6 +101,10 @@ message CSODOTAParty {
optional bool solo_queue = 59;
optional uint32 bot_script_index = 60;
optional uint32 steam_clan_account_id = 61;
+ optional .CMsgReadyCheckStatus ready_check = 62;
+ optional uint32 custom_game_disabled_until_date = 63;
+ optional uint32 custom_game_disabled_account_id = 64;
+ optional bool is_challenge_match = 65;
}
message CSODOTAPartyInvite {
@@ -155,8 +182,10 @@ message CDOTALobbyMember {
optional uint32 lobby_mvp_vote_account_id = 32;
optional .MatchType search_match_type = 33 [default = MATCH_TYPE_CASUAL];
optional uint64 favorite_team_packed = 35;
- optional bool is_prime_subscriber = 36;
+ optional bool is_plus_subscriber = 36;
optional bool rank_tier_updated = 37;
+ optional uint32 lane_selection_flags = 38;
+ optional bool can_earn_rewards = 39;
}
message CLobbyTeamDetails {
@@ -176,6 +205,8 @@ message CLobbyTeamDetails {
optional uint32 rank = 15;
optional sint32 rank_change = 16;
optional bool is_home_team = 17;
+ optional bool is_challenge_match = 18;
+ optional uint64 challenge_match_token_account = 19;
}
message CLobbyTimedRewardDetails {
@@ -213,7 +244,6 @@ message CSODOTALobby {
INVALID = -1;
CASUAL_MATCH = 0;
PRACTICE = 1;
- TOURNAMENT = 2;
COOP_BOT_MATCH = 4;
LEGACY_TEAM_MATCH = 5;
LEGACY_SOLO_QUEUE_MATCH = 6;
@@ -309,9 +339,36 @@ message CSODOTALobby {
optional bool series_current_selection_priority_used_coin_toss = 102;
optional .EEvent current_primary_event = 103 [default = EVENT_ID_NONE];
optional bool lowpri_deprecated = 104;
+ repeated uint32 emergency_disabled_hero_ids = 105;
+ optional fixed64 custom_game_private_key = 106;
+ optional bool custom_game_penalties = 107;
+ repeated uint32 mutations = 108;
}
message CMsgLobbyPlaytestDetails {
optional string json = 1;
}
+message CMsgReadyCheckStatus {
+ message ReadyMember {
+ optional uint32 account_id = 1;
+ optional .EReadyCheckStatus ready_status = 2 [default = k_EReadyCheckStatus_Unknown];
+ }
+
+ optional uint32 start_timestamp = 1;
+ optional uint32 finish_timestamp = 2;
+ optional uint32 initiator_account_id = 3;
+ repeated .CMsgReadyCheckStatus.ReadyMember ready_members = 4;
+}
+
+message CMsgPartyReadyCheckRequest {
+}
+
+message CMsgPartyReadyCheckResponse {
+ optional .EReadyCheckRequestResult result = 1 [default = k_EReadyCheckRequestResult_Success];
+}
+
+message CMsgPartyReadyCheckAcknowledge {
+ optional .EReadyCheckStatus ready_status = 1 [default = k_EReadyCheckStatus_Unknown];
+}
+
diff --git a/proto/dota_gcmessages_msgid.proto b/proto/dota_gcmessages_msgid.proto
index b2979fc0..d00d3e45 100644
--- a/proto/dota_gcmessages_msgid.proto
+++ b/proto/dota_gcmessages_msgid.proto
@@ -63,8 +63,6 @@ enum EDOTAGCMsg {
k_EMsgGCMatchDetailsRequest = 7095;
k_EMsgGCMatchDetailsResponse = 7096;
k_EMsgGCCancelWatchGame = 7097;
- k_EMsgGCProfileRequest = 7098;
- k_EMsgGCProfileResponse = 7099;
k_EMsgGCPopup = 7102;
k_EMsgGCDOTAClearNotifySuccessfulReport = 7104;
k_EMsgGCFriendPracticeLobbyListRequest = 7111;
@@ -87,9 +85,7 @@ enum EDOTAGCMsg {
k_EMsgGCSuggestTeamMatchmaking = 7132;
k_EMsgGCPlayerHeroesFavoritesAdd = 7133;
k_EMsgGCPlayerHeroesFavoritesRemove = 7134;
- k_EMsgGCSetShowcaseHero = 7141;
k_EMsgGCApplyTeamToPracticeLobby = 7142;
- k_EMsgGCRequestInternatinalTicketEmail = 7143;
k_EMsgGCTransferTeamAdmin = 7144;
k_EMsgRequestLeagueInfo = 7147;
k_EMsgResponseLeagueInfo = 7148;
@@ -139,8 +135,6 @@ enum EDOTAGCMsg {
k_EMsgGCSetMapLocationStateResponse = 7208;
k_EMsgGCResetMapLocations = 7209;
k_EMsgGCResetMapLocationsResponse = 7210;
- k_EMsgGCSetFeaturedItems = 7212;
- k_EMsgGCFeaturedItems = 7215;
k_EMsgRefreshPartnerAccountLink = 7216;
k_EMsgClientsRejoinChatChannels = 7217;
k_EMsgGCToGCGetUserChatInfo = 7218;
@@ -235,8 +229,6 @@ enum EDOTAGCMsg {
k_EMsgGCNotifyAccountFlagsChange = 7326;
k_EMsgGCSetProfilePrivacy = 7327;
k_EMsgGCSetProfilePrivacyResponse = 7328;
- k_EMsgGCSteamProfileRequest = 7329;
- k_EMsgGCSteamProfileRequestResponse = 7330;
k_EMsgGCFantasyLeagueCreateInfoRequest = 7331;
k_EMsgGCFantasyLeagueCreateInfoResponse = 7332;
k_EMsgGCFantasyLeagueInviteInfoRequest = 7333;
@@ -354,8 +346,6 @@ enum EDOTAGCMsg {
k_EMsgGCToGCGetAccountLevelResponse = 7459;
k_EMsgGCToGCGetAccountPartner = 7460;
k_EMsgGCToGCGetAccountPartnerResponse = 7461;
- k_EMsgGCToGCGetAccountProfile = 7462;
- k_EMsgGCToGCGetAccountProfileResponse = 7463;
k_EMsgDOTAGetWeekendTourneySchedule = 7464;
k_EMsgDOTAWeekendTourneySchedule = 7465;
k_EMsgGCJoinableCustomGameModesRequest = 7466;
@@ -441,7 +431,6 @@ enum EDOTAGCMsg {
k_EMsgGCToGCReportKillSummaries = 7555;
k_EMsgGCToGCUpdateAssassinMinigame = 7556;
k_EMsgGCToGCFantasySetMatchLeague = 7557;
- k_EMsgClientToGCRecordCompendiumStats = 7558;
k_EMsgGCItemEditorRequestLeagueInfo = 7559;
k_EMsgGCItemEditorLeagueInfoResponse = 7560;
k_EMsgGCToGCUpdatePlayerPredictions = 7561;
@@ -491,10 +480,14 @@ enum EDOTAGCMsg {
k_EMsgGCToGCGetAccountMatchStatusResponse = 7610;
k_EMsgGCToGCCheckOwnsEntireEmoticonRange = 7611;
k_EMsgGCToGCCheckOwnsEntireEmoticonRangeResponse = 7612;
- k_EMsgGCUpdateClippy = 7613;
- k_EMsgGCUpdateClientClippy = 7614;
- k_EMsgGCRequestItemRecommendations = 7615;
- k_EMsgGCRequestItemRecommendationsResponse = 7616;
+ k_EMsgClientToGCRecycleHeroRelic = 7619;
+ k_EMsgClientToGCRecycleHeroRelicResponse = 7620;
+ k_EMsgGCToGCRevokeEventOwnership = 7621;
+ k_EMsgGCToGCUnlockEventPointSpending = 7622;
+ k_EMsgGCToClientRequestLaneSelection = 7623;
+ k_EMsgGCToClientRequestLaneSelectionResponse = 7624;
+ k_EMsgServerToGCCavernCrawlIsHeroActive = 7625;
+ k_EMsgServerToGCCavernCrawlIsHeroActiveResponse = 7626;
k_EMsgGCDev_GrantWarKill = 8001;
k_EMsgServerToGCLockCharmTrading = 8004;
k_EMsgClientToGCPlayerStatsRequest = 8006;
@@ -615,8 +608,6 @@ enum EDOTAGCMsg {
k_EMsgGCToClientTeamInfo = 8135;
k_EMsgGCToClientTeamsInfo = 8136;
k_EMsgClientToGCMyTeamInfoRequest = 8137;
- k_EMsgClientToGCRequestEventPointLog = 8138;
- k_EMsgClientToGCRequestEventPointLogResponse = 8139;
k_EMsgClientToGCPublishUserStat = 8140;
k_EMsgGCToGCSignoutSpendWager = 8141;
k_EMsgGCSubmitLobbyMVPVote = 8144;
@@ -721,7 +712,57 @@ enum EDOTAGCMsg {
k_EMsgPurchaseItemWithEventPoints = 8248;
k_EMsgPurchaseItemWithEventPointsResponse = 8249;
k_EMsgServerToGCMatchPlayerItemPurchaseHistory = 8250;
+ k_EMsgGCToGCGrantPlusHeroMatchResults = 8251;
k_EMsgGCGetHeroTimedStats = 8252;
k_EMsgGCGetHeroTimedStatsResponse = 8253;
+ k_EMsgLobbyPlayerPlusSubscriptionData = 8254;
+ k_EMsgServerToGCMatchStateHistory = 8255;
+ k_EMsgPurchaseHeroRelic = 8256;
+ k_EMsgPurchaseHeroRelicResponse = 8257;
+ k_EMsgPurchaseHeroRandomRelic = 8258;
+ k_EMsgPurchaseHeroRandomRelicResponse = 8259;
+ k_EMsgPartyReadyCheckRequest = 8262;
+ k_EMsgPartyReadyCheckResponse = 8263;
+ k_EMsgPartyReadyCheckAcknowledge = 8264;
+ k_EMsgGetRecentPlayTimeFriendsRequest = 8265;
+ k_EMsgGetRecentPlayTimeFriendsResponse = 8266;
+ k_EMsgGCToClientCommendNotification = 8267;
+ k_EMsgProfileRequest = 8268;
+ k_EMsgProfileResponse = 8269;
+ k_EMsgProfileUpdate = 8270;
+ k_EMsgProfileUpdateResponse = 8271;
+ k_EMsgSuccessfulHero = 8273;
+ k_EMsgHeroGlobalDataRequest = 8274;
+ k_EMsgHeroGlobalDataResponse = 8275;
+ k_EMsgClientToGCRequestPlusWeeklyChallengeResult = 8276;
+ k_EMsgClientToGCRequestPlusWeeklyChallengeResultResponse = 8277;
+ k_EMsgGCToGCGrantPlusPrepaidTime = 8278;
+ k_EMsgPrivateMetadataKeyRequest = 8279;
+ k_EMsgPrivateMetadataKeyResponse = 8280;
+ k_EMsgGCToGCReconcilePlusStatus = 8281;
+ k_EMsgGCToGCCheckPlusStatus = 8282;
+ k_EMsgGCToGCCheckPlusStatusResponse = 8283;
+ k_EMsgGCToGCReconcilePlusAutoGrantItems = 8284;
+ k_EMsgGCToGCReconcilePlusStatusUnreliable = 8285;
+ k_EMsgActivatePlusFreeTrialRequest = 8286;
+ k_EMsgActivatePlusFreeTrialResponse = 8287;
+ k_EMsgGCToClientCavernCrawlMapPathCompleted = 8288;
+ k_EMsgClientToGCCavernCrawlClaimRoom = 8289;
+ k_EMsgClientToGCCavernCrawlClaimRoomResponse = 8290;
+ k_EMsgClientToGCCavernCrawlUseItemOnRoom = 8291;
+ k_EMsgClientToGCCavernCrawlUseItemOnRoomResponse = 8292;
+ k_EMsgClientToGCCavernCrawlUseItemOnPath = 8293;
+ k_EMsgClientToGCCavernCrawlUseItemOnPathResponse = 8294;
+ k_EMsgClientToGCCavernCrawlRequestMapState = 8295;
+ k_EMsgClientToGCCavernCrawlRequestMapStateResponse = 8296;
+ k_EMsgSignOutTips = 8297;
+ k_EMsgClientToGCRequestEventPointLogV2 = 8298;
+ k_EMsgClientToGCRequestEventPointLogResponseV2 = 8299;
+ k_EMsgClientToGCRequestEventTipsSummary = 8300;
+ k_EMsgClientToGCRequestEventTipsSummaryResponse = 8301;
+ k_EMsgClientToGCRequestSocialFeed = 8303;
+ k_EMsgClientToGCRequestSocialFeedResponse = 8304;
+ k_EMsgClientToGCRequestSocialFeedComments = 8305;
+ k_EMsgClientToGCRequestSocialFeedCommentsResponse = 8306;
}
diff --git a/proto/dota_shared_enums.proto b/proto/dota_shared_enums.proto
index 7b4e73ac..2edb4a88 100644
--- a/proto/dota_shared_enums.proto
+++ b/proto/dota_shared_enums.proto
@@ -26,6 +26,7 @@ enum DOTA_GameMode {
DOTA_GAMEMODE_1V1MID = 21;
DOTA_GAMEMODE_ALL_DRAFT = 22;
DOTA_GAMEMODE_TURBO = 23;
+ DOTA_GAMEMODE_MUTATION = 24;
}
enum DOTA_GameState {
@@ -72,10 +73,11 @@ enum EEvent {
EVENT_ID_WINTER_MAJOR_2017 = 16;
EVENT_ID_NEW_BLOOM_2017 = 17;
EVENT_ID_INTERNATIONAL_2017 = 18;
- EVENT_ID_BATTLE_PASS_REWORK = 19;
+ EVENT_ID_PLUS_SUBSCRIPTION = 19;
EVENT_ID_SINGLES_DAY_2017 = 20;
EVENT_ID_FROSTIVUS_2017 = 21;
- EVENT_ID_COUNT = 22;
+ EVENT_ID_INTERNATIONAL_2018 = 22;
+ EVENT_ID_COUNT = 23;
}
enum DOTALeaverStatus_t {
@@ -205,6 +207,7 @@ enum DOTAJoinLobbyResult {
DOTA_JOIN_RESULT_LOBBY_FULL = 9;
DOTA_JOIN_RESULT_CUSTOM_GAME_INCORRECT_VERSION = 10;
DOTA_JOIN_RESULT_TIMEOUT = 11;
+ DOTA_JOIN_RESULT_CUSTOM_GAME_COOLDOWN = 12;
}
enum DOTASelectionPriorityRules {
@@ -263,7 +266,8 @@ enum MatchType {
MATCH_TYPE_EVENT = 7;
MATCH_TYPE_SEASONAL_RANKED = 8;
MATCH_TYPE_LOWPRI_DEPRECATED = 9;
- MATCH_TYPE_LOWPRI_DEPRECATED2 = 10;
+ MATCH_TYPE_STEAM_GROUP = 10;
+ MATCH_TYPE_MUTATION = 11;
}
enum DOTABotDifficulty {
@@ -354,6 +358,53 @@ enum EBadgeType {
k_EBadgeType_TI7_AllEvent = 3;
}
+enum DOTA_COMBATLOG_TYPES {
+ DOTA_COMBATLOG_INVALID = -1;
+ DOTA_COMBATLOG_DAMAGE = 0;
+ DOTA_COMBATLOG_HEAL = 1;
+ DOTA_COMBATLOG_MODIFIER_ADD = 2;
+ DOTA_COMBATLOG_MODIFIER_REMOVE = 3;
+ DOTA_COMBATLOG_DEATH = 4;
+ DOTA_COMBATLOG_ABILITY = 5;
+ DOTA_COMBATLOG_ITEM = 6;
+ DOTA_COMBATLOG_LOCATION = 7;
+ DOTA_COMBATLOG_GOLD = 8;
+ DOTA_COMBATLOG_GAME_STATE = 9;
+ DOTA_COMBATLOG_XP = 10;
+ DOTA_COMBATLOG_PURCHASE = 11;
+ DOTA_COMBATLOG_BUYBACK = 12;
+ DOTA_COMBATLOG_ABILITY_TRIGGER = 13;
+ DOTA_COMBATLOG_PLAYERSTATS = 14;
+ DOTA_COMBATLOG_MULTIKILL = 15;
+ DOTA_COMBATLOG_KILLSTREAK = 16;
+ DOTA_COMBATLOG_TEAM_BUILDING_KILL = 17;
+ DOTA_COMBATLOG_FIRST_BLOOD = 18;
+ DOTA_COMBATLOG_MODIFIER_STACK_EVENT = 19;
+ DOTA_COMBATLOG_NEUTRAL_CAMP_STACK = 20;
+ DOTA_COMBATLOG_PICKUP_RUNE = 21;
+ DOTA_COMBATLOG_REVEALED_INVISIBLE = 22;
+ DOTA_COMBATLOG_HERO_SAVED = 23;
+ DOTA_COMBATLOG_MANA_RESTORED = 24;
+ DOTA_COMBATLOG_HERO_LEVELUP = 25;
+ DOTA_COMBATLOG_BOTTLE_HEAL_ALLY = 26;
+ DOTA_COMBATLOG_ENDGAME_STATS = 27;
+ DOTA_COMBATLOG_INTERRUPT_CHANNEL = 28;
+ DOTA_COMBATLOG_ALLIED_GOLD = 29;
+ DOTA_COMBATLOG_AEGIS_TAKEN = 30;
+ DOTA_COMBATLOG_MANA_DAMAGE = 31;
+ DOTA_COMBATLOG_PHYSICAL_DAMAGE_PREVENTED = 32;
+ DOTA_COMBATLOG_UNIT_SUMMONED = 33;
+ DOTA_COMBATLOG_ATTACK_EVADE = 34;
+ DOTA_COMBATLOG_TREE_CUT = 35;
+ DOTA_COMBATLOG_SUCCESSFUL_SCAN = 36;
+ DOTA_COMBATLOG_END_KILLSTREAK = 37;
+ DOTA_COMBATLOG_BLOODSTONE_CHARGE = 38;
+ DOTA_COMBATLOG_CRITICAL_DAMAGE = 39;
+ DOTA_COMBATLOG_SPELL_ABSORB = 40;
+ DOTA_COMBATLOG_UNIT_TELEPORTED = 41;
+ DOTA_COMBATLOG_KILL_EATER_EVENT = 42;
+}
+
message CDOTAClientHardwareSpecs {
optional uint32 logical_processors = 1;
optional fixed64 cpu_cycles_per_second = 2;
@@ -390,3 +441,78 @@ message CDOTASaveGame {
repeated .CDOTASaveGame.SaveInstance save_instances = 4;
}
+message CMsgDOTACombatLogEntry {
+ optional .DOTA_COMBATLOG_TYPES type = 1 [default = DOTA_COMBATLOG_INVALID];
+ optional uint32 target_name = 2;
+ optional uint32 target_source_name = 3;
+ optional uint32 attacker_name = 4;
+ optional uint32 damage_source_name = 5;
+ optional uint32 inflictor_name = 6;
+ optional bool is_attacker_illusion = 7;
+ optional bool is_attacker_hero = 8;
+ optional bool is_target_illusion = 9;
+ optional bool is_target_hero = 10;
+ optional bool is_visible_radiant = 11;
+ optional bool is_visible_dire = 12;
+ optional uint32 value = 13;
+ optional int32 health = 14;
+ optional float timestamp = 15;
+ optional float stun_duration = 16;
+ optional float slow_duration = 17;
+ optional bool is_ability_toggle_on = 18;
+ optional bool is_ability_toggle_off = 19;
+ optional uint32 ability_level = 20;
+ optional float location_x = 21;
+ optional float location_y = 22;
+ optional uint32 gold_reason = 23;
+ optional float timestamp_raw = 24;
+ optional float modifier_duration = 25;
+ optional uint32 xp_reason = 26;
+ optional uint32 last_hits = 27;
+ optional uint32 attacker_team = 28;
+ optional uint32 target_team = 29;
+ optional uint32 obs_wards_placed = 30;
+ optional uint32 assist_player0 = 31;
+ optional uint32 assist_player1 = 32;
+ optional uint32 assist_player2 = 33;
+ optional uint32 assist_player3 = 34;
+ optional uint32 stack_count = 35;
+ optional bool hidden_modifier = 36;
+ optional bool is_target_building = 37;
+ optional uint32 neutral_camp_type = 38;
+ optional uint32 rune_type = 39;
+ repeated uint32 assist_players = 40;
+ optional bool is_heal_save = 41;
+ optional bool is_ultimate_ability = 42;
+ optional uint32 attacker_hero_level = 43;
+ optional uint32 target_hero_level = 44;
+ optional uint32 xpm = 45;
+ optional uint32 gpm = 46;
+ optional uint32 event_location = 47;
+ optional bool target_is_self = 48;
+ optional uint32 damage_type = 49;
+ optional bool invisibility_modifier = 50;
+ optional uint32 damage_category = 51;
+ optional uint32 networth = 52;
+ optional uint32 building_type = 53;
+ optional float modifier_elapsed_duration = 54;
+ optional bool silence_modifier = 55;
+ optional bool heal_from_lifesteal = 56;
+ optional bool modifier_purged = 57;
+ optional bool spell_evaded = 58;
+ optional bool motion_controller_modifier = 59;
+ optional bool long_range_kill = 60;
+ optional uint32 modifier_purge_ability = 61;
+ optional uint32 modifier_purge_npc = 62;
+ optional bool root_modifier = 63;
+ optional uint32 total_unit_death_count = 64;
+ optional bool aura_modifier = 65;
+ optional bool armor_debuff_modifier = 66;
+ optional bool no_physical_damage_modifier = 67;
+ optional uint32 modifier_ability = 68;
+ optional bool modifier_hidden = 69;
+ optional bool inflictor_is_stolen_ability = 70;
+ optional uint32 kill_eater_event = 71;
+ optional uint32 unit_status_label = 72;
+}
+
diff --git a/proto/econ_gcmessages.proto b/proto/econ_gcmessages.proto
index dc45dac1..f2241c5f 100644
--- a/proto/econ_gcmessages.proto
+++ b/proto/econ_gcmessages.proto
@@ -98,17 +98,14 @@ enum EGCItemMsg {
k_EMsgGCServerRentalsBase = 1700;
k_EMsgGCDev_NewItemRequest = 2001;
k_EMsgGCDev_NewItemRequestResponse = 2002;
- k_EMsgGCStoreGetUserData = 2500;
- k_EMsgGCStoreGetUserDataResponse = 2501;
+ k_EMsgGCDev_UnlockAllItemStylesRequest = 2003;
+ k_EMsgGCDev_UnlockAllItemStylesResponse = 2004;
k_EMsgGCStorePurchaseFinalize = 2504;
k_EMsgGCStorePurchaseFinalizeResponse = 2505;
k_EMsgGCStorePurchaseCancel = 2506;
k_EMsgGCStorePurchaseCancelResponse = 2507;
k_EMsgGCStorePurchaseInit = 2510;
k_EMsgGCStorePurchaseInitResponse = 2511;
- k_EMsgGCBannedWordListRequest = 2512;
- k_EMsgGCBannedWordListResponse = 2513;
- k_EMsgGCToGCBannedWordListBroadcast = 2514;
k_EMsgGCToGCBannedWordListUpdated = 2515;
k_EMsgGCToGCDirtySDOCache = 2516;
k_EMsgGCToGCDirtyMultipleSDOCache = 2517;
@@ -180,9 +177,11 @@ enum EGCItemMsg {
k_EMsgGCToGCInternalTestMsg = 2592;
k_EMsgGCToGCClientServerVersionsUpdated = 2593;
k_EMsgGCUseMultipleItemsRequest = 2594;
- k_EMsgGCCheckAccountSubscription = 2595;
- k_EMsgGCCheckAccountSubscriptionResponse = 2596;
- k_EMsgGCToGCAccountSubscriptionChange = 2597;
+ k_EMsgGCGetAccountSubscriptionItem = 2595;
+ k_EMsgGCGetAccountSubscriptionItemResponse = 2596;
+ k_EMsgGCToGCBroadcastMessageFromSub = 2598;
+ k_EMsgGCToClientCurrencyPricePoints = 2599;
+ k_EMsgGCToGCAddSubscriptionTime = 2600;
}
enum EItemPurgatoryResponse_Finalize {
@@ -396,6 +395,12 @@ message CMsgGCToGCCheckAccountTradeStatusResponse {
optional uint32 error_code = 2;
}
+message CMsgGCToGCAddSubscriptionTime {
+ optional uint32 account_id = 1;
+ repeated uint32 matching_subscription_def_indexes = 2;
+ optional uint32 additional_seconds = 3;
+}
+
message CMsgGCToGCGrantAccountRolledItems {
message Item {
message DynamicAttribute {
@@ -511,26 +516,20 @@ message CMsgDevNewItemRequestResponse {
optional bool success = 1;
}
-message CMsgGCCheckAccountSubscription {
- optional uint32 account_id = 1;
- optional uint32 def_index = 2;
+message CMsgDevUnlockAllItemStyles {
+ optional uint64 item_id = 1;
}
-message CMsgGCCheckAccountSubscriptionResponse {
- enum ESubscriptionState {
- STATE_UNKNOWN = 0;
- STATE_INACTIVE = 1;
- STATE_ACTIVE = 2;
- }
-
- optional .CMsgGCCheckAccountSubscriptionResponse.ESubscriptionState state = 1 [default = STATE_UNKNOWN];
- optional uint32 cache_until = 2;
+message CMsgDevUnlockAllItemStylesResponse {
+ optional bool success = 1;
}
-message CMsgGCToGCAccountSubscriptionChange {
+message CMsgGCGetAccountSubscriptionItem {
optional uint32 account_id = 1;
- optional uint32 item_definition_index = 2;
- optional bool is_subscription_active = 3;
+}
+
+message CMsgGCGetAccountSubscriptionItemResponse {
+ optional uint32 def_index = 1;
}
message CMsgGCAddGiftItem {
@@ -968,3 +967,20 @@ message CMsgGCToGCClientServerVersionsUpdated {
optional uint32 server_deployed_version = 4;
}
+message CMsgGCToGCBroadcastMessageFromSub {
+ optional uint32 msg_id = 1;
+ optional bytes serialized_msg = 2;
+ repeated uint32 account_id_list = 3 [packed = true];
+ repeated fixed64 steam_id_list = 4 [packed = true];
+}
+
+message CMsgGCToClientCurrencyPricePoints {
+ message Currency {
+ optional uint32 currency_id = 1;
+ repeated uint64 currency_price = 2 [packed = true];
+ }
+
+ repeated uint64 price_key = 1 [packed = true];
+ repeated .CMsgGCToClientCurrencyPricePoints.Currency currencies = 2;
+}
+
diff --git a/proto/gcsdk_gcmessages.proto b/proto/gcsdk_gcmessages.proto
index 03249250..0c39d4d4 100644
--- a/proto/gcsdk_gcmessages.proto
+++ b/proto/gcsdk_gcmessages.proto
@@ -346,3 +346,38 @@ message CMsgGCToClientPollConvarResponse {
optional string convar_value = 2;
}
+message CGCMsgCompressedMsgToClient {
+ optional uint32 msg_id = 1;
+ optional bytes compressed_msg = 2;
+}
+
+message CMsgGCToGCMasterBroadcastMessage {
+ optional uint32 users_per_second = 1;
+ optional bool send_to_users = 2;
+ optional bool send_to_servers = 3;
+ optional uint32 msg_id = 4;
+ optional bytes msg_data = 5;
+}
+
+message CMsgGCToGCMasterSubscribeToCache {
+ optional uint32 soid_type = 1;
+ optional fixed64 soid_id = 2;
+ repeated uint32 account_ids = 3;
+ repeated fixed64 steam_ids = 4;
+}
+
+message CMsgGCToGCMasterSubscribeToCacheResponse {
+}
+
+message CMsgGCToGCMasterUnsubscribeFromCache {
+ optional uint32 soid_type = 1;
+ optional fixed64 soid_id = 2;
+ repeated uint32 account_ids = 3;
+ repeated fixed64 steam_ids = 4;
+}
+
+message CMsgGCToGCMasterDestroyCache {
+ optional uint32 soid_type = 1;
+ optional fixed64 soid_id = 2;
+}
+
diff --git a/proto/gcsystemmsgs.proto b/proto/gcsystemmsgs.proto
index 8840092d..df132e52 100644
--- a/proto/gcsystemmsgs.proto
+++ b/proto/gcsystemmsgs.proto
@@ -93,6 +93,13 @@ enum EGCSystemMsg {
k_EGCMsgAccountTwoFactorChange = 520;
k_EGCMsgCheckClanMembership = 521;
k_EGCMsgCheckClanMembershipResponse = 522;
+ k_EGCMsgCompressedMsgToClient = 523;
+ k_EGCMsgGetGamePersonalDataCategoriesRequest = 524;
+ k_EGCMsgGetGamePersonalDataCategoriesResponse = 525;
+ k_EGCMsgGetGamePersonalDataEntriesRequest = 526;
+ k_EGCMsgGetGamePersonalDataEntriesResponse = 527;
+ k_EGCMsgTerminateGamePersonalDataEntriesRequest = 528;
+ k_EGCMsgTerminateGamePersonalDataEntriesResponse = 529;
}
enum ESOMsg {
@@ -136,5 +143,49 @@ enum EGCToGCMsg {
k_EMsgGCToGCUniverseStartup = 163;
k_EMsgGCToGCUniverseStartupResponse = 164;
k_EMsgGCToGCForwardAccountDetails = 165;
+ k_EMsgGCToGCMasterBroadcastMessage = 166;
+ k_EMsgGCToGCMasterSubscribeToCache = 167;
+ k_EMsgGCToGCMasterSubscribeToCacheResponse = 168;
+ k_EMsgGCToGCMasterUnsubscribeFromCache = 169;
+ k_EMsgGCToGCMasterDestroyCache = 170;
+}
+
+message CCommunity_GamePersonalDataCategoryInfo {
+ optional string type = 1;
+ optional string type_localization_token = 2;
+ optional string template_file = 3;
+ optional string category = 4;
+ optional string category_localization_token = 5;
+}
+
+message CCommunity_GetGamePersonalDataCategories_Request {
+ optional uint32 appid = 1;
+}
+
+message CCommunity_GetGamePersonalDataCategories_Response {
+ repeated .CCommunity_GamePersonalDataCategoryInfo categories = 1;
+ optional string app_assets_basename = 2;
+}
+
+message CCommunity_GetGamePersonalDataEntries_Request {
+ optional uint32 appid = 1;
+ optional uint64 steamid = 2;
+ optional string type = 3;
+ optional string continue_token = 4;
+}
+
+message CCommunity_GetGamePersonalDataEntries_Response {
+ optional uint32 gceresult = 1;
+ repeated string entries = 2;
+ optional string continue_token = 3;
+}
+
+message CCommunity_TerminateGamePersonalDataEntries_Request {
+ optional uint32 appid = 1;
+ optional uint64 steamid = 2;
+}
+
+message CCommunity_TerminateGamePersonalDataEntries_Response {
+ optional uint32 gceresult = 1;
}
diff --git a/proto/steammessages.proto b/proto/steammessages.proto
index f94f0049..2e30f638 100644
--- a/proto/steammessages.proto
+++ b/proto/steammessages.proto
@@ -409,6 +409,7 @@ message CMsgGCGetAppFriendsList_Response {
optional bool success = 1;
repeated fixed64 steamids = 2;
repeated fixed32 friendship_timestamps = 3;
+ repeated fixed32 last_playtimes = 4;
}
message CMsgGCMsgMasterSetDirectory {