HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /*
  2.   Fordította: BBk - Death of Legend
  3. */
  4. #include <amxmodx>
  5. #include <fakemeta>
  6.  
  7. #define PLUGIN_NAME "Drop Nvg"
  8. #define PLUGIN_VERSION "3.1"
  9. #define PLUGIN_AUTHOR "tuty"
  10.  
  11. #define MINSZ Float:{ -23.160000, -13.660000, -0.050000 }
  12. #define MAXSZ Float:{ 11.470000, 12.780000, 6.720000 }
  13. #define HAS_NVGS (1<<0)
  14. #define USES_NVGS (1<<8)
  15. #define NVG_MODEL "models/w_nvg.mdl"
  16. #define PICKUP_SOUND "items/gunpickup2.wav"
  17. #define SOUND_NVGOFF "items/nvg_off.wav"
  18. #define SOUND_DROPNVG "common/bodydrop2.wav"
  19. #define get_user_nvg(%1) (get_pdata_int(%1,OFFSET_NVGOGGLES) & HAS_NVGS)
  20.  
  21. new bHasNVG[ 33 ];
  22. new gDropNvg;
  23. new gMessageNVG;
  24. new gEnableHud;
  25. new gDropOnDie;
  26.  
  27. const OFFSET_NVGOGGLES = 129;
  28. const LINUX_OFFSET_DIFF = 5;
  29.  
  30. new const gNVGClassname[] = "nvg_box";
  31. new Float:gRenderColor[ 3 ] = { 34.0, 139.0, 34.0 };
  32.  
  33. public plugin_init()
  34. {
  35. register_plugin( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR );
  36. register_forward( FM_Touch, "ForwardTouch" );
  37. register_logevent( "logevent_round_start", 2, "1=Round_Start" );
  38. register_event( "DeathMsg","drop_nvg","a" );
  39. register_clcmd( "dropnvg", "CommandDropNvg" );
  40.  
  41. gDropNvg = register_cvar( "drop_nvg", "1" );
  42. gEnableHud = register_cvar( "drop_nvg_hud", "1" );
  43. gDropOnDie = register_cvar( "drop_nvg_on_death", "1" );
  44.  
  45. gMessageNVG = get_user_msgid( "NVGToggle" );
  46. register_dictionary( "dropnvg.txt" );
  47. }
  48.  
  49.  
  50. public plugin_precache()
  51. {
  52. precache_model( NVG_MODEL );
  53. precache_sound( PICKUP_SOUND );
  54. precache_sound( SOUND_NVGOFF );
  55. precache_sound( SOUND_DROPNVG );
  56. }
  57.  
  58.  
  59. public CommandDropNvg( id )
  60. {
  61. if( !get_pcvar_num( gDropNvg ) )
  62. {
  63. client_print( id, print_center, "%L", id, "CANNOT_DROP_NVG" );
  64. return PLUGIN_HANDLED;
  65. }
  66.  
  67. if( !is_user_alive( id ) )
  68. {
  69. client_print( id, print_center, "%L", id, "MUST_BE_ALIVE" );
  70. return PLUGIN_HANDLED;
  71. }
  72.  
  73. if( !get_user_nvg( id ) )
  74. {
  75. client_print( id, print_center, "%L", id, "DONT_HAVE_NVG" );
  76. return PLUGIN_HANDLED;
  77. }
  78.  
  79. set_user_nvg( id, 0 );
  80.  
  81. new Float:iVelocity[ 3 ], Float:iOrigin[ 3 ];
  82. velocity_by_aim( id, random_num( 99, 201 ), iVelocity );
  83. pev( id, pev_origin, iOrigin );
  84.  
  85. iOrigin[ 0 ] += iVelocity[ 0 ];
  86. iOrigin[ 1 ] += iVelocity[ 1 ];
  87.  
  88. new nvgent = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) );
  89. set_pev( nvgent, pev_classname, gNVGClassname );
  90. engfunc( EngFunc_SetModel, nvgent, NVG_MODEL );
  91. engfunc( EngFunc_SetSize, nvgent, MINSZ, MAXSZ );
  92. set_pev( nvgent, pev_solid, SOLID_BBOX );
  93. set_pev( nvgent, pev_movetype, MOVETYPE_TOSS );
  94. set_pev( nvgent, pev_origin, iOrigin );
  95. engfunc( EngFunc_DropToFloor, nvgent );
  96. emit_sound( id, CHAN_WEAPON, SOUND_DROPNVG, VOL_NORM , ATTN_NORM , 0 , PITCH_NORM );
  97.  
  98. bHasNVG[ id ] = false;
  99. set_rendering( nvgent, kRenderFxGlowShell, gRenderColor, kRenderNormal, 70.0 );
  100. remove_user_nvg( id );
  101. client_print( id, print_center, "%L", id, "NVG_ON_FLOOR" );
  102.  
  103. return PLUGIN_HANDLED;
  104. }
  105.  
  106.  
  107. public ForwardTouch( ent, id )
  108. {
  109. if( !get_pcvar_num( gDropNvg ) || !pev_valid( ent ) )
  110. {
  111. return FMRES_IGNORED;
  112. }
  113.  
  114. new Classname[ 32 ];
  115. pev( ent, pev_classname, Classname, charsmax( Classname ) );
  116.  
  117. if( equal( Classname, gNVGClassname ) )
  118. {
  119. if( get_user_nvg( id ) )
  120. {
  121. client_print( id, print_center, "%L", id, "ALLREADY_HAVE_NVG" );
  122. return FMRES_IGNORED;
  123. }
  124.  
  125. bHasNVG[ id ] = true;
  126. set_user_nvg( id, 1 );
  127.  
  128. client_print( id, print_center, "%L", id, "PICK_UP_NVG" );
  129. emit_sound( id, CHAN_WEAPON, PICKUP_SOUND, VOL_NORM , ATTN_NORM , 0 , PITCH_NORM );
  130. set_pev( ent, pev_flags, FL_KILLME );
  131. }
  132.  
  133. return FMRES_IGNORED;
  134. }
  135.  
  136.  
  137. public logevent_round_start()
  138. {
  139. if( get_pcvar_num( gDropNvg ) == 1 )
  140. {
  141. new nvgent = FM_NULLENT;
  142. while( ( nvgent = engfunc( EngFunc_FindEntityByString, nvgent, "classname", gNVGClassname ) ) )
  143. {
  144. set_pev( nvgent, pev_flags, FL_KILLME );
  145. }
  146. }
  147. }
  148.  
  149.  
  150. public drop_nvg()
  151. {
  152. new id = read_data( 2 );
  153.  
  154. if( get_pcvar_num( gDropOnDie ) != 0 )
  155. {
  156. if( get_user_nvg( id ) )
  157. {
  158. new Float:iOrigin[ 3 ];
  159. pev( id, pev_origin, iOrigin );
  160.  
  161. new nvgent = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) );
  162. iOrigin[ 2 ] -= 36;
  163. engfunc( EngFunc_SetOrigin, nvgent, iOrigin );
  164.  
  165. if( !pev_valid( nvgent ) )
  166. {
  167. return PLUGIN_HANDLED;
  168. }
  169.  
  170. engfunc( EngFunc_SetModel, nvgent, NVG_MODEL );
  171. set_pev( nvgent, pev_classname, gNVGClassname );
  172. dllfunc( DLLFunc_Spawn, nvgent );
  173. set_pev( nvgent, pev_solid, SOLID_BBOX );
  174. set_pev( nvgent, pev_movetype, MOVETYPE_NONE );
  175. engfunc( EngFunc_SetSize, nvgent, MINSZ, MAXSZ );
  176. engfunc( EngFunc_DropToFloor, nvgent );
  177. bHasNVG[ id ] = false;
  178. set_rendering( nvgent, kRenderFxGlowShell, gRenderColor, kRenderNormal, 70.0 );
  179. remove_user_nvg( id );
  180. }
  181. }
  182.  
  183. return PLUGIN_HANDLED;
  184. }
  185.  
  186.  
  187. public client_putinserver( id )
  188. {
  189. if( get_pcvar_num( gEnableHud ) == 1 )
  190. {
  191. set_task( 14.0, "ShowHudInfo", id );
  192. }
  193. }
  194.  
  195.  
  196. public ShowHudInfo( id )
  197. {
  198. set_hudmessage( 255, 170, 0, -1.0, 0.10, 1, 6.0, 12.0 );
  199. show_hudmessage( id, "%L", id, "INFO_HUD_NVG" );
  200. }
  201.  
  202.  
  203. stock set_user_nvg( index, nvgoggles = 1 )
  204. {
  205. if( nvgoggles )
  206. {
  207. set_pdata_int( index, OFFSET_NVGOGGLES, get_pdata_int( index, OFFSET_NVGOGGLES ) | HAS_NVGS );
  208. }
  209.  
  210. else
  211. {
  212. set_pdata_int( index, OFFSET_NVGOGGLES, get_pdata_int( index, OFFSET_NVGOGGLES ) & ~HAS_NVGS );
  213. }
  214. }
  215.  
  216.  
  217. stock remove_user_nvg( index )
  218. {
  219. new iNvgs = get_pdata_int( index, OFFSET_NVGOGGLES, LINUX_OFFSET_DIFF );
  220.  
  221. if( !iNvgs )
  222. {
  223. return;
  224. }
  225.  
  226. if( iNvgs & USES_NVGS )
  227. {
  228. emit_sound( index, CHAN_ITEM, SOUND_NVGOFF, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
  229.  
  230. emessage_begin( MSG_ONE_UNRELIABLE, gMessageNVG, _, index );
  231. ewrite_byte( 0 );
  232. emessage_end();
  233. }
  234.  
  235. set_pdata_int( index, OFFSET_NVGOGGLES, 0, LINUX_OFFSET_DIFF );
  236. }
  237.  
  238.  
  239. stock set_rendering( iEnt, iRenderFx=kRenderFxNone, Float:flRenderColor[3]={255.0,255.0,255.0}, iRender=kRenderNormal, Float:flAmount=16.0 )
  240. {
  241. set_pev( iEnt, pev_renderfx, iRenderFx );
  242. set_pev( iEnt, pev_rendercolor, flRenderColor );
  243. set_pev( iEnt, pev_rendermode, iRender );
  244. set_pev( iEnt, pev_renderamt, flAmount );
  245. }
  246.