hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2024.04.19. 10:16



Jelenlévő felhasználók

Jelenleg 235 felhasználó van jelen :: 1 regisztrált, 0 rejtett és 234 vendég

A legtöbb felhasználó (1565 fő) 2020.11.21. 11:26-kor tartózkodott itt.

Regisztrált felhasználók: Bing [Bot] az elmúlt 5 percben aktív felhasználók alapján

Utoljára aktív
Ahhoz hogy lásd ki volt utoljára aktív, be kell jelentkezned.



Az oldal teljeskörű
használatához regisztrálj.

Regisztráció

Kereső


Új téma nyitása  Hozzászólás a témához  [ 6 hozzászólás ] 
Szerző Üzenet
 Hozzászólás témája: Grab
HozzászólásElküldve: 2013.10.04. 20:26 
Offline
Beavatott

Csatlakozott: 2013.08.02. 14:53
Hozzászólások: 91
Megköszönt másnak: 16 alkalommal
Megköszönték neki: 3 alkalommal
Valaki tudna adni egy olyan grab plugint, amit csak Olyan admin tud hasznalni, akinek van Ban joga!
Köszönöm.


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Grab
HozzászólásElküldve: 2013.10.04. 20:37 
Offline
Jómunkásember

Csatlakozott: 2013.02.11. 16:06
Hozzászólások: 491
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 50 alkalommal
SMA Forráskód: [ Mindet kijelol ]
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4.  
  5. new const VERSION[ ] = "1.2.3"
  6. new const TRKCVAR[ ] = "grab_plus_version"
  7. #define ADMIN_BAN
  8.  
  9. #define TSK_CHKE 50
  10.  
  11. #define SF_FADEOUT 0
  12.  
  13. new client_data[33][4]
  14. #define GRABBED 0
  15. #define GRABBER 1
  16. #define GRAB_LEN 2
  17. #define FLAGS 3
  18.  
  19. #define CDF_IN_PUSH (1<<0)
  20. #define CDF_IN_PULL (1<<1)
  21. #define CDF_NO_CHOKE (1<<2)
  22.  
  23. //Cvar Pointers
  24. new p_enabled, p_players_only
  25. new p_throw_force, p_min_dist, p_speed, p_grab_force
  26. new p_choke_time, p_choke_dmg, p_auto_choke
  27. new p_glow_r, p_glow_b, p_glow_g, p_glow_a
  28. new p_fade, p_glow
  29.  
  30. //Pseudo Constants
  31. new MAXPLAYERS
  32. new SVC_SCREENFADE, SVC_SCREENSHAKE, WTF_DAMAGE
  33.  
  34. public plugin_init( )
  35. {
  36. register_plugin( "Grab+", VERSION, "Ian Cammarata" )
  37. register_cvar( TRKCVAR, VERSION, FCVAR_SERVER )
  38. set_cvar_string( TRKCVAR, VERSION )
  39.  
  40. p_enabled = register_cvar( "gp_enabled", "1" )
  41. p_players_only = register_cvar( "gp_players_only", "0" )
  42.  
  43. p_min_dist = register_cvar ( "gp_min_dist", "90" )
  44. p_throw_force = register_cvar( "gp_throw_force", "1500" )
  45. p_grab_force = register_cvar( "gp_grab_force", "8" )
  46. p_speed = register_cvar( "gp_speed", "5" )
  47.  
  48. p_choke_time = register_cvar( "gp_choke_time", "1.5" )
  49. p_choke_dmg = register_cvar( "gp_choke_dmg", "5" )
  50. p_auto_choke = register_cvar( "gp_auto_choke", "1" )
  51.  
  52. p_glow_r = register_cvar( "gp_glow_r", "50" )
  53. p_glow_g = register_cvar( "gp_glow_g", "0" )
  54. p_glow_b = register_cvar( "gp_glow_b", "0" )
  55. p_glow_a = register_cvar( "gp_glow_a", "200" )
  56.  
  57. p_fade = register_cvar( "gp_screen_fade", "1" )
  58. p_glow = register_cvar( "gp_glow", "1" )
  59.  
  60. register_clcmd( "amx_grab", "force_grab", ADMIN, "Grab client & teleport to you." )
  61. register_clcmd( "grab_toggle", "grab_toggle", ADMIN, "press once to grab and again to release" )
  62. register_clcmd( "+grab", "grab", ADMIN, "bind a key to +grab" )
  63. register_clcmd( "-grab", "unset_grabbed" )
  64.  
  65. register_clcmd( "+push", "push", ADMIN, "bind a key to +push" )
  66. register_clcmd( "-push", "push" )
  67. register_clcmd( "+pull", "pull", ADMIN, "bind a key to +pull" )
  68. register_clcmd( "-pull", "pull" )
  69. register_clcmd( "push", "push2" )
  70. register_clcmd( "pull", "pull2" )
  71.  
  72. register_clcmd( "drop" ,"throw" )
  73.  
  74. register_event( "DeathMsg", "DeathMsg", "a" )
  75.  
  76. register_forward( FM_PlayerPreThink, "fm_player_prethink" )
  77.  
  78. register_dictionary( "grab_plus.txt" )
  79.  
  80. MAXPLAYERS = get_maxplayers()
  81.  
  82. SVC_SCREENFADE = get_user_msgid( "ScreenFade" )
  83. SVC_SCREENSHAKE = get_user_msgid( "ScreenShake" )
  84. WTF_DAMAGE = get_user_msgid( "Damage" )
  85. }
  86.  
  87. public plugin_precache( )
  88. {
  89. precache_sound( "player/PL_PAIN2.WAV" )
  90. }
  91.  
  92. public fm_player_prethink( id )
  93. {
  94. new target
  95. //Search for a target
  96. if ( client_data[id][GRABBED] == -1 )
  97. {
  98. new Float:orig[3], Float:ret[3]
  99. get_view_pos( id, orig )
  100. ret = vel_by_aim( id, 9999 )
  101.  
  102. ret[0] += orig[0]
  103. ret[1] += orig[1]
  104. ret[2] += orig[2]
  105.  
  106. target = traceline( orig, ret, id, ret )
  107.  
  108. if( 0 < target <= MAXPLAYERS )
  109. {
  110. if( is_grabbed( target, id ) ) return FMRES_IGNORED
  111. set_grabbed( id, target )
  112. }
  113. else if( !get_pcvar_num( p_players_only ) )
  114. {
  115. new movetype
  116. if( target && pev_valid( target ) )
  117. {
  118. movetype = pev( target, pev_movetype )
  119. if( !( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) )
  120. return FMRES_IGNORED
  121. }
  122. else
  123. {
  124. target = 0
  125. new ent = engfunc( EngFunc_FindEntityInSphere, -1, ret, 12.0 )
  126. while( !target && ent > 0 )
  127. {
  128. movetype = pev( ent, pev_movetype )
  129. if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS )
  130. && ent != id )
  131. target = ent
  132. ent = engfunc( EngFunc_FindEntityInSphere, ent, ret, 12.0 )
  133. }
  134. }
  135. if( target )
  136. {
  137. if( is_grabbed( target, id ) ) return FMRES_IGNORED
  138. set_grabbed( id, target )
  139. }
  140. }
  141. }
  142.  
  143. target = client_data[id][GRABBED]
  144. //If they've grabbed something
  145. if( target > 0 )
  146. {
  147. if( !pev_valid( target ) || ( pev( target, pev_health ) < 1 && pev( target, pev_max_health ) ) )
  148. {
  149. unset_grabbed( id )
  150. return FMRES_IGNORED
  151. }
  152.  
  153. //Use key choke
  154. if( pev( id, pev_button ) & IN_USE )
  155. do_choke( id )
  156.  
  157. //Push and pull
  158. new cdf = client_data[id][FLAGS]
  159. if ( cdf & CDF_IN_PULL )
  160. do_pull( id )
  161. else if ( cdf & CDF_IN_PUSH )
  162. do_push( id )
  163.  
  164. if( target > MAXPLAYERS ) grab_think( id )
  165. }
  166.  
  167. //If they're grabbed
  168. target = client_data[id][GRABBER]
  169. if( target > 0 ) grab_think( target )
  170.  
  171. return FMRES_IGNORED
  172. }
  173.  
  174. public grab_think( id ) //id of the grabber
  175. {
  176. new target = client_data[id][GRABBED]
  177.  
  178. //Keep grabbed clients from sticking to ladders
  179. if( pev( target, pev_movetype ) == MOVETYPE_FLY && !(pev( target, pev_button ) & IN_JUMP ) ) client_cmd( target, "+jump;wait;-jump" )
  180.  
  181. //Move targeted client
  182. new Float:tmpvec[3], Float:tmpvec2[3], Float:torig[3], Float:tvel[3]
  183.  
  184. get_view_pos( id, tmpvec )
  185.  
  186. tmpvec2 = vel_by_aim( id, client_data[id][GRAB_LEN] )
  187.  
  188. torig = get_target_origin_f( target )
  189.  
  190. new force = get_pcvar_num( p_grab_force )
  191.  
  192. tvel[0] = ( ( tmpvec[0] + tmpvec2[0] ) - torig[0] ) * force
  193. tvel[1] = ( ( tmpvec[1] + tmpvec2[1] ) - torig[1] ) * force
  194. tvel[2] = ( ( tmpvec[2] + tmpvec2[2] ) - torig[2] ) * force
  195.  
  196. set_pev( target, pev_velocity, tvel )
  197. }
  198.  
  199. stock Float:get_target_origin_f( id )
  200. {
  201. new Float:orig[3]
  202. pev( id, pev_origin, orig )
  203.  
  204. //If grabbed is not a player, move origin to center
  205. if( id > MAXPLAYERS )
  206. {
  207. new Float:mins[3], Float:maxs[3]
  208. pev( id, pev_mins, mins )
  209. pev( id, pev_maxs, maxs )
  210.  
  211. if( !mins[2] ) orig[2] += maxs[2] / 2
  212. }
  213.  
  214. return orig
  215. }
  216.  
  217. public grab_toggle( id, level, cid )
  218. {
  219. if( !client_data[id][GRABBED] ) grab( id, level, cid )
  220. else unset_grabbed( id )
  221.  
  222. return PLUGIN_HANDLED
  223. }
  224.  
  225. public grab( id, level, cid )
  226. {
  227. if( !cmd_access( id, level, cid, 1 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
  228.  
  229. if ( !client_data[id][GRABBED] ) client_data[id][GRABBED] = -1
  230. screenfade_in( id )
  231.  
  232. return PLUGIN_HANDLED
  233. }
  234.  
  235. public screenfade_in( id )
  236. {
  237. if( get_pcvar_num( p_fade ) )
  238. {
  239. message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
  240. write_short( 10000 ) //duration
  241. write_short( 0 ) //hold
  242. write_short( SF_FADE_IN + SF_FADE_ONLYONE ) //flags
  243. write_byte( get_pcvar_num( p_glow_r ) ) //r
  244. write_byte( get_pcvar_num( p_glow_g ) ) //g
  245. write_byte( get_pcvar_num( p_glow_b ) ) //b
  246. write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
  247. message_end( )
  248. }
  249. }
  250.  
  251. public throw( id )
  252. {
  253. new target = client_data[id][GRABBED]
  254. if( target > 0 )
  255. {
  256. set_pev( target, pev_velocity, vel_by_aim( id, get_pcvar_num(p_throw_force) ) )
  257. unset_grabbed( id )
  258. return PLUGIN_HANDLED
  259. }
  260.  
  261. return PLUGIN_CONTINUE
  262. }
  263.  
  264. public unset_grabbed( id )
  265. {
  266. new target = client_data[id][GRABBED]
  267. if( target > 0 && pev_valid( target ) )
  268. {
  269. set_pev( target, pev_renderfx, kRenderFxNone )
  270. set_pev( target, pev_rendercolor, {255.0, 255.0, 255.0} )
  271. set_pev( target, pev_rendermode, kRenderNormal )
  272. set_pev( target, pev_renderamt, 16.0 )
  273.  
  274. if( 0 < target <= MAXPLAYERS )
  275. client_data[target][GRABBER] = 0
  276. }
  277. client_data[id][GRABBED] = 0
  278.  
  279. if( get_pcvar_num( p_fade ) )
  280. {
  281. message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
  282. write_short( 10000 ) //duration
  283. write_short( 0 ) //hold
  284. write_short( SF_FADEOUT ) //flags
  285. write_byte( get_pcvar_num( p_glow_r ) ) //r
  286. write_byte( get_pcvar_num( p_glow_g ) ) //g
  287. write_byte( get_pcvar_num( p_glow_b ) ) //b
  288. write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
  289. message_end( )
  290. }
  291. }
  292.  
  293. //Grabs onto someone
  294. public set_grabbed( id, target )
  295. {
  296. if( get_pcvar_num( p_glow ) )
  297. {
  298. new Float:color[3]
  299. color[0] = get_pcvar_float( p_glow_r )
  300. color[1] = get_pcvar_float( p_glow_g )
  301. color[2] = get_pcvar_float( p_glow_b )
  302. set_pev( target, pev_renderfx, kRenderFxGlowShell )
  303. set_pev( target, pev_rendercolor, color )
  304. set_pev( target, pev_rendermode, kRenderTransColor )
  305. set_pev( target, pev_renderamt, get_pcvar_float( p_glow_a ) )
  306. }
  307.  
  308. if( 0 < target <= MAXPLAYERS )
  309. client_data[target][GRABBER] = id
  310. client_data[id][FLAGS] = 0
  311. client_data[id][GRABBED] = target
  312. new Float:torig[3], Float:orig[3]
  313. pev( target, pev_origin, torig )
  314. pev( id, pev_origin, orig )
  315. client_data[id][GRAB_LEN] = floatround( get_distance_f( torig, orig ) )
  316. if( client_data[id][GRAB_LEN] < get_pcvar_num( p_min_dist ) ) client_data[id][GRAB_LEN] = get_pcvar_num( p_min_dist )
  317. }
  318.  
  319. public push( id )
  320. {
  321. client_data[id][FLAGS] ^= CDF_IN_PUSH
  322. return PLUGIN_HANDLED
  323. }
  324.  
  325. public pull( id )
  326. {
  327. client_data[id][FLAGS] ^= CDF_IN_PULL
  328. return PLUGIN_HANDLED
  329. }
  330.  
  331. public push2( id )
  332. {
  333. if( client_data[id][GRABBED] > 0 )
  334. {
  335. do_push( id )
  336. return PLUGIN_HANDLED
  337. }
  338. return PLUGIN_CONTINUE
  339. }
  340.  
  341. public pull2( id )
  342. {
  343. if( client_data[id][GRABBED] > 0 )
  344. {
  345. do_pull( id )
  346. return PLUGIN_HANDLED
  347. }
  348. return PLUGIN_CONTINUE
  349. }
  350.  
  351. public do_push( id )
  352. if( client_data[id][GRAB_LEN] < 9999 )
  353. client_data[id][GRAB_LEN] += get_pcvar_num( p_speed )
  354.  
  355. public do_pull( id )
  356. {
  357. new mindist = get_pcvar_num( p_min_dist )
  358. new len = client_data[id][GRAB_LEN]
  359.  
  360. if( len > mindist )
  361. {
  362. len -= get_pcvar_num( p_speed )
  363. if( len < mindist ) len = mindist
  364. client_data[id][GRAB_LEN] = len
  365. }
  366. else if( get_pcvar_num( p_auto_choke ) )
  367. do_choke( id )
  368. }
  369.  
  370. public do_choke( id )
  371. {
  372. new target = client_data[id][GRABBED]
  373. if( client_data[id][FLAGS] & CDF_NO_CHOKE || id == target || target > MAXPLAYERS) return
  374.  
  375. new dmg = get_pcvar_num( p_choke_dmg )
  376. new vec[3]
  377. FVecIVec( get_target_origin_f( target ), vec )
  378.  
  379. message_begin( MSG_ONE, SVC_SCREENSHAKE, _, target )
  380. write_short( 999999 ) //amount
  381. write_short( 9999 ) //duration
  382. write_short( 999 ) //frequency
  383. message_end( )
  384.  
  385. message_begin( MSG_ONE, SVC_SCREENFADE, _, target )
  386. write_short( 9999 ) //duration
  387. write_short( 100 ) //hold
  388. write_short( SF_FADE_MODULATE ) //flags
  389. write_byte( get_pcvar_num( p_glow_r ) ) //r
  390. write_byte( get_pcvar_num( p_glow_g ) ) //g
  391. write_byte( get_pcvar_num( p_glow_b ) ) //b
  392. write_byte( 200 ) //a
  393. message_end( )
  394.  
  395. message_begin( MSG_ONE, WTF_DAMAGE, _, target )
  396. write_byte( 0 ) //damage armor
  397. write_byte( dmg ) //damage health
  398. write_long( DMG_CRUSH ) //damage type
  399. write_coord( vec[0] ) //origin[x]
  400. write_coord( vec[1] ) //origin[y]
  401. write_coord( vec[2] ) //origin[z]
  402. message_end( )
  403.  
  404. message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
  405. write_byte( TE_BLOODSTREAM )
  406. write_coord( vec[0] ) //pos.x
  407. write_coord( vec[1] ) //pos.y
  408. write_coord( vec[2] + 15 ) //pos.z
  409. write_coord( random_num( 0, 255 ) ) //vec.x
  410. write_coord( random_num( 0, 255 ) ) //vec.y
  411. write_coord( random_num( 0, 255 ) ) //vec.z
  412. write_byte( 70 ) //col index
  413. write_byte( random_num( 50, 250 ) ) //speed
  414. message_end( )
  415.  
  416. new health = pev( target, pev_health ) - dmg
  417. set_pev( target, pev_health, float( health ) )
  418. if( health < 1 ) dllfunc( DLLFunc_ClientKill, target )
  419.  
  420. emit_sound( target, CHAN_BODY, "player/PL_PAIN2.WAV", VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  421.  
  422. client_data[id][FLAGS] ^= CDF_NO_CHOKE
  423. set_task( get_pcvar_float( p_choke_time ), "clear_no_choke", TSK_CHKE + id )
  424. }
  425.  
  426. public clear_no_choke( tskid )
  427. {
  428. new id = tskid - TSK_CHKE
  429. client_data[id][FLAGS] ^= CDF_NO_CHOKE
  430. }
  431.  
  432. //Grabs the client and teleports them to the admin
  433. public force_grab(id, level, cid)
  434. {
  435. if( !cmd_access( id, level, cid, 1 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
  436.  
  437. new arg[33]
  438. read_argv( 1, arg, 32 )
  439.  
  440. new targetid = cmd_target( id, arg, 1 )
  441.  
  442. if( is_grabbed( targetid, id ) ) return PLUGIN_HANDLED
  443. if( !is_user_alive( targetid ) )
  444. {
  445. client_print( id, print_console, "[AMXX] %L", id, "COULDNT" )
  446. return PLUGIN_HANDLED
  447. }
  448.  
  449. //Safe to tp target to aim spot?
  450. new Float:tmpvec[3], Float:orig[3], Float:torig[3], Float:trace_ret[3]
  451. new bool:safe = false, i
  452.  
  453. get_view_pos( id, orig )
  454. tmpvec = vel_by_aim( id, get_pcvar_num( p_min_dist ) )
  455.  
  456. for( new j = 1; j < 11 && !safe; j++ )
  457. {
  458. torig[0] = orig[0] + tmpvec[i] * j
  459. torig[1] = orig[1] + tmpvec[i] * j
  460. torig[2] = orig[2] + tmpvec[i] * j
  461.  
  462. traceline( tmpvec, torig, id, trace_ret )
  463.  
  464. if( get_distance_f( trace_ret, torig ) ) break
  465.  
  466. engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
  467. if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen ) )
  468. safe = true
  469. }
  470.  
  471. //Still not safe? Then find another safe spot somewhere around the grabber
  472. pev( id, pev_origin, orig )
  473. new try[3]
  474. orig[2] += 2
  475. while( try[2] < 3 && !safe )
  476. {
  477. for( i = 0; i < 3; i++ )
  478. switch( try[i] )
  479. {
  480. case 0 : torig[i] = orig[i] + ( i == 2 ? 80 : 40 )
  481. case 1 : torig[i] = orig[i]
  482. case 2 : torig[i] = orig[i] - ( i == 2 ? 80 : 40 )
  483. }
  484.  
  485. traceline( tmpvec, torig, id, trace_ret )
  486.  
  487. engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
  488. if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen )
  489. && !get_distance_f( trace_ret, torig ) ) safe = true
  490.  
  491. try[0]++
  492. if( try[0] == 3 )
  493. {
  494. try[0] = 0
  495. try[1]++
  496. if( try[1] == 3 )
  497. {
  498. try[1] = 0
  499. try[2]++
  500. }
  501. }
  502. }
  503.  
  504. if( safe )
  505. {
  506. set_pev( targetid, pev_origin, torig )
  507. set_grabbed( id, targetid )
  508. screenfade_in( id )
  509. }
  510. else client_print( id, print_chat, "[AMXX] %L", id, "COULDNT" )
  511.  
  512. return PLUGIN_HANDLED
  513. }
  514.  
  515. public is_grabbed( target, grabber )
  516. {
  517. for( new i = 1; i <= MAXPLAYERS; i++ )
  518. if( client_data[i][GRABBED] == target )
  519. {
  520. client_print( grabber, print_chat, "[AMXX] %L", grabber, "ALREADY" )
  521. unset_grabbed( grabber )
  522. return true
  523. }
  524. return false
  525. }
  526.  
  527. public DeathMsg( )
  528. kill_grab( read_data( 2 ) )
  529.  
  530. public client_disconnect( id )
  531. {
  532. kill_grab( id )
  533. return PLUGIN_CONTINUE
  534. }
  535.  
  536. public kill_grab( id )
  537. {
  538. //If given client has grabbed, or has a grabber, unset it
  539. if( client_data[id][GRABBED] )
  540. unset_grabbed( id )
  541. else if( client_data[id][GRABBER] )
  542. unset_grabbed( client_data[id][GRABBER] )
  543. }
  544.  
  545. stock traceline( const Float:vStart[3], const Float:vEnd[3], const pIgnore, Float:vHitPos[3] )
  546. {
  547. engfunc( EngFunc_TraceLine, vStart, vEnd, 0, pIgnore, 0 )
  548. get_tr2( 0, TR_vecEndPos, vHitPos )
  549. return get_tr2( 0, TR_pHit )
  550. }
  551.  
  552. stock get_view_pos( const id, Float:vViewPos[3] )
  553. {
  554. new Float:vOfs[3]
  555. pev( id, pev_origin, vViewPos )
  556. pev( id, pev_view_ofs, vOfs )
  557.  
  558. vViewPos[0] += vOfs[0]
  559. vViewPos[1] += vOfs[1]
  560. vViewPos[2] += vOfs[2]
  561. }
  562.  
  563. stock Float:vel_by_aim( id, speed = 1 )
  564. {
  565. new Float:v1[3], Float:vBlah[3]
  566. pev( id, pev_v_angle, v1 )
  567. engfunc( EngFunc_AngleVectors, v1, v1, vBlah, vBlah )
  568.  
  569. v1[0] *= speed
  570. v1[1] *= speed
  571. v1[2] *= speed
  572.  
  573. return v1
  574. }


Ez jó lesz sztem:) Köszi gomb:

