Advertisement
wopox3

Untitled

Jan 5th, 2017
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 23.63 KB | None | 0 0
  1. /**
  2.  *
  3.  * HotVision
  4.  *  by Numb
  5.  *
  6.  *
  7.  * Description:
  8.  *  This plugin gives some use for nightvision. Normally nightvision only helps in case
  9.  *  if players are close enough. This plugin makes all players visible in the dark, plus
  10.  *  it includes support for infrared (ability to see through some walls/objects),
  11.  *  heart-beat device (radar showing enemies with 1024 units range by default) what
  12.  *  refreshes every 2 seconds, advanced hotvision (not only players are fully visible
  13.  *  in dark places, but also other objects like hostages, weapons...). Also this plugin
  14.  *  includes a fix for switching off nightvision by "fullupdate" command or and when
  15.  *  starting to record a demo.
  16.  *
  17.  *
  18.  * Requires:
  19.  *  Engine
  20.  *  FakeMeta
  21.  *  HamSandWich
  22.  *
  23.  *
  24.  * Cvars:
  25.  *
  26.  *  + "hotvision_enabled" - state of the plugin.
  27.  *  - "2" - enabled with custom player render mod. [default]
  28.  *  - "1" - enabled.
  29.  *  - "0" - disabled.
  30.  *
  31.  *  + "hotvision_radar" - state of radar (heart-beat device).
  32.  *  - "2" - enabled with unlimited range.
  33.  *  - "1" - enabled. [default]
  34.  *  - "0" - disabled.
  35.  *
  36.  *  + "hotvision_radar_range" - range of radar (heart-beat device).
  37.  *  - "14189.0" - maximal unit distance available (range of the map).
  38.  *  - "1024.0" - half of radar radius. [default]
  39.  *  - "128.0" - minimal unit distance available.
  40.  *
  41.  *  + "hotvision_models" - hotvision for custom objects (hostages, weapons...).
  42.  *  - "1" - enabled. [default]
  43.  *  - "0" - disabled.
  44.  *
  45.  *  + "hotvision_walls" - ability to see through some walls (infrared).
  46.  *  - "1" - enabled. [default]
  47.  *  - "0" - disabled.
  48.  *
  49.  *  + "hotvision_effect_fix" - choice between editions to nightvision effect.
  50.  *  - "3" - original with fix, and custom effect in one.
  51.  *  - "2" - custom effect only (massive client FPS improvement). [default]
  52.  *  - "1" - original with fix.
  53.  *  - "0" - original without "fullupdate" fix.
  54.  *
  55.  *  + "hotvision_object_glow" - will players and custom objects emit light.
  56.  *  - "3" - enabled. [default]
  57.  *  - "2" - custom objects only.
  58.  *  - "1" - players only.
  59.  *  - "0" - disabled.
  60.  *
  61.  *  + "hotvision_brightness" - brightness of the map while in hotvision.
  62.  *  - from "a" to "z" - from darkest to brightest.
  63.  *  - from "A" to "Z" - brightest with controlled negative effect on light source edges.
  64.  *  - "!" - brightest with small negative effect on large light sources.
  65.  *  - "W" - brightest with visible enough negative effect. [default]
  66.  *  - ""  - use default map brightness.
  67.  *
  68.  *
  69.  * Additional Info:
  70.  *  Tested in Counter-Strike 1.6 with amxmodx 1.8.2 (dev build hg21). You can disable/edit
  71.  *  some features via cvars. Features like infrared (can be disabled/enabled), advanced
  72.  *  hotvision (disabled/enabled), heart-beat device (disable/enable and set range).
  73.  *  You may find servers what are using this plugin by following this link:
  74.  *  http://www.game-monitor.com/search.php?vars=hotvision=&game=cstrike
  75.  *
  76.  *
  77.  * Notes:
  78.  *  - Cvar changes take effect only at round start.
  79.  *  - Brightness negative effect is largest in dark areas.
  80.  *  - Using only custom nightvision effect makes radar more clear and improves client FPS massively.
  81.  *
  82.  *
  83.  * Warnings:
  84.  *  - Some maps may have sky glitches when infrared is enabled ("hotvision_walls" cvar).
  85.  *  - Using custom nightvision effect will not allow usage of flishlight while nightvision is active.
  86.  *
  87.  *
  88.  * ChangeLog:
  89.  *
  90.  *  + 2.1
  91.  *  - Fixed: Not showing if person has hotvision enabled when spectating.
  92.  *
  93.  *  + 2.0
  94.  *  - Added: Cvar "hotvision_brightness" to control brithness of the map while in hotvision.
  95.  *  - Added: Ability to disable custom player render mod via "hotvision_enabled" cvar.
  96.  *  - Added: Ability to find servers what are using this plugin.
  97.  *
  98.  *  + 1.9
  99.  *  - Added: Cvar "hotvision_object_glow" to choose will players and custom objects glow.
  100.  *  - Fixed: Players nightvision close-range light doesn't work for spectators as it should.
  101.  *
  102.  *  + 1.8
  103.  *  - Fixed: Fix related to impulse command - amxx ham module glitch. Plugin now also needs engine module.
  104.  *
  105.  *  + 1.7
  106.  *  - Added: Extra nightvision effect.
  107.  *  - Added: Ability to choose between nightvision effects (custom one results in much less client FPS drops).
  108.  *  - Added: Extra glowing effect on objects while in nightvision.
  109.  *  - Changed: Plugin uses less resources (improved massively).
  110.  *
  111.  *  + 1.6
  112.  *  - Added: Cvars for plugin configuration (takes effect at new round).
  113.  *  - Changed: Plugin uses less resources.
  114.  *  - Removed: Added notification instead of plugins_by_numb feature.
  115.  *
  116.  *  + 1.5
  117.  *  - Added: Cvar to disable plugins_by_numb feature (set "pbn_simple" to "1").
  118.  *
  119.  *  + 1.4
  120.  *  - Changed: Less CPU usage, more stability.
  121.  *
  122.  *  + 1.3
  123.  *  - Fixed: Error when someone disconnects and other person is spectating him.
  124.  *  - Fixed: Error when using "fullupdate" command.
  125.  *
  126.  *  + 1.2
  127.  *  - Fixed: Glitch that nightvision isn't always restored after "fullupdate" command.
  128.  *
  129.  *  + 1.1
  130.  *  - Fixed: Glitch with having nightvision when you shouldn't when spamming "fullupdate" command.
  131.  *  - Changed: Less CPU usage.
  132.  *
  133.  *  + 1.0
  134.  *  - First release.
  135.  *
  136.  *
  137.  * Downloads:
  138.  *  Amx Mod X forums: http://forums.alliedmods.net/showthread.php?p=1274017#post1274017
  139.  *
  140. **/
  141.  
  142. // ----------------------------------------- CONFIG START -----------------------------------------
  143.  
  144. // If you are having trouble with heart-beat device what can be caused by many hostages or other
  145. // plugins what use hostage system to show something on radar - please change this value to a
  146. // higher one. NOTE: Highest value what you can use is 255-maxplayers, and lowest value should be
  147. // maximal number of hostages what you can have on your server in some specific map.
  148. #define RADARID_OFFSET 16 // default: 16
  149.  
  150. // ------------------------------------------ CONFIG END ------------------------------------------
  151.  
  152.  
  153. #include <amxmodx>
  154. #include <engine>
  155. #include <fakemeta>
  156. #include <hamsandwich>
  157.  
  158. #define PLUGIN_NAME "HotVision"
  159. #define PLUGIN_VERSION  "2.1"
  160. #define PLUGIN_AUTHOR   "Numb"
  161.  
  162. #define m_fNvgState 129
  163. #define NVG_ACTIVATED (1<<8) // 256
  164. #define m_iFlashBattery 244
  165.  
  166. #define SetPlayerBit(%1,%2)    ( %1 |=  ( 1 << ( %2 & 31 ) ) )
  167. #define ClearPlayerBit(%1,%2)  ( %1 &= ~( 1 << ( %2 & 31 ) ) )
  168. #define CheckPlayerBit(%1,%2)  ( %1 &   ( 1 << ( %2 & 31 ) ) )
  169.  
  170. new g_iJustJoined;
  171. new g_iConnected;
  172. new g_iAlive;
  173. new g_iUpdateData;
  174. new g_iInNvg;
  175.  
  176. new g_iMsgId_SayText;
  177. new g_iMsgId_NVGToggle;
  178. new g_iMsgId_HostagePos;
  179. new g_iMsgId_HostageK;
  180. new g_iMsgId_Flashlight;
  181.  
  182. new g_iCvarHotVisionEnabled;
  183. new g_iCvarHotVisionRadar;
  184. new g_iCvarHotVisionRadarRange;
  185. new g_iCvarHotVisionModels;
  186. new g_iCvarHotVisionWalls;
  187. new g_iCvarHotVisionEffectFix;
  188. new g_iCvarHotVisionObjectGlow;
  189. new g_iCvarHotVisionBrightness;
  190.  
  191. new g_iDefaultBrightness[32];
  192. new g_iCustomBrightness[32];
  193. new Float:g_fRadarRange;
  194. new bool:g_bCustomEffect;
  195. new bool:g_bEffectFix;
  196. new bool:g_bPlrGlow;
  197. new bool:g_bModelGlow;
  198.  
  199. new bool:g_bHotVisionPlayers;
  200. new g_iMaxPlayers;
  201.  
  202. new g_iFwdFM_AddToFullPack;
  203. new g_iFwdFM_LightStyle;
  204.  
  205. public plugin_init()
  206. {
  207.     register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
  208.    
  209.     register_cvar("hotvision", PLUGIN_VERSION, (FCVAR_SERVER|FCVAR_SPONLY));
  210.    
  211.     RegisterHam(Ham_Spawn,                  "player", "Ham_Spawn_player_Post",          1);
  212.     RegisterHam(Ham_Killed,                 "player", "Ham_Killed_player_Post",         1);
  213.     //RegisterHam(Ham_Player_ImpulseCommands, "player", "Ham_Player_ImpulseCommands_Pre", 0); // ham module has glitches with this forward,
  214.    
  215.     unregister_forward(FM_LightStyle, g_iFwdFM_LightStyle, 0);
  216.     register_forward(FM_StartFrame, "FM_StartFrame_Pre", 0);
  217.     register_impulse(100, "client_impulse_flashlight"); // so I'm using engine function instead.
  218.    
  219.     register_event("ResetHUD",  "Event_ResetHUD",  "be");
  220.     register_event("HLTV",      "Event_NewRound",  "a", "1=0", "2=0");
  221.    
  222.     g_iMsgId_HostagePos = get_user_msgid("HostagePos");
  223.     g_iMsgId_HostageK   = get_user_msgid("HostageK");
  224.     g_iMsgId_NVGToggle  = get_user_msgid("NVGToggle");
  225.     g_iMsgId_SayText    = get_user_msgid("SayText");
  226.     g_iMsgId_Flashlight = get_user_msgid("Flashlight");
  227.    
  228.     register_message(g_iMsgId_NVGToggle, "Message_NVGToggle");
  229.    
  230.     g_iCvarHotVisionEnabled    = register_cvar("hotvision_enabled", "2");
  231.     g_iCvarHotVisionRadar      = register_cvar("hotvision_radar", "1");
  232.     g_iCvarHotVisionRadarRange = register_cvar("hotvision_radar_range", "1024.0");
  233.     g_iCvarHotVisionModels     = register_cvar("hotvision_models", "1");
  234.     g_iCvarHotVisionWalls      = register_cvar("hotvision_walls", "1");
  235.     g_iCvarHotVisionEffectFix  = register_cvar("hotvision_effect_fix", "2");
  236.     g_iCvarHotVisionObjectGlow = register_cvar("hotvision_object_glow", "3");
  237.     g_iCvarHotVisionBrightness = register_cvar("hotvision_brightness", "W");
  238.    
  239.     if( !g_iDefaultBrightness[0] )
  240.         g_iDefaultBrightness[0] = 'm';
  241.    
  242.     g_iMaxPlayers = clamp(get_maxplayers(), 1, 32);
  243. }
  244.  
  245. public plugin_precache()
  246.     g_iFwdFM_LightStyle = register_forward(FM_LightStyle, "FM_LightStyle_Pre", 0);
  247.  
  248. public plugin_cfg()
  249.     Event_NewRound();
  250.  
  251. public plugin_pause()
  252. {
  253.     message_begin(MSG_ALL, SVC_LIGHTSTYLE);
  254.     write_byte(0);
  255.     write_string(g_iDefaultBrightness);
  256.     message_end();
  257. }
  258.  
  259. public plugin_unpause()
  260. {
  261.     g_iConnected = 0;
  262.     g_iAlive = 0;
  263.     g_iUpdateData = 0;
  264.     g_iInNvg = 0;
  265.    
  266.     for( new iPlrId=1; iPlrId<=g_iMaxPlayers; iPlrId++ )
  267.     {
  268.         if( is_user_alive(iPlrId) )
  269.         {
  270.             SetPlayerBit(g_iConnected, iPlrId);
  271.             SetPlayerBit(g_iAlive, iPlrId);
  272.         }
  273.         else if( is_user_connected(iPlrId) )
  274.             SetPlayerBit(g_iConnected, iPlrId);
  275.     }
  276. }
  277.  
  278. public Event_NewRound()
  279. {
  280.     new iPluginState = clamp(get_pcvar_num(g_iCvarHotVisionEnabled), 0, 2);
  281.     if( iPluginState )
  282.     {
  283.         if( iPluginState==2 )
  284.             g_bHotVisionPlayers = true;
  285.         else
  286.             g_bHotVisionPlayers = false;
  287.        
  288.         if( clamp(get_pcvar_num(g_iCvarHotVisionModels), 0, 1) )
  289.         {
  290.             if( clamp(get_pcvar_num(g_iCvarHotVisionWalls), 0, 1) )
  291.                 state AllEnabled;
  292.             else
  293.                 state ModelsOnly;
  294.         }
  295.         else if( clamp(get_pcvar_num(g_iCvarHotVisionWalls), 0, 1) )
  296.             state WallsOnly;
  297.         else
  298.             state Default;
  299.        
  300.         switch( clamp(get_pcvar_num(g_iCvarHotVisionRadar), 0, 2) )
  301.         {
  302.             case 2:  g_fRadarRange = -1.0;
  303.             case 1:  g_fRadarRange = floatclamp(get_pcvar_float(g_iCvarHotVisionRadarRange), 128.0, 14189.0); // sqrt(8192*8192*3)
  304.             default: g_fRadarRange = 0.0;
  305.         }
  306.        
  307.         if( !g_iFwdFM_AddToFullPack )
  308.             g_iFwdFM_AddToFullPack = register_forward(FM_AddToFullPack, "FM_AddToFullPack_Post", 1);
  309.        
  310.         get_pcvar_string(g_iCvarHotVisionBrightness, g_iCustomBrightness, 31);
  311.        
  312.     }
  313.     else
  314.     {
  315.         if( g_iFwdFM_AddToFullPack )
  316.         {
  317.             unregister_forward(g_iFwdFM_AddToFullPack, 1);
  318.             g_iFwdFM_AddToFullPack = 0;
  319.         }
  320.         state Default;
  321.     }
  322.    
  323.     switch( clamp(get_pcvar_num(g_iCvarHotVisionEffectFix), 0, 3) )
  324.     {
  325.         case 3:
  326.         {
  327.             g_bCustomEffect = true;
  328.             g_bEffectFix = true;
  329.         }
  330.         case 2:
  331.         {
  332.             g_bCustomEffect = true;
  333.             g_bEffectFix = false;
  334.         }
  335.         case 1:
  336.         {
  337.             g_bCustomEffect = false;
  338.             g_bEffectFix = true;
  339.         }
  340.         default:
  341.         {
  342.             g_bCustomEffect = false;
  343.             g_bEffectFix = false;
  344.         }
  345.     }
  346.    
  347.     switch( clamp(get_pcvar_num(g_iCvarHotVisionObjectGlow), 0, 3) )
  348.     {
  349.         case 3:
  350.         {
  351.             g_bPlrGlow = true;
  352.             g_bModelGlow = true;
  353.         }
  354.         case 2:
  355.         {
  356.             g_bPlrGlow = false;
  357.             g_bModelGlow = true;
  358.         }
  359.         case 1:
  360.         {
  361.             g_bPlrGlow = true;
  362.             g_bModelGlow = false;
  363.         }
  364.         default:
  365.         {
  366.             g_bPlrGlow = false;
  367.             g_bModelGlow = false;
  368.         }
  369.     }
  370. }
  371.  
  372. public Event_ResetHUD(iPlrId)
  373. {
  374.     if( g_bEffectFix && g_iFwdFM_AddToFullPack )
  375.     {
  376.         if( CheckPlayerBit(g_iAlive, iPlrId) )
  377.         {
  378.             if( get_pdata_int(iPlrId, m_fNvgState, 5)&NVG_ACTIVATED )
  379.             {
  380.                 new iTaskId = (iPlrId+32);
  381.                 remove_task(iTaskId);
  382.                 set_task(0.1, "send_nvg_msg", iTaskId);
  383.                
  384.                 iTaskId += 32;
  385.                 remove_task(iTaskId);
  386.                 set_task(0.2, "send_nvg_msg", iTaskId);
  387.                
  388.                 iTaskId += 32;
  389.                 remove_task(iTaskId);
  390.                 set_task(0.3, "send_nvg_msg", iTaskId);
  391.                
  392.                 iTaskId += 32;
  393.                 if( task_exists(iTaskId) )
  394.                 {
  395.                     send_nvg_msg(iTaskId);
  396.                     remove_task(iTaskId);
  397.                 }
  398.                 set_task(0.4, "send_nvg_msg", iTaskId);
  399.             }
  400.         }
  401.         else if( pev(iPlrId, pev_iuser1)==4 )
  402.         {
  403.             new iSpectatedPerson = pev(iPlrId, pev_iuser2);
  404.             if( iSpectatedPerson>g_iMaxPlayers || iSpectatedPerson<=0 )
  405.                 return;
  406.             else if( !CheckPlayerBit(g_iAlive, iSpectatedPerson) )
  407.                 return;
  408.             else if( get_pdata_int(iSpectatedPerson, m_fNvgState, 5)&NVG_ACTIVATED )
  409.             {
  410.                 new iTaskId = (iPlrId+32);
  411.                 remove_task(iTaskId);
  412.                 set_task(0.1, "send_nvg_msg", iTaskId);
  413.                
  414.                 iTaskId += 32;
  415.                 remove_task(iTaskId);
  416.                 set_task(0.2, "send_nvg_msg", iTaskId);
  417.                
  418.                 iTaskId += 32;
  419.                 remove_task(iTaskId);
  420.                 set_task(0.3, "send_nvg_msg", iTaskId);
  421.                
  422.                 iTaskId += 32;
  423.                 if( task_exists(iTaskId) )
  424.                 {
  425.                     send_nvg_msg(iTaskId);
  426.                     remove_task(iTaskId);
  427.                 }
  428.                 set_task(0.4, "send_nvg_msg", iTaskId);
  429.             }
  430.         }
  431.     }
  432. }
  433.  
  434. public Message_NVGToggle(iMsgId, iMsgType, iPlrId)
  435. {
  436.     if( g_iFwdFM_AddToFullPack )
  437.     {
  438.         if( get_msg_arg_int(1) && g_fRadarRange )
  439.         {
  440.             if( !task_exists(iPlrId) )
  441.                 set_task(2.0, "refresh_radar", iPlrId, "", 0, "b");
  442.         }
  443.         else
  444.             remove_task(iPlrId);
  445.    
  446.         if( g_bCustomEffect )
  447.         {
  448.             set_pev(iPlrId, pev_effects, (pev(iPlrId, pev_effects)&~EF_DIMLIGHT)); // remove EF_DIMLIGHT;
  449.            
  450.             message_begin(MSG_ONE, g_iMsgId_Flashlight, _, iPlrId); // when enabeling nightvision custom effect,
  451.             write_byte(0);                      // make sure that flashlight is disabled
  452.             write_byte(get_pdata_int(iPlrId, m_iFlashBattery, 5));
  453.             message_end();
  454.            
  455.             if( !g_bEffectFix )
  456.                 return PLUGIN_HANDLED;
  457.         }
  458.     }
  459.     else
  460.         remove_task(iPlrId);
  461.    
  462.     return PLUGIN_CONTINUE;
  463. }
  464.  
  465. public client_putinserver(iPlrId)
  466. {
  467.     SetPlayerBit(g_iConnected, iPlrId);
  468.     SetPlayerBit(g_iJustJoined, iPlrId);
  469. }
  470.  
  471. public client_disconnect(iPlrId)
  472. {
  473.     ClearPlayerBit(g_iConnected, iPlrId);
  474.     ClearPlayerBit(g_iAlive, iPlrId);
  475.     ClearPlayerBit(g_iJustJoined, iPlrId);
  476.    
  477.     for( new iTaskId=iPlrId; iTaskId<=160; (iTaskId+=32) )
  478.         remove_task(iTaskId);
  479. }
  480.  
  481. public Ham_Spawn_player_Post(iPlrId)
  482. {
  483.     if( is_user_alive(iPlrId) && CheckPlayerBit(g_iConnected, iPlrId) )
  484.         SetPlayerBit(g_iAlive, iPlrId);
  485.    
  486.     if( CheckPlayerBit(g_iJustJoined, iPlrId) )
  487.     {
  488.         ClearPlayerBit(g_iJustJoined, iPlrId);
  489.        
  490.         message_begin(MSG_ONE, g_iMsgId_SayText, _, iPlrId);
  491.         write_byte(iPlrId);
  492.         write_string("^x03* ^x01This server has support for ^x04hotvision^x01 when using ^x04nightvision^x01.");
  493.         message_end();
  494.     }
  495. }
  496.  
  497. public Ham_Killed_player_Post(iPlrId)
  498. {
  499.     if( !is_user_alive(iPlrId) )
  500.         ClearPlayerBit(g_iAlive, iPlrId);
  501.    
  502.     for( new iTaskId=iPlrId; iTaskId<=160; (iTaskId+=32) )
  503.         remove_task(iTaskId);
  504. }
  505.  
  506. public client_impulse_flashlight(iPlrId) // flashlight doesn't work while in nightvision custom effect, so we block it to avoid glitches
  507. {
  508.     if( g_iFwdFM_AddToFullPack && g_bCustomEffect && CheckPlayerBit(g_iConnected, iPlrId) && CheckPlayerBit(g_iAlive, iPlrId) )
  509.     {
  510.         if( get_pdata_int(iPlrId, m_fNvgState, 5)&NVG_ACTIVATED )
  511.             return PLUGIN_HANDLED;
  512.     }
  513.    
  514.     return PLUGIN_CONTINUE;
  515. }
  516.  
  517. /* // this one is not yet fixed - ham module has glitches with this forward, so I must use engine for this one instead
  518. public Ham_Player_ImpulseCommands_Pre(iPlrId) // flashlight doesn't work while in nightvision custom effect, so we block it to avoid glitches
  519. {
  520.     if( g_iFwdFM_AddToFullPack && g_bCustomEffect && CheckPlayerBit(g_iConnected, iPlrId) && CheckPlayerBit(g_iAlive, iPlrId) )
  521.     {
  522.         if( get_pdata_int(iPlrId, m_fNvgState, 5)&NVG_ACTIVATED && pev(iPlrId, pev_impulse)==100 )
  523.             set_pev(iPlrId, pev_impulse, 0);
  524.     }
  525.    
  526.     return HAM_IGNORED;
  527. }
  528. */
  529.  
  530. public FM_LightStyle_Pre(iStyle, iVal[])
  531. {
  532.     if( !iStyle )
  533.         copy(g_iDefaultBrightness, 31, iVal);
  534. }
  535.  
  536. public FM_StartFrame_Pre()
  537.     g_iUpdateData = 4294967295; // 4294967296-1 == (((1<<31)*2)-1) == (1<<0)|(1<<1)|...|(1<<31) == (1<<32)-1
  538.  
  539. public FM_AddToFullPack_Post(iEsHandle, iE, iEnt, iHost, iHostFlags, iPlayer, iPSet) <AllEnabled>
  540. {
  541.     if( 1<=iHost<=g_iMaxPlayers && get_orig_retval() )
  542.     {
  543.         if( frame_nvg_update(iHost, iPlayer, iEsHandle, iEnt) )
  544.         {
  545.             if( get_es(iEsHandle, ES_RenderMode) || !pev_valid(iEnt) )
  546.                 return FMRES_IGNORED;
  547.            
  548.             static s_iModel[2];
  549.             pev(iEnt, pev_model, s_iModel, 1);
  550.            
  551.             if( s_iModel[0]=='m' )
  552.             {
  553.                 set_hotvision_object(iEsHandle);
  554.                 return FMRES_IGNORED;
  555.             }
  556.            
  557.             if( s_iModel[0]=='*' )
  558.             {
  559.                 set_hotvision_walls(iEsHandle);
  560.                 return FMRES_IGNORED;
  561.             }
  562.         }
  563.     }
  564.    
  565.     return FMRES_IGNORED;
  566. }
  567.  
  568. public FM_AddToFullPack_Post(iEsHandle, iE, iEnt, iHost, iHostFlags, iPlayer, iPSet) <ModelsOnly>
  569. {
  570.     if( 1<=iHost<=g_iMaxPlayers && get_orig_retval() )
  571.     {
  572.         if( frame_nvg_update(iHost, iPlayer, iEsHandle, iEnt) )
  573.         {
  574.             if( get_es(iEsHandle, ES_RenderMode) || !pev_valid(iEnt) )
  575.                 return FMRES_IGNORED;
  576.            
  577.             static s_iModel[2];
  578.             pev(iEnt, pev_model, s_iModel, 1);
  579.            
  580.             if( s_iModel[0]=='m' )
  581.             {
  582.                 set_hotvision_object(iEsHandle);
  583.                 return FMRES_IGNORED;
  584.             }
  585.         }
  586.     }
  587.    
  588.     return FMRES_IGNORED;
  589. }
  590.  
  591. public FM_AddToFullPack_Post(iEsHandle, iE, iEnt, iHost, iHostFlags, iPlayer, iPSet) <WallsOnly>
  592. {
  593.     if( 1<=iHost<=g_iMaxPlayers && get_orig_retval() )
  594.     {
  595.         if( frame_nvg_update(iHost, iPlayer, iEsHandle, iEnt) )
  596.         {
  597.             if( get_es(iEsHandle, ES_RenderMode) || !pev_valid(iEnt) )
  598.                 return FMRES_IGNORED;
  599.            
  600.             static s_iModel[2];
  601.             pev(iEnt, pev_model, s_iModel, 1);
  602.            
  603.             if( s_iModel[0]=='*' )
  604.             {
  605.                 set_hotvision_walls(iEsHandle);
  606.                 return FMRES_IGNORED;
  607.             }
  608.         }
  609.     }
  610.    
  611.     return FMRES_IGNORED;
  612. }
  613.  
  614. public FM_AddToFullPack_Post(iEsHandle, iE, iEnt, iHost, iHostFlags, iPlayer, iPSet) <Default>
  615. {
  616.     if( 1<=iHost<=g_iMaxPlayers && get_orig_retval() )
  617.         frame_nvg_update(iHost, iPlayer, iEsHandle, iEnt);
  618.    
  619.     return FMRES_IGNORED;
  620. }
  621.  
  622. public FM_AddToFullPack_Post(iEsHandle, iE, iEnt, iHost, iHostFlags, iPlayer, iPSet) <>
  623. {
  624.     if( g_iFwdFM_AddToFullPack )
  625.     {
  626.         unregister_forward(g_iFwdFM_AddToFullPack, 1);
  627.         g_iFwdFM_AddToFullPack = 0;
  628.     }
  629.    
  630.     return FMRES_IGNORED;
  631. }
  632.  
  633. public send_nvg_msg(iTaskId)
  634. {
  635.     if( !g_bEffectFix )
  636.         return;
  637.    
  638.     new iPlrId = (((iTaskId-1)%32)+1);
  639.    
  640.     if( CheckPlayerBit(g_iAlive, iPlrId) )
  641.     {
  642.         if( !(get_pdata_int(iPlrId, m_fNvgState, 5)&NVG_ACTIVATED) )
  643.             return;
  644.     }
  645.     else if( pev(iPlrId, pev_iuser1)==4 )
  646.     {
  647.         new iSpectated = pev(iPlrId, pev_iuser2);
  648.        
  649.         if( iSpectated>g_iMaxPlayers || iSpectated<=0 )
  650.             return;
  651.        
  652.         if( !CheckPlayerBit(g_iAlive, iSpectated) || !(get_pdata_int(iSpectated, m_fNvgState, 5)&NVG_ACTIVATED) )
  653.             return;
  654.     }
  655.     else
  656.         return;
  657.    
  658.     message_begin(MSG_ONE, g_iMsgId_NVGToggle, _, iPlrId);
  659.     write_byte(1);
  660.     message_end();
  661. }
  662.  
  663. public refresh_radar(iPlrId)
  664. {
  665.     if( CheckPlayerBit(g_iConnected, iPlrId) && CheckPlayerBit(g_iAlive, iPlrId) )
  666.     {
  667.         if( get_pdata_int(iPlrId, m_fNvgState, 5)&NVG_ACTIVATED )
  668.         {
  669.             new iTeam = get_user_team(iPlrId);
  670.             new Float:fOrigin[3], iOffsetId;
  671.            
  672.             if( g_fRadarRange<0.0 )
  673.             {
  674.                 for( new iEnemyId=1; iEnemyId<=g_iMaxPlayers; iEnemyId++ )
  675.                 {
  676.                     if( iEnemyId!=iPlrId && CheckPlayerBit(g_iConnected, iEnemyId) && CheckPlayerBit(g_iAlive, iEnemyId) && iTeam!=get_user_team(iEnemyId) )
  677.                     {
  678.                         pev(iEnemyId, pev_origin, fOrigin);
  679.                        
  680.                         iOffsetId = (RADARID_OFFSET+iEnemyId);
  681.                        
  682.                         message_begin(MSG_ONE, g_iMsgId_HostagePos, _, iPlrId);
  683.                         write_byte(1);
  684.                         write_byte(iOffsetId);
  685.                         engfunc(EngFunc_WriteCoord, fOrigin[0]);
  686.                         engfunc(EngFunc_WriteCoord, fOrigin[1]);
  687.                         engfunc(EngFunc_WriteCoord, fOrigin[2]);
  688.                         message_end();
  689.                        
  690.                         message_begin(MSG_ONE, g_iMsgId_HostageK, _, iPlrId);
  691.                         write_byte(iOffsetId);
  692.                         message_end();
  693.                     }
  694.                 }
  695.             }
  696.             else
  697.             {
  698.                 new Float:fMainOrigin[3];
  699.                 pev(iPlrId, pev_origin, fMainOrigin);
  700.                
  701.                 for( new iEnemyId=1; iEnemyId<=g_iMaxPlayers; iEnemyId++ )
  702.                 {
  703.                     if( iEnemyId!=iPlrId && CheckPlayerBit(g_iConnected, iEnemyId) && CheckPlayerBit(g_iAlive, iEnemyId) && iTeam!=get_user_team(iEnemyId) )
  704.                     {
  705.                         pev(iEnemyId, pev_origin, fOrigin);
  706.                        
  707.                         if( get_distance_f(fMainOrigin, fOrigin)>g_fRadarRange )
  708.                             continue;
  709.                        
  710.                         iOffsetId = (RADARID_OFFSET+iEnemyId);
  711.                        
  712.                         message_begin(MSG_ONE, g_iMsgId_HostagePos, _, iPlrId);
  713.                         write_byte(1);
  714.                         write_byte(iOffsetId);
  715.                         engfunc(EngFunc_WriteCoord, fOrigin[0]);
  716.                         engfunc(EngFunc_WriteCoord, fOrigin[1]);
  717.                         engfunc(EngFunc_WriteCoord, fOrigin[2]);
  718.                         message_end();
  719.                        
  720.                         message_begin(MSG_ONE, g_iMsgId_HostageK, _, iPlrId);
  721.                         write_byte(iOffsetId);
  722.                         message_end();
  723.                     }
  724.                 }
  725.             }
  726.            
  727.             return;
  728.         }
  729.     }
  730.    
  731.     remove_task(iPlrId);
  732. }
  733.  
  734. set_hotvision_plr(iEsHandle, bool:bNotSelfUpdate)
  735. {
  736.     if( g_bHotVisionPlayers )
  737.     {
  738.         set_es(iEsHandle, ES_RenderMode, kRenderTransAdd);
  739.         set_es(iEsHandle, ES_RenderAmt, 255);
  740.         set_es(iEsHandle, ES_RenderFx, kRenderFxFadeSlow);
  741.         set_es(iEsHandle, ES_RenderColor, {0, 0, 0});
  742.     }
  743.    
  744.     if( bNotSelfUpdate )
  745.     {
  746.         if( g_bPlrGlow )
  747.             set_es(iEsHandle, ES_Effects, (get_es(iEsHandle, ES_Effects)|EF_DIMLIGHT));
  748.     }
  749.     else if( g_bCustomEffect )
  750.         set_es(iEsHandle, ES_Effects, (get_es(iEsHandle, ES_Effects)|EF_BRIGHTLIGHT));
  751. }
  752.  
  753. set_hotvision_object(iEsHandle)
  754. {
  755.     set_es(iEsHandle, ES_RenderMode, kRenderTransAdd);
  756.     set_es(iEsHandle, ES_RenderAmt, 255);
  757.     set_es(iEsHandle, ES_RenderFx, kRenderFxDistort);
  758.     set_es(iEsHandle, ES_RenderColor, {0, 0, 0});
  759.     if( g_bModelGlow )
  760.         set_es(iEsHandle, ES_Effects, (get_es(iEsHandle, ES_Effects)|EF_DIMLIGHT));
  761. }
  762.  
  763. set_hotvision_walls(iEsHandle)
  764. {
  765.     set_es(iEsHandle, ES_RenderMode, kRenderTransTexture);
  766.     set_es(iEsHandle, ES_RenderAmt, 95);
  767.     set_es(iEsHandle, ES_RenderFx, kRenderFxNone);
  768.     set_es(iEsHandle, ES_RenderColor, {0, 0, 0});
  769. }
  770.  
  771. bool:frame_nvg_update(iPlrId, iUpdatingPlayer, iEsHandle, iEnt)
  772. {
  773.     if( CheckPlayerBit(g_iConnected, iPlrId) )
  774.     {
  775.         static s_iSpectatedPerson[33];
  776.        
  777.         if( CheckPlayerBit(g_iUpdateData, iPlrId) )
  778.         {
  779.             static bool:s_bOldNvg;
  780.             s_bOldNvg = (CheckPlayerBit(g_iInNvg, iPlrId)?true:false);
  781.            
  782.             ClearPlayerBit(g_iUpdateData, iPlrId);
  783.            
  784.             if( CheckPlayerBit(g_iAlive, iPlrId) )
  785.             {
  786.                 s_iSpectatedPerson[iPlrId] = iPlrId;
  787.                 if( get_pdata_int(iPlrId, m_fNvgState, 5)&NVG_ACTIVATED )
  788.                     SetPlayerBit(g_iInNvg, iPlrId);
  789.                 else
  790.                     ClearPlayerBit(g_iInNvg, iPlrId);
  791.             }
  792.             else if( pev(iPlrId, pev_iuser1)==4 )
  793.             {
  794.                 s_iSpectatedPerson[iPlrId] = pev(iPlrId, pev_iuser2);
  795.                 if( s_iSpectatedPerson[iPlrId]>g_iMaxPlayers || s_iSpectatedPerson[iPlrId]<=0 )
  796.                     ClearPlayerBit(g_iInNvg, iPlrId);
  797.                 else if( CheckPlayerBit(g_iAlive, s_iSpectatedPerson[iPlrId]) )
  798.                 {
  799.                     if( get_pdata_int(s_iSpectatedPerson[iPlrId], m_fNvgState, 5)&NVG_ACTIVATED )
  800.                         SetPlayerBit(g_iInNvg, iPlrId);
  801.                     else
  802.                         ClearPlayerBit(g_iInNvg, iPlrId);
  803.                 }
  804.                 else
  805.                     ClearPlayerBit(g_iInNvg, iPlrId);
  806.             }
  807.             else
  808.             {
  809.                 s_iSpectatedPerson[iPlrId] = 0;
  810.                 ClearPlayerBit(g_iInNvg, iPlrId);
  811.             }
  812.            
  813.             if( s_bOldNvg )
  814.             {
  815.                 if( !CheckPlayerBit(g_iInNvg, iPlrId) )
  816.                 {
  817.                     message_begin(MSG_ONE, SVC_LIGHTSTYLE, _, iPlrId);
  818.                     write_byte(0);
  819.                     write_string(g_iDefaultBrightness);
  820.                     message_end();
  821.                 }
  822.             }
  823.             else if( CheckPlayerBit(g_iInNvg, iPlrId) && g_iCustomBrightness[0] )
  824.             {
  825.                 message_begin(MSG_ONE, SVC_LIGHTSTYLE, _, iPlrId);
  826.                 write_byte(0);
  827.                 write_string(g_iCustomBrightness);
  828.                 message_end();
  829.             }
  830.         }
  831.        
  832.         if( CheckPlayerBit(g_iInNvg, iPlrId) )
  833.         {
  834.             if( iUpdatingPlayer )
  835.             {
  836.                 if( iPlrId==s_iSpectatedPerson[iPlrId] || iPlrId!=iEnt )
  837.                     set_hotvision_plr(iEsHandle, ((iEnt!=s_iSpectatedPerson[iPlrId])?true:false));
  838.                 //set_hotvision_plr(iEsHandle, ((iPlrId!=iEnt)?true:false));
  839.             }
  840.            
  841.             return true;
  842.         }
  843.     }
  844.     return false;
  845. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement