Advertisement
s1linw

helper0k

Jun 11th, 2021
1,404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 117.36 KB | None | 0 0
  1. ffi.cdef[[
  2. void* CreateFileA(
  3. const char* lpFileName,
  4. unsigned long dwDesiredAccess,
  5. unsigned long dwShareMode,
  6. unsigned long lpSecurityAttributes,
  7. unsigned long dwCreationDisposition,
  8. unsigned long dwFlagsAndAttributes,
  9. void* hTemplateFile
  10. );
  11. bool ReadFile(
  12. void* hFile,
  13. char* lpBuffer,
  14. unsigned long nNumberOfBytesToRead,
  15. unsigned long* lpNumberOfBytesRead,
  16. int lpOverlapped
  17. );
  18. bool WriteFile(
  19. void* hFile,
  20. char* lpBuffer,
  21. unsigned long nNumberOfBytesToWrite,
  22. unsigned long* lpNumberOfBytesWritten,
  23. void* lpOverlapped
  24. );
  25.  
  26. unsigned long GetFileSize(
  27. void* hFile,
  28. unsigned long* lpFileSizeHigh
  29. );
  30. bool CreateDirectoryA(
  31. const char* lpPathName,
  32. void* lpSecurityAttributes
  33. );
  34. void* CloseHandle(void *hFile);
  35. typedef int(__fastcall* clantag_t)(const char*, const char*);
  36.  
  37. typedef struct _OVERLAPPED {
  38. unsigned long* Internal;
  39. unsigned long* InternalHigh;
  40. union {
  41. struct {
  42. unsigned long Offset;
  43. unsigned long OffsetHigh;
  44. } DUMMYSTRUCTNAME;
  45. void* Pointer;
  46. } DUMMYUNIONNAME;
  47. void* hEvent;
  48. } OVERLAPPED, *LPOVERLAPPED;
  49.  
  50. typedef struct _class
  51. {
  52. void** this;
  53. }aclass;
  54. ]]
  55. ffi.C.CreateDirectoryA("nl\\GrenadeHelper", nil)
  56.  
  57. local font = g_Render:InitFont("Tahoma", 13)
  58. local font_p = g_Render:InitFont("Smallest Pixel-7", 10)
  59. local font_b = g_Render:InitFont("Tahoma bold", 12)
  60.  
  61.  
  62. local menu_elements = {
  63. autostrafe = g_Config:FindVar("Miscellaneous", "Main", "Movement", "Auto Strafe"),
  64. autostrafe_smooth = g_Config:FindVar("Miscellaneous", "Main", "Movement", "Smoothing"),
  65. thirdpeson = g_Config:FindVar("Visuals", "View", "Thirdperson", "Enable Thirdperson"),
  66.  
  67. fake_angle = g_Config:FindVar("Aimbot", "Anti Aim", "Fake Angle", "Enable Fake Angle"),
  68. double_tap = g_Config:FindVar("Aimbot", "Ragebot", "Exploits", "Double Tap"),
  69. fakelag = g_Config:FindVar("Aimbot", "Anti Aim", "Fake Lag", "Enable Fake Lag"),
  70. }
  71. local lua_elements = {
  72.  
  73. nade_helper = menu.Switch("Grenade Helper", "Bind Key", false),
  74. nade_helper_nades = menu.MultiCombo("Grenade Helper", "Grenades", {"Hegrenade", "Molotov", "Smoke", "Flashbang"}, 0),
  75. nade_helper_types = menu.MultiCombo("Grenade Helper", "Presets", {"Standard", "locations #1", "locations #2", "locations #3"}, 0),
  76. nade_helper_fov = menu.SliderInt("Grenade Helper", "FOV", 15, 1, 160),
  77.  
  78. create_nade = menu.Button("Locations Creator", "Create Location"),
  79.  
  80. nade_helper_theme = menu.Combo("Color Settings", "Theme", {"Default", "Orange", "Blue", "White"}, 1),
  81.  
  82. yaw_slider = menu.SliderFloat("Grenade Constructor", "Axis X", 0, -180, 180),
  83. pitch_slider = menu.SliderFloat("Grenade Constructor", "Axis Y", 0, -89, 89),
  84. throw_strengh = menu.SliderFloat("Grenade Constructor", "Throw Power", 100, 0, 100),
  85.  
  86. properties = menu.MultiCombo("Grenade Constructor", "Properies", {"Run", "Jump", "Duck"}, 0),
  87.  
  88. run_duration = menu.SliderInt("Grenade Constructor", "Run Duration", 0, 0, 64),
  89. run_velocity = menu.SliderFloat("Grenade Constructor", "Run Velocity", 0, 0, 450),
  90. run_direction = menu.Combo("Grenade Constructor", "Run Direction", {"Forward", "Backward", "Left", "Right"}, 0),
  91. extend_forward_strenght = menu.Switch("Grenade Constructor", "Extern Forward Strength", false),
  92. backup_direction = menu.Combo("Grenade Constructor", "Backup Direction", {"None", "Forward", "Backward", "Left", "Right"}, 0),
  93. backup_strafe_duration = menu.SliderInt("Grenade Constructor", "Backup Duration", 1, 1, 64),
  94.  
  95. jump_duration = menu.SliderInt("Grenade Constructor", "Delay", 0, 0, 64),
  96. jump_thresthold = menu.SliderInt("Grenade Constructor", "Jump Strength", 0, 0, 6),
  97.  
  98. nade_name = menu.TextBox("Grenade Constructor", "Position Name", 128, "", "This will be the name of your location"),
  99. nade_description = menu.TextBox("Grenade Constructor", "Description", 128, "", "Here you can write where the grenade will fly, how it throws, and much more"),
  100.  
  101. nade_teleport = menu.Button("Grenade Constructor", "Teleport to Location"),
  102. nade_update_pos_ang = menu.Button("Grenade Constructor", "Set new Location"),
  103.  
  104. save_nade_cfg = menu.Combo("Grenade Constructor", "Save At", { "locations #1", "locations #2", "locations #3"}, 0),
  105. save_nade = menu.Button("Grenade Constructor", "Confirm"),
  106. remove_nade = menu.Button("Grenade Constructor", "Cancel"),
  107.  
  108. user_name = cheat.GetCheatUserName(),
  109. screensize = g_EngineClient:GetScreenSize(),
  110. }
  111.  
  112. local ragebot_helpers = {
  113. DisableTargets = function(self)
  114. for i = 1, 64 do
  115. ragebot.IgnoreTarget(i)
  116. end
  117. end,
  118.  
  119. ForceHead = function(self, index)
  120. for i = 1, 64 do
  121. if(i ~= index) then
  122. ragebot.IgnoreTarget(i)
  123. else
  124. for j = 2, 18 do
  125. ragebot.EnableHitbox(i, j, false)
  126. end
  127. end
  128. end
  129. end,
  130. }
  131. local math_helpers = {
  132. normalizeangles = function(self, ang)
  133. if(ang.pitch > 180.0) then ang.pitch = ang.pitch - 360.0 end
  134. if(ang.yaw > 180.0) then ang.yaw = ang.yaw - 360.0 end
  135. return ang
  136. end,
  137.  
  138. normalizefloat = function(self, ang)
  139. if(ang > 180.0) then ang = ang - 360.0 end
  140. if(ang < -180.0) then ang = ang + 360.0 end
  141. return ang
  142. end,
  143.  
  144. calcangle = function(self, src, dst)
  145. local vecdelta = Vector.new(dst.x - src.x, dst.y - src.y, dst.z - src.z)
  146. local angles = QAngle.new(math.atan2(-vecdelta.z, vecdelta:Length2D()) * 180.0 / math.pi, (math.atan2(vecdelta.y, vecdelta.x) * 180.0 / math.pi), 0.0)
  147. return angles
  148. end,
  149.  
  150. lerp = function(self, start, vend, time)
  151. return start + (vend - start) * time
  152. end,
  153.  
  154. clamp = function(self, val, min, max)
  155. if(val > max) then
  156. val = max
  157. elseif(val < min) then
  158. val = min
  159. end
  160. return val
  161. end,
  162.  
  163. pointinscreen = function(self, point)
  164. if(point.x > 0 and point.x < lua_elements.screensize.x and point.y > 0 and point.y < lua_elements.screensize.x) then
  165. return true
  166. else
  167. return false
  168. end
  169. end,
  170.  
  171. boxinscreen = function(self, max, min)
  172. if(min.x > 0 and min.x < lua_elements.screensize.x and min.y > 0 and max.y < lua_elements.screensize.x and max.x > 0 and max.x < lua_elements.screensize.x and max.y > 0 and max.y < lua_elements.screensize.x) then
  173. return true
  174. else
  175. return false
  176. end
  177. end,
  178.  
  179. TIME_TO_TICKS = function(self, time)
  180. return math.floor(time / g_GlobalVars.interval_per_tick + 0.5)
  181. end,
  182.  
  183. TICKS_TO_TIME = function(self, tick)
  184. return tick * g_GlobalVars.interval_per_tick
  185. end,
  186. }
  187. local target_selection = {
  188. distance = function(self, localplayer)
  189. local origin = localplayer:GetProp("DT_BaseEntity", "m_vecOrigin")
  190. local bestdistance = 8192.0
  191. local bestplayer = nil
  192. for i = 1, 64 do
  193. local player = g_EntityList:GetClientEntity(i)
  194. if(player == nil) then goto continue end
  195. player = player:GetPlayer()
  196. if(player:IsTeamMate() == true or player:m_lifeState() == 0 or player:IsDormant() == true) then goto continue end
  197.  
  198. local distance = origin:DistTo(player:GetProp("DT_BaseEntity", "m_vecOrigin"))
  199. if(distance < bestdistance) then
  200. bestdistance = distance
  201. bestplayer = player
  202. end
  203. ::continue::
  204. end
  205. return bestplayer
  206. end,
  207.  
  208. fov = function(self)
  209.  
  210. end,
  211. }
  212. local movement_helper = {
  213. --icon = g_Render:LoadImageFromFile("nl/image.png", Vector2.new(32, 32)),
  214. in_run = false,
  215. closest_spot = nil,
  216. render_stuff = {},
  217. cmd_number = 1,
  218. init_size = Vector2.new(36, 36),
  219. --movement_list = nil
  220. on_draw = function(self)
  221. local localplayer = g_EntityList:GetClientEntity(g_EngineClient:GetLocalPlayer())
  222. if(localplayer == nil) then return end
  223. localplayer = localplayer:GetPlayer()
  224. local weapon = localplayer:GetActiveWeapon()
  225. if(weapon == nil) then return end
  226. local isknife = weapon:IsKnife()
  227. local map = g_EngineClient:GetLevelNameShort()
  228. local origin = localplayer:GetProp("DT_BaseEntity", "m_vecOrigin")
  229. local eyepos = localplayer:GetEyePosition()
  230. local movement_size = g_Render:CalcTextSize("movement", 12)
  231. local bestdistance = 200.0
  232. if(self.in_run == false) then self.closest_spot = nil end
  233. for startname, startspot in pairs(self.movement_list) do
  234. if(startspot.map == map and isknife == true) then
  235. local distance = #(startspot.pos - origin)
  236. if(distance < bestdistance) then
  237. distance = bestdistance
  238. if(self.in_run == false) then self.closest_spot = startspot end
  239. end
  240. end
  241. end
  242. for startname, startspot in pairs(self.movement_list) do
  243. if(startspot.map == map) then
  244. if(self.render_stuff[startname] == nil) then self.render_stuff[startname] = {} end
  245. if(self.render_stuff[startname].global_alpha == nil) then self.render_stuff[startname].global_alpha = 0.0 end
  246. if(self.render_stuff[startname].box_length == nil) then self.render_stuff[startname].box_length = self.init_size.x end
  247. if(self.render_stuff[startname].box_height == nil) then self.render_stuff[startname].box_height = self.init_size.y end
  248. if(self.render_stuff[startname].text_alpha == nil) then self.render_stuff[startname].text_alpha = 0.0 end
  249. local distance = #(startspot.pos - origin)
  250. local trace = g_EngineTrace:TraceRay(eyepos, startspot.pos, localplayer, 0x200400B)
  251. local name_size = g_Render:CalcTextSize(startspot.name, 12)
  252. local length = math.max(name_size.x, movement_size.x) + self.init_size.x + 8
  253. if(trace.fraction > 0.96) then
  254. self.render_stuff[startname].global_alpha = 1.0
  255. if(distance <= 250.0) then
  256. self.render_stuff[startname].box_length = math_helpers:lerp(self.render_stuff[startname].box_length, length, g_GlobalVars.frametime * 15.0)
  257. if(math.abs(length - self.render_stuff[startname].box_length) < 1) then
  258. self.render_stuff[startname].text_alpha = math_helpers:lerp(self.render_stuff[startname].text_alpha, 1.0, g_GlobalVars.frametime * 15.0)
  259. end
  260. else
  261. self.render_stuff[startname].text_alpha = math_helpers:lerp(self.render_stuff[startname].text_alpha, 0.0, g_GlobalVars.frametime * 15.0)
  262. if(self.render_stuff[startname].text_alpha < 0.01) then
  263. self.render_stuff[startname].box_length = math_helpers:lerp(self.render_stuff[startname].box_length, self.init_size.x, g_GlobalVars.frametime * 15.0)
  264. end
  265. end
  266. else
  267. self.render_stuff[startname].text_alpha = math_helpers:lerp(self.render_stuff[startname].text_alpha, 0.0, g_GlobalVars.frametime * 15.0)
  268. if(self.render_stuff[startname].text_alpha < 0.01) then
  269. self.render_stuff[startname].box_length = math_helpers:lerp(self.render_stuff[startname].box_length, self.init_size.x, g_GlobalVars.frametime * 15.0)
  270. if(math.abs(self.init_size.x - self.render_stuff[startname].box_length) < 1) then
  271. self.render_stuff[startname].global_alpha = 0.0
  272. end
  273. end
  274. end
  275. if(isknife == false or self.render_stuff[startname].global_alpha == 0.0) then goto continue end
  276. local screenpos = g_Render:ScreenPosition(Vector.new(startspot.pos.x, startspot.pos.y, startspot.pos.z + 16.0))
  277.  
  278. g_Render:BoxFilled(Vector2.new(screenpos.x - self.render_stuff[startname].box_length / 2, screenpos.y - self.render_stuff[startname].box_height / 2), Vector2.new(screenpos.x + self.render_stuff[startname].box_length / 2, screenpos.y + self.render_stuff[startname].box_height / 2), Color.new(0.1, 0.1, 0.1, self.render_stuff[startname].global_alpha))
  279. g_Render:Image(self.icon, Vector2.new(screenpos.x - self.render_stuff[startname].box_length / 2 + 2, screenpos.y - self.render_stuff[startname].box_height / 2 + 2), Vector2.new(32, 32))
  280. g_Render:Text("Movement", Vector2.new(screenpos.x - self.render_stuff[startname].box_length / 2 + self.init_size.x + 3, screenpos.y - self.render_stuff[startname].box_height / 2 + 4), Color.new(1.0, 1.0, 1.0, self.render_stuff[startname].text_alpha), 16, font)
  281. g_Render:Text(startspot.name, Vector2.new(screenpos.x - self.render_stuff[startname].box_length / 2 + self.init_size.x + 4, screenpos.y + self.render_stuff[startname].box_height / 2 - 4 - name_size.y), Color.new(1.0, 1.0, 1.0, self.render_stuff[startname].text_alpha), 15, font)
  282.  
  283. end
  284. ::continue::
  285. end
  286. end,
  287.  
  288. on_prediction = function(self, cmd)
  289. local localplayer = g_EntityList:GetClientEntity(g_EngineClient:GetLocalPlayer())
  290. if(localplayer == nil or self.closest_spot == nil) then return end
  291. localplayer = localplayer:GetPlayer()
  292. local origin = localplayer:GetProp("DT_BaseEntity", "m_vecOrigin")
  293. local vecdelta = (self.closest_spot.pos - origin)
  294. local distance = #vecdelta
  295. local v1 = bit.band(cmd.buttons, 8) == 8
  296. local v2 = bit.band(cmd.buttons, 16) == 16
  297. local v3 = bit.band(cmd.buttons, 512) == 512
  298. local v4 = bit.band(cmd.buttons, 1024) == 1024
  299. local in_move = (v1 or v2 or v3 or v4)
  300. if(in_move == false and self.in_run == false) then
  301. if(distance > 0.01) then
  302. local viewangles = g_EngineClient:GetViewAngles()
  303. local direction = cheat.VectorToAngle(vecdelta)
  304. direction.yaw = viewangles.yaw - direction.yaw
  305. local move = cheat.AngleToForward(direction)
  306. cmd.forwardmove = move.x * (450.0 * (math.exp(math_helpers:clamp(distance, 0.0, 5.0) - 5.0)) - 2.0)
  307. cmd.sidemove = move.y * (450.0 * (math.exp(math_helpers:clamp(distance, 0.0, 5.0) - 5.0)) - 2.0)
  308. else
  309. self.in_run = true
  310. self.cmd_number = 1
  311. end
  312. end
  313. end,
  314.  
  315. on_createmove = function(self, cmd)
  316. if(self.in_run == true) then
  317. cmd.buttons = self.closest_spot[self.cmd_number].bb
  318. cmd.forwardmove = self.closest_spot[self.cmd_number].fwd
  319. cmd.sidemove = self.closest_spot[self.cmd_number].sd
  320. cmd.viewangles.pitch = self.closest_spot[self.cmd_number].pitch
  321. cmd.viewangles.yaw = self.closest_spot[self.cmd_number].yaw
  322. cmd.weaponselect = self.closest_spot[self.cmd_number].wpnslt
  323. self.cmd_number = self.cmd_number + 1
  324. if(self.cmd_number > #self.closest_spot) then
  325. self.in_run = false
  326. end
  327. end
  328. end,
  329. }
  330. local grenade_helper = {
  331. maps = loadstring("return {" .. http.Get("https://pastebin.com/raw/TiUZPQwD") .. "}")(),
  332. custom_maps = {},
  333. nade_type =
  334. {
  335. ["44"] = "HeGrenade",
  336. ["46"] = "Molotov",
  337. ["45"] = "Smoke",
  338. ["43"] = "FlashBang",
  339. },
  340. menu_nades =
  341. {
  342. ["44"] = 0,
  343. ["46"] = 1,
  344. ["45"] = 2,
  345. ["43"] = 3,
  346. },
  347. theme_colors =
  348. {
  349. [0] = --default
  350. {
  351. body_r = 17/255, -- box behind the text
  352. body_g = 16/255,
  353. body_b = 14/255,
  354. target_r = 17/255, -- box (air) behind the text
  355. target_g = 16/266,
  356. target_b = 14/255,
  357. text_color_r = 104/255, -- text
  358. text_color_g = 93/255,
  359. text_color_b = 140/255,
  360. },
  361. [1] = --orange
  362. {
  363. body_r = 17/255, -- box behind the text
  364. body_g = 16/255,
  365. body_b = 14/255,
  366. target_r = 17/255, -- box (air) behind the text
  367. target_g = 16/266,
  368. target_b = 14/255,
  369. text_color_r = 155/255,
  370. text_color_g = 105/255,
  371. text_color_b = 77/255,
  372. },
  373. [2] = --blue
  374. {
  375. body_r = 17/255, -- box behind the text
  376. body_g = 16/255,
  377. body_b = 14/255,
  378. target_r = 17/255, -- box (air) behind the text
  379. target_g = 16/266,
  380. target_b = 14/255,
  381. text_color_r = 77/255,
  382. text_color_g = 91/255,
  383. text_color_b = 155/255,
  384. },
  385. [3] = --white
  386. {
  387. body_r = 17/255, -- box behind the text
  388. body_g = 16/255,
  389. body_b = 14/255,
  390. target_r = 17/255, -- box (air) behind the text
  391. target_g = 16/266,
  392. target_b = 14/255,
  393. text_color_r = 175/255,
  394. text_color_g = 175/255,
  395. text_color_b = 175/255,
  396. },
  397. },
  398. config_names =
  399. {
  400. "locations #1",
  401. "locations #2",
  402. "locations #3",
  403. },
  404. movedirections =
  405. {
  406. [0] = 0,
  407. [1] = 180,
  408. [2] = 90,
  409. [3] = -90,
  410. },
  411. closest_nade = nil,
  412. closest_nade_position = Vector.new(0, 0, 0),
  413. render_stuff = {},
  414. should_throw = false,
  415.  
  416. run_tick = 0,
  417. jump_tick = 0,
  418.  
  419. old_autostrafe_smooth = 0,
  420. old_autostrafe = false,
  421. doubletap_call = true,
  422. old_doubletap = false,
  423.  
  424. create_nade_map = "",
  425. create_nade_weaponid = "",
  426.  
  427. init_ang = QAngle.new(0, 0, 0),
  428. init_pos = Vector.new(0, 0, 0),
  429.  
  430. load_time = utils.UnixTime(),
  431.  
  432. strafe_backup_direction = 0,
  433. strafe_backup_button = 0,
  434. strafe_backup_tick = 0,
  435. strafe_backup_duration = 0,
  436.  
  437. force_forward = false,
  438. force_forward_yaw_direction = 0.0,
  439.  
  440. extend_forward = function(self, cmd)
  441. if(self.force_forward == true) then
  442. local localplayer = g_EntityList:GetClientEntity(g_EngineClient:GetLocalPlayer())
  443. if(localplayer == nil) then return end
  444. localplayer = localplayer:GetPlayer()
  445. local weapon = localplayer:GetActiveWeapon()
  446. if(weapon == nil) then return end
  447. if(weapon:IsGrenade() == false) then return end
  448. local throwtime = weapon:GetProp("DT_BaseCSGrenade", "m_fThrowTime")
  449. local curtime = localplayer:GetProp("DT_BasePlayer", "m_nTickBase") * g_GlobalVars.interval_per_tick
  450. local direction = 0
  451. if(self.closest_nade.movedirection == 2) then
  452. direction = -45
  453. elseif(self.closest_nade.movedirection == 3) then
  454. direction = 45
  455. end
  456. local movedirection = cmd.viewangles.yaw - (self.closest_nade.ang.yaw + direction)
  457. local move = cheat.AngleToForward(QAngle.new(0, movedirection, 0))
  458. cmd.forwardmove = move.x * 450.0
  459. cmd.sidemove = move.y * 450.0
  460. end
  461. end,
  462.  
  463. on_backupstrafe = function(self)
  464. if(lua_elements.backup_direction:GetInt() > 0) then
  465. lua_elements.backup_strafe_duration:SetVisible(true)
  466. else
  467. lua_elements.backup_strafe_duration:SetVisible(false)
  468. end
  469. end,
  470.  
  471. on_properties = function(self)
  472. if(lua_elements.properties:GetBool(0) == true) then
  473. lua_elements.run_duration:SetVisible(true)
  474. lua_elements.run_velocity:SetVisible(true)
  475. lua_elements.run_direction:SetVisible(true)
  476. lua_elements.backup_direction:SetVisible(true)
  477. else
  478. lua_elements.run_duration:SetVisible(false)
  479. lua_elements.run_velocity:SetVisible(false)
  480. lua_elements.run_direction:SetVisible(false)
  481. lua_elements.backup_direction:SetVisible(false)
  482. lua_elements.backup_strafe_duration:SetVisible(false)
  483.  
  484. lua_elements.run_duration:SetInt(0)
  485. lua_elements.run_velocity:SetFloat(0)
  486. lua_elements.run_direction:SetInt(0)
  487. lua_elements.backup_direction:SetInt(0)
  488. lua_elements.backup_strafe_duration:SetInt(0)
  489. end
  490. if(lua_elements.properties:GetBool(1) == true) then
  491. lua_elements.jump_duration:SetVisible(true)
  492. lua_elements.jump_thresthold:SetVisible(true)
  493. else
  494. lua_elements.jump_duration:SetVisible(false)
  495. lua_elements.jump_thresthold:SetVisible(false)
  496.  
  497. lua_elements.jump_duration:SetInt(0)
  498. lua_elements.jump_thresthold:SetInt(0)
  499. end
  500. end,
  501.  
  502. backup_strafe = function(self, cmd)
  503. if(cmd.tick_count - self.strafe_backup_tick <= self.strafe_backup_duration and cmd.tick_count - self.strafe_backup_tick >= 0) then
  504. local movedirection = self.strafe_backup_direction
  505. local move = cheat.AngleToForward(QAngle.new(0, cmd.viewangles.yaw - movedirection, 0))
  506. cmd.forwardmove = move.x * 450.0
  507. cmd.sidemove = move.y * 450.0
  508. if(cmd.tick_count - self.strafe_backup_tick == self.strafe_backup_duration) then
  509. menu_elements.autostrafe_smooth:SetInt(self.old_autostrafe_smooth)
  510. end
  511. end
  512. end,
  513.  
  514. setup_backup_strafe = function(self, cmd)
  515. if(self.closest_nade.backupdirection ~= 0) then
  516. self.old_autostrafe_smooth = menu_elements.autostrafe_smooth:GetInt()
  517. menu_elements.autostrafe_smooth:SetInt(0)
  518. self.strafe_backup_tick = cmd.tick_count
  519. self.strafe_backup_duration = self.closest_nade.backupduration
  520. self.strafe_backup_direction = (self.closest_nade.ang.yaw + self.movedirections[self.closest_nade.backupdirection - 1])
  521. end
  522. end,
  523.  
  524. on_nade_update = function(self)
  525. local localplayer = g_EntityList:GetClientEntity(g_EngineClient:GetLocalPlayer())
  526. if(localplayer == nil) then return end
  527. localplayer = localplayer:GetPlayer()
  528. local origin = localplayer:GetProp("DT_BaseEntity", "m_vecOrigin")
  529. local viewangles = g_EngineClient:GetViewAngles()
  530. self.init_pos = Vector.new(origin.x, origin.y, origin.z)
  531. lua_elements.pitch_slider:SetFloat(viewangles.pitch)
  532. lua_elements.yaw_slider:SetFloat(viewangles.yaw)
  533. end,
  534.  
  535. update_configs = function(self)
  536. if(utils.UnixTime() - self.load_time >= 2) then
  537. self.load_time = utils.UnixTime()
  538. for i = 1, 10 do
  539. if(lua_elements.nade_helper_types:GetBool(i) == false) then goto continue end
  540. local pfile = ffi.cast("void*", ffi.C.CreateFileA("nl\\GrenadeHelper\\" .. self.config_names[i] .. ".txt", 0xC0000000, 0x3, 0, 0x4, 0x80, nil))
  541. local size = ffi.C.GetFileSize(pfile, nil)
  542. local buff = ffi.new("char[" ..(size + 1).. "]")
  543. ffi.C.ReadFile(pfile, buff, size, nil, 0)
  544. ffi.C.CloseHandle(pfile)
  545. buff = ffi.string(buff)
  546. buff = "{"..buff.."}"
  547. self.custom_maps[i] = loadstring("return " .. buff)()
  548. ::continue::
  549. end
  550. end
  551. end,
  552.  
  553. on_save_nade = function(self)
  554. local nade = self.maps[self.create_nade_map][self.create_nade_weaponid][1][lua_elements.nade_name:GetString()]
  555. local result = string.format("\t[\"%s\"] = {\n\t\tpos = Vector.new(%s, %s, %s),\n\t\tmap = \"%s\",\n\t\ttype = \"%s\",\n\t\t[\"%s\"] = {\n\t\t\tang = QAngle.new(%s, %s, 0.0),\n\t\t\trunduration = %s,\n\t\t\tjumpduration = %s,\n\t\t\tspeed = %s,\n\t\t\tduck = %s,\n\t\t\tjump = %s,\n\t\t\tstrength = %s,\n\t\t\tjumpthresthold = %s,\n\t\t\tdescription = \"%s\",\n\t\t\tmovedirection = %s,\n\t\t\tbackupdirection = %s,\n\t\t\tbackupduration = %s,\n\t\t\textendforward = %s,\n\t\t},\n\t},\n", utils.UnixTime(), self.init_pos.x, self.init_pos.y, self.init_pos.z, self.create_nade_map, self.create_nade_weaponid, lua_elements.nade_name:GetString(), nade.ang.pitch, nade.ang.yaw, nade.runduration, nade.jumpduration, nade.speed, nade.duck, nade.jump, nade.strength, nade.jumpthresthold, nade.description, nade.movedirection, nade.backupdirection, nade.backupduration, nade.extendforward)
  556. local pfile = ffi.cast("void*", ffi.C.CreateFileA("nl\\GrenadeHelper\\" .. self.config_names[lua_elements.save_nade_cfg:GetInt() + 1] .. ".txt", 0xC0000000, 0x00000003, 0, 0x4, 0x80, nil))
  557. local overlapped = ffi.new("OVERLAPPED")
  558. overlapped.DUMMYUNIONNAME.DUMMYSTRUCTNAME.Offset = 0xFFFFFFFF
  559. overlapped.DUMMYUNIONNAME.DUMMYSTRUCTNAME.OffsetHigh = 0xFFFFFFFF
  560. ffi.C.WriteFile(pfile, ffi.cast("char*", result), string.len(result), nil, ffi.cast("void*", overlapped))
  561. ffi.C.CloseHandle(pfile)
  562.  
  563. lua_elements.pitch_slider:SetVisible(false)
  564. lua_elements.yaw_slider:SetVisible(false)
  565. lua_elements.run_duration:SetVisible(false)
  566. lua_elements.run_velocity:SetVisible(false)
  567. lua_elements.jump_duration:SetVisible(false)
  568. lua_elements.jump_thresthold:SetVisible(false)
  569. lua_elements.properties:SetVisible(false)
  570. lua_elements.throw_strengh:SetVisible(false)
  571. lua_elements.nade_name:SetVisible(false)
  572. lua_elements.nade_description:SetVisible(false)
  573. lua_elements.remove_nade:SetVisible(false)
  574. lua_elements.save_nade_cfg:SetVisible(false)
  575. lua_elements.save_nade:SetVisible(false)
  576. lua_elements.create_nade:SetVisible(true)
  577. lua_elements.nade_teleport:SetVisible(false)
  578. lua_elements.nade_update_pos_ang:SetVisible(false)
  579. lua_elements.run_direction:SetVisible(false)
  580. lua_elements.backup_direction:SetVisible(false)
  581. lua_elements.backup_strafe_duration:SetVisible(false)
  582. lua_elements.extend_forward_strenght:SetVisible(false)
  583. table.remove(self.maps[self.create_nade_map][self.create_nade_weaponid], 1)
  584. end,
  585.  
  586. on_create_nade = function(self)
  587. local localplayer = g_EntityList:GetClientEntity(g_EngineClient:GetLocalPlayer())
  588. if(localplayer == nil) then return end
  589. localplayer = localplayer:GetPlayer()
  590. local weapon = localplayer:GetActiveWeapon()
  591. if(weapon == nil) then return end
  592. if(weapon:IsGrenade() == false) then return end
  593. local weapon_id = weapon:GetWeaponID()
  594. if(weapon_id == 48) then weapon_id = 46 end
  595. local origin = localplayer:GetProp("DT_BaseEntity", "m_vecOrigin")
  596. local viewangles = g_EngineClient:GetViewAngles()
  597.  
  598. self.create_nade_map = g_EngineClient:GetLevelNameShort()
  599. self.create_nade_weaponid = tostring(weapon_id)
  600.  
  601. self.init_ang = QAngle.new(viewangles.pitch, viewangles.yaw, 0.0)
  602. self.init_pos = Vector.new(origin.x, origin.y, origin.z)
  603.  
  604. lua_elements.pitch_slider:SetVisible(true)
  605. lua_elements.yaw_slider:SetVisible(true)
  606. lua_elements.properties:SetVisible(true)
  607. lua_elements.throw_strengh:SetVisible(true)
  608. lua_elements.nade_name:SetVisible(true)
  609. lua_elements.nade_description:SetVisible(true)
  610. lua_elements.create_nade:SetVisible(false)
  611. lua_elements.save_nade_cfg:SetVisible(true)
  612. lua_elements.save_nade:SetVisible(true)
  613. lua_elements.remove_nade:SetVisible(true)
  614. lua_elements.nade_teleport:SetVisible(true)
  615. lua_elements.nade_update_pos_ang:SetVisible(true)
  616.  
  617. lua_elements.pitch_slider:SetFloat(viewangles.pitch)
  618. lua_elements.yaw_slider:SetFloat(viewangles.yaw)
  619. lua_elements.run_duration:SetInt(0)
  620. lua_elements.run_velocity:SetFloat(450)
  621. lua_elements.jump_duration:SetInt(0)
  622. lua_elements.jump_thresthold:SetInt(0)
  623. for i = 0, 2 do
  624. lua_elements.properties:SetBool(i, false)
  625. end
  626. lua_elements.throw_strengh:SetFloat(100)
  627. lua_elements.nade_name:SetString("Name")
  628. lua_elements.nade_description:SetString("Custom")
  629. lua_elements.run_direction:SetInt(0)
  630. lua_elements.backup_direction:SetInt(0)
  631. lua_elements.backup_strafe_duration:SetInt(1)
  632. lua_elements.extend_forward_strenght:SetBool(false)
  633.  
  634. if(self.maps[self.create_nade_map] == nil) then
  635. self.maps[self.create_nade_map] = {}
  636. end
  637. if(self.maps[self.create_nade_map][self.create_nade_weaponid] == nil) then
  638. self.maps[self.create_nade_map][self.create_nade_weaponid] = {}
  639. end
  640.  
  641. table.insert(self.maps[self.create_nade_map][self.create_nade_weaponid], {pos = self.init_pos, [""] = {ang = self.init_ang, runduration = 0, jumpduration = 0, speed = 0, duck = false, jump = false, strength = 1, description = "", movedirection = 0, backupdirection = 0,}})
  642. end,
  643.  
  644. on_remove_nade = function(self)
  645. lua_elements.pitch_slider:SetVisible(false)
  646. lua_elements.yaw_slider:SetVisible(false)
  647. lua_elements.run_duration:SetVisible(false)
  648. lua_elements.run_velocity:SetVisible(false)
  649. lua_elements.jump_duration:SetVisible(false)
  650. lua_elements.jump_thresthold:SetVisible(false)
  651. lua_elements.properties:SetVisible(false)
  652. lua_elements.throw_strengh:SetVisible(false)
  653. lua_elements.nade_name:SetVisible(false)
  654. lua_elements.nade_description:SetVisible(false)
  655. lua_elements.remove_nade:SetVisible(false)
  656. lua_elements.save_nade_cfg:SetVisible(false)
  657. lua_elements.save_nade:SetVisible(false)
  658. lua_elements.create_nade:SetVisible(true)
  659. lua_elements.nade_teleport:SetVisible(false)
  660. lua_elements.nade_update_pos_ang:SetVisible(false)
  661. lua_elements.run_direction:SetVisible(false)
  662. lua_elements.backup_direction:SetVisible(false)
  663. lua_elements.backup_strafe_duration:SetVisible(false)
  664. lua_elements.extend_forward_strenght:SetVisible(false)
  665.  
  666. table.remove(self.maps[self.create_nade_map][self.create_nade_weaponid], 1)
  667. end,
  668.  
  669. on_teleport_nade = function(self)
  670. g_EngineClient:ClientCmd("setpos " .. self.init_pos.x .. " " .. self.init_pos.y .. " " .. self.init_pos.z)
  671. g_EngineClient:ClientCmd("setang " .. self.init_ang.pitch .. " " .. self.init_ang.yaw .. " 0.0")
  672. end,
  673.  
  674. on_draw = function(self)
  675. if(self.maps[self.create_nade_map] and self.maps[self.create_nade_map][self.create_nade_weaponid] and self.maps[self.create_nade_map][self.create_nade_weaponid][1]) then
  676. self.init_ang.pitch = lua_elements.pitch_slider:GetFloat()
  677. self.init_ang.yaw = lua_elements.yaw_slider:GetFloat()
  678. self.maps[self.create_nade_map][self.create_nade_weaponid][1] = {pos = self.init_pos, [lua_elements.nade_name:GetString()] = {ang = self.init_ang, runduration = lua_elements.run_duration:GetInt(), speed = lua_elements.run_velocity:GetFloat(), jumpduration = lua_elements.jump_duration:GetInt(), jumpthresthold = lua_elements.jump_thresthold:GetInt(), strength = lua_elements.throw_strengh:GetFloat() / 100.0, duck = lua_elements.properties:GetBool(2), jump = lua_elements.properties:GetBool(1), description = lua_elements.nade_description:GetString(), movedirection = lua_elements.run_direction:GetInt(), backupdirection = lua_elements.backup_direction:GetInt(), backupduration = lua_elements.backup_strafe_duration:GetInt(), extendforward = lua_elements.extend_forward_strenght:GetBool(),}}
  679. end
  680. local localplayer = g_EntityList:GetClientEntity(g_EngineClient:GetLocalPlayer())
  681. if(localplayer == nil) then return end
  682.  
  683. local map = g_EngineClient:GetLevelNameShort()
  684. self.closest_nade_position = nil
  685. if(self.should_throw == false) then self.closest_nade = nil end
  686.  
  687. localplayer = localplayer:GetPlayer()
  688. local vecOrigin = localplayer:GetProp("DT_BaseEntity", "m_vecOrigin")
  689. local vecEyePosition = localplayer:GetEyePosition()
  690. local angViewAngles = g_EngineClient:GetViewAngles()
  691. local weapon = localplayer:GetActiveWeapon()
  692. local screencenter = Vector2.new(lua_elements.screensize.x / 2, lua_elements.screensize.y / 2)
  693. if(weapon == nil) then return end
  694. local weapon_id = weapon:GetWeaponID()
  695. if(weapon_id == 48) then weapon_id = 46 end
  696. if(weapon_id == 47) then return end
  697.  
  698. local map_list = self.maps[map]
  699. local nade_list = nil
  700. if(map_list) then nade_list = map_list[tostring(weapon_id)] end
  701.  
  702. if(weapon:IsGrenade() == false) then
  703. if(self.should_throw == true) then
  704. menu_elements.autostrafe:SetBool(self.old_autostrafe)
  705. menu_elements.autostrafe_smooth:SetInt(self.old_autostrafe_smooth)
  706. end
  707. self.closest_nade = nil
  708. self.closest_nade_position = nil
  709. self.should_throw = false
  710. self.has_strength = false
  711. self.has_duck = true
  712. self.run_tick = 0
  713. self.jump_tick = 0
  714. if(map_list) then
  715. for nade_type, list in pairs(map_list) do
  716. for startname, startspot in pairs(list) do
  717. if(self.render_stuff[startname]) then
  718. self.render_stuff[startname].global_alpha = 0.0
  719. self.render_stuff[startname].text_alpha = 0.0
  720. self.render_stuff[startname].icon_alpha = 0.0
  721. self.render_stuff[startname].box_length = 16.0
  722. self.render_stuff[startname].box_height = 16.0
  723. self.render_stuff[startname].box_additions_alpha = 0.0
  724. end
  725. for endname, endspot in pairs(startspot) do
  726. if(type(endspot) == "table") then
  727. if(self.render_stuff[startname] and self.render_stuff[startname][endname]) then
  728. self.render_stuff[startname][endname].global_alpha = 0.0
  729. self.render_stuff[startname][endname].text_alpha = 0.0
  730. self.render_stuff[startname][endname].box_length = 10.0
  731. self.render_stuff[startname][endname].description_box_height = 0.0
  732. self.render_stuff[startname][endname].description_text_alpha = 0.0
  733. end
  734. end
  735. end
  736. end
  737. end
  738. end
  739. for i = 1, 10 do
  740. if(self.custom_maps[i] and lua_elements.nade_helper_types:GetBool(i) == true) then
  741. for startname, startspot in pairs(self.custom_maps[i]) do
  742. if(map == startspot.map) then
  743. if(self.render_stuff[startname]) then
  744. self.render_stuff[startname].global_alpha = 0.0
  745. self.render_stuff[startname].text_alpha = 0.0
  746. self.render_stuff[startname].icon_alpha = 0.0
  747. self.render_stuff[startname].box_length = 16.0
  748. self.render_stuff[startname].box_height = 16.0
  749. self.render_stuff[startname].box_additions_alpha = 0.0
  750. end
  751. for endname, endspot in pairs(startspot) do
  752. if(type(endspot) == "table") then
  753. if(self.render_stuff[startname] and self.render_stuff[startname][endname]) then
  754. self.render_stuff[startname][endname].global_alpha = 0.0
  755. self.render_stuff[startname][endname].text_alpha = 0.0
  756. self.render_stuff[startname][endname].box_length = 10.0
  757. self.render_stuff[startname][endname].description_box_height = 0.0
  758. self.render_stuff[startname][endname].description_text_alpha = 0.0
  759. end
  760. end
  761. end
  762. end
  763. end
  764. end
  765. end
  766. return
  767. end
  768.  
  769. local color_set = self.theme_colors[lua_elements.nade_helper_theme:GetInt()]
  770.  
  771. local bestdistance = 100.0
  772. local temp_nade = nil
  773.  
  774. if(nade_list) then
  775. for startname, startspot in pairs(nade_list) do
  776. if((lua_elements.nade_helper_types:GetBool(0) == false or lua_elements.nade_helper_nades:GetBool(self.menu_nades[tostring(weapon_id)]) == false) and startname ~= 1) then goto continue end
  777. local distance = vecOrigin:DistTo(startspot.pos)
  778. if(distance < 100.0 and distance < bestdistance) then
  779. if(self.should_throw == false) then self.closest_nade_position = startspot.pos end
  780. bestdistance = distance
  781. temp_nade = startspot
  782. end
  783. ::continue::
  784. end
  785. end
  786.  
  787. for i = 1, 10 do
  788. if(self.custom_maps[i] and lua_elements.nade_helper_types:GetBool(i) == true) then
  789. for createtime, startspot in pairs(self.custom_maps[i]) do
  790. if(map == startspot.map) then
  791. if(tostring(weapon_id) == startspot.type and lua_elements.nade_helper_nades:GetBool(self.menu_nades[startspot.type]) == true) then
  792. local distance = vecOrigin:DistTo(startspot.pos)
  793. if(distance < 100.0 and distance < bestdistance) then
  794. if(self.should_throw == false) then self.closest_nade_position = startspot.pos end
  795. bestdistance = distance
  796. temp_nade = startspot
  797. end
  798. end
  799. end
  800. end
  801. end
  802. end
  803.  
  804. if(nade_list) then
  805. for startname, startspot in pairs(nade_list) do
  806. if((lua_elements.nade_helper_types:GetBool(0) == false or lua_elements.nade_helper_nades:GetBool(self.menu_nades[tostring(weapon_id)]) == false) and startname ~= 1) then goto continue end
  807. if(self.render_stuff[startname] == nil) then self.render_stuff[startname] = {} end
  808. if(self.render_stuff[startname].global_alpha == nil) then self.render_stuff[startname].global_alpha = 0.0 end
  809. if(self.render_stuff[startname].box_length == nil) then self.render_stuff[startname].box_length = 30.0 end
  810. if(self.render_stuff[startname].box_height == nil) then self.render_stuff[startname].box_height = 30.0 end
  811. if(self.render_stuff[startname].text_alpha == nil) then self.render_stuff[startname].text_alpha = 0.0 end
  812. if(self.render_stuff[startname].icon_alpha == nil) then self.render_stuff[startname].icon_alpha = 0.0 end
  813. if(self.render_stuff[startname].box_additions_alpha == nil) then self.render_stuff[startname].box_additions_alpha = 0.0 end
  814.  
  815. local distance = vecOrigin:DistTo(startspot.pos)
  816. if(distance > 1750.0) then
  817. self.render_stuff[startname].global_alpha = math_helpers:lerp(self.render_stuff[startname].global_alpha, 0.0, g_GlobalVars.frametime * 20.0)
  818. else
  819. local trace = g_EngineTrace:TraceRay(vecEyePosition, startspot.pos, localplayer, 0x200400B)
  820. if(trace.fraction > 0.98) then
  821. if(distance > 1250.0) then
  822. self.render_stuff[startname].global_alpha = math_helpers:lerp(self.render_stuff[startname].global_alpha, 0.4, g_GlobalVars.frametime * 20.0)
  823. elseif(distance < 5.0) then
  824. self.render_stuff[startname].global_alpha = math_helpers:lerp(self.render_stuff[startname].global_alpha, 1.0, g_GlobalVars.frametime * 20.0)
  825. else
  826. self.render_stuff[startname].global_alpha = math_helpers:lerp(self.render_stuff[startname].global_alpha, 0.8, g_GlobalVars.frametime * 20.0)
  827. end
  828. else
  829. self.render_stuff[startname].global_alpha = math_helpers:lerp(self.render_stuff[startname].global_alpha, 0.0, g_GlobalVars.frametime * 20.0)
  830. end
  831. end
  832.  
  833. if(self.render_stuff[startname].global_alpha < 0.01) then goto continue end
  834.  
  835. local screenpos = g_Render:ScreenPosition(Vector.new(startspot.pos.x, startspot.pos.y, startspot.pos.z + 10.0))
  836. local nade_type_size = g_Render:CalcTextSize(self.nade_type[tostring(weapon_id)], 13, font)
  837. local bestlength = 0
  838. local num_spots = 0
  839. local temp_fov_nade = nil
  840. local temp_fov_name = nil
  841. local bestfov = lua_elements.nade_helper_fov:GetInt()
  842.  
  843. for endname, endspot in pairs(startspot) do
  844. if(type(endspot) == "table") then
  845. local name_size = g_Render:CalcTextSize(endname, 13, font)
  846. if(name_size.x > bestlength) then bestlength = name_size.x end
  847.  
  848. if(self.render_stuff[startname][endname] == nil) then self.render_stuff[startname][endname] = {} end
  849. if(self.render_stuff[startname][endname].global_alpha == nil) then self.render_stuff[startname][endname].global_alpha = 0.0 end
  850. if(self.render_stuff[startname][endname].box_length == nil) then self.render_stuff[startname][endname].box_length = 10.0 end
  851. if(self.render_stuff[startname][endname].text_alpha == nil) then self.render_stuff[startname][endname].text_alpha = 0.0 end
  852. if(self.render_stuff[startname][endname].circle_color == nil) then self.render_stuff[startname][endname].circle_color = Color.new(0.15, 0.15, 0.15, 0.0) end
  853. if(self.render_stuff[startname][endname].description_box_height == nil) then self.render_stuff[startname][endname].description_box_height = 0.0 end
  854. if(self.render_stuff[startname][endname].description_text_alpha == nil) then self.render_stuff[startname][endname].description_text_alpha = 0.0 end
  855.  
  856. if(endspot.endposition == nil) then
  857. local vecStart = Vector.new(startspot.pos.x, startspot.pos.y, startspot.pos.z + 64.0)
  858. local forward = cheat.AngleToForward(endspot.ang)
  859. local vecEnd = Vector.new(vecStart.x + 800.0 * forward.x, vecStart.y + 800.0 * forward.y, vecStart.z + 800.0 * forward.z)
  860. local trace = g_EngineTrace:TraceRay(vecStart, vecEnd, localplayer, 0x46004003)
  861. endspot.endposition = Vector.new(trace.endpos.x, trace.endpos.y, trace.endpos.z)
  862. end
  863. if(endspot.jumpthresthold == nil) then
  864. endspot.jumpthresthold = 0
  865. end
  866. if(endspot.movedirection == nil) then
  867. endspot.movedirection = 0
  868. end
  869. if(endspot.backupdirection == nil) then
  870. endspot.backupdirection = 0
  871. end
  872. if(endspot.backupduration == nil) then
  873. endspot.backupduration = 1
  874. end
  875. if(endspot.extendforward == nil) then
  876. endspot.extendforward = false
  877. end
  878.  
  879. local angles = math_helpers:normalizeangles(math_helpers:calcangle(vecEyePosition, endspot.endposition))
  880. local fov = math.sqrt((angles.pitch - angViewAngles.pitch) ^ 2 + (angles.yaw - angViewAngles.yaw) ^ 2)
  881. fov = math_helpers:normalizefloat(fov)
  882. fov = math.abs(fov)
  883.  
  884. if(fov < bestfov and distance <= 50.0 and startspot == temp_nade) then
  885. bestfov = fov
  886. temp_fov_nade = endspot
  887. temp_fov_name = endname
  888. if(self.should_throw == false) then self.closest_nade = endspot end
  889. end
  890. num_spots = num_spots + 1
  891. end
  892. end
  893.  
  894. for endname, endspot in pairs(startspot) do
  895. if(type(endspot) ~= "table" or endspot == temp_fov_nade) then goto continue end
  896.  
  897. local screenpos = g_Render:ScreenPosition(endspot.endposition)
  898. local name_size = g_Render:CalcTextSize(endname, 12, font_b)
  899.  
  900. local r = math_helpers:lerp(self.render_stuff[startname][endname].circle_color:r(), 0.3, g_GlobalVars.frametime * 15.0)
  901. local g = math_helpers:lerp(self.render_stuff[startname][endname].circle_color:g(), 0.3, g_GlobalVars.frametime * 15.0)
  902. local b = math_helpers:lerp(self.render_stuff[startname][endname].circle_color:b(), 0.3, g_GlobalVars.frametime * 15.0)
  903.  
  904. local desired_box_length = name_size.x + 20
  905.  
  906.  
  907. if(endspot.description and string.len(endspot.description) > 0) then
  908. local desc_size = g_Render:CalcTextSize(endspot.description, 10, font_p)
  909. desired_box_height = 16
  910. if(self.render_stuff[startname][endname].description_text_alpha > 0.01) then desired_box_length = math.max(desired_box_length, desc_size.x) end
  911. end
  912.  
  913. self.render_stuff[startname][endname].description_text_alpha = math_helpers:lerp(self.render_stuff[startname][endname].description_text_alpha, 0.0, g_GlobalVars.frametime * 60.0)
  914.  
  915. if(distance > 50.0 or startspot ~= temp_nade) then
  916. self.render_stuff[startname][endname].text_alpha = math_helpers:lerp(self.render_stuff[startname][endname].text_alpha, 0.0, g_GlobalVars.frametime * 60.0)
  917. if(self.render_stuff[startname][endname].text_alpha < 0.01) then
  918. self.render_stuff[startname][endname].box_length = math_helpers:lerp(self.render_stuff[startname][endname].box_length, 10.0, g_GlobalVars.frametime * 30.0)
  919. self.render_stuff[startname][endname].description_box_height = math_helpers:lerp(self.render_stuff[startname][endname].description_box_height, 0.0, g_GlobalVars.frametime * 30.0)
  920. if(self.render_stuff[startname][endname].box_length - 10.0 < 0.1 and self.render_stuff[startname][endname].description_box_height < 0.1) then
  921. self.render_stuff[startname][endname].global_alpha = math_helpers:lerp(self.render_stuff[startname][endname].global_alpha, 0.0, g_GlobalVars.frametime * 60.0)
  922. end
  923. end
  924. else
  925. if(screenpos.x + self.render_stuff[startname][endname].box_length + 2 > lua_elements.screensize.x or screenpos.x < 12 or screenpos.y + 10 > lua_elements.screensize.y or screenpos.y < 10) then
  926. self.render_stuff[startname][endname].global_alpha = math_helpers:lerp(self.render_stuff[startname][endname].global_alpha, 1.0, g_GlobalVars.frametime * 60.0)
  927. else
  928. self.render_stuff[startname][endname].global_alpha = math_helpers:lerp(self.render_stuff[startname][endname].global_alpha, 0.6, g_GlobalVars.frametime * 60.0)
  929. end
  930. if(self.render_stuff[startname][endname].global_alpha > 0.58) then
  931. self.render_stuff[startname][endname].box_length = math_helpers:lerp(self.render_stuff[startname][endname].box_length, desired_box_length, g_GlobalVars.frametime * 30.0)
  932. if(desired_box_length - self.render_stuff[startname][endname].box_length < 0.1) then
  933. self.render_stuff[startname][endname].text_alpha = math_helpers:lerp(self.render_stuff[startname][endname].text_alpha, self.render_stuff[startname][endname].global_alpha, g_GlobalVars.frametime * 60.0)
  934. if(self.render_stuff[startname][endname].description_text_alpha < 0.01) then
  935. self.render_stuff[startname][endname].description_box_height = math_helpers:lerp(self.render_stuff[startname][endname].description_box_height, 0.0, g_GlobalVars.frametime * 60.0)
  936. end
  937. end
  938. end
  939. end
  940. self.render_stuff[startname][endname].circle_color = Color.new(r, g, b, self.render_stuff[startname][endname].global_alpha)
  941. if(self.render_stuff[startname][endname].global_alpha < 0.01) then goto continue end
  942.  
  943. if(screenpos.x + self.render_stuff[startname][endname].box_length + 2 > lua_elements.screensize.x or screenpos.x < 12 or screenpos.y + 10 > lua_elements.screensize.y or screenpos.y < 10) then
  944. local vecdelta = Vector2.new(screenpos.x - screencenter.x, screenpos.y - screencenter.y)
  945. local length = #vecdelta
  946. local cos = vecdelta.x / length
  947. local sin = vecdelta.y / length
  948. local max_legnth = #screencenter
  949.  
  950. local newpos = Vector2.new(screencenter.x + max_legnth * cos, screencenter.y + max_legnth * sin)
  951. if(newpos.x + self.render_stuff[startname][endname].box_length > lua_elements.screensize.x) then newpos.x = lua_elements.screensize.x - self.render_stuff[startname][endname].box_length - 18
  952. elseif(newpos.x < 16) then newpos.x = 28 end
  953. if(newpos.y + 16 > lua_elements.screensize.y) then newpos.y = lua_elements.screensize.y - 28
  954. elseif(newpos.y < 16) then newpos.y = 28 end
  955.  
  956. screenpos = newpos
  957. end
  958. g_Render:BoxFilled(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][endname].box_length, screenpos.y + 11), Color.new(color_set.target_r, color_set.target_g, color_set.target_b, self.render_stuff[startname][endname].global_alpha + 50))
  959. g_Render:Box(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][endname].box_length, screenpos.y + 11), Color.new(5/255, 4/255, 0, self.render_stuff[startname][endname].global_alpha + 80))
  960. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][endname].description_box_height + 8), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][endname].description_box_height - 7), Color.new(0, 0, 0, self.render_stuff[startname][endname].text_alpha))
  961. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][endname].description_box_height + 7), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][endname].description_box_height - 7), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][endname].text_alpha))
  962.  
  963. g_Render:Text(endname, Vector2.new(screenpos.x + 15, screenpos.y - name_size.y / 2), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][endname].text_alpha), 12, font_b, true)
  964.  
  965.  
  966. color_circle = Color.new(170/255, 0, 0, 250/255)
  967. color_circl = Color.new(170/255, 0, 0, 160/255)
  968. color_circ = Color.new(155/255, 0, 0, 155/255)
  969. color_cir = Color.new(135/255, 0, 0, 140/255)
  970. color_ci = Color.new(110/255, 0, 0, 135/255)
  971. color_c1 = Color.new(85/255, 0, 0, 130/255)
  972. color_c1r = Color.new(60/255, 0, 0, 120/255)
  973. color_c1rc = Color.new(55/255, 0, 0, 35/255)
  974. color_c1rcl = Color.new(45/255, 0, 0, 15/255)
  975. color_c1rcle = Color.new(35/255, 0, 0, 5/255)
  976.  
  977. g_Render:CircleFilled(screenpos, 9, 15, color_c1rcle); g_Render:CircleFilled(screenpos, 8, 15, color_c1rcl);
  978. g_Render:CircleFilled(screenpos, 7, 15, color_c1rc); g_Render:CircleFilled(screenpos, 6, 15, color_c1r);
  979. g_Render:CircleFilled(screenpos, 5, 15, color_c1); g_Render:CircleFilled(screenpos, 4, 15, color_ci);
  980. g_Render:CircleFilled(screenpos, 3, 15, color_cir); g_Render:CircleFilled(screenpos, 2, 15, color_circ);
  981. g_Render:CircleFilled(screenpos, 1, 15, color_circl); g_Render:CircleFilled(screenpos, 1, 15, color_circle);
  982.  
  983. ::continue::
  984. end
  985.  
  986. if(temp_fov_nade) then
  987. local screenpos = g_Render:ScreenPosition(temp_fov_nade.endposition)
  988. local name_size = g_Render:CalcTextSize(temp_fov_name, 12, font_b)
  989.  
  990. local r = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].circle_color:r(), 0.01, g_GlobalVars.frametime * 15.0)
  991. local g = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].circle_color:g(), 0.65, g_GlobalVars.frametime * 15.0)
  992. local b = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].circle_color:b(), 0.96, g_GlobalVars.frametime * 15.0)
  993.  
  994. self.render_stuff[startname][temp_fov_name].global_alpha = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].global_alpha, 0.9, g_GlobalVars.frametime * 30.0)
  995. self.render_stuff[startname][temp_fov_name].circle_color = Color.new(r, g, b, self.render_stuff[startname][temp_fov_name].global_alpha)
  996.  
  997. local desired_box_length = name_size.x + 20
  998. local desired_box_height = 0
  999.  
  1000. if(temp_fov_nade.description and string.len(temp_fov_nade.description) > 0) then
  1001. local desc_size = g_Render:CalcTextSize(temp_fov_nade.description, 10, font_p)
  1002. desired_box_height = 16
  1003. if(desc_size.x + 11 > desired_box_length) then desired_box_length = math.max(desired_box_length, desc_size.x + 12) end
  1004. end
  1005.  
  1006. if(self.render_stuff[startname][temp_fov_name].global_alpha > 0.88) then
  1007. self.render_stuff[startname][temp_fov_name].box_length = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].box_length, desired_box_length, g_GlobalVars.frametime * 30.0)
  1008. self.render_stuff[startname][temp_fov_name].description_box_height = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].description_box_height, desired_box_height, g_GlobalVars.frametime * 30.0)
  1009. if(desired_box_length - self.render_stuff[startname][temp_fov_name].box_length < 0.1 and desired_box_height - self.render_stuff[startname][temp_fov_name].description_box_height < 0.1) then
  1010. self.render_stuff[startname][temp_fov_name].text_alpha = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].text_alpha, 1.0, g_GlobalVars.frametime * 30.0)
  1011. self.render_stuff[startname][temp_fov_name].description_text_alpha = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].description_text_alpha, 1.0, g_GlobalVars.frametime * 30.0)
  1012. end
  1013. end
  1014.  
  1015. if(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 2 > lua_elements.screensize.x or screenpos.x < 12 or screenpos.y + 10 > lua_elements.screensize.y or screenpos.y < 10) then
  1016. local vecdelta = Vector2.new(screenpos.x - screencenter.x, screenpos.y - screencenter.y)
  1017. local length = #vecdelta
  1018. local cos = vecdelta.x / length
  1019. local sin = vecdelta.y / length
  1020. local max_legnth = #screencenter
  1021.  
  1022. local newpos = Vector2.new(screencenter.x + max_legnth * cos, screencenter.y + max_legnth * sin)
  1023. if(newpos.x + self.render_stuff[startname][temp_fov_name].box_length > lua_elements.screensize.x) then newpos.x = lua_elements.screensize.x - self.render_stuff[startname][temp_fov_name].box_length + 1
  1024. elseif(newpos.x < 16) then newpos.x = 28 end
  1025. if(newpos.y + 16 > lua_elements.screensize.y) then newpos.y = lua_elements.screensize.y - 28
  1026. elseif(newpos.y < 16) then newpos.y = 28 end
  1027.  
  1028. screenpos = newpos
  1029. end
  1030.  
  1031.  
  1032.  
  1033.  
  1034. if(temp_fov_nade.description and string.len(temp_fov_nade.description) > 0) then
  1035. local desc_size = g_Render:CalcTextSize(temp_fov_nade.description, 10, font_p)
  1036. g_Render:BoxFilled(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 8, screenpos.y), Color.new(color_set.target_r, color_set.target_g, color_set.target_b, self.render_stuff[startname][temp_fov_name].global_alpha))
  1037. g_Render:BoxFilled(Vector2.new(screenpos.x - 10, screenpos.y), Vector2.new(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 8, screenpos.y - 4 + self.render_stuff[startname][temp_fov_name].description_box_height), Color.new(color_set.target_r, color_set.target_g, color_set.target_b, self.render_stuff[startname][temp_fov_name].global_alpha))
  1038. g_Render:Box(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 8, screenpos.y - 4 + self.render_stuff[startname][temp_fov_name].description_box_height), Color.new(5/255, 4/255, 0, self.render_stuff[startname].global_alpha))
  1039.  
  1040. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][temp_fov_name].description_box_height + 9), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][temp_fov_name].description_box_height - 8), Color.new(0, 0, 0, self.render_stuff[startname][temp_fov_name].global_alpha))
  1041. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][temp_fov_name].description_box_height + 8), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][temp_fov_name].description_box_height - 8), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].global_alpha))
  1042.  
  1043. g_Render:Text(temp_fov_name, Vector2.new(screenpos.x + 23, screenpos.y - name_size.y / 2 - 3), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].text_alpha), 12, font_b, true)
  1044. g_Render:Text(temp_fov_nade.description, Vector2.new(screenpos.x + 15, screenpos.y - 3 + self.render_stuff[startname][temp_fov_name].description_box_height / 2 - desc_size.y / 2), Color.new(0, 0, 0, self.render_stuff[startname][temp_fov_name].global_alpha), 10, font_p)
  1045. g_Render:Text(temp_fov_nade.description, Vector2.new(screenpos.x + 16, screenpos.y - 3 + self.render_stuff[startname][temp_fov_name].description_box_height / 2 - desc_size.y / 2), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].global_alpha), 10, font_p, true)
  1046. g_Render:Text('»', Vector2.new(screenpos.x + 15, screenpos.y - name_size.y / 2 - 3), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].text_alpha), 12, font_b, true)
  1047. else
  1048. g_Render:BoxFilled(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 8, screenpos.y + 11), Color.new(color_set.target_r, color_set.target_g, color_set.target_b, self.render_stuff[startname][temp_fov_name].global_alpha))
  1049. g_Render:Box(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 8, screenpos.y + 11), Color.new(5/255, 4/255, 0, self.render_stuff[startname].global_alpha))
  1050.  
  1051. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][temp_fov_name].description_box_height + 8), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][temp_fov_name].description_box_height - 7), Color.new(0, 0, 0, self.render_stuff[startname][temp_fov_name].global_alpha))
  1052. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][temp_fov_name].description_box_height + 7), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][temp_fov_name].description_box_height - 7), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].global_alpha))
  1053.  
  1054. g_Render:Text(temp_fov_name, Vector2.new(screenpos.x + 23, screenpos.y - name_size.y / 2), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].text_alpha), 12, font_b, true)
  1055. g_Render:Text('»', Vector2.new(screenpos.x + 15, screenpos.y - name_size.y / 2), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].text_alpha), 12, font_b, true)
  1056. end
  1057. if lua_elements.nade_helper:GetBool() == true then
  1058. color_circle = Color.new(0, 170/255, 0, 250/255)
  1059. color_circl = Color.new(0, 170/255, 0, 160/255)
  1060. color_circ = Color.new(0, 155/255, 0, 155/255)
  1061. color_cir = Color.new(0, 135/255, 0, 140/255)
  1062. color_ci = Color.new(0, 110/255, 0, 135/255)
  1063. color_c1 = Color.new(0, 85/255, 0, 130/255)
  1064. color_c1r = Color.new(0, 60/255, 0, 120/255)
  1065. color_c1rc = Color.new(0, 55/255, 0, 35/255)
  1066. color_c1rcl = Color.new(0, 45/255, 0, 15/255)
  1067. color_c1rcle = Color.new(0, 35/255, 0, 5/255)
  1068. else
  1069. color_circle = Color.new(170/255, 170/255, 0, 250/255)
  1070. color_circl = Color.new(170/255, 170/255, 0, 160/255)
  1071. color_circ = Color.new(155/255, 155/255, 0, 155/255)
  1072. color_cir = Color.new(135/255, 135/255, 0, 140/255)
  1073. color_ci = Color.new(110/255, 110/255, 0, 135/255)
  1074. color_c1 = Color.new(85/255, 85/255, 0, 130/255)
  1075. color_c1r = Color.new(60/255, 60/255, 0, 120/255)
  1076. color_c1rc = Color.new(55/255, 55/255, 0, 35/255)
  1077. color_c1rcl = Color.new(45/255, 45/255, 0, 15/255)
  1078. color_c1rcle = Color.new(35/255, 35/255, 0, 5/255)
  1079. end
  1080.  
  1081. g_Render:CircleFilled(screenpos, 9, 15, color_c1rcle); g_Render:CircleFilled(screenpos, 8, 15, color_c1rcl);
  1082. g_Render:CircleFilled(screenpos, 7, 15, color_c1rc); g_Render:CircleFilled(screenpos, 6, 15, color_c1r);
  1083. g_Render:CircleFilled(screenpos, 5, 15, color_c1); g_Render:CircleFilled(screenpos, 4, 15, color_ci);
  1084. g_Render:CircleFilled(screenpos, 3, 15, color_cir); g_Render:CircleFilled(screenpos, 2, 15, color_circ);
  1085. g_Render:CircleFilled(screenpos, 1, 15, color_circl); g_Render:CircleFilled(screenpos, 1, 15, color_circle);
  1086. end
  1087.  
  1088. if(bestlength < nade_type_size.x) then bestlength = nade_type_size.x end
  1089.  
  1090. if(distance < 400.0 and (temp_nade and temp_nade == startspot or temp_nade == nil or lua_elements.nade_helper:GetBool() == false)) then
  1091. self.render_stuff[startname].box_length = math_helpers:lerp(self.render_stuff[startname].box_length, bestlength, g_GlobalVars.frametime * 20.0)
  1092. self.render_stuff[startname].box_height = math_helpers:lerp(self.render_stuff[startname].box_height, num_spots * 14, g_GlobalVars.frametime * 20.0)
  1093. self.render_stuff[startname].icon_alpha = math_helpers:lerp(self.render_stuff[startname].icon_alpha, 0.0, g_GlobalVars.frametime * 20.0)
  1094. self.render_stuff[startname].box_additions_alpha = math_helpers:lerp(self.render_stuff[startname].box_additions_alpha, self.render_stuff[startname].global_alpha, g_GlobalVars.frametime * 20.0)
  1095. if(bestlength - self.render_stuff[startname].box_length < 0.1) then
  1096. self.render_stuff[startname].box_additions_alpha = math_helpers:lerp(self.render_stuff[startname].box_additions_alpha, self.render_stuff[startname].global_alpha, g_GlobalVars.frametime * 20.0)
  1097. self.render_stuff[startname].text_alpha = math_helpers:lerp(self.render_stuff[startname].text_alpha, self.render_stuff[startname].global_alpha, g_GlobalVars.frametime * 20.0)
  1098. end
  1099. elseif(distance > 400 or (temp_nade and temp_nade ~= startspot)) then
  1100. self.render_stuff[startname].text_alpha = math_helpers:lerp(self.render_stuff[startname].text_alpha, 0.0, g_GlobalVars.frametime * 20.0)
  1101. if(self.render_stuff[startname].text_alpha < 0.01) then
  1102. self.render_stuff[startname].box_additions_alpha = math_helpers:lerp(self.render_stuff[startname].box_additions_alpha, 0.0, g_GlobalVars.frametime * 20.0)
  1103. self.render_stuff[startname].icon_alpha = math_helpers:lerp(self.render_stuff[startname].icon_alpha, self.render_stuff[startname].global_alpha, g_GlobalVars.frametime * 20.0)
  1104. self.render_stuff[startname].box_length = math_helpers:lerp(self.render_stuff[startname].box_length, 16, g_GlobalVars.frametime * 20.0)
  1105. self.render_stuff[startname].box_height = math_helpers:lerp(self.render_stuff[startname].box_height, 1, g_GlobalVars.frametime * 20.0)
  1106. end
  1107. end
  1108.  
  1109. g_Render:BoxFilled(Vector2.new(screenpos.x - self.render_stuff[startname].box_length / 2 - 3, screenpos.y + 6), Vector2.new(screenpos.x + self.render_stuff[startname].box_length / 2 + 3, screenpos.y - self.render_stuff[startname].box_height - 15), Color.new(color_set.body_r, color_set.body_g, color_set.body_b, 0.95 * self.render_stuff[startname].global_alpha)) -- тело
  1110. g_Render:Box(Vector2.new(screenpos.x - self.render_stuff[startname].box_length / 2 - 3, screenpos.y + 5), Vector2.new(screenpos.x + self.render_stuff[startname].box_length / 2 + 3, screenpos.y - self.render_stuff[startname].box_height - 14), Color.new(5/255, 4/255, 0, self.render_stuff[startname].global_alpha))
  1111.  
  1112. local icon_size = g_Render:CalcWeaponIconSize(weapon_id, 15)
  1113. g_Render:WeaponIcon(weapon_id, Vector2.new(screenpos.x - icon_size.x / 2 + 1, screenpos.y - icon_size.y + 2), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname].icon_alpha), 15, true)
  1114.  
  1115. num_spots = 0
  1116. for endname, endspot in pairs(startspot) do
  1117. if(type(endspot) == "table") then
  1118. local icon_size = g_Render:CalcWeaponIconSize(weapon_id, 15)
  1119. local name_size = g_Render:CalcTextSize(endname, 13, font)
  1120. if weapon_id == 46 then
  1121. g_Render:WeaponIcon(weapon_id, Vector2.new(screenpos.x - nade_type_size.x / 2 + 15, screenpos.y - self.render_stuff[startname].box_height - nade_type_size.y), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname].text_alpha), 15, true)
  1122. elseif weapon_id == 44 then
  1123. g_Render:WeaponIcon(weapon_id, Vector2.new(screenpos.x - nade_type_size.x / 2 + 24, screenpos.y - self.render_stuff[startname].box_height - nade_type_size.y), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname].text_alpha), 15, true)
  1124. end
  1125. g_Render:Text(endname, Vector2.new(screenpos.x - name_size.x / 2, screenpos.y - (14 * num_spots / 0.98) - name_size.y + 1), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname].text_alpha), 13, font, true)
  1126. num_spots = num_spots + 1
  1127. end
  1128. end
  1129. ::continue::
  1130. end
  1131. end
  1132.  
  1133. for i = 1, 10 do
  1134. if(self.custom_maps[i] and lua_elements.nade_helper_types:GetBool(i) == true) then
  1135. for startname, startspot in pairs(self.custom_maps[i]) do
  1136. if(lua_elements.nade_helper_types:GetBool(i) == false or lua_elements.nade_helper_nades:GetBool(self.menu_nades[tostring(weapon_id)]) == false or startspot.map ~= map or tostring(weapon_id) ~= startspot.type) then goto continue end
  1137. if(self.render_stuff[startname] == nil) then self.render_stuff[startname] = {} end
  1138. if(self.render_stuff[startname].global_alpha == nil) then self.render_stuff[startname].global_alpha = 0.0 end
  1139. if(self.render_stuff[startname].box_length == nil) then self.render_stuff[startname].box_length = 30.0 end
  1140. if(self.render_stuff[startname].box_height == nil) then self.render_stuff[startname].box_height = 30.0 end
  1141. if(self.render_stuff[startname].text_alpha == nil) then self.render_stuff[startname].text_alpha = 0.0 end
  1142. if(self.render_stuff[startname].icon_alpha == nil) then self.render_stuff[startname].icon_alpha = 0.0 end
  1143. if(self.render_stuff[startname].box_additions_alpha == nil) then self.render_stuff[startname].box_additions_alpha = 0.0 end
  1144.  
  1145. local distance = vecOrigin:DistTo(startspot.pos)
  1146. if(distance > 1750.0) then
  1147. self.render_stuff[startname].global_alpha = math_helpers:lerp(self.render_stuff[startname].global_alpha, 0.0, g_GlobalVars.frametime * 20.0)
  1148. else
  1149. local trace = g_EngineTrace:TraceRay(vecEyePosition, startspot.pos, localplayer, 0x200400B)
  1150. if(trace.fraction > 0.98) then
  1151. if(distance > 1250.0) then
  1152. self.render_stuff[startname].global_alpha = math_helpers:lerp(self.render_stuff[startname].global_alpha, 0.4, g_GlobalVars.frametime * 20.0)
  1153. elseif(distance < 5.0) then
  1154. self.render_stuff[startname].global_alpha = math_helpers:lerp(self.render_stuff[startname].global_alpha, 1.0, g_GlobalVars.frametime * 20.0)
  1155. else
  1156. self.render_stuff[startname].global_alpha = math_helpers:lerp(self.render_stuff[startname].global_alpha, 0.8, g_GlobalVars.frametime * 20.0)
  1157. end
  1158. else
  1159. self.render_stuff[startname].global_alpha = math_helpers:lerp(self.render_stuff[startname].global_alpha, 0.0, g_GlobalVars.frametime * 20.0)
  1160. end
  1161. end
  1162.  
  1163. if(self.render_stuff[startname].global_alpha < 0.01) then goto continue end
  1164.  
  1165. local screenpos = g_Render:ScreenPosition(Vector.new(startspot.pos.x, startspot.pos.y, startspot.pos.z + 10.0))
  1166. local nade_type_size = g_Render:CalcTextSize(self.nade_type[tostring(weapon_id)], 13, font)
  1167. local bestlength = 0
  1168. local num_spots = 0
  1169. local temp_fov_nade = nil
  1170. local temp_fov_name = nil
  1171. local bestfov = lua_elements.nade_helper_fov:GetInt()
  1172.  
  1173. for endname, endspot in pairs(startspot) do
  1174. if(type(endspot) == "table") then
  1175. local name_size = g_Render:CalcTextSize(endname, 13, font)
  1176. if(name_size.x > bestlength) then bestlength = name_size.x end
  1177.  
  1178. if(self.render_stuff[startname][endname] == nil) then self.render_stuff[startname][endname] = {} end
  1179. if(self.render_stuff[startname][endname].global_alpha == nil) then self.render_stuff[startname][endname].global_alpha = 0.0 end
  1180. if(self.render_stuff[startname][endname].box_length == nil) then self.render_stuff[startname][endname].box_length = 10.0 end
  1181. if(self.render_stuff[startname][endname].text_alpha == nil) then self.render_stuff[startname][endname].text_alpha = 0.0 end
  1182. if(self.render_stuff[startname][endname].circle_color == nil) then self.render_stuff[startname][endname].circle_color = Color.new(0.15, 0.15, 0.15, 0.0) end
  1183. if(self.render_stuff[startname][endname].description_box_height == nil) then self.render_stuff[startname][endname].description_box_height = 0.0 end
  1184. if(self.render_stuff[startname][endname].description_text_alpha == nil) then self.render_stuff[startname][endname].description_text_alpha = 0.0 end
  1185.  
  1186. if(endspot.endposition == nil) then
  1187. local vecStart = Vector.new(startspot.pos.x, startspot.pos.y, startspot.pos.z + 64.0)
  1188. local forward = cheat.AngleToForward(endspot.ang)
  1189. local vecEnd = Vector.new(vecStart.x + 800.0 * forward.x, vecStart.y + 800.0 * forward.y, vecStart.z + 800.0 * forward.z)
  1190. local trace = g_EngineTrace:TraceRay(vecStart, vecEnd, localplayer, 0x46004003)
  1191. endspot.endposition = Vector.new(trace.endpos.x, trace.endpos.y, trace.endpos.z)
  1192. end
  1193. if(endspot.jumpthresthold == nil) then
  1194. endspot.jumpthresthold = 0
  1195. end
  1196. if(endspot.movedirection == nil) then
  1197. endspot.movedirection = 0
  1198. end
  1199. if(endspot.backupdirection == nil) then
  1200. endspot.backupdirection = 0
  1201. end
  1202. if(endspot.backupduration == nil) then
  1203. endspot.backupduration = 1
  1204. end
  1205. if(endspot.extendforward == nil) then
  1206. endspot.extendforward = false
  1207. end
  1208.  
  1209. local angles = math_helpers:normalizeangles(math_helpers:calcangle(vecEyePosition, endspot.endposition))
  1210. local fov = math.sqrt((angles.pitch - angViewAngles.pitch) ^ 2 + (angles.yaw - angViewAngles.yaw) ^ 2)
  1211. fov = math_helpers:normalizefloat(fov)
  1212. fov = math.abs(fov)
  1213.  
  1214. if(fov < bestfov and distance <= 50.0 and startspot == temp_nade) then
  1215. bestfov = fov
  1216. temp_fov_nade = endspot
  1217. temp_fov_name = endname
  1218. if(self.should_throw == false) then self.closest_nade = endspot end
  1219. end
  1220. num_spots = num_spots + 1
  1221. end
  1222. end
  1223.  
  1224. for endname, endspot in pairs(startspot) do
  1225. if(type(endspot) ~= "table" or endspot == temp_fov_nade) then goto continue end
  1226.  
  1227. local screenpos = g_Render:ScreenPosition(endspot.endposition)
  1228. local name_size = g_Render:CalcTextSize(endname, 12, font_b)
  1229.  
  1230. local r = math_helpers:lerp(self.render_stuff[startname][endname].circle_color:r(), 0.3, g_GlobalVars.frametime * 15.0)
  1231. local g = math_helpers:lerp(self.render_stuff[startname][endname].circle_color:g(), 0.3, g_GlobalVars.frametime * 15.0)
  1232. local b = math_helpers:lerp(self.render_stuff[startname][endname].circle_color:b(), 0.3, g_GlobalVars.frametime * 15.0)
  1233.  
  1234. local desired_box_length = name_size.x + 20
  1235.  
  1236.  
  1237. if(endspot.description and string.len(endspot.description) > 0) then
  1238. local desc_size = g_Render:CalcTextSize(endspot.description, 10, font_p)
  1239. desired_box_height = 16
  1240. if(self.render_stuff[startname][endname].description_text_alpha > 0.01) then desired_box_length = math.max(desired_box_length, desc_size.x) end
  1241. end
  1242.  
  1243. self.render_stuff[startname][endname].description_text_alpha = math_helpers:lerp(self.render_stuff[startname][endname].description_text_alpha, 0.0, g_GlobalVars.frametime * 60.0)
  1244.  
  1245. if(distance > 50.0 or startspot ~= temp_nade) then
  1246. self.render_stuff[startname][endname].text_alpha = math_helpers:lerp(self.render_stuff[startname][endname].text_alpha, 0.0, g_GlobalVars.frametime * 60.0)
  1247. if(self.render_stuff[startname][endname].text_alpha < 0.01) then
  1248. self.render_stuff[startname][endname].box_length = math_helpers:lerp(self.render_stuff[startname][endname].box_length, 10.0, g_GlobalVars.frametime * 30.0)
  1249. self.render_stuff[startname][endname].description_box_height = math_helpers:lerp(self.render_stuff[startname][endname].description_box_height, 0.0, g_GlobalVars.frametime * 30.0)
  1250. if(self.render_stuff[startname][endname].box_length - 10.0 < 0.1 and self.render_stuff[startname][endname].description_box_height < 0.1) then
  1251. self.render_stuff[startname][endname].global_alpha = math_helpers:lerp(self.render_stuff[startname][endname].global_alpha, 0.0, g_GlobalVars.frametime * 60.0)
  1252. end
  1253. end
  1254. else
  1255. if(screenpos.x + self.render_stuff[startname][endname].box_length + 2 > lua_elements.screensize.x or screenpos.x < 12 or screenpos.y + 10 > lua_elements.screensize.y or screenpos.y < 10) then
  1256. self.render_stuff[startname][endname].global_alpha = math_helpers:lerp(self.render_stuff[startname][endname].global_alpha, 1.0, g_GlobalVars.frametime * 60.0)
  1257. else
  1258. self.render_stuff[startname][endname].global_alpha = math_helpers:lerp(self.render_stuff[startname][endname].global_alpha, 0.6, g_GlobalVars.frametime * 60.0)
  1259. end
  1260. if(self.render_stuff[startname][endname].global_alpha > 0.58) then
  1261. self.render_stuff[startname][endname].box_length = math_helpers:lerp(self.render_stuff[startname][endname].box_length, desired_box_length, g_GlobalVars.frametime * 30.0)
  1262. if(desired_box_length - self.render_stuff[startname][endname].box_length < 0.1) then
  1263. self.render_stuff[startname][endname].text_alpha = math_helpers:lerp(self.render_stuff[startname][endname].text_alpha, self.render_stuff[startname][endname].global_alpha, g_GlobalVars.frametime * 60.0)
  1264. if(self.render_stuff[startname][endname].description_text_alpha < 0.01) then
  1265. self.render_stuff[startname][endname].description_box_height = math_helpers:lerp(self.render_stuff[startname][endname].description_box_height, 0.0, g_GlobalVars.frametime * 60.0)
  1266. end
  1267. end
  1268. end
  1269. end
  1270. self.render_stuff[startname][endname].circle_color = Color.new(r, g, b, self.render_stuff[startname][endname].global_alpha)
  1271. if(self.render_stuff[startname][endname].global_alpha < 0.01) then goto continue end
  1272.  
  1273. if(screenpos.x + self.render_stuff[startname][endname].box_length + 2 > lua_elements.screensize.x or screenpos.x < 12 or screenpos.y + 10 > lua_elements.screensize.y or screenpos.y < 10) then
  1274. local vecdelta = Vector2.new(screenpos.x - screencenter.x, screenpos.y - screencenter.y)
  1275. local length = #vecdelta
  1276. local cos = vecdelta.x / length
  1277. local sin = vecdelta.y / length
  1278. local max_legnth = #screencenter
  1279.  
  1280. local newpos = Vector2.new(screencenter.x + max_legnth * cos, screencenter.y + max_legnth * sin)
  1281. if(newpos.x + self.render_stuff[startname][endname].box_length > lua_elements.screensize.x) then newpos.x = lua_elements.screensize.x - self.render_stuff[startname][endname].box_length - 18
  1282. elseif(newpos.x < 16) then newpos.x = 28 end
  1283. if(newpos.y + 16 > lua_elements.screensize.y) then newpos.y = lua_elements.screensize.y - 28
  1284. elseif(newpos.y < 16) then newpos.y = 28 end
  1285.  
  1286. screenpos = newpos
  1287. end
  1288. g_Render:BoxFilled(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][endname].box_length, screenpos.y + 11), Color.new(color_set.target_r, color_set.target_g, color_set.target_b, self.render_stuff[startname][endname].global_alpha + 50))
  1289. g_Render:Box(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][endname].box_length, screenpos.y + 11), Color.new(5/255, 4/255, 0, self.render_stuff[startname][endname].global_alpha + 80))
  1290. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][endname].description_box_height + 8), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][endname].description_box_height - 7), Color.new(0, 0, 0, self.render_stuff[startname][endname].text_alpha))
  1291. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][endname].description_box_height + 7), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][endname].description_box_height - 7), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][endname].text_alpha))
  1292.  
  1293. g_Render:Text(endname, Vector2.new(screenpos.x + 15, screenpos.y - name_size.y / 2), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][endname].text_alpha), 12, font_b, true)
  1294.  
  1295. color_circle = Color.new(170/255, 0, 0, 250/255)
  1296. color_circl = Color.new(170/255, 0, 0, 160/255)
  1297. color_circ = Color.new(155/255, 0, 0, 155/255)
  1298. color_cir = Color.new(135/255, 0, 0, 140/255)
  1299. color_ci = Color.new(110/255, 0, 0, 135/255)
  1300. color_c1 = Color.new(85/255, 0, 0, 130/255)
  1301. color_c1r = Color.new(60/255, 0, 0, 120/255)
  1302. color_c1rc = Color.new(55/255, 0, 0, 35/255)
  1303. color_c1rcl = Color.new(45/255, 0, 0, 15/255)
  1304. color_c1rcle = Color.new(35/255, 0, 0, 5/255)
  1305.  
  1306. g_Render:CircleFilled(screenpos, 9, 15, color_c1rcle); g_Render:CircleFilled(screenpos, 8, 15, color_c1rcl);
  1307. g_Render:CircleFilled(screenpos, 7, 15, color_c1rc); g_Render:CircleFilled(screenpos, 6, 15, color_c1r);
  1308. g_Render:CircleFilled(screenpos, 5, 15, color_c1); g_Render:CircleFilled(screenpos, 4, 15, color_ci);
  1309. g_Render:CircleFilled(screenpos, 3, 15, color_cir); g_Render:CircleFilled(screenpos, 2, 15, color_circ);
  1310. g_Render:CircleFilled(screenpos, 1, 15, color_circl); g_Render:CircleFilled(screenpos, 1, 15, color_circle);
  1311.  
  1312. ::continue::
  1313. end
  1314.  
  1315. if(temp_fov_nade) then
  1316. local screenpos = g_Render:ScreenPosition(temp_fov_nade.endposition)
  1317. local name_size = g_Render:CalcTextSize(temp_fov_name, 12, font_b)
  1318.  
  1319. local r = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].circle_color:r(), 0.01, g_GlobalVars.frametime * 15.0)
  1320. local g = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].circle_color:g(), 0.65, g_GlobalVars.frametime * 15.0)
  1321. local b = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].circle_color:b(), 0.96, g_GlobalVars.frametime * 15.0)
  1322. self.render_stuff[startname][temp_fov_name].global_alpha = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].global_alpha, 0.9, g_GlobalVars.frametime * 30.0)
  1323. self.render_stuff[startname][temp_fov_name].circle_color = Color.new(r, g, b, self.render_stuff[startname][temp_fov_name].global_alpha)
  1324.  
  1325. local desired_box_length = name_size.x + 20
  1326. local desired_box_height = 0
  1327.  
  1328. if(temp_fov_nade.description and string.len(temp_fov_nade.description) > 0) then
  1329. local desc_size = g_Render:CalcTextSize(temp_fov_nade.description, 10, font_p)
  1330. desired_box_height = 16
  1331. if(desc_size.x + 11 > desired_box_length) then desired_box_length = math.max(desired_box_length, desc_size.x + 12) end
  1332. end
  1333.  
  1334. if(self.render_stuff[startname][temp_fov_name].global_alpha > 0.88) then
  1335. self.render_stuff[startname][temp_fov_name].box_length = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].box_length, desired_box_length, g_GlobalVars.frametime * 30.0)
  1336. self.render_stuff[startname][temp_fov_name].description_box_height = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].description_box_height, desired_box_height, g_GlobalVars.frametime * 30.0)
  1337. if(desired_box_length - self.render_stuff[startname][temp_fov_name].box_length < 0.1 and desired_box_height - self.render_stuff[startname][temp_fov_name].description_box_height < 0.1) then
  1338. self.render_stuff[startname][temp_fov_name].text_alpha = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].text_alpha, 1.0, g_GlobalVars.frametime * 30.0)
  1339. self.render_stuff[startname][temp_fov_name].description_text_alpha = math_helpers:lerp(self.render_stuff[startname][temp_fov_name].description_text_alpha, 1.0, g_GlobalVars.frametime * 30.0)
  1340. end
  1341. end
  1342.  
  1343. if(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 2 > lua_elements.screensize.x or screenpos.x < 12 or screenpos.y + 10 > lua_elements.screensize.y or screenpos.y < 10) then
  1344. local vecdelta = Vector2.new(screenpos.x - screencenter.x, screenpos.y - screencenter.y)
  1345. local length = #vecdelta
  1346. local cos = vecdelta.x / length
  1347. local sin = vecdelta.y / length
  1348. local max_legnth = #screencenter
  1349.  
  1350. local newpos = Vector2.new(screencenter.x + max_legnth * cos, screencenter.y + max_legnth * sin)
  1351. if(newpos.x + self.render_stuff[startname][temp_fov_name].box_length > lua_elements.screensize.x) then newpos.x = lua_elements.screensize.x - self.render_stuff[startname][temp_fov_name].box_length + 1
  1352. elseif(newpos.x < 16) then newpos.x = 28 end
  1353. if(newpos.y + 16 > lua_elements.screensize.y) then newpos.y = lua_elements.screensize.y - 28
  1354. elseif(newpos.y < 16) then newpos.y = 28 end
  1355.  
  1356. screenpos = newpos
  1357. end
  1358.  
  1359.  
  1360.  
  1361.  
  1362. if(temp_fov_nade.description and string.len(temp_fov_nade.description) > 0) then
  1363. local desc_size = g_Render:CalcTextSize(temp_fov_nade.description, 10, font_p)
  1364. g_Render:BoxFilled(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 8, screenpos.y), Color.new(color_set.target_r, color_set.target_g, color_set.target_b, self.render_stuff[startname][temp_fov_name].global_alpha))
  1365. g_Render:BoxFilled(Vector2.new(screenpos.x - 10, screenpos.y), Vector2.new(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 8, screenpos.y - 4 + self.render_stuff[startname][temp_fov_name].description_box_height), Color.new(color_set.target_r, color_set.target_g, color_set.target_b, self.render_stuff[startname][temp_fov_name].global_alpha))
  1366. g_Render:Box(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 8, screenpos.y - 4 + self.render_stuff[startname][temp_fov_name].description_box_height), Color.new(5/255, 4/255, 0, self.render_stuff[startname].global_alpha))
  1367.  
  1368. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][temp_fov_name].description_box_height + 9), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][temp_fov_name].description_box_height - 8), Color.new(0, 0, 0, self.render_stuff[startname][temp_fov_name].global_alpha))
  1369. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][temp_fov_name].description_box_height + 8), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][temp_fov_name].description_box_height - 8), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].global_alpha))
  1370.  
  1371. g_Render:Text(temp_fov_name, Vector2.new(screenpos.x + 23, screenpos.y - name_size.y / 2 - 3), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].text_alpha), 12, font_b, true)
  1372. g_Render:Text(temp_fov_nade.description, Vector2.new(screenpos.x + 15, screenpos.y - 2 + self.render_stuff[startname][temp_fov_name].description_box_height / 2 - desc_size.y / 2), Color.new(0, 0, 0, self.render_stuff[startname][temp_fov_name].global_alpha), 10, font_p)
  1373. g_Render:Text(temp_fov_nade.description, Vector2.new(screenpos.x + 16, screenpos.y - 2 + self.render_stuff[startname][temp_fov_name].description_box_height / 2 - desc_size.y / 2), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].global_alpha), 10, font_p, true)
  1374. g_Render:Text('»', Vector2.new(screenpos.x + 15, screenpos.y - name_size.y / 2 - 3), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].text_alpha), 12, font_b, true)
  1375. else
  1376. g_Render:BoxFilled(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 8, screenpos.y + 11), Color.new(color_set.target_r, color_set.target_g, color_set.target_b, self.render_stuff[startname][temp_fov_name].global_alpha))
  1377. g_Render:Box(Vector2.new(screenpos.x - 10, screenpos.y - 11), Vector2.new(screenpos.x + self.render_stuff[startname][temp_fov_name].box_length + 8, screenpos.y + 11), Color.new(5/255, 4/255, 0, self.render_stuff[startname].global_alpha))
  1378.  
  1379. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][temp_fov_name].description_box_height + 8), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][temp_fov_name].description_box_height - 7), Color.new(0, 0, 0, self.render_stuff[startname][temp_fov_name].global_alpha))
  1380. g_Render:Line(Vector2.new(screenpos.x + 10, screenpos.y - self.render_stuff[startname][temp_fov_name].description_box_height + 7), Vector2.new(screenpos.x + 10, screenpos.y + self.render_stuff[startname][temp_fov_name].description_box_height - 7), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].global_alpha))
  1381.  
  1382. g_Render:Text(temp_fov_name, Vector2.new(screenpos.x + 23, screenpos.y - name_size.y / 2), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].text_alpha), 12, font_b, true)
  1383. g_Render:Text('»', Vector2.new(screenpos.x + 15, screenpos.y - name_size.y / 2), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname][temp_fov_name].text_alpha), 12, font_b, true)
  1384. end
  1385.  
  1386. if lua_elements.nade_helper:GetBool() == true then
  1387. color_circle = Color.new(0, 170/255, 0, 250/255)
  1388. color_circl = Color.new(0, 170/255, 0, 160/255)
  1389. color_circ = Color.new(0, 155/255, 0, 155/255)
  1390. color_cir = Color.new(0, 135/255, 0, 140/255)
  1391. color_ci = Color.new(0, 110/255, 0, 135/255)
  1392. color_c1 = Color.new(0, 85/255, 0, 130/255)
  1393. color_c1r = Color.new(0, 60/255, 0, 120/255)
  1394. color_c1rc = Color.new(0, 55/255, 0, 35/255)
  1395. color_c1rcl = Color.new(0, 45/255, 0, 15/255)
  1396. color_c1rcle = Color.new(0, 35/255, 0, 5/255)
  1397. else
  1398. color_circle = Color.new(170/255, 170/255, 0, 250/255)
  1399. color_circl = Color.new(170/255, 170/255, 0, 160/255)
  1400. color_circ = Color.new(155/255, 155/255, 0, 155/255)
  1401. color_cir = Color.new(135/255, 135/255, 0, 140/255)
  1402. color_ci = Color.new(110/255, 110/255, 0, 135/255)
  1403. color_c1 = Color.new(85/255, 85/255, 0, 130/255)
  1404. color_c1r = Color.new(60/255, 60/255, 0, 120/255)
  1405. color_c1rc = Color.new(55/255, 55/255, 0, 35/255)
  1406. color_c1rcl = Color.new(45/255, 45/255, 0, 15/255)
  1407. color_c1rcle = Color.new(35/255, 35/255, 0, 5/255)
  1408. end
  1409.  
  1410. g_Render:CircleFilled(screenpos, 9, 15, color_c1rcle); g_Render:CircleFilled(screenpos, 8, 15, color_c1rcl);
  1411. g_Render:CircleFilled(screenpos, 7, 15, color_c1rc); g_Render:CircleFilled(screenpos, 6, 15, color_c1r);
  1412. g_Render:CircleFilled(screenpos, 5, 15, color_c1); g_Render:CircleFilled(screenpos, 4, 15, color_ci);
  1413. g_Render:CircleFilled(screenpos, 3, 15, color_cir); g_Render:CircleFilled(screenpos, 2, 15, color_circ);
  1414. g_Render:CircleFilled(screenpos, 1, 15, color_circl); g_Render:CircleFilled(screenpos, 1, 15, color_circle);
  1415. end
  1416.  
  1417. if(bestlength < nade_type_size.x) then bestlength = nade_type_size.x end
  1418.  
  1419. if(distance < 400.0 and (temp_nade and temp_nade == startspot or temp_nade == nil or lua_elements.nade_helper:GetBool() == false)) then
  1420. self.render_stuff[startname].box_length = math_helpers:lerp(self.render_stuff[startname].box_length, bestlength, g_GlobalVars.frametime * 20.0)
  1421. self.render_stuff[startname].box_height = math_helpers:lerp(self.render_stuff[startname].box_height, num_spots * 14, g_GlobalVars.frametime * 20.0)
  1422. self.render_stuff[startname].icon_alpha = math_helpers:lerp(self.render_stuff[startname].icon_alpha, 0.0, g_GlobalVars.frametime * 20.0)
  1423. self.render_stuff[startname].box_additions_alpha = math_helpers:lerp(self.render_stuff[startname].box_additions_alpha, self.render_stuff[startname].global_alpha, g_GlobalVars.frametime * 20.0)
  1424. if(bestlength - self.render_stuff[startname].box_length < 0.1) then
  1425. self.render_stuff[startname].box_additions_alpha = math_helpers:lerp(self.render_stuff[startname].box_additions_alpha, self.render_stuff[startname].global_alpha, g_GlobalVars.frametime * 20.0)
  1426. self.render_stuff[startname].text_alpha = math_helpers:lerp(self.render_stuff[startname].text_alpha, self.render_stuff[startname].global_alpha, g_GlobalVars.frametime * 20.0)
  1427. end
  1428. elseif(distance > 400 or (temp_nade and temp_nade ~= startspot)) then
  1429. self.render_stuff[startname].text_alpha = math_helpers:lerp(self.render_stuff[startname].text_alpha, 0.0, g_GlobalVars.frametime * 20.0)
  1430. if(self.render_stuff[startname].text_alpha < 0.01) then
  1431. self.render_stuff[startname].box_additions_alpha = math_helpers:lerp(self.render_stuff[startname].box_additions_alpha, 0.0, g_GlobalVars.frametime * 20.0)
  1432. self.render_stuff[startname].icon_alpha = math_helpers:lerp(self.render_stuff[startname].icon_alpha, self.render_stuff[startname].global_alpha, g_GlobalVars.frametime * 20.0)
  1433. self.render_stuff[startname].box_length = math_helpers:lerp(self.render_stuff[startname].box_length, 16, g_GlobalVars.frametime * 20.0)
  1434. self.render_stuff[startname].box_height = math_helpers:lerp(self.render_stuff[startname].box_height, 1, g_GlobalVars.frametime * 20.0)
  1435. end
  1436. end
  1437.  
  1438. g_Render:BoxFilled(Vector2.new(screenpos.x - self.render_stuff[startname].box_length / 2 - 3, screenpos.y + 6), Vector2.new(screenpos.x + self.render_stuff[startname].box_length / 2 + 3, screenpos.y - self.render_stuff[startname].box_height - 15), Color.new(color_set.body_r, color_set.body_g, color_set.body_b, 0.95 * self.render_stuff[startname].global_alpha)) -- тело
  1439. g_Render:Box(Vector2.new(screenpos.x - self.render_stuff[startname].box_length / 2 - 3, screenpos.y + 5), Vector2.new(screenpos.x + self.render_stuff[startname].box_length / 2 + 3, screenpos.y - self.render_stuff[startname].box_height - 14), Color.new(5/255, 4/255, 0, self.render_stuff[startname].global_alpha))
  1440.  
  1441. local icon_size = g_Render:CalcWeaponIconSize(weapon_id, 15)
  1442. g_Render:WeaponIcon(weapon_id, Vector2.new(screenpos.x - icon_size.x / 2 + 1, screenpos.y - icon_size.y + 2), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname].icon_alpha), 15, true)
  1443.  
  1444. num_spots = 0
  1445. for endname, endspot in pairs(startspot) do
  1446. if(type(endspot) == "table") then
  1447. local icon_size = g_Render:CalcWeaponIconSize(weapon_id, 15)
  1448. local name_size = g_Render:CalcTextSize(endname, 13, font)
  1449. if weapon_id == 46 then
  1450. g_Render:WeaponIcon(weapon_id, Vector2.new(screenpos.x - nade_type_size.x / 2 + 15, screenpos.y - self.render_stuff[startname].box_height - nade_type_size.y), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname].text_alpha), 15, true)
  1451. elseif weapon_id == 44 then
  1452. g_Render:WeaponIcon(weapon_id, Vector2.new(screenpos.x - nade_type_size.x / 2 + 24, screenpos.y - self.render_stuff[startname].box_height - nade_type_size.y), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname].text_alpha), 15, true)
  1453. end
  1454. g_Render:Text(endname, Vector2.new(screenpos.x - name_size.x / 2, screenpos.y - (14 * num_spots / 0.98) - name_size.y + 1), Color.new(color_set.text_color_r, color_set.text_color_g, color_set.text_color_b, self.render_stuff[startname].text_alpha), 13, font, true)
  1455. num_spots = num_spots + 1
  1456. end
  1457. end
  1458. ::continue::
  1459. end
  1460. end
  1461. end
  1462. end,
  1463.  
  1464. on_pre_prediction = function(self, cmd)
  1465. self:backup_strafe(cmd)
  1466. self:extend_forward(cmd)
  1467. if(self.should_throw == true) then
  1468. if(self.closest_nade.duck == true) then cmd.buttons = bit.bor(cmd.buttons, 4)
  1469. else cmd.buttons = bit.band(cmd.buttons, bit.bnot(4)) end
  1470. end
  1471. end,
  1472.  
  1473. on_prediction = function(self, cmd)
  1474. self:update_configs()
  1475. local localplayer = g_EntityList:GetClientEntity(g_EngineClient:GetLocalPlayer())
  1476. if(localplayer == nil) then return end
  1477. localplayer = localplayer:GetPlayer()
  1478. local velocity = Vector.new(localplayer:GetProp("DT_BasePlayer", "m_vecVelocity[0]"), localplayer:GetProp("DT_BasePlayer", "m_vecVelocity[1]"), localplayer:GetProp("DT_BasePlayer", "m_vecVelocity[2]"))
  1479. local weapon = localplayer:GetActiveWeapon()
  1480. if(weapon == nil) then return end
  1481. local throwtime = weapon:GetProp("DT_BaseCSGrenade", "m_fThrowTime")
  1482. local duckamount = localplayer:GetProp("DT_BasePlayer", "m_flDuckAmount")
  1483. local throwstrengh = weapon:GetProp("DT_BaseCSGrenade", "m_flThrowStrength")
  1484. if(self.should_throw == true) then
  1485. cmd.buttons = bit.bor(cmd.buttons, 1)
  1486. if(self.closest_nade.duck == true and duckamount ~= 1.0) then return end
  1487. if(self.closest_nade.duck == false and duckamount ~= 0.0) then return end
  1488. if(self.closest_nade.strength ~= 1.0 and throwstrengh > self.closest_nade.strength) then cmd.buttons = bit.bor(cmd.buttons, 2048); cmd.buttons = bit.band(cmd.buttons, bit.bnot(1)); return end
  1489. if(throwstrengh < self.closest_nade.strength) then cmd.buttons = bit.bor(cmd.buttons, 1) end
  1490. if(self.run_tick == 0) then self.run_tick = cmd.tick_count end
  1491. if(self.closest_nade.runduration > 0 and self.force_forward == false) then
  1492. local speedfactor = 1.0
  1493. if(self.closest_nade.duck) then speedfactor = 2.93 end
  1494. local movedirection = cmd.viewangles.yaw - (self.closest_nade.ang.yaw + self.movedirections[self.closest_nade.movedirection])
  1495. local move = cheat.AngleToForward(QAngle.new(0, movedirection, 0))
  1496. cmd.forwardmove = (move.x) * (self.closest_nade.speed * speedfactor)
  1497. cmd.sidemove = (move.y) * (self.closest_nade.speed * speedfactor)
  1498. end
  1499. if(cmd.tick_count - self.run_tick >= self.closest_nade.runduration) then
  1500. if(self.jump_tick == 0) then self.jump_tick = cmd.tick_count end
  1501. if(self.closest_nade.jump and self.closest_nade.jumpthresthold <= 0) then
  1502. cmd.buttons = bit.bor(cmd.buttons, 2)
  1503. end
  1504. if(cmd.tick_count - self.jump_tick >= self.closest_nade.jumpduration or self.closest_nade.jumpthresthold > 0) then
  1505. cmd.buttons = bit.band(cmd.buttons, bit.bnot(1))
  1506. cmd.buttons = bit.band(cmd.buttons, bit.bnot(2048))
  1507. cmd.viewangles = self.closest_nade.ang
  1508. self.force_forward = self.closest_nade.extendforward
  1509. end
  1510. if(self.closest_nade.jumpthresthold > 0 and cmd.tick_count - self.jump_tick >= self.closest_nade.jumpthresthold) then
  1511. cmd.buttons = bit.bor(cmd.buttons, 2)
  1512. end
  1513. end
  1514. if(throwtime > 0.0 and throwtime < g_GlobalVars.curtime) then
  1515. self:setup_backup_strafe(cmd)
  1516. self.closest_nade = nil
  1517. self.closest_nade_position = nil
  1518. self.should_throw = false
  1519. self.run_tick = 0
  1520. self.jump_tick = 0
  1521. self.force_forward = false
  1522. menu_elements.autostrafe:SetBool(self.old_autostrafe)
  1523. fakelag:ForceSend()
  1524. end
  1525. elseif(self.closest_nade_position and lua_elements.nade_helper:GetBool() == true) then
  1526. cmd.buttons = bit.band(cmd.buttons, bit.bnot(2048))
  1527. local origin = localplayer:GetProp("DT_BaseEntity", "m_vecOrigin")
  1528. local onground = (bit.band(localplayer:GetProp("DT_BasePlayer", "m_fFlags"), 1) == 1)
  1529. local delta = (self.closest_nade_position - origin)
  1530. local length = #delta
  1531. if(onground == true and length < 100.0) then
  1532. local viewangles = g_EngineClient:GetViewAngles()
  1533. local direction = cheat.VectorToAngle(delta)
  1534. direction.yaw = viewangles.yaw - direction.yaw
  1535. local move = cheat.AngleToForward(direction)
  1536. local v1 = bit.band(cmd.buttons, 8) == 8
  1537. local v2 = bit.band(cmd.buttons, 16) == 16
  1538. local v3 = bit.band(cmd.buttons, 512) == 512
  1539. local v4 = bit.band(cmd.buttons, 1024) == 1024
  1540. local in_duck = bit.band(cmd.buttons, 4) == 4
  1541. local in_move = (v1 or v2 or v3 or v4)
  1542. if(in_move == false and length > 0.1) then
  1543. cmd.forwardmove = move.x * (450.0 * (math.exp(math_helpers:clamp(length, 0.0, 5.0) - 5.0)) + 1.0)
  1544. cmd.sidemove = move.y * (450.0 * (math.exp(math_helpers:clamp(length, 0.0, 5.0) - 5.0)) + 1.0)
  1545. if(in_duck == true) then
  1546. cmd.forwardmove = cmd.forwardmove * 2.93
  1547. cmd.sidemove = cmd.sidemove * 2.93
  1548. end
  1549. elseif(weapon:GetProp("DT_BaseCSGrenade", "m_bPinPulled") and self.closest_nade and velocity:Length2D() < 10.0) then
  1550. self.should_throw = true
  1551. self.old_autostrafe = menu_elements.autostrafe:GetBool()
  1552. menu_elements.autostrafe:SetBool(false)
  1553. end
  1554. end
  1555. end
  1556. end,
  1557. }
  1558.  
  1559. local function on_firebullet(shot)
  1560. end
  1561.  
  1562. local function on_ragebotshot(shot)
  1563. end
  1564.  
  1565. local function on_event(event)
  1566. end
  1567.  
  1568. local function on_pre_prediction(cmd)
  1569. grenade_helper:on_pre_prediction(cmd)
  1570. end
  1571.  
  1572. local function on_overrideview(setup)
  1573.  
  1574. end
  1575.  
  1576. local function on_draw()
  1577. lua_elements.screensize = g_EngineClient:GetScreenSize()
  1578. grenade_helper:on_draw()
  1579. --movement_helper:on_draw()
  1580. end
  1581.  
  1582. local function on_createmove(cmd)
  1583. --movement_helper:on_createmove(cmd)
  1584. end
  1585.  
  1586. local function on_prediction(cmd)
  1587. grenade_helper:on_prediction(cmd)
  1588. --movement_helper:on_prediction(cmd)
  1589. end
  1590.  
  1591. local function on_registered_shot(shot)
  1592. end
  1593.  
  1594. local function on_destroy()
  1595. end
  1596.  
  1597. local function on_create_button()
  1598. grenade_helper:on_create_nade()
  1599. end
  1600.  
  1601. local function on_remove_button()
  1602. grenade_helper:on_remove_nade()
  1603. end
  1604.  
  1605. local function on_save_button()
  1606. grenade_helper:on_save_nade()
  1607. end
  1608.  
  1609. local function on_teleport_button()
  1610. grenade_helper:on_teleport_nade()
  1611. end
  1612.  
  1613. local function on_nade_update_button()
  1614. grenade_helper:on_nade_update()
  1615. end
  1616.  
  1617. local function on_properties_combo()
  1618. grenade_helper:on_properties()
  1619. end
  1620.  
  1621. local function on_backupdirection_combo()
  1622. grenade_helper:on_backupstrafe()
  1623. end
  1624.  
  1625. local function on_run_direction_combo()
  1626. if(lua_elements.run_direction:GetInt() > 0) then
  1627. lua_elements.extend_forward_strenght:SetVisible(true)
  1628. else
  1629. lua_elements.extend_forward_strenght:SetVisible(false)
  1630. end
  1631. end
  1632.  
  1633. local function check_sub()
  1634. for name, element in pairs(lua_elements) do
  1635. if(name == "user_name" or name == "screensize") then goto continue end
  1636. element:SetVisible(false)
  1637. ::continue::
  1638. end
  1639.  
  1640. return 0
  1641. end
  1642.  
  1643. local sub_state = check_sub()
  1644.  
  1645. if(sub_state == 0) then
  1646. for name, element in pairs(lua_elements) do
  1647. if(string.find(name, "nade_helper") ~= nil or name == "create_nade") then
  1648. element:SetVisible(true)
  1649. end
  1650. end
  1651. cheat.RegisterCallback("createmove", on_createmove)
  1652. cheat.RegisterCallback("draw", on_draw)
  1653. cheat.RegisterCallback("override_view", on_overrideview)
  1654. cheat.RegisterCallback("fire_bullet", on_firebullet)
  1655. cheat.RegisterCallback("ragebot_shot", on_ragebotshot)
  1656. cheat.RegisterCallback("events", on_event)
  1657. cheat.RegisterCallback("pre_prediction", on_pre_prediction)
  1658. cheat.RegisterCallback("prediction", on_prediction)
  1659. cheat.RegisterCallback("registered_shot", on_registered_shot)
  1660. cheat.RegisterCallback("destroy", on_destroy)
  1661. lua_elements.create_nade:RegisterCallback(on_create_button)
  1662. lua_elements.remove_nade:RegisterCallback(on_remove_button)
  1663. lua_elements.save_nade:RegisterCallback(on_save_button)
  1664. lua_elements.nade_teleport:RegisterCallback(on_teleport_button)
  1665. lua_elements.nade_update_pos_ang:RegisterCallback(on_nade_update_button)
  1666. lua_elements.properties:RegisterCallback(on_properties_combo)
  1667. lua_elements.backup_direction:RegisterCallback(on_backupdirection_combo)
  1668. lua_elements.run_direction:RegisterCallback(on_run_direction_combo)
  1669. end
  1670.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement