Advertisement
Caliber_

Gmod leak dump part 14: sethhack 2014

Dec 31st, 2017
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 93.02 KB | None | 0 0
  1. -- SethHack v4 coded by seth
  2. -- leaked by some giraffe
  3. -- credits to fr1kin for fixing this piece of shit i just uploaded
  4. -- hacks don't deserve money
  5.  
  6. local SH = {};
  7.  
  8. if(not CLIENT) then return; end
  9. print("SethHack V4.3 Loaded!");
  10.  
  11. TEAM_CONNECTING = 0;
  12. TEAM_UNASSIGNED = 1001;
  13. TEAM_SPECTATOR  = 1002;
  14.  
  15. NOTIFY_GENERIC = 0;
  16.  
  17. local gjreerhrtjhgerg=1;
  18. local gjregerhrterge=1;
  19. local gjregergghtry=1;
  20. local gjregerrthg=1;
  21. local gjrerthrgerg=1;
  22. local gjrerthgerg=1;
  23. local gjrerthrtgerg=1;
  24. local gjregtrhtrherg=1;
  25. local gjrerthrthgerg=1;
  26. local gjregtrhrtherg=1;
  27. local gjregeerghtrg=1;
  28. local gjretrhrtjuykgerg=1;
  29. local gjreulitugerg=1;
  30. local gjregwefgtheerg=1;
  31. local gjregqfrtjerg=1;
  32. local gjregeqwfjterg=1;
  33. local gjregerg=1;
  34. local gjrtrehtuykegerg=1;
  35. local gjrwefghteegerg=1;
  36. local gjrwefgehtregerg=1;
  37. local gjrwgreyrjegerg=1;
  38.  
  39. local fuck = function(...) return NULL end;
  40.  
  41. include("includes/init.lua");
  42. include("includes/extensions/table.lua");
  43. include("includes/extensions/string.lua");
  44. include("includes/extensions/math.lua");
  45. include("derma/derma_utils.lua");
  46. require("datastream");
  47.  
  48. local g = table.Copy(_G);
  49. local r = table.Copy(_R);
  50. local d = table.Copy(_G);
  51.  
  52. g.SH_SETCVAR = fuck;
  53. g.SH_SETNAME = fuck;
  54. g.SH_PURECC = fuck;
  55. g.SH_LUARUN = fuck;
  56. g.SH_SETSPEED = fuck;
  57. g.SH_COMMANDNUMBER = fuck;
  58. g.SH_ISDORMANT = fuck;
  59. g.SH_MODVER = fuck;
  60. g.SH_READFILE = fuck;
  61. g.SH_WRITEFILE = fuck;
  62. g.SH_SUPPRESSIPLOGS = fuck;
  63. g.SH_RUNSCRIPTS = fuck;
  64. g.SH_REGREAD = fuck;
  65. g.SH_REGWRITE = fuck;
  66. g.SH_hl2_ucmd_getprediction = fuck;
  67. g.SH_hl2_shotmanip = fuck;
  68.  
  69. local me = nil;
  70. local g_ents = {};
  71. local g_players = {};
  72.  
  73. local SH = {
  74.     vars = {},
  75.     cmds = {},
  76.     hooks = {},
  77.     binds = {},
  78.     funcs = {},
  79.     data = {},
  80.     custe = {},
  81.     tvars = {},
  82.     cvars = {},
  83.     badfiles = {},
  84.     traitors = {},
  85.     admins = {},
  86.     spect = {},
  87.     aimmodels = {},
  88.     aimfriends = {},
  89.     aimteams = {},
  90.     teamlist = {},
  91.     configs = {},
  92.     blockccs = {},
  93.     fnlogs = {},
  94.     fnblock = {},
  95.     CP = nil
  96. };
  97.  
  98. local menu = { aimtab = {} };
  99.  
  100. SH.cvars = {
  101.     {"sh_enabled", 1}, -- Hack should load
  102.     {"sh_panicmode", 0}, -- Panicmode (hooks don't run)
  103.     {"sh_logging_console", 0}, -- Log functions
  104.     {"sh_logging_file", 1}, -- Log functions
  105.     {"sh_blockrcc", 0}, -- Block RunConsoleCommand/:ConCommand()
  106.     {"sh_wallhack", 1}, -- Self explanatory
  107.     {"sh_wallhack_dist", 4092}, -- Max distance to see players
  108.     {"sh_wireframe", 1}, -- Wireframe wallhack
  109.     {"sh_solids", 0}, -- Solid chams
  110.     {"sh_esp", 1}, -- Self explanatory
  111.     {"sh_esp_showdist", 0}, -- Show player's distance on ESP
  112.     {"sh_esp_dist", 4092}, -- Max distance to see players
  113.     {"sh_esp_font", "DefaultFixedDropShadow"}, -- ESP Font
  114.     {"sh_esp_showgangs", 1}, -- Show gangwars gangs
  115.     {"sh_esp_col_r", 255}, -- ESP Color - Red
  116.     {"sh_esp_col_g", 0}, -- ESP Color - Green
  117.     {"sh_esp_col_b", 0}, -- ESP Color - Blue
  118.     {"sh_esp_col_a", 255}, -- ESP Color - Alpha
  119.     {"sh_lasereyes", 1}, -- Laser eye traces
  120.     {"sh_lasersights", 1}, -- Lser sight traces
  121.     {"sh_showadmins", 1}, -- Show admin list
  122.     {"sh_showdruggy", 1}, -- Show PERP drug info
  123.     {"sh_speedhack_speed", 2.5}, -- Speed of the speedhack
  124.     {"sh_targettraitors", 0}, -- Only target traitors
  125.     {"sh_ignoretraitors", 0}, -- Ignore traitors if you're a traitor
  126.     {"sh_ignoreadmins", 0}, -- Ignore admins
  127.     {"sh_targetplayers", 1}, -- Target players
  128.     {"sh_targetnpcs", 1}, -- Target NPCs
  129.     {"sh_targetents", 0}, -- Target ESP Ents
  130.     {"sh_ignorefriends", 0}, -- Ignore friends
  131.     {"sh_ignorenowep", 0}, -- Ignore players with no weapon
  132.     {"sh_dclos", 0}, -- Don't check LOS
  133.     {"sh_targetbones", 0}, -- Target bones
  134.     {"sh_aimbone", "Head"}, -- Bone to target when sh_targetbones = 1
  135.     {"sh_aimoffset_vert", 0}, -- Vertical aim offset
  136.     {"sh_aimoffset_hoz", 0}, -- Horizontal aim offset
  137.     {"sh_friendisenemy", 0}, -- Friends list is enemy list
  138.     {"sh_teamisenemy", 0}, -- Teams list is enemy list
  139.     {"sh_ulxungag", 0}, -- Bypass ulx gag
  140.     {"sh_fov", 0}, -- Zoooooom
  141.     {"sh_bhop", 0}, -- Bunnyhopping?
  142.     {"sh_friendlyfire", 1}, -- Target teammates
  143.     {"sh_nospread", 1}, -- Nospread
  144.     {"sh_maxfov", 180}, -- Max FOV
  145.     {"sh_antisnap", 0}, -- Antisnap
  146.     {"sh_antisnapspeed", 2}, -- Antisnap speed
  147.     {"sh_triggerbot", 1}, -- Triggerbot
  148.     {"sh_triggerbot_as", 0}, -- Triggerbot always shoot
  149.     {"sh_autoreload", 1}, -- Automatically reload weapon
  150.     {"sh_thirdperson", 0}, -- Thirdperson view
  151.     {"sh_thirdperson_dist", 10}, -- Default thirdperson distance
  152.     {"sh_disablecalcview", 0}, -- Stop calcview override
  153.     {"sh_norecoil", 1}, -- Norecoil for guns
  154.     {"sh_namechange", 0}, -- Namechanger
  155.     {"sh_updateversion", 0}, -- Version of the update (for changelog)
  156.     {"sh_iplogs", 1}, -- Show IP logs in console when a player connects?
  157.     {"sh_clientnoclip", 0}, -- Clientside noclip
  158.     {"sh_clientnoclip_speed", 1000}, -- Clientside noclip speed
  159.     {"sh_runscripts_auto", 0}, -- automatically run sh_runscripts
  160.     {"sh_logger_maxentries", 25},
  161.     {"sh_showspectators", 1},
  162.     {"sh_color_menu_r", 0},
  163.     {"sh_color_menu_g", 0},
  164.     {"sh_color_menu_b", 0},
  165.     {"sh_color_menu_a", 225},
  166.     {"sh_color_adminlist_r", 25},
  167.     {"sh_color_adminlist_g", 25},
  168.     {"sh_color_adminlist_b", 25},
  169.     {"sh_color_adminlist_a", 225},
  170.     {"sh_color_lasersights_r", 0},
  171.     {"sh_color_lasersights_g", 0},
  172.     {"sh_color_lasersights_b", 255},
  173.     {"sh_color_lasersights_a", 255},
  174.     {"sh_color_lasersights_point_r", 255},
  175.     {"sh_color_lasersights_point_g", 255},
  176.     {"sh_color_lasersights_point_b", 255},
  177.     {"sh_color_lasersights_point_a", 255}
  178. };
  179.  
  180. SH.IPSrch = "";
  181. SH.CmdSuffix = "fnwreno";
  182.  
  183. SH.vars = {
  184.     aim = false,
  185.     aimtarg = nil,
  186.     tlock = false,
  187.     chatting = false,
  188.     UpdateVersion = 1,
  189.     LastCommand = "",
  190. };
  191.  
  192. SH.nicebones = {
  193.     {"Head", "ValveBiped.Bip01_Head1"},
  194.     {"Neck", "ValveBiped.Bip01_Neck1"},
  195.     {"Spine", "ValveBiped.Bip01_Spine"},
  196.     {"Spine1", "ValveBiped.Bip01_Spine1"},
  197.     {"Spine2", "ValveBiped.Bip01_Spine2"},
  198.     {"Spine4", "ValveBiped.Bip01_Spine4"},
  199.     {"R Upperarm", "ValveBiped.Bip01_R_UpperArm"},
  200.     {"R Forearm", "ValveBiped.Bip01_R_Forearm"},
  201.     {"R Hand", "ValveBiped.Bip01_R_Hand"},
  202.     {"L Upperarm", "ValveBiped.Bip01_L_UpperArm"},
  203.     {"L Forearm", "ValveBiped.Bip01_L_Forearm"},
  204.     {"L Hand", "ValveBiped.Bip01_L_Hand"},
  205.     {"R Thigh", "ValveBiped.Bip01_R_Thigh"},
  206.     {"R Calf", "ValveBiped.Bip01_R_Calf"},
  207.     {"R Foot", "ValveBiped.Bip01_R_Foot"},
  208.     {"R Toes", "ValveBiped.Bip01_R_Toe0"},
  209.     {"L Thigh", "ValveBiped.Bip01_L_Thigh"},
  210.     {"L Calf", "ValveBiped.Bip01_L_Calf"},
  211.     {"L Foot", "ValveBiped.Bip01_L_Foot"},
  212.     {"L Toes", "ValveBiped.Bip01_L_Toe0"}
  213. };
  214.  
  215. g.SH_MODVER = g.SH_MODVER or 0;
  216.  
  217. g.hl2_shotmanip = g.hl2_shotmanip or g.SH_hl2_shotmanip;
  218. g.hl2_ucmd_getprediction = g.hl2_ucmd_getprediction or g.SH_hl2_ucmd_getprediction;
  219.  
  220. function SH.data.GetOption(key)
  221.     local rr = g.SH_REGREAD("igopt_"..key);
  222.     return false;
  223. end
  224.  
  225. function SH.data.SetOption(key, data)
  226.     g.SH_REGWRITE("igopt_"..key, data);
  227. end
  228.  
  229. function SH.data.GetOptionTab(key)
  230.     local go = SH.data.GetOption(key);
  231.     if(not go) then
  232.         return false;
  233.     end
  234.    
  235.     local t = {};
  236.     for a, b in g.pairs(g.string.Explode("$", go)) do
  237.         local strex = g.string.Explode("^", b);
  238.         t[strex[1]] = strex[2];
  239.     end
  240.    
  241.     return t;
  242. end
  243.  
  244. function SH.data.SetOptionTab(key, tab)
  245.     local tins = "";
  246.     for k, v in g.pairs(tab) do
  247.         tins = tins .. (g.tostring(k).."^"..g.tostring(v).."$");
  248.     end
  249.     SH.data.SetOption(key, g.string.sub(tins, 0, -2));
  250. end
  251.  
  252. local tConHistory = {};
  253. local vConFrame, vConHistory, vConEntry, vConEnter;
  254.  
  255. local q = SH.data.GetOptionTab("ESPEnts");
  256. if(q) then
  257.     for k, v in g.pairs(q) do
  258.         SH.custe[k] = true;
  259.         g.print("[SethHack] Loaded custom ent:", k);
  260.     end
  261. end
  262.  
  263. q = SH.data.GetOptionTab("Binds");
  264. if(q) then
  265.     for k, v in g.pairs(q) do
  266.         SH.binds[k] = v;
  267.         g.print("[SethHack] Loaded Bind: '"..k.."' = '"..v.."'");
  268.     end
  269. end
  270.  
  271. q = SH.data.GetOptionTab("Configs");
  272. if(q) then
  273.     for k, v in g.pairs(q) do
  274.         local t = {};
  275.         local expl1 = g.string.Explode("`", v);
  276.         for a, b in g.pairs(expl1) do
  277.             local expl2 = g.string.Explode("=", b);
  278.             if(expl2[1] and expl2[2]) then
  279.                 g.table.insert(t, {expl2[1], expl2[2]});
  280.             end
  281.         end
  282.         SH.configs[k] = t;
  283.         g.print("[SethHack] Loaded Config:", k);
  284.     end
  285. else
  286.     local ge = "";
  287.     for k, v in g.pairs(SH.cvars) do
  288.         ge = ge .. v[1] .. "=" .. v[2] .. "`";
  289.     end
  290.    
  291.     local t = {};
  292.     t["Default"] = ge;
  293.     SH.data.SetOptionTab("Configs", t);
  294.    
  295.     SH.configs["Default"] = g.table.Copy(SH.cvars);
  296.     g.print("[SethHack] Created initial Default config.");
  297. end
  298.  
  299. local oldHook = g.table.Copy(hook);
  300. local oldHookCall = hook.Call;
  301. local function newHookCall(name, gm, ...)
  302.     if(SH.hooks[name] and (g.ValidEntity(me) or name == "InitPostEntity") and (SH.GetCVNum("sh_panicmode") ~= 1 or name == "HUDPaintBackground")) then
  303.         oldHook.Call(name, gm, g.unpack(arg));
  304.         return SH.hooks[name](g.unpack(arg ));
  305.     end
  306.     return oldHook.Call(name, gm, g.unpack(arg));
  307. end
  308. g.hook.Call = newHookCall;
  309.  
  310. function SH:RegisterHook(name, func)
  311.     SH.hooks[name] = func;
  312. end
  313.  
  314. function SH:RegisterCommand(name, func)
  315.     SH.cmds[name] = func;
  316. end
  317.  
  318. function SH.sprint(...)
  319.     g.print(...);
  320.     if(g.IsValid(vConFrame)) then
  321.         local txt = g.table.concat({...}, g.string.rep(" ", 5));
  322.         g.table.insert(tConHistory, txt);
  323.         vConHistory:AddLine(txt);
  324.         vConHistory:PerformLayout();
  325.         vConHistory.VBar:SetScroll(vConHistory.VBar.CanvasSize);
  326.         vConEntry:SetText("");
  327.     end
  328. end
  329.  
  330. SH:RegisterCommand("bind", function(ply, cmd, args)
  331.     if(not args[1]) then SH.sprint("Bind requires a key (and an optional command!)"); return; end
  332.    
  333.     local key = "KEY_"..g.string.upper(args[1]);
  334.     local cmd = args[2];
  335.    
  336.     if(not g[key]) then
  337.         key = g.string.Replace(key, "KEY_", "");
  338.         key = g.string.Replace(key, "MOUSE", "MOUSE_");
  339.     end
  340.    
  341.     for k, v in g.pairs(SH.binds) do
  342.         if(v == cmd) then
  343.             SH.binds[k] = nil;
  344.            
  345.             local t = SH.data.GetOptionTab("Binds") or {};
  346.             t[k] = nil;
  347.             SH.data.SetOptionTab("Binds", t);
  348.         end
  349.     end
  350.    
  351.     if(not cmd) then
  352.         if(SH.binds[key]) then
  353.             SH.sprint("Key '"..key.."' is bound to '"..SH.binds[key].."'!");
  354.         else
  355.             SH.sprint("Key '"..key.."' is not bound!");
  356.             SH.sprint("Are you trying to bind this key? You need to specify a command!");
  357.         end
  358.         return;
  359.     end
  360.    
  361.     if(not g[key]) then SH.sprint("Key '"..key.."' is not a valid key!"); return; end
  362.     if(not SH.cmds[cmd]) then SH.sprint("Command '"..cmd.."' is not a valid command!"); return; end
  363.    
  364.     SH.binds[key] = cmd;
  365.    
  366.     local t = SH.data.GetOptionTab("Binds") or {};
  367.     t[key] = cmd;
  368.     SH.data.SetOptionTab("Binds", t);
  369.    
  370.     SH.sprint("Bound '"..key.."' to '"..cmd.."'!");
  371. end);
  372.  
  373. SH:RegisterCommand("unbind", function(ply, cmd, args)
  374.     if(not args[1]) then SH.sprint("Unbind requires a key!"); return; end
  375.    
  376.     local key = "KEY_"..g.string.upper(args[1]);
  377.    
  378.     if(not g[key]) then
  379.         key = g.string.Replace(key, "KEY_", "");
  380.         key = g.string.Replace(key, "MOUSE", "MOUSE_");
  381.     end
  382.    
  383.     if(not g[key]) then SH.sprint("Key '"..key.."' is not a valid key!"); return; end
  384.    
  385.     local t = SH.data.GetOptionTab("Binds") or {};
  386.     t[key] = nil;
  387.     SH.data.SetOptionTab("Binds", t);
  388.    
  389.     SH.sprint("Unbound '"..key.."'!");
  390. end);
  391.  
  392. SH:RegisterCommand("sh_commands", function()
  393.     for k, v in g.pairs(SH.cmds) do
  394.         SH.sprint(k);
  395.     end
  396. end);
  397.  
  398. g.rawset(_G, "__metatable", false);
  399. --g.rawset(hook, "__metatable", false);
  400. g.rawset(usermessage, "__metatable", false);
  401.  
  402. g.rawset(_G, "RunConsoleCommand", SH.myRunConsoleCommand);
  403. g.rawset(_G, "RunString", SH.myRunString);
  404. g.rawset(_G, "RunStringEx", SH.myRunStringEx);
  405. g.rawset(usermessage, "IncomingMessage", SH.myusermessageIncomingMessage);
  406.  
  407. hook = nil;
  408. RunConsoleCommand = nil;
  409. RunString = nil;
  410. RunStringEx = nil;
  411.  
  412. g.setmetatable(_G, {
  413.     __index = function(t , k)
  414.         if(k == "hook") then
  415.             return g.hook;
  416.         end
  417.         if(k == "require") then
  418.             return g.require;
  419.         end
  420.         if(k == "concommand") then
  421.             return g.concommand;
  422.         end
  423.         if(k == "engineConsoleCommand") then
  424.             return g.engineConsoleCommand;
  425.         end
  426.         if(k == "RunConsoleCommand") then
  427.             return SH.myRunConsoleCommand;
  428.         end
  429.         if(k == "RunString") then
  430.             return SH.myRunString;
  431.         end
  432.         if(k == "RunStringEx") then
  433.             return SH.myRunStringEx;
  434.         end
  435.     end,
  436.     __metatable = true,
  437. });
  438.  
  439. --[[g.setmetatable(hook, {
  440.     __index = function(t, k)
  441.         if(k == "Call") then
  442.             return g.hook.Call;
  443.         end
  444.     end,
  445.     __metatable = true,
  446. });--]]
  447.  
  448. g.setmetatable(usermessage, {
  449.     __index = function(t , k)
  450.         if(k == "IncomingMessage") then
  451.             return SH.myusermessageIncomingMessage;
  452.         end
  453.     end,
  454.     __metatable = true,
  455. });
  456.  
  457. function SH.randomString(spshv)
  458.     g.math.randomseed(g.CurTime());
  459.     local ret = "";
  460.     local len = g.math.random(5, 25);
  461.     for i = 0, len do
  462.         local ch = g.string.char(g.math.random(97, 122));
  463.         ret = ret .. ch;
  464.     end
  465.     if(not spshv) then
  466.         ret = ret .. SH.CmdSuffix;
  467.     end
  468.     return ret;
  469. end
  470. SH.CmdSuffix = SH.randomString(true);
  471.  
  472. for k, v in g.pairs(SH.cvars) do
  473.     local nn = SH.randomString();
  474.     g.CreateClientConVar(nn, SH.data.GetOption(v[1]) or v[2], false, false);
  475.     SH.tvars[v[1]] = {};
  476.     SH.tvars[v[1]][1] = g.type(v[1]) == "number" and g.GetConVarNumber(nn) or g.GetConVarString(nn);
  477.     SH.tvars[v[1]][2] = nn;
  478.     g.cvars.AddChangeCallback(nn, function(cvar, old, new)
  479.         if(g.string.len(new) >= 1 and new ~= " ") then
  480.             if(g.IsValid(vConFrame)) then
  481.                 vConHistory:AddLine("Updated " .. v[1] .. " to " .. new);
  482.                 vConHistory:PerformLayout();
  483.                 vConHistory.VBar:SetScroll(vConHistory.VBar.CanvasSize);
  484.                 vConEntry:SetText("");
  485.             end
  486.             SH.tvars[v[1]][1] = new;
  487.             SH.data.SetOption(v[1], new);
  488.         end
  489.     end);
  490.     SH:RegisterCommand(v[1], function(ply, cmd, args)
  491.         if(args[1]) then
  492.             g.RunConsoleCommand(nn, args[1]);
  493.         else
  494.             SH.sprint(v[1], g.GetConVarNumber(nn));
  495.         end
  496.     end);
  497.     SH:RegisterCommand(v[1].."_toggle", function(ply, cmd, args)
  498.         local ret = SH.GetCVNum(v[1]);
  499.         if(ret == 0) then
  500.             g.RunConsoleCommand(nn, "1");
  501.         else
  502.             g.RunConsoleCommand(nn, "0");
  503.         end
  504.     end);
  505. end
  506.  
  507. function SH.GetCVNum(cvar)
  508.     local val;
  509.     if(not SH.tvars[cvar]) then val = 0; else val = SH.tvars[cvar][1]; end
  510.     return g.tonumber(val or 0);
  511. end
  512.  
  513. function SH.GetCVStr(cvar)
  514.     local val;
  515.     if(not SH.tvars[cvar]) then val = ""; else val = SH.tvars[cvar][1]; end
  516.     return g.tostring(val or "");
  517. end
  518.  
  519. SH:RegisterCommand("help", function()
  520.     SH.sprint("Type 'sh_commands' for a list of SethHack commands.");
  521.     SH.sprint("Type 'bind KEY COMMAND' to bind a key. Type 'unbind KEY' to unbind it.");
  522. end);
  523.  
  524. -- Misc antidetection
  525.  
  526. SH.badcmds = {
  527.     "_____b__c",
  528.     "___m",
  529.     "sc",
  530.     "bg",
  531.     "bm",
  532.     "kickme",
  533.     "gw_iamacheater",
  534.     "imafaggot",
  535.     "birdcage_browse",
  536.     "reportmod",
  537.     "_fuckme",
  538.     "st_openmenu",
  539.     "_NOPENOPE",
  540.     "__ping",
  541.     "ar_check",
  542.     "GForceRecoil"
  543. };
  544. SH.noshowcmds = {
  545.     SH.CmdSuffix,
  546.     "wire_keyboard_press",
  547.     "cnc"
  548. };
  549.  
  550. function SH.myRunConsoleCommand(cmd, ...)
  551.     if(cmd == "ar_derpaherp" or cmd == "sethhack_anticheat" or cmd == "derp_cheat" or cmd == "derpseth" or cmd == "~__ac_sh" or cmd == "~___se_auth" or cmd == "VerifyPluginFiles") then
  552.         return;
  553.     end
  554.    
  555.     if(g.string.find(cmd, SH.CmdSuffix)) then
  556.         return g.RunConsoleCommand(cmd, ...);
  557.     end
  558.    
  559.     if(cmd == "__uc_" and g.string.find(g.tostring((...) or ""), "svi")) then
  560.         g.print("RCC blocked:", cmd);
  561.         return;
  562.     end
  563.    
  564.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  565.         g.table.remove(SH.fnlogs, 1);
  566.     end
  567.    
  568.     if(g.table.HasValue(SH.fnblock, "RunConsoleCommand")) then
  569.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "RunConsoleCommand", args = ((cmd and cmd or "") .. ", " .. g.tostring((...) or "")), status = "BLOCK"});
  570.         return;
  571.     end
  572.    
  573.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "RunConsoleCommand", args = ((cmd and cmd or "") .. ", " .. g.tostring((...) or "")), status = "OK"});
  574.    
  575.     if(SH.GetCVNum("sh_logging_console") == 1) then
  576.         g.print("["..g.os.date("%H:%M:%S").."] RunConsoleCommand:", cmd, ...);
  577.     end
  578.    
  579.     if(SH.GetCVNum("sh_logging_file") == 1) then
  580.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] RunConsoleCommand: " .. ((cmd and cmd or "") .. ", " .. g.tostring((...) or "")) .. "\n");
  581.     end
  582.    
  583.     if((g.table.HasValue(SH.badcmds, cmd) or g.table.HasValue(SH.blockccs, cmd)) and SH.GetCVNum("sh_logging_console") == 1) then
  584.         g.print("RCC Blocked:", cmd);
  585.         --return;
  586.     end
  587.    
  588.     if(cmd == "gi") then
  589.         g.print("[SH] LACB");
  590.         return g.RunConsoleCommand(
  591.             "gi",
  592.             "t={nups=0,what=\"C\",func=function: 039E8038,lastlinedefined=-1,source=\"=[C]\",currentline=-1,namewhat=\"\",linedefined=-1,short_src=\"[C]\",}"
  593.         );
  594.     end
  595.    
  596.     if(cmd == g.util.CRC(g.game.GetMap())) then
  597.         return;
  598.     end
  599.    
  600.     if(SH.GetCVNum("sh_blockrcc") ~= 1) then
  601.         return g.RunConsoleCommand(cmd, ...);
  602.     end
  603. end
  604.  
  605. function _R.Player.ConCommand(ply, cmd)
  606.     if(cmd == "ar_derpaherp" or cmd == "sethhack_anticheat" or cmd == "derp_cheat") then
  607.         return;
  608.     end
  609.    
  610.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  611.         g.table.remove(SH.fnlogs, 1);
  612.     end
  613.    
  614.     if(g.table.HasValue(SH.fnblock, ":ConCommand()")) then
  615.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = ":ConCommand()", args = cmd or "", status = "BLOCK"});
  616.         return;
  617.     end
  618.    
  619.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = ":ConCommand()", args = cmd or "", status = "OK"});
  620.    
  621.     if(SH.GetCVNum("sh_logging_console") == 1) then
  622.         g.print("["..g.os.date("%H:%M:%S").."] :ConCommand():", cmd);
  623.     end
  624.    
  625.     if(SH.GetCVNum("sh_logging_file") == 1) then
  626.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] :ConCommand(): " .. cmd .. "\n");
  627.     end
  628.    
  629.     if((g.table.HasValue(SH.badcmds, cmd) or g.table.HasValue(SH.blockccs, cmd)) and SH.GetCVNum("sh_logging_console") == 1) then
  630.         g.print(":ConCommand() Blocked:", cmd);
  631.         --return;
  632.     end
  633.    
  634.     if(SH.GetCVNum("sh_blockrcc") ~= 1 or g.string.find(cmd, SH.CmdSuffix)) then
  635.         return r.Player.ConCommand(ply, cmd);
  636.     end
  637. end
  638.  
  639. function SH.myusermessageIncomingMessage(name, um, ...)
  640.     if(name == "ttt_role") then
  641.         SH.traitors = {};
  642.         g.print("SH: Traitors reset");
  643.     end
  644.     return g.usermessage.IncomingMessage(name, um, ...);
  645. end
  646.  
  647. function SH.myRunString(code)
  648.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  649.         g.table.remove(SH.fnlogs, 1);
  650.     end
  651.    
  652.     if(g.table.HasValue(SH.fnblock, "RunString")) then
  653.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "RunString", args = code or "", status = "BLOCK"});
  654.         return;
  655.     end
  656.    
  657.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "RunString", args = code or "", status = "OK"});
  658.    
  659.     if(SH.GetCVNum("sh_logging_console") == 1) then
  660.         g.print("["..g.os.date("%H:%M:%S").."] RunString:", code);
  661.     end
  662.    
  663.     if(SH.GetCVNum("sh_logging_file") == 1) then
  664.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] RunString: " .. code .. "\n");
  665.     end
  666.    
  667.     return g.RunString(code);
  668. end
  669.  
  670. function SH.myRunStringEx(code, info)
  671.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  672.         g.table.remove(SH.fnlogs, 1);
  673.     end
  674.    
  675.     if(g.table.HasValue(SH.fnblock, "RunStringEx")) then
  676.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "RunStringEx", args = (code and code or "").. ", " .. (info and info or ""), status = "BLOCK"});
  677.         return;
  678.     end
  679.    
  680.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "RunStringEx", args = (code and code or "") .. ", " .. (info and info or ""), status = "OK"});
  681.    
  682.     if(SH.GetCVNum("sh_logging_console") == 1) then
  683.         g.print("["..g.os.date("%H:%M:%S").."] RunStringEx:", code);
  684.     end
  685.    
  686.     if(SH.GetCVNum("sh_logging_file") == 1) then
  687.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] RunStringEx(): " .. code .. "\n");
  688.     end
  689.    
  690.     return g.RunStringEx(code, info);
  691. end
  692.  
  693. function SH.myinclude(fn)
  694.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  695.         g.table.remove(SH.fnlogs, 1);
  696.     end
  697.    
  698.     if(g.table.HasValue(SH.fnblock, "include")) then
  699.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "include", args = fn or "", status = "BLOCK"});
  700.         return;
  701.     end
  702.    
  703.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "include", args = fn or "", status = "OK"});
  704.    
  705.     if(SH.GetCVNum("sh_logging_console") == 1) then
  706.         g.print("["..g.os.date("%H:%M:%S").."] include:", fn);
  707.     end
  708.    
  709.     if(SH.GetCVNum("sh_logging_file") == 1) then
  710.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] include: " .. fn .. "\n");
  711.     end
  712.    
  713.     return g.include(fn);
  714. end
  715.  
  716. function file.CreateDir(dir)
  717.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  718.         g.table.remove(SH.fnlogs, 1);
  719.     end
  720.    
  721.     if(g.table.HasValue(SH.fnblock, "file.CreateDir")) then
  722.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.CreateDir", args = dir or "", status = "BLOCK"});
  723.         return;
  724.     end
  725.    
  726.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.CreateDir", args = dir or "", status = "OK"});
  727.    
  728.     if(SH.GetCVNum("sh_logging_console") == 1) then
  729.         g.print("["..g.os.date("%H:%M:%S").."] file.CreateDir:", dir);
  730.     end
  731.    
  732.     if(SH.GetCVNum("sh_logging_file") == 1) then
  733.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.CreateDir(): " .. dir .. "\n");
  734.     end
  735.    
  736.     return g.file.CreateDir(dir);
  737. end
  738.  
  739. function file.Delete(fn)
  740.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  741.         g.table.remove(SH.fnlogs, 1);
  742.     end
  743.    
  744.     if(g.table.HasValue(SH.fnblock, "file.Delete")) then
  745.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Delete", args = fn or "", status = "BLOCK"});
  746.         return;
  747.     end
  748.    
  749.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Delete", args = fn or "", status = "OK"});
  750.    
  751.     if(SH.GetCVNum("sh_logging_console") == 1) then
  752.         g.print("["..g.os.date("%H:%M:%S").."] file.Delete:", fn);
  753.     end
  754.    
  755.     if(SH.GetCVNum("sh_logging_file") == 1) then
  756.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.Delete: " .. fn .. "\n");
  757.     end
  758.    
  759.     return g.file.Delete(fn);
  760. end
  761.  
  762. function file.Exists(fn, ad)
  763.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  764.         g.table.remove(SH.fnlogs, 1);
  765.     end
  766.    
  767.     if(g.table.HasValue(SH.fnblock, "file.Exists")) then
  768.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Exists", args = fn or "", status = "BLOCK"});
  769.         return;
  770.     end
  771.    
  772.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Exists", args = fn or "", status = "OK"});
  773.    
  774.     if(SH.GetCVNum("sh_logging_console") == 1) then
  775.         g.print("["..g.os.date("%H:%M:%S").."] file.Exists:", fn);
  776.     end
  777.    
  778.     if(SH.GetCVNum("sh_logging_file") == 1) then
  779.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.Exists: " .. fn .. "\n");
  780.     end
  781.    
  782.     return g.file.Exists(fn, ad);
  783. end
  784.  
  785. function file.ExistsEx(fn, ad)
  786.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  787.         g.table.remove(SH.fnlogs, 1);
  788.     end
  789.    
  790.     if(g.table.HasValue(SH.fnblock, "file.ExistsEx")) then
  791.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.ExistsEx", args = fn or "", status = "BLOCK"});
  792.         return;
  793.     end
  794.    
  795.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.ExistsEx", args = fn or "", status = "OK"});
  796.    
  797.     if(SH.GetCVNum("sh_logging_console") == 1) then
  798.         g.print("["..g.os.date("%H:%M:%S").."] file.ExistsEx:", fn);
  799.     end
  800.    
  801.     if(SH.GetCVNum("sh_logging_file") == 1) then
  802.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.ExistsEx: " .. fn .. "\n");
  803.     end
  804.    
  805.     return g.file.ExistsEx(fn, ad);
  806. end
  807.  
  808. function file.Find(fn)
  809.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  810.         g.table.remove(SH.fnlogs, 1);
  811.     end
  812.    
  813.     if(g.table.HasValue(SH.fnblock, "file.Find")) then
  814.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Find", args = fn or "", status = "BLOCK"});
  815.         return;
  816.     end
  817.    
  818.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Find", args = fn or "", status = "OK"});
  819.    
  820.     if(SH.GetCVNum("sh_logging_console") == 1) then
  821.         g.print("["..g.os.date("%H:%M:%S").."] file.Find:", fn);
  822.     end
  823.    
  824.     if(SH.GetCVNum("sh_logging_file") == 1) then
  825.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.Find: " .. fn .. "\n");
  826.     end
  827.    
  828.     return g.file.Find(fn);
  829. end
  830.  
  831. function file.FindDir(fn)
  832.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  833.         g.table.remove(SH.fnlogs, 1);
  834.     end
  835.    
  836.     if(g.table.HasValue(SH.fnblock, "file.FindDir")) then
  837.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.FindDir", args = fn or "", status = "BLOCK"});
  838.         return;
  839.     end
  840.    
  841.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.FindDir", args = fn or "", status = "OK"});
  842.    
  843.     if(SH.GetCVNum("sh_logging_console") == 1) then
  844.         g.print("["..g.os.date("%H:%M:%S").."] file.FindDir:", fn);
  845.     end
  846.    
  847.     if(SH.GetCVNum("sh_logging_file") == 1) then
  848.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.FindDir: " .. fn .. "\n");
  849.     end
  850.    
  851.     return g.file.FindDir(fn);
  852. end
  853.  
  854. function file.FindInLua(fn)
  855.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  856.         g.table.remove(SH.fnlogs, 1);
  857.     end
  858.    
  859.     if(g.table.HasValue(SH.fnblock, "file.FindInLua")) then
  860.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.FindInLua", args = fn or "", status = "BLOCK"});
  861.         return;
  862.     end
  863.    
  864.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.FindInLua", args = fn or "", status = "OK"});
  865.    
  866.     if(SH.GetCVNum("sh_logging_console") == 1) then
  867.         g.print("["..g.os.date("%H:%M:%S").."] file.FindInLua:", fn);
  868.     end
  869.    
  870.     if(SH.GetCVNum("sh_logging_file") == 1) then
  871.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.FindInLua: " .. fn .. "\n");
  872.     end
  873.    
  874.     return g.file.FindInLua(fn);
  875. end
  876.  
  877. function file.IsDir(fn)
  878.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  879.         g.table.remove(SH.fnlogs, 1);
  880.     end
  881.    
  882.     if(g.table.HasValue(SH.fnblock, "file.IsDir")) then
  883.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.IsDir", args = fn or "", status = "BLOCK"});
  884.         return;
  885.     end
  886.    
  887.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.IsDir", args = fn or "", status = "OK"});
  888.    
  889.     if(SH.GetCVNum("sh_logging_console") == 1) then
  890.         g.print("["..g.os.date("%H:%M:%S").."] file.IsDir:", fn);
  891.     end
  892.    
  893.     if(SH.GetCVNum("sh_logging_file") == 1) then
  894.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.IsDir: " .. fn .. "\n");
  895.     end
  896.    
  897.     return g.file.IsDir(fn);
  898. end
  899.  
  900. function file.Read(fn, ad)
  901.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  902.         g.table.remove(SH.fnlogs, 1);
  903.     end
  904.    
  905.     if(g.table.HasValue(SH.fnblock, "file.Read")) then
  906.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Read", args = fn or "", status = "BLOCK"});
  907.         return;
  908.     end
  909.    
  910.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Read", args = fn or "", status = "OK"});
  911.    
  912.     if(SH.GetCVNum("sh_logging_console") == 1) then
  913.         g.print("["..g.os.date("%H:%M:%S").."] file.Read:", fn);
  914.     end
  915.    
  916.     if(SH.GetCVNum("sh_logging_file") == 1) then
  917.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.Read: " .. fn .. "\n");
  918.     end
  919.    
  920.     return g.file.Read(fn, ad);
  921. end
  922.  
  923. function file.Size(fn)
  924.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  925.         g.table.remove(SH.fnlogs, 1);
  926.     end
  927.    
  928.     if(g.table.HasValue(SH.fnblock, "file.Size")) then
  929.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Size", args = fn or "", status = "BLOCK"});
  930.         return;
  931.     end
  932.    
  933.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Size", args = fn or "", status = "OK"});
  934.    
  935.     if(SH.GetCVNum("sh_logging_console") == 1) then
  936.         g.print("["..g.os.date("%H:%M:%S").."] file.Size:", fn);
  937.     end
  938.    
  939.     if(SH.GetCVNum("sh_logging_file") == 1) then
  940.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.Size: " .. fn .. "\n");
  941.     end
  942.    
  943.     return g.file.Size(fn);
  944. end
  945.  
  946. function file.Time(fn)
  947.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  948.         g.table.remove(SH.fnlogs, 1);
  949.     end
  950.    
  951.     if(g.table.HasValue(SH.fnblock, "file.Time")) then
  952.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Time", args = fn or "", status = "BLOCK"});
  953.         return;
  954.     end
  955.    
  956.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Time", args = fn or "", status = "OK"});
  957.    
  958.     if(SH.GetCVNum("sh_logging_console") == 1) then
  959.         g.print("["..g.os.date("%H:%M:%S").."] file.Time:", fn);
  960.     end
  961.    
  962.     if(SH.GetCVNum("sh_logging_file") == 1) then
  963.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.Time: " .. fn .. "\n");
  964.     end
  965.    
  966.     return g.file.Time(fn);
  967. end
  968.  
  969. function file.Write(fn, data)
  970.     if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  971.         g.table.remove(SH.fnlogs, 1);
  972.     end
  973.    
  974.     if(g.table.HasValue(SH.fnblock, "file.Write")) then
  975.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Write", args = fn or "", data or "", status = "BLOCK"});
  976.         return;
  977.     end
  978.    
  979.     g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "file.Write", args = fn or "", data or "", status = "OK"});
  980.    
  981.     if(SH.GetCVNum("sh_logging_console") == 1) then
  982.         g.print("["..g.os.date("%H:%M:%S").."] file.Write:", fn, data);
  983.     end
  984.    
  985.     if(SH.GetCVNum("sh_logging_file") == 1) then
  986.         g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] file.Write: " .. fn .. "/" .. data .. "\n");
  987.     end
  988.    
  989.     return g.file.Write(fn, data);
  990. end
  991.  
  992. if(datastream) then
  993.     function datastream.StreamToServer(handler, data, callback, acceptcallback)
  994.         if(#SH.fnlogs >= SH.GetCVNum("sh_logger_maxentries")) then
  995.             g.table.remove(SH.fnlogs, 1);
  996.         end
  997.        
  998.         if(g.table.HasValue(SH.fnblock, "datastream") or handler == "__ping") then
  999.             g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "datastream", args = handler or "", status = "BLOCK"});
  1000.             return;
  1001.         end
  1002.        
  1003.         local bad=false;
  1004.         local idx = g.string.Explode(":",me:SteamID())[3];
  1005.         if(idx and g.type(idx) == "string" and handler == idx) then
  1006.             if(gtype(data) == "table") then
  1007.                 for k, v in g.pairs(data) do
  1008.                     if(g.type(v) == "string") then
  1009.                         if(v == "SethHack" or v == "largevars") then
  1010.                             bad = true;
  1011.                         end
  1012.                     end
  1013.                 end
  1014.             end
  1015.         end
  1016.        
  1017.         if(bad) then
  1018.             print("blocked.");
  1019.             return;
  1020.         end
  1021.        
  1022.         g.table.insert(SH.fnlogs, {time = g.os.date("%H:%M:%S"), func = "datastream", args = handler or "", data or "", status = "OK"});
  1023.        
  1024.         if(SH.GetCVNum("sh_logging_console") == 1) then
  1025.             g.print("["..g.os.date("%H:%M:%S").."] datastream.StreamToServer:", handler);
  1026.         end
  1027.    
  1028.         if(SH.GetCVNum("sh_logging_file") == 1) then
  1029.             g.SH_WRITEFILE("logging.txt", "["..g.os.date("%H:%M:%S").."] datastream.StreamToServer: " .. handler .. "\n");
  1030.         end
  1031.    
  1032.         if(data and g.type(data) == "table" and data.reason and g.type(data.reason) == "string") then
  1033.             if(g.string.find(data.reason, "SQL Table") or g.string.find(data.reason, "Sethhack")) then
  1034.                 return;
  1035.             end
  1036.         end
  1037.        
  1038.         return g.datastream.StreamToServer(handler, data, callback, acceptcallback);
  1039.     end
  1040. end
  1041.  
  1042. if(SH.GetCVNum("sh_enabled") ~= 1) then
  1043.     g.concommand.Add("shenable" .. g.tostring(g.math.random(1111,9999)), function()
  1044.         g.RunConsoleCommand(SH.tvars["sh_enabled"][2], "1");
  1045.         g.SH_PURECC("retry");
  1046.     end);
  1047.    
  1048.     g.print("SH Disabled");
  1049.     return;
  1050. end
  1051.  
  1052. g.timer.Create("SHcheckMe", .1, 0, function()
  1053.     if(LocalPlayer():IsValid()) then
  1054.         me = LocalPlayer();
  1055.         _G.g_LocalPlayer = me;
  1056.         g.timer.Destroy("SHcheckMe");
  1057.     end
  1058. end);
  1059.  
  1060. function SH:SetVar(var, val)
  1061.     SH.vars[var] = val;
  1062. end
  1063.  
  1064. function SH.Bunnyhop()
  1065.     if(SH.vars["bhop"] or (SH.GetCVNum("sh_bhop") == 1 and g.input.IsKeyDown(g.KEY_SPACE))) then
  1066.         if(me:OnGround()) then
  1067.             g.RunConsoleCommand("+jump");
  1068.             g.timer.Simple(.1, function()
  1069.                 g.RunConsoleCommand("-jump");
  1070.             end);
  1071.         end
  1072.     end
  1073. end
  1074.  
  1075. SH:RegisterCommand("+sh_bhop", function() SH:SetVar("bhop",true); end);
  1076. SH:RegisterCommand("-sh_bhop", function() SH:SetVar("bhop",false); end);
  1077. SH:RegisterCommand("sh_bhop_toggle", function() SH.vars.bhop = not SH.vars.bhop end);
  1078. SH:RegisterHook("Think", SH.Bunnyhop);
  1079.  
  1080. SH:RegisterHook("Tick", function()
  1081.     g_ents = g.ents.GetAll();
  1082.     g_players = g.player.GetAll();
  1083.    
  1084.     if(_G.ulx and _G.ulx.gagUser) then
  1085.         if(SH.GetCVNum("sh_ulxungag") == 1) then
  1086.             _G.ulx.gagUser(false);
  1087.         end
  1088.     end
  1089.    
  1090.     for k, v in g.pairs(SH.traitors) do
  1091.         if(not g.ValidEntity(v)) then
  1092.             g.table.remove(SH.traitors, k);
  1093.         end
  1094.     end
  1095.    
  1096.     for k, v in g.pairs(SH.admins) do
  1097.         if(not g.ValidEntity(v) or not v:IsAdmin()) then
  1098.             g.table.remove(SH.admins, k);
  1099.         end
  1100.     end
  1101.    
  1102.     for k, v in g.pairs(SH.aimfriends) do
  1103.         if(not g.ValidEntity(v)) then
  1104.             g.table.remove(SH.aimfriends, k);
  1105.         end
  1106.     end
  1107.    
  1108.     for k, v in g.pairs(g_players) do
  1109.         if(g.ValidEntity(v:GetObserverTarget()) and v:GetObserverTarget():IsPlayer() and v:GetObserverTarget() == me) then
  1110.             if(not g.table.HasValue(SH.spect, v)) then
  1111.                 g.table.insert(SH.spect, v);
  1112.                 if(SH.GetCVNum("sh_showspectators") == 1) then
  1113.                     g.chat.AddText(g.Color(100, 100, 100),
  1114.                         "[SethHack] ", g.Color(255, 10, 10), v:Nick() .. " is now spectating you!"
  1115.                     );
  1116.                     g.surface.PlaySound("buttons/blip1.wav");
  1117.                 end
  1118.             end
  1119.         end
  1120.     end
  1121.    
  1122.     for k, v in g.pairs(SH.spect) do
  1123.         if(not g.ValidEntity(v) or not g.ValidEntity(v:GetObserverTarget()) or not v:GetObserverTarget():IsPlayer() or (v:GetObserverTarget() ~= me)) then
  1124.             g.table.remove(SH.spect, k);
  1125.             if(SH.GetCVNum("sh_showspectators") == 1) then
  1126.                 g.chat.AddText(g.Color(100, 100, 100),
  1127.                     "[SethHack] ", g.Color(255, 10, 10), v:Nick() .. " is no longer spectating you!"
  1128.                 );
  1129.             end
  1130.         end
  1131.     end
  1132.    
  1133.     if(_G.KARMA) then
  1134.         for k, v in g.ipairs(g_players) do
  1135.             if(v:Alive() and not g.table.HasValue(SH.traitors, v)) then
  1136.                 for x, y in g.pairs(r.Player.GetWeapons(v)) do
  1137.                     if(g.ValidEntity(y)) then
  1138.                         if(y.CanBuy and g.table.HasValue(y.CanBuy, ROLE_TRAITOR)) then
  1139.                             g.table.insert(SH.traitors, v);
  1140.                             g.chat.AddText(g.Color(100, 100, 100),
  1141.                                 "[SethHack] ", g.Color(255, 10, 10), v:Nick() .. " has traitor weapon " .. y:GetClass() .. "!"
  1142.                             );
  1143.                         end
  1144.                     end
  1145.                 end
  1146.             end
  1147.         end
  1148.     end
  1149.    
  1150.     if(SH.GetCVNum("sh_showadmins") == 1) then
  1151.         for k, v in g.ipairs(g_players) do
  1152.             if(v:IsAdmin() and not g.table.HasValue(SH.admins, v)) then
  1153.                 g.table.insert(SH.admins, v);
  1154.                 g.chat.AddText(g.Color(100, 100, 100), "[SethHack] ", g.Color(0, 255, 255), "Admin " .. v:Nick() .. " has joined!");
  1155.                 g.surface.PlaySound("buttons/blip1.wav");
  1156.             end
  1157.         end
  1158.     end
  1159.    
  1160.     if(SH.GetCVNum("sh_namechange") == 1) then
  1161.         if(#g_players > 1) then
  1162.             local pn = g.table.Random(g_players);
  1163.             if(pn ~= me:Nick()) then
  1164.                 g.SH_SETNAME(pn:Nick().. " ~");
  1165.             end
  1166.         end
  1167.     end
  1168. end);
  1169.  
  1170. SH:RegisterCommand("sh_print_traitors", function()
  1171.     SH.sprint("Traitors:");
  1172.     for k, v in g.pairs(SH.traitors) do
  1173.         SH.sprint("Name:", v:Nick());
  1174.     end
  1175. end);
  1176.  
  1177. function SH.BlowC4()
  1178.     if(not _G.KARMA) then
  1179.         g.chat.AddText(g.Color(100, 100, 100), "[SethHack] ", g.Color(0, 255, 255), "Gamemode does not appear to be TTT!");
  1180.         return;
  1181.     end
  1182.    
  1183.     if(_R.Player.IsTraitor and me:IsTraitor()) then
  1184.         g.chat.AddText(g.Color(100, 100, 100), "[SethHack] ", g.Color(0, 255, 255), "Cannot do this as traitor!");
  1185.         return;
  1186.     end
  1187.    
  1188.     for k, v in g.pairs(g.ents.FindByClass("ttt_c4")) do
  1189.         g.RunConsoleCommand("ttt_c4_disarm", v:EntIndex(), g.math.random(1000, 5000));
  1190.     end
  1191.    
  1192.     g.chat.AddText(g.Color(100, 100, 100), "[SethHack] ", g.Color(0, 255, 255), "Blown all C4!");
  1193. end
  1194. SH:RegisterCommand("sh_blowc4", SH.BlowC4);
  1195.  
  1196. SH.WFMat = g.CreateMaterial("SHWFMat", "Wireframe", {
  1197.     ["$basetexture"] = "models/wireframe",
  1198.     ["$ignorez"] = 1
  1199. });
  1200. SH.SLMat = g.CreateMaterial("SHSLMat", "UnlitGeneric", {
  1201.     ["$basetexture"] = "models/debug/debugwhite",
  1202.     ["$ignorez"] = 1
  1203. });
  1204. SH.ESPMat = g.Material("cable/redlaser");
  1205. SH.LZRMat = g.Material("sprites/bluelaser1");
  1206. SH.LZR2Mat = g.Material("Sprites/light_glow02_add_noz");
  1207.  
  1208. g.SetMaterialOverride = g.SetMaterialOverride or g.render.MaterialOverride;
  1209.  
  1210. function SH.Wallhack()
  1211.     if(SH.GetCVNum("sh_wallhack") ~= 1) then return; end
  1212.    
  1213.     g.cam.Start3D(g.EyePos(), g.EyeAngles())
  1214.         for k, v in g.ipairs(g_ents) do
  1215.             if(g.ValidEntity(v) and v ~= me) then
  1216.                 local valid = ((v:IsPlayer() and v:Alive() and v:Health() > 0) or
  1217.                 (v:IsNPC() and v:GetMoveType() ~= 0) or
  1218.                 SH.custe[v:GetClass()] or v:IsWeapon());
  1219.                
  1220.                 if(valid) then
  1221.                     local dst = v:GetPos():Distance(me:GetPos());
  1222.                     if(dst < SH.GetCVNum("sh_wallhack_dist")) then
  1223.                         if(SH.GetCVNum("sh_wireframe") == 1 or SH.GetCVNum("sh_solids") == 1) then
  1224.                             local col;
  1225.                             if(v:IsPlayer()) then
  1226.                                 col = g.team.GetColor(v:Team());
  1227.                                
  1228.                                 if(_G.KARMA and g.table.HasValue(SH.traitors, v)) then
  1229.                                     col = g.Color(255, 0, 0, 255);
  1230.                                 end
  1231.                                
  1232.                                 if(SH.GetCVNum("sh_lasereyes") == 1) then
  1233.                                     g.render.SetMaterial(SH.ESPMat);
  1234.                                    
  1235.                                     local pos, ang = SH.GetShootPos(v);
  1236.                                     g.render.DrawBeam(pos, v:GetEyeTrace().HitPos, 5, 0, 0, col);
  1237.                                 end
  1238.                                
  1239.                                 if(g.ValidEntity(v:GetEyeTrace().Entity) and v:GetEyeTrace().Entity == me) then
  1240.                                     print(v);
  1241.                                 end
  1242.                             elseif(v:IsWeapon()) then
  1243.                                 col = g.Color(255, 25, 25, 255);
  1244.                             else
  1245.                                 col = g.Color(25, 235, 25, 255);
  1246.                             end
  1247.                            
  1248.                             g.SetMaterialOverride(SH.GetCVNum("sh_solids") == 1 and SH.SLMat or SH.WFMat);
  1249.                             g.render.SetColorModulation(col.r / 255, col.g / 255, col.b / 255);
  1250.                             g.render.SetBlend(col.a / 255);
  1251.                             v:DrawModel();
  1252.                             g.SetMaterialOverride(nil);
  1253.                         else
  1254.                             g.cam.IgnoreZ(true);
  1255.                             v:DrawModel();
  1256.                             g.cam.IgnoreZ(false);
  1257.                         end
  1258.                     end
  1259.                 end
  1260.             end
  1261.         end
  1262.     g.cam.End3D();
  1263. end
  1264.  
  1265. function SH.LaserEyes()
  1266.     g.cam.Start3D(g.EyePos(), g.EyeAngles())
  1267.         if(SH.GetCVNum("sh_lasersights") == 1 and SH.GetCVNum("sh_thirdperson") == 0) then
  1268.             local vm = me:GetViewModel();
  1269.             if(vm and g.ValidEntity(me:GetActiveWeapon()) and g.ValidEntity(vm)) then
  1270.                 if(me:GetActiveWeapon():GetClass() ~= "weapon_physgun") then
  1271.                     local ai = vm:LookupAttachment("muzzle");
  1272.                     if(ai == 0) then
  1273.                         ai = vm:LookupAttachment("1");
  1274.                     end
  1275.                    
  1276.                     local tr = g.util.TraceLine(util.GetPlayerTrace(me));
  1277.                     if(vm:GetAttachment(ai)) then
  1278.                         g.render.SetMaterial(SH.LZRMat);
  1279.                         g.render.DrawBeam(vm:GetAttachment(ai).Pos, tr.HitPos, 4, 0, 12.5, g.Color(
  1280.                         SH.GetCVNum("sh_color_lasersights_r"),
  1281.                         SH.GetCVNum("sh_color_lasersights_g"),
  1282.                         SH.GetCVNum("sh_color_lasersights_b"),
  1283.                         SH.GetCVNum("sh_color_lasersights_a")));
  1284.                        
  1285.                         g.render.SetMaterial(SH.LZR2Mat);
  1286.                         g.render.DrawQuadEasy(tr.HitPos, (g.EyePos() - tr.HitPos):GetNormal(), 25, 25, g.Color(
  1287.                         SH.GetCVNum("sh_color_lasersights_point_r"),
  1288.                         SH.GetCVNum("sh_color_lasersights_point_g"),
  1289.                         SH.GetCVNum("sh_color_lasersights_point_b"),
  1290.                         SH.GetCVNum("sh_color_lasersights_point_a")), 0)
  1291.                     end
  1292.                 end
  1293.             end
  1294.         end
  1295.     g.cam.End3D();
  1296. end
  1297.  
  1298. function SH.RSSE()
  1299.     SH.Wallhack();
  1300.     SH.LaserEyes();
  1301. end
  1302.  
  1303. SH:RegisterHook("RenderScreenspaceEffects", SH.RSSE);
  1304.  
  1305. function SH.ESP()
  1306.     if(SH.GetCVNum("sh_esp") ~= 1) then return; end
  1307.     local ggn = "";
  1308.     g.surface.SetFont(SH.GetCVStr("sh_esp_font"));
  1309.     for k, v in g.ipairs(g_ents) do
  1310.         if(g.ValidEntity(v) and (v:GetPos():Distance(me:GetPos()) < SH.GetCVNum("sh_esp_dist"))) then
  1311.             if(v:IsPlayer()) then
  1312.                 if(g.ValidEntity(v) and v:Alive() and v ~= me) then
  1313.                     if(v:Team() ~= g.TEAM_SPECTATOR and v:Team() ~= 1002) then
  1314.                         local txt, rank, wep, dist, health, armor, gang = "", "", "", "", "", "", "";
  1315.                        
  1316.                         if(v:IsAdmin()) then rank = " - [A]"; end
  1317.                         if(v:IsSuperAdmin()) then rank = " - [SA]"; end
  1318.                        
  1319.                         local col = g.team.GetColor(v:Team());
  1320.                        
  1321.                         if(g.ValidEntity(v:GetActiveWeapon())) then
  1322.                             wep = g.string.gsub(v:GetActiveWeapon():GetPrintName(), "#HL2_", "");
  1323.                             wep = g.string.gsub(wep, "#GMOD_", "");
  1324.                         end
  1325.                                
  1326.                         health = " - " .. v:Health() .. "H";
  1327.                         armor = "," .. v:Armor() .. "A";
  1328.                        
  1329.                         ggn = g.gmod.GetGamemode().Name;
  1330.                         if(_G.KARMA) then
  1331.                             if(g.table.HasValue(SH.traitors, v)) then
  1332.                                 col = g.Color(255, 0, 0, 255);
  1333.                             end
  1334.                         end
  1335.                                
  1336.                         if(SH.GetCVNum("sh_esp_showdist") == 1) then
  1337.                             dist = " - " .. g.math.Round(v:GetPos():Distance(me:GetPos())) .. "D";
  1338.                         end
  1339.                                
  1340.                         if(SH.GetCVNum("sh_esp_showgangs") == 1) then
  1341.                             local gn = v:GetNWString("gang_name");
  1342.                             if(gn and gn ~= "") then
  1343.                                 gang = gn .. " - ";
  1344.                             end
  1345.                         end
  1346.                        
  1347.                         txt = g.string.format("%s%s%s%s%s", gang, v:Nick(), rank, health, armor);
  1348.                         wep = g.string.format("%s%s", wep, dist);
  1349.                            
  1350.                         local pos = v:EyePos():ToScreen();
  1351.                         g.surface.SetTextColor(col);
  1352.                         g.surface.SetTextPos(pos.x-30, pos.y-20);
  1353.                         g.surface.DrawText(txt);
  1354.                            
  1355.                         g.surface.SetTextPos(pos.x-30, pos.y-8);
  1356.                         g.surface.DrawText(wep);
  1357.                     end
  1358.                 end
  1359.             end
  1360.             for k, t in g.pairs(SH.custe) do
  1361.                 if(g.ValidEntity(v) and v:GetClass() == k) then
  1362.                     local pos = (v:GetPos() + g.Vector(0, 0, 50)):ToScreen();
  1363.                     g.surface.SetTextColor(g.Color(SH.GetCVNum("sh_esp_col_r"), SH.GetCVNum("sh_esp_col_g"), SH.GetCVNum("sh_esp_col_b"), SH.GetCVNum("sh_esp_col_a")));
  1364.                     g.surface.SetTextPos(pos.x-30, pos.y-8);
  1365.                     g.surface.DrawText(k);     
  1366.                 end
  1367.             end
  1368.         end
  1369.     end
  1370.    
  1371.     if(SH.vars.aim) then
  1372.         g.surface.SetFont("Trebuchet22");
  1373.        
  1374.         g.surface.SetTextColor(not SH.vars.aimtarg and g.Color(255, 15, 15, 255) or g.Color(25, 255, 25, 255));
  1375.        
  1376.         local w,h = g.ScrW(), g.ScrH();
  1377.         g.surface.SetTextPos(w/2-28, h/2+15);
  1378.        
  1379.         g.surface.DrawText(not SH.vars.aimtarg and "Scanning..." or "Locked!");
  1380.     end
  1381.    
  1382.     if(SH.GetCVNum("sh_showadmins") == 1) then
  1383.         local offs = 30;
  1384.         local height = 30;
  1385.        
  1386.         for i = 1, #SH.admins do
  1387.             height = height + 15;
  1388.         end
  1389.        
  1390.         g.surface.SetDrawColor(g.Color(
  1391.         SH.GetCVNum("sh_color_adminlist_r"),
  1392.         SH.GetCVNum("sh_color_adminlist_g"),
  1393.         SH.GetCVNum("sh_color_adminlist_b"),
  1394.         SH.GetCVNum("sh_color_adminlist_a")));
  1395.        
  1396.         g.surface.DrawRect(g.ScrW()-185, g.ScrH()-g.ScrH()+5, 175, height);
  1397.        
  1398.         g.surface.SetTextColor(g.Color(255, 255, 255, 255));
  1399.         g.surface.SetTextPos(g.ScrW()-125, g.ScrH()-g.ScrH()+5);
  1400.         g.surface.SetFont("Trebuchet22");
  1401.         g.surface.DrawText("ADMINS");
  1402.        
  1403.         g.surface.SetFont("DefaultFixedDropShadow");
  1404.        
  1405.         for k, v in g.ipairs(SH.admins) do
  1406.             if(g.ValidEntity(v)) then
  1407.                 local nick = v:Nick();
  1408.                 nick = g.string.sub(nick, 0, 22);
  1409.                 if(v:IsAdmin() and not v:IsSuperAdmin()) then
  1410.                     nick = nick .. " [A]";
  1411.                 else
  1412.                     nick = nick .. " [SA]";
  1413.                 end
  1414.                
  1415.                 surface.SetTextPos(g.ScrW()-175, g.ScrH()-g.ScrH()+offs);
  1416.                 surface.DrawText(nick);
  1417.                 offs = offs+15;
  1418.             end
  1419.         end
  1420.     end
  1421.    
  1422.     if(SH.GetCVNum("sh_showdruggy") == 1 and ggn and g.string.find(ggn, "PERP") or g.string.find(ggn, "agrp")) then
  1423.         g.surface.SetDrawColor(g.Color(25, 25, 25, 225));
  1424.        
  1425.         g.surface.DrawRect(g.ScrW()-g.ScrW()+15, g.ScrH()-g.ScrH()+5, 175, 60);
  1426.        
  1427.         g.surface.SetTextColor(g.Color(255, 255, 255, 255));
  1428.         g.surface.SetTextPos(g.ScrW()-g.ScrW()+55, g.ScrH()-g.ScrH()+5);
  1429.         g.surface.SetFont("Trebuchet22");
  1430.         g.surface.DrawText("DRUG DEALER");
  1431.        
  1432.         g.surface.SetFont("DefaultFixedDropShadow");
  1433.        
  1434.         local buy = "None";
  1435.         local sell = "None";
  1436.        
  1437.         local buyi = g.GetGlobalInt("perp_druggy_buy", 0);
  1438.         local selli = g.GetGlobalInt("perp_druggy_sell", 0);
  1439.        
  1440.         if(g.string.find(ggn, "PERP2") or g.string.find(ggn, "PERP3") or g.string.find(ggn, "PERP4")) then
  1441.             if(buyi == 2) then
  1442.                 buy = "Meth";
  1443.             elseif(buyi == 1) then
  1444.                 buy = "Weed";
  1445.             elseif(buyi == 3) then
  1446.                 buy = "Shrooms";
  1447.             end
  1448.         elseif(g.string.find(ggn, "agrp")) then
  1449.             if(buyi == 2) then
  1450.                 buy = "Meth";
  1451.             elseif(buyi == 1) then
  1452.                 buy = "Weed";
  1453.             elseif(buyi == 3) then
  1454.                 buy = "Hulk";
  1455.             elseif(buyi == 4) then
  1456.                 buy = "LSD";
  1457.             elseif(buyi == 5) then
  1458.                 buy = "Shrooms";
  1459.             elseif(buyi == 6) then
  1460.                 buy = "Cocaine";
  1461.             end
  1462.         else
  1463.             if(buyi == 2) then
  1464.                 buy = "Weed";
  1465.             elseif(buyi == 3) then
  1466.                 buy = "Shrooms";
  1467.             end
  1468.         end
  1469.        
  1470.         if(g.string.find(ggn, "agrp") or g.string.find(ggn, "PERP X2")) then
  1471.             if(selli == 1) then
  1472.                 sell = "Seeds";
  1473.             elseif(selli == 2) then
  1474.                 sell = "LSD";
  1475.             elseif(selli == 3) then
  1476.                 sell = "Hulk";
  1477.             elseif(selli == 4) then
  1478.                 sell = "Shrooms";
  1479.             elseif(selli == 5) then
  1480.                 sell = "Cocaine";
  1481.             end
  1482.         else
  1483.             if(selli == 1) then
  1484.                 sell = "Seeds";
  1485.             elseif(selli == 2) then
  1486.                 sell = "Shrooms";
  1487.             end
  1488.         end
  1489.        
  1490.         surface.SetTextPos(g.ScrW()-g.ScrW()+25, g.ScrH()-g.ScrH()+30);
  1491.         surface.DrawText("Currently selling " .. sell);
  1492.        
  1493.         surface.SetTextPos(g.ScrW()-g.ScrW()+25, g.ScrH()-g.ScrH()+45);
  1494.         surface.DrawText("Currently buying  " .. buy);
  1495.     end
  1496. end
  1497. SH:RegisterHook("HUDPaint", SH.ESP);
  1498.  
  1499. function SH.Speedhack()
  1500.     if(SH.vars.speed) then
  1501.         g.SH_SETSPEED(SH.GetCVNum("sh_speedhack_speed"));
  1502.     else
  1503.         g.SH_SETSPEED(1);
  1504.     end
  1505. end
  1506.  
  1507. SH:RegisterCommand("+sh_speed", function() SH:SetVar("speed",true); SH.Speedhack(); end);
  1508. SH:RegisterCommand("-sh_speed", function() SH:SetVar("speed",false); SH.Speedhack(); end);
  1509.  
  1510. SH:RegisterCommand("sh_togglevar", function(ply, cmd, args)
  1511.     local cc = args[1];
  1512.     if(not cc) then
  1513.         SH.sprint("invalid format");
  1514.         return;
  1515.     end
  1516.    
  1517.     local cn = SH.tvars[cc];
  1518.     if(not cn) then
  1519.         SH.sprint("invalid cvar");
  1520.         return;
  1521.     end
  1522.    
  1523.     cn = cn[2];
  1524.    
  1525.     if(g.GetConVarNumber(cn) == 0) then
  1526.         g.RunConsoleCommand(cn, 1);
  1527.     else
  1528.         g.RunConsoleCommand(cn, 0);
  1529.     end
  1530. end)
  1531.  
  1532.  
  1533. -- Aimbot/Nospread/UCMD
  1534.  
  1535. SH.aimmodels = {
  1536.     ["models/combine_scanner.mdl"] = "Scanner.Body",
  1537.     ["models/hunter.mdl"] = "MiniStrider.body_joint",
  1538.     ["models/combine_turrets/floor_turret.mdl"] = "Barrel",
  1539.     ["models/dog.mdl"] = "Dog_Model.Eye",
  1540.     ["models/antlion.mdl"] = "Antlion.Body_Bone",
  1541.     ["models/antlion_guard.mdl"] = "Antlion_Guard.Body",
  1542.     ["models/antlion_worker.mdl"] = "Antlion.Head_Bone",
  1543.     ["models/zombie/fast_torso.mdl"] = "ValveBiped.HC_BodyCube",
  1544.     ["models/zombie/fast.mdl"] = "ValveBiped.HC_BodyCube",
  1545.     ["models/headcrabclassic.mdl"] = "HeadcrabClassic.SpineControl",
  1546.     ["models/headcrabblack.mdl"] = "HCBlack.body",
  1547.     ["models/headcrab.mdl"] = "HCFast.body",
  1548.     ["models/zombie/poison.mdl"] = "ValveBiped.Headcrab_Cube1",
  1549.     ["models/zombie/classic.mdl"] = "ValveBiped.HC_Body_Bone",
  1550.     ["models/zombie/classic_torso.mdl"] = "ValveBiped.HC_Body_Bone",
  1551.     ["models/zombie/zombie_soldier.mdl"] = "ValveBiped.HC_Body_Bone",
  1552.     ["models/combine_strider.mdl"] = "Combine_Strider.Body_Bone",
  1553.     ["models/lamarr.mdl"] = "HeadcrabClassic.SpineControl"
  1554. };
  1555.  
  1556. local CustomCones = {
  1557.     ["#HL2_SMG1"] = g.Vector(-0.04362, -0.04362, -0.04362),
  1558.     ["#HL2_Pistol"] = g.Vector(-0.0100, -0.0100, -0.0100),
  1559.     ["#HL2_Pulse_Rifle"] = g.Vector(-0.02618, -0.02618, -0.02618),
  1560.     ["#HL2_Shotgun"] = g.Vector( -0.08716, -0.08716, -0.08716 ),
  1561. };
  1562.  
  1563. function SH.PredictSpread(cmd, aimAngle)
  1564.     cmd2, seed = g.hl2_ucmd_getprediction(cmd)
  1565.     currentseed = 0, 0, 0;
  1566.     if(cmd2 ~= 0) then currentseed = seed; end
  1567.     wep = me:GetActiveWeapon();
  1568.     vecCone, valCone = g.Vector(0, 0, 0);
  1569.     if(g.ValidEntity(wep)) then
  1570.         if(wep.Base) then
  1571.             valCone = wep.Primary and wep.Primary.Cone or 0;
  1572.             if(g.tonumber(valCone)) then
  1573.                 vecCone = g.Vector(-valCone, -valCone, -valCone);
  1574.             elseif(g.type(valCone) == "Vector") then
  1575.                 vecCone = -1 * valCone;
  1576.             end
  1577.         else
  1578.             local pn = wep:GetPrintName();
  1579.             if(CustomCones[pn]) then vecCone = CustomCones[pn]; end
  1580.         end
  1581.     end
  1582.     return g.hl2_shotmanip(currentseed or 0, (aimAngle or me:GetAimVector():Angle()):Forward(), vecCone):Angle();
  1583. end
  1584.  
  1585. local ARTime;
  1586. function SH.Autoreload(uc)
  1587.     if(SH.GetCVNum("sh_autoreload") ~= 1) then return; end
  1588.     if(me:Alive() and g.ValidEntity(me:GetActiveWeapon())) then
  1589.         if(me:GetActiveWeapon():Clip1() <= 0) then
  1590.             if(not ARTime or ARTime < g.CurTime()) then
  1591.                 g.RunConsoleCommand("+reload");
  1592.                 ARTime = g.CurTime() + 5;
  1593.                 timer.Simple(.2, function()
  1594.                     g.RunConsoleCommand("-reload");
  1595.                 end);
  1596.             end
  1597.         end
  1598.     end
  1599. end
  1600.  
  1601. function SH.GetShootPos(ent)
  1602.     if(SH.GetCVNum("sh_targetbones") ~= 1) then
  1603.         local eyes = ent:LookupAttachment("eyes");
  1604.         if(eyes ~= 0) then
  1605.             eyes = ent:GetAttachment(eyes);
  1606.             if(eyes and eyes.Pos) then
  1607.                 return eyes.Pos, eyes.Ang;
  1608.             end
  1609.         end
  1610.     end
  1611.    
  1612.     local bname = SH.aimmodels[ent:GetModel()];
  1613.     if(not bname) then
  1614.         for k, v in g.pairs(SH.nicebones) do
  1615.             if(v[1] == SH.GetCVStr("sh_aimbone")) then
  1616.                 bname = v[2];
  1617.             end
  1618.         end
  1619.         bname = bname or "ValveBiped.Bip01_Head1";
  1620.     end
  1621.    
  1622.     local bone = ent:LookupBone(bname);
  1623.     if(bone) then
  1624.         local pos, ang = ent:GetBonePosition(bone);
  1625.         return pos, ang;
  1626.     end
  1627.    
  1628.     return ent:LocalToWorld(ent:OBBCenter());
  1629. end
  1630.  
  1631. function SH.HasLOS(ent)
  1632.     if(SH.GetCVNum("sh_dclos") == 1) then return true; end
  1633.     local trace = {start = me:GetShootPos(), endpos = SH.GetShootPos(ent), filter = {me, ent}, mask = 1174421507};
  1634.     local tr = g.util.TraceLine(trace);
  1635.     return(tr.Fraction == 1);
  1636. end
  1637.  
  1638. function SH.CanShoot(ent)
  1639.     if(not g.ValidEntity(ent)) then return false; end
  1640.     if(me == ent) then return false; end
  1641.     if((not ent:IsPlayer() and not ent:IsNPC()) and SH.GetCVNum("sh_targetents") ~= 1) then return false; end
  1642.     if(not ent:IsPlayer() and not ent:IsNPC() and not SH.custe[ent:GetClass()]) then return false; end
  1643.    
  1644.     if(g.SH_ISDORMANT(ent:EntIndex())) then return false; end
  1645.     if(ent:GetMoveType() == 0) then return false; end
  1646.     if(ent:IsPlayer() and not ent:Alive()) then return false; end
  1647.     if(ent:IsPlayer() and (ent:Team() == TEAM_SPECTATOR or ent:Team() == 1002)) then return false; end
  1648.    
  1649.     if(ent:IsPlayer() and ent:Health() <= 0) then return false; end
  1650.     if(ent:IsPlayer() and SH.GetCVNum("sh_targettraitors") == 1 and #SH.traitors > 0 and not g.table.HasValue(SH.traitors, ent)) then return false; end
  1651.     if(ent:IsPlayer() and ent:Team() == me:Team() and SH.GetCVNum("sh_friendlyfire") ~= 1) then return false; end
  1652.     if(ent:IsPlayer() and _R.Player.IsTraitor and ent:IsTraitor() and SH.GetCVNum("sh_ignoretraitors") == 1) then return false; end
  1653.     if(ent:IsPlayer() and SH.GetCVNum("sh_targetplayers") ~= 1) then return false; end
  1654.     if(ent:IsNPC() and SH.GetCVNum("sh_targetnpcs") ~= 1) then return false; end
  1655.     if(ent:IsPlayer() and SH.GetCVNum("sh_ignorefriends") == 1 and ent:GetFriendStatus() == "friend") then return false; end
  1656.     if(ent:IsPlayer() and (ent:IsAdmin() or ent:IsSuperAdmin()) and SH.GetCVNum("sh_ignoreadmins") == 1) then return false; end
  1657.     if(ent:IsPlayer() and SH.GetCVNum("sh_ignorenowep") == 1 and not g.ValidEntity(ent:GetActiveWeapon())) then return false; end
  1658.    
  1659.     local hv = g.table.HasValue(SH.aimfriends, ent);
  1660.     if(ent:IsPlayer() and SH.GetCVNum("sh_friendisenemy") == 1 and not hv) then return false; end
  1661.     if(ent:IsPlayer() and SH.GetCVNum("sh_friendisenemy") ~= 1 and hv) then return false; end
  1662.    
  1663.     hv = ent:IsPlayer() and g.table.HasValue(SH.aimteams, g.team.GetName(ent:Team())) or false;
  1664.     if(ent:IsPlayer() and SH.GetCVNum("sh_teamisenemy") == 1 and not hv) then return false; end
  1665.     if(ent:IsPlayer() and SH.GetCVNum("sh_teamisenemy") ~= 1 and hv) then return false; end
  1666.    
  1667.     local fov = SH.GetCVNum("sh_maxfov");
  1668.     if(fov ~= 180) then
  1669.         local lpang = me:GetAngles();
  1670.         local ang = (ent:GetPos() - me:GetPos()):Angle();
  1671.         local ady = g.math.abs(g.math.NormalizeAngle(lpang.y - ang.y))
  1672.         local adp = g.math.abs(g.math.NormalizeAngle(lpang.p - ang.p ))
  1673.         if(ady > fov or adp > fov) then return false; end
  1674.     end
  1675.    
  1676.     return true;
  1677. end
  1678.  
  1679. function SH.GetAimTarg()
  1680.     if(SH.CanShoot(SH.vars.aimtarg) and SH.HasLOS(SH.vars.aimtarg)) then
  1681.         return SH.vars.aimtarg;
  1682.     else
  1683.         SH.vars.aimtarg = nil;
  1684.     end
  1685.    
  1686.     local position = me:EyePos();
  1687.     local angle = me:GetAimVector();
  1688.     local tar = {0, 0};
  1689.     local tab = (SH.GetCVNum("sh_targetnpcs") == 1 or SH.GetCVNum("sh_targetents") == 1) and g_ents or g_players;
  1690.    
  1691.     for k, v in g.ipairs(tab) do
  1692.         if(SH.CanShoot(v) and SH.HasLOS(v)) then
  1693.             local plypos = v:EyePos();
  1694.             local difr = (plypos - position):Normalize();
  1695.             difr = difr - angle;
  1696.             difr = difr:Length();
  1697.             difr = g.math.abs(difr);
  1698.             if(difr < tar[2] or tar[1] == 0) then
  1699.                 tar = {v, difr};
  1700.             end
  1701.         end
  1702.     end
  1703.     return tar[1];
  1704. end
  1705.  
  1706. function SH.Triggerbot(uc)
  1707.     if(SH.GetCVNum("sh_triggerbot") ~= 1) then return; end
  1708.     if(not me:Alive()) then return; end
  1709.     local ent = me:GetEyeTrace().Entity;
  1710.    
  1711.     if((SH.vars.tlock and SH.vars.aim and g.ValidEntity(SH.vars.aimtarg) and SH.HasLOS(SH.vars.aimtarg)) or
  1712.     (SH.GetCVNum("sh_triggerbot_as") == 1 and g.ValidEntity(ent) and (ent:IsPlayer() or
  1713.     ent:IsNPC()) and SH.CanShoot(ent))) then
  1714.         if(SH.vars.firing) then return; end
  1715.         g.RunConsoleCommand("+attack");
  1716.         SH:SetVar("firing",true);
  1717.         g.timer.Simple(me:GetActiveWeapon().Primary and me:GetActiveWeapon().Primary.Delay or 0.05, function()
  1718.             g.RunConsoleCommand("-attack");
  1719.             SH:SetVar("firing",false);
  1720.         end);
  1721.     end
  1722. end
  1723.  
  1724. SH:RegisterCommand("+sh_triggerbot", function()
  1725.     g.RunConsoleCommand("_sh_triggerbot", "1");
  1726. end);
  1727.  
  1728. SH:RegisterCommand("-sh_triggerbot", function()
  1729.     g.RunConsoleCommand("_sh_triggerbot", "0");
  1730. end);
  1731.  
  1732. SH:RegisterCommand("sh_addlookingent", function()
  1733.     local ent = me:GetEyeTrace().Entity;
  1734.     if(not ValidEntity(ent)) then return; end
  1735.     local v = ent:GetClass();
  1736.    
  1737.     SH.custe[v] = true;
  1738.     local t = SH.data.GetOptionTab("ESPEnts") or {};
  1739.     t[v] = true;
  1740.     SH.data.SetOptionTab("ESPEnts", t);
  1741.    
  1742.     me:ChatPrint("Added " .. v);
  1743. end);
  1744.  
  1745. function SH.Antisnap(ang)
  1746.     ang.p = g.math.NormalizeAngle(ang.p);
  1747.     ang.y = g.math.NormalizeAngle(ang.y);
  1748.     lpang = me:EyeAngles();
  1749.     local as = SH.GetCVNum("sh_antisnapspeed");
  1750.     lpang.p = g.math.Approach(lpang.p, ang.p, as)
  1751.     lpang.y = g.math.Approach(lpang.y, ang.y, as)
  1752.     lpang.r = 0;
  1753.     ang = lpang;
  1754.     return ang;
  1755. end
  1756.  
  1757. function SH.Aimbot(uc)
  1758.     if(not SH.vars.aim) then return; end
  1759.     if(g.SH_COMMANDNUMBER(uc) == 0) then return; end
  1760.    
  1761.     local ply = SH.GetAimTarg();
  1762.     if(ply == 0) then SH.vars.tlock = false; SH:SetVar("aimang", nil); return; end
  1763.     SH:SetVar("aimtarg",ply);
  1764.    
  1765.     local pos, ang = SH.GetShootPos(ply);
  1766.     pos = pos + ply:GetVelocity()/50 - me:GetVelocity()/50 - g.Vector(0,0,0);
  1767.    
  1768.     pos = pos - g.Vector(SH.GetCVNum("sh_aimoffset_hoz"), 0, SH.GetCVNum("sh_aimoffset_vert"));
  1769.    
  1770.     ang = (pos-me:GetShootPos()):Angle();
  1771.    
  1772.     if(SH.GetCVNum("sh_antisnap") == 1) then
  1773.         ang = SH.Antisnap(ang);
  1774.     end
  1775.    
  1776.     SH:SetVar("aimang", ang);
  1777.    
  1778.     if(SH.GetCVNum("sh_nospread") == 1) then
  1779.         ang = SH.PredictSpread(uc, ang);
  1780.     end
  1781.    
  1782.     ang.p, ang.y, ang.r = g.math.NormalizeAngle(ang.p), g.math.NormalizeAngle(ang.y), g.math.NormalizeAngle(ang.r);
  1783.    
  1784.     SH:SetVar("tlock",true);
  1785.    
  1786.     r.CUserCmd.SetViewAngles(uc, ang);
  1787. end
  1788.  
  1789. SH:RegisterCommand("+sh_aim", function() SH:SetVar("aim",true); end);
  1790. SH:RegisterCommand("-sh_aim", function()
  1791.     SH:SetVar("aim",false);
  1792.     SH:SetVar("aimtarg",nil);
  1793.     SH:SetVar("aimang", nil);
  1794. end);
  1795.  
  1796. SH:RegisterCommand("sh_toggleaim", function()
  1797.     if(not SH.vars.aim) then
  1798.         SH:SetVar("aim",true);
  1799.     else
  1800.         SH:SetVar("aim",false);
  1801.         SH:SetVar("aimtarg",nil);
  1802.         SH:SetVar("aimang", nil);
  1803.     end
  1804. end);
  1805.  
  1806. function SH.ClientNoClipCM(uc)
  1807.     if(SH.GetCVNum("sh_clientnoclip") == 1) then
  1808.         uc:SetForwardMove(0);
  1809.         uc:SetSideMove(0);
  1810.         uc:SetUpMove(0);
  1811.     end
  1812. end
  1813.  
  1814. function SH.CreateMove(uc)
  1815.     SH.Aimbot(uc);
  1816.     SH.Triggerbot(uc);
  1817.     SH.Autoreload(uc);
  1818.     SH.ClientNoClipCM(uc);
  1819. end
  1820. SH:RegisterHook("CreateMove", SH.CreateMove);
  1821.  
  1822. SH:RegisterHook("InputMouseApply", function(cmd, x, y, angle)
  1823.     if(SH.vars.tlock and SH.vars.aim) then return true; end
  1824. end);
  1825.  
  1826. SH:RegisterHook("StartChat", function()
  1827.     SH.vars.chatting = true;
  1828.     return oldHookCall("StartChat", GAMEMODE or GM, nil);
  1829. end);
  1830.  
  1831. SH:RegisterHook("FinishChat", function()
  1832.     SH.vars.chatting = false;
  1833. end);
  1834.  
  1835. function SH.CalcView(ply, pos, angles, fov)
  1836.     if(g.ValidEntity(me:GetActiveWeapon()) and me:GetActiveWeapon().Primary and SH.GetCVNum("sh_norecoil") == 1) then
  1837.         me:GetActiveWeapon().Primary.Recoil = 0;
  1838.     end
  1839.    
  1840.     if(SH.GetCVNum("sh_disablecalcview") == 1) then
  1841.         return GAMEMODE:CalcView(ply, pos, angles, fov);
  1842.     end
  1843.    
  1844.     if(SH.GetCVNum("sh_clientnoclip") == 1 and SH.CP) then
  1845.         angles = angles:Forward();
  1846.         if(me:KeyDown(g.IN_FORWARD)) then
  1847.             local tr = g.util.TraceLine({start = SH.CP, endpos = SH.CP + angles * g.FrameTime() * SH.GetCVNum("sh_clientnoclip_speed"), mask = g.COLLISION_GROUP_WORLD});
  1848.             SH.CP = tr.HitPos;
  1849.         end
  1850.         if(me:KeyDown(g.IN_BACK)) then
  1851.             local tr = g.util.TraceLine({start = SH.CP, endpos = SH.CP + angles * g.FrameTime() * SH.GetCVNum("sh_clientnoclip_speed") * -1, mask = g.COLLISION_GROUP_WORLD});
  1852.             SH.CP = tr.HitPos;
  1853.         end
  1854.         if(me:KeyDown(g.IN_MOVELEFT)) then
  1855.             local tr = g.util.TraceLine({start = SH.CP, endpos = SH.CP + angles:Angle():Right() * g.FrameTime() * SH.GetCVNum("sh_clientnoclip_speed") * -1, mask = g.COLLISION_GROUP_WORLD});
  1856.             SH.CP = tr.HitPos;
  1857.         end
  1858.         if(me:KeyDown(g.IN_MOVERIGHT)) then
  1859.             local tr = g.util.TraceLine({start = SH.CP, endpos = SH.CP + angles:Angle():Right() * g.FrameTime() * SH.GetCVNum("sh_clientnoclip_speed"), mask = g.COLLISION_GROUP_WORLD});
  1860.             SH.CP = tr.HitPos;
  1861.         end
  1862.        
  1863.         return({origin = SH.CP});
  1864.     end
  1865.    
  1866.     if(SH.vars.aimang) then
  1867.         angles = SH.vars.aimang;
  1868.     end
  1869.    
  1870.     if(SH.GetCVNum("sh_thirdperson") == 1) then
  1871.         return({origin = pos - (angles:Forward() * (50 + SH.GetCVNum("sh_thirdperson_dist")))});
  1872.     end
  1873.    
  1874.     local cfov = SH.GetCVNum("sh_fov");
  1875.     if(cfov ~= 0) then
  1876.         return({fov = cfov});
  1877.     end
  1878.    
  1879.     return GAMEMODE:CalcView(ply, pos, angles, fov);
  1880. end
  1881. SH:RegisterHook("CalcView", SH.CalcView)
  1882.  
  1883. function SH.SDLP()
  1884.     return(SH.GetCVNum("sh_thirdperson") == 1);
  1885. end
  1886. SH:RegisterHook( "ShouldDrawLocalPlayer", SH.SDLP);
  1887.  
  1888. function SH.AddTracePlayer()
  1889.     local ent = me:GetEyeTrace().Entity;
  1890.     if(not g.ValidEntity(ent) or not ent:IsPlayer()) then return; end
  1891.  
  1892.     me:ChatPrint("Added/Removed " .. ent:Nick() .. " to friends!");
  1893.    
  1894.     if(not g.table.HasValue(SH.aimfriends, ent)) then
  1895.         g.table.insert(SH.aimfriends, ent);
  1896.         return;
  1897.     end
  1898.    
  1899.     for k, v in g.pairs(SH.aimfriends) do
  1900.         if(v == ent) then
  1901.             g.table.remove(SH.aimfriends, k);
  1902.             break
  1903.         end
  1904.     end
  1905. end
  1906. SH:RegisterCommand("sh_addtracebuddy", SH.AddTracePlayer);
  1907.  
  1908. SH:RegisterCommand("sh_runscripts", g.SH_RUNSCRIPTS);
  1909.  
  1910. SH:RegisterHook("InitPostEntity", function()   
  1911.     SH.UpdateMenu();
  1912.     g.SH_SETCVAR(g.CreateConVar("sv_allow_voice_from_file", ""), "1");
  1913.     for k, v in g.pairs(g.team.GetAllTeams()) do
  1914.         if(k ~= 0 and k ~= 1001 and k ~= 1002) then
  1915.             g.table.insert(SH.teamlist, v);
  1916.         end
  1917.     end
  1918.    
  1919.     if(SH.GetCVNum("sh_iplogs") == 1) then
  1920.         g.SH_SUPPRESSIPLOGS(false);
  1921.     else
  1922.         g.SH_SUPPRESSIPLOGS(true);
  1923.     end
  1924.    
  1925.     if(SH.GetCVNum("sh_clientnoclip") == 1) then
  1926.         SH.CP = g.LocalPlayer():EyePos();
  1927.     end
  1928.    
  1929.     if(SH.GetCVNum("sh_runscripts_auto") == 1) then
  1930.         g.SH_RUNSCRIPTS();
  1931.     end
  1932.    
  1933.     GAMEMODE.AchievementThink = function() end
  1934. end);
  1935.  
  1936. g.cvars.AddChangeCallback(SH.tvars["sh_panicmode"][2], function(cvar, old, new)
  1937.     if(g.tostring(new) == "1") then
  1938.         if(menu.frame) then menu.frame:Remove(); menu.frame = nil; end
  1939.     end
  1940. end);
  1941.  
  1942. g.cvars.AddChangeCallback(SH.tvars["sh_iplogs"][2], function(cvar, old, new)
  1943.     if(g.tostring(new) == "1") then
  1944.         g.SH_SUPPRESSIPLOGS(false);
  1945.     else
  1946.         g.SH_SUPPRESSIPLOGS(true);
  1947.     end
  1948. end);
  1949.  
  1950. g.cvars.AddChangeCallback(SH.tvars["sh_clientnoclip"][2], function(cvar, old, new)
  1951.     if(g.tostring(new) == "1") then
  1952.         SH.CP = me:EyePos();
  1953.     else
  1954.         g.SH_SUPPRESSIPLOGS(true);
  1955.     end
  1956. end);
  1957.  
  1958. SH:RegisterCommand("sh_addespent", function(ply, cmd, args)
  1959.     if(not args[1]) then
  1960.         SH.sprint("Usage: sh_addespent <entclass>");
  1961.         return;
  1962.     end
  1963.    
  1964.     local ent = args[1];   
  1965.     SH.custe[ent] = true;
  1966.    
  1967.     local t = SH.data.GetOptionTab("ESPEnts") or {};
  1968.     t[ent] = true;
  1969.     SH.data.SetOptionTab("ESPEnts", t);
  1970.    
  1971.     SH.sprint("Added entity to esp ents list!");
  1972. end);
  1973.  
  1974. SH:RegisterCommand("sh_luarun", function(ply, cmd, args)
  1975.     g.SH_LUARUN(args[1]);
  1976. end);
  1977.  
  1978. SH:RegisterCommand("sh_forcecvar", function(ply, cmd, args)
  1979.     if(not args[2]) then return; end
  1980.     g.SH_SETCVAR(g.GetConVar(args[1]), tostring(args[2]));
  1981.     SH.sprint("Forced " .. tostring(args[1]) .. " to " .. tostring(args[2]));
  1982. end);
  1983.  
  1984. SH:RegisterCommand("sh_blockcc", function(ply, cmd, args)
  1985.     if(not args[1]) then return; end
  1986.     g.table.insert(SH.blockccs, tostring(args[1]));
  1987.     SH.sprint("Blocked command " .. tostring(args[1]));
  1988. end);
  1989.  
  1990. SH:RegisterCommand("sh_allowcc", function(ply, cmd, args)
  1991.     if(not args[1]) then return; end
  1992.    
  1993.     if(not g.table.HasValue(SH.blockccs, tostring(args[1]))) then
  1994.         SH.sprint("Command " .. tostring(args[1]) .. " isn't blocked!");
  1995.     else
  1996.         for k, v in g.pairs(SH.blockccs) do
  1997.             if(v == tostring(args[1])) then
  1998.                 g.table.remove(SH.blockccs, k);
  1999.             end
  2000.         end
  2001.         SH.sprint("Allowed command " .. tostring(args[1]));
  2002.     end
  2003. end);
  2004.  
  2005. SH:RegisterCommand("sh_clearccs", function(ply, cmd, args)
  2006.     SH.blockccs = {};
  2007.     SH.sprint("Removed all ConCommand blocks!");
  2008. end);
  2009.  
  2010. local oSVC = "1";
  2011. SH:RegisterCommand("+sh_freeze", function(ply, cmd, args)
  2012.     g.SH_SETCVAR(g.GetConVar("cl_predict"), "0");
  2013.     oSVC = g.GetConVarString("sv_client_predict");
  2014.     g.SH_SETCVAR(g.GetConVar("sv_client_predict"), "-1");
  2015.     g.SH_SETCVAR(g.GetConVar("net_blockmsg"), "clc_Move");
  2016. end);
  2017.  
  2018. SH:RegisterCommand("-sh_freeze", function(ply, cmd, args)
  2019.     g.SH_SETCVAR(g.GetConVar("cl_predict"), "1");
  2020.     g.SH_SETCVAR(g.GetConVar("sv_client_predict"), oSVC);
  2021.     g.SH_SETCVAR(g.GetConVar("net_blockmsg"), "0");
  2022. end);
  2023.  
  2024. -- CUSTOM CONSOLE
  2025.  
  2026. function SH.ConAddEntry(txt)
  2027.     vConEntry:RequestFocus();
  2028.     if(g.string.len(txt) < 1) then return; end
  2029.    
  2030.     local args = g.string.Explode(" ", txt);
  2031.     local cmd = args[1];
  2032.     g.table.remove(args, 1);
  2033.    
  2034.     if(cmd == "sh_luarun") then
  2035.         args = {g.string.Replace(txt, "sh_luarun ", "")};
  2036.     end
  2037.    
  2038.     g.table.insert(tConHistory, "] "..txt);
  2039.     vConHistory:AddLine("] "..txt);
  2040.    
  2041.     if(not SH.cmds[cmd]) then
  2042.         local ucm = "Unknown command: " .. txt .. ". Type 'help' for a list of commands.";
  2043.         g.table.insert(tConHistory, ucm);
  2044.         vConHistory:AddLine(ucm);
  2045.     else
  2046.         SH.cmds[cmd](me, cmd, args);
  2047.     end
  2048.    
  2049.     vConHistory:PerformLayout();
  2050.     vConHistory.VBar:SetScroll(vConHistory.VBar.CanvasSize);
  2051.     vConEntry:SetText("");
  2052. end
  2053.  
  2054. function SH.ConToggle()
  2055.     vConFrame = vgui.Create("DFrame");
  2056.     vConFrame:SetSize(750, 500);
  2057.     vConFrame:SetPos(50, 50);
  2058.     vConFrame:SetTitle("SethHack Console");
  2059.     vConFrame:ShowCloseButton(true);
  2060.     vConFrame:MakePopup();
  2061.  
  2062.     function vConFrame:Think()
  2063.         if(g.input.IsKeyDown(g.KEY_ESCAPE)) then
  2064.             g.SH_PURECC("cancelselect");
  2065.             self:Remove();
  2066.         end
  2067.     end
  2068.    
  2069.     vConHistory = vgui.Create("DListView", vConFrame);
  2070.     vConHistory:SetMultiSelect(false);
  2071.     vConHistory:SetSize(740, 440);
  2072.     vConHistory:SetPos(5, 27);
  2073.     vConHistory:SetSortable(false);
  2074.     vConHistory:AddColumn("");
  2075.    
  2076.     vConEntry = vgui.Create("DTextEntry", vConFrame);
  2077.     vConEntry:SetMultiline(false);
  2078.     vConEntry:SetSize(650, 20);
  2079.     vConEntry:SetPos(15, 472);
  2080.    
  2081.     function vConEntry:OnEnter()
  2082.         SH.vars.LastCommand = vConEntry:GetText();
  2083.         SH.ConAddEntry(vConEntry:GetText());
  2084.     end
  2085.    
  2086.     function vConEntry:Think()
  2087.         vConEntry:RequestFocus();
  2088.     end
  2089.    
  2090.     vConEnter = vgui.Create("DButton", vConFrame);
  2091.     vConEnter:SetSize(50, 20);
  2092.     vConEnter:SetPos(675, 472);
  2093.     vConEnter:SetText("Submit");
  2094.     function vConEnter:DoClick()
  2095.         SH.vars.LastCommand = vConEntry:GetText();
  2096.         SH.ConAddEntry(vConEntry:GetText());
  2097.     end
  2098.    
  2099.     for k, v in pairs(tConHistory) do
  2100.         vConHistory:AddLine(v);
  2101.     end
  2102. end
  2103.  
  2104. SH.urbinds={};
  2105. SH.bindcooldown = {};
  2106. local togglecooldown;
  2107. SH:RegisterHook("HUDPaintBackground", function()
  2108.     if(not g.IsValid(vConFrame)) then
  2109.         if(g.input.IsKeyDown(g.KEY_Q) and (g.input.IsKeyDown(g.KEY_TAB) or g.input.IsKeyDown(g.KEY_LALT))) then
  2110.             if(not togglecooldown or togglecooldown < g.CurTime()) then
  2111.                 SH.ConToggle();
  2112.                 togglecooldown = g.CurTime() + 1;
  2113.             end
  2114.         end
  2115.     else
  2116.         if(g.input.IsKeyDown(g.KEY_Q) and (g.input.IsKeyDown(g.KEY_TAB) or g.input.IsKeyDown(g.KEY_LALT))) then
  2117.             if(not togglecooldown or togglecooldown < g.CurTime()) then
  2118.                 if(g.IsValid(vConFrame)) then
  2119.                     vConFrame:Remove();
  2120.                     vConFrame = nil;
  2121.                     togglecooldown = g.CurTime() + 1;
  2122.                     return;
  2123.                 end
  2124.             end
  2125.         end
  2126.        
  2127.         if(g.input.IsKeyDown(g.KEY_UP)) then
  2128.             if(SH.vars.LastCommand ~= "") then
  2129.                 vConEntry:SetText(SH.vars.LastCommand);
  2130.                 vConEntry:SetCaretPos(g.string.len(SH.vars.LastCommand));
  2131.             end
  2132.         end
  2133.        
  2134.         local arr = vConEntry:GetText();
  2135.         if(arr and g.string.len(arr) >= 1) then
  2136.             local cmdarr = {};
  2137.             for k, v in g.pairs(SH.cmds) do
  2138.                 if(g.string.find(k, arr)) then
  2139.                     g.table.insert(cmdarr, k);
  2140.                 end
  2141.             end
  2142.             local pos = 560;
  2143.             for i = 1, 5 do
  2144.                 if(cmdarr[i]) then
  2145.                     for k, v in g.pairs(SH.cvars) do
  2146.                         if(v[1] == cmdarr[i]) then
  2147.                             if(g.type(v[1]) == "number") then  
  2148.                                 cmdarr[i] = cmdarr[i] .. "    ["..SH.GetCVNum(v[1]).."]";
  2149.                             elseif(g.type(v[1]) == "string") then
  2150.                                 cmdarr[i] = cmdarr[i] .. "    ["..SH.GetCVStr(v[1]).."]";
  2151.                             end
  2152.                         end
  2153.                     end
  2154.                     g.draw.SimpleTextOutlined(cmdarr[i],
  2155.                     "Trebuchet22",
  2156.                     70, pos,
  2157.                     g.Color(255, 204, 102, 255),
  2158.                     g.TEXT_ALIGN_LEFT,
  2159.                     g.TEXT_ALIGN_LEFT,
  2160.                     1,
  2161.                     g.Color(0, 0, 0, 255));
  2162.                     pos = pos + 25;
  2163.                 end
  2164.             end
  2165.         end
  2166.     end
  2167.    
  2168.     if(SH.vars.chatting) then return; end
  2169.     if(_G.openAura and _G.openAura.chatBox and _G.openAura.chatBox.panel and _G.openAura.chatBox.panel:IsVisible()) then return; end
  2170.     if(_G.blueprint and _G.blueprint.chatBox and _G.blueprint.chatBox.panel and _G.blueprint.chatBox.panel:IsVisible()) then return; end
  2171.     if(_G.blackbox and _G.blackbox.chatBox and _G.blackbox.chatBox.panel and _G.blackbox.chatBox.panel:IsVisible()) then return; end
  2172.     if(_G.STGamemodes and _G.STGamemodes.ChatBox and _G.STGamemodes.ChatBox.Panel and _G.STGamemodes.ChatBox.Panel:IsVisible()) then return; end
  2173.     if(_G.g_SpawnMenu and _G.g_SpawnMenu:IsVisible()) then return; end
  2174.     if(_G.g_ContextMenu and _G.g_ContextMenu:IsVisible()) then return; end
  2175.     if(_G.chaton) then return; end
  2176.     if(g.IsValid(vConFrame)) then return; end
  2177.    
  2178.     for k, v in g.pairs(SH.binds) do
  2179.         if((g.input.IsKeyDown(g[k]) or (g.string.find(k, "MOUSE") and g.input.IsMouseDown(g[k]))) and SH.cmds[v]) then
  2180.             if(not SH.urbinds[v] and (not SH.bindcooldown[v] or SH.bindcooldown[v] < g.CurTime())) then
  2181.                 SH.cmds[v](me, v, {});
  2182.                 if(g.string.sub(g.string.reverse(v), -1) == "+") then
  2183.                     SH.urbinds[v] = true;
  2184.                 else
  2185.                     SH.bindcooldown[v] = g.CurTime() + 0.75;
  2186.                 end
  2187.             end
  2188.         else
  2189.             if(SH.urbinds[v]) then
  2190.                 if(g.string.sub(g.string.reverse(v), -1) == "+") then
  2191.                     local nv = g.string.Replace(v, "+", "-");
  2192.                     SH.cmds[nv](me, nv, {});
  2193.                     SH.urbinds[v] = nil;
  2194.                 end
  2195.             end
  2196.         end
  2197.     end
  2198. end);
  2199.  
  2200. -- END CUSTOM CONSOLE
  2201.  
  2202. -- MENU
  2203.  
  2204. local mwidth = 500;
  2205. local mheight = 435;
  2206. local SelectedWindow = "Aimbot";
  2207.  
  2208. local function fentsGetAll()
  2209.     local t = {};
  2210.     for k, v in g.ipairs(g_ents) do
  2211.         if(g.ValidEntity(v)) then
  2212.             if(not g.table.HasValue(t, v:GetClass())) then
  2213.                 g.table.insert(t, v:GetClass());
  2214.             end
  2215.         end
  2216.     end
  2217.     return t;
  2218. end
  2219.  
  2220. function SH.CreateOption(dtype, parent, tooltip, o1, o2, o3, o4, o5, o6, o7, o8, o9)
  2221.     if(not parent) then return; end
  2222.     if(dtype == "Checkbox") then
  2223.         dtype = "DCheckBoxLabel";
  2224.         local text, cvar, x, y = o1, o2, o3, o4;
  2225.         local dele = vgui.Create(dtype, parent);
  2226.         dele:SetText(text);
  2227.         dele:SetConVar(SH.tvars[cvar][2]);
  2228.         dele:SetValue(SH.GetCVNum(cvar));
  2229.         dele:SetPos(x, y);
  2230.         dele:SizeToContents();
  2231.         dele:SetTextColor(g.color_white);
  2232.         if(tooltip ~= "") then
  2233.             dele:SetTooltip(tooltip);
  2234.         end
  2235.        
  2236.     elseif(dtype == "Slider") then
  2237.         dtype = "DNumSlider";
  2238.         local text, cvar, dec, min, max, wide, x, y = o1, o2, o3, o4, o5, o6, o7, o8;
  2239.         local dele = vgui.Create(dtype, parent);
  2240.         dele:SetPos(x, y);
  2241.         dele:SetWide(wide);
  2242.         dele:SetText(text);
  2243.         dele:SetMin(min);
  2244.         dele:SetMax(max);
  2245.         dele:SetDecimals(dec);
  2246.         dele:SetConVar(SH.tvars[cvar][2]);
  2247.         if(tooltip ~= "") then
  2248.             dele:SetTooltip(tooltip);
  2249.         end
  2250.     elseif(dtype == "Label") then
  2251.         dtype = "DLabel";
  2252.         local text, x, y = o1, o2, o3;
  2253.         local dele = vgui.Create(dtype, parent);
  2254.         dele:SetPos(x, y);
  2255.         dele:SetText(text);
  2256.         dele:SizeToContents();
  2257.         dele:SetTextColor(g.color_white);
  2258.     end
  2259. end
  2260.  
  2261. function SH.CreateButton(txt, szw, szh, psw, psh, parent, func)
  2262.     if(not parent) then return; end
  2263.    
  2264.     local button = vgui.Create("DButton", parent);
  2265.     button:SetText(txt);
  2266.     button:SetSize(szw, szh);
  2267.     button:SetPos(psw, psh);
  2268.     button:SetVisible(true);
  2269.     function button:Paint()
  2270.         g.draw.RoundedBox(8, 0, 0, self:GetWide(), self:GetTall(), Color(104, 104, 104, 225));
  2271.     end
  2272.     button.DoClick = func or function()
  2273.         SelectedWindow = txt;
  2274.         SH.Menu();
  2275.         g.surface.PlaySound("ambient/levels/canals/drip4.wav");
  2276.     end
  2277.    
  2278.     local panel;
  2279.     if(txt == SelectedWindow) then
  2280.         panel = vgui.Create("DPanel", menu.frame);
  2281.         panel:SetPos(135,85);
  2282.         panel:SetSize(345,335);
  2283.         function panel:Paint() end
  2284.     end
  2285.    
  2286.     return button, panel;
  2287. end
  2288.  
  2289. local SKIN = g.setmetatable({}, {
  2290.     __index = function(t, k)
  2291.         return derma.GetDefaultSkin()[k];
  2292.     end,
  2293. });
  2294.  
  2295. function SKIN:PaintCheckBox(panel)
  2296.     local w, h = panel:GetSize();
  2297.     draw.RoundedBox(4, 1, 1, w-2, h-2, g.Color(210, 210, 210, 205));
  2298. end
  2299.  
  2300. function SKIN:SchemeCheckBox(panel)
  2301.     panel:SetTextColor(g.Color(0, 85, 255, 255));
  2302.     DSysButton.ApplySchemeSettings(panel);
  2303. end
  2304.  
  2305. function SKIN:SchemeSlider(panel)
  2306.     panel.Knob:SetImageColor(g.Color(0, 85, 255, 255));
  2307. end
  2308.  
  2309. g.surface.CreateFont("coolvetica", 64, 500, true, false, "shmenufont");
  2310. function SH.Menu()
  2311.     if(menu.frame) then menu.frame:Remove(); end
  2312.    
  2313.     menu.frame = vgui.Create("DFrame");
  2314.     menu.frame:SetPos(g.ScrW()/2-184, g.ScrH()/2-155);
  2315.     menu.frame:SetSize(mwidth, mheight);
  2316.     menu.frame:SetTitle("");
  2317.     menu.frame:SetVisible(true);
  2318.     menu.frame:SetDraggable(false);
  2319.     menu.frame:SetSizable(false);
  2320.     menu.frame:ShowCloseButton(false);
  2321.     menu.frame:MakePopup();
  2322.    
  2323.     function menu.frame:GetSkin()
  2324.         return SKIN;
  2325.     end
  2326.    
  2327.     function menu.frame:Paint()
  2328.         g.draw.RoundedBox(7, 0, 0, self:GetWide(), self:GetTall(), g.Color(
  2329.         SH.GetCVNum("sh_color_menu_r"),
  2330.         SH.GetCVNum("sh_color_menu_g"),
  2331.         SH.GetCVNum("sh_color_menu_b"),
  2332.         SH.GetCVNum("sh_color_menu_a")));
  2333.        
  2334.         g.draw.SimpleText("SethHack", "shmenufont", 215, 10, g.Color(210, 210, 210, 235), TEXT_ALIGN_CENTER);
  2335.         g.draw.SimpleText("V4", "shmenufont", 365, 10, g.Color(0, 192, 255, 235), TEXT_ALIGN_CENTER);
  2336.         g.draw.SimpleText("sethhack.net", "DefaultBold", 355, 60, g.Color(210, 210, 210, 235), TEXT_ALIGN_CENTER);
  2337.     end
  2338.    
  2339.     menu.aimbutton, menu.aimpanel = SH.CreateButton("Aimbot", 75, 20, 15, 85, menu.frame);
  2340.     menu.friendsbutton, menu.friendspanel = SH.CreateButton("Friends", 75, 20, 15, 125, menu.frame);
  2341.     menu.teamsbutton, menu.teamspanel = SH.CreateButton("Teams", 75, 20, 15, 165, menu.frame);
  2342.     menu.custebutton, menu.custepanel = SH.CreateButton("Custom Ents", 75, 20, 15, 205, menu.frame);
  2343.     menu.espbutton, menu.esppanel = SH.CreateButton("ESP/Wallhack", 75, 20, 15, 245, menu.frame);
  2344.     menu.miscbutton, menu.miscpanel = SH.CreateButton("Misc", 75, 20, 15, 285, menu.frame);
  2345.     menu.configbutton, menu.configpanel = SH.CreateButton("Configurations", 75, 20, 15, 325, menu.frame);
  2346.     menu.iplogbutton, menu.iplogpanel = SH.CreateButton("IP Logs", 75, 20, 15, 365, menu.frame);
  2347.     menu.loggerbutton, menu.loggerpanel = SH.CreateButton("Logger", 75, 20, 15, 405, menu.frame);
  2348.    
  2349.     SH.CreateOption("Checkbox", menu.aimpanel, "Automatically fires when locked on to an enemy", "Triggerbot", "sh_triggerbot", 0, 0);
  2350.     SH.CreateOption("Checkbox", menu.aimpanel,
  2351.     "Automatically fires when looking at an enemy (does not require aimbot)",
  2352.     "Triggerbot (Always Shoot)", "sh_triggerbot_as", 0, 20);
  2353.     SH.CreateOption("Checkbox", menu.aimpanel, "Predicts the spread on weapons, making them more accurate", "Nospread", "sh_nospread", 0, 40);
  2354.     SH.CreateOption("Checkbox", menu.aimpanel, "Smoothly turns your aim to face the target", "Antisnap", "sh_antisnap", 0, 60);
  2355.     SH.CreateOption("Checkbox", menu.aimpanel, "Allows the aimbot to target members of your team", "Friendly Fire", "sh_friendlyfire", 0, 80);
  2356.     SH.CreateOption("Checkbox", menu.aimpanel, "Allows the aimbot to target players", "Target Players", "sh_targetplayers", 0, 100);
  2357.     SH.CreateOption("Checkbox", menu.aimpanel, "Allows the aimbot to target NPCs", "Target NPCs", "sh_targetnpcs", 0, 120);
  2358.     SH.CreateOption("Checkbox", menu.aimpanel, "Allows the aimbot to target custom entities on the ESP Entities list", "Target Entities", "sh_targetents", 0, 140);
  2359.     SH.CreateOption("Checkbox", menu.aimpanel, "Stops the aimbot from targetting Steam friends", "Ignore Steam Friends", "sh_ignorefriends", 0, 160);
  2360.     SH.CreateOption("Checkbox", menu.aimpanel, "Do not target players who don't have a weapon", "Ignore Weaponless Players", "sh_ignorenowep", 0, 180);
  2361.     SH.CreateOption("Checkbox", menu.aimpanel, "Allows the aimbot to target people through walls and other objects", "Don't check LOS", "sh_dclos", 0, 200);
  2362.     SH.CreateOption("Checkbox", menu.aimpanel, "Forces the aimbot to target bones instead of attachments. Required for bone selection.", "Target Bones", "sh_targetbones", 0, 220);
  2363.     SH.CreateOption("Checkbox", menu.aimpanel, "Aimbot ignores admins/superadmins.", "Ignore Admins", "sh_ignoreadmins", 0, 240);
  2364.    
  2365.     SH.CreateOption("Checkbox", menu.aimpanel, "Do not target other traitors (if you're a traitor)", "Ignore Traitors (TTT)", "sh_ignoretraitors", 185, 0);
  2366.     SH.CreateOption("Checkbox", menu.aimpanel, "Do not target other innocents (if you're innocent)", "Ignore Innocents (TTT)", "sh_targettraitors", 185, 20);
  2367.    
  2368.     SH.CreateOption("Slider", menu.aimpanel, "Targets a certain amount left/right from the target's head", "Aim Offset (Hrzntl.)", "sh_aimoffset_hoz", 1, -50, 50, 150, 180, 165);
  2369.     SH.CreateOption("Slider", menu.aimpanel, "Targets a certain amount down from the target's head", "Aim Offset (Vertical)", "sh_aimoffset_vert", 1, -50, 50, 150, 180, 205);
  2370.     SH.CreateOption("Slider", menu.aimpanel, "Controls how far around your aimbot can target people (degrees)", "Max FOV", "sh_maxfov", 0, 1, 180, 150, 180, 245);
  2371.     SH.CreateOption("Slider", menu.aimpanel, "Controls the speed of the Antisnap", "Antisnap Speed", "sh_antisnapspeed", 1, 0, 20, 150, 180, 285);
  2372.    
  2373.     SH.CreateOption("Label", menu.aimpanel, nil, "Bone:", 46, 285);
  2374.    
  2375.     SH.CreateOption("Label", menu.friendspanel, nil, "Players", 30, 0);
  2376.     SH.CreateOption("Label", menu.friendspanel, nil, "Friends", 250, 0);
  2377.    
  2378.     SH.CreateOption("Label", menu.teamspanel, nil, "Teams", 25, 0);
  2379.     SH.CreateOption("Label", menu.teamspanel, nil, "Whitelist", 250, 0);
  2380.    
  2381.     SH.CreateOption("Label", menu.custepanel, nil, "Entities", 25, 0);
  2382.     SH.CreateOption("Label", menu.custepanel, nil, "List", 250, 0);
  2383.    
  2384.     SH.CreateOption("Checkbox", menu.esppanel, "Show player's name, health, weapon, and more above their head", "ESP", "sh_esp", 0, 0);
  2385.     SH.CreateOption("Checkbox", menu.esppanel, "Allows you to see players and NPCs through walls and other objects", "Wallhack", "sh_wallhack", 0, 20);
  2386.     SH.CreateOption("Checkbox", menu.esppanel, "Turns players, props, weapons, and more into wireframe", "Wireframe Chams", "sh_wireframe", 0, 40);
  2387.     SH.CreateOption("Checkbox", menu.esppanel, "Turns players, props, weapons, and more into solid chams", "Solid Chams", "sh_solids", 0, 60);
  2388.     SH.CreateOption("Checkbox", menu.esppanel, "Shows a list of admins and superadmins in the top right of the screen", "Show Admins", "sh_showadmins", 0, 80);
  2389.     SH.CreateOption("Checkbox", menu.esppanel, "Shows a list of what the drug dealer is current buying/selling in the top left of the screen", "Show Druggy Stock (PERP)", "sh_showdruggy", 0, 100);
  2390.     SH.CreateOption("Checkbox", menu.esppanel, "Shows a players distance on the esp", "Show Distance", "sh_esp_showdist", 0, 120);
  2391.     SH.CreateOption("Checkbox", menu.esppanel, "Shows players GangWars gangs", "Show GangWars Gangs", "sh_esp_showgangs", 0, 140);
  2392.     SH.CreateOption("Checkbox", menu.esppanel, "Shows a laser eye trace to player's view positions", "Laser Eyes", "sh_lasereyes", 0, 160);
  2393.     SH.CreateOption("Checkbox", menu.esppanel, "Shows a laser eye trace from your weapon to your hit position", "Laser Sights", "sh_lasersights", 0, 180);
  2394.    
  2395.     SH.CreateOption("Slider", menu.esppanel, "The maximum distance that players can be for the ESP to show them",
  2396.     "Max ESP Dist", "sh_esp_dist", 0, 1, 25000, 150, 180, 245);
  2397.     SH.CreateOption("Slider", menu.esppanel, "The maximum distance that players can be for the Wallhack to show them",
  2398.     "Max Wallhack Dist", "sh_wallhack_dist", 0, 1, 25000, 150, 180, 285);
  2399.    
  2400.     SH.CreateOption("Checkbox", menu.miscpanel, "Automatically reloads your weapon when you have no ammo", "Autoreload", "sh_autoreload", 0, 0);
  2401.     SH.CreateOption("Checkbox", menu.miscpanel, "Blocks RunConsoleCommand and :ConCommand() from being used", "Block RunConsoleCommand", "sh_blockrcc", 0, 20);
  2402.     SH.CreateOption("Checkbox", menu.miscpanel, "Puts your view into thirdperson mode", "Thirdperson", "sh_thirdperson", 0, 40);
  2403.     SH.CreateOption("Checkbox", menu.miscpanel, "Logs functions such as RunConsoleCommand and file.Exists", "Console Logging", "sh_logging_console", 0, 60);
  2404.     SH.CreateOption("Checkbox", menu.miscpanel, "Disables custom view", "Disable CalcView", "sh_disablecalcview", 0, 80);
  2405.     SH.CreateOption("Checkbox", menu.miscpanel, "Bypass ULX's gag (voicemute) system", "Bypass ULX Gag", "sh_ulxungag", 0, 100);
  2406.     SH.CreateOption("Checkbox", menu.miscpanel, "Turn off every single SethHack feature", "Panic Mode", "sh_panicmode", 0, 120);
  2407.     SH.CreateOption("Checkbox", menu.miscpanel, "Disable recoil for weapons. Needs a respawn to disable.", "No-Recoil", "sh_norecoil", 0, 140);
  2408.     SH.CreateOption("Checkbox", menu.miscpanel, "Randomly change your name to that of other players.", "Name-Changer", "sh_namechange", 0, 160);
  2409.     SH.CreateOption("Checkbox", menu.miscpanel, "Jump the moment you touch the ground if you are holding space", "Bunnyhop", "sh_bhop", 0, 180);
  2410.     SH.CreateOption("Checkbox", menu.miscpanel, "Shows connecting player's IP in your console", "IP Logging", "sh_iplogs", 0, 200);
  2411.     SH.CreateOption("Checkbox", menu.miscpanel, "Enables a clientside noclip", "Client Noclip", "sh_clientnoclip", 0, 220);
  2412.     SH.CreateOption("Checkbox", menu.miscpanel, "Prints into chatbox when an admin spectates you!", "Show Spectators", "sh_showspectators", 0, 240);
  2413.    
  2414.     SH.CreateOption("Slider", menu.miscpanel, "Speed of the clientside noclip", "Client Noclip Speed", "sh_clientnoclip_speed", 0, 200, 2000, 150, 180, 165);
  2415.     SH.CreateOption("Slider", menu.miscpanel, "Your view's field-of-view (FOV). Set to 0 to disable", "Field-Of-View", "sh_fov", 0, 0, 90, 150, 180, 205);
  2416.     SH.CreateOption("Slider", menu.miscpanel,
  2417.     "The distance that the thirdperson camera is from yourself",
  2418.     "Thirdperson Distance", "sh_thirdperson_dist", 0, 0, 200, 150, 180, 245);
  2419.     SH.CreateOption("Slider", menu.miscpanel, "The speed of the speedhack", "Speedhack Speed", "sh_speedhack_speed", 2, 1, 25, 150, 180, 285);
  2420.    
  2421.     SH.CreateButton("Blow C4s (TTT)", 85, 20, 0, 290, menu.miscpanel, SH.BlowC4);
  2422.    
  2423.     SH.CreateOption("Checkbox", menu.friendspanel, "Makes the friends list an enemy list", "Friends List is Enemy List", "sh_friendisenemy", 95, 255);
  2424.     SH.CreateOption("Checkbox", menu.teamspanel, "Makes the teams list an enemy list", "Teams List is Enemy List", "sh_teamisenemy", 95, 255);
  2425.    
  2426.     SH.CreateOption("Label", menu.configpanel, nil, [[
  2427.         Custom configurations allow you to save all SethHack settings
  2428.         under a specified name, and restore the exact same settings
  2429.         at a later time!]], 5, 260);
  2430.        
  2431.     SH.CreateOption("Label", menu.friendspanel, nil, [[
  2432.         Players added to the friends list will not be targetted
  2433.         by the aimbot. If the above box is checked, only players
  2434.         on this list will be targetted.]], 15, 280);
  2435.        
  2436.     SH.CreateOption("Label", menu.teamspanel, nil, [[
  2437.         Players on teams added to the friends list will not be
  2438.         targetted by the aimbot. If the above box is checked,
  2439.         only players on teams on this list will be targetted.]], 15, 280);
  2440.        
  2441.     SH.CreateOption("Label", menu.custepanel, nil, [[
  2442.         Entities added to this list will be shown on the ESP.]], 15, 290);
  2443.        
  2444.     if(menu.aimpanel) then
  2445.         local List = vgui.Create("DMultiChoice", menu.aimpanel);
  2446.         List:SetPos(0, 300);
  2447.         List:SetSize(125, 20);
  2448.        
  2449.         for k, v in g.pairs(SH.nicebones) do
  2450.             List:AddChoice(v[1]);
  2451.         end
  2452.        
  2453.         List:SetConVar(SH.tvars["sh_aimbone"][2]);
  2454.         g.timer.Simple(0.01, function()
  2455.             List:SetText(SH.GetCVStr("sh_aimbone"));
  2456.         end);
  2457.         List:SetEditable(false);
  2458.     end
  2459.    
  2460.     local FriendsList, TeamList, EntsList;
  2461.    
  2462.     local CloseButton = vgui.Create("DSysButton", menu.frame);
  2463.     CloseButton:SetType("close");
  2464.     CloseButton:SetPos(481, 2);
  2465.     CloseButton:SetSize(15, 15);
  2466.     CloseButton.DoClick = function() if(menu.frame) then menu.frame:Remove(); menu.frame = nil; end end;
  2467.    
  2468.     if(menu.friendspanel) then
  2469.         --[[ Friends List --]]
  2470.         local FriendsList;
  2471.         local function FList()
  2472.             FriendsList = vgui.Create("DComboBox", menu.friendspanel)
  2473.             FriendsList:SetPos(0, 25);
  2474.             FriendsList:SetSize(110, 180);
  2475.             FriendsList:SetMultiple(false);
  2476.             for k, v in g.pairs(g_players) do
  2477.                 if(v ~= me and not g.table.HasValue(SH.aimfriends, v)) then
  2478.                     local i = FriendsList:AddItem(v:Nick());
  2479.                     i:SetTooltip(v:Nick());
  2480.                 end
  2481.             end
  2482.         end
  2483.         FList();
  2484.        
  2485.         local FriendsListC;
  2486.         local function FListC()
  2487.             FriendsListC = vgui.Create("DComboBox", menu.friendspanel);
  2488.             FriendsListC:SetPos(225, 25);
  2489.             FriendsListC:SetSize(110, 180);
  2490.             FriendsListC:SetMultiple(false);
  2491.             for k, v in g.pairs(SH.aimfriends) do
  2492.                 local i = FriendsListC:AddItem(v:Nick());
  2493.                 i:SetTooltip(v:Nick());
  2494.             end
  2495.         end
  2496.         FListC()
  2497.        
  2498.         local FriendsListAdd = vgui.Create("DButton", menu.friendspanel);
  2499.         FriendsListAdd:SetPos(20, 215);
  2500.         FriendsListAdd:SetText("Add");
  2501.         FriendsListAdd.DoClick = function()
  2502.             if(FriendsList:GetSelectedItems() and FriendsList:GetSelectedItems()[1]) then
  2503.                 for k, v in g.pairs(g_players) do
  2504.                     if(v:Nick() == FriendsList:GetSelectedItems()[1]:GetValue()) then
  2505.                         g.table.insert(SH.aimfriends, v);
  2506.                         me:ChatPrint("Added " .. v:Nick());
  2507.                     end
  2508.                 end
  2509.             end
  2510.             FList();
  2511.             FListC();
  2512.         end
  2513.            
  2514.         local FriendsListRem = vgui.Create("DButton", menu.friendspanel);
  2515.         FriendsListRem:SetPos(240, 215);
  2516.         FriendsListRem:SetText("Remove");
  2517.         FriendsListRem.DoClick = function()
  2518.             if(FriendsListC:GetSelectedItems() and FriendsListC:GetSelectedItems()[1]) then
  2519.                 for k, v in g.pairs(SH.aimfriends) do
  2520.                     if(v:Nick() == FriendsListC:GetSelectedItems()[1]:GetValue()) then
  2521.                         g.table.remove(SH.aimfriends, k);
  2522.                         me:ChatPrint("Removed " .. v:Nick());
  2523.                     end
  2524.                 end
  2525.             end
  2526.             FListC();
  2527.             FList();
  2528.         end
  2529.     end
  2530.    
  2531.     if(menu.teamspanel) then
  2532.         local function TList()
  2533.             TeamList = vgui.Create("DComboBox", menu.teamspanel);
  2534.             TeamList:SetPos(0, 25);
  2535.             TeamList:SetSize(110, 180);
  2536.             TeamList:SetMultiple(false);
  2537.             for k, v in g.pairs(SH.teamlist) do
  2538.                 if(not g.table.HasValue(SH.aimteams,v.Name)) then
  2539.                     local i = TeamList:AddItem(v.Name);
  2540.                     i:SetTooltip(v.Name);
  2541.                 end
  2542.             end
  2543.         end
  2544.         TList()
  2545.        
  2546.         local TeamListC
  2547.         local function TListC()
  2548.             TeamListC = vgui.Create("DComboBox", menu.teamspanel);
  2549.             TeamListC:SetPos(225, 25);
  2550.             TeamListC:SetSize(110, 180);
  2551.             TeamListC:SetMultiple(false);
  2552.             for k, v in g.pairs(SH.aimteams) do
  2553.                 local i = TeamListC:AddItem(v);
  2554.                 i:SetTooltip(v);
  2555.             end
  2556.         end
  2557.            
  2558.         TListC();
  2559.            
  2560.         local TeamListAdd = vgui.Create("DButton", menu.teamspanel);
  2561.         TeamListAdd:SetPos(20, 215);
  2562.         TeamListAdd:SetText("Add");
  2563.         TeamListAdd.DoClick = function()
  2564.             if(TeamList:GetSelectedItems() and TeamList:GetSelectedItems()[1]) then
  2565.                 for k, v in g.pairs(SH.teamlist) do
  2566.                     if(v.Name == TeamList:GetSelectedItems()[1]:GetValue()) then
  2567.                         g.table.insert(SH.aimteams, v.Name);
  2568.                         me:ChatPrint("Added " .. v.Name);
  2569.                     end
  2570.                 end
  2571.             end
  2572.             TList();
  2573.             TListC();
  2574.         end
  2575.            
  2576.         local TeamListRem = vgui.Create("DButton", menu.teamspanel);
  2577.         TeamListRem:SetPos(240, 215);
  2578.         TeamListRem:SetText("Remove");
  2579.         TeamListRem.DoClick = function()
  2580.             if(TeamListC:GetSelectedItems() and TeamListC:GetSelectedItems()[1]) then
  2581.                 for k, v in g.pairs(SH.aimteams) do
  2582.                     if(v == TeamListC:GetSelectedItems()[1]:GetValue()) then
  2583.                         table.remove(SH.aimteams, k );
  2584.                         me:ChatPrint("Removed " .. v);
  2585.                     end
  2586.                 end
  2587.             end
  2588.             TListC();
  2589.             TList();
  2590.         end
  2591.     end
  2592.    
  2593.     if(menu.custepanel) then
  2594.         local function EList()
  2595.             EntsList = vgui.Create("DComboBox", menu.custepanel)
  2596.             EntsList:SetPos(0, 25);
  2597.             EntsList:SetSize(110, 180);
  2598.             EntsList:SetMultiple(false);
  2599.             for k, v in g.pairs(fentsGetAll()) do
  2600.                 if(not SH.custe[v]) then
  2601.                     local i = EntsList:AddItem(v);
  2602.                     i:SetTooltip(v);
  2603.                 end
  2604.             end
  2605.         end
  2606.         EList();
  2607.        
  2608.         local EntsListC;
  2609.         local function EListC()
  2610.             EntsListC = vgui.Create("DComboBox", menu.custepanel);
  2611.             EntsListC:SetPos(225, 25);
  2612.             EntsListC:SetSize(110, 180);
  2613.             EntsListC:SetMultiple(false);
  2614.             for k, v in g.pairs(SH.custe) do
  2615.                 local i = EntsListC:AddItem(k);
  2616.                 i:SetTooltip(k);
  2617.             end
  2618.         end
  2619.        
  2620.         EListC();
  2621.        
  2622.         local EntsListAdd = vgui.Create("DButton", menu.custepanel);
  2623.         EntsListAdd:SetPos(20, 215);
  2624.         EntsListAdd:SetText("Add");
  2625.         EntsListAdd.DoClick = function()
  2626.             if(EntsList:GetSelectedItems() and EntsList:GetSelectedItems()[1]) then
  2627.                 for k, v in g.pairs(fentsGetAll()) do
  2628.                     if(v == EntsList:GetSelectedItems()[1]:GetValue()) then
  2629.                         SH.custe[v] = true;
  2630.                        
  2631.                         local t = SH.data.GetOptionTab("ESPEnts") or {};
  2632.                         t[v] = true;
  2633.                         SH.data.SetOptionTab("ESPEnts", t);
  2634.                        
  2635.                         me:ChatPrint("Added " .. v);
  2636.                     end
  2637.                 end
  2638.             end
  2639.             EList();
  2640.             EListC();
  2641.         end
  2642.            
  2643.         local EntsListRem = vgui.Create("DButton", menu.custepanel);
  2644.         EntsListRem:SetPos(240, 215);
  2645.         EntsListRem:SetText("Remove");
  2646.         EntsListRem.DoClick = function()
  2647.             if(EntsListC:GetSelectedItems() and EntsListC:GetSelectedItems()[1]) then
  2648.                 for k, v in g.pairs(SH.custe) do
  2649.                     if(k == EntsListC:GetSelectedItems()[1]:GetValue()) then
  2650.                         SH.custe[k] = nil;
  2651.                        
  2652.                         local t = SH.data.GetOptionTab("ESPEnts") or {};
  2653.                         t[k] = nil;
  2654.                         SH.data.SetOptionTab("ESPEnts", t);
  2655.                        
  2656.                         me:ChatPrint("Removed " .. k);
  2657.                     end
  2658.                 end
  2659.             end
  2660.             EListC();
  2661.             EList();
  2662.         end
  2663.        
  2664.         local EntsListClr = vgui.Create("DButton", menu.custepanel);
  2665.         EntsListClr:SetPos(135, 145);
  2666.         EntsListClr:SetText("Clear");
  2667.         EntsListClr.DoClick = function()
  2668.             SH.custe = {};
  2669.             SH.data.SetOptionTab("ESPEnts", SH.custe);
  2670.             EListC();
  2671.             EList();
  2672.         end
  2673.     end
  2674.    
  2675.     if(menu.configpanel) then
  2676.         local ConfigList;
  2677.         local function CList()
  2678.             ConfigList = vgui.Create("DComboBox", menu.configpanel)
  2679.             ConfigList:SetPos(0, 25);
  2680.             ConfigList:SetSize(305, 175);
  2681.             ConfigList:SetMultiple(false);
  2682.             for k, v in g.pairs(SH.configs) do
  2683.                 ConfigList:AddItem(k);
  2684.             end
  2685.         end
  2686.         CList();
  2687.        
  2688.         local ConfigListUse = vgui.Create("DButton", menu.configpanel);
  2689.         ConfigListUse:SetPos(5, 215);
  2690.         ConfigListUse:SetSize(85, 20);
  2691.         ConfigListUse:SetText("Use Selected");
  2692.         ConfigListUse.DoClick = function()
  2693.             if(ConfigList:GetSelectedItems() and ConfigList:GetSelectedItems()[1]) then
  2694.                 local txt = ConfigList:GetSelectedItems()[1]:GetText();
  2695.                 if(SH.configs[txt]) then
  2696.                     for k, v in g.pairs(SH.configs[txt]) do
  2697.                         if(SH.tvars[v[1]] and SH.tvars[v[1]][2]) then
  2698.                             g.RunConsoleCommand(SH.tvars[v[1]][2], v[2]);
  2699.                         end
  2700.                     end
  2701.                     me:ChatPrint("Enabled " .. txt .. " config!");
  2702.                 end
  2703.             end
  2704.         end
  2705.        
  2706.         local ConfigListDelete = vgui.Create("DButton", menu.configpanel);
  2707.         ConfigListDelete:SetPos(110, 215);
  2708.         ConfigListDelete:SetSize(85, 20);
  2709.         ConfigListDelete:SetText("Delete Selected");
  2710.         ConfigListDelete.DoClick = function()
  2711.             if(ConfigList:GetSelectedItems() and ConfigList:GetSelectedItems()[1]) then
  2712.                 local txt = ConfigList:GetSelectedItems()[1]:GetText();
  2713.                 if(txt == "Default") then
  2714.                     me:ChatPrint("You can't delete the default configuration!");
  2715.                     return;
  2716.                 end
  2717.                
  2718.                 local t = SH.data.GetOptionTab("Configs") or {};
  2719.                 t[txt] = nil;
  2720.                 SH.data.SetOptionTab("Configs", t);
  2721.                
  2722.                 SH.configs[txt] = nil;
  2723.                 me:ChatPrint("Deleted config " .. txt);
  2724.                 CList();
  2725.             end
  2726.         end
  2727.        
  2728.         local ConfigListSave = vgui.Create("DButton", menu.configpanel);
  2729.         ConfigListSave:SetPos(215, 215);
  2730.         ConfigListSave:SetSize(85, 20);
  2731.         ConfigListSave:SetText("Save Current");
  2732.         ConfigListSave.DoClick = function()
  2733.             g.gui.EnableScreenClicker(true);
  2734.             SH.vars.chatting = true;
  2735.             g.Derma_StringRequest("Config Name", "Enter a name for this configuration.",
  2736.             ((ConfigList:GetSelectedItems() and ConfigList:GetSelectedItems()[1]) and ConfigList:GetSelectedItems()[1]:GetText()) or "",
  2737.             function(n)
  2738.                 g.gui.EnableScreenClicker(false);
  2739.                 SH.vars.chatting = false;
  2740.                
  2741.                 if(not n or g.string.len(n) < 2) then
  2742.                     me:ChatPrint("Please enter a config name!");
  2743.                     return;
  2744.                 end
  2745.                
  2746.                 local ge = "";
  2747.                 for k, v in g.pairs(SH.tvars) do
  2748.                     ge = ge .. k .. "=" .. v[1] .. "`";
  2749.                 end
  2750.                
  2751.                 local t = SH.data.GetOptionTab("Configs") or {};
  2752.                 t[n] = ge;
  2753.                 SH.data.SetOptionTab("Configs", t);
  2754.                
  2755.                 local t = {};
  2756.                 for k, v in g.pairs(SH.tvars) do
  2757.                     g.table.insert(t, {k, v[1]});
  2758.                 end
  2759.                 SH.configs[n] = t;
  2760.                 me:ChatPrint("Saved config " .. n);
  2761.                 CList();
  2762.             end, function() g.gui.EnableScreenClicker(false); SH.vars.chatting = false; end, "Submit", "Cancel");
  2763.         end
  2764.     end
  2765.    
  2766.     if(menu.iplogpanel) then       
  2767.         local IPSearch = vgui.Create("DTextEntry", menu.iplogpanel);
  2768.         IPSearch:SetPos(0, 0);
  2769.         IPSearch:SetSize(250, 20);
  2770.         IPSearch:SetEditable(false);
  2771.         IPSearch:SetText("Filtered by: " .. (SH.IPSrch ~= "" and SH.IPSrch or "None"));
  2772.        
  2773.         local IPEdit = vgui.Create("DButton", menu.iplogpanel);
  2774.         IPEdit:SetText("Edit");
  2775.         IPEdit:SetPos(252, 0);
  2776.         IPEdit:SetSize(52, 20);
  2777.         IPEdit.DoClick = function()
  2778.             g.gui.EnableScreenClicker(true);
  2779.             SH.vars.chatting = true;
  2780.            
  2781.             g.Derma_StringRequest("Name Filter", "Enter a name to filter the IP logs with.\nLeave blank for no filter.", SH.IPSrch, function(txt)
  2782.                 SH.IPSrch = txt;
  2783.                 SH.BuildIPLogList();
  2784.                 g.gui.EnableScreenClicker(false);
  2785.                 SH.vars.chatting = false;
  2786.                
  2787.                 g.timer.Simple(.01, function() if(not menu.frame) then SH.Menu(); end end);
  2788.             end,
  2789.             function(txt)
  2790.                 g.gui.EnableScreenClicker(false); SH.vars.chatting = false;
  2791.                 g.timer.Simple(.01, function() if(not menu.frame) then SH.Menu(); end end);
  2792.             end,
  2793.             "Filter", "Cancel");   
  2794.         end
  2795.        
  2796.         local IPLogList = vgui.Create("DListView", menu.iplogpanel);
  2797.         IPLogList:SetPos(0, 25);
  2798.         IPLogList:SetSize(305, 300);
  2799.         IPLogList:SetMultiSelect(false);
  2800.         IPLogList:AddColumn("Name");
  2801.         IPLogList:AddColumn("IP/Port");
  2802.         IPLogList.OnClickLine = function(prnt, line, sel)
  2803.             g.SetClipboardText(line:GetValue(2));
  2804.             me:ChatPrint("Copied IP to clipboard!");
  2805.         end
  2806.        
  2807.         function SH.BuildIPLogList()
  2808.             IPLogList:Clear();
  2809.            
  2810.             local IPLT = {};
  2811.            
  2812.             for k, v in g.pairs(g.string.Explode("\n", g.SH_READFILE("iplog.txt"))) do
  2813.                 if(g.string.find(v, "Player")) then
  2814.                     if(g.string.find(g.string.lower(v), g.string.lower(SH.IPSrch))) then
  2815.                         local expl = g.string.Explode(" connected from ", v);
  2816.                         if(expl and expl[1] and expl[2]) then
  2817.                             expl[1] = g.string.Replace(expl[1], "Player ", "");
  2818.                             if(not g.table.HasValue(IPLT, expl[1])) then
  2819.                                 IPLogList:AddLine(expl[1], expl[2]);
  2820.                                 g.table.insert(IPLT, expl[1]);
  2821.                             end
  2822.                         end
  2823.                     end
  2824.                 end
  2825.             end
  2826.         end
  2827.        
  2828.         SH.BuildIPLogList();
  2829.     end
  2830.    
  2831.     if(menu.loggerpanel) then
  2832.         local FnLogList = vgui.Create("DListView", menu.loggerpanel);
  2833.         FnLogList:SetPos(0, 25);
  2834.         FnLogList:SetSize(305, 300);
  2835.         FnLogList:SetMultiSelect(false);
  2836.         local ColTime = FnLogList:AddColumn("Time");
  2837.         local ColFn = FnLogList:AddColumn("Function");
  2838.         local ColArgs = FnLogList:AddColumn("Arguments");
  2839.         local ColStat = FnLogList:AddColumn("Status");
  2840.         FnLogList.OnClickLine = function(prnt, line, sel)
  2841.             if(g.table.HasValue(SH.fnblock, line:GetValue(2))) then
  2842.                 for k, v in g.pairs(SH.fnblock) do
  2843.                     if(v == line:GetValue(2)) then
  2844.                         g.table.remove(SH.fnblock, k);
  2845.                         me:ChatPrint("Function " .. line:GetValue(2) .. " unblocked.");
  2846.                     end
  2847.                 end
  2848.             else
  2849.                 g.table.insert(SH.fnblock, line:GetValue(2));
  2850.                 me:ChatPrint("Function " .. line:GetValue(2) .. " blocked.");
  2851.             end
  2852.         end
  2853.        
  2854.         ColTime:SetFixedWidth(50);
  2855.         ColFn:SetFixedWidth(125);
  2856.         ColArgs:SetFixedWidth(65);
  2857.         ColStat:SetFixedWidth(50);
  2858.        
  2859.         for k, v in g.pairs(SH.fnlogs) do
  2860.             local ln = FnLogList:AddLine(v.time, v.func, v.args, v.status);
  2861.             ln:SetTooltip("Time: " .. v.time .. "\nFunction: " .. v.func .. "\nArguments: " .. v.args .. "\nStatus: " .. v.status);
  2862.         end
  2863.        
  2864.         timer.Simple(0, FnLogList.VBar.SetScroll, FnLogList.VBar, 20000000)
  2865.     end
  2866. end
  2867.  
  2868. SH:RegisterCommand("+sh_menu", SH.Menu);
  2869. SH:RegisterCommand("-sh_menu", function()
  2870.     --SelectedWindow = "Aimbot";
  2871.     if(menu.frame) then
  2872.         menu.frame:Remove();
  2873.         menu = {};
  2874.     end
  2875.    
  2876.     g.gui.EnableScreenClicker(false);
  2877.     local dframe = vgui.Create("DFrame");
  2878.     dframe:SetSize(0,0);
  2879.     dframe:SetVisible(true);
  2880.     dframe:MakePopup();
  2881.     g.timer.Simple(.1, function()
  2882.         dframe:Remove();
  2883.     end);
  2884. end);
  2885.  
  2886. function SH.UpdateMenu()
  2887.     --if(SH.GetCVNum("sh_updateversion") < SH.vars.UpdateVersion) then
  2888.     if(g.SH_MODVER < 23) then
  2889.         --g.RunConsoleCommand(SH.tvars["sh_updateversion"][2], tostring(SH.vars.UpdateVersion));
  2890.         local umenu = vgui.Create("DFrame");
  2891.         umenu:SetSize(500, 550);
  2892.         umenu:SetPos(10, 10);
  2893.         umenu:ShowCloseButton(false);
  2894.         umenu:SetTitle("SethHack Update");
  2895.         umenu:MakePopup();
  2896.  
  2897.         local ulabel = vgui.Create("DTextEntry", umenu);
  2898.         ulabel:SetPos(10, 25);
  2899.         ulabel:SetSize(480, 450);
  2900.         ulabel:SetEditable(false);
  2901.         ulabel:SetMultiline(true);
  2902.  
  2903.         local ubutton = vgui.Create("DButton", umenu);
  2904.         ubutton:SetPos(25, 485);
  2905.         ubutton:SetSize(450, 50);
  2906.         ubutton:SetText("Close");
  2907.         function ubutton:DoClick()
  2908.             umenu:Remove();
  2909.             umenu = nil;
  2910.             g.SH_PURECC("exit");
  2911.         end
  2912.  
  2913.         ulabel:SetText([[
  2914.             Hello!
  2915.             There's a small update, it fixes a few things with the data saving in the registry.
  2916.            
  2917.             Please redownload your injector.
  2918.            
  2919.             You will also need to re-make your settings and binds. Sorry, it's unavoidable.
  2920.         ]]);
  2921.     end
  2922. end
  2923.  
  2924. --[[_CG = nil;
  2925. ACT_DOD_CROUCHWALK_AIM_PSCHRECK = 784;--]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement