thetwistedpanda

Untitled

Sep 13th, 2013
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 17.18 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <sdkhooks>
  3. #include <tf2>
  4. #include <tf2_stocks>
  5. #include <sdktools>
  6.  
  7. #undef REQUIRE_PLUGIN
  8. #include <adminmenu>
  9. #define REQUIRE_PLUGIN
  10.  
  11. //* * * * * * * * * * * * * * * * * * * * * * * * * *
  12. //Defines
  13. //* * * * * * * * * * * * * * * * * * * * * * * * * *
  14. //- The default Field of Vision to apply to clients.
  15. #define cDefaultVision 90
  16.  
  17. //* * * * * * * * * * * * * * * * * * * * * * * * * *
  18. //Handles
  19. //* * * * * * * * * * * * * * * * * * * * * * * * * *
  20. new Handle:h_Mode = INVALID_HANDLE;             //ConVar for fov order.
  21. new Handle:h_MaxValue = INVALID_HANDLE;         //ConVar for max fov.
  22. new Handle:h_MinValue = INVALID_HANDLE;         //ConVar for min fov.
  23. new Handle:hTopMenu = INVALID_HANDLE;           //AdminMenu
  24.  
  25. //* * * * * * * * * * * * * * * * * * * * * * * * * *
  26. //Variables
  27. //* * * * * * * * * * * * * * * * * * * * * * * * * *
  28. new g_bEnding;                                  //Stores the state of round end.
  29.  
  30. //* * * * * * * * * * * * * * * * * * * * * * * * * *
  31. //Clients
  32. //* * * * * * * * * * * * * * * * * * * * * * * * * *
  33. new g_iCurrentVision[MAXPLAYERS + 1];           //Stores current FoV.
  34. new bool:g_bActiveVision[MAXPLAYERS + 1];       //Stores whether FoV is modified.
  35. new bool:g_bForcedVision[MAXPLAYERS + 1];       //Stores whether FoV is active from admin.
  36. new bool:g_bZoomVision[MAXPLAYERS + 1];         //
  37.  
  38. public Plugin:myinfo =
  39. {
  40.     name = "Strange FoV",
  41.     author = "Benjamin",
  42.     description = "What the fuuuuuuuuuuuuuuuuu...",
  43.     version = "1.1",
  44.     url = "http://steamcommunity.com/id/BenjaminHT/"
  45. }
  46.  
  47. public OnPluginStart()
  48. {
  49.     LoadTranslations("common.phrases");
  50.     LoadTranslations("sFoV_player.phrases");
  51.  
  52.     h_Mode = CreateConVar("sm_sfov_mode", "1", "Max FoV.", FCVAR_PLUGIN, true, 1.0, true, 2.0);
  53.     h_MaxValue = CreateConVar("sm_sfov_max", "170", "Max FoV.", FCVAR_PLUGIN, true, 90.0, true, 180.0);
  54.     h_MinValue = CreateConVar("sm_sfov_min", "20", "Min FoV.", FCVAR_PLUGIN, true, 0.0, true, 90.0);
  55.  
  56.     RegAdminCmd("sm_fov", Command_Vision, ADMFLAG_SLAY);
  57.  
  58.     AddCommandListener(attack2CallBack, "-attack2");
  59.  
  60.     //Client Events
  61.     HookEvent("player_spawn", Event_OnPlayerSpawn);
  62.     HookEvent("player_death", Event_OnPlayerDeath);
  63.     HookEvent("player_team", Event_OnPlayerTeam);
  64.    
  65.     //Round Events
  66.     HookEvent("teamplay_round_start", Event_OnRoundStart);
  67.     HookEvent("teamplay_round_win", Event_OnRoundEnd);
  68.     HookEvent("arena_round_start", Event_OnRoundStart);
  69.     HookEvent("arena_win_panel", Event_OnRoundEnd);
  70.  
  71.     new Handle:topmenu;
  72.     if (LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE))
  73.     {
  74.         OnAdminMenuReady(topmenu);
  75.     }
  76. }
  77.  
  78. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  79. //* Fires at the start of a new map, or after the plugin has been loaded.
  80. public OnMapStart()
  81. {
  82.     //Set the end of the round to False.
  83.     g_bEnding = false;
  84. }
  85.  
  86. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87. //* Fires at the end of the map, after everyone has disconnected but before map changes.
  88. public OnMapEnd()
  89. {
  90.     //Set the end of the round to True.
  91.     g_bEnding = true;
  92. }
  93.  
  94. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  95. //* Fires when a client physically disconnects or when the map is changing.
  96. public OnClientDisconnect(client)
  97. {
  98.     //Ignore if it wasn't a valid client (rare).
  99.     if(!IsClientInGame(client))
  100.         return;
  101.  
  102.     //Reset data back to defaults for next client.
  103.     g_bActiveVision[client] = false;
  104.     g_bForcedVision[client] = false;
  105.     g_iCurrentVision[client] = cDefaultVision;
  106. }
  107.  
  108. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  109. //* Fires when a client is officially in-game and is a valid target.
  110. public OnClientPutInServer(client)
  111. {
  112.     //Ignore if it wasn't a valid client (rare).
  113.     if(!IsClientInGame(client))
  114.         return;
  115.  
  116.     SDKHook(client, SDKHook_PostThink, OnPostThink);
  117. }
  118.  
  119. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  120. //* SDKHook_PostThink CallBack
  121. public OnPostThink(client)
  122. {
  123.     //Ignore if their vision is disabled, they're in the process of disconnecting, or dying.
  124.     if(!g_bActiveVision[client] || !IsClientInGame(client) || !IsPlayerAlive(client))
  125.         return;
  126.  
  127.     //If their current vision is negative, don't use that value!
  128.     new iVision = g_iCurrentVision[client];
  129.     if(iVision < 0)
  130.     {
  131.         iVision *= -1;
  132.     }
  133.    
  134.     //Apply the FoV.
  135.     SetEntProp(client, Prop_Send, "m_iFOV", iVision);
  136.  
  137.     //Increment their current FoV by one every frame.
  138.     g_iCurrentVision[client] += 1;
  139.  
  140.     //Determine FoV order
  141.     switch(GetConVarInt(h_Mode))
  142.     {
  143.         case 1:
  144.         {
  145.             //If the client is at the upper bounds, reverse.
  146.             if(g_iCurrentVision[client] >= GetConVarInt(h_MaxValue))
  147.             {
  148.                 //If their vision is 170, set it to -170 so that it counts down.
  149.                 g_iCurrentVision[client] *= -1;
  150.  
  151.                 return;
  152.             }
  153.  
  154.             //If the client is at the lower bounds, reverse. iVision is our non-negative.
  155.             if(iVision <= GetConVarInt(h_MinValue))
  156.             {
  157.                 //If their vision is -20, set it to 20 so that it counts up
  158.                 g_iCurrentVision[client] *= -1;
  159.                
  160.                 return;
  161.             }
  162.         }
  163.         case 2:
  164.         {
  165.             if(g_iCurrentVision[client] >= GetConVarInt(h_MaxValue))
  166.             {
  167.                 g_iCurrentVision[client] = GetConVarInt(h_MinValue);
  168.             }
  169.         }
  170.     }
  171. }
  172.  
  173. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  174. //* Fires at the end of Team Play or Arena. (Can't Confirm)
  175. public Action:Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
  176. {
  177.     //Set the end of the round to True.
  178.     g_bEnding = true;
  179.  
  180.     //Loop through all active players in-game.
  181.     for (new i = 1; i < MaxClients; i++)
  182.     {
  183.         if(!IsClientInGame(i) || IsFakeClient(i))
  184.             continue;
  185.  
  186.         //Disable any active effects, reset their vision.
  187.         if(g_bActiveVision[i])
  188.         {
  189.             SetClientVision(i, cDefaultVision);
  190.         }
  191.     }
  192. }
  193.  
  194. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  195. //* Fires at the start of Team Play or Arena. (Can't Confirm)
  196. public Action:Event_OnRoundStart(Handle:event, const String:name[], bool:dontBroadcast)
  197. {
  198.     //Set the end of the round to false.
  199.     g_bEnding = false;
  200. }
  201.  
  202. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  203. //* Fires on connection as well as every time a player spawns.
  204. public Action:Event_OnPlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
  205. {
  206.     //Get the client from the event.
  207.     new client = GetClientOfUserId(GetEventInt(event, "userid"));
  208.     if(!client || !IsClientInGame(client))
  209.     {
  210.         return Plugin_Continue;
  211.     }
  212.  
  213.     //Ignore any spawning attempts while the player is not alive (i.e. connecting)
  214.     if(!IsPlayerAlive(client))
  215.     {
  216.         return Plugin_Continue;
  217.     }
  218.  
  219.     //Re-apply the FoV effect if the client has had their state enabled.
  220.     if(g_bForcedVision[client])
  221.     {
  222.         SetClientVision(client, g_iCurrentVision[client]);
  223.     }
  224.  
  225.     return Plugin_Continue;
  226. }
  227.  
  228. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  229. //* Fires whenever a player dies in-game.
  230. public Action:Event_OnPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
  231. {
  232.     //Get the client from the event.
  233.     new client = GetClientOfUserId(GetEventInt(event, "userid"));
  234.     if(!client || !IsClientInGame(client))
  235.     {
  236.         return Plugin_Continue;
  237.     }
  238.  
  239.     //Reset the client's FoV if they had an active effect & disable it.
  240.     if(g_bActiveVision[client])
  241.     {
  242.         SetClientVision(client, cDefaultVision);
  243.     }
  244.  
  245.     return Plugin_Continue;
  246. }
  247.  
  248. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  249. //* Fires whenever a player changes their team.
  250. public Action:Event_OnPlayerTeam(Handle:event, const String:name[], bool:dontBroadcast)
  251. {
  252.     //Get the client from the event.
  253.     new client = GetClientOfUserId(GetEventInt(event, "userid"));
  254.     if(!client || !IsClientInGame(client))
  255.     {
  256.         return Plugin_Continue;
  257.     }
  258.  
  259.     //Reset the client's FoV if they join Spectate.
  260.     if(GetEventInt(event, "team") == _:TFTeam_Spectator)
  261.     {
  262.         g_bActiveVision[client] = false;
  263.         SetEntProp(client, Prop_Send, "m_iFOV", cDefaultVision);
  264.  
  265.         return Plugin_Continue;
  266.     }
  267.  
  268.     //Re-apply the FoV effect on team change just to be safe.
  269.     if(g_bForcedVision[client])
  270.     {
  271.         SetClientVision(client, g_iCurrentVision[client]);
  272.     }
  273.  
  274.     return Plugin_Continue;
  275. }
  276.  
  277. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  278. //* Simple stock for modifying the client's FoV.
  279. stock SetClientVision(client, range)
  280. {
  281.     if(range == cDefaultVision)
  282.     {
  283.         g_bActiveVision[client] = false;
  284.         SetEntProp(client, Prop_Send, "m_iFOV", cDefaultVision);
  285.     }
  286.     else
  287.     {
  288.         g_bActiveVision[client] = true;
  289.         SetEntProp(client, Prop_Send, "m_iFOV", range);
  290.     }
  291. }
  292.  
  293. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  294. //* CallBack for the vision command.
  295. public Action:Command_Vision(client, args)
  296. {
  297.     //Ignore the command if it's used during the end of the round.
  298.     if(g_bEnding)
  299.     {
  300.         ReplyToCommand(client, "[SM] This command can only be used during the round!");
  301.         return Plugin_Handled;
  302.     }
  303.  
  304.     if(!args)
  305.     {
  306.         //Console has no reason to toggle effects.
  307.         if(!client)
  308.         {
  309.             ReplyToCommand(client, "[SM] This command cannot be toggled on invalid clients!");
  310.             return Plugin_Handled;
  311.         }
  312.  
  313.         //Check to see if the client has self-access.
  314.         if(client && !CheckCommandAccess(client, "StrangeFoVSelf", ADMFLAG_GENERIC))
  315.         {
  316.             ReplyToCommand(client, "[SM] Usage: sm_fov");
  317.             return Plugin_Handled;
  318.         }
  319.  
  320.         g_bForcedVision[client] = !g_bForcedVision[client];
  321.         ShowActivity2(client, "[SM] ", "Set his/her StrangeFoV state to %s", g_bForcedVision[client] ? "on" : "off");
  322.         LogAction(client, client, "%L set his/her StrangeFoV state to %s", client, g_bForcedVision[client] ? "on" : "off");
  323.         return Plugin_Handled;
  324.     }
  325.  
  326.     if(args)
  327.     {
  328.         //Notify on the event of invalid.
  329.         if(args > 2)
  330.         {
  331.             ReplyToCommand(client, "[SM] This command cannot be toggled on invalid clients!");
  332.             return Plugin_Handled;
  333.         }
  334.  
  335.         //Check to see if the client has other-access.
  336.         if(client && !CheckCommandAccess(client, "StrangeFoVOther", ADMFLAG_GENERIC))
  337.         {
  338.             ReplyToCommand(client, "[SM] Usage: sm_fov <target> [optional: 0|1]");
  339.             return Plugin_Handled;
  340.         }
  341.  
  342.         //Declare necessary information to process command; grab argument string.
  343.         decl iBreak, String:sText[192], String:sPattern[64], String:sBuffer[64];
  344.         new iTargets[MAXPLAYERS + 1], bool:bTemp, bool:bState;
  345.         GetCmdArgString(sText, sizeof(sText));
  346.  
  347.         //Store pattern, check to see if there's an additional argument.
  348.         iBreak = BreakString(sText, sPattern, sizeof(sPattern));
  349.         if(iBreak != -1)
  350.         {
  351.             iBreak += BreakString(sText[iBreak], sBuffer, sizeof(sBuffer));
  352.             bState = bool:StringToInt(sBuffer);
  353.         }
  354.  
  355.         //Only let the command target non-bots currently in-game.
  356.         new iCount = ProcessTargetString(sPattern, client, iTargets, sizeof(iTargets), COMMAND_FILTER_NO_BOTS|COMMAND_FILTER_CONNECTED, sBuffer, sizeof(sBuffer), bTemp);
  357.         if(iCount)
  358.         {
  359.             //Loop through all clients currently in-game.
  360.             for (new i = 0; i < iCount; i++)
  361.             {
  362.                 if(!IsClientInGame(iTargets[i]))
  363.                 {
  364.                     continue;
  365.                 }
  366.  
  367.                 //BreakString returns -1 if there was no string to break, thus 1 parameter.
  368.                 if(iBreak == -1)
  369.                 {
  370.                     //No parameters, so toggle the client's current state.
  371.                     if(g_bForcedVision[iTargets[i]])
  372.                     {
  373.                         SetClientVision(iTargets[i], cDefaultVision);
  374.                     }
  375.                     else
  376.                     {
  377.                         SetClientVision(iTargets[i], g_iCurrentVision[iTargets[i]]);
  378.                     }
  379.  
  380.                     g_bForcedVision[iTargets[i]] = !g_bForcedVision[iTargets[i]];
  381.                     LogAction(client, iTargets[i], "%L set StrangeFoV on %L to %s", client, iTargets[i], g_bForcedVision[iTargets[i]] ? "on" : "off");
  382.                     ShowActivity2(client, "[SM] ", "Set StrangeFoV on %N to %s", iTargets[i], g_bForcedVision[iTargets[i]] ? "on" : "off");
  383.                 }
  384.                 else
  385.                 {
  386.                     //Second argument was specified, force whatever values are desired.
  387.                     if(bState)
  388.                     {
  389.                         //It's being enabled, ignore anyone that already has it.
  390.                         if(g_bForcedVision[iTargets[i]])
  391.                             continue;
  392.  
  393.                         g_bForcedVision[iTargets[i]] = true;
  394.                         SetClientVision(iTargets[i], g_iCurrentVision[iTargets[i]]);
  395.                         LogAction(client, iTargets[i], "%L set StrangeFoV on %L to %s", client, iTargets[i], g_bForcedVision[iTargets[i]] ? "on" : "off");
  396.                         ShowActivity2(client, "[SM] ", "Set StrangeFoV on %N to %s", iTargets[i], g_bForcedVision[iTargets[i]] ? "on" : "off");
  397.                     }
  398.                     else
  399.                     {
  400.                         //It's being disabled, ignore anyone that already doesn't have it.
  401.                         if(g_bForcedVision[iTargets[i]])
  402.                             continue;
  403.  
  404.                         g_bForcedVision[iTargets[i]] = false;
  405.                         SetClientVision(iTargets[i], cDefaultVision);
  406.                         LogAction(client, iTargets[i], "%L set StrangeFoV on %L to %s", client, iTargets[i], g_bForcedVision[iTargets[i]] ? "on" : "off");
  407.                         ShowActivity2(client, "[SM] ", "Set StrangeFoV on %N to %s", iTargets[i], g_bForcedVision[iTargets[i]] ? "on" : "off");
  408.                     }
  409.                 }
  410.             }
  411.         }
  412.     }
  413.  
  414.     return Plugin_Handled;
  415. }
  416.  
  417. public Action:attack2CallBack(client, const String:command[], argc)
  418. {
  419.     g_bForcedVision[client] = !g_bForcedVision[client];
  420.     if(GetEntProp(client, Prop_Send, "m_iFOV") == 90 && g_bForcedVision[client] == false)
  421.     {
  422.         g_bZoomVision[client] = false;
  423.     }
  424.     else
  425.     {
  426.         g_bZoomVision[client] = true;
  427.     }
  428.     if(GetEntProp(client, Prop_Send, "m_iFOV") == 90 && g_bForcedVision[client] == true)
  429.     {
  430.         g_bForcedVision[client] = !g_bForcedVision[client];
  431.     }
  432. }
  433.  
  434. public OnAdminMenuReady(Handle:topmenu)
  435. {
  436.     /* Block us from being called twice */
  437.     if (topmenu == hTopMenu)
  438.     {
  439.         return;
  440.     }
  441.  
  442.     /* Save the Handle */
  443.     hTopMenu = topmenu;
  444.  
  445.     /* Build the "Player Commands" category */
  446.     new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS);
  447.  
  448.     if (player_commands != INVALID_TOPMENUOBJECT)
  449.     {
  450.         AddToTopMenu(hTopMenu,
  451.             "sm_fov",
  452.             TopMenuObject_Item,
  453.             AdminMenu_FoV,
  454.             player_commands,
  455.             "sm_fov",
  456.             ADMFLAG_SLAY);
  457.     }
  458. }
  459.  
  460. public OnLibraryRemoved(const String:name[])
  461. {
  462.     if (strcmp(name, "adminmenu") == 0)
  463.     {
  464.         hTopMenu = INVALID_HANDLE;
  465.     }
  466. }
  467.  
  468. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  469. //* AdminMenu Callback - Only re-written cause of OCD.
  470. public AdminMenu_FoV(Handle:topmenu, TopMenuAction:action, TopMenuObject:object_id, param, String:buffer[], maxlength)
  471. {
  472.     switch(action)
  473.     {
  474.         case TopMenuAction_DisplayOption:
  475.         {
  476.             Format(buffer, maxlength, "%T", "sFoV player", param);
  477.         }
  478.         case TopMenuAction_SelectOption:
  479.         {
  480.             DisplayFoVMenu(param);
  481.         }
  482.     }
  483. }
  484.  
  485. DisplayFoVMenu(client)
  486. {
  487.     new Handle:hMenu = CreateMenu(MenuHandler_FoV);
  488.  
  489.     decl String:sBuffer[128], String:sDisplay[64], String:sUser[4];
  490.     Format(sBuffer, sizeof(sBuffer), "%T:", "sFoV player", client);
  491.     SetMenuTitle(hMenu, sBuffer);
  492.     SetMenuExitBackButton(hMenu, true);
  493.  
  494.     //These should be translations, but for now, just graphics.
  495.     new String:sActive[] = "[*]";
  496.     new String:sDisabled[] = "[  ]";
  497.    
  498.     //Loop through all active clients. Ignore bots and players the admin can't target.
  499.     // We're making our own loop instad of using AddTargetsToMenu to display the state
  500.     //  of the effect prior to toggling.
  501.     for(new i = 1; i <= MaxClients; i++)
  502.     {
  503.         if(!IsClientInGame(i) || IsFakeClient(i) || (client != i && CanUserTarget(client, i)))
  504.             continue;
  505.        
  506.         //Format the string so it shows who has it enabled/disabled.
  507.         //1) [ ] Panda
  508.         //2) [*] Benja
  509.         Format(sDisplay, sizeof(sDisplay), "%s %N", g_bForcedVision[i] ? sActive : sDisabled, i);
  510.        
  511.         //Pass the userid along so it's available.
  512.         IntToString(GetClientUserId(i), sUser, sizeof(sUser));
  513.         AddMenuItem(hMenu, sUser, sDisplay);
  514.     }
  515.  
  516.     DisplayMenu(hMenu, client, MENU_TIME_FOREVER);
  517. }
  518.  
  519. //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  520. //* Menu Callback - Only re-written cause of OCD.
  521. public MenuHandler_FoV(Handle:menu, MenuAction:action, param1, param2)
  522. {
  523.     switch(action)
  524.     {
  525.         case MenuAction_End:
  526.         {
  527.             CloseHandle(menu);
  528.         }
  529.         case MenuAction_Cancel:
  530.         {
  531.             if (param2 == MenuCancel_ExitBack && hTopMenu != INVALID_HANDLE)
  532.             {
  533.                 DisplayTopMenu(hTopMenu, param1, TopMenuPosition_LastCategory);
  534.             }
  535.         }
  536.         case MenuAction_Select:
  537.         {
  538.             decl String:info[32];
  539.             GetMenuItem(menu, param2, info, sizeof(info));
  540.  
  541.             new userid = StringToInt(info);
  542.             new target = GetClientOfUserId(userid);
  543.            
  544.             if(!target)
  545.             {
  546.                 PrintToChat(param1, "[SM] %t", "Player no longer available");
  547.             }
  548.             else if(!CanUserTarget(param1, target))
  549.             {
  550.                 PrintToChat(param1, "[SM] %t", "Unable to target");
  551.             }
  552.             else
  553.             {
  554.                 //Toggle the effect based on the current state.
  555.                 if(g_bForcedVision[target])
  556.                 {
  557.                     SetClientVision(target, cDefaultVision);
  558.                 }
  559.                 else
  560.                 {
  561.                     SetClientVision(target, g_iCurrentVision[target]);
  562.                 }
  563.  
  564.                 g_bForcedVision[target] = !g_bForcedVision[target];
  565.                 LogAction(param1, target, "%L set StrangeFoV on %L to %s", param1, target, g_bForcedVision[target] ? "on" : "off");
  566.                 ShowActivity2(param1, "[SM] ", "Set StrangeFoV on %N to %s", target, g_bForcedVision[target] ? "on" : "off");
  567.             }
  568.  
  569.             //Display the menu back to the admin, if possible.
  570.             if (IsClientInGame(param1) && !IsClientInKickQueue(param1))
  571.             {
  572.                 DisplayFoVMenu(param1);
  573.             }
  574.         }
  575.     }
  576. }
Advertisement
Add Comment
Please, Sign In to add comment