Guest User

Untitled

a guest
Sep 15th, 2018
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.80 KB | None | 0 0
  1. #include "Parser.h"
  2. #include <algorithm>
  3. namespace valve_parser
  4. {
  5. Object::Object(Document* doc) : Node(doc) {}
  6.  
  7. Object* Object::ToObject()
  8. {
  9. return this;
  10. }
  11.  
  12. std::shared_ptr<Node> Object::GetKeyByName(char* name)
  13. {
  14. for (auto& child : children)
  15. {
  16. if (child->ToKeyValue())
  17. {
  18. if (Util::StrEqu(child->ToKeyValue()->Key, name))
  19. return child;
  20. }
  21. }
  22.  
  23. return 0;
  24. }
  25.  
  26. bool Object::Parse()
  27. {
  28. std::shared_ptr<Node> n;
  29.  
  30. while (*_doc->p)
  31. {
  32. //check for object close
  33. auto string_begin = Str::ParseTextExpectedTag(_doc->p, STRING, true);
  34. if (!string_begin)
  35. {
  36. auto obj_close = Str::ParseTextExpectedTag(_doc->p, OBJECT_CLOSE, true);
  37. if (obj_close)
  38. {
  39. _doc->p = obj_close + 1;
  40. return true;
  41. }
  42. else
  43. return false;
  44. }
  45.  
  46. if (!_doc->identify(n))
  47. return false;
  48.  
  49. if (n->ToKeyValue())
  50. {
  51. this->children.push_back(n);
  52. }
  53.  
  54. if (n->ToObject())
  55. {
  56. this->children.push_back(n);
  57. Object* obj = n->ToObject();
  58. if (!obj->Parse())
  59. return false;
  60. }
  61. }
  62.  
  63. return false;
  64. }
  65.  
  66. bool Node::Parse()
  67. {
  68. std::shared_ptr<Node> n;
  69.  
  70. while (*_doc->p)
  71. {
  72. if (!_doc->identify(n))
  73. {
  74. if (!Str::EndReached(_doc->p, OBJECT_OPEN) &&
  75. !Str::EndReached(_doc->p, OBJECT_CLOSE) &&
  76. !Str::EndReached(_doc->p, STRING))
  77. return true;
  78. else
  79. return false;
  80. }
  81.  
  82. if (n->ToKeyValue())
  83. {
  84. this->children.push_back(n);
  85. }
  86.  
  87. if (n->ToObject())
  88. {
  89. this->children.push_back(n);
  90. Object* obj = n->ToObject();
  91. if (!obj->Parse())
  92. return false;
  93. }
  94. }
  95.  
  96. return false;
  97. }
  98. }
  99. std::unordered_map<std::string, std::set<std::string>> weaponSkins;
  100. std::unordered_map<std::string, skinInfo> skinMap;
  101. std::unordered_map<std::string, std::string> skinNames;
  102. std::vector<std::string> weaponNames;
  103. int ParseSkins()
  104. {
  105. valve_parser::Document doc;
  106. auto r = doc.Load(".\\csgo\\scripts\\items\\items_game.txt", valve_parser::ENCODING::UTF8);
  107. if (!r)
  108. return 1;
  109.  
  110. valve_parser::Document english;
  111. r = english.Load(".\\csgo\\resource\\csgo_english.txt", valve_parser::ENCODING::UTF16_LE);
  112. if (!r)
  113. return 2;
  114.  
  115. auto weaponSkinCombo = doc.BreadthFirstSearch("weapon_icons");
  116. if (!weaponSkinCombo || !weaponSkinCombo->ToObject())
  117. return 3;
  118.  
  119. auto skinDataVec = doc.BreadthFirstSearchMultiple("paint_kits");
  120. if (!skinDataVec.size())
  121. return 4;
  122.  
  123. auto PaintKitNames = english.BreadthFirstSearch("Tokens");
  124. if (!PaintKitNames || !PaintKitNames->ToObject())
  125. return 5;
  126.  
  127. //std::unordered_map<std::string, std::set<std::string>> G::weaponSkins;
  128. //std::unordered_map<std::string, skinInfo> G::skinMap;
  129. //std::unordered_map<std::string, std::string> G::skinNames;
  130.  
  131. std::vector<std::string> weaponNames = {
  132. "deagle",
  133. "elite",
  134. "fiveseven",
  135. "glock",
  136. "ak47",
  137. "aug",
  138. "awp",
  139. "famas",
  140. "g3sg1",
  141. "galilar",
  142. "m249",
  143. "m4a1_silencer", //needs to be before m4a1 else silencer doesnt get filtered out :D
  144. "m4a1",
  145. "mac10",
  146. "p90",
  147. "ump45",
  148. "xm1014",
  149. "bizon",
  150. "mag7",
  151. "negev",
  152. "sawedoff",
  153. "tec9",
  154. "hkp2000",
  155. "mp7",
  156. "mp9",
  157. "nova",
  158. "p250",
  159. "scar20",
  160. "sg556",
  161. "ssg08",
  162. "usp_silencer",
  163. "cz75a",
  164. "revolver",
  165. "knife_m9_bayonet", //needs to be before bayonet else knife_m9_bayonet doesnt get filtered out :D
  166. "bayonet",
  167. "knife_flip",
  168. "knife_gut",
  169. "knife_karambit",
  170. "knife_tactical",
  171. "knife_falchion",
  172. "knife_survival_bowie",
  173. "knife_butterfly",
  174. "knife_push"
  175. };
  176.  
  177. //populate G::weaponSkins
  178. for (auto child : weaponSkinCombo->children)
  179. {
  180. if (child->ToObject())
  181. {
  182. for (auto weapon : weaponNames)
  183. {
  184. auto skinName = child->ToObject()->GetKeyByName("icon_path")->ToKeyValue()->Value.toString();
  185. auto pos = skinName.find(weapon);
  186. //filter out the skinname
  187. if (pos != std::string::npos)
  188. {
  189. auto pos2 = skinName.find_last_of('_');
  190. weaponSkins[weapon].insert(
  191. skinName.substr(pos + weapon.length() + 1,
  192. pos2 - pos - weapon.length() - 1)
  193. );
  194. break;
  195. }
  196. }
  197. }
  198. }
  199.  
  200. //populate skinData
  201. for (auto skinData : skinDataVec)
  202. {
  203. if (skinData->ToObject())
  204. {
  205. for (auto skin : skinData->children)
  206. {
  207. if (skin->ToObject())
  208. {
  209. skinInfo si;
  210. si.paintkit = skin->ToObject()->name.toInt();
  211.  
  212. auto skinName = skin->ToObject()->GetKeyByName("name")->ToKeyValue()->Value.toString();
  213. auto tagNode = skin->ToObject()->GetKeyByName("description_tag");
  214. if (tagNode)
  215. {
  216. std::string tag = tagNode->ToKeyValue()->Value.toString();
  217. tag = tag.substr(1, std::string::npos); //skip #
  218. std::transform(tag.begin(), tag.end(), tag.begin(), towlower);
  219. si.tagName = tag;
  220. }
  221.  
  222. auto keyVal = skin->ToObject()->GetKeyByName("seed");
  223. if (keyVal != nullptr)
  224. si.seed = keyVal->ToKeyValue()->Value.toInt();
  225.  
  226. skinMap[skinName] = si;
  227. }
  228. }
  229. }
  230. }
  231.  
  232. //populate G::skinNames
  233. for (auto child : PaintKitNames->children)
  234. {
  235. if (child->ToKeyValue())
  236. {
  237. std::string key = child->ToKeyValue()->Key.toString();
  238. std::transform(key.begin(), key.end(), key.begin(), towlower);
  239. if (key.find("paintkit") != std::string::npos &&
  240. key.find("tag") != std::string::npos)
  241. {
  242. skinNames[key] = child->ToKeyValue()->Value.toString();
  243. }
  244. }
  245. }
  246.  
  247.  
  248.  
  249. return 0;
  250. }
  251. const char* GetWeaponNameById(int id)
  252. {
  253. switch (id)
  254. {
  255. case 1:
  256. return "deagle";
  257. case 2:
  258. return "elite";
  259. case 3:
  260. return "fiveseven";
  261. case 4:
  262. return "glock";
  263. case 7:
  264. return "ak47";
  265. case 8:
  266. return "aug";
  267. case 9:
  268. return "awp";
  269. case 10:
  270. return "famas";
  271. case 11:
  272. return "g3sg1";
  273. case 13:
  274. return "galilar";
  275. case 14:
  276. return "m249";
  277. case 60:
  278. return "m4a1_silencer";
  279. case 16:
  280. return "m4a1";
  281. case 17:
  282. return "mac10";
  283. case 19:
  284. return "p90";
  285. case 24:
  286. return "ump45";
  287. case 25:
  288. return "xm1014";
  289. case 26:
  290. return "bizon";
  291. case 27:
  292. return "mag7";
  293. case 28:
  294. return "negev";
  295. case 29:
  296. return "sawedoff";
  297. case 30:
  298. return "tec9";
  299. case 32:
  300. return "hkp2000";
  301. case 33:
  302. return "mp7";
  303. case 34:
  304. return "mp9";
  305. case 35:
  306. return "nova";
  307. case 36:
  308. return "p250";
  309. case 38:
  310. return "scar20";
  311. case 39:
  312. return "sg556";
  313. case 40:
  314. return "ssg08";
  315. case 61:
  316. return "usp_silencer";
  317. case 63:
  318. return "cz75a";
  319. case 64:
  320. return "revolver";
  321. case 508:
  322. return "knife_m9_bayonet";
  323. case 500:
  324. return "bayonet";
  325. case 505:
  326. return "knife_flip";
  327. case 506:
  328. return "knife_gut";
  329. case 507:
  330. return "knife_karambit";
  331. case 509:
  332. return "knife_tactical";
  333. case 512:
  334. return "knife_falchion";
  335. case 514:
  336. return "knife_survival_bowie";
  337. case 515:
  338. return "knife_butterfly";
  339. case 516:
  340. return "knife_push";
  341.  
  342. default:
  343. return "";
  344. }
  345. }
Advertisement
Add Comment
Please, Sign In to add comment