hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2024.04.27. 11:06



Jelenlévő felhasználók

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

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

Regisztrált felhasználók: nincs regisztrált felhasználó 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  [ 7 hozzászólás ] 
Szerző Üzenet
 Hozzászólás témája: Grab
HozzászólásElküldve: 2013.03.21. 16:46 
Offline
Félisten

Csatlakozott: 2012.06.19. 15:12
Hozzászólások: 926
Megköszönt másnak: 109 alkalommal
Megköszönték neki: 31 alkalommal
A grabot meg lehetne csinálni hogy csak az tudja használni akinek van A joga?

_________________
Kép


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.03.21. 16:53 
Offline
Veterán
Avatar

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

_________________
Valami új kezdete...
Kép
Egyedi pluginok készítése pénzért (Banki átutalás, PayPal) -> Privát üzenet

Ők köszönték meg crazy` nek ezt a hozzászólást: Tomos (2013.03.21. 16:58)
  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.03.21. 17:04 
Offline
Félisten

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

Nem mükdik az is tudja használni akinek nincs a joga

_________________
Kép


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.03.21. 17:13 
Offline
Veterán
Avatar

Csatlakozott: 2012.09.01. 22:19
Hozzászólások: 1697
Megköszönt másnak: 26 alkalommal
Megköszönték neki: 302 alkalommal
ADMIN_LEVEL_A-ra gondosz vagy a sima "a" jogra?

_________________
Valami új kezdete...
Kép
Egyedi pluginok készítése pénzért (Banki átutalás, PayPal) -> Privát üzenet


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.03.21. 17:53 
Offline
Félisten

Csatlakozott: 2012.06.19. 15:12
Hozzászólások: 926
Megköszönt másnak: 109 alkalommal
Megköszönték neki: 31 alkalommal
crazy` írta:
ADMIN_LEVEL_A-ra gondosz vagy a sima "a" jogra?

Admin level A

_________________
Kép


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.03.21. 17:54 
Offline
Veterán
Avatar

Csatlakozott: 2012.09.01. 22:19
Hozzászólások: 1697
Megköszönt másnak: 26 alkalommal
Megköszönték neki: 302 alkalommal
akkor úgy írd. tessék:

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

_________________
Valami új kezdete...
Kép
Egyedi pluginok készítése pénzért (Banki átutalás, PayPal) -> Privát üzenet


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.03.21. 18:30 
Offline
Signore Senior
Avatar

Csatlakozott: 2011.09.09. 17:39
Hozzászólások: 4020
Megköszönt másnak: 12 alkalommal
Megköszönték neki: 139 alkalommal
Search n' Get...

hlmod.hu/viewtopic.php?f=14&t=3528


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


Ki van itt

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