Advertisement
Guest User

hee

a guest
Apr 25th, 2017
481
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.26 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4. #include <fakemeta_util>
  5. #include <fun>
  6. #include <hamsandwich>
  7. #include <cstrike>
  8. #include <engine>
  9. #include <nst_wpn>
  10.  
  11. #include <zombieplague>
  12.  
  13. #define PLUGIN "NST Wpn Mod"
  14. #define VERSION "1.0"
  15. #define AUTHOR "NST"
  16.  
  17.  
  18. // Var main
  19. const TYPE_WPN = 4
  20. const MAX_WPN = 40
  21. new HAS_WEAPON[33]
  22. new g_wpn_name[MAX_WPN][32]
  23. new g_wpn_model[MAX_WPN][32]
  24. new g_wpn_change[MAX_WPN]
  25. new g_wpn_sprites_exp[MAX_WPN][100]
  26. new g_wpn_sound_exp[MAX_WPN][100]
  27. new g_wpn_cmdbuy[MAX_WPN][32]
  28. new name_class_weapon[MAX_WPN][32]
  29. new Name_WpnChange[MAX_WPN][32]
  30.  
  31. new current_select[33]
  32. new crWeapon[33]
  33.  
  34. // Models
  35. new P_MODEL[MAX_WPN][64]
  36. new V_MODEL[MAX_WPN][64]
  37. new W_MODEL[MAX_WPN][64]
  38.  
  39. // Cvar
  40. new cvar_dmg_name[MAX_WPN][64]
  41. new cvar_cost_name[MAX_WPN][64]
  42. new cvar_time_sound_name[MAX_WPN][64]
  43.  
  44. new cvar_dmgmultiplier[MAX_WPN]
  45. new cvar_cost[MAX_WPN]
  46. new cvar_time_sound[MAX_WPN]
  47. new cvar_buy
  48.  
  49. // Sprites
  50. new gSpriteIndex[MAX_WPN]
  51. new ent_user[500][2]
  52. #define is_valid_player(%1) (1 <= %1 <= 32)
  53.  
  54.  
  55. public plugin_init() {
  56. register_plugin(PLUGIN, VERSION, AUTHOR)
  57.  
  58. // Reg Public
  59. register_event("CurWeapon","checkWeapon","be","1=1")
  60. register_event("DeathMsg", "Death", "a")
  61. register_event("HLTV", "event_start_freezetime", "a", "1=0", "2=0")
  62. RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
  63. register_forward(FM_Think,"fw_think")
  64. register_forward(FM_SetModel, "fw_SetModel")
  65.  
  66. // Reg Cmd
  67. register_clcmd("nst_wpn_4", "menu_wpn")
  68. register_clcmd("nst_wpn_4_rebuy", "rebuy_wpn")
  69. cvar_buy = register_cvar("nst_buy_model4", "nst")
  70. register_clcmd("nst_buy_wpn4", "buy_weapon_cvar")
  71.  
  72. new i = 1, check_value = 1
  73. while(check_value && i<MAX_WPN)
  74. {
  75. if (g_wpn_change[i] <= 0) check_value = 0
  76. if (check_value)
  77. {
  78. new szWpnName[32]
  79. get_weaponname(g_wpn_change[i], szWpnName, 31)
  80. format(Name_WpnChange[i], 31, "%s", szWpnName)
  81. register_clcmd(g_wpn_cmdbuy[i],"buy_weapon", i)
  82. }
  83. i++
  84. }
  85. }
  86. public plugin_precache()
  87. {
  88.  
  89. new configfile[200]
  90. get_configsdir(configfile,199)
  91. format(configfile,199,"%s/nst_wpn.ini",configfile)
  92. if(file_exists(configfile))
  93. {
  94. new row[200], left[64], trash, right[64], idwpn = 1
  95. new size=file_size(configfile,1)
  96. for(new i=0;i<size;i++)
  97. {
  98.  
  99. new name[64], model[64], wpn_change, damage[32], cost[32], time_sound[32]
  100. read_file(configfile,i,row,200,trash)
  101. if( (contain(row,";")!=0) && strlen(row) && idwpn<MAX_WPN)
  102. {
  103.  
  104. // Create Value
  105. replace(row, 199, " ", "_")
  106. replace(row, 199, "[name]", "")
  107. replace(row, 199, "[model]", " ")
  108. replace(row, 199, "[time_sound]", " ")
  109. replace(row, 199, "[damage]", " ")
  110. replace(row, 199, "[cost]", " ")
  111. replace(row, 199, "[wpn_change]", " ")
  112.  
  113. strbreak(row,left,63,right,63)
  114. format(row, 199, "%s", right)
  115. format(name, 63, "%s", left)
  116. replace(name, 63, "_", " ")
  117.  
  118. strbreak(row,left,63,right,63)
  119. format(row, 199, "%s", right)
  120. format(model, 63, "%s", left)
  121.  
  122. strbreak(row,left,63,right,63)
  123. format(row, 199, "%s", right)
  124. wpn_change = str_to_num(left)
  125.  
  126. strbreak(row,left,63,right,63)
  127. format(row, 199, "%s", right)
  128. format(damage, 31, "%s", left)
  129.  
  130. strbreak(row,left,63,right,63)
  131. format(row, 199, "%s", right)
  132. format(cost, 31, "%s", left)
  133.  
  134. strbreak(row,left,63,right,63)
  135. format(row, 199, "%s", right)
  136. format(time_sound, 31, "%s", left)
  137.  
  138.  
  139. if (nst_get_weapon_type(wpn_change) == TYPE_WPN)
  140. {
  141. // Set Value
  142. format(g_wpn_name[idwpn], 31, "%s", name)
  143. format(g_wpn_model[idwpn], 31, "%s", model)
  144. format(g_wpn_cmdbuy[idwpn], 31, "nst_buywpn %s", model)
  145. format(name_class_weapon[idwpn], 31, "nst_%s", model)
  146. g_wpn_change[idwpn] = wpn_change
  147.  
  148.  
  149.  
  150. // Create Vvar
  151. format(cvar_dmg_name[idwpn], 63, "nst_%s_dmg", model)
  152. format(cvar_cost_name[idwpn], 63, "nst_%s_cost", model)
  153. format(cvar_time_sound_name[idwpn], 63, "nst_%s_time_sound", model)
  154. cvar_dmgmultiplier[idwpn] = register_cvar(cvar_dmg_name[idwpn], damage)
  155. cvar_cost[idwpn] = register_cvar(cvar_cost_name[idwpn], cost)
  156. cvar_time_sound[idwpn] = register_cvar(cvar_time_sound_name[idwpn], time_sound)
  157.  
  158.  
  159. // Create Models
  160. format(P_MODEL[idwpn], 63, "models/nst_wpn/p_%s.mdl", model)
  161. format(V_MODEL[idwpn], 63, "models/nst_wpn/v_%s.mdl", model)
  162. format(W_MODEL[idwpn], 63, "models/nst_wpn/w_%s.mdl", model)
  163. format(g_wpn_sprites_exp[idwpn], 99, "sprites/nst_wpn/%s_explode.spr", model)
  164. format(g_wpn_sound_exp[idwpn], 99, "weapons/nst_wpn/%s_explode.wav", model)
  165.  
  166. precache_model(P_MODEL[idwpn])
  167. precache_model(V_MODEL[idwpn])
  168. precache_model(W_MODEL[idwpn])
  169. if(!equal(time_sound, "-1")) precache_sound(g_wpn_sound_exp[idwpn])
  170. gSpriteIndex[idwpn] = engfunc(EngFunc_PrecacheModel,g_wpn_sprites_exp[idwpn])
  171.  
  172. idwpn++
  173. }
  174. }
  175. }
  176.  
  177. }
  178.  
  179. }
  180.  
  181. // Human Death
  182. public zp_user_infected_post(id)
  183. {
  184. if (zp_get_user_zombie(id) && HAS_WEAPON[id])
  185. {
  186. create_w_class(id, 0)
  187. HAS_WEAPON[id] = 0
  188. }
  189. }
  190. public Death()
  191. {
  192. new id = read_data(2)
  193. if(HAS_WEAPON[id])
  194. {
  195. create_w_class(id, 0)
  196. HAS_WEAPON[id] = 0
  197. return PLUGIN_HANDLED
  198. }
  199.  
  200. return PLUGIN_CONTINUE
  201. }
  202. // End Human Death
  203.  
  204.  
  205. // Menu Wpn
  206. public menu_wpn(id)
  207. {
  208. if (!g_wpn_change[1]) return PLUGIN_HANDLED
  209.  
  210.  
  211. new mHandleID = menu_create("[NST Wpn] Menu He Smoke:", "menu_wpn_handler")
  212. new i = 1, check_value = 1
  213. while(check_value && i<MAX_WPN)
  214. {
  215. if (g_wpn_change[i] <= 0) check_value = 0
  216. if (check_value)
  217. {
  218. new wpn_cost = get_pcvar_num(cvar_cost[i])
  219. new item_name[150], idwpn[32]
  220. format(item_name, 149, "%s: %i$", g_wpn_name[i], wpn_cost)
  221. format(idwpn, 31, "%i", i)
  222.  
  223. new check_money[33], user_money = cs_get_user_money(id)
  224. if(user_money < wpn_cost) check_money[id] = 1
  225. else check_money[id] = 0
  226.  
  227. menu_additem(mHandleID, item_name, idwpn, check_money[id])
  228. }
  229. i++
  230. }
  231.  
  232. menu_addblank(mHandleID, 1) // add blank got problem
  233. menu_setprop(mHandleID, MPROP_PERPAGE, 7)
  234. menu_display(id, mHandleID, 0)
  235.  
  236.  
  237. return PLUGIN_HANDLED
  238. }
  239. public menu_wpn_handler(id, menu, item)
  240. {
  241. if (item == MENU_EXIT)
  242. {
  243. menu_destroy(menu)
  244. return PLUGIN_HANDLED
  245. }
  246. new idwpn[32], name[32], access
  247. menu_item_getinfo(menu, item, access, idwpn, 31, name, 31, access)
  248. //client_print(id, print_chat, "item: %i - id: %s", item, idwpn);
  249.  
  250. new idweapon = str_to_num(idwpn)
  251. buy_weapon(id, idweapon)
  252. //client_cmd(id, g_wpn_cmdbuy[idweapon])
  253.  
  254. menu_destroy(menu)
  255. return PLUGIN_HANDLED
  256. }
  257. public rebuy_wpn(id)
  258. {
  259. new idwpn = current_select[id]
  260. if (idwpn>0) buy_weapon(id, idwpn)
  261.  
  262. return PLUGIN_HANDLED
  263. }
  264. // End Menu Wpn
  265.  
  266.  
  267. // Change Sprites Explode
  268. public fw_think(ent)
  269. {
  270. if(!pev_valid(ent))
  271. return FMRES_IGNORED;
  272.  
  273. if(!pev(ent,pev_bInDuck))
  274. return FMRES_IGNORED;
  275.  
  276. new class[32];
  277. pev(ent,pev_classname,class,31);
  278.  
  279. if(equali(class,"fake_hegren"))
  280. return FMRES_SUPERCEDE;
  281.  
  282. return FMRES_IGNORED;
  283. }
  284. public grenade_throw(id,iGren,wid)
  285. {
  286. new CURENT_WEAPON = HAS_WEAPON[id]
  287. new CHANGE_WEAPON = g_wpn_change[CURENT_WEAPON]
  288.  
  289. // check if grenade isn't a HeGrenade
  290. if(wid != CHANGE_WEAPON)
  291. return PLUGIN_CONTINUE;
  292.  
  293. // check if Grenade entity isn't a valid entity
  294. if(!pev_valid(iGren))
  295. return PLUGIN_CONTINUE;
  296.  
  297. if (HAS_WEAPON[id])
  298. {
  299. new id_ent
  300. if (iGren < sizeof ent_user) id_ent = iGren
  301. else id_ent = 0
  302. ent_user[id_ent][0] = id
  303. ent_user[id_ent][1] = gSpriteIndex[CURENT_WEAPON]
  304.  
  305. // set a new classname to HeGrenade
  306. set_pev(iGren,pev_classname,"fake_hegren")
  307.  
  308. // Make it to explode after 1.6 seconds
  309. set_task(1.6, "gre_explode", iGren)
  310. set_task(get_pcvar_float(cvar_time_sound[CURENT_WEAPON]),"sound_explode", iGren)
  311. }
  312.  
  313. return PLUGIN_CONTINUE;
  314. }
  315. public sound_explode(ent)
  316. {
  317. new id_ent
  318. if (ent < sizeof ent_user) id_ent = ent
  319. else id_ent = 0
  320.  
  321. new id = ent_user[id_ent][0]
  322. client_cmd(id, "spk %s", g_wpn_sound_exp[HAS_WEAPON[id]])
  323. HAS_WEAPON[id] = 0
  324. }
  325. public gre_explode(ent)
  326. {
  327. new id_ent
  328. if (ent < sizeof ent_user) id_ent = ent
  329. else id_ent = 0
  330. new sprites = ent_user[id_ent][1]
  331.  
  332. // check if entity isn't valid
  333. if(!pev_valid(ent))
  334. return;
  335.  
  336. // new variable for origin and get origin of entity
  337. static Float:origin[3];
  338. pev(ent,pev_origin,origin);
  339.  
  340. message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
  341. write_byte(TE_EXPLOSION); // TE_EXPLOSION
  342. write_coord(floatround(origin[0])); // origin x
  343. write_coord(floatround(origin[1])); // origin y
  344. write_coord(floatround(origin[2])); // origin z
  345. write_short(sprites); // sprites
  346. write_byte(40); // scale in 0.1's
  347. write_byte(30); // framerate
  348. write_byte(TE_EXPLFLAG_NONE); // flags
  349. message_end(); // message end
  350.  
  351.  
  352. //client_print(0, print_chat, "[%i]", ent)
  353. }
  354. // End Change Sprites Explode
  355.  
  356.  
  357. // Control Damage
  358. public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
  359. {
  360. new CURENT_WEAPON = HAS_WEAPON[attacker]
  361. new CHANGE_WEAPON = g_wpn_change[CURENT_WEAPON]
  362.  
  363. if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CHANGE_WEAPON && HAS_WEAPON[attacker] )
  364. {
  365. SetHamParamFloat(4, damage * get_pcvar_float( cvar_dmgmultiplier[CURENT_WEAPON] ) )
  366. }
  367. }
  368. // End Control Damage
  369.  
  370.  
  371. // Buy Weapon
  372. public buy_weapon_cvar(id)
  373. {
  374. new models[62]
  375. get_pcvar_string(cvar_buy, models, 61)
  376.  
  377. for(new i=1; i<MAX_WPN; i++)
  378. {
  379. if (g_wpn_change[i] > 0)
  380. {
  381. if (equali(g_wpn_model[i],models))
  382. {
  383. buy_weapon(id, i)
  384. return PLUGIN_HANDLED
  385. }
  386. }
  387. }
  388. return PLUGIN_HANDLED
  389. }
  390. public buy_weapon(id, idwpn)
  391. {
  392. //client_print(id, print_chat, "Mua %i", idwpn)
  393.  
  394. new buyzone = cs_get_user_buyzone(id)
  395. new mod_runing = nst_get_mod_runing()
  396. if (mod_runing == 1 || mod_runing == 2 || mod_runing == 3) buyzone = 1
  397.  
  398. if (buyzone == 0) client_print(id, print_chat, "[NST Wpn] Ban khong the mua Vu khi o vi tri nay")
  399. else
  400. {
  401. new plrClip, plrAmmo
  402. get_user_weapon(id, plrClip , plrAmmo)
  403.  
  404. new user_money = cs_get_user_money(id)
  405. new wp_cost = get_pcvar_num(cvar_cost[idwpn])
  406.  
  407. if (zp_get_user_zombie(id))
  408. {
  409. client_print(id, print_chat, "[NST Wpn] Ban dang la Zombie nen khong the mua %s", g_wpn_name[idwpn])
  410. }
  411. else if(!is_user_alive(id))
  412. {
  413. client_print(id, print_chat, "[NST Wpn] Ban chi co the mua duoc %s khi con song", g_wpn_name[idwpn]);
  414. }
  415. else if(user_money < wp_cost)
  416. {
  417. client_print(id, print_chat, "[NST Wpn] Ban khong du tien de mua");
  418. }
  419. else if(HAS_WEAPON[id] == idwpn)
  420. {
  421. client_print(id, print_chat, "[NST Wpn] Ban da co %s roi", g_wpn_name[idwpn])
  422. }
  423. else
  424. {
  425. if (HAS_WEAPON[id]) create_w_class(id, 1)
  426. current_select[id] = idwpn
  427. HAS_WEAPON[id] = idwpn
  428. give_weapon(id, 1)
  429. cs_set_user_money(id, user_money-wp_cost)
  430. checkModel(id)
  431. client_print(id, print_chat, "[NST Wpn] Ban da mua %s", g_wpn_name[idwpn])
  432. }
  433. }
  434.  
  435. }
  436. // End Buy Weapon
  437.  
  438.  
  439. // Set W Model
  440. public fw_SetModel(entity)
  441. {
  442. new id = pev(entity,pev_owner)
  443. new CURENT_WEAPON = HAS_WEAPON[id]
  444. new CHANGE_WEAPON = g_wpn_change[CURENT_WEAPON]
  445.  
  446. if ( crWeapon[id] == CHANGE_WEAPON && HAS_WEAPON[id])
  447. {
  448. engfunc(EngFunc_SetModel, entity, W_MODEL[CURENT_WEAPON])
  449. return FMRES_SUPERCEDE
  450. }
  451.  
  452. return FMRES_IGNORED
  453. }
  454. // End Set W Model
  455.  
  456.  
  457. // Check Weapon
  458. public checkModel(id)
  459. {
  460. if (zp_get_user_zombie(id)) return PLUGIN_HANDLED
  461.  
  462.  
  463. new CURENT_WEAPON = HAS_WEAPON[id]
  464. new CHANGE_WEAPON = g_wpn_change[CURENT_WEAPON]
  465.  
  466. new plrClip, plrAmmo, plrWeapId
  467. plrWeapId = get_user_weapon(id, plrClip , plrAmmo)
  468.  
  469. if ( plrWeapId == CHANGE_WEAPON && HAS_WEAPON[id])
  470. {
  471. set_pev(id, pev_viewmodel2, V_MODEL[CURENT_WEAPON])
  472. set_pev(id, pev_weaponmodel2, P_MODEL[CURENT_WEAPON])
  473. }
  474. return PLUGIN_HANDLED
  475. }
  476.  
  477. public checkWeapon(id)
  478. {
  479. new CURENT_WEAPON = HAS_WEAPON[id]
  480. new CHANGE_WEAPON = g_wpn_change[CURENT_WEAPON]
  481.  
  482. new plrClip, plrAmmo, plrWeapId
  483. plrWeapId = get_user_weapon(id, plrClip , plrAmmo)
  484.  
  485. if (plrWeapId == CHANGE_WEAPON && HAS_WEAPON[id])
  486. {
  487. checkModel(id)
  488. }
  489. crWeapon[id] = plrWeapId
  490.  
  491. return PLUGIN_HANDLED
  492. }
  493. // End Check Weapon
  494.  
  495.  
  496. //Give wpn
  497. public give_weapon(id, ammo)
  498. {
  499. if (zp_get_user_zombie(id)) return PLUGIN_HANDLED
  500.  
  501. new CURENT_WEAPON = HAS_WEAPON[id]
  502. new CHANGE_WEAPON = g_wpn_change[CURENT_WEAPON]
  503.  
  504. give_item(id,Name_WpnChange[CURENT_WEAPON])
  505. cs_set_user_bpammo(id, CHANGE_WEAPON, ammo)
  506.  
  507. return PLUGIN_HANDLED
  508. }
  509.  
  510.  
  511.  
  512. // Other Public
  513. public client_connect(id)
  514. {
  515. HAS_WEAPON[id] = 0
  516. }
  517. public client_disconnect(id)
  518. {
  519. HAS_WEAPON[id] = 0
  520. }
  521. public event_start_freezetime()
  522. {
  523. remove_class_wpn()
  524. }
  525. // End Other Public
  526.  
  527.  
  528.  
  529. // Drop Weapon
  530. public create_w_class(id, type)
  531. {
  532. new CURENT_WEAPON = HAS_WEAPON[id]
  533. //new CHANGE_WEAPON = g_wpn_change[CURENT_WEAPON]
  534.  
  535. new Float:Aim[3],Float:origin[3]
  536. VelocityByAim(id, 64, Aim)
  537. entity_get_vector(id,EV_VEC_origin,origin)
  538.  
  539. if (type == 1) {
  540. origin[0] += 2*Aim[0]
  541. origin[1] += 2*Aim[1]
  542. }
  543.  
  544. new nst_cre_class = create_entity("info_target")
  545. entity_set_string(nst_cre_class,EV_SZ_classname,name_class_weapon[CURENT_WEAPON])
  546. entity_set_model(nst_cre_class,W_MODEL[CURENT_WEAPON])
  547.  
  548. entity_set_size(nst_cre_class,Float:{-2.0,-2.0,-2.0},Float:{5.0,5.0,5.0})
  549. entity_set_int(nst_cre_class,EV_INT_solid,1)
  550.  
  551. entity_set_int(nst_cre_class,EV_INT_movetype,6)
  552. entity_set_int(nst_cre_class, EV_INT_iuser2, 1)
  553. entity_set_vector(nst_cre_class,EV_VEC_origin,origin)
  554. remowegun(id)
  555. }
  556. public remowegun(id)
  557. {
  558. new CURENT_WEAPON = HAS_WEAPON[id]
  559. new CHANGE_WEAPON = g_wpn_change[CURENT_WEAPON]
  560. new wpnList[32]
  561. new number
  562. get_user_weapons(id,wpnList,number)
  563. for (new i = 0;i < number ;i++) {
  564. if (wpnList[i] == CHANGE_WEAPON) {
  565. fm_strip_user_gun(id, wpnList[i])
  566. }
  567. }
  568. }
  569. // End Drop Weapon
  570.  
  571.  
  572. // Remove Class Wepaons in new round
  573. public remove_class_wpn()
  574. {
  575. new i = 1, check_value = 1
  576. while(check_value && i<MAX_WPN)
  577. {
  578. if (g_wpn_change[i] <= 0) check_value = 0
  579. new nextitem = find_ent_by_class(-1,name_class_weapon[i])
  580. while(nextitem)
  581. {
  582. remove_entity(nextitem)
  583. nextitem = find_ent_by_class(-1,name_class_weapon[i])
  584. }
  585. i++
  586. }
  587. return PLUGIN_CONTINUE
  588. }
  589. // End Remove Class Wepaons in new round
  590.  
  591.  
  592. // Weapon Pickup
  593. public pfn_touch(ptr, ptd) {
  594.  
  595. new i = 1, check_value = 1
  596. while(check_value && i<MAX_WPN)
  597. {
  598. if (g_wpn_change[i] <= 0) check_value = 0
  599. if(is_valid_ent(ptr)) {
  600. new classname[32]
  601. entity_get_string(ptr,EV_SZ_classname,classname,31)
  602. if(equal(classname, name_class_weapon[i])) {
  603. if(is_valid_ent(ptd)) {
  604. new id = ptd
  605. if(id > 0 && id < 34) {
  606. if (!check_has_wpn(id) && is_user_alive(id) && !(zp_get_user_zombie(id))) {
  607. HAS_WEAPON[id] = i
  608. give_weapon(id, 1)
  609. remove_entity(ptr)
  610. }
  611. }
  612. }
  613. }
  614. }
  615. i++
  616. }
  617. }
  618.  
  619. check_has_wpn(id)
  620. {
  621. new weapons[32], num, has_wpn = 0
  622. get_user_weapons(id, weapons, num)
  623. new type_wpn_cr = TYPE_WPN
  624.  
  625. for (new i = 0; i < num; i++)
  626. {
  627. new type_wpn = nst_get_weapon_type(weapons[i])
  628. if (type_wpn == type_wpn_cr) has_wpn = 1
  629.  
  630. }
  631.  
  632. return has_wpn
  633. }
  634. // End Weapon Pickup
  635. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  636. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1034\\ f0\\ fs16 \n\\ par }
  637. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement