hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2024.05.10. 20:02



Jelenlévő felhasználók

Jelenleg 571 felhasználó van jelen :: 1 regisztrált, 0 rejtett és 570 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  [ 2 hozzászólás ] 
Szerző Üzenet
 Hozzászólás témája: Grab random szín
HozzászólásElküldve: 2014.09.28. 11:12 
Offline
Beavatott

Csatlakozott: 2014.05.23. 18:32
Hozzászólások: 68
Megköszönt másnak: 88 alkalommal
Megköszönték neki: 2 alkalommal
Valaki át írja ezt nekem random szinekre?
SMA Forráskód: [ Mindet kijelol ]
  1. /*
  2. Grab+ v1.2.3
  3. Copyright (C) 2007 Ian (Juan) Cammarata
  4.  
  5. This program is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU Affero General Public License as
  7. published by the Free Software Foundation, either version 3 of the
  8. License, or (at your option) any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU Affero General Public License for more details.
  14.  
  15. You should have received a copy of the GNU Affero General Public License
  16. along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. --------------------------------------------------------------------------------
  18.  
  19. Nov 21 11:03
  20.  
  21.  
  22. Description:
  23. This is a remake from scratch of SpaceDude's Jedi Force Grab plugin. It has many additional features and optimizations, is less spammy, multilingual and requires fewer binds.
  24.  
  25.  
  26. Features:
  27. Multilingual
  28. Screenfade to indicate grab activity instead of chat spam.
  29. Can grab players off a ladder.
  30. Automatically choke by holding down +pull while at min distance.
  31. Choke with use key.
  32. Throw with drop.
  33. Can't have mutliple admins grabbing the same player.
  34. Auto drop on death.
  35. Grab entities other than players, such as bombs, weapons, and hostages.
  36.  
  37.  
  38. Commands:
  39.  
  40. +grab : Grab something for as long as you hold down the key.
  41. grab_toggle : Same as +grab but toggles.
  42. amx_grab <name> : Grab client by name or id and teleport them to you. Use +grab or grab_toggle key to release.
  43.  
  44. +pull/+push (or invnext/invprev): Pulls/pushes the grabbed towards/away from you as you hold the button.
  45.  
  46. +use : Chokes the grabbed (it damages the grabbed with 5 (cvar: gp_choke_dmg) hp per 1.5 (cvar: gp_choke_time) seconds)
  47. drop - Throws the grabbed with 1500 velocity. (cvar: gp_throw_force)
  48.  
  49.  
  50. Cvars (First value is default):
  51. gp_enabled <1|0> Enables all plugin functionality.
  52. gp_players_only <0|1> Disables admins grabbing entities other than players.
  53.  
  54. gp_min_dist <90|...> Min distance between the grabber and grabbed.
  55. gp_grab_force <8|...> Sets the amount of force used when grabbing players.
  56. gp_throw_force <1500|...> Sets the power used when throwing players.
  57. gp_speed <5|...> How fast the grabbed moves when using push and pull.
  58.  
  59. gp_choke_time <1.5|...> Time frequency for choking.
  60. gp_choke_dmg <5|...> Amount of damage done with each choke.
  61. gp_auto_choke <1|0> Enable/disable choking automatically with +pull command.
  62.  
  63. gp_screen_fade <1|0> Enables/disables screenfade when grabbing.
  64. gp_glow <1|0> Enables/disables glowing for grabbed objects.
  65.  
  66. gp_glow_r <50|0-255> Sets red amount for glow and screenfade.
  67. gp_glow_g <0|0-255> Sets green amount for glow and screenfade.
  68. gp_glow_b <0|0-255> Sets blue amount for glow and screenfade.
  69. gp_glow_a <0|0-255> Sets alpha for glow and screenfade.
  70.  
  71.  
  72. Notes:
  73. Make sure you place the grab_plus.txt file in addons\amxmodx\data\lang
  74.  
  75.  
  76. Credits:
  77. Thanks to vittu for contributing code (changed all engine/fun module stuff to fakemeta).
  78.  
  79. Thanks to all the coders who worked on the original Jedi Force Grab plugin for all their ideas:
  80. SpaceDude
  81. KCE
  82. KRoTaL
  83. BOB_SLAYER
  84. kosmo111
  85.  
  86.  
  87. Supported Languages:
  88. 1337 (100%) - Thanks to l337newb
  89. Brazilian Portuguese (100%) - Thanks to Arion
  90. Danish (100%) - Thanks to nellerbabz
  91. Dutch (100%) - Thanks to BlackMilk
  92. English (100%)
  93. Finnish (100%) - Thanks to Pro Patria Finland
  94. French (100%) - Thanks to connorr
  95. German (100%) - Thanks to SchlumPF*
  96. Russian (100%) - Thanks to `666
  97. Spanish (100%) - Hope these don't suck.
  98. Swedish (100%) - Thanks to Bend3r
  99.  
  100.  
  101. Change Log:
  102. Key (+ added | - removed | c changed | f fixed)
  103.  
  104. v1.2.3 (Nov 21, 2007)
  105. c: A few more small optimizations.
  106. f: Bloodstream for choke wasn't aligned with player.
  107. f: Bad message disconnect error when players were choked. ( stupid SVC_DAMAGE define )
  108.  
  109. v1.2.2 (Nov 16, 2007)
  110. c: A few small code optimizations.
  111.  
  112. v1.2.1 (Nov 12, 2007)
  113. f: Eliminated two run time warnings in the player prethink function.
  114.  
  115. v1.2 (Nov 06, 2007)
  116. +: Cvars gp_screen_fade and gp_glow to enable/disable these features.
  117. +: Cvar gp_glow_a controls to control alpha of screenfade and glow.
  118. +: Cvar gp_auto_choke to enable/disable choking automatically with +pull command.
  119. c: Removed dependency of engine and fun modules. Thanks to vittu for doing most of the work.
  120. c: Made cvar names more consistent by adding more underscores.
  121. f: Fixed compile bug with amxx 1.8.0 (Compiles with 1.7.x as well).
  122.  
  123. v1.1 (Oct 16, 2007)
  124. +: Grab a few types of entities other than players.
  125. +: Cvar gp_players_only.
  126.  
  127. v1.0 (Oct 13, 2007)
  128. !: Initial release
  129.  
  130. */
  131.  
  132. #include <amxmodx>
  133. #include <amxmisc>
  134. #include <fakemeta>
  135.  
  136. new const VERSION[ ] = "1.2.3"
  137. new const TRKCVAR[ ] = "grab_plus_version"
  138. #define ADMIN ADMIN_LEVEL_A
  139.  
  140. #define TSK_CHKE 50
  141.  
  142. #define SF_FADEOUT 0
  143.  
  144. new client_data[33][4]
  145. #define GRABBED 0
  146. #define GRABBER 1
  147. #define GRAB_LEN 2
  148. #define FLAGS 3
  149.  
  150. #define CDF_IN_PUSH (1<<0)
  151. #define CDF_IN_PULL (1<<1)
  152. #define CDF_NO_CHOKE (1<<2)
  153.  
  154. //Cvar Pointers
  155. new p_enabled, p_players_only
  156. new p_throw_force, p_min_dist, p_speed, p_grab_force
  157. new p_choke_time, p_choke_dmg, p_auto_choke
  158. new p_glow_r, p_glow_b, p_glow_g, p_glow_a
  159. new p_fade, p_glow
  160.  
  161. //Pseudo Constants
  162. new MAXPLAYERS
  163. new SVC_SCREENFADE, SVC_SCREENSHAKE, WTF_DAMAGE
  164.  
  165. public plugin_init( )
  166. {
  167. register_plugin( "Grab+", VERSION, "Ian Cammarata" )
  168. register_cvar( TRKCVAR, VERSION, FCVAR_SERVER )
  169. set_cvar_string( TRKCVAR, VERSION )
  170.  
  171. p_enabled = register_cvar( "gp_enabled", "1" )
  172. p_players_only = register_cvar( "gp_players_only", "0" )
  173.  
  174. p_min_dist = register_cvar ( "gp_min_dist", "90" )
  175. p_throw_force = register_cvar( "gp_throw_force", "1500" )
  176. p_grab_force = register_cvar( "gp_grab_force", "8" )
  177. p_speed = register_cvar( "gp_speed", "5" )
  178.  
  179. p_choke_time = register_cvar( "gp_choke_time", "1.5" )
  180. p_choke_dmg = register_cvar( "gp_choke_dmg", "5" )
  181. p_auto_choke = register_cvar( "gp_auto_choke", "1" )
  182.  
  183. p_glow_r = register_cvar( "gp_glow_r", "50" )
  184. p_glow_g = register_cvar( "gp_glow_g", "0" )
  185. p_glow_b = register_cvar( "gp_glow_b", "0" )
  186. p_glow_a = register_cvar( "gp_glow_a", "200" )
  187.  
  188. p_fade = register_cvar( "gp_screen_fade", "1" )
  189. p_glow = register_cvar( "gp_glow", "1" )
  190.  
  191. register_clcmd( "amx_grab", "force_grab", ADMIN, "Grab client & teleport to you." )
  192. register_clcmd( "grab_toggle", "grab_toggle", ADMIN, "press once to grab and again to release" )
  193. register_clcmd( "+grab", "grab", ADMIN, "bind a key to +grab" )
  194. register_clcmd( "-grab", "unset_grabbed" )
  195.  
  196. register_clcmd( "+push", "push", ADMIN, "bind a key to +push" )
  197. register_clcmd( "-push", "push" )
  198. register_clcmd( "+pull", "pull", ADMIN, "bind a key to +pull" )
  199. register_clcmd( "-pull", "pull" )
  200. register_clcmd( "push", "push2" )
  201. register_clcmd( "pull", "pull2" )
  202.  
  203. register_clcmd( "drop" ,"throw" )
  204.  
  205. register_event( "DeathMsg", "DeathMsg", "a" )
  206.  
  207. register_forward( FM_PlayerPreThink, "fm_player_prethink" )
  208.  
  209. register_dictionary( "grab_plus.txt" )
  210.  
  211. MAXPLAYERS = get_maxplayers()
  212.  
  213. SVC_SCREENFADE = get_user_msgid( "ScreenFade" )
  214. SVC_SCREENSHAKE = get_user_msgid( "ScreenShake" )
  215. WTF_DAMAGE = get_user_msgid( "Damage" )
  216. }
  217.  
  218. public plugin_precache( )
  219. {
  220. precache_sound( "player/PL_PAIN2.WAV" )
  221. }
  222.  
  223. public fm_player_prethink( id )
  224. {
  225. new target
  226. //Search for a target
  227. if ( client_data[id][GRABBED] == -1 )
  228. {
  229. new Float:orig[3], Float:ret[3]
  230. get_view_pos( id, orig )
  231. ret = vel_by_aim( id, 9999 )
  232.  
  233. ret[0] += orig[0]
  234. ret[1] += orig[1]
  235. ret[2] += orig[2]
  236.  
  237. target = traceline( orig, ret, id, ret )
  238.  
  239. if( 0 < target <= MAXPLAYERS )
  240. {
  241. if( is_grabbed( target, id ) ) return FMRES_IGNORED
  242. set_grabbed( id, target )
  243. }
  244. else if( !get_pcvar_num( p_players_only ) )
  245. {
  246. new movetype
  247. if( target && pev_valid( target ) )
  248. {
  249. movetype = pev( target, pev_movetype )
  250. if( !( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) )
  251. return FMRES_IGNORED
  252. }
  253. else
  254. {
  255. target = 0
  256. new ent = engfunc( EngFunc_FindEntityInSphere, -1, ret, 12.0 )
  257. while( !target && ent > 0 )
  258. {
  259. movetype = pev( ent, pev_movetype )
  260. if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS )
  261. && ent != id )
  262. target = ent
  263. ent = engfunc( EngFunc_FindEntityInSphere, ent, ret, 12.0 )
  264. }
  265. }
  266. if( target )
  267. {
  268. if( is_grabbed( target, id ) ) return FMRES_IGNORED
  269. set_grabbed( id, target )
  270. }
  271. }
  272. }
  273.  
  274. target = client_data[id][GRABBED]
  275. //If they've grabbed something
  276. if( target > 0 )
  277. {
  278. if( !pev_valid( target ) || ( pev( target, pev_health ) < 1 && pev( target, pev_max_health ) ) )
  279. {
  280. unset_grabbed( id )
  281. return FMRES_IGNORED
  282. }
  283.  
  284. //Use key choke
  285. if( pev( id, pev_button ) & IN_USE )
  286. do_choke( id )
  287.  
  288. //Push and pull
  289. new cdf = client_data[id][FLAGS]
  290. if ( cdf & CDF_IN_PULL )
  291. do_pull( id )
  292. else if ( cdf & CDF_IN_PUSH )
  293. do_push( id )
  294.  
  295. if( target > MAXPLAYERS ) grab_think( id )
  296. }
  297.  
  298. //If they're grabbed
  299. target = client_data[id][GRABBER]
  300. if( target > 0 ) grab_think( target )
  301.  
  302. return FMRES_IGNORED
  303. }
  304.  
  305. public grab_think( id ) //id of the grabber
  306. {
  307. new target = client_data[id][GRABBED]
  308.  
  309. //Keep grabbed clients from sticking to ladders
  310. if( pev( target, pev_movetype ) == MOVETYPE_FLY && !(pev( target, pev_button ) & IN_JUMP ) ) client_cmd( target, "+jump;wait;-jump" )
  311.  
  312. //Move targeted client
  313. new Float:tmpvec[3], Float:tmpvec2[3], Float:torig[3], Float:tvel[3]
  314.  
  315. get_view_pos( id, tmpvec )
  316.  
  317. tmpvec2 = vel_by_aim( id, client_data[id][GRAB_LEN] )
  318.  
  319. torig = get_target_origin_f( target )
  320.  
  321. new force = get_pcvar_num( p_grab_force )
  322.  
  323. tvel[0] = ( ( tmpvec[0] + tmpvec2[0] ) - torig[0] ) * force
  324. tvel[1] = ( ( tmpvec[1] + tmpvec2[1] ) - torig[1] ) * force
  325. tvel[2] = ( ( tmpvec[2] + tmpvec2[2] ) - torig[2] ) * force
  326.  
  327. set_pev( target, pev_velocity, tvel )
  328. }
  329.  
  330. stock Float:get_target_origin_f( id )
  331. {
  332. new Float:orig[3]
  333. pev( id, pev_origin, orig )
  334.  
  335. //If grabbed is not a player, move origin to center
  336. if( id > MAXPLAYERS )
  337. {
  338. new Float:mins[3], Float:maxs[3]
  339. pev( id, pev_mins, mins )
  340. pev( id, pev_maxs, maxs )
  341.  
  342. if( !mins[2] ) orig[2] += maxs[2] / 2
  343. }
  344.  
  345. return orig
  346. }
  347.  
  348. public grab_toggle( id, level, cid )
  349. {
  350. if( !client_data[id][GRABBED] ) grab( id, level, cid )
  351. else unset_grabbed( id )
  352.  
  353. return PLUGIN_HANDLED
  354. }
  355.  
  356. public grab( id, level, cid )
  357. {
  358. if( !cmd_access( id, level, cid, 1 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
  359.  
  360. if ( !client_data[id][GRABBED] ) client_data[id][GRABBED] = -1
  361. screenfade_in( id )
  362.  
  363. return PLUGIN_HANDLED
  364. }
  365.  
  366. public screenfade_in( id )
  367. {
  368. if( get_pcvar_num( p_fade ) )
  369. {
  370. message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
  371. write_short( 10000 ) //duration
  372. write_short( 0 ) //hold
  373. write_short( SF_FADE_IN + SF_FADE_ONLYONE ) //flags
  374. write_byte( get_pcvar_num( p_glow_r ) ) //r
  375. write_byte( get_pcvar_num( p_glow_g ) ) //g
  376. write_byte( get_pcvar_num( p_glow_b ) ) //b
  377. write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
  378. message_end( )
  379. }
  380. }
  381.  
  382. public throw( id )
  383. {
  384. new target = client_data[id][GRABBED]
  385. if( target > 0 )
  386. {
  387. set_pev( target, pev_velocity, vel_by_aim( id, get_pcvar_num(p_throw_force) ) )
  388. unset_grabbed( id )
  389. return PLUGIN_HANDLED
  390. }
  391.  
  392. return PLUGIN_CONTINUE
  393. }
  394.  
  395. public unset_grabbed( id )
  396. {
  397. new target = client_data[id][GRABBED]
  398. if( target > 0 && pev_valid( target ) )
  399. {
  400. set_pev( target, pev_renderfx, kRenderFxNone )
  401. set_pev( target, pev_rendercolor, {255.0, 255.0, 255.0} )
  402. set_pev( target, pev_rendermode, kRenderNormal )
  403. set_pev( target, pev_renderamt, 16.0 )
  404.  
  405. if( 0 < target <= MAXPLAYERS )
  406. client_data[target][GRABBER] = 0
  407. }
  408. client_data[id][GRABBED] = 0
  409.  
  410. if( get_pcvar_num( p_fade ) )
  411. {
  412. message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
  413. write_short( 10000 ) //duration
  414. write_short( 0 ) //hold
  415. write_short( SF_FADEOUT ) //flags
  416. write_byte( get_pcvar_num( p_glow_r ) ) //r
  417. write_byte( get_pcvar_num( p_glow_g ) ) //g
  418. write_byte( get_pcvar_num( p_glow_b ) ) //b
  419. write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
  420. message_end( )
  421. }
  422. }
  423.  
  424. //Grabs onto someone
  425. public set_grabbed( id, target )
  426. {
  427. if( get_pcvar_num( p_glow ) )
  428. {
  429. new Float:color[3]
  430. color[0] = get_pcvar_float( p_glow_r )
  431. color[1] = get_pcvar_float( p_glow_g )
  432. color[2] = get_pcvar_float( p_glow_b )
  433. set_pev( target, pev_renderfx, kRenderFxGlowShell )
  434. set_pev( target, pev_rendercolor, color )
  435. set_pev( target, pev_rendermode, kRenderTransColor )
  436. set_pev( target, pev_renderamt, get_pcvar_float( p_glow_a ) )
  437. }
  438.  
  439. if( 0 < target <= MAXPLAYERS )
  440. client_data[target][GRABBER] = id
  441. client_data[id][FLAGS] = 0
  442. client_data[id][GRABBED] = target
  443. new Float:torig[3], Float:orig[3]
  444. pev( target, pev_origin, torig )
  445. pev( id, pev_origin, orig )
  446. client_data[id][GRAB_LEN] = floatround( get_distance_f( torig, orig ) )
  447. if( client_data[id][GRAB_LEN] < get_pcvar_num( p_min_dist ) ) client_data[id][GRAB_LEN] = get_pcvar_num( p_min_dist )
  448. }
  449.  
  450. public push( id )
  451. {
  452. client_data[id][FLAGS] ^= CDF_IN_PUSH
  453. return PLUGIN_HANDLED
  454. }
  455.  
  456. public pull( id )
  457. {
  458. client_data[id][FLAGS] ^= CDF_IN_PULL
  459. return PLUGIN_HANDLED
  460. }
  461.  
  462. public push2( id )
  463. {
  464. if( client_data[id][GRABBED] > 0 )
  465. {
  466. do_push( id )
  467. return PLUGIN_HANDLED
  468. }
  469. return PLUGIN_CONTINUE
  470. }
  471.  
  472. public pull2( id )
  473. {
  474. if( client_data[id][GRABBED] > 0 )
  475. {
  476. do_pull( id )
  477. return PLUGIN_HANDLED
  478. }
  479. return PLUGIN_CONTINUE
  480. }
  481.  
  482. public do_push( id )
  483. if( client_data[id][GRAB_LEN] < 9999 )
  484. client_data[id][GRAB_LEN] += get_pcvar_num( p_speed )
  485.  
  486. public do_pull( id )
  487. {
  488. new mindist = get_pcvar_num( p_min_dist )
  489. new len = client_data[id][GRAB_LEN]
  490.  
  491. if( len > mindist )
  492. {
  493. len -= get_pcvar_num( p_speed )
  494. if( len < mindist ) len = mindist
  495. client_data[id][GRAB_LEN] = len
  496. }
  497. else if( get_pcvar_num( p_auto_choke ) )
  498. do_choke( id )
  499. }
  500.  
  501. public do_choke( id )
  502. {
  503. new target = client_data[id][GRABBED]
  504. if( client_data[id][FLAGS] & CDF_NO_CHOKE || id == target || target > MAXPLAYERS) return
  505.  
  506. new dmg = get_pcvar_num( p_choke_dmg )
  507. new vec[3]
  508. FVecIVec( get_target_origin_f( target ), vec )
  509.  
  510. message_begin( MSG_ONE, SVC_SCREENSHAKE, _, target )
  511. write_short( 999999 ) //amount
  512. write_short( 9999 ) //duration
  513. write_short( 999 ) //frequency
  514. message_end( )
  515.  
  516. message_begin( MSG_ONE, SVC_SCREENFADE, _, target )
  517. write_short( 9999 ) //duration
  518. write_short( 100 ) //hold
  519. write_short( SF_FADE_MODULATE ) //flags
  520. write_byte( get_pcvar_num( p_glow_r ) ) //r
  521. write_byte( get_pcvar_num( p_glow_g ) ) //g
  522. write_byte( get_pcvar_num( p_glow_b ) ) //b
  523. write_byte( 200 ) //a
  524. message_end( )
  525.  
  526. message_begin( MSG_ONE, WTF_DAMAGE, _, target )
  527. write_byte( 0 ) //damage armor
  528. write_byte( dmg ) //damage health
  529. write_long( DMG_CRUSH ) //damage type
  530. write_coord( vec[0] ) //origin[x]
  531. write_coord( vec[1] ) //origin[y]
  532. write_coord( vec[2] ) //origin[z]
  533. message_end( )
  534.  
  535. message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
  536. write_byte( TE_BLOODSTREAM )
  537. write_coord( vec[0] ) //pos.x
  538. write_coord( vec[1] ) //pos.y
  539. write_coord( vec[2] + 15 ) //pos.z
  540. write_coord( random_num( 0, 255 ) ) //vec.x
  541. write_coord( random_num( 0, 255 ) ) //vec.y
  542. write_coord( random_num( 0, 255 ) ) //vec.z
  543. write_byte( 70 ) //col index
  544. write_byte( random_num( 50, 250 ) ) //speed
  545. message_end( )
  546.  
  547. new health = pev( target, pev_health ) - dmg
  548. set_pev( target, pev_health, float( health ) )
  549. if( health < 1 ) dllfunc( DLLFunc_ClientKill, target )
  550.  
  551. emit_sound( target, CHAN_BODY, "player/PL_PAIN2.WAV", VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
  552.  
  553. client_data[id][FLAGS] ^= CDF_NO_CHOKE
  554. set_task( get_pcvar_float( p_choke_time ), "clear_no_choke", TSK_CHKE + id )
  555. }
  556.  
  557. public clear_no_choke( tskid )
  558. {
  559. new id = tskid - TSK_CHKE
  560. client_data[id][FLAGS] ^= CDF_NO_CHOKE
  561. }
  562.  
  563. //Grabs the client and teleports them to the admin
  564. public force_grab(id, level, cid)
  565. {
  566. if( !cmd_access( id, level, cid, 1 ) || !get_pcvar_num( p_enabled ) ) return PLUGIN_HANDLED
  567.  
  568. new arg[33]
  569. read_argv( 1, arg, 32 )
  570.  
  571. new targetid = cmd_target( id, arg, 1 )
  572.  
  573. if( is_grabbed( targetid, id ) ) return PLUGIN_HANDLED
  574. if( !is_user_alive( targetid ) )
  575. {
  576. client_print( id, print_console, "[AMXX] %L", id, "COULDNT" )
  577. return PLUGIN_HANDLED
  578. }
  579.  
  580. //Safe to tp target to aim spot?
  581. new Float:tmpvec[3], Float:orig[3], Float:torig[3], Float:trace_ret[3]
  582. new bool:safe = false, i
  583.  
  584. get_view_pos( id, orig )
  585. tmpvec = vel_by_aim( id, get_pcvar_num( p_min_dist ) )
  586.  
  587. for( new j = 1; j < 11 && !safe; j++ )
  588. {
  589. torig[0] = orig[0] + tmpvec[i] * j
  590. torig[1] = orig[1] + tmpvec[i] * j
  591. torig[2] = orig[2] + tmpvec[i] * j
  592.  
  593. traceline( tmpvec, torig, id, trace_ret )
  594.  
  595. if( get_distance_f( trace_ret, torig ) ) break
  596.  
  597. engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
  598. if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen ) )
  599. safe = true
  600. }
  601.  
  602. //Still not safe? Then find another safe spot somewhere around the grabber
  603. pev( id, pev_origin, orig )
  604. new try[3]
  605. orig[2] += 2
  606. while( try[2] < 3 && !safe )
  607. {
  608. for( i = 0; i < 3; i++ )
  609. switch( try[i] )
  610. {
  611. case 0 : torig[i] = orig[i] + ( i == 2 ? 80 : 40 )
  612. case 1 : torig[i] = orig[i]
  613. case 2 : torig[i] = orig[i] - ( i == 2 ? 80 : 40 )
  614. }
  615.  
  616. traceline( tmpvec, torig, id, trace_ret )
  617.  
  618. engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
  619. if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen )
  620. && !get_distance_f( trace_ret, torig ) ) safe = true
  621.  
  622. try[0]++
  623. if( try[0] == 3 )
  624. {
  625. try[0] = 0
  626. try[1]++
  627. if( try[1] == 3 )
  628. {
  629. try[1] = 0
  630. try[2]++
  631. }
  632. }
  633. }
  634.  
  635. if( safe )
  636. {
  637. set_pev( targetid, pev_origin, torig )
  638. set_grabbed( id, targetid )
  639. screenfade_in( id )
  640. }
  641. else client_print( id, print_chat, "[AMXX] %L", id, "COULDNT" )
  642.  
  643. return PLUGIN_HANDLED
  644. }
  645.  
  646. public is_grabbed( target, grabber )
  647. {
  648. for( new i = 1; i <= MAXPLAYERS; i++ )
  649. if( client_data[i][GRABBED] == target )
  650. {
  651. client_print( grabber, print_chat, "[AMXX] %L", grabber, "ALREADY" )
  652. unset_grabbed( grabber )
  653. return true
  654. }
  655. return false
  656. }
  657.  
  658. public DeathMsg( )
  659. kill_grab( read_data( 2 ) )
  660.  
  661. public client_disconnect( id )
  662. {
  663. kill_grab( id )
  664. return PLUGIN_CONTINUE
  665. }
  666.  
  667. public kill_grab( id )
  668. {
  669. //If given client has grabbed, or has a grabber, unset it
  670. if( client_data[id][GRABBED] )
  671. unset_grabbed( id )
  672. else if( client_data[id][GRABBER] )
  673. unset_grabbed( client_data[id][GRABBER] )
  674. }
  675.  
  676. stock traceline( const Float:vStart[3], const Float:vEnd[3], const pIgnore, Float:vHitPos[3] )
  677. {
  678. engfunc( EngFunc_TraceLine, vStart, vEnd, 0, pIgnore, 0 )
  679. get_tr2( 0, TR_vecEndPos, vHitPos )
  680. return get_tr2( 0, TR_pHit )
  681. }
  682.  
  683. stock get_view_pos( const id, Float:vViewPos[3] )
  684. {
  685. new Float:vOfs[3]
  686. pev( id, pev_origin, vViewPos )
  687. pev( id, pev_view_ofs, vOfs )
  688.  
  689. vViewPos[0] += vOfs[0]
  690. vViewPos[1] += vOfs[1]
  691. vViewPos[2] += vOfs[2]
  692. }
  693.  
  694. stock Float:vel_by_aim( id, speed = 1 )
  695. {
  696. new Float:v1[3], Float:vBlah[3]
  697. pev( id, pev_v_angle, v1 )
  698. engfunc( EngFunc_AngleVectors, v1, v1, vBlah, vBlah )
  699.  
  700. v1[0] *= speed
  701. v1[1] *= speed
  702. v1[2] *= speed
  703.  
  704. return v1
  705. }


A hozzászólást 1 alkalommal szerkesztették, utoljára theglorious 2014.10.06. 17:19-kor.
Téma név!


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Átírás!
HozzászólásElküldve: 2014.09.29. 06:07 
Offline
Őskövület
Avatar

Csatlakozott: 2012.02.27. 09:42
Hozzászólások: 2588
Megköszönt másnak: 26 alkalommal
Megköszönték neki: 418 alkalommal
offok, hülyeség törölve.

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

_________________
Kép


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  [ 2 hozzászólás ] 


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 19 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