szymski

Untitled

Oct 30th, 2016
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.00 KB | None | 0 0
  1. /*-----------------------------------------------------------
  2. Racing
  3.  
  4. Copyright © 2015 Szymon (Szymekk) Jankowski
  5. All Rights Reserved
  6. Steam: https://steamcommunity.com/id/szymski
  7. -------------------------------------------------------------*/
  8.  
  9. local DEBUG = false
  10.  
  11. if SERVER then
  12. AddCSLuaFile()
  13. AddCSLuaFile("racing_config.lua")
  14. AddCSLuaFile("matcore.lua")
  15.  
  16. include("racing_config.lua")
  17. local Config = RACINGConfig
  18. RACING = RACING or { }
  19. RACING.Tracks = RACING.Tracks or { }
  20. RACING.Races = { }
  21.  
  22. CreateConVar("rac_ver", 1, FCVAR_NOTIFY)
  23.  
  24. resource.AddFile("materials/racing/menu.png")
  25. resource.AddFile("materials/racing/close.png")
  26. resource.AddFile("materials/racing/way.png")
  27.  
  28. resource.AddFile("materials/shadow/u.png")
  29. resource.AddFile("materials/shadow/l.png")
  30. resource.AddFile("materials/shadow/r.png")
  31. resource.AddFile("materials/shadow/d.png")
  32.  
  33. resource.AddFile("materials/shadow/lu.png")
  34. resource.AddFile("materials/shadow/ru.png")
  35. resource.AddFile("materials/shadow/ld.png")
  36. resource.AddFile("materials/shadow/rd.png")
  37.  
  38. resource.AddFile("models/racing/arrow.mdl")
  39.  
  40. util.AddNetworkString("racing_menu")
  41. util.AddNetworkString("tracks_update")
  42. util.AddNetworkString("track_update")
  43. util.AddNetworkString("track_remove")
  44. util.AddNetworkString("track_removel")
  45. util.AddNetworkString("track_done")
  46. util.AddNetworkString("race_track_menu")
  47. util.AddNetworkString("race_accept")
  48. util.AddNetworkString("race_done")
  49.  
  50. // Accepting race
  51. net.Receive("race_accept", function(len, ply)
  52. local id = net.ReadInt(16)
  53. local track = RACING.Tracks[id]
  54. if !track then return end
  55. if track.Type == 1 then
  56. if IsValid(track.Npc.player1) && track.Npc.player1:GetPos():Distance(track.Npc:GetPos()) < 500 then
  57. RACING.StartRace(track.Npc.player1, id, ply)
  58. track.Npc.player1 = nil
  59. else
  60. track.Npc.player1 = ply
  61. ply:SendLua("chat.AddText(Color(55,155,255),'[Racing]',Color(255,255,255),' Wait for second player and stay close to the NPC!')")
  62. if DEBUG then
  63. RACING.StartRace(track.Npc.player1, id, player.GetAll()[2])
  64. track.Npc.player1 = nil
  65. end
  66. end
  67. return
  68. end
  69. RACING.StartRace(ply, id)
  70. end)
  71.  
  72. // Removing entire track
  73. net.Receive("track_remove", function(len, ply)
  74. local id = net.ReadInt(16)
  75. if IsValid(RACING.Tracks[id].Npc) then
  76. RACING.Tracks[id].Npc:Remove()
  77. end
  78. RACING.Tracks[id] = nil
  79. RACING.UpdateTracks()
  80. end)
  81.  
  82. // Removing last point
  83. net.Receive("track_removel", function(len, ply)
  84. local track = RACING.Tracks[net.ReadInt(16)]
  85. if track && track.Points && #track.Points > 0 then
  86. table.remove(track.Points, #track.Points)
  87. RACING.UpdateTracks()
  88. end
  89. end)
  90.  
  91. // Updating track
  92. net.Receive("track_update", function(len, ply)
  93. local track = RACING.Tracks[net.ReadInt(16)]
  94. if track then
  95. track.Prize = net.ReadInt(32)
  96. track.Time = net.ReadInt(32)
  97. track.Type = net.ReadInt(8)
  98.  
  99. track.Vehicle.Name = net.ReadString()
  100. track.Vehicle.Class = net.ReadString()
  101. track.Vehicle.Model = net.ReadString()
  102. track.Vehicle.KeyValues = net.ReadTable()
  103.  
  104. RACING.UpdateTracks()
  105. RACING.Save()
  106. end
  107. end)
  108.  
  109. // Editing done
  110. net.Receive("track_done", function(len, ply)
  111. ply:SetNWInt("seltrack", -1)
  112. ply.sel_track = nil
  113. end)
  114.  
  115. function RACING.UpdateTracks()
  116. net.Start("tracks_update")
  117. net.WriteTable(RACING.Tracks)
  118. net.Broadcast()
  119. end
  120.  
  121. function RACING.StartRace(ply, id, ply2)
  122. net.Start("tracks_update")
  123. net.WriteTable(RACING.Tracks)
  124. net.Send(ply)
  125.  
  126. ply:SetNWInt("next_race", math.ceil(CurTime()+Config.DelayTime))
  127.  
  128. local track = RACING.Tracks[id]
  129. if track.Type == 0 then
  130. ply:SetNWInt("curtrack", id)
  131. ply:SetNWInt("curpoint", 1)
  132. ply:SetNWFloat("racestart", CurTime() + 3)
  133. local veh = ents.Create(track.Vehicle.Class)
  134. veh:SetModel(track.Vehicle.Model)
  135. for k, v in pairs(track.Vehicle.KeyValues) do
  136. veh:SetKeyValue(k, v)
  137. end
  138. veh:SetPos(track.Points[1]+Vector(0,0,10))
  139. veh:SetAngles(Angle(0,(track.Points[1]-track.Points[2]):Angle().y+90,0))
  140. veh:Spawn()
  141. ply.racing_start_pos = ply:GetPos()
  142. RACING.Races[#RACING.Races+1] = {
  143. Player = ply,
  144. TrackID = id,
  145. Track = track,
  146. Vehicle = veh,
  147. Type = track.Type,
  148. StartTime = CurTime() + 3,
  149. StartPos = veh:GetPos(),
  150. CurPoint = 1
  151. }
  152. ply:EnterVehicle(veh)
  153. else
  154. ply:SetNWInt("curtrack", id)
  155. ply:SetNWInt("curpoint", 1)
  156. ply:SetNWFloat("racestart", CurTime() + 3)
  157. local veh = ents.Create(track.Vehicle.Class)
  158. veh:SetModel(track.Vehicle.Model)
  159. for k, v in pairs(track.Vehicle.KeyValues) do
  160. veh:SetKeyValue(k, v)
  161. end
  162. veh:SetPos(track.Points[1]+Vector(0,0,10)-(track.Points[1]-track.Points[2]):Angle():Right()*90)
  163. veh:SetAngles(Angle(0,(track.Points[1]-track.Points[2]):Angle().y+90,0))
  164. veh:Spawn()
  165. ply.racing_start_pos = ply:GetPos()
  166.  
  167. ply2:SetNWInt("curtrack", id)
  168. ply2:SetNWInt("curpoint", 1)
  169. ply2:SetNWFloat("racestart", CurTime() + 3)
  170. local veh2 = ents.Create(track.Vehicle.Class)
  171. veh2:SetModel(track.Vehicle.Model)
  172. for k, v in pairs(track.Vehicle.KeyValues) do
  173. veh2:SetKeyValue(k, v)
  174. end
  175. veh2:SetPos(track.Points[1]+Vector(0,0,10)+(track.Points[1]-track.Points[2]):Angle():Right()*90)
  176. veh2:SetAngles(Angle(0,(track.Points[1]-track.Points[2]):Angle().y+90,0))
  177. veh2:Spawn()
  178. ply2.racing_start_pos = ply2:GetPos()
  179.  
  180. RACING.Races[#RACING.Races+1] = {
  181. Player = ply,
  182. Player2 = ply2,
  183. TrackID = id,
  184. Track = track,
  185. Vehicle = veh,
  186. Vehicle2 = veh2,
  187. Type = track.Type,
  188. StartTime = CurTime() + 3,
  189. StartPos = track.Points[1],
  190. CurPoint = 1,
  191. CurPoint2 = 1,
  192. }
  193.  
  194. ply:EnterVehicle(veh)
  195. ply2:EnterVehicle(veh2)
  196. end
  197. end
  198.  
  199. function RACING.EndRace(raceid, won, failmsg, plyWon)
  200. local race = RACING.Races[raceid]
  201. race.Player:SetNWInt("curtrack", -1)
  202. timer.Simple(2, function()
  203. race.Vehicle:Remove()
  204. if Config.ReturnToNPC then
  205. race.Player:ExitVehicle()
  206. race.Player:SetPos(race.Player.racing_start_pos)
  207. end
  208. end)
  209. RACING.Races[raceid] = nil
  210.  
  211. if race.Type == 0 then
  212. net.Start("race_done")
  213. net.WriteBit(won and 1 or 0)
  214. net.WriteString(won and "Won!" or "Failed!")
  215. net.WriteString(won and ("You got $" .. race.Track.Prize) or failmsg)
  216. net.Send(race.Player)
  217.  
  218. if won && race.Player.addMoney then
  219. race.Player:addMoney(race.Track.Prize)
  220. end
  221.  
  222. if !won && Config.TakeMoney && race.Player.addMoney then
  223. race.Player:addMoney(-race.Track.Prize)
  224. end
  225. else
  226. race.Player2:SetNWInt("curtrack", -1)
  227.  
  228. timer.Simple(2, function()
  229. race.Vehicle2:Remove()
  230. if Config.ReturnToNPC then
  231. race.Player2:ExitVehicle()
  232. race.Player2:SetPos(race.Player2.racing_start_pos)
  233. end
  234. end)
  235.  
  236. local plyFail = (race.Player == plyWon) and race.Player2 or race.Player
  237.  
  238. net.Start("race_done")
  239. net.WriteBit(1)
  240. net.WriteString("Won!")
  241. net.WriteString("You got $" .. race.Track.Prize)
  242. net.Send(plyWon)
  243.  
  244. net.Start("race_done")
  245. net.WriteBit(1)
  246. net.WriteString("Failed!")
  247. net.WriteString(failmsg)
  248. net.Send(plyFail)
  249.  
  250. if plyWon.addMoney then
  251. plyWon:addMoney(race.Track.Prize)
  252. end
  253.  
  254. if Config.TakeMoney && plyFail.addMoney then
  255. plyFail.addMoney:addMoney(-race.Track.Prize)
  256. end
  257. end
  258. end
  259.  
  260. // Checking
  261. hook.Add("Tick", "RacingTick", function()
  262. for k, race in pairs(RACING.Races) do
  263. local track = race.Track
  264.  
  265. if race.Type == 0 then
  266. if !race.Player:InVehicle() then
  267. RACING.EndRace(k, false, "You got out of the vehicle")
  268. end
  269.  
  270. if race.StartTime > CurTime() then
  271. race.Vehicle:GetPhysicsObject():SetVelocity(Vector())
  272. return
  273. end
  274.  
  275. local temp = (track.Points[race.CurPoint+1] and (track.Points[race.CurPoint]-track.Points[race.CurPoint+1]) or (track.Points[race.CurPoint-1]-track.Points[race.CurPoint]))
  276. local dot = temp:Dot(track.Points[race.CurPoint+1]-race.Vehicle:GetPos())
  277.  
  278. if dot > 0 then
  279. race.CurPoint = race.CurPoint + 1
  280. race.Player:SetNWInt("curpoint", race.CurPoint)
  281. if !track.Points[race.CurPoint+1] then
  282. if CurTime()-race.StartTime < race.Track.Time then
  283. RACING.EndRace(k, true)
  284. else
  285. RACING.EndRace(k, false, "You were too slow")
  286. end
  287. return
  288. end
  289. end
  290. else
  291. if !race.Player:InVehicle() then
  292. RACING.EndRace(k, false, "You got out of the vehicle", race.Player2)
  293. end
  294.  
  295. if !race.Player2:InVehicle() then
  296. RACING.EndRace(k, false, "You got out of the vehicle", race.Player)
  297. end
  298.  
  299. if race.StartTime > CurTime() then
  300. race.Vehicle:GetPhysicsObject():SetVelocity(Vector())
  301. race.Vehicle2:GetPhysicsObject():SetVelocity(Vector())
  302. return
  303. end
  304.  
  305. local temp = (track.Points[race.CurPoint+1] and (track.Points[race.CurPoint]-track.Points[race.CurPoint+1]) or (track.Points[race.CurPoint-1]-track.Points[race.CurPoint]))
  306. local dot = temp:Dot(track.Points[race.CurPoint+1]-race.Vehicle:GetPos())
  307.  
  308. if dot > 0 then
  309. race.CurPoint = race.CurPoint + 1
  310. race.Player:SetNWInt("curpoint", race.CurPoint)
  311. if !track.Points[race.CurPoint+1] then
  312. RACING.EndRace(k, true, "You were too slow", race.Player)
  313. return
  314. end
  315. end
  316.  
  317. local temp = (track.Points[race.CurPoint+1] and (track.Points[race.CurPoint]-track.Points[race.CurPoint+1]) or (track.Points[race.CurPoint-1]-track.Points[race.CurPoint]))
  318. local dot = temp:Dot(track.Points[race.CurPoint+1]-race.Vehicle2:GetPos())
  319.  
  320. if dot > 0 then
  321. race.CurPoint = race.CurPoint + 1
  322. race.Player2:SetNWInt("curpoint", race.CurPoint)
  323. if !track.Points[race.CurPoint+1] then
  324. RACING.EndRace(k, true, "You were too slow", race.Player2)
  325. return
  326. end
  327. end
  328. end
  329. end
  330. end)
  331.  
  332. // Track saving
  333. function RACING.Save()
  334. local data = { }
  335.  
  336. for k, v in pairs(RACING.Tracks) do
  337. local track = { }
  338. data[#data+1] = track
  339. track.Vehicle = v.Vehicle
  340. track.Prize = v.Prize
  341. track.Time = v.Time
  342. track.Type = v.Type
  343. track.Points = v.Points
  344. track.NpcPos = v.Npc:GetPos()
  345. track.NpcRot = v.Npc:GetAngles()
  346. end
  347.  
  348. file.Write("racing_tracks_" .. game.GetMap() .. ".txt", util.TableToJSON(data))
  349. end
  350.  
  351. // Track loading
  352. function RACING.Load()
  353. RACING.Tracks = { }
  354.  
  355. for k, v in pairs(ents.FindByClass("race_npc")) do
  356. v:Remove()
  357. end
  358.  
  359. if !file.Exists("racing_tracks_" .. game.GetMap() .. ".txt", "DATA") then return end
  360.  
  361. local data = util.JSONToTable(file.Read("racing_tracks_" .. game.GetMap() .. ".txt", "DATA"))
  362.  
  363. for k, v in pairs(data) do
  364. local track = { }
  365. RACING.Tracks[#RACING.Tracks+1] = track
  366. local npc = ents.Create("race_npc")
  367. npc:SetPos(v.NpcPos)
  368. npc:Spawn()
  369. npc:SetAngles(v.NpcRot)
  370. npc:SetNWInt("track", #RACING.Tracks)
  371. track.Npc = npc
  372. track.Vehicle = v.Vehicle
  373. track.Prize = v.Prize
  374. track.Time = v.Time
  375. track.Points = v.Points
  376. track.Type = v.Type
  377. end
  378.  
  379. RACING.UpdateTracks()
  380. end
  381.  
  382. hook.Add("InitPostEntity", "RacingLoad", function()
  383. timer.Simple(10, function()
  384. RACING.Load()
  385. end)
  386. end)
  387.  
  388. // Delay time reset
  389. for k, v in pairs(player.GetAll()) do
  390. v:SetNWInt("next_race", 0)
  391. end
  392.  
  393. // Duel reset
  394. for k, v in pairs(ents.FindByClass("race_npc")) do
  395. v.player1 = nil
  396. end
  397.  
  398. hook.Add("PlayerSpawn", "RacingUpdate", function(ply)
  399. net.Start("tracks_update")
  400. net.WriteTable(RACING.Tracks)
  401. net.Send(ply)
  402. end)
  403.  
  404. return
  405. end
  406.  
  407. include("matcore.lua")
  408.  
  409. include("racing_config.lua")
  410. local Config = RACINGConfig
  411. RACING = RACING or { }
  412. RACING.Tracks = RACING.Tracks or { }
  413.  
  414. /*--------------------------------
  415. Useful
  416. ----------------------------------*/
  417.  
  418. local MatMenu = Material("racing/menu.png", "unlitgeneric")
  419. local MatClose = Material("racing/close.png", "unlitgeneric")
  420. local MatWay = Material("racing/way.png", "unlitgeneric")
  421.  
  422. net.Receive("tracks_update", function()
  423. RACING.Tracks = net.ReadTable()
  424. if IsValid(LocalPlayer()) then
  425. if (LocalPlayer():GetNWInt("seltrack") or 0) > 0 then
  426. RACING.CurTrack = RACING.Tracks[LocalPlayer():GetNWInt("seltrack")]
  427. end
  428. end
  429. end)
  430.  
  431. /*--------------------------------
  432. Drawing track
  433. ----------------------------------*/
  434.  
  435. if IsValid(LocalPlayer()) then
  436. LocalPlayer():SetNWInt("curtrack", -1)
  437. end
  438.  
  439. hook.Add("PostDrawTranslucentRenderables", "RacingDrawTrack", function()
  440. RACING.CurTrack = RACING.Tracks[LocalPlayer():GetNWInt("seltrack")] or RACING.Tracks[LocalPlayer():GetNWInt("curtrack")]
  441.  
  442. if !RACING.CurTrack || !RACING.CurTrack.Points then return end
  443.  
  444. /*for k, v in pairs(RACING.CurTrack.Points) do
  445. local nextTrack = RACING.CurTrack.Points[k+1] or v
  446. cam.Start3D2D(v+Vector(0,0,2), (nextTrack - v):Angle(), 1)
  447. surface.SetDrawColor(255,255,255)
  448. surface.SetMaterial(MatWay)
  449. for i=1, (nextTrack - v):Length()/80 do
  450. local norm = (nextTrack - v)
  451. norm:Normalize()
  452. if (v+norm*80*i):Distance(LocalPlayer():GetPos()) > 1000 then break end
  453. pos = Vector(i*80,0,0)
  454. surface.DrawTexturedRectRotated(pos.x,pos.y,64,64,-90)
  455. end
  456. cam.End3D2D()
  457.  
  458. render.DrawLine(v, nextTrack, Color(0,255,0), true)
  459. end*/
  460.  
  461. local curPoint = 1
  462. local offset = Config.SpaceBetweenArrows or 80
  463. local curOff = 0
  464.  
  465. local a = 1
  466. while RACING.CurTrack.Points[curPoint] do
  467. local curTrack = RACING.CurTrack.Points[curPoint]
  468. local nextTrack = RACING.CurTrack.Points[curPoint+1] or RACING.CurTrack.Points[curPoint]
  469. cam.Start3D2D(curTrack+Vector(0,0,2), (nextTrack - curTrack):Angle(), 1)
  470. surface.SetDrawColor(255,255,255)
  471. surface.SetMaterial(MatWay)
  472. local i = 1
  473. while i*offset < curTrack:Distance(nextTrack)+curOff do
  474. local norm = (nextTrack - curTrack)
  475. norm:Normalize()
  476. //if (curTrack+norm*offset*i):Distance(LocalPlayer():GetPos()) > 1000 then break end
  477. pos = Vector(i*offset-curOff,0,0)
  478. if EyePos():Distance(curTrack+norm*(i*offset-curOff)) < 1800 then
  479. surface.SetDrawColor(255,255,255,255*(1-math.Clamp(EyePos():Distance(curTrack+norm*(i*offset-curOff))/1800,0,1)))
  480. if math.ceil((CurTime()+a)*30)%31==0 && !RACING.Tracks[LocalPlayer():GetNWInt("seltrack")] then
  481. surface.SetDrawColor(255,255,0)
  482. surface.DrawTexturedRectRotated(pos.x,pos.y,96,96,-90)
  483. end
  484. surface.DrawTexturedRectRotated(pos.x,pos.y,64,64,-90)
  485. end
  486. i = i + 1
  487. a = a + 1
  488. //curOff = 0
  489. end
  490.  
  491. curOff = (curTrack:Distance(nextTrack)+curOff)%offset
  492. cam.End3D2D()
  493.  
  494. if RACING.Tracks[LocalPlayer():GetNWInt("seltrack")] then
  495. render.DrawLine(curTrack, nextTrack, Color(0,255,0), true)
  496. end
  497.  
  498. curPoint = curPoint + 1
  499. end
  500. end)
  501.  
  502. /*--------------------------------
  503. HUD
  504. ----------------------------------*/
  505.  
  506. surface.CreateFont("racing_time", {
  507. font = "Roboto",
  508. size = 72,
  509. weight = 5000,
  510. blursize = 0,
  511. scanlines = 0,
  512. antialias = true,
  513. })
  514.  
  515. surface.CreateFont("racing_number", {
  516. font = "Roboto",
  517. size = 128,
  518. weight = 5000,
  519. blursize = 0,
  520. scanlines = 0,
  521. antialias = true,
  522. })
  523.  
  524. local function DrawTextS(text, font, posx, posy, color, alignx, alingy)
  525. draw.SimpleText(text, font, posx+1, posy+1, Color(0,0,0,color.a), alignx, aligny)
  526. draw.SimpleText(text, font, posx, posy, color, alignx, aligny)
  527. end
  528.  
  529. local lastNumber = 0
  530.  
  531. local endTextTime = 1
  532. local endText1 = ""
  533. local endText2 = ""
  534.  
  535. local won = false
  536.  
  537. local arrowAng = 0
  538.  
  539. surface.CreateFont("racing_npcfont", {
  540. font = "Roboto",
  541. size = 55,
  542. weight = 5000,
  543. blursize = 0,
  544. scanlines = 0,
  545. antialias = true,
  546. })
  547.  
  548. hook.Add("HUDPaint", "RacingHUD", function()
  549. // Above head text
  550. for k, v in pairs(ents.FindByClass("race_npc")) do
  551. if v:GetPos():Distance(EyePos()) > 500 then continue end
  552. local pos = (v:GetPos()+Vector(0,0,85)):ToScreen()
  553. draw.SimpleText(Config.NpcText, "racing_npcfont", pos.x+1, pos.y+1, Color(0,0,0), 1, 1)
  554. draw.SimpleText(Config.NpcText, "racing_npcfont", pos.x, pos.y, Color(255,255,255), 1, 1)
  555. end
  556.  
  557. if endTextTime > 0.02 then
  558. endTextTime = math.Max(endTextTime-FrameTime()*0.2, 0)
  559. DrawTextS(endText1, "racing_number", ScrW()/2, ScrH()/2-100, Color(255,255,255, math.sin((1-endTextTime)*3.14)*512), 1, 1)
  560. DrawTextS(endText2, "racing_time", ScrW()/2, ScrH()/2, Color(255,255,255, math.sin((1-endTextTime)*3.14)*512), 1, 1)
  561. end
  562.  
  563. if !RACING.CurTrack || !RACING.CurTrack.Points || RACING.Tracks[LocalPlayer():GetNWInt("seltrack")] then return end
  564.  
  565. local startTime = LocalPlayer():GetNWFloat("racestart")
  566.  
  567. if startTime > CurTime() then
  568. if lastNumber != math.ceil(startTime-CurTime()) then
  569. surface.PlaySound("buttons/button16.wav")
  570. end
  571. DrawTextS("" .. math.ceil(startTime-CurTime()), "racing_number", ScrW()/2, ScrH()/2-64, Color(255,255,255), 1, 1)
  572. lastNumber = math.ceil(startTime-CurTime())
  573. return
  574. end
  575.  
  576. if lastNumber != 0 then
  577. surface.PlaySound("weapons/357/357_fire2.wav")
  578. lastNumber = 0
  579. end
  580.  
  581. DrawTextS(string.FormattedTime(CurTime()-LocalPlayer():GetNWFloat("racestart"), "%02i:%02i:%02i"), "racing_time", ScrW()/2, 80, Color(255,255,255), 1, 1)
  582.  
  583. local curPoint = LocalPlayer():GetNWInt("curpoint")
  584.  
  585. local ang = RACING.CurTrack.Points[curPoint+1] and (RACING.CurTrack.Points[curPoint+1]+(RACING.CurTrack.Points[curPoint+1]-RACING.CurTrack.Points[curPoint])*0.5-LocalPlayer():GetPos()):Angle().y or
  586. (RACING.CurTrack.Points[curPoint]-LocalPlayer():GetPos()):Angle().y
  587.  
  588. ang = ang - EyeAngles().y
  589.  
  590. ang = (RACING.CurTrack.Points[curPoint]-RACING.CurTrack.Points[curPoint+1]):Angle().y - EyeAngles().y - 180
  591.  
  592. arrowAng = LerpAngle(FrameTime()*5, Angle(0,arrowAng,0), Angle(0,ang,0)).y
  593.  
  594. // Arrow drawing
  595. cam.Start3D(Vector(0,0,0), Angle(0,0,0))
  596.  
  597. render.SetColorModulation(3, 3, 3)
  598. render.SetLightingMode(1)
  599. render.Model({
  600. model = "models/racing/arrow.mdl",
  601. pos = Vector(120,0,-60),
  602. angle = Angle(0,arrowAng,0)
  603. })
  604. render.SetLightingMode(0)
  605. render.SetColorModulation(1, 1, 1)
  606.  
  607. cam.End3D()
  608. end)
  609.  
  610. /*--------------------------------
  611. Net messages
  612. ----------------------------------*/
  613.  
  614. net.Receive("race_done", function()
  615. endTextTime = 1
  616. won = net.ReadBit() == 1
  617. endText1 = net.ReadString()
  618. endText2 = net.ReadString()
  619. end)
  620.  
  621. /*--------------------------------
  622. Menu
  623. ----------------------------------*/
  624.  
  625. if IsValid(RACEM) then
  626. RACEM:Remove()
  627. end
  628.  
  629. local function OpenRaceMenu()
  630. if IsValid(RACEM) then
  631. RACEM:Remove()
  632. end
  633.  
  634. local id = net.ReadInt(16)
  635. local track = RACING.Tracks[id]
  636.  
  637. RACEM = matcore.MakeDialog(Color(255,255,255),
  638. track.Type == 0 and "Take a part in a race?" or "Take a part in a duel race?",
  639. "You're going to take a part in a race.\nMoney to win: $" .. track.Prize .. "\nTime: " .. track.Time .. " seconds",
  640. Color(0,0,0), Color(120,120,120), "YES", "NO")
  641. RACEM:SetAnimSize(500,300)
  642. function RACEM.Agree:DoClick()
  643. net.Start("race_accept")
  644. net.WriteInt(id, 16)
  645. net.SendToServer()
  646. RACEM:Remove()
  647. end
  648. function RACEM.Disagree:DoClick()
  649. RACEM:Remove()
  650. end
  651. end
  652.  
  653. net.Receive("racing_menu", OpenRaceMenu)
  654.  
  655. /*--------------------------------
  656. Track edit menu
  657. ----------------------------------*/
  658.  
  659. if IsValid(TRACKM) then
  660. TRACKM:Remove()
  661. end
  662.  
  663. local function OpenTrackEdit()
  664. local track = RACING.Tracks[LocalPlayer():GetNWInt("seltrack")]
  665.  
  666. TRACKM = vgui.Create("DFrame")
  667. TRACKM:SetSize(400, 400)
  668. TRACKM:SetPos(ScrW()-TRACKM:GetWide()-10, ScrH()-TRACKM:GetTall()-10)
  669. TRACKM:MakePopup()
  670. function TRACKM:OnClose()
  671. TRACKM:Update()
  672. end
  673.  
  674. // Remove Last Button
  675. local rmLast = TRACKM:Add("DButton")
  676. rmLast:Dock(TOP)
  677. rmLast:SetText("Remove Last Checkpoint")
  678. function rmLast:DoClick()
  679. net.Start("track_removel")
  680. net.WriteInt(LocalPlayer():GetNWInt("seltrack"), 16)
  681. net.SendToServer()
  682. end
  683.  
  684. // Track type
  685. local typeBtn = TRACKM:Add("DButton")
  686. typeBtn:Dock(TOP)
  687. typeBtn:SetText((track.Type or 0) == 0 and "Single Player" or "Duel")
  688. typeBtn.type = track.Type
  689. function typeBtn:DoClick()
  690. track.Type = track.Type == 1 and 0 or 1
  691. typeBtn.type = track.Type
  692. typeBtn:SetText((track.Type or 0) == 0 and "Single Player" or "Duel")
  693. end
  694.  
  695. // Vehicle
  696. local veh = TRACKM:Add("DButton")
  697. veh:Dock(TOP)
  698. veh:SetText(track.Vehicle.Name)
  699. function veh:DoClick()
  700. local lst = list.Get("Vehicles")
  701. local menu = DermaMenu()
  702. for k, v in pairs(lst) do
  703. menu:AddOption(v.Name, function()
  704. veh:SetText(v.Name)
  705. veh.Name = v.Name
  706. veh.Class = v.Class
  707. veh.Model = v.Model
  708. veh.KeyValues = v.KeyValues
  709. end)
  710. end
  711. local lst = list.Get("SCars")
  712. for k, v in pairs(lst) do
  713. menu:AddOption(v.Name, function()
  714. veh:SetText(v.Name)
  715. veh.Name = v.Name
  716. veh.Class = v.Class
  717. veh.Model = v.Model
  718. veh.KeyValues = v.KeyValues
  719. end)
  720. end
  721. menu:Open()
  722. end
  723. veh.Name = track.Vehicle.Name
  724. veh.Class = track.Vehicle.Class
  725. veh.Model = track.Vehicle.Model
  726. veh.KeyValues = track.Vehicle.KeyValues
  727.  
  728. // Remove Button
  729. local rmBtn = TRACKM:Add("DButton")
  730. rmBtn:SetText("Remove")
  731. rmBtn:Dock(BOTTOM)
  732. function rmBtn:DoClick()
  733. net.Start("track_remove")
  734. net.WriteInt(LocalPlayer():GetNWInt("seltrack"), 16)
  735. net.SendToServer()
  736. TRACKM:Remove()
  737. end
  738.  
  739. // Finish editing Button
  740. local finishBtn = TRACKM:Add("DButton")
  741. finishBtn:Dock(BOTTOM)
  742. finishBtn:SetText("Finish editing")
  743. function finishBtn:DoClick()
  744. net.Start("track_done")
  745. net.SendToServer()
  746. TRACKM:Update()
  747. TRACKM:Remove()
  748. end
  749.  
  750. // Prize
  751. local prize = TRACKM:Add("DNumSlider")
  752. prize:Dock(TOP)
  753. prize:SetText("Money")
  754. prize:SetMin(1)
  755. prize:SetMax(5000)
  756. prize:SetDecimals(0)
  757. prize:SetValue(track.Prize)
  758.  
  759. // Time
  760. local time = TRACKM:Add("DNumSlider")
  761. time:Dock(TOP)
  762. time:SetText("Time (in seconds)")
  763. time:SetMin(5)
  764. time:SetMax(300)
  765. time:SetDecimals(0)
  766. time:SetValue(track.Time)
  767.  
  768. function TRACKM:Update()
  769. net.Start("track_update")
  770.  
  771. net.WriteInt(LocalPlayer():GetNWInt("seltrack"), 16)
  772.  
  773. net.WriteInt(prize:GetValue(), 32)
  774. net.WriteInt(time:GetValue(), 32)
  775. net.WriteInt(typeBtn.type or 0, 8)
  776.  
  777. net.WriteString(veh.Name)
  778. net.WriteString(veh.Class)
  779. net.WriteString(veh.Model)
  780. net.WriteTable(veh.KeyValues)
  781.  
  782. net.SendToServer()
  783. end
  784. end
  785.  
  786. net.Receive("race_track_menu", OpenTrackEdit)
Advertisement
Add Comment
Please, Sign In to add comment