Advertisement
Guest User

menu vip punisher

a guest
Mar 25th, 2017
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.68 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <cstrike>
  4. #include <fun>
  5. #include <dhudmessage>
  6. #include <hamsandwich>
  7. #include <fakemeta>
  8. #include <fakemeta_util>
  9.  
  10. #define MAX_JOGADORES 32
  11. #define TAG "!g[Comunidade GEG.]"
  12.  
  13. //Mapas
  14. new bool: g_Mapa
  15.  
  16. //Registos Menu, Granadas
  17. new bool:g_C4[MAX_JOGADORES];
  18. new g_Ronda;
  19. new g_Tempo[33];
  20.  
  21. #define TASK_MENU 2000
  22.  
  23. #define CVAR "fake_slots"
  24.  
  25. //AlterarSlots
  26. new kvar1;
  27.  
  28. // GameName
  29. new amx_gamename;
  30.  
  31. // dano
  32. new g_type, g_enabled, g_recieved, bool:g_showrecieved, g_hudmsg1, g_hudmsg2
  33.  
  34. //Cvars
  35. new cv_HP, cv_HP_HS, cv_Ronda, cv_Menu, cv_Itens, cv_Tempo;
  36.  
  37. //Pub
  38. new Ronda;
  39.  
  40. //vips,admins,...
  41. new maxplayers
  42. static const COLOR[] = "^x04" //green
  43. static const CONTACT[] = ""
  44. new gmsgSayText
  45.  
  46. public plugin_init()
  47. {
  48. //Registos Plugin
  49. register_plugin("Menu_VIP", "1.0", "7he_Punisher")
  50.  
  51. //Menu, Granadas
  52. RegisterHam ( Ham_Spawn, "player", "_nascer", 1 );
  53. register_event ( "DeathMsg", "_morte", "a" );
  54. register_event ( "HLTV", "_ronda", "a", "1=0", "2=0" );
  55. register_event ( "TextMsg", "_reiniciar", "a", "2&#Game_w" );
  56. register_event ( "TextMsg", "_reiniciar", "a", "2&#Game_C" );
  57.  
  58. //Cvars
  59. cv_Menu = register_cvar( "mostrar_menu", "1" );
  60. cv_Itens = register_cvar( "itens", "1" );
  61. cv_HP = register_cvar( "vip_hp", "5" );
  62. cv_HP_HS = register_cvar( "vip_hp_hs", "10");
  63. cv_Ronda = register_cvar( "rondas_menu", "3" );
  64. cv_Tempo = register_cvar( "tempo_menu", "10");
  65.  
  66. //Mapa
  67. Verificar_Mapas( );
  68.  
  69. //Alterar Slots
  70. register_cvar(CVAR, "32");
  71.  
  72. //GameName
  73. amx_gamename = register_cvar( "GameName", "Comunidade GEG." );
  74. register_forward( FM_GetGameDescription, "GameDesc" );
  75.  
  76. //Dano Event
  77. register_event("Damage", "on_damage", "b", "2!0", "3=0", "4!0")
  78.  
  79. //Dano
  80. g_type = register_cvar("amx_bulletdamage","1")
  81. g_recieved = register_cvar("amx_bulletdamage_recieved","1")
  82.  
  83. g_hudmsg1 = CreateHudSyncObj()
  84. g_hudmsg2 = CreateHudSyncObj()
  85.  
  86. //Vips,admins,...
  87. maxplayers = get_maxplayers()
  88. gmsgSayText = get_user_msgid("SayText")
  89. register_clcmd("say", "handle_say")
  90. register_cvar("amx_contactinfo", CONTACT, FCVAR_SERVER)
  91.  
  92. }
  93.  
  94. public plugin_cfg()
  95. {
  96. set_task(1.0, "postCfg")
  97. }
  98.  
  99. public postCfg()
  100. {
  101. kvar1 = get_cvar_num(CVAR);
  102.  
  103. if(kvar1 > 255)
  104. set_cvar_num(CVAR, 255)
  105.  
  106. server_print("^n^n======== Fake Slots: %d =========^n^n", kvar1);
  107.  
  108. server_cmd("sv_visiblemaxplayers %d", kvar1)
  109.  
  110. set_task(2.0, "cmdUpdateCvar", 512, "", 0, "b")
  111. }
  112.  
  113. public cmdUpdateCvar()
  114. {
  115. kvar1 = get_cvar_num(CVAR);
  116.  
  117. if(kvar1 > 255)
  118. set_cvar_num(CVAR, 255)
  119.  
  120. server_cmd("sv_visiblemaxplayers %d", kvar1)
  121. }
  122.  
  123. public GameDesc( ) {
  124. static gamename[32];
  125. get_pcvar_string( amx_gamename, gamename, 31 );
  126. forward_return( FMV_STRING, gamename );
  127. return FMRES_SUPERCEDE;
  128. }
  129.  
  130. public client_disconnect(id)
  131. {
  132. if(task_exists(id))
  133. remove_task(id)
  134. }
  135.  
  136. public on_damage(id)
  137. {
  138. if(g_enabled)
  139. {
  140. static attacker; attacker = get_user_attacker(id)
  141. static damage; damage = read_data(2)
  142. if(g_showrecieved && is_user_connected(attacker))
  143. {
  144. set_hudmessage(255, 0, 0, 0.45, 0.50, 2, 0.1, 4.0, 0.1, 0.1, -1)
  145. ShowSyncHudMsg(id, g_hudmsg2, "-%i^n", damage)
  146. }
  147. if(is_user_connected(attacker))
  148. {
  149. switch(g_enabled)
  150. {
  151. case 1: {
  152. set_hudmessage(0, 100, 200, -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1)
  153. ShowSyncHudMsg(attacker, g_hudmsg1, "-%i^n", damage)
  154. }
  155. case 2: {
  156. if(fm_is_ent_visible(attacker,id))
  157. {
  158. set_hudmessage(0, 100, 200, -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1)
  159. ShowSyncHudMsg(attacker, g_hudmsg1, "-%i^n", damage)
  160. }
  161. }
  162. }
  163. }
  164. }
  165. }
  166. public _morte()
  167. {
  168. new szAssassino = read_data(1);
  169. new szVitima = read_data(2);
  170.  
  171. if(is_user_alive(szAssassino) && szAssassino != szVitima && (get_user_flags(szAssassino) & ADMIN_LEVEL_D || get_user_flags(szAssassino) & ADMIN_RESERVATION))
  172. {
  173. new addHP
  174.  
  175. if ( (read_data(3) == 1) && (read_data(5) == 0) )
  176. {
  177. addHP = get_pcvar_num(cv_HP_HS);
  178. }
  179. else
  180. {
  181. addHP = get_pcvar_num(cv_HP);
  182. }
  183.  
  184. new szHP = get_user_health(szAssassino);
  185. szHP += addHP;
  186.  
  187. if ( szHP > 100 ) szHP = 100;
  188.  
  189. set_user_health( szAssassino, szHP );
  190.  
  191. set_dhudmessage( 0, 255, 0, -1.0, 0.35, 0, 0.1, 0.1, 0.1 );
  192. show_dhudmessage( szAssassino, "[ Vida +%i hp ]", addHP );
  193. }
  194. }
  195.  
  196. public _ronda(id)
  197. {
  198. g_Ronda++;
  199. Ronda++;
  200.  
  201. if(Ronda >= 1)
  202. {
  203. Ronda = 0
  204. }
  205. // dano
  206. g_enabled = get_pcvar_num(g_type)
  207. if(get_pcvar_num(g_recieved)) g_showrecieved = true
  208. }
  209.  
  210. public _nascer(id)
  211. {
  212. new szRonda = get_pcvar_num(cv_Ronda)
  213.  
  214. if(is_user_alive(id) && (get_pcvar_num(cv_Itens) >= 1) && !g_Mapa && (get_user_flags(id) & ADMIN_RESERVATION || get_user_flags(id) & ADMIN_LEVEL_D || get_user_flags(id) & ADMIN_LEVEL_E))
  215.  
  216. {
  217. give_item(id, "weapon_hegrenade")
  218. give_item(id, "weapon_flashbang")
  219. give_item(id, "weapon_flashbang")
  220. give_item(id, "weapon_smokegrenade")
  221. give_item(id, "item_assaultsuit")
  222. give_item(id, "item_thighpack")
  223.  
  224. if(g_Ronda >= szRonda && get_pcvar_num(cv_Menu) == 1) _menu(id);
  225.  
  226. }
  227. }
  228.  
  229. public _reiniciar()
  230. {
  231. g_Ronda=0;
  232. }
  233.  
  234. public _menu(id)
  235. {
  236. if( !task_exists(id) )
  237. {
  238. g_Tempo[id] = get_pcvar_num(cv_Tempo)
  239. set_task( 1.0, "_funcao", id, _, _, "b" )
  240. }
  241.  
  242. new Texto[ 102 ]
  243.  
  244. formatex( Texto, charsmax( Texto ), "\r[Comunidade GEG.]^n\yEscolhe o Teu Armamento^n\wTempo de escolha: %i", g_Tempo[id] );
  245. new menu = menu_create( Texto, "menu_armas_handler" );
  246.  
  247. menu_additem( menu, "\wQuero \r| \wM4A1 e Deagle \r|", "1", 0 );
  248. menu_additem( menu, "\wQuero \r| \wAK47 e Deagle \r|", "2", 0 );
  249. menu_additem( menu, "\wQuero \r| \wAWP e Deagle \r| \d(\ySTAFF\d)^n^n", "3", 0 );
  250.  
  251. menu_additem( menu, "Prefiro comprar", "0", 0 );
  252. menu_setprop( menu,MPROP_EXIT,MEXIT_NEVER );
  253.  
  254. menu_display( id, menu, 0 );
  255. }
  256.  
  257. public menu_armas_handler(id, menu, item)
  258. {
  259. new data[6], iName[64];
  260. new access, callback;
  261. menu_item_getinfo( menu, item, access, data, 6, iName, 63, callback )
  262.  
  263. new key = str_to_num( data );
  264.  
  265. switch( key )
  266. {
  267. case 1:
  268. {
  269. if( task_exists( id ) )
  270. remove_task( id );
  271.  
  272. if (is_user_alive(id) && user_has_weapon(id, CSW_C4) && cs_get_user_team(id) == CS_TEAM_T)
  273. g_C4[id] = true;
  274. else
  275. g_C4[id] = false;
  276.  
  277. strip_user_weapons (id);
  278. give_item(id,"weapon_m4a1");
  279. cs_set_user_bpammo( id, CSW_M4A1, 90 );
  280. give_item(id,"weapon_deagle");
  281. cs_set_user_bpammo( id, CSW_DEAGLE, 35 );
  282. give_item(id,"weapon_knife");
  283. give_item(id,"weapon_hegrenade");
  284. give_item(id,"weapon_flashbang");
  285. give_item(id,"weapon_flashbang");
  286. give_item(id,"weapon_smokegrenade");
  287. give_item(id,"item_assaultsuit");
  288. give_item(id,"item_thighpack");
  289.  
  290. if (g_C4[id])
  291. {
  292. give_item(id, "weapon_c4");
  293. cs_set_user_plant( id );
  294. }
  295.  
  296. Color(id, "%s !yTu Ganhastes !g[ M4A1 + Deagle ]", TAG);
  297. }
  298. case 2:
  299. {
  300. if( task_exists( id ) )
  301. remove_task( id );
  302.  
  303. if (is_user_alive(id) && user_has_weapon(id, CSW_C4) && cs_get_user_team(id) == CS_TEAM_T)
  304. g_C4[id] = true;
  305. else
  306. g_C4[id] = false;
  307.  
  308. strip_user_weapons (id)
  309. give_item(id,"weapon_ak47")
  310. cs_set_user_bpammo( id, CSW_AK47, 90 );
  311. give_item(id,"weapon_deagle");
  312. cs_set_user_bpammo( id, CSW_DEAGLE, 35 );
  313. give_item(id,"weapon_knife");
  314. give_item(id,"weapon_hegrenade");
  315. give_item(id,"weapon_flashbang");
  316. give_item(id,"weapon_flashbang");
  317. give_item(id,"weapon_smokegrenade");
  318. give_item(id,"item_assaultsuit");
  319. give_item(id,"item_thighpack");
  320.  
  321. if (g_C4[id])
  322. {
  323. give_item(id, "weapon_c4");
  324. cs_set_user_plant( id );
  325. }
  326.  
  327. Color(id, "%s !yTu Ganhastes !g[ AK47 + Deagle ]", TAG);
  328. }
  329. case 3:
  330. {
  331. if(get_user_flags(id) != ADMIN_LEVEL_D)
  332. {
  333. Color(id, "%s !yPrecisas de ser !gSTAFF !ypara esta opcao!", TAG)
  334. _menu(id);
  335. }
  336. if(get_user_flags(id) & ADMIN_LEVEL_D)
  337. {
  338. remove_task( id );
  339. show_menu(id, 0, "^n", 1);
  340.  
  341. if (is_user_alive(id) && user_has_weapon(id, CSW_C4) && cs_get_user_team(id) == CS_TEAM_T)
  342. {
  343. g_C4[id] = true;
  344. }
  345. else
  346. {
  347. g_C4[id] = false;
  348. }
  349.  
  350. strip_user_weapons (id)
  351. give_item(id,"weapon_awp")
  352. cs_set_user_bpammo( id, CSW_AWP, 90 );
  353. give_item(id,"weapon_deagle");
  354. cs_set_user_bpammo( id, CSW_DEAGLE, 35 );
  355. give_item(id,"weapon_knife");
  356. give_item(id,"weapon_hegrenade");
  357. give_item(id,"weapon_flashbang");
  358. give_item(id,"weapon_flashbang");
  359. give_item(id,"weapon_smokegrenade");
  360. give_item(id,"item_assaultsuit");
  361. give_item(id,"item_thighpack");
  362.  
  363. if (g_C4[id])
  364. {
  365. give_item(id, "weapon_c4");
  366. cs_set_user_plant( id );
  367. }
  368.  
  369. Color(id, "%s !yTu Ganhastes !g[ AWP + Deagle ]", TAG);
  370. }
  371. }
  372. case 4:
  373. {
  374. remove_task(id);
  375. show_menu(id, 0, "^n", 1);
  376. }
  377. }
  378. }
  379. public _funcao(id)
  380. {
  381. g_Tempo[id]--
  382. _menu(id)
  383.  
  384. if( g_Tempo[id] <= 0 )
  385. {
  386. remove_task(id);
  387. show_menu(id, 0, "^n", 1);
  388. g_Tempo[id] = 0;
  389. }
  390. }
  391.  
  392. public _motdvip(id)
  393. {
  394. if(is_user_connected(id)) show_motd(id, "ARMAMENTO NORMAL= NADES,AK47+DEAGLE OU NADES,M4A1+DEAGLE")
  395. if(is_user_connected(id)) show_motd(id, "ARMAMENTO STAFF= NADE,AK47+DEAGLE OU NADES,M4A1+DEAGLE OU NADES,AWP+DEAGLE")
  396. }
  397.  
  398. Verificar_Mapas( )
  399. {
  400. new szFicheiro[ 128 ];
  401. get_localinfo( "amxx_configsdir", szFicheiro, charsmax( szFicheiro ) );
  402. add( szFicheiro, charsmax( szFicheiro ), "/Mapas_VIP.ini" );
  403.  
  404. new iFicheiro = fopen( szFicheiro, "rt" );
  405.  
  406. if( !iFicheiro ) return;
  407.  
  408. new szMapa[ 32 ], szModelo[ 5 ], szAtualMapa[ 32 ];
  409.  
  410. get_mapname( szAtualMapa, charsmax( szAtualMapa ) );
  411.  
  412. while( !feof( iFicheiro ) )
  413. {
  414. fgets( iFicheiro, szFicheiro, charsmax( szFicheiro ) );
  415. trim( szFicheiro );
  416.  
  417.  
  418. parse( szFicheiro, szMapa, charsmax( szMapa ), szModelo, charsmax( szModelo ) );
  419.  
  420. if( equali( szMapa, szAtualMapa ) )
  421. {
  422. g_Mapa = true
  423. }
  424. }
  425.  
  426. fclose( iFicheiro );
  427. }
  428.  
  429. public handle_say(id) {
  430. new said[192]
  431. read_args(said,192)
  432. if( ( containi(said, "who") != -1 && containi(said, "admin") != -1 ) || contain(said, "/vips") != -1 )
  433. set_task(0.1,"print_viplist",id)
  434. if( ( containi(said, "who") != -1 && containi(said, "admin") != -1 ) || contain(said, "/admins") != -1 )
  435. set_task(0.1,"print_adminlist",id)
  436. if( ( containi(said, "who") != -1 && containi(said, "admin") != -1 ) || contain(said, "/mods") != -1 )
  437. set_task(0.1,"print_modlist",id)
  438. if( ( containi(said, "who") != -1 && containi(said, "admin") != -1 ) || contain(said, "/membros") != -1 )
  439. set_task(0.1,"print_membrolist",id)
  440. return PLUGIN_CONTINUE
  441. }
  442. // VIPS
  443. public print_viplist(user)
  444. {
  445. new adminnames[33][32]
  446. new message[256]
  447. new contactinfo[256], contact[112]
  448. new id, count, x, len
  449.  
  450. for(id = 1 ; id <= maxplayers ; id++)
  451. if(is_user_connected(id))
  452. if(get_user_flags(id) & ADMIN_RESERVATION)
  453. get_user_name(id, adminnames[count++], 31)
  454.  
  455. len = format(message, 255, "%s VIPS ONLINE: ",COLOR)
  456. if(count > 0) {
  457. for(x = 0 ; x < count ; x++) {
  458. len += format(message[len], 255-len, "%s%s ", adminnames[x], x < (count-1) ? ", ":"")
  459. if(len > 96 ) {
  460. print_message(user, message)
  461. len = format(message, 255, "%s ",COLOR)
  462. }
  463. }
  464. print_message(user, message)
  465. }
  466. else {
  467. len += format(message[len], 255-len, "Sem Vips online.")
  468. print_message(user, message)
  469. }
  470.  
  471. get_cvar_string("amx_contactinfo", contact, 63)
  472. if(contact[0]) {
  473. format(contactinfo, 111, "%s Contacto Mail Admin: %s", COLOR, contact)
  474. print_message(user, contactinfo)
  475. }
  476. }
  477. // ADMINS
  478. public print_adminlist(user)
  479. {
  480. new adminnames[33][32]
  481. new message[256]
  482. new contactinfo[256], contact[112]
  483. new id, count, x, len
  484.  
  485. for(id = 1 ; id <= maxplayers ; id++)
  486. if(is_user_connected(id))
  487. if(get_user_flags(id) & ADMIN_LEVEL_A)
  488. get_user_name(id, adminnames[count++], 31)
  489.  
  490. len = format(message, 255, "%s ADMINS ONLINE: ",COLOR)
  491. if(count > 0) {
  492. for(x = 0 ; x < count ; x++) {
  493. len += format(message[len], 255-len, "%s%s ", adminnames[x], x < (count-1) ? ", ":"")
  494. if(len > 96 ) {
  495. print_message(user, message)
  496. len = format(message, 255, "%s ",COLOR)
  497. }
  498. }
  499. print_message(user, message)
  500. }
  501. else {
  502. len += format(message[len], 255-len, "Sem Admins online.")
  503. print_message(user, message)
  504. }
  505.  
  506. get_cvar_string("amx_contactinfo", contact, 63)
  507. if(contact[0]) {
  508. format(contactinfo, 111, "%s Contacto Mail Admin: %s", COLOR, contact)
  509. print_message(user, contactinfo)
  510. }
  511. }
  512. // MODS
  513. public print_modlist(user)
  514. {
  515. new adminnames[33][32]
  516. new message[256]
  517. new contactinfo[256], contact[112]
  518. new id, count, x, len
  519.  
  520. for(id = 1 ; id <= maxplayers ; id++)
  521. if(is_user_connected(id))
  522. if(get_user_flags(id) & ADMIN_LEVEL_C)
  523. get_user_name(id, adminnames[count++], 31)
  524.  
  525. len = format(message, 255, "%s MODS ONLINE: ",COLOR)
  526. if(count > 0) {
  527. for(x = 0 ; x < count ; x++) {
  528. len += format(message[len], 255-len, "%s%s ", adminnames[x], x < (count-1) ? ", ":"")
  529. if(len > 96 ) {
  530. print_message(user, message)
  531. len = format(message, 255, "%s ",COLOR)
  532. }
  533. }
  534. print_message(user, message)
  535. }
  536. else {
  537. len += format(message[len], 255-len, "Sem Mods online.")
  538. print_message(user, message)
  539. }
  540.  
  541. get_cvar_string("amx_contactinfo", contact, 63)
  542. if(contact[0]) {
  543. format(contactinfo, 111, "%s Contacto Mail Admin: %s", COLOR, contact)
  544. print_message(user, contactinfo)
  545. }
  546. }
  547. // SVIPS
  548. public print_sviplist(user)
  549. {
  550. new adminnames[33][32]
  551. new message[256]
  552. new contactinfo[256], contact[112]
  553. new id, count, x, len
  554.  
  555. for(id = 1 ; id <= maxplayers ; id++)
  556. if(is_user_connected(id))
  557. if(get_user_flags(id) & ADMIN_LEVEL_D)
  558. get_user_name(id, adminnames[count++], 31)
  559.  
  560. len = format(message, 255, "%s SUPER VIPS ONLINE: ",COLOR)
  561. if(count > 0) {
  562. for(x = 0 ; x < count ; x++) {
  563. len += format(message[len], 255-len, "%s%s ", adminnames[x], x < (count-1) ? ", ":"")
  564. if(len > 96 ) {
  565. print_message(user, message)
  566. len = format(message, 255, "%s ",COLOR)
  567. }
  568. }
  569. print_message(user, message)
  570. }
  571. else {
  572. len += format(message[len], 255-len, "Sem Super Vips online.")
  573. print_message(user, message)
  574. }
  575.  
  576. get_cvar_string("amx_contactinfo", contact, 63)
  577. if(contact[0]) {
  578. format(contactinfo, 111, "%s Contacto Mail Admin: %s", COLOR, contact)
  579. print_message(user, contactinfo)
  580. }
  581. }
  582. // Membros
  583. public print_membrolist(user)
  584. {
  585. new adminnames[33][32]
  586. new message[256]
  587. new contactinfo[256], contact[112]
  588. new id, count, x, len
  589.  
  590. for(id = 1 ; id <= maxplayers ; id++)
  591. if(is_user_connected(id))
  592. if(get_user_flags(id) & ADMIN_LEVEL_E)
  593. get_user_name(id, adminnames[count++], 31)
  594.  
  595. len = format(message, 255, "%s MEMBROS ONLINE: ",COLOR)
  596. if(count > 0) {
  597. for(x = 0 ; x < count ; x++) {
  598. len += format(message[len], 255-len, "%s%s ", adminnames[x], x < (count-1) ? ", ":"")
  599. if(len > 96 ) {
  600. print_message(user, message)
  601. len = format(message, 255, "%s ",COLOR)
  602. }
  603. }
  604. print_message(user, message)
  605. }
  606. else {
  607. len += format(message[len], 255-len, "Sem Membros online.")
  608. print_message(user, message)
  609. }
  610.  
  611. get_cvar_string("amx_contactinfo", contact, 63)
  612. if(contact[0]) {
  613. format(contactinfo, 111, "%s Contacto Mail Admin: %s", COLOR, contact)
  614. print_message(user, contactinfo)
  615. }
  616. }
  617. //
  618. print_message(id, msg[]) {
  619. message_begin(MSG_ONE, gmsgSayText, {0,0,0}, id)
  620. write_byte(id)
  621. write_string(msg)
  622. message_end()
  623. }
  624. stock Color(const id, const input[], any:...)
  625. {
  626. new count = 1, players[32]
  627. static msg[191]
  628. vformat(msg, 190, input, 3)
  629. replace_all(msg, 190, "!g", "^4") //Verde
  630. replace_all(msg, 190, "!y", "^1") //Amarelo
  631. replace_all(msg, 190, "!team", "^3") //Cor das Equipas
  632. if (id) players[0] = id; else get_players(players, count, "ch")
  633. {
  634. for (new i = 0; i < count; i++)
  635. {
  636. if (is_user_connected(players[i]))
  637. {
  638. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
  639. write_byte(players[i]);
  640. write_string(msg);
  641. message_end();
  642. }
  643. }
  644. }
  645. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement