├── .gitignore ├── LICENSE ├── README.md ├── index.js ├── input ├── csgo_english.txt ├── csgo_russian.txt └── items_game.txt ├── output ├── item_definitions.json ├── keychain_definitions.json ├── paintkits.json ├── rarities.json ├── schema.json ├── skins.json └── sticker_kits.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /input/images/econ 3 | /output/images/econ 4 | .DS_Store 5 | package-lock.json 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CS2 Items parser 2 | Parsing game information about items, skins, agents and etc. 3 | 4 | ## Information 5 | Using information from `scripts/items/items_game.txt` file (in vpk) and localization files (en, ru) generates information about skins, agents, stickers, etc. It also organizes images and saves information about the paths. 6 | 7 | The following files are currently being generated: 8 | * item_definitions - game items (including agents, as they are considered a separate item and not a skin) 9 | * paintkits - skins and their basic parameters (some skins can be reapplied to different items) 10 | * rarities - rarity of items and skins 11 | * sticker_kits - stickers 12 | * skins - relations of items and skins 13 | * schema - items and skins applied to them 14 | 15 | ## Some useful 16 | * Exported file format can be easily replaced [here](https://github.com/AspectUnk/cs2-items-parser/blob/ef5251562bf8680fd265826cf5d75faea452ca8c/index.js#L20) 17 | * Most libraries for working with the vdf format have many problems, for example with comments. [vdf-parser](https://www.npmjs.com/package/vdf-parser) does not have this problem 18 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs/promises"); 2 | const path = require("path"); 3 | const VDF = require("vdf-parser"); 4 | const _ = require("lodash"); 5 | 6 | const load_lang = async (path) => { 7 | const raw = await fs.readFile(path, { encoding: "utf8" }); 8 | const tokens = VDF.parse(raw)?.lang?.Tokens; 9 | 10 | // hint: some keys have incorrect letter case 11 | let converted = {}; 12 | 13 | for (const [key, values] of Object.entries(tokens)) { 14 | converted[key.toLowerCase()] = values; 15 | } 16 | 17 | return converted; 18 | }; 19 | 20 | const save_readable = (path, json) => { 21 | return fs.writeFile(path, JSON.stringify(json, null, "\t")); 22 | }; 23 | 24 | const copy_images = async (files) => { 25 | for (const file of files) { 26 | if (!file) 27 | continue; 28 | 29 | try { 30 | const output = `output/images/${file.replace(/(_medium)*_large$/gi, "")}.png`; 31 | await fs.mkdir(path.dirname(output), { recursive: true }); 32 | await fs.copyFile(`input/images/${file}_png.png`, output); 33 | } catch { } 34 | } 35 | }; 36 | 37 | (async () => { 38 | const raw_items = await fs.readFile("input/items_game.txt", { encoding: "utf8" }); 39 | const items = VDF.parse(raw_items)?.items_game; 40 | 41 | const lang_english = await load_lang("input/csgo_english.txt"); 42 | const lang_russian = await load_lang("input/csgo_russian.txt"); 43 | 44 | const prefabs = _.flatten(items.prefabs.map(Object.entries)).map(([prefab, obj]) => ({ ...obj, prefab })); 45 | 46 | const item_definitions = _.flatten(items.items.map(Object.entries)) 47 | .map(([id, obj]) => { 48 | id = parseInt(id); 49 | 50 | if (_.isNaN(id)) 51 | return null; 52 | 53 | if (!_.has(obj, "name") || !_.has(obj, "prefab")) 54 | return null; 55 | 56 | const prefab = prefabs.find(p => p?.prefab === obj?.prefab); 57 | if (!prefab) 58 | return null; 59 | 60 | const item_name = (obj?.item_name || prefab?.item_name)?.replace(/^#/g, "")?.toLowerCase(); 61 | const item_desc = (obj?.item_description || prefab.item_description)?.replace(/^#/g, "")?.toLowerCase(); 62 | 63 | const item_name_en = lang_english[item_name]; 64 | const item_desc_en = lang_english[item_desc]; 65 | 66 | const used_by_classes = obj?.used_by_classes || prefab?.used_by_classes; 67 | const stickers = obj?.stickers || prefab?.stickers; 68 | 69 | return { 70 | id, 71 | item_class: obj?.name, 72 | item_name: item_name, 73 | item_name_en, 74 | item_name_ru: lang_russian[item_name] || item_name_en, 75 | item_desc: item_desc, 76 | item_desc_en, 77 | item_desc_ru: lang_russian[item_desc] || item_desc_en, 78 | prefab: obj?.prefab, 79 | image: obj?.image_inventory, 80 | max_stickers: stickers ? Object.keys(stickers).length : undefined, 81 | used_by_classes: used_by_classes ? { 82 | ct: used_by_classes?.["counter-terrorists"] == 1, 83 | tt: used_by_classes?.terrorists == 1, 84 | } : undefined, 85 | }; 86 | }) 87 | .filter(d => d && d?.item_name_en); 88 | 89 | await save_readable("output/item_definitions.json", item_definitions); 90 | 91 | // rarities 92 | const rarities = Object.entries(items.rarities) 93 | .map(([name, obj]) => { 94 | const loc_key = obj.loc_key?.replace(/^#/g, "")?.toLowerCase(); 95 | const loc_key_weapon = obj.loc_key_weapon?.replace(/^#/g, "")?.toLowerCase(); 96 | const loc_key_character = obj.loc_key_character?.replace(/^#/g, "")?.toLowerCase(); 97 | 98 | const loc_key_en = lang_english[loc_key]; 99 | const loc_key_weapon_en = lang_english[loc_key_weapon]; 100 | const loc_key_character_en = lang_english[loc_key_character]; 101 | 102 | return { 103 | name, ...obj, 104 | loc_key_en, 105 | loc_key_ru: lang_russian[loc_key] || loc_key_en, 106 | loc_key_weapon_en, 107 | loc_key_weapon_ru: lang_russian[loc_key_weapon] || loc_key_weapon_en, 108 | loc_key_character_en, 109 | loc_key_character_ru: lang_russian[loc_key_character] || loc_key_character_en, 110 | hex_color: items.colors[obj.color].hex_color, 111 | }; 112 | }) 113 | .filter(r => r.hex_color); 114 | 115 | await save_readable("output/rarities.json", rarities); 116 | 117 | // paintkits 118 | const paint_kits_rarity = _.merge(...items.paint_kits_rarity); 119 | const paint_kits = _.flatten(items.paint_kits.map(Object.entries)) 120 | .map(([id, obj]) => { 121 | const description_string = obj.description_string?.replace(/^#/g, "")?.toLowerCase(); 122 | const description_tag = obj.description_tag?.replace(/^#/g, "")?.toLowerCase(); 123 | 124 | const description_string_en = lang_english[description_string]; 125 | const description_tag_en = lang_english[description_tag]; 126 | 127 | return { 128 | id: parseInt(id), 129 | rarity: paint_kits_rarity[obj.name], 130 | description_string_en, 131 | description_string_ru: lang_russian[description_string] || description_string_en, 132 | description_tag_en, 133 | description_tag_ru: lang_russian[description_tag] || description_tag_en, 134 | ...obj, 135 | }; 136 | }) 137 | .filter(r => !_.isNaN(r.id)); 138 | 139 | await save_readable("output/paintkits.json", paint_kits); 140 | 141 | // stickers 142 | const sticker_kits = _.flatten(items.sticker_kits.map(Object.entries)) 143 | .map(([id, obj]) => { 144 | const item_name = obj.item_name?.replace(/^#/g, "")?.toLowerCase(); 145 | const description_string = obj.description_string?.replace(/^#/g, "")?.toLowerCase(); 146 | 147 | const item_name_en = lang_english[item_name]; 148 | const description_string_en = lang_english[description_string]; 149 | 150 | return { 151 | id: parseInt(id), 152 | name: obj.name, 153 | rarity: obj?.rarity, 154 | item_name, 155 | item_name_en, 156 | item_name_ru: lang_russian[item_name] || item_name_en, 157 | description_string, 158 | description_string_en, 159 | description_string_ru: lang_russian[description_string] || description_string_en, 160 | sticker_image: (obj?.sticker_material) ? `econ/stickers/${obj.sticker_material}` : undefined, 161 | patch_image: (obj?.patch_material) ? `econ/patches/${obj.patch_material}` : undefined, 162 | }; 163 | }); 164 | 165 | await copy_images(sticker_kits.filter(i => (i?.sticker_image || i?.patch_image)).map(i => (i?.sticker_image || i?.patch_image))); 166 | await save_readable("output/sticker_kits.json", sticker_kits); 167 | 168 | // keychains 169 | const keychain_definitions = Object.entries(items.keychain_definitions) 170 | .map(([id, obj]) => { 171 | const item_name = obj?.loc_name?.replace(/^#/g, "")?.toLowerCase(); 172 | const item_desc = obj?.loc_description?.replace(/^#/g, "")?.toLowerCase(); 173 | 174 | const item_name_en = lang_english[item_name]; 175 | const item_desc_en = lang_english[item_desc]; 176 | 177 | return { 178 | id: parseInt(id), 179 | name: obj?.name, 180 | rarity: obj?.rarity, 181 | item_name, 182 | item_name: item_name, 183 | item_name_en, 184 | item_name_ru: lang_russian[item_name] || item_name_en, 185 | item_desc: item_desc, 186 | item_desc_en, 187 | item_desc_ru: lang_russian[item_desc] || item_desc_en, 188 | image: obj?.image_inventory, 189 | pedestal_model: obj?.pedestal_display_model, 190 | }; 191 | }) 192 | .filter(k => !_.isNaN(k.id)); 193 | 194 | await copy_images(keychain_definitions.filter(i => i?.image).map(i => i?.image)); 195 | await save_readable("output/keychain_definitions.json", keychain_definitions); 196 | 197 | // skins 198 | const loot_lists = _.flatten(_.flatten(items.client_loot_lists.map(Object.values)) 199 | .map(Object.keys)); 200 | 201 | const item_sets = _.flatten(_.flatten(items.item_sets.map(Object.values)) 202 | .map(set => set?.items) 203 | .map(Object.keys)); 204 | 205 | // knife from icons 206 | const icons = Object.values(items.alternate_icons2.weapon_icons).map(i => i.icon_path); 207 | const knife_icons = icons 208 | .map(i => { 209 | const str = i.replace(/_(light|medium|heavy)$/gi, "").split("/").pop(); 210 | if (!str) 211 | return null; 212 | 213 | const item_class = item_definitions 214 | .sort((a, b) => b.item_class.length - a.item_class.length) 215 | .find(def => str?.startsWith(def.item_class))?.item_class; 216 | 217 | if (!item_class) 218 | return null; 219 | 220 | return `[${str.replace(`${item_class}_`, "")}]${item_class}`; 221 | }); 222 | 223 | const skins = _.union(loot_lists, item_sets, knife_icons) 224 | .map(data => { 225 | const group = /\[(.*)\](.*)/.exec(data); 226 | if (!group) 227 | return null; 228 | 229 | return { 230 | type: group[2], 231 | kit: group[1], 232 | } 233 | }) 234 | .filter(_.isObject); 235 | 236 | const skins_images = skins 237 | .map(skin => { 238 | const re = new RegExp(`${skin.type}_${skin.kit}_medium$`); 239 | return `${icons.find(i => re.test(i))}_large`; 240 | }) 241 | .filter(s => s); 242 | 243 | await copy_images(skins_images); 244 | await save_readable("output/skins.json", skins); 245 | 246 | const schema = item_definitions 247 | .filter(item => item.item_name_en) 248 | .map(item => { 249 | const kits = skins 250 | .filter(skin => skin?.type == item?.item_class) 251 | .map(skin => skin.kit); 252 | 253 | const item_paint_kits = kits.filter(kit => paint_kits.findIndex(paint => kit === paint.name) >= 0); 254 | const item_sticker_kits = kits.filter(kit => sticker_kits.findIndex(sticker => kit === sticker.name) >= 0); 255 | 256 | return { 257 | item_definition_id: item.id, 258 | item_class: item.item_class, 259 | image: item?.image, 260 | paint_kits: item_paint_kits.length > 0 ? item_paint_kits : undefined, 261 | sticker_kits: item_sticker_kits.length > 0 ? item_sticker_kits : undefined, 262 | }; 263 | }) 264 | .filter(item => item?.paint_kits?.length > 0 || item?.sticker_kits?.length > 0 || item.item_class.startsWith("customplayer")) 265 | .sort((a, b) => a.item_definition_id - b.item_definition_id); 266 | 267 | await copy_images(schema.map(i => i?.image)); 268 | await save_readable("output/schema.json", schema); 269 | })(); 270 | -------------------------------------------------------------------------------- /output/keychain_definitions.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "name": "kc_missinglink_ava", 5 | "item_name": "keychain_kc_missinglink_ava", 6 | "item_name_en": "Lil' Ava", 7 | "item_name_ru": "Крошка Ава", 8 | "item_desc": "keychain_kc_missinglink_ava_desc", 9 | "item_desc_en": "", 10 | "item_desc_ru": "", 11 | "image": "econ/keychains/missinglink/kc_missinglink_ava", 12 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_ava.vmdl" 13 | }, 14 | { 15 | "id": 2, 16 | "name": "kc_missinglink_banana", 17 | "item_name": "keychain_kc_missinglink_banana", 18 | "item_name_en": "That's Bananas", 19 | "item_name_ru": "Бешеный банан", 20 | "item_desc": "keychain_kc_missinglink_banana_desc", 21 | "item_desc_en": "", 22 | "item_desc_ru": "", 23 | "image": "econ/keychains/missinglink/kc_missinglink_banana", 24 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_banana.vmdl" 25 | }, 26 | { 27 | "id": 3, 28 | "name": "kc_missinglink_cat", 29 | "item_name": "keychain_kc_missinglink_cat", 30 | "item_name_en": "Lil' Whiskers", 31 | "item_name_ru": "Крошка Усатик", 32 | "item_desc": "keychain_kc_missinglink_cat_desc", 33 | "item_desc_en": "", 34 | "item_desc_ru": "", 35 | "image": "econ/keychains/missinglink/kc_missinglink_cat", 36 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_cat.vmdl" 37 | }, 38 | { 39 | "id": 4, 40 | "name": "kc_missinglink_catbeach", 41 | "item_name": "keychain_kc_missinglink_catbeach", 42 | "item_name_en": "Lil' Sandy", 43 | "item_name_ru": "Крошка Пляжник", 44 | "item_desc": "keychain_kc_missinglink_catbeach_desc", 45 | "item_desc_en": "", 46 | "item_desc_ru": "", 47 | "image": "econ/keychains/missinglink/kc_missinglink_catbeach", 48 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_catbeach.vmdl" 49 | }, 50 | { 51 | "id": 5, 52 | "name": "kc_missinglink_chicken", 53 | "item_name": "keychain_kc_missinglink_chicken", 54 | "item_name_en": "Chicken Lil'", 55 | "item_name_ru": "Крошка Цыпа", 56 | "item_desc": "keychain_kc_missinglink_chicken_desc", 57 | "item_desc_en": "", 58 | "item_desc_ru": "", 59 | "image": "econ/keychains/missinglink/kc_missinglink_chicken", 60 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_chicken.vmdl" 61 | }, 62 | { 63 | "id": 6, 64 | "name": "kc_missinglink_guerilla", 65 | "item_name": "keychain_kc_missinglink_guerilla", 66 | "item_name_en": "Lil' Crass", 67 | "item_name_ru": "Крошка Крэсс", 68 | "item_desc": "keychain_kc_missinglink_guerilla_desc", 69 | "item_desc_en": "", 70 | "item_desc_ru": "", 71 | "image": "econ/keychains/missinglink/kc_missinglink_guerilla", 72 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_guerilla.vmdl" 73 | }, 74 | { 75 | "id": 7, 76 | "name": "kc_missinglink_howl", 77 | "item_name": "keychain_kc_missinglink_howl", 78 | "item_name_en": "Hot Howl", 79 | "item_name_ru": "Воющая колбаска", 80 | "item_desc": "keychain_kc_missinglink_howl_desc", 81 | "item_desc_en": "", 82 | "item_desc_ru": "", 83 | "image": "econ/keychains/missinglink/kc_missinglink_howl", 84 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_howl.vmdl" 85 | }, 86 | { 87 | "id": 8, 88 | "name": "kc_missinglink_kev", 89 | "item_name": "keychain_kc_missinglink_kev", 90 | "item_name_en": "Big Kev", 91 | "item_name_ru": "Здоровяк Кев", 92 | "item_desc": "keychain_kc_missinglink_kev_desc", 93 | "item_desc_en": "", 94 | "item_desc_ru": "", 95 | "image": "econ/keychains/missinglink/kc_missinglink_kev", 96 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_kev.vmdl" 97 | }, 98 | { 99 | "id": 9, 100 | "name": "kc_missinglink_monster", 101 | "item_name": "keychain_kc_missinglink_monster", 102 | "item_name_en": "Lil' Monster", 103 | "item_name_ru": "Крошка Монстр", 104 | "item_desc": "keychain_kc_missinglink_monster_desc", 105 | "item_desc_en": "", 106 | "item_desc_ru": "", 107 | "image": "econ/keychains/missinglink/kc_missinglink_monster", 108 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_monster.vmdl" 109 | }, 110 | { 111 | "id": 10, 112 | "name": "kc_missinglink_sam_catchup", 113 | "item_name": "keychain_kc_missinglink_sam_catchup", 114 | "item_name_en": "Hot Sauce", 115 | "item_name_ru": "Острый соус", 116 | "item_desc": "keychain_kc_missinglink_sam_catchup_desc", 117 | "item_desc_en": "", 118 | "item_desc_ru": "", 119 | "image": "econ/keychains/missinglink/kc_missinglink_sam_catchup", 120 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_sam_catchup.vmdl" 121 | }, 122 | { 123 | "id": 11, 124 | "name": "kc_missinglink_sam_diamond", 125 | "item_name": "keychain_kc_missinglink_sam_diamond", 126 | "item_name_en": "Diamond Dog", 127 | "item_name_ru": "Бриллиантовая колбаска", 128 | "item_desc": "keychain_kc_missinglink_sam_diamond_desc", 129 | "item_desc_en": "", 130 | "item_desc_ru": "", 131 | "image": "econ/keychains/missinglink/kc_missinglink_sam_diamond", 132 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_sam_diamond.vmdl" 133 | }, 134 | { 135 | "id": 12, 136 | "name": "kc_missinglink_sam_salty", 137 | "item_name": "keychain_kc_missinglink_sam_salty", 138 | "item_name_en": "Pinch O' Salt", 139 | "item_name_ru": "Щепотка соли", 140 | "item_desc": "keychain_kc_missinglink_sam_salty_desc", 141 | "item_desc_en": "", 142 | "item_desc_ru": "", 143 | "image": "econ/keychains/missinglink/kc_missinglink_sam_salty", 144 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_sam_salty.vmdl" 145 | }, 146 | { 147 | "id": 13, 148 | "name": "kc_missinglink_sam_shape", 149 | "item_name": "keychain_kc_missinglink_sam_shape", 150 | "item_name_en": "Diner Dog", 151 | "item_name_ru": "Закусочная колбаска", 152 | "item_desc": "keychain_kc_missinglink_sam_shape_desc", 153 | "item_desc_en": "", 154 | "item_desc_ru": "", 155 | "image": "econ/keychains/missinglink/kc_missinglink_sam_shape", 156 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_sam_shape.vmdl" 157 | }, 158 | { 159 | "id": 14, 160 | "name": "kc_missinglink_sam_toile", 161 | "item_name": "keychain_kc_missinglink_sam_toile", 162 | "item_name_en": "Lil' Teacup", 163 | "item_name_ru": "Крошка Чашка", 164 | "item_desc": "keychain_kc_missinglink_sam_toile_desc", 165 | "item_desc_en": "", 166 | "item_desc_ru": "", 167 | "image": "econ/keychains/missinglink/kc_missinglink_sam_toile", 168 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_sam_toile.vmdl" 169 | }, 170 | { 171 | "id": 15, 172 | "name": "kc_missinglink_sas", 173 | "item_name": "keychain_kc_missinglink_sas", 174 | "item_name_en": "Lil' SAS", 175 | "item_name_ru": "Крошка SAS", 176 | "item_desc": "keychain_kc_missinglink_sas_desc", 177 | "item_desc_en": "", 178 | "item_desc_ru": "", 179 | "image": "econ/keychains/missinglink/kc_missinglink_sas", 180 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_sas.vmdl" 181 | }, 182 | { 183 | "id": 16, 184 | "name": "kc_missinglink_wurst", 185 | "item_name": "keychain_kc_missinglink_wurst", 186 | "item_name_en": "Hot Wurst", 187 | "item_name_ru": "Колбаска на огне", 188 | "item_desc": "keychain_kc_missinglink_wurst_desc", 189 | "item_desc_en": "", 190 | "item_desc_ru": "", 191 | "image": "econ/keychains/missinglink/kc_missinglink_wurst", 192 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_wurst.vmdl" 193 | }, 194 | { 195 | "id": 17, 196 | "name": "kc_wpn_ak_base", 197 | "item_name": "keychain_kc_wpn_ak_base", 198 | "item_name_en": "Baby's AK", 199 | "item_name_ru": "Мини-калаш", 200 | "item_desc": "keychain_kc_wpn_ak_base_desc", 201 | "item_desc_en": "", 202 | "item_desc_ru": "", 203 | "image": "econ/keychains/weapon_1/kc_wpn_ak_base", 204 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_ak_base.vmdl" 205 | }, 206 | { 207 | "id": 18, 208 | "name": "kc_wpn_ak_jelly", 209 | "item_name": "keychain_kc_wpn_ak_jelly", 210 | "item_name_en": "Die-cast AK", 211 | "item_name_ru": "Литой калаш", 212 | "item_desc": "keychain_kc_wpn_ak_jelly_desc", 213 | "item_desc_en": "", 214 | "item_desc_ru": "", 215 | "image": "econ/keychains/weapon_1/kc_wpn_ak_jelly", 216 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_ak_jelly.vmdl" 217 | }, 218 | { 219 | "id": 19, 220 | "name": "kc_wpn_awp_plastic", 221 | "item_name": "keychain_kc_wpn_awp_plastic", 222 | "item_name_en": "Pocket AWP", 223 | "item_name_ru": "Карманная AWP", 224 | "item_desc": "keychain_kc_wpn_awp_plastic_desc", 225 | "item_desc_en": "", 226 | "item_desc_ru": "", 227 | "image": "econ/keychains/weapon_1/kc_wpn_awp_plastic", 228 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_awp_plastic.vmdl" 229 | }, 230 | { 231 | "id": 20, 232 | "name": "kc_wpn_awp_spoon", 233 | "item_name": "keychain_kc_wpn_awp_spoon", 234 | "item_name_en": "Titeenium AWP", 235 | "item_name_ru": "Титанюсенькая AWP", 236 | "item_desc": "keychain_kc_wpn_awp_spoon_desc", 237 | "item_desc_en": "", 238 | "item_desc_ru": "", 239 | "image": "econ/keychains/weapon_1/kc_wpn_awp_spoon", 240 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_awp_spoon.vmdl" 241 | }, 242 | { 243 | "id": 21, 244 | "name": "kc_wpn_ctknife_gold", 245 | "item_name": "keychain_kc_wpn_ctknife_gold", 246 | "item_name_en": "Baby Karat CT", 247 | "item_name_ru": "Мини-карат (спецназ)", 248 | "item_desc": "keychain_kc_wpn_ctknife_gold_desc", 249 | "item_desc_en": "", 250 | "item_desc_ru": "", 251 | "image": "econ/keychains/weapon_1/kc_wpn_ctknife_gold", 252 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_ctknife_gold.vmdl" 253 | }, 254 | { 255 | "id": 22, 256 | "name": "kc_wpn_ctknife_wood", 257 | "item_name": "keychain_kc_wpn_ctknife_wood", 258 | "item_name_en": "Whittle Knife", 259 | "item_name_ru": "Резной резачок", 260 | "item_desc": "keychain_kc_wpn_ctknife_wood_desc", 261 | "item_desc_en": "", 262 | "item_desc_ru": "", 263 | "image": "econ/keychains/weapon_1/kc_wpn_ctknife_wood", 264 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_ctknife_wood.vmdl" 265 | }, 266 | { 267 | "id": 23, 268 | "name": "kc_wpn_m4a1s_comic", 269 | "item_name": "keychain_kc_wpn_m4a1s_comic", 270 | "item_name_en": "POP Art", 271 | "item_name_ru": "Поп-арт", 272 | "item_desc": "keychain_kc_wpn_m4a1s_comic_desc", 273 | "item_desc_en": "", 274 | "item_desc_ru": "", 275 | "image": "econ/keychains/weapon_1/kc_wpn_m4a1s_comic", 276 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_m4a1s_comic.vmdl" 277 | }, 278 | { 279 | "id": 24, 280 | "name": "kc_wpn_m4a1s_ss", 281 | "item_name": "keychain_kc_wpn_m4a1s_ss", 282 | "item_name_en": "Lil' Squirt", 283 | "item_name_ru": "Крошка Пшик", 284 | "item_desc": "keychain_kc_wpn_m4a1s_ss_desc", 285 | "item_desc_en": "", 286 | "item_desc_ru": "", 287 | "image": "econ/keychains/weapon_1/kc_wpn_m4a1s_ss", 288 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_m4a1s_ss.vmdl" 289 | }, 290 | { 291 | "id": 25, 292 | "name": "kc_wpn_mac10_glitter", 293 | "item_name": "keychain_kc_wpn_mac10_glitter", 294 | "item_name_en": "Disco MAC", 295 | "item_name_ru": "Дисколет-пулемёт", 296 | "item_desc": "keychain_kc_wpn_mac10_glitter_desc", 297 | "item_desc_en": "", 298 | "item_desc_ru": "", 299 | "image": "econ/keychains/weapon_1/kc_wpn_mac10_glitter", 300 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_mac10_glitter.vmdl" 301 | }, 302 | { 303 | "id": 26, 304 | "name": "kc_wpn_mac10_tile", 305 | "item_name": "keychain_kc_wpn_mac10_tile", 306 | "item_name_en": "Backsplash", 307 | "item_name_ru": "Кафель", 308 | "item_desc": "keychain_kc_wpn_mac10_tile_desc", 309 | "item_desc_en": "", 310 | "item_desc_ru": "", 311 | "image": "econ/keychains/weapon_1/kc_wpn_mac10_tile", 312 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_mac10_tile.vmdl" 313 | }, 314 | { 315 | "id": 27, 316 | "name": "kc_wpn_tec9_cap", 317 | "item_name": "keychain_kc_wpn_tec9_cap", 318 | "item_name_en": "Lil' Cap Gun", 319 | "item_name_ru": "Крошка Пистон", 320 | "item_desc": "keychain_kc_wpn_tec9_cap_desc", 321 | "item_desc_en": "", 322 | "item_desc_ru": "", 323 | "image": "econ/keychains/weapon_1/kc_wpn_tec9_cap", 324 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_tec9_cap.vmdl" 325 | }, 326 | { 327 | "id": 28, 328 | "name": "kc_wpn_tec9_magma", 329 | "item_name": "keychain_kc_wpn_tec9_magma", 330 | "item_name_en": "Hot Hands", 331 | "item_name_ru": "Стреляй, пока горячо", 332 | "item_desc": "keychain_kc_wpn_tec9_magma_desc", 333 | "item_desc_en": "", 334 | "item_desc_ru": "", 335 | "image": "econ/keychains/weapon_1/kc_wpn_tec9_magma", 336 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_tec9_magma.vmdl" 337 | }, 338 | { 339 | "id": 29, 340 | "name": "kc_wpn_tknife_crystal", 341 | "item_name": "keychain_kc_wpn_tknife_crystal", 342 | "item_name_en": "Semi-Precious", 343 | "item_name_ru": "Самоцвет", 344 | "item_desc": "keychain_kc_wpn_tknife_crystal_desc", 345 | "item_desc_en": "", 346 | "item_desc_ru": "", 347 | "image": "econ/keychains/weapon_1/kc_wpn_tknife_crystal", 348 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_tknife_crystal.vmdl" 349 | }, 350 | { 351 | "id": 30, 352 | "name": "kc_wpn_tknife_gold", 353 | "item_name": "keychain_kc_wpn_tknife_gold", 354 | "item_name_en": "Baby Karat T", 355 | "item_name_ru": "Мини-карат (террорист)", 356 | "item_desc": "keychain_kc_wpn_tknife_gold_desc", 357 | "item_desc_en": "", 358 | "item_desc_ru": "", 359 | "image": "econ/keychains/weapon_1/kc_wpn_tknife_gold", 360 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_tknife_gold.vmdl" 361 | }, 362 | { 363 | "id": 31, 364 | "name": "kc_wpn_usp_jewel", 365 | "item_name": "keychain_kc_wpn_usp_jewel", 366 | "item_name_en": "Glamour Shot", 367 | "item_name_ru": "Гламурный стрелок", 368 | "item_desc": "keychain_kc_wpn_usp_jewel_desc", 369 | "item_desc_en": "", 370 | "item_desc_ru": "", 371 | "image": "econ/keychains/weapon_1/kc_wpn_usp_jewel", 372 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_usp_jewel.vmdl" 373 | }, 374 | { 375 | "id": 32, 376 | "name": "kc_wpn_usp_yarn", 377 | "item_name": "keychain_kc_wpn_usp_yarn", 378 | "item_name_en": "Stitch-Loaded", 379 | "item_name_ru": "Шерстолет", 380 | "item_desc": "keychain_kc_wpn_usp_yarn_desc", 381 | "item_desc_en": "", 382 | "item_desc_ru": "", 383 | "image": "econ/keychains/weapon_1/kc_wpn_usp_yarn", 384 | "pedestal_model": "weapons/keychains/weapon_1/vmdl/kc_wpn_usp_yarn.vmdl" 385 | }, 386 | { 387 | "id": 33, 388 | "name": "kc_missinglink_bigfoot", 389 | "item_name": "keychain_kc_missinglink_bigfoot", 390 | "item_name_en": "Lil' Squatch", 391 | "item_name_ru": "Крошка Спорт-сквоч", 392 | "item_desc": "keychain_kc_missinglink_bigfoot_desc", 393 | "item_desc_en": "", 394 | "item_desc_ru": "", 395 | "image": "econ/keychains/missinglink/kc_missinglink_bigfoot", 396 | "pedestal_model": "weapons/keychains/missinglink/vmdl/kc_missinglink_bigfoot.vmdl" 397 | } 398 | ] -------------------------------------------------------------------------------- /output/rarities.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "default", 4 | "value": 0, 5 | "loc_key": "Rarity_Default", 6 | "loc_key_weapon": "Rarity_Default_Weapon", 7 | "loc_key_character": "Rarity_Default_Character", 8 | "color": "desc_default", 9 | "drop_sound": "EndMatch.ItemRevealRarityCommon", 10 | "loc_key_en": "Default", 11 | "loc_key_ru": "Стандартное", 12 | "loc_key_weapon_en": "Stock", 13 | "loc_key_weapon_ru": "Стандартное", 14 | "loc_key_character_en": "Default", 15 | "loc_key_character_ru": "Стандартный", 16 | "hex_color": "#ded6cc" 17 | }, 18 | { 19 | "name": "common", 20 | "value": 1, 21 | "loc_key": "Rarity_Common", 22 | "loc_key_weapon": "Rarity_Common_Weapon", 23 | "loc_key_character": "Rarity_Common_Character", 24 | "color": "desc_common", 25 | "weight": 10000000, 26 | "next_rarity": "uncommon", 27 | "drop_sound": "EndMatch.ItemRevealRarityCommon", 28 | "loc_key_en": "Base Grade", 29 | "loc_key_ru": "базового класса", 30 | "loc_key_weapon_en": "Consumer Grade", 31 | "loc_key_weapon_ru": "Ширпотреб", 32 | "loc_key_character_en": "", 33 | "loc_key_character_ru": "", 34 | "hex_color": "#b0c3d9" 35 | }, 36 | { 37 | "name": "uncommon", 38 | "value": 2, 39 | "loc_key": "Rarity_Uncommon", 40 | "loc_key_weapon": "Rarity_Uncommon_Weapon", 41 | "loc_key_character": "Rarity_Uncommon_Character", 42 | "color": "desc_uncommon", 43 | "weight": 2000000, 44 | "next_rarity": "rare", 45 | "drop_sound": "EndMatch.ItemRevealRarityUncommon", 46 | "loc_key_en": "Medium Grade", 47 | "loc_key_ru": "Среднего класса", 48 | "loc_key_weapon_en": "Industrial Grade", 49 | "loc_key_weapon_ru": "Промышленное качество", 50 | "loc_key_character_en": "", 51 | "loc_key_character_ru": "", 52 | "hex_color": "#5e98d9" 53 | }, 54 | { 55 | "name": "rare", 56 | "value": 3, 57 | "loc_key": "Rarity_Rare", 58 | "loc_key_weapon": "Rarity_Rare_Weapon", 59 | "loc_key_character": "Rarity_Rare_Character", 60 | "color": "desc_rare", 61 | "weight": 400000, 62 | "next_rarity": "mythical", 63 | "drop_sound": "EndMatch.ItemRevealRarityRare", 64 | "loc_key_en": "High Grade", 65 | "loc_key_ru": "высшего класса", 66 | "loc_key_weapon_en": "Mil-Spec Grade", 67 | "loc_key_weapon_ru": "Армейское качество", 68 | "loc_key_character_en": "Distinguished", 69 | "loc_key_character_ru": "Заслуженный", 70 | "hex_color": "#4b69ff" 71 | }, 72 | { 73 | "name": "mythical", 74 | "value": 4, 75 | "loc_key": "Rarity_Mythical", 76 | "loc_key_weapon": "Rarity_Mythical_Weapon", 77 | "loc_key_character": "Rarity_Mythical_Character", 78 | "color": "desc_mythical", 79 | "weight": 80000, 80 | "drop_sound": "EndMatch.ItemRevealRarityMythical", 81 | "loc_key_en": "Remarkable", 82 | "loc_key_ru": "примечательного типа", 83 | "loc_key_weapon_en": "Restricted", 84 | "loc_key_weapon_ru": "Запрещённое", 85 | "loc_key_character_en": "Exceptional", 86 | "loc_key_character_ru": "Исключительный", 87 | "hex_color": "#8847ff" 88 | }, 89 | { 90 | "name": "legendary", 91 | "value": 5, 92 | "loc_key": "Rarity_Legendary", 93 | "loc_key_weapon": "Rarity_Legendary_Weapon", 94 | "loc_key_character": "Rarity_Legendary_Character", 95 | "color": "desc_legendary", 96 | "drop_sound": "EndMatch.ItemRevealRarityLegendary", 97 | "loc_key_en": "Exotic", 98 | "loc_key_ru": "экзотичного вида", 99 | "loc_key_weapon_en": "Classified", 100 | "loc_key_weapon_ru": "Засекреченное", 101 | "loc_key_character_en": "Superior", 102 | "loc_key_character_ru": "Превосходный", 103 | "hex_color": "#d32ce6" 104 | }, 105 | { 106 | "name": "ancient", 107 | "value": 6, 108 | "loc_key": "Rarity_Ancient", 109 | "loc_key_weapon": "Rarity_Ancient_Weapon", 110 | "loc_key_character": "Rarity_Ancient_Character", 111 | "color": "desc_ancient", 112 | "drop_sound": "EndMatch.ItemRevealRarityLegendary", 113 | "loc_key_en": "Extraordinary", 114 | "loc_key_ru": "экстраординарного типа", 115 | "loc_key_weapon_en": "Covert", 116 | "loc_key_weapon_ru": "Тайное", 117 | "loc_key_character_en": "Master", 118 | "loc_key_character_ru": "Мастерский", 119 | "hex_color": "#eb4b4b" 120 | }, 121 | { 122 | "name": "immortal", 123 | "value": 7, 124 | "loc_key": "Rarity_Contraband", 125 | "loc_key_weapon": "Rarity_Contraband_Weapon", 126 | "loc_key_character": "Rarity_Contraband_Character", 127 | "color": "desc_immortal", 128 | "drop_sound": "EndMatch.ItemRevealRarityLegendary", 129 | "loc_key_en": "Contraband", 130 | "loc_key_ru": "Контрабанда", 131 | "loc_key_weapon_en": "Contraband", 132 | "loc_key_weapon_ru": "Контрабанда", 133 | "loc_key_character_en": "Contraband", 134 | "loc_key_character_ru": "Контрабандный", 135 | "hex_color": "#e4ae39" 136 | }, 137 | { 138 | "name": "unusual", 139 | "value": 99, 140 | "loc_key": "Unusual", 141 | "loc_key_weapon": "Rarity_Unusual", 142 | "loc_key_character": "Rarity_Unusual", 143 | "color": "desc_unusual", 144 | "loc_key_en": "★", 145 | "loc_key_ru": "★", 146 | "hex_color": "#ffd700" 147 | } 148 | ] -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cs2-items-parser", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "author": "AspectUnk (https://github.com/AspectUnk)", 10 | "license": "Apache-2.0", 11 | "dependencies": { 12 | "lodash": "^4.17.21", 13 | "vdf-parser": "^1.2.1" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/AspectUnk/cs2-items-parser.git" 18 | }, 19 | "keywords": [ 20 | "cs2", 21 | "csgo", 22 | "cs", 23 | "parser", 24 | "items", 25 | "js", 26 | "steam", 27 | "s2", 28 | "source", 29 | "source2" 30 | ], 31 | "bugs": { 32 | "url": "https://github.com/AspectUnk/cs2-items-parser/issues" 33 | }, 34 | "homepage": "https://github.com/AspectUnk/cs2-items-parser#readme" 35 | } 36 | --------------------------------------------------------------------------------