_________________
Rengeteg új beszólás eléréséhez kattints IDE (Ezek alapból sank soundshoz készültek)

Steam profil:
[steam]http://steamcommunity.com/profiles/76561198089487307[/steam]

Ők köszönték meg laki5000 nek ezt a hozzászólást: misu88 (2013.10.04. 20:43)
  Népszerűség: 2.27%


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Grab
HozzászólásElküldve: 2013.10.04. 20:40 
Offline
Jómunkásember
Avatar

Csatlakozott: 2012.09.23. 20:29
Hozzászólások: 325
Megköszönt másnak: 26 alkalommal
Megköszönték neki: 87 alkalommal
SMA Forráskód: [ Mindet kijelol ]
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4.  
  5. new const VERSION[ ] = "1.2.3"
  6. new const TRKCVAR[ ] = "grab_plus_version"
  7. #define ADMIN ADMIN_BAN
  8.  
  9. #define TSK_CHKE 50
  10.  
  11. #define SF_FADEOUT 0
  12.  
  13. new client_data[33][4]
  14. #define GRABBED 0
  15. #define GRABBER 1
  16. #define GRAB_LEN 2
  17. #define FLAGS 3
  18.  
  19. #define CDF_IN_PUSH (1<<0)
  20. #define CDF_IN_PULL (1<<1)
  21. #define CDF_NO_CHOKE (1<<2)
  22.  
  23. //Cvar Pointers
  24. new p_enabled, p_players_only
  25. new p_throw_force, p_min_dist, p_speed, p_grab_force
  26. new p_choke_time, p_choke_dmg, p_auto_choke
  27. new p_glow_r, p_glow_b, p_glow_g, p_glow_a
  28. new p_fade, p_glow
  29.  
  30. //Pseudo Constants
  31. new MAXPLAYERS
  32. new SVC_SCREENFADE, SVC_SCREENSHAKE, WTF_DAMAGE
  33.  
  34. public plugin_init( )
  35. {
  36. register_plugin( "Grab+", VERSION, "Ian Cammarata" )
  37. register_cvar( TRKCVAR, VERSION, FCVAR_SERVER )
  38. set_cvar_string( TRKCVAR, VERSION )
  39.  
  40. p_enabled = register_cvar( "gp_enabled", "1" )
  41. p_players_only = register_cvar( "gp_players_only", "0" )
  42.  
  43. p_min_dist = register_cvar ( "gp_min_dist", "90" )
  44. p_throw_force = register_cvar( "gp_throw_force", "1500" )
  45. p_grab_force = register_cvar( "gp_grab_force", "8" )
  46. p_speed = register_cvar( "gp_speed", "5" )
  47.  
  48. p_choke_time = register_cvar( "gp_choke_time", "1.5" )
  49. p_choke_dmg = register_cvar( "gp_choke_dmg", "5" )
  50. p_auto_choke = register_cvar( "gp_auto_choke", "1" )
  51.  
  52. p_glow_r = register_cvar( "gp_glow_r", "50" )
  53. p_glow_g = register_cvar( "gp_glow_g", "0" )
  54. p_glow_b = register_cvar( "gp_glow_b", "0" )
  55. p_glow_a = register_cvar( "gp_glow_a", "200" )
  56.  
  57. p_fade = register_cvar( "gp_screen_fade", "1" )
  58. p_glow = register_cvar( "gp_glow", "1" )
  59.  
  60. register_clcmd( "amx_grab", "force_grab", ADMIN, "Grab client & teleport to you." )
  61. register_clcmd( "grab_toggle", "grab_toggle", ADMIN, "press once to grab and again to release" )
  62. register_clcmd( "+grab", "grab", ADMIN, "bind a key to +grab" )
  63. register_clcmd( "-grab", "unset_grabbed" )
  64.  
  65. register_clcmd( "+push", "push", ADMIN, "bind a key to +push" )
  66. register_clcmd( "-push", "push" )
  67. register_clcmd( "+pull", "pull", ADMIN, "bind a key to +pull" )
  68. register_clcmd( "-pull", "pull" )
  69. register_clcmd( "push", "push2" )
  70. register_clcmd( "pull", "pull2" )
  71.  
  72. register_clcmd( "drop" ,"throw" )
  73.  
  74. register_event( "DeathMsg", "DeathMsg", "a" )
  75.  
  76. register_forward( FM_PlayerPreThink, "fm_player_prethink" )
  77.  
  78. register_dictionary( "grab_plus.txt" )
  79.  
  80. MAXPLAYERS = get_maxplayers()
  81.  
  82. SVC_SCREENFADE = get_user_msgid( "ScreenFade" )
  83. SVC_SCREENSHAKE = get_user_msgid( "ScreenShake" )
  84. WTF_DAMAGE = get_user_msgid( "Damage" )
  85. }
  86.  
  87. public plugin_precache( )
  88. {
  89. precache_sound( "player/PL_PAIN2.WAV" )
  90. }
  91.  
  92. public fm_player_prethink( id )
  93. {
  94. new target
  95. //Search for a target
  96. if ( client_data[id][GRABBED] == -1 )
  97. {
  98. new Float:orig[3], Float:ret[3]
  99. get_view_pos( id, orig )
  100. ret = vel_by_aim( id, 9999 )
  101.  
  102. ret[0] += orig[0]
  103. ret[1] += orig[1]
  104. ret[2] += orig[2]
  105.  
  106. target = traceline( orig, ret, id, ret )
  107.  
  108. if( 0 < target <= MAXPLAYERS )
  109. {
  110. if( is_grabbed( target, id ) ) return FMRES_IGNORED
  111. set_grabbed( id, target )
  112. }
  113. else if( !get_pcvar_num( p_players_only ) )
  114. {
  115. new movetype
  116. if( target && pev_valid( target ) )
  117. {
  118. movetype = pev( target, pev_movetype )
  119. if( !( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) )
  120. return FMRES_IGNORED
  121. }
  122. else
  123. {
  124. target = 0
  125. new ent = engfunc( EngFunc_FindEntityInSphere, -1, ret, 12.0 )
  126. while( !target && ent > 0 )
  127. {
  128. movetype = pev( ent, pev_movetype )
  129. if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS )
  130. && ent != id )
  131. target = ent
  132. ent = engfunc( EngFunc_FindEntityInSphere, ent, ret, 12.0 )
  133. }
  134. }
  135. if( target )
  136. {
  137. if( is_grabbed( target, id ) ) return FMRES_IGNORED
  138. set_grabbed( id, target )
  139. }
  140. }
  141. }
  142.  
  143. target = client_data[id][GRABBED]
  144. //If they've grabbed something
  145. if( target > 0 )
  146. {
  147. if( !pev_valid( target ) || ( pev( target, pev_health ) < 1 && pev( target, pev_max_health ) ) )
  148. {
  149. unset_grabbed( id )
  150. return FMRES_IGNORED
  151. }
  152.  
  153. //Use key choke
  154. if( pev( id, pev_button ) & IN_USE )
  155. do_choke( id )
  156.  
  157. //Push and pull
  158. new cdf = client_data[id][FLAGS]
  159. if ( cdf & CDF_IN_PULL )
  160. do_pull( id )
  161. else if ( cdf & CDF_IN_PUSH )
  162. do_push( id )
  163.  
  164. if( target > MAXPLAYERS ) grab_think( id )
  165. }
  166.  
  167. //If they're grabbed
  168. target = client_data[id][GRABBER]
  169. if( target > 0 ) grab_think( target )
  170.  
  171. return FMRES_IGNORED
  172. }
  173.  
  174. public grab_think( id ) //id of the grabber
  175. {
  176. new target = client_data[id][GRABBED]
  177.  
  178. //Keep grabbed clients from sticking to ladders
  179. if( pev( target, pev_movetype ) == MOVETYPE_FLY && !(pev( target, pev_button ) & IN_JUMP ) ) client_cmd( target, "+jump;wait;-jump" )
  180.  
  181. //Move targeted client
  182. new Float:tmpvec[3], Float:tmpvec2[3], Float:torig[3], Float:tvel[3]
  183.  
  184. get_view_pos( id, tmpvec )
  185.  
  186. tmpvec2 = vel_by_aim( id, client_data[id][GRAB_LEN] )
  187.  
  188. torig = get_target_origin_f( target )
  189.  
  190. new force = get_pcvar_num( p_grab_force )
  191.  
  192. tvel[0] = ( ( tmpvec[0] + tmpvec2[0] ) - torig[0] ) * force
  193. tvel[1] = ( ( tmpvec[1] + tmpvec2[1] ) - torig[1] ) * force
  194. tvel[2] = ( ( tmpvec[2] + tmpvec2[2] ) - torig[2] ) * force
  195.  
  196. set_pev( target, pev_velocity, tvel )
  197. }
  198.  
  199. stock Float:get_target_origin_f( id )
  200. {
  201. new Float:orig[3]
  202. pev( id, pev_origin, orig )
  203.  
  204. //If grabbed is not a player, move origin to center
  205. if( id > MAXPLAYERS )
  206. {
  207. new Float:mins[3], Float:maxs[3]
  208. pev( id, pev_mins, mins )
  209. pev( id, pev_maxs, maxs )
  210.  
  211. if( !mins[2] ) orig[2] += maxs[2] / 2
  212. }
  213.  
  214. return orig
  215. }
  216.  
  217. public grab_toggle( id, level, cid )
  218. {
  219. if( !client_data[id][GRABBED] ) grab( id, level, cid )
  220. else unset_grabbed( id )
  221.  
  222. return PLUGIN_HANDLED
  223. }
  224.  
  225. public grab( id, level, cid )
  226. {
  227. if( !cmd_access( id, level, cid, 1 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
  228.  
  229. if ( !client_data[id][GRABBED] ) client_data[id][GRABBED] = -1
  230. screenfade_in( id )
  231.  
  232. return PLUGIN_HANDLED
  233. }
  234.  
  235. public screenfade_in( id )
  236. {
  237. if( get_pcvar_num( p_fade ) )
  238. {
  239. message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
  240. write_short( 10000 ) //duration
  241. write_short( 0 ) //hold
  242. write_short( SF_FADE_IN + SF_FADE_ONLYONE ) //flags
  243. write_byte( get_pcvar_num( p_glow_r ) ) //r
  244. write_byte( get_pcvar_num( p_glow_g ) ) //g
  245. write_byte( get_pcvar_num( p_glow_b ) ) //b
  246. write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
  247. message_end( )
  248. }
  249. }
  250.  
  251. public throw( id )
  252. {
  253. new target = client_data[id][GRABBED]
  254. if( target > 0 )
  255. {
  256. set_pev( target, pev_velocity, vel_by_aim( id, get_pcvar_num(p_throw_force) ) )
  257. unset_grabbed( id )
  258. return PLUGIN_HANDLED
  259. }
  260.  
  261. return PLUGIN_CONTINUE
  262. }
  263.  
  264. public unset_grabbed( id )
  265. {
  266. new target = client_data[id][GRABBED]
  267. if( target > 0 && pev_valid( target ) )
  268. {
  269. set_pev( target, pev_renderfx, kRenderFxNone )
  270. set_pev( target, pev_rendercolor, {255.0, 255.0, 255.0} )
  271. set_pev( target, pev_rendermode, kRenderNormal )
  272. set_pev( target, pev_renderamt, 16.0 )
  273.  
  274. if( 0 < target <= MAXPLAYERS )
  275. client_data[target][GRABBER] = 0
  276. }
  277. client_data[id][GRABBED] = 0
  278.  
  279. if( get_pcvar_num( p_fade ) )
  280. {
  281. message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
  282. write_short( 10000 ) //duration
  283. write_short( 0 ) //hold
  284. write_short( SF_FADEOUT ) //flags
  285. write_byte( get_pcvar_num( p_glow_r ) ) //r
  286. write_byte( get_pcvar_num( p_glow_g ) ) //g
  287. write_byte( get_pcvar_num( p_glow_b ) ) //b
  288. write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
  289. message_end( )
  290. }
  291. }
  292.  
  293. //Grabs onto someone
  294. public set_grabbed( id, target )
  295. {
  296. if( get_pcvar_num( p_glow ) )
  297. {
  298. new Float:color[3]
  299. color[0] = get_pcvar_float( p_glow_r )
  300. color[1] = get_pcvar_float( p_glow_g )
  301. color[2] = get_pcvar_float( p_glow_b )
  302. set_pev( target, pev_renderfx, kRenderFxGlowShell )
  303. set_pev( target, pev_rendercolor, color )
  304. set_pev( target, pev_rendermode, kRenderTransColor )
  305. set_pev( target, pev_renderamt, get_pcvar_float( p_glow_a ) )
  306. }
  307.  
  308. if( 0 < target <= MAXPLAYERS )
  309. client_data[target][GRABBER] = id
  310. client_data[id][FLAGS] = 0
  311. client_data[id][GRABBED] = target
  312. new Float:torig[3], Float:orig[3]
  313. pev( target, pev_origin, torig )
  314. pev( id, pev_origin, orig )
  315. client_data[id][GRAB_LEN] = floatround( get_distance_f( torig, orig ) )
  316. if( client_data[id][GRAB_LEN] < get_pcvar_num( p_min_dist ) ) client_data[id][GRAB_LEN] = get_pcvar_num( p_min_dist )
  317. }
  318.  
  319. public push( id )
  320. {
  321. client_data[id][FLAGS] ^= CDF_IN_PUSH
  322. return PLUGIN_HANDLED
  323. }
  324.  
  325. public pull( id )
  326. {
  327. client_data[id][FLAGS] ^= CDF_IN_PULL
  328. return PLUGIN_HANDLED
  329. }
  330.  
  331. public push2( id )
  332. {
  333. if( client_data[id][GRABBED] > 0 )
  334. {
  335. do_push( id )
  336. return PLUGIN_HANDLED
  337. }
  338. return PLUGIN_CONTINUE
  339. }
  340.  
  341. public pull2( id )
  342. {
  343. if( client_data[id][GRABBED] > 0 )
  344. {
  345. do_pull( id )
  346. return PLUGIN_HANDLED
  347. }
  348. return PLUGIN_CONTINUE
  349. }
  350.  
  351. public do_push( id )
  352. if( client_data[id][GRAB_LEN] < 9999 )
  353. client_data[id][GRAB_LEN] += get_pcvar_num( p_speed )
  354.  
  355. public do_pull( id )
  356. {
  357. new mindist = get_pcvar_num( p_min_dist )
  358. new len = client_data[id][GRAB_LEN]
  359.  
  360. if( len > mindist )
  361. {
  362. len -= get_pcvar_num( p_speed )
  363. if( len < mindist ) len = mindist
  364. client_data[id][GRAB_LEN] = len
  365. }
  366. else if( get_pcvar_num( p_auto_choke ) )
  367. do_choke( id )
  368. }
  369.  
  370. public do_choke( id )
  371. {
  372. new target = client_data[id][GRABBED]
  373. if( client_data[id][FLAGS] & CDF_NO_CHOKE || id == target || target > MAXPLAYERS) return
  374.  
  375. new dmg = get_pcvar_num( p_choke_dmg )
  376. new vec[3]
  377. FVecIVec( get_target_origin_f( target ), vec )
  378.  
  379. message_begin( MSG_ONE, SVC_SCREENSHAKE, _, target )
  380. write_short( 999999 ) //amount
  381. write_short( 9999 ) //duration
  382. write_short( 999 ) //frequency
  383. message_end( )
  384.  
  385. message_begin( MSG_ONE, SVC_SCREENFADE, _, target )
  386. write_short( 9999 ) //duration
  387. write_short( 100 ) //hold
  388. write_short( SF_FADE_MODULATE ) //flags
  389. write_byte( get_pcvar_num( p_glow_r ) ) //r
  390. write_byte( get_pcvar_num( p_glow_g ) ) //g
  391. write_byte( get_pcvar_num( p_glow_b ) ) //b
  392. write_byte( 200 ) //a
  393. message_end( )
  394.  
  395. message_begin( MSG_ONE, WTF_DAMAGE, _, target )
  396. write_byte( 0 ) //damage armor
  397. write_byte( dmg ) //damage health
  398. write_long( DMG_CRUSH ) //damage type
  399. write_coord( vec[0] ) //origin[x]
  400. write_coord( vec[1] ) //origin[y]
  401. write_coord( vec[2] ) //origin[z]
  402. message_end( )
  403.  
  404. message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
  405. write_byte( TE_BLOODSTREAM )
  406. write_coord( vec[0] ) //pos.x
  407. write_coord( vec[1] ) //pos.y
  408. write_coord( vec[2] + 15 ) //pos.z
  409. write_coord( random_num( 0, 255 ) ) //vec.x
  410. write_coord( random_num( 0, 255 ) ) //vec.y
  411. write_coord( random_num( 0, 255 ) ) //vec.z
  412. write_byte( 70 ) //col index
  413. write_byte( random_num( 50, 250 ) ) //speed
  414. message_end( )
  415.  
  416. new health = pev( target, pev_health ) - dmg
  417. set_pev( target, pev_health, float( health ) )
  418. if( health < 1 ) dllfunc( DLLFunc_ClientKill, target )
  419.  
  420. emit_sound( target, CHAN_BODY, "player/PL_PAIN2.WAV", VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  421.  
  422. client_data[id][FLAGS] ^= CDF_NO_CHOKE
  423. set_task( get_pcvar_float( p_choke_time ), "clear_no_choke", TSK_CHKE + id )
  424. }
  425.  
  426. public clear_no_choke( tskid )
  427. {
  428. new id = tskid - TSK_CHKE
  429. client_data[id][FLAGS] ^= CDF_NO_CHOKE
  430. }
  431.  
  432. //Grabs the client and teleports them to the admin
  433. public force_grab(id, level, cid)
  434. {
  435. if( !cmd_access( id, level, cid, 1 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
  436.  
  437. new arg[33]
  438. read_argv( 1, arg, 32 )
  439.  
  440. new targetid = cmd_target( id, arg, 1 )
  441.  
  442. if( is_grabbed( targetid, id ) ) return PLUGIN_HANDLED
  443. if( !is_user_alive( targetid ) )
  444. {
  445. client_print( id, print_console, "[AMXX] %L", id, "COULDNT" )
  446. return PLUGIN_HANDLED
  447. }
  448.  
  449. //Safe to tp target to aim spot?
  450. new Float:tmpvec[3], Float:orig[3], Float:torig[3], Float:trace_ret[3]
  451. new bool:safe = false, i
  452.  
  453. get_view_pos( id, orig )
  454. tmpvec = vel_by_aim( id, get_pcvar_num( p_min_dist ) )
  455.  
  456. for( new j = 1; j < 11 && !safe; j++ )
  457. {
  458. torig[0] = orig[0] + tmpvec[i] * j
  459. torig[1] = orig[1] + tmpvec[i] * j
  460. torig[2] = orig[2] + tmpvec[i] * j
  461.  
  462. traceline( tmpvec, torig, id, trace_ret )
  463.  
  464. if( get_distance_f( trace_ret, torig ) ) break
  465.  
  466. engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
  467. if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen ) )
  468. safe = true
  469. }
  470.  
  471. //Still not safe? Then find another safe spot somewhere around the grabber
  472. pev( id, pev_origin, orig )
  473. new try[3]
  474. orig[2] += 2
  475. while( try[2] < 3 && !safe )
  476. {
  477. for( i = 0; i < 3; i++ )
  478. switch( try[i] )
  479. {
  480. case 0 : torig[i] = orig[i] + ( i == 2 ? 80 : 40 )
  481. case 1 : torig[i] = orig[i]
  482. case 2 : torig[i] = orig[i] - ( i == 2 ? 80 : 40 )
  483. }
  484.  
  485. traceline( tmpvec, torig, id, trace_ret )
  486.  
  487. engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
  488. if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen )
  489. && !get_distance_f( trace_ret, torig ) ) safe = true
  490.  
  491. try[0]++
  492. if( try[0] == 3 )
  493. {
  494. try[0] = 0
  495. try[1]++
  496. if( try[1] == 3 )
  497. {
  498. try[1] = 0
  499. try[2]++
  500. }
  501. }
  502. }
  503.  
  504. if( safe )
  505. {
  506. set_pev( targetid, pev_origin, torig )
  507. set_grabbed( id, targetid )
  508. screenfade_in( id )
  509. }
  510. else client_print( id, print_chat, "[AMXX] %L", id, "COULDNT" )
  511.  
  512. return PLUGIN_HANDLED
  513. }
  514.  
  515. public is_grabbed( target, grabber )
  516. {
  517. for( new i = 1; i <= MAXPLAYERS; i++ )
  518. if( client_data[i][GRABBED] == target )
  519. {
  520. client_print( grabber, print_chat, "[AMXX] %L", grabber, "ALREADY" )
  521. unset_grabbed( grabber )
  522. return true
  523. }
  524. return false
  525. }
  526.  
  527. public DeathMsg( )
  528. kill_grab( read_data( 2 ) )
  529.  
  530. public client_disconnect( id )
  531. {
  532. kill_grab( id )
  533. return PLUGIN_CONTINUE
  534. }
  535.  
  536. public kill_grab( id )
  537. {
  538. //If given client has grabbed, or has a grabber, unset it
  539. if( client_data[id][GRABBED] )
  540. unset_grabbed( id )
  541. else if( client_data[id][GRABBER] )
  542. unset_grabbed( client_data[id][GRABBER] )
  543. }
  544.  
  545. stock traceline( const Float:vStart[3], const Float:vEnd[3], const pIgnore, Float:vHitPos[3] )
  546. {
  547. engfunc( EngFunc_TraceLine, vStart, vEnd, 0, pIgnore, 0 )
  548. get_tr2( 0, TR_vecEndPos, vHitPos )
  549. return get_tr2( 0, TR_pHit )
  550. }
  551.  
  552. stock get_view_pos( const id, Float:vViewPos[3] )
  553. {
  554. new Float:vOfs[3]
  555. pev( id, pev_origin, vViewPos )
  556. pev( id, pev_view_ofs, vOfs )
  557.  
  558. vViewPos[0] += vOfs[0]
  559. vViewPos[1] += vOfs[1]
  560. vViewPos[2] += vOfs[2]
  561. }
  562.  
  563. stock Float:vel_by_aim( id, speed = 1 )
  564. {
  565. new Float:v1[3], Float:vBlah[3]
  566. pev( id, pev_v_angle, v1 )
  567. engfunc( EngFunc_AngleVectors, v1, v1, vBlah, vBlah )
  568.  
  569. v1[0] *= speed
  570. v1[1] *= speed
  571. v1[2] *= speed
  572.  
  573. return v1
  574. }

Ők köszönték meg Vinnice nek ezt a hozzászólást: misu88 (2013.10.04. 20:43)
  Népszerűség: 2.27%


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Grab
HozzászólásElküldve: 2013.10.05. 07:13 
Offline
Beavatott

Csatlakozott: 2013.08.02. 14:53
Hozzászólások: 91
Megköszönt másnak: 16 alkalommal
Megköszönték neki: 3 alkalommal
Hello, beraktam, de valamiért még mindig tudnak akiknek nincs Ban joguk.
Akkor legyen az hogy csak azok tudjanak akiknek: ADMIN_LEVEL_B-van!
Köszönöm.


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Grab
HozzászólásElküldve: 2013.10.05. 10:53 
Offline
Jómunkásember

Csatlakozott: 2013.02.11. 16:06
Hozzászólások: 491
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 50 alkalommal
SMA Forráskód: [ Mindet kijelol ]
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4.  
  5. new const VERSION[ ] = "1.2.3"
  6. new const TRKCVAR[ ] = "grab_plus_version"
  7. #define ADMIN_LEVEL_B
  8.  
  9. #define TSK_CHKE 50
  10.  
  11. #define SF_FADEOUT 0
  12.  
  13. new client_data[33][4]
  14. #define GRABBED 0
  15. #define GRABBER 1
  16. #define GRAB_LEN 2
  17. #define FLAGS 3
  18.  
  19. #define CDF_IN_PUSH (1<<0)
  20. #define CDF_IN_PULL (1<<1)
  21. #define CDF_NO_CHOKE (1<<2)
  22.  
  23. //Cvar Pointers
  24. new p_enabled, p_players_only
  25. new p_throw_force, p_min_dist, p_speed, p_grab_force
  26. new p_choke_time, p_choke_dmg, p_auto_choke
  27. new p_glow_r, p_glow_b, p_glow_g, p_glow_a
  28. new p_fade, p_glow
  29.  
  30. //Pseudo Constants
  31. new MAXPLAYERS
  32. new SVC_SCREENFADE, SVC_SCREENSHAKE, WTF_DAMAGE
  33.  
  34. public plugin_init( )
  35. {
  36. register_plugin( "Grab+", VERSION, "Ian Cammarata" )
  37. register_cvar( TRKCVAR, VERSION, FCVAR_SERVER )
  38. set_cvar_string( TRKCVAR, VERSION )
  39.  
  40. p_enabled = register_cvar( "gp_enabled", "1" )
  41. p_players_only = register_cvar( "gp_players_only", "0" )
  42.  
  43. p_min_dist = register_cvar ( "gp_min_dist", "90" )
  44. p_throw_force = register_cvar( "gp_throw_force", "1500" )
  45. p_grab_force = register_cvar( "gp_grab_force", "8" )
  46. p_speed = register_cvar( "gp_speed", "5" )
  47.  
  48. p_choke_time = register_cvar( "gp_choke_time", "1.5" )
  49. p_choke_dmg = register_cvar( "gp_choke_dmg", "5" )
  50. p_auto_choke = register_cvar( "gp_auto_choke", "1" )
  51.  
  52. p_glow_r = register_cvar( "gp_glow_r", "50" )
  53. p_glow_g = register_cvar( "gp_glow_g", "0" )
  54. p_glow_b = register_cvar( "gp_glow_b", "0" )
  55. p_glow_a = register_cvar( "gp_glow_a", "200" )
  56.  
  57. p_fade = register_cvar( "gp_screen_fade", "1" )
  58. p_glow = register_cvar( "gp_glow", "1" )
  59.  
  60. register_clcmd( "amx_grab", "force_grab", ADMIN, "Grab client & teleport to you." )
  61. register_clcmd( "grab_toggle", "grab_toggle", ADMIN, "press once to grab and again to release" )
  62. register_clcmd( "+grab", "grab", ADMIN, "bind a key to +grab" )
  63. register_clcmd( "-grab", "unset_grabbed" )
  64.  
  65. register_clcmd( "+push", "push", ADMIN, "bind a key to +push" )
  66. register_clcmd( "-push", "push" )
  67. register_clcmd( "+pull", "pull", ADMIN, "bind a key to +pull" )
  68. register_clcmd( "-pull", "pull" )
  69. register_clcmd( "push", "push2" )
  70. register_clcmd( "pull", "pull2" )
  71.  
  72. register_clcmd( "drop" ,"throw" )
  73.  
  74. register_event( "DeathMsg", "DeathMsg", "a" )
  75.  
  76. register_forward( FM_PlayerPreThink, "fm_player_prethink" )
  77.  
  78. register_dictionary( "grab_plus.txt" )
  79.  
  80. MAXPLAYERS = get_maxplayers()
  81.  
  82. SVC_SCREENFADE = get_user_msgid( "ScreenFade" )
  83. SVC_SCREENSHAKE = get_user_msgid( "ScreenShake" )
  84. WTF_DAMAGE = get_user_msgid( "Damage" )
  85. }
  86.  
  87. public plugin_precache( )
  88. {
  89. precache_sound( "player/PL_PAIN2.WAV" )
  90. }
  91.  
  92. public fm_player_prethink( id )
  93. {
  94. new target
  95. //Search for a target
  96. if ( client_data[id][GRABBED] == -1 )
  97. {
  98. new Float:orig[3], Float:ret[3]
  99. get_view_pos( id, orig )
  100. ret = vel_by_aim( id, 9999 )
  101.  
  102. ret[0] += orig[0]
  103. ret[1] += orig[1]
  104. ret[2] += orig[2]
  105.  
  106. target = traceline( orig, ret, id, ret )
  107.  
  108. if( 0 < target <= MAXPLAYERS )
  109. {
  110. if( is_grabbed( target, id ) ) return FMRES_IGNORED
  111. set_grabbed( id, target )
  112. }
  113. else if( !get_pcvar_num( p_players_only ) )
  114. {
  115. new movetype
  116. if( target && pev_valid( target ) )
  117. {
  118. movetype = pev( target, pev_movetype )
  119. if( !( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) )
  120. return FMRES_IGNORED
  121. }
  122. else
  123. {
  124. target = 0
  125. new ent = engfunc( EngFunc_FindEntityInSphere, -1, ret, 12.0 )
  126. while( !target && ent > 0 )
  127. {
  128. movetype = pev( ent, pev_movetype )
  129. if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS )
  130. && ent != id )
  131. target = ent
  132. ent = engfunc( EngFunc_FindEntityInSphere, ent, ret, 12.0 )
  133. }
  134. }
  135. if( target )
  136. {
  137. if( is_grabbed( target, id ) ) return FMRES_IGNORED
  138. set_grabbed( id, target )
  139. }
  140. }
  141. }
  142.  
  143. target = client_data[id][GRABBED]
  144. //If they've grabbed something
  145. if( target > 0 )
  146. {
  147. if( !pev_valid( target ) || ( pev( target, pev_health ) < 1 && pev( target, pev_max_health ) ) )
  148. {
  149. unset_grabbed( id )
  150. return FMRES_IGNORED
  151. }
  152.  
  153. //Use key choke
  154. if( pev( id, pev_button ) & IN_USE )
  155. do_choke( id )
  156.  
  157. //Push and pull
  158. new cdf = client_data[id][FLAGS]
  159. if ( cdf & CDF_IN_PULL )
  160. do_pull( id )
  161. else if ( cdf & CDF_IN_PUSH )
  162. do_push( id )
  163.  
  164. if( target > MAXPLAYERS ) grab_think( id )
  165. }
  166.  
  167. //If they're grabbed
  168. target = client_data[id][GRABBER]
  169. if( target > 0 ) grab_think( target )
  170.  
  171. return FMRES_IGNORED
  172. }
  173.  
  174. public grab_think( id ) //id of the grabber
  175. {
  176. new target = client_data[id][GRABBED]
  177.  
  178. //Keep grabbed clients from sticking to ladders
  179. if( pev( target, pev_movetype ) == MOVETYPE_FLY && !(pev( target, pev_button ) & IN_JUMP ) ) client_cmd( target, "+jump;wait;-jump" )
  180.  
  181. //Move targeted client
  182. new Float:tmpvec[3], Float:tmpvec2[3], Float:torig[3], Float:tvel[3]
  183.  
  184. get_view_pos( id, tmpvec )
  185.  
  186. tmpvec2 = vel_by_aim( id, client_data[id][GRAB_LEN] )
  187.  
  188. torig = get_target_origin_f( target )
  189.  
  190. new force = get_pcvar_num( p_grab_force )
  191.  
  192. tvel[0] = ( ( tmpvec[0] + tmpvec2[0] ) - torig[0] ) * force
  193. tvel[1] = ( ( tmpvec[1] + tmpvec2[1] ) - torig[1] ) * force
  194. tvel[2] = ( ( tmpvec[2] + tmpvec2[2] ) - torig[2] ) * force
  195.  
  196. set_pev( target, pev_velocity, tvel )
  197. }
  198.  
  199. stock Float:get_target_origin_f( id )
  200. {
  201. new Float:orig[3]
  202. pev( id, pev_origin, orig )
  203.  
  204. //If grabbed is not a player, move origin to center
  205. if( id > MAXPLAYERS )
  206. {
  207. new Float:mins[3], Float:maxs[3]
  208. pev( id, pev_mins, mins )
  209. pev( id, pev_maxs, maxs )
  210.  
  211. if( !mins[2] ) orig[2] += maxs[2] / 2
  212. }
  213.  
  214. return orig
  215. }
  216.  
  217. public grab_toggle( id, level, cid )
  218. {
  219. if( !client_data[id][GRABBED] ) grab( id, level, cid )
  220. else unset_grabbed( id )
  221.  
  222. return PLUGIN_HANDLED
  223. }
  224.  
  225. public grab( id, level, cid )
  226. {
  227. if( !cmd_access( id, level, cid, 1 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
  228.  
  229. if ( !client_data[id][GRABBED] ) client_data[id][GRABBED] = -1
  230. screenfade_in( id )
  231.  
  232. return PLUGIN_HANDLED
  233. }
  234.  
  235. public screenfade_in( id )
  236. {
  237. if( get_pcvar_num( p_fade ) )
  238. {
  239. message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
  240. write_short( 10000 ) //duration
  241. write_short( 0 ) //hold
  242. write_short( SF_FADE_IN + SF_FADE_ONLYONE ) //flags
  243. write_byte( get_pcvar_num( p_glow_r ) ) //r
  244. write_byte( get_pcvar_num( p_glow_g ) ) //g
  245. write_byte( get_pcvar_num( p_glow_b ) ) //b
  246. write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
  247. message_end( )
  248. }
  249. }
  250.  
  251. public throw( id )
  252. {
  253. new target = client_data[id][GRABBED]
  254. if( target > 0 )
  255. {
  256. set_pev( target, pev_velocity, vel_by_aim( id, get_pcvar_num(p_throw_force) ) )
  257. unset_grabbed( id )
  258. return PLUGIN_HANDLED
  259. }
  260.  
  261. return PLUGIN_CONTINUE
  262. }
  263.  
  264. public unset_grabbed( id )
  265. {
  266. new target = client_data[id][GRABBED]
  267. if( target > 0 && pev_valid( target ) )
  268. {
  269. set_pev( target, pev_renderfx, kRenderFxNone )
  270. set_pev( target, pev_rendercolor, {255.0, 255.0, 255.0} )
  271. set_pev( target, pev_rendermode, kRenderNormal )
  272. set_pev( target, pev_renderamt, 16.0 )
  273.  
  274. if( 0 < target <= MAXPLAYERS )
  275. client_data[target][GRABBER] = 0
  276. }
  277. client_data[id][GRABBED] = 0
  278.  
  279. if( get_pcvar_num( p_fade ) )
  280. {
  281. message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
  282. write_short( 10000 ) //duration
  283. write_short( 0 ) //hold
  284. write_short( SF_FADEOUT ) //flags
  285. write_byte( get_pcvar_num( p_glow_r ) ) //r
  286. write_byte( get_pcvar_num( p_glow_g ) ) //g
  287. write_byte( get_pcvar_num( p_glow_b ) ) //b
  288. write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
  289. message_end( )
  290. }
  291. }
  292.  
  293. //Grabs onto someone
  294. public set_grabbed( id, target )
  295. {
  296. if( get_pcvar_num( p_glow ) )
  297. {
  298. new Float:color[3]
  299. color[0] = get_pcvar_float( p_glow_r )
  300. color[1] = get_pcvar_float( p_glow_g )
  301. color[2] = get_pcvar_float( p_glow_b )
  302. set_pev( target, pev_renderfx, kRenderFxGlowShell )
  303. set_pev( target, pev_rendercolor, color )
  304. set_pev( target, pev_rendermode, kRenderTransColor )
  305. set_pev( target, pev_renderamt, get_pcvar_float( p_glow_a ) )
  306. }
  307.  
  308. if( 0 < target <= MAXPLAYERS )
  309. client_data[target][GRABBER] = id
  310. client_data[id][FLAGS] = 0
  311. client_data[id][GRABBED] = target
  312. new Float:torig[3], Float:orig[3]
  313. pev( target, pev_origin, torig )
  314. pev( id, pev_origin, orig )
  315. client_data[id][GRAB_LEN] = floatround( get_distance_f( torig, orig ) )
  316. if( client_data[id][GRAB_LEN] < get_pcvar_num( p_min_dist ) ) client_data[id][GRAB_LEN] = get_pcvar_num( p_min_dist )
  317. }
  318.  
  319. public push( id )
  320. {
  321. client_data[id][FLAGS] ^= CDF_IN_PUSH
  322. return PLUGIN_HANDLED
  323. }
  324.  
  325. public pull( id )
  326. {
  327. client_data[id][FLAGS] ^= CDF_IN_PULL
  328. return PLUGIN_HANDLED
  329. }
  330.  
  331. public push2( id )
  332. {
  333. if( client_data[id][GRABBED] > 0 )
  334. {
  335. do_push( id )
  336. return PLUGIN_HANDLED
  337. }
  338. return PLUGIN_CONTINUE
  339. }
  340.  
  341. public pull2( id )
  342. {
  343. if( client_data[id][GRABBED] > 0 )
  344. {
  345. do_pull( id )
  346. return PLUGIN_HANDLED
  347. }
  348. return PLUGIN_CONTINUE
  349. }
  350.  
  351. public do_push( id )
  352. if( client_data[id][GRAB_LEN] < 9999 )
  353. client_data[id][GRAB_LEN] += get_pcvar_num( p_speed )
  354.  
  355. public do_pull( id )
  356. {
  357. new mindist = get_pcvar_num( p_min_dist )
  358. new len = client_data[id][GRAB_LEN]
  359.  
  360. if( len > mindist )
  361. {
  362. len -= get_pcvar_num( p_speed )
  363. if( len < mindist ) len = mindist
  364. client_data[id][GRAB_LEN] = len
  365. }
  366. else if( get_pcvar_num( p_auto_choke ) )
  367. do_choke( id )
  368. }
  369.  
  370. public do_choke( id )
  371. {
  372. new target = client_data[id][GRABBED]
  373. if( client_data[id][FLAGS] & CDF_NO_CHOKE || id == target || target > MAXPLAYERS) return
  374.  
  375. new dmg = get_pcvar_num( p_choke_dmg )
  376. new vec[3]
  377. FVecIVec( get_target_origin_f( target ), vec )
  378.  
  379. message_begin( MSG_ONE, SVC_SCREENSHAKE, _, target )
  380. write_short( 999999 ) //amount
  381. write_short( 9999 ) //duration
  382. write_short( 999 ) //frequency
  383. message_end( )
  384.  
  385. message_begin( MSG_ONE, SVC_SCREENFADE, _, target )
  386. write_short( 9999 ) //duration
  387. write_short( 100 ) //hold
  388. write_short( SF_FADE_MODULATE ) //flags
  389. write_byte( get_pcvar_num( p_glow_r ) ) //r
  390. write_byte( get_pcvar_num( p_glow_g ) ) //g
  391. write_byte( get_pcvar_num( p_glow_b ) ) //b
  392. write_byte( 200 ) //a
  393. message_end( )
  394.  
  395. message_begin( MSG_ONE, WTF_DAMAGE, _, target )
  396. write_byte( 0 ) //damage armor
  397. write_byte( dmg ) //damage health
  398. write_long( DMG_CRUSH ) //damage type
  399. write_coord( vec[0] ) //origin[x]
  400. write_coord( vec[1] ) //origin[y]
  401. write_coord( vec[2] ) //origin[z]
  402. message_end( )
  403.  
  404. message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
  405. write_byte( TE_BLOODSTREAM )
  406. write_coord( vec[0] ) //pos.x
  407. write_coord( vec[1] ) //pos.y
  408. write_coord( vec[2] + 15 ) //pos.z
  409. write_coord( random_num( 0, 255 ) ) //vec.x
  410. write_coord( random_num( 0, 255 ) ) //vec.y
  411. write_coord( random_num( 0, 255 ) ) //vec.z
  412. write_byte( 70 ) //col index
  413. write_byte( random_num( 50, 250 ) ) //speed
  414. message_end( )
  415.  
  416. new health = pev( target, pev_health ) - dmg
  417. set_pev( target, pev_health, float( health ) )
  418. if( health < 1 ) dllfunc( DLLFunc_ClientKill, target )
  419.  
  420. emit_sound( target, CHAN_BODY, "player/PL_PAIN2.WAV", VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  421.  
  422. client_data[id][FLAGS] ^= CDF_NO_CHOKE
  423. set_task( get_pcvar_float( p_choke_time ), "clear_no_choke", TSK_CHKE + id )
  424. }
  425.  
  426. public clear_no_choke( tskid )
  427. {
  428. new id = tskid - TSK_CHKE
  429. client_data[id][FLAGS] ^= CDF_NO_CHOKE
  430. }
  431.  
  432. //Grabs the client and teleports them to the admin
  433. public force_grab(id, level, cid)
  434. {
  435. if( !cmd_access( id, level, cid, 1 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
  436.  
  437. new arg[33]
  438. read_argv( 1, arg, 32 )
  439.  
  440. new targetid = cmd_target( id, arg, 1 )
  441.  
  442. if( is_grabbed( targetid, id ) ) return PLUGIN_HANDLED
  443. if( !is_user_alive( targetid ) )
  444. {
  445. client_print( id, print_console, "[AMXX] %L", id, "COULDNT" )
  446. return PLUGIN_HANDLED
  447. }
  448.  
  449. //Safe to tp target to aim spot?
  450. new Float:tmpvec[3], Float:orig[3], Float:torig[3], Float:trace_ret[3]
  451. new bool:safe = false, i
  452.  
  453. get_view_pos( id, orig )
  454. tmpvec = vel_by_aim( id, get_pcvar_num( p_min_dist ) )
  455.  
  456. for( new j = 1; j < 11 && !safe; j++ )
  457. {
  458. torig[0] = orig[0] + tmpvec[i] * j
  459. torig[1] = orig[1] + tmpvec[i] * j
  460. torig[2] = orig[2] + tmpvec[i] * j
  461.  
  462. traceline( tmpvec, torig, id, trace_ret )
  463.  
  464. if( get_distance_f( trace_ret, torig ) ) break
  465.  
  466. engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
  467. if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen ) )
  468. safe = true
  469. }
  470.  
  471. //Still not safe? Then find another safe spot somewhere around the grabber
  472. pev( id, pev_origin, orig )
  473. new try[3]
  474. orig[2] += 2
  475. while( try[2] < 3 && !safe )
  476. {
  477. for( i = 0; i < 3; i++ )
  478. switch( try[i] )
  479. {
  480. case 0 : torig[i] = orig[i] + ( i == 2 ? 80 : 40 )
  481. case 1 : torig[i] = orig[i]
  482. case 2 : torig[i] = orig[i] - ( i == 2 ? 80 : 40 )
  483. }
  484.  
  485. traceline( tmpvec, torig, id, trace_ret )
  486.  
  487. engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
  488. if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen )
  489. && !get_distance_f( trace_ret, torig ) ) safe = true
  490.  
  491. try[0]++
  492. if( try[0] == 3 )
  493. {
  494. try[0] = 0
  495. try[1]++
  496. if( try[1] == 3 )
  497. {
  498. try[1] = 0
  499. try[2]++
  500. }
  501. }
  502. }
  503.  
  504. if( safe )
  505. {
  506. set_pev( targetid, pev_origin, torig )
  507. set_grabbed( id, targetid )
  508. screenfade_in( id )
  509. }
  510. else client_print( id, print_chat, "[AMXX] %L", id, "COULDNT" )
  511.  
  512. return PLUGIN_HANDLED
  513. }
  514.  
  515. public is_grabbed( target, grabber )
  516. {
  517. for( new i = 1; i <= MAXPLAYERS; i++ )
  518. if( client_data[i][GRABBED] == target )
  519. {
  520. client_print( grabber, print_chat, "[AMXX] %L", grabber, "ALREADY" )
  521. unset_grabbed( grabber )
  522. return true
  523. }
  524. return false
  525. }
  526.  
  527. public DeathMsg( )
  528. kill_grab( read_data( 2 ) )
  529.  
  530. public client_disconnect( id )
  531. {
  532. kill_grab( id )
  533. return PLUGIN_CONTINUE
  534. }
  535.  
  536. public kill_grab( id )
  537. {
  538. //If given client has grabbed, or has a grabber, unset it
  539. if( client_data[id][GRABBED] )
  540. unset_grabbed( id )
  541. else if( client_data[id][GRABBER] )
  542. unset_grabbed( client_data[id][GRABBER] )
  543. }
  544.  
  545. stock traceline( const Float:vStart[3], const Float:vEnd[3], const pIgnore, Float:vHitPos[3] )
  546. {
  547. engfunc( EngFunc_TraceLine, vStart, vEnd, 0, pIgnore, 0 )
  548. get_tr2( 0, TR_vecEndPos, vHitPos )
  549. return get_tr2( 0, TR_pHit )
  550. }
  551.  
  552. stock get_view_pos( const id, Float:vViewPos[3] )
  553. {
  554. new Float:vOfs[3]
  555. pev( id, pev_origin, vViewPos )
  556. pev( id, pev_view_ofs, vOfs )
  557.  
  558. vViewPos[0] += vOfs[0]
  559. vViewPos[1] += vOfs[1]
  560. vViewPos[2] += vOfs[2]
  561. }
  562.  
  563. stock Float:vel_by_aim( id, speed = 1 )
  564. {
  565. new Float:v1[3], Float:vBlah[3]
  566. pev( id, pev_v_angle, v1 )
  567. engfunc( EngFunc_AngleVectors, v1, v1, vBlah, vBlah )
  568.  
  569. v1[0] *= speed
  570. v1[1] *= speed
  571. v1[2] *= speed
  572.  
  573. return v1
  574. }


Köszi gomb::)

_________________
Rengeteg új beszólás eléréséhez kattints IDE (Ezek alapból sank soundshoz készültek)

Steam profil:
[steam]http://steamcommunity.com/profiles/76561198089487307[/steam]


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Grab
HozzászólásElküldve: 2013.10.05. 11:01 
Offline
Jómunkásember
Avatar

Csatlakozott: 2012.09.23. 20:29
Hozzászólások: 325
Megköszönt másnak: 26 alkalommal
Megköszönték neki: 87 alkalommal
Elvileg Jónak kell lennie.
SMA Forráskód: [ Mindet kijelol ]
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4.  
  5. new const VERSION[ ] = "1.2.3"
  6. new const TRKCVAR[ ] = "grab_plus_version"
  7. #define ADMIN ADMIN_LEVEL_B
  8.  
  9. #define TSK_CHKE 50
  10.  
  11. #define SF_FADEOUT 0
  12.  
  13. new client_data[33][4]
  14. #define GRABBED 0
  15. #define GRABBER 1
  16. #define GRAB_LEN 2
  17. #define FLAGS 3
  18.  
  19. #define CDF_IN_PUSH (1<<0)
  20. #define CDF_IN_PULL (1<<1)
  21. #define CDF_NO_CHOKE (1<<2)
  22.  
  23. //Cvar Pointers
  24. new p_enabled, p_players_only
  25. new p_throw_force, p_min_dist, p_speed, p_grab_force
  26. new p_choke_time, p_choke_dmg, p_auto_choke
  27. new p_glow_r, p_glow_b, p_glow_g, p_glow_a
  28. new p_fade, p_glow
  29.  
  30. //Pseudo Constants
  31. new MAXPLAYERS
  32. new SVC_SCREENFADE, SVC_SCREENSHAKE, WTF_DAMAGE
  33.  
  34. public plugin_init( )
  35. {
  36. register_plugin( "Grab+", VERSION, "Ian Cammarata" )
  37. register_cvar( TRKCVAR, VERSION, FCVAR_SERVER )
  38. set_cvar_string( TRKCVAR, VERSION )
  39.  
  40. p_enabled = register_cvar( "gp_enabled", "1" )
  41. p_players_only = register_cvar( "gp_players_only", "0" )
  42.  
  43. p_min_dist = register_cvar ( "gp_min_dist", "90" )
  44. p_throw_force = register_cvar( "gp_throw_force", "1500" )
  45. p_grab_force = register_cvar( "gp_grab_force", "8" )
  46. p_speed = register_cvar( "gp_speed", "5" )
  47.  
  48. p_choke_time = register_cvar( "gp_choke_time", "1.5" )
  49. p_choke_dmg = register_cvar( "gp_choke_dmg", "5" )
  50. p_auto_choke = register_cvar( "gp_auto_choke", "1" )
  51.  
  52. p_glow_r = register_cvar( "gp_glow_r", "50" )
  53. p_glow_g = register_cvar( "gp_glow_g", "0" )
  54. p_glow_b = register_cvar( "gp_glow_b", "0" )
  55. p_glow_a = register_cvar( "gp_glow_a", "200" )
  56.  
  57. p_fade = register_cvar( "gp_screen_fade", "1" )
  58. p_glow = register_cvar( "gp_glow", "1" )
  59.  
  60. register_clcmd( "amx_grab", "force_grab", ADMIN, "Grab client & teleport to you." )
  61. register_clcmd( "grab_toggle", "grab_toggle", ADMIN, "press once to grab and again to release" )
  62. register_clcmd( "+grab", "grab", ADMIN, "bind a key to +grab" )
  63. register_clcmd( "-grab", "unset_grabbed" )
  64.  
  65. register_clcmd( "+push", "push", ADMIN, "bind a key to +push" )
  66. register_clcmd( "-push", "push" )
  67. register_clcmd( "+pull", "pull", ADMIN, "bind a key to +pull" )
  68. register_clcmd( "-pull", "pull" )
  69. register_clcmd( "push", "push2" )
  70. register_clcmd( "pull", "pull2" )
  71.  
  72. register_clcmd( "drop" ,"throw" )
  73.  
  74. register_event( "DeathMsg", "DeathMsg", "a" )
  75.  
  76. register_forward( FM_PlayerPreThink, "fm_player_prethink" )
  77.  
  78. register_dictionary( "grab_plus.txt" )
  79.  
  80. MAXPLAYERS = get_maxplayers()
  81.  
  82. SVC_SCREENFADE = get_user_msgid( "ScreenFade" )
  83. SVC_SCREENSHAKE = get_user_msgid( "ScreenShake" )
  84. WTF_DAMAGE = get_user_msgid( "Damage" )
  85. }
  86.  
  87. public plugin_precache( )
  88. {
  89. precache_sound( "player/PL_PAIN2.WAV" )
  90. }
  91.  
  92. public fm_player_prethink( id )
  93. {
  94. new target
  95. //Search for a target
  96. if ( client_data[id][GRABBED] == -1 )
  97. {
  98. new Float:orig[3], Float:ret[3]
  99. get_view_pos( id, orig )
  100. ret = vel_by_aim( id, 9999 )
  101.  
  102. ret[0] += orig[0]
  103. ret[1] += orig[1]
  104. ret[2] += orig[2]
  105.  
  106. target = traceline( orig, ret, id, ret )
  107.  
  108. if( 0 < target <= MAXPLAYERS )
  109. {
  110. if( is_grabbed( target, id ) ) return FMRES_IGNORED
  111. set_grabbed( id, target )
  112. }
  113. else if( !get_pcvar_num( p_players_only ) )
  114. {
  115. new movetype
  116. if( target && pev_valid( target ) )
  117. {
  118. movetype = pev( target, pev_movetype )
  119. if( !( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) )
  120. return FMRES_IGNORED
  121. }
  122. else
  123. {
  124. target = 0
  125. new ent = engfunc( EngFunc_FindEntityInSphere, -1, ret, 12.0 )
  126. while( !target && ent > 0 )
  127. {
  128. movetype = pev( ent, pev_movetype )
  129. if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS )
  130. && ent != id )
  131. target = ent
  132. ent = engfunc( EngFunc_FindEntityInSphere, ent, ret, 12.0 )
  133. }
  134. }
  135. if( target )
  136. {
  137. if( is_grabbed( target, id ) ) return FMRES_IGNORED
  138. set_grabbed( id, target )
  139. }
  140. }
  141. }
  142.  
  143. target = client_data[id][GRABBED]
  144. //If they've grabbed something
  145. if( target > 0 )
  146. {
  147. if( !pev_valid( target ) || ( pev( target, pev_health ) < 1 && pev( target, pev_max_health ) ) )
  148. {
  149. unset_grabbed( id )
  150. return FMRES_IGNORED
  151. }
  152.  
  153. //Use key choke
  154. if( pev( id, pev_button ) & IN_USE )
  155. do_choke( id )
  156.  
  157. //Push and pull
  158. new cdf = client_data[id][FLAGS]
  159. if ( cdf & CDF_IN_PULL )
  160. do_pull( id )
  161. else if ( cdf & CDF_IN_PUSH )
  162. do_push( id )
  163.  
  164. if( target > MAXPLAYERS ) grab_think( id )
  165. }
  166.  
  167. //If they're grabbed
  168. target = client_data[id][GRABBER]
  169. if( target > 0 ) grab_think( target )
  170.  
  171. return FMRES_IGNORED
  172. }
  173.  
  174. public grab_think( id ) //id of the grabber
  175. {
  176. new target = client_data[id][GRABBED]
  177.  
  178. //Keep grabbed clients from sticking to ladders
  179. if( pev( target, pev_movetype ) == MOVETYPE_FLY && !(pev( target, pev_button ) & IN_JUMP ) ) client_cmd( target, "+jump;wait;-jump" )
  180.  
  181. //Move targeted client
  182. new Float:tmpvec[3], Float:tmpvec2[3], Float:torig[3], Float:tvel[3]
  183.  
  184. get_view_pos( id, tmpvec )
  185.  
  186. tmpvec2 = vel_by_aim( id, client_data[id][GRAB_LEN] )
  187.  
  188. torig = get_target_origin_f( target )
  189.  
  190. new force = get_pcvar_num( p_grab_force )
  191.  
  192. tvel[0] = ( ( tmpvec[0] + tmpvec2[0] ) - torig[0] ) * force
  193. tvel[1] = ( ( tmpvec[1] + tmpvec2[1] ) - torig[1] ) * force
  194. tvel[2] = ( ( tmpvec[2] + tmpvec2[2] ) - torig[2] ) * force
  195.  
  196. set_pev( target, pev_velocity, tvel )
  197. }
  198.  
  199. stock Float:get_target_origin_f( id )
  200. {
  201. new Float:orig[3]
  202. pev( id, pev_origin, orig )
  203.  
  204. //If grabbed is not a player, move origin to center
  205. if( id > MAXPLAYERS )
  206. {
  207. new Float:mins[3], Float:maxs[3]
  208. pev( id, pev_mins, mins )
  209. pev( id, pev_maxs, maxs )
  210.  
  211. if( !mins[2] ) orig[2] += maxs[2] / 2
  212. }
  213.  
  214. return orig
  215. }
  216.  
  217. public grab_toggle( id, level, cid )
  218. {
  219. if( !client_data[id][GRABBED] ) grab( id, level, cid )
  220. else unset_grabbed( id )
  221.  
  222. return PLUGIN_HANDLED
  223. }
  224.  
  225. public grab( id, level, cid )
  226. {
  227. if( !cmd_access( id, level, cid, 8192 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
  228.  
  229. if ( !client_data[id][GRABBED] ) client_data[id][GRABBED] = -1
  230. screenfade_in( id )
  231.  
  232. return PLUGIN_HANDLED
  233. }
  234.  
  235. public screenfade_in( id )
  236. {
  237. if( get_pcvar_num( p_fade ) )
  238. {
  239. message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
  240. write_short( 10000 ) //duration
  241. write_short( 0 ) //hold
  242. write_short( SF_FADE_IN + SF_FADE_ONLYONE ) //flags
  243. write_byte( get_pcvar_num( p_glow_r ) ) //r
  244. write_byte( get_pcvar_num( p_glow_g ) ) //g
  245. write_byte( get_pcvar_num( p_glow_b ) ) //b
  246. write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
  247. message_end( )
  248. }
  249. }
  250.  
  251. public throw( id )
  252. {
  253. new target = client_data[id][GRABBED]
  254. if( target > 0 )
  255. {
  256. set_pev( target, pev_velocity, vel_by_aim( id, get_pcvar_num(p_throw_force) ) )
  257. unset_grabbed( id )
  258. return PLUGIN_HANDLED
  259. }
  260.  
  261. return PLUGIN_CONTINUE
  262. }
  263.  
  264. public unset_grabbed( id )
  265. {
  266. new target = client_data[id][GRABBED]
  267. if( target > 0 && pev_valid( target ) )
  268. {
  269. set_pev( target, pev_renderfx, kRenderFxNone )
  270. set_pev( target, pev_rendercolor, {255.0, 255.0, 255.0} )
  271. set_pev( target, pev_rendermode, kRenderNormal )
  272. set_pev( target, pev_renderamt, 16.0 )
  273.  
  274. if( 0 < target <= MAXPLAYERS )
  275. client_data[target][GRABBER] = 0
  276. }
  277. client_data[id][GRABBED] = 0
  278.  
  279. if( get_pcvar_num( p_fade ) )
  280. {
  281. message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
  282. write_short( 10000 ) //duration
  283. write_short( 0 ) //hold
  284. write_short( SF_FADEOUT ) //flags
  285. write_byte( get_pcvar_num( p_glow_r ) ) //r
  286. write_byte( get_pcvar_num( p_glow_g ) ) //g
  287. write_byte( get_pcvar_num( p_glow_b ) ) //b
  288. write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
  289. message_end( )
  290. }
  291. }
  292.  
  293. //Grabs onto someone
  294. public set_grabbed( id, target )
  295. {
  296. if( get_pcvar_num( p_glow ) )
  297. {
  298. new Float:color[3]
  299. color[0] = get_pcvar_float( p_glow_r )
  300. color[1] = get_pcvar_float( p_glow_g )
  301. color[2] = get_pcvar_float( p_glow_b )
  302. set_pev( target, pev_renderfx, kRenderFxGlowShell )
  303. set_pev( target, pev_rendercolor, color )
  304. set_pev( target, pev_rendermode, kRenderTransColor )
  305. set_pev( target, pev_renderamt, get_pcvar_float( p_glow_a ) )
  306. }
  307.  
  308. if( 0 < target <= MAXPLAYERS )
  309. client_data[target][GRABBER] = id
  310. client_data[id][FLAGS] = 0
  311. client_data[id][GRABBED] = target
  312. new Float:torig[3], Float:orig[3]
  313. pev( target, pev_origin, torig )
  314. pev( id, pev_origin, orig )
  315. client_data[id][GRAB_LEN] = floatround( get_distance_f( torig, orig ) )
  316. if( client_data[id][GRAB_LEN] < get_pcvar_num( p_min_dist ) ) client_data[id][GRAB_LEN] = get_pcvar_num( p_min_dist )
  317. }
  318.  
  319. public push( id )
  320. {
  321. client_data[id][FLAGS] ^= CDF_IN_PUSH
  322. return PLUGIN_HANDLED
  323. }
  324.  
  325. public pull( id )
  326. {
  327. client_data[id][FLAGS] ^= CDF_IN_PULL
  328. return PLUGIN_HANDLED
  329. }
  330.  
  331. public push2( id )
  332. {
  333. if( client_data[id][GRABBED] > 0 )
  334. {
  335. do_push( id )
  336. return PLUGIN_HANDLED
  337. }
  338. return PLUGIN_CONTINUE
  339. }
  340.  
  341. public pull2( id )
  342. {
  343. if( client_data[id][GRABBED] > 0 )
  344. {
  345. do_pull( id )
  346. return PLUGIN_HANDLED
  347. }
  348. return PLUGIN_CONTINUE
  349. }
  350.  
  351. public do_push( id )
  352. if( client_data[id][GRAB_LEN] < 9999 )
  353. client_data[id][GRAB_LEN] += get_pcvar_num( p_speed )
  354.  
  355. public do_pull( id )
  356. {
  357. new mindist = get_pcvar_num( p_min_dist )
  358. new len = client_data[id][GRAB_LEN]
  359.  
  360. if( len > mindist )
  361. {
  362. len -= get_pcvar_num( p_speed )
  363. if( len < mindist ) len = mindist
  364. client_data[id][GRAB_LEN] = len
  365. }
  366. else if( get_pcvar_num( p_auto_choke ) )
  367. do_choke( id )
  368. }
  369.  
  370. public do_choke( id )
  371. {
  372. new target = client_data[id][GRABBED]
  373. if( client_data[id][FLAGS] & CDF_NO_CHOKE || id == target || target > MAXPLAYERS) return
  374.  
  375. new dmg = get_pcvar_num( p_choke_dmg )
  376. new vec[3]
  377. FVecIVec( get_target_origin_f( target ), vec )
  378.  
  379. message_begin( MSG_ONE, SVC_SCREENSHAKE, _, target )
  380. write_short( 999999 ) //amount
  381. write_short( 9999 ) //duration
  382. write_short( 999 ) //frequency
  383. message_end( )
  384.  
  385. message_begin( MSG_ONE, SVC_SCREENFADE, _, target )
  386. write_short( 9999 ) //duration
  387. write_short( 100 ) //hold
  388. write_short( SF_FADE_MODULATE ) //flags
  389. write_byte( get_pcvar_num( p_glow_r ) ) //r
  390. write_byte( get_pcvar_num( p_glow_g ) ) //g
  391. write_byte( get_pcvar_num( p_glow_b ) ) //b
  392. write_byte( 200 ) //a
  393. message_end( )
  394.  
  395. message_begin( MSG_ONE, WTF_DAMAGE, _, target )
  396. write_byte( 0 ) //damage armor
  397. write_byte( dmg ) //damage health
  398. write_long( DMG_CRUSH ) //damage type
  399. write_coord( vec[0] ) //origin[x]
  400. write_coord( vec[1] ) //origin[y]
  401. write_coord( vec[2] ) //origin[z]
  402. message_end( )
  403.  
  404. message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
  405. write_byte( TE_BLOODSTREAM )
  406. write_coord( vec[0] ) //pos.x
  407. write_coord( vec[1] ) //pos.y
  408. write_coord( vec[2] + 15 ) //pos.z
  409. write_coord( random_num( 0, 255 ) ) //vec.x
  410. write_coord( random_num( 0, 255 ) ) //vec.y
  411. write_coord( random_num( 0, 255 ) ) //vec.z
  412. write_byte( 70 ) //col index
  413. write_byte( random_num( 50, 250 ) ) //speed
  414. message_end( )
  415.  
  416. new health = pev( target, pev_health ) - dmg
  417. set_pev( target, pev_health, float( health ) )
  418. if( health < 1 ) dllfunc( DLLFunc_ClientKill, target )
  419.  
  420. emit_sound( target, CHAN_BODY, "player/PL_PAIN2.WAV", VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  421.  
  422. client_data[id][FLAGS] ^= CDF_NO_CHOKE
  423. set_task( get_pcvar_float( p_choke_time ), "clear_no_choke", TSK_CHKE + id )
  424. }
  425.  
  426. public clear_no_choke( tskid )
  427. {
  428. new id = tskid - TSK_CHKE
  429. client_data[id][FLAGS] ^= CDF_NO_CHOKE
  430. }
  431.  
  432. //Grabs the client and teleports them to the admin
  433. public force_grab(id, level, cid)
  434. {
  435. if( !cmd_access( id, level, cid, 8192 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
  436.  
  437. new arg[33]
  438. read_argv( 1, arg, 32 )
  439.  
  440. new targetid = cmd_target( id, arg, 1 )
  441.  
  442. if( is_grabbed( targetid, id ) ) return PLUGIN_HANDLED
  443. if( !is_user_alive( targetid ) )
  444. {
  445. client_print( id, print_console, "[AMXX] %L", id, "COULDNT" )
  446. return PLUGIN_HANDLED
  447. }
  448.  
  449. //Safe to tp target to aim spot?
  450. new Float:tmpvec[3], Float:orig[3], Float:torig[3], Float:trace_ret[3]
  451. new bool:safe = false, i
  452.  
  453. get_view_pos( id, orig )
  454. tmpvec = vel_by_aim( id, get_pcvar_num( p_min_dist ) )
  455.  
  456. for( new j = 1; j < 11 && !safe; j++ )
  457. {
  458. torig[0] = orig[0] + tmpvec[i] * j
  459. torig[1] = orig[1] + tmpvec[i] * j
  460. torig[2] = orig[2] + tmpvec[i] * j
  461.  
  462. traceline( tmpvec, torig, id, trace_ret )
  463.  
  464. if( get_distance_f( trace_ret, torig ) ) break
  465.  
  466. engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
  467. if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen ) )
  468. safe = true
  469. }
  470.  
  471. //Still not safe? Then find another safe spot somewhere around the grabber
  472. pev( id, pev_origin, orig )
  473. new try[3]
  474. orig[2] += 2
  475. while( try[2] < 3 && !safe )
  476. {
  477. for( i = 0; i < 3; i++ )
  478. switch( try[i] )
  479. {
  480. case 0 : torig[i] = orig[i] + ( i == 2 ? 80 : 40 )
  481. case 1 : torig[i] = orig[i]
  482. case 2 : torig[i] = orig[i] - ( i == 2 ? 80 : 40 )
  483. }
  484.  
  485. traceline( tmpvec, torig, id, trace_ret )
  486.  
  487. engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
  488. if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen )
  489. && !get_distance_f( trace_ret, torig ) ) safe = true
  490.  
  491. try[0]++
  492. if( try[0] == 3 )
  493. {
  494. try[0] = 0
  495. try[1]++
  496. if( try[1] == 3 )
  497. {
  498. try[1] = 0
  499. try[2]++
  500. }
  501. }
  502. }
  503.  
  504. if( safe )
  505. {
  506. set_pev( targetid, pev_origin, torig )
  507. set_grabbed( id, targetid )
  508. screenfade_in( id )
  509. }
  510. else client_print( id, print_chat, "[AMXX] %L", id, "COULDNT" )
  511.  
  512. return PLUGIN_HANDLED
  513. }
  514.  
  515. public is_grabbed( target, grabber )
  516. {
  517. for( new i = 1; i <= MAXPLAYERS; i++ )
  518. if( client_data[i][GRABBED] == target )
  519. {
  520. client_print( grabber, print_chat, "[AMXX] %L", grabber, "ALREADY" )
  521. unset_grabbed( grabber )
  522. return true
  523. }
  524. return false
  525. }
  526.  
  527. public DeathMsg( )
  528. kill_grab( read_data( 2 ) )
  529.  
  530. public client_disconnect( id )
  531. {
  532. kill_grab( id )
  533. return PLUGIN_CONTINUE
  534. }
  535.  
  536. public kill_grab( id )
  537. {
  538. //If given client has grabbed, or has a grabber, unset it
  539. if( client_data[id][GRABBED] )
  540. unset_grabbed( id )
  541. else if( client_data[id][GRABBER] )
  542. unset_grabbed( client_data[id][GRABBER] )
  543. }
  544.  
  545. stock traceline( const Float:vStart[3], const Float:vEnd[3], const pIgnore, Float:vHitPos[3] )
  546. {
  547. engfunc( EngFunc_TraceLine, vStart, vEnd, 0, pIgnore, 0 )
  548. get_tr2( 0, TR_vecEndPos, vHitPos )
  549. return get_tr2( 0, TR_pHit )
  550. }
  551.  
  552. stock get_view_pos( const id, Float:vViewPos[3] )
  553. {
  554. new Float:vOfs[3]
  555. pev( id, pev_origin, vViewPos )
  556. pev( id, pev_view_ofs, vOfs )
  557.  
  558. vViewPos[0] += vOfs[0]
  559. vViewPos[1] += vOfs[1]
  560. vViewPos[2] += vOfs[2]
  561. }
  562.  
  563. stock Float:vel_by_aim( id, speed = 1 )
  564. {
  565. new Float:v1[3], Float:vBlah[3]
  566. pev( id, pev_v_angle, v1 )
  567. engfunc( EngFunc_AngleVectors, v1, v1, vBlah, vBlah )
  568.  
  569. v1[0] *= speed
  570. v1[1] *= speed
  571. v1[2] *= speed
  572.  
  573. return v1
  574. }


Hozzászólás jelentése
Vissza a tetejére
   
Hozzászólások megjelenítése:  Rendezés  
Új téma nyitása  Hozzászólás a témához  [ 6 hozzászólás ] 


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 11 vendég


Nyithatsz új témákat ebben a fórumban.
Válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.
Nem küldhetsz csatolmányokat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB® Forum Software © phpBB Limited
Magyar fordítás © Magyar phpBB Közösség
Portal: Kiss Portal Extension © Michael O'Toole