Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 40.75 KB | None | 0 0
  1. if wac then
  2. MsgC( Color( 255, 0, 0 ), "WAC and HVAP are both installed and are incompatable, remove WAC to regain HVAP functionality." )
  3. PrintMessage( HUD_PRINTCENTER, "WAC and HVAP are both installed and are incompatable, remove WAC to regain HVAP functionality." )
  4. PrintMessage( HUD_PRINTTALK, "WAC and HVAP are both installed and are incompatable, remove WAC to regain HVAP functionality." )
  5. return end
  6.  
  7. include("shared.lua")
  8. AddCSLuaFile("cl_init.lua")
  9. AddCSLuaFile("shared.lua")
  10. include("hvap/aircraft.lua")
  11.  
  12. util.AddNetworkString("hvap.aircraft.updateWeapons")
  13.  
  14. function ENT:Initialize()
  15. hvap.aircraft.initialize()
  16. self.Entity:SetModel(self.Model)
  17. self.Entity:PhysicsInit(SOLID_VPHYSICS)
  18. self.Entity:SetMoveType(MOVETYPE_VPHYSICS)
  19. self.Entity:SetSolid(SOLID_VPHYSICS)
  20. self.phys = self:GetPhysicsObject()
  21. if self.phys:IsValid() then
  22. self.phys:SetMass(self.Weight)
  23. self.phys:EnableDrag(false)
  24. self.phys:Wake()
  25. end
  26.  
  27. local skins = self:SkinCount()
  28. if skins != 1 then
  29. skin = math.random(skins)
  30. self:SetSkin(skin)
  31. end
  32.  
  33. self.BBoxRadius = (self:OBBMins()-self:OBBMaxs()):Length()
  34.  
  35. self.Children = {}
  36. self.CamData = {}
  37.  
  38. self.OnRemoveEntities={}
  39. self.OnRemoveFunctions={}
  40. self.wheels = {}
  41.  
  42. self.NumEngines = #self.Engines
  43. self.NumRotors = #self.Rotors
  44.  
  45. self.nextUpdate = 0
  46. self.CvarTick = 0
  47. self.LastDamageTaken = 0
  48. self.hvap_seatswitch = true
  49. self.rotorRpm = 0
  50. self.EnginesRPM = 0
  51. self.EnginePower = 0
  52. self.LastPhys = 0
  53. self.Roll = 0
  54. self.Pitch = 0
  55. self.Yaw = 0
  56. self.Throttle = 0
  57. self.SmoothThrottle = 0
  58. self.Boost = false
  59. self.ThrSensitivity = 1
  60.  
  61. self.FuselageHPMult = hvap.aircraft.cvars.fhealthmul:GetFloat()
  62. self.EngineHPMult = hvap.aircraft.cvars.ehealthmul:GetFloat()
  63. self.RotorHPMult = hvap.aircraft.cvars.rhealthmul:GetFloat()
  64.  
  65. self.StartSpd = hvap.aircraft.cvars.startSpeed:GetFloat()
  66. self.EnableFuel = tobool(hvap.aircraft.cvars.fuelenable:GetInt())
  67. self.FuelConMultCvar = hvap.aircraft.cvars.fuelconsumptionmult:GetFloat()
  68. self.SpeedMult = hvap.aircraft.cvars.speedMult:GetInt()
  69. self.PilotDamageCvar = hvap.aircraft.cvars.noplayerdamage:GetInt()
  70. self.waterDamage = hvap.aircraft.cvars.waterDamage:GetInt()
  71.  
  72. if self.FuselageHPMult > 0 then
  73. self.FuselageHealth = self.FuselageHealth*self.FuselageHPMult
  74. self.Unbreakable = false
  75. else
  76. self.Unbreakable = true
  77. end
  78.  
  79. self.FuselageBaseHealth = self.FuselageHealth
  80. self.CriticalHealth = self.FuselageBaseHealth*4
  81. self.CriticalBaseHealth = self.CriticalHealth
  82. self.EnginesMaxHealth = 0
  83. self.FSCL = 1
  84.  
  85. self.BaseFuel = self.Fuel
  86.  
  87. self.passengers = {}
  88.  
  89. self.controls = {
  90. throttle = 0,
  91. pitch = 0,
  92. yaw = 0,
  93. roll = 0,
  94. }
  95.  
  96. self.disabled = false
  97. self.dead = false
  98. self.CriticalDeath = false
  99. self.spinout = false
  100.  
  101. self.Refueling = false
  102.  
  103. self.GearDown = false
  104. self:LandingGear(false)
  105.  
  106. self:addSounds()
  107.  
  108. self:addEngines()
  109. self:addRotors()
  110. self:addWheels()
  111. self:addTurrets()
  112. self:addWeapons()
  113. self:addCountermeasures()
  114.  
  115. self:addSeats()
  116. self:addNpcTargets()
  117.  
  118. self:addExtras()
  119.  
  120. self:SecondaryInitialize()
  121.  
  122. if self.HasDoors and self.DoorFlip then
  123. self:SetBodygroup(self.DoorBodygroup, 1)
  124. end
  125. self.DoorIsOpen = true
  126.  
  127. local effectdata = EffectData()
  128. effectdata:SetEntity( self )
  129. util.Effect( "hvap_spawn", effectdata, true, true )
  130. table.insert(self.Children, self)
  131. end
  132.  
  133. function ENT:SecondaryInitialize()
  134.  
  135. end
  136.  
  137. function ENT:SpawnFunction( ply, tr, ClassName )
  138.  
  139. if ( !tr.Hit ) then return end
  140.  
  141. local SpawnPos = tr.HitPos + tr.HitNormal * self.SpawnHeight
  142. local SpawnAng = ply:EyeAngles()
  143. SpawnAng.p = 0
  144. SpawnAng.y = SpawnAng.y + 180
  145.  
  146. local ent = ents.Create( ClassName )
  147. ent:SetCreator( ply )
  148. ent:SetPos( SpawnPos )
  149. ent:SetAngles( SpawnAng )
  150. ent:Spawn()
  151. ent:Activate()
  152. ent.Owner=ply
  153. ent.SpawnedBy=ply
  154.  
  155. return ent
  156.  
  157. end
  158.  
  159. function ENT:addEntity(name, nofx)
  160. local e = ents.Create(name)
  161. if !IsValid(e) then return nil end
  162.  
  163. if !nofx then
  164. local effectdata = EffectData()
  165. effectdata:SetEntity( e )
  166. util.Effect( "hvap_spawn", effectdata, true, true )
  167. end
  168.  
  169. table.insert(self.Children, e)
  170. e.Owner = self.Owner
  171. e:SetNWEntity("hvap_aircraft", self)
  172. e.aircraft = self
  173. return e
  174. end
  175.  
  176. function ENT:UpdateTransmitState() return TRANSMIT_PVS end -- TRANSMIT_ALWAYS
  177.  
  178. function ENT:addNpcTargets()
  179. for _,s in pairs(self.HatingNPCs) do
  180. self:Fire("SetRelationShip", s.." D_HT 99")
  181. end
  182. end
  183.  
  184. function ENT:addEngines()
  185. self.engines = {}
  186. for k, v in pairs(self.Engines) do
  187. if k != "BaseClass" then
  188. local eng = self:addEntity("hvap_engine", true)
  189. eng:SetPos(self:LocalToWorld(v.pos))
  190. eng:SetAngles(self:GetAngles())
  191. eng:SetParent(self)
  192. for index, value in pairs(v.info) do
  193. eng[index] = value
  194. end
  195. eng:Spawn()
  196. eng:Activate()
  197. self.engines[k] = eng
  198. self:AddOnRemove(eng)
  199. end
  200. end
  201. for i = 1, self.NumEngines do
  202. self.EnginesMaxHealth = self.EnginesMaxHealth+self.engines[i].BaseHealth
  203. end
  204. end
  205.  
  206. function ENT:addRotors()
  207. self.rotors={}
  208. for k, v in pairs(self.Rotors) do
  209. if k != "BaseClass" then
  210. if !v.istail then
  211. local rotor = self:addEntity("hvap_rotor", false)
  212. rotor:SetPos(self:LocalToWorld(v.pos))
  213. rotor:SetAngles(self:LocalToWorldAngles(v.ang))
  214. rotor:SetModel(v.model)
  215. for index, value in pairs(v.info) do
  216. rotor[index] = value
  217. end
  218. rotor:Spawn()
  219. rotor:Activate()
  220. self.rotors[k] = rotor
  221. self:AddOnRemove(rotor)
  222. if rotor:IsValid() then
  223. constraint.Axis(self.Entity, rotor, 0, 0, v.pos, Vector(0,0,1), 0,0,0.01,1)
  224. end
  225. else
  226. local trotor = self:addEntity("hvap_rotor_r", false)
  227. trotor:SetPos(self:LocalToWorld(v.pos))
  228. trotor:SetAngles(self:LocalToWorldAngles(v.ang))
  229. trotor:SetModel(v.model)
  230. for index, value in pairs(v.info) do
  231. trotor[index] = value
  232. end
  233. trotor:Spawn()
  234. trotor:Activate()
  235. self.RearRotor = trotor
  236. self.rotors[k] = trotor
  237. self:AddOnRemove(trotor)
  238. if trotor:IsValid() then
  239. constraint.Axis(self.Entity, trotor, 0, 0, v.pos, Vector(0, 1, 0), 0,0,0.01,1)
  240. end
  241. end
  242. end
  243. end
  244. end
  245.  
  246. function ENT:addWeapons()
  247. self.weapons = {}
  248. self.weapons2 = {}
  249. for i, w in pairs(self.Weapons) do
  250. if i != "BaseClass" then
  251. local pod = ents.Create(w.class)
  252. pod:SetPos(self:GetPos()+Vector(0,0,32))
  253. pod:SetAngles(self:GetAngles())
  254. pod:SetParent(self)
  255. for index, value in pairs(w.info) do
  256. pod[index] = value
  257. end
  258. if w.info.Attach then
  259. pod:SetNWEntity( "hvap_turret_gun", self.turrets[w.info.Turret][w.info.Pod][w.info.Attach])
  260. end
  261. pod.aircraft = self
  262. pod:Spawn()
  263. pod:Activate()
  264. pod:SetNoDraw(true)
  265. pod:SetNWEntity("hvap_aircraft", self)
  266. pod.podIndex = i
  267. self.weapons[i] = pod
  268. self:AddOnRemove(pod)
  269. table.insert(self.Children, pod)
  270. end
  271. end
  272.  
  273. for i, w in pairs(self.Weapons2) do
  274. if i != "BaseClass" then
  275. local pod2 = ents.Create(w.class)
  276. pod2:SetPos(self:GetPos()+Vector(0,0,32))
  277. pod2:SetAngles(self:GetAngles())
  278. pod2:SetParent(self)
  279. for index, value in pairs(w.info) do
  280. pod2[index] = value
  281. end
  282. if w.info.Attach then
  283. pod2:SetNWEntity( "hvap_turret_gun", self.turrets[w.info.Turret][w.info.Pod][w.info.Attach])
  284. end
  285. pod2.aircraft = self
  286. pod2:Spawn()
  287. pod2:Activate()
  288. pod2:SetNoDraw(true)
  289. pod2:SetNWEntity("hvap_aircraft", self)
  290. pod2.podIndex = i
  291. self.weapons2[i] = pod2
  292. self:AddOnRemove(pod2)
  293. table.insert(self.Children, pod2)
  294. end
  295. end
  296. end
  297.  
  298. function ENT:addSeats()
  299. self.seats = {}
  300. local e = self:addEntity("hvap_seat_connector", true)
  301. e:SetPos(self:LocalToWorld(self.SeatSwitcherPos))
  302. e:SetNoDraw(true)
  303. e:Spawn()
  304. e:Activate()
  305. e.hvap_ignore = true
  306. e:SetNotSolid(true)
  307. e:SetParent(self)
  308. self:SetSwitcher(e)
  309. for k, v in pairs(self.Seats) do
  310. if k != "BaseClass" then
  311. local ang = self:GetAngles()
  312. self.seats[k] = self:addEntity("prop_vehicle_prisoner_pod", true)
  313. self.seats[k].activeProfile = 1
  314. self.seats[k].Number = k
  315. self.seats[k]:SetModel("models/nova/airboat_seat.mdl")
  316. self.seats[k]:SetPos(self:LocalToWorld(v.pos))
  317. self.seats[k]:Spawn()
  318. self.seats[k]:Activate()
  319. self.seats[k]:SetNWInt("selectedWeapon", 0)
  320. if v.ang then
  321. local a = self:GetAngles()
  322. a.y = a.y-90
  323. a:RotateAroundAxis(Vector(0,0,1), v.ang.y)
  324. self.seats[k]:SetAngles(a)
  325. else
  326. ang:RotateAroundAxis(self:GetUp(), -90)
  327. self.seats[k]:SetAngles(ang)
  328. end
  329. self.seats[k]:SetNoDraw(true)
  330. self.seats[k]:SetNotSolid(true)
  331. self.seats[k]:SetParent(self)
  332. self.seats[k]:SetKeyValue( "limitview", 0 )
  333. self:SetNWInt("seat_"..k.."_actwep", 1)
  334. self:SetNWInt("seat_"..k.."_actwep2", 1)
  335. e:addVehicle(self.seats[k])
  336. end
  337. end
  338. end
  339.  
  340. function ENT:addTurrets()
  341. self.turrets = {}
  342.  
  343. if !self.Turrets then return end
  344. for k, v in pairs(self.Turrets) do
  345. local pods = {}
  346. local info = {}
  347. for podk, podv in pairs(v.pods) do
  348. local part = {}
  349. for partk, partv in pairs(podv) do
  350. local t = self:addEntity("hvap_turret")
  351. t:SetPos(self:LocalToWorld(partv.pos))
  352. t:SetAngles(self:LocalToWorldAngles(v.info.ang or Angle()))
  353. t:SetModel(partv.model)
  354. t:SetParent(self)
  355. for index, value in pairs(partv) do
  356. t[index] = value
  357. end
  358. t:Spawn()
  359. t:Activate()
  360. t.restrictPitch = partv.restrictPitch
  361. t.restrictYaw = partv.restrictYaw
  362. t.offset = partv.offset
  363. t.Turret = k
  364. self:SetNWEntity("hvap_"..k.."_"..podk.."_"..partk, t)
  365. self:AddOnRemove(t)
  366. part[partk] = t
  367. end
  368. pods[podk] = part
  369. end
  370. self.turrets[k] = pods
  371. for infok, infov in pairs(v.info) do
  372. info[infok] = infov
  373. end
  374. self.turrets[k].info = info
  375. end
  376.  
  377. end
  378.  
  379. function ENT:addExtras()
  380. if self.Extras then
  381. for k, v in pairs(self.Extras) do
  382. local e = self:addEntity("hvap_extra")
  383. e:SetPos(self:LocalToWorld(v.pos))
  384. e:SetAngles(self:GetAngles()+v.ang)
  385. e:SetModel(v.model)
  386. e:SetNotSolid(true)
  387. e.IsHVAP = true
  388. e.IsHVAPAircraft = true
  389. e.IsHVAPPlane = false
  390. e.IsHVAPGround = false
  391. e:SetParent(self)
  392. e:Spawn()
  393. e:Activate()
  394. self:AddOnRemove(e)
  395. end
  396. end
  397. end
  398.  
  399. function ENT:addWheels()
  400. if !self.Wheels then return end
  401. self.NumWheels = #self.Wheels
  402. for _,t in pairs(self.Wheels) do
  403. if t != "BaseClass" then
  404. if t.mdl then
  405. local e=self:addEntity("hvap_entity")
  406. e:SetModel(t.mdl)
  407. e:SetPos(self:LocalToWorld(t.pos))
  408. e:SetAngles(self:GetAngles())
  409. e.health = self.FuselageHealth
  410. e.Unbreakable = self.Unbreakable
  411. e.Type = "Wheel"
  412. e:Spawn()
  413. e:Activate()
  414. local ph=e:GetPhysicsObject()
  415. ph:SetMass(t.mass)
  416. ph:EnableDrag(false)
  417. e:SetGravity(0.01)
  418. ph:SetMaterial( "rubbertire" )
  419. constraint.Axis(e,self,0,0,Vector(0,0,0),self:WorldToLocal(e:LocalToWorld(Vector(0,1,0))),0,0,t.friction,1)
  420. table.insert(self.wheels,e)
  421. self:AddOnRemove(e)
  422. end
  423. end
  424. end
  425. end
  426.  
  427. function ENT:addCountermeasures()
  428. for i, w in pairs(self.CounterMeasures) do
  429. if i != "BaseClass" then
  430. local pod = ents.Create(w.class)
  431. pod:SetPos(self:GetPos())
  432. pod:SetAngles(self:GetAngles())
  433. pod:SetParent(self)
  434. for index, value in pairs(w.info) do
  435. pod[index] = value
  436. end
  437. pod.aircraft = self
  438. pod.entTable = self.OnRemoveEntities
  439. pod:Spawn()
  440. pod:Activate()
  441. pod:SetNWEntity("hvap_aircraft", self)
  442. pod:SetNoDraw(true)
  443. self.countermeasure = pod
  444. self:AddOnRemove(pod)
  445. end
  446. end
  447. end
  448.  
  449. function ENT:MakeGibs()
  450. if !self.Gibs then return end
  451. for k, v in pairs(self.Gibs) do
  452. if k != "BaseClass" then
  453. local gib = ents.Create("hvap_entity")
  454. gib:SetModel(t.mdl)
  455. gib:SetPos(self:LocalToWorld(t.pos))
  456. gib:SetAngles(self:GetAngles())
  457. gib.health = self.FuselageHealth/2
  458. gib.Unbreakable = false
  459. gib.Type = "Gib"
  460. gib:Spawn()
  461. gib:Activate()
  462. local ph=gib:GetPhysicsObject()
  463. ph:SetMass(t.mass)
  464. ph:EnableDrag(false)
  465. end
  466. end
  467. end
  468.  
  469. function ENT:LandingGear(b)
  470. if !self.HasGear then return end
  471. if b then
  472. self.GearDown = true
  473. elseif self.GearDown then
  474. self.GearDown = false
  475. end
  476.  
  477. local geardown,t1=self:LookupSequence(self.GearUpAnim)
  478. local gearup,t2=self:LookupSequence(self.GearDownAnim)
  479.  
  480. if !self.disabled then
  481. if b then
  482. self:ResetSequence(gearup)
  483. self:SetPlaybackRate(1.0)
  484. self:SetBodygroup(self.GearBodygroup,1)
  485. for i=1,#self.wheels do
  486. self.wheels[i]:SetRenderMode(RENDERMODE_TRANSALPHA)
  487. self.wheels[i]:SetColor(Color(255,255,255,0))
  488. self.wheels[i]:SetSolid(SOLID_NONE)
  489. end
  490. elseif !b then
  491. self:ResetSequence(geardown)
  492. self:SetPlaybackRate(1.0)
  493. self:SetBodygroup(self.GearBodygroup,0)
  494. for i=1,#self.wheels do
  495. self.wheels[i]:SetRenderMode(RENDERMODE_NORMAL)
  496. self.wheels[i]:SetColor(Color(255,255,255,255))
  497. self.wheels[i]:SetSolid(SOLID_VPHYSICS)
  498. end
  499. end
  500. end
  501. end
  502.  
  503. function ENT:Doors(b)-- true closed, false open
  504. if b then
  505. if self.DoorOpen then return end
  506. self.DoorOpen = true
  507. elseif self.DoorOpen then
  508. self.DoorOpen=false
  509. end
  510. if !self.DoorFlip then
  511. self:SetBodygroup(self.DoorBodygroup, b and 1 or !b and 0)
  512. else
  513. self:SetBodygroup(self.DoorBodygroup, b and 0 or !b and 1)
  514. end
  515. self.DoorIsOpen = !self.DoorIsOpen
  516. end
  517.  
  518. function ENT:fireWeapon1(bool, i)
  519. if !self.Seats[i].weapons then return end
  520. local pod = self.weapons[self.Seats[i].weapons[self.seats[i].activeProfile]]
  521. if !pod then return end
  522. pod.shouldFire = bool
  523. pod:trigger(bool, self.seats[i])
  524. -- self.Entity:SetPoseParameter("minigun_fire", 12)
  525. end
  526.  
  527. function ENT:fireWeapon2(bool, i)
  528. if !self.Seats[i].weapons2 then return end
  529. local pod = self.weapons2[self.Seats[i].weapons2[self.seats[i].activeProfile]]
  530. if !pod then return end
  531. pod.shouldFire = bool
  532. pod:trigger(bool, self.seats[i])
  533. end
  534.  
  535. function ENT:fireCounter(bool, i)
  536. if !self.CounterMeasures then return end
  537. local pod = self.countermeasure
  538. if !pod then return end
  539. pod.shouldFire = bool
  540. pod:trigger(bool, self.seats[1])
  541. end
  542.  
  543. function ENT:nextWeapon(i, p)
  544. if !self.Seats[i].weapons then return end
  545. local seat = self.seats[i]
  546. local Seat = self.Seats[i]
  547.  
  548. local pod = self.weapons[Seat.weapons[seat.activeProfile]]
  549. if pod then
  550. pod:select(false)
  551. pod.seat = nil
  552. end
  553.  
  554. if self.Seats[i].weapons2 then
  555. local pod2 = self.weapons2[Seat.weapons2[seat.activeProfile]]
  556. if pod2 then
  557. pod2:select(false)
  558. pod2.seat = nil
  559. end
  560. end
  561.  
  562. if seat.activeProfile == #Seat.weapons then
  563. seat.activeProfile = 0
  564. else
  565. seat.activeProfile = seat.activeProfile + 1
  566. end
  567. if Seat.weapons[seat.activeProfile] then
  568. local weapon = self.weapons[Seat.weapons[seat.activeProfile]]
  569. weapon:select(true)
  570. weapon.seat = seat
  571. end
  572.  
  573. self:SetNWInt("seat_"..i.."_actwep", seat.activeProfile)
  574. if self.Seats[i].weapons2 then
  575. if Seat.weapons2[seat.activeProfile] then
  576. local weapon = self.weapons2[Seat.weapons2[seat.activeProfile]]
  577. weapon:select(true)
  578. weapon.seat = seat
  579. end
  580. self:SetNWInt("seat_"..i.."_actwep2", seat.activeProfile)
  581. end
  582. end
  583.  
  584. function ENT:EjectPassenger(ply,idx,t)
  585. if !idx then
  586. for k,p in pairs(self.passengers) do
  587. if p==ply then idx=k end
  588. end
  589. if !idx then
  590. return
  591. end
  592. end
  593. ply.LastVehicleEntered = CurTime()+0.5
  594. ply:ExitVehicle()
  595. ply:SetPos(self:LocalToWorld(self.Seats[idx].exit))
  596. ply:SetVelocity(self:GetPhysicsObject():GetVelocity()*1.6)
  597. ply:SetEyeAngles((self:LocalToWorld(self.Seats[idx].pos-Vector(0,0,40))-ply:GetPos()):Angle())
  598. self:updateSeats()
  599. end
  600.  
  601. function ENT:Bail(ply,idx,t)
  602. if !idx then
  603. for k,p in pairs(self.passengers) do
  604. if p==ply then idx=k end
  605. end
  606. if !idx then
  607. return
  608. end
  609. end
  610. ply.LastVehicleEntered = CurTime()+0.5
  611. ply:ExitVehicle()
  612. ply:SetPos(self:LocalToWorld(self.Seats[idx].exit+Vector(0,self.Seats[idx].exit.y*4,256)))
  613. ply:SetVelocity(self:GetPhysicsObject():GetVelocity()*-0.64 +Vector(0,0,1024+self:GetPhysicsObject():GetVelocity().z))
  614. ply:SetEyeAngles((self:LocalToWorld(self.Seats[idx].pos-Vector(0,0,40))-ply:GetPos()):Angle())
  615. self:updateSeats()
  616. end
  617.  
  618. function ENT:Use(act, cal)
  619. if self.disabled then return end
  620. if act.hvap and act.hvap.lastEnter and act.hvap.lastEnter+0.5 > CurTime() then return end
  621. local d = self.MaxEnterDistance
  622. local v
  623. local num
  624. for k, veh in pairs(self.seats) do
  625. if veh and veh:IsValid() then
  626. local psngr = veh:GetPassenger(0)
  627. if !psngr or !psngr:IsValid() then
  628. local dist = veh:GetPos():Distance(util.QuickTrace(act:GetShootPos(),act:GetAimVector()*self.MaxEnterDistance,act).HitPos)
  629. if dist < d then
  630. d = dist
  631. v = veh
  632. num = k
  633. end
  634. end
  635. end
  636. end
  637. act.hvap = act.hvap or {}
  638. act.hvap.lastEnter = CurTime()
  639. if v and num < 3 then
  640. act:EnterVehicle(v)
  641. elseif v and num >= 3 then
  642. if self.DoorIsOpen then
  643. act:EnterVehicle(v)
  644. else
  645. sound.Play( "HVAP.Gun.Misc.NoSecondary", act:GetPos() )
  646. end
  647. end
  648. self:updateSeats()
  649. end
  650.  
  651. function ENT:updateSeats()
  652. for k, veh in pairs(self.seats) do
  653. if !veh:IsValid() then return end
  654. local p = veh:GetPassenger(0)
  655. if self.passengers[k] != p then
  656. if IsValid(self.passengers[k]) then
  657. self.passengers[k]:SetNWEntity("hvap_aircraft", NULL)
  658. end
  659. self:SetNWEntity("passenger_"..k, p)
  660. self.passengers[k] = p
  661. if IsValid(p) then
  662. p:SetNWInt("hvap_passenger_id",k)
  663. p.hvap = p.hvap or {}
  664. p.hvap.mouseInput = true
  665. p.hvap.viewAngs = Angle()
  666. net.Start("hvap.aircraft.updateWeapons")
  667. net.WriteEntity(self)
  668. net.WriteInt(table.Count(self.weapons), 5)
  669. for name, weapon in pairs(self.weapons) do
  670. net.WriteString(name)
  671. net.WriteEntity(weapon)
  672. end
  673.  
  674. net.WriteInt(table.Count(self.weapons2), 5)
  675. for name, weapon2 in pairs(self.weapons2) do
  676. net.WriteString(name)
  677. net.WriteEntity(weapon2)
  678. end
  679.  
  680. net.Send(p)
  681. end
  682.  
  683. end
  684. end
  685. if !IsValid(self.seats[1]:GetDriver()) then
  686. self.controls = {
  687. throttle = 0,
  688. pitch = 0,
  689. yaw = 0,
  690. roll = 0,
  691. }
  692. self.IncrementalThr = 0
  693. self.ThrSensitivity = 0
  694. self.AutoLevel = 1
  695. else
  696. self.IncrementalThr = self.seats[1]:GetDriver():GetInfoNum("hvap_cl_air_incthr", 0)
  697. self.AutoLevel = self.seats[1]:GetDriver():GetInfoNum("hvap_cl_air_autolevel", 1)
  698. self.ThrSensitivity = self.seats[1]:GetDriver():GetInfoNum("hvap_cl_air_throttle_sensitivity", 5)
  699. end
  700. self:GetSwitcher():updateSeats()
  701. end
  702.  
  703. function ENT:StopAllSounds()
  704. for k, s in pairs(self.sounds) do
  705. if s:IsPlaying() then
  706. s:Stop()
  707. end
  708. end
  709. end
  710.  
  711. function ENT:RocketAlert()
  712. if self.active and !self.disabled and !self.Unbreakable then
  713. local b=false
  714. local rockets = ents.FindByClass("hvap_bullet_rocket2")
  715. for _, e in pairs(rockets) do
  716. if e:GetPos():Distance(self:GetPos()) < 7680 and e.target == self then b = true break end
  717. end
  718. if self.sounds.MissileAlert:IsPlaying() then
  719. if !b then
  720. self.sounds.MissileAlert:Stop()
  721. self.Targeted = false
  722. end
  723. elseif b then
  724. self.sounds.MissileAlert:Play()
  725. self.Targeted = true
  726. end
  727. end
  728. end
  729.  
  730. function ENT:calcAerodynamics(ph)
  731. local dvel = self:GetVelocity():Length()
  732. local lvel = self:WorldToLocal(self:GetPos() + self:GetVelocity())
  733. local targetVelocity = (
  734. - self:LocalToWorld(self.Aerodynamics.Rail * lvel * dvel * dvel / 1000000000) + self:GetPos()
  735. + self:LocalToWorld(
  736. self.Aerodynamics.Movement.Forwards * lvel.x * dvel / 10000000 +
  737. self.Aerodynamics.Movement.Right * Vector(math.abs(lvel.y),lvel.y,lvel.y) * dvel / 10000000 +
  738. self.Aerodynamics.Movement.Up * lvel.z * dvel / 10000000
  739. ) - self:GetPos()
  740. )
  741.  
  742. local targetAngVel =
  743. (
  744. lvel.x*self.Aerodynamics.Rotation.Forwards +
  745. lvel.y*self.Aerodynamics.Rotation.Right +
  746. lvel.z*self.Aerodynamics.Rotation.Up
  747. ) / 10000 - ph:GetAngleVelocity()*self.Aerodynamics.AngleDrag
  748.  
  749. return targetVelocity, targetAngVel
  750. end
  751.  
  752. function ENT:Think()
  753. local crt = CurTime()
  754. local frt = FrameTime()
  755. ------------------------------------------------------------------------------------------------coop brings all engines to one rotor, separate brings engine to rotor
  756. local rpm = 0
  757. local power = 0
  758. local rotrpm = 0
  759. local rotcap = 0
  760. local ehealth = 0
  761. local vel = self.phys:GetVelocity()
  762. -- local spd = math.Round(vel:Length()*0.068796244/2,1)
  763. local pos = self:GetPos()
  764. local ang = self:GetAngles()
  765.  
  766. if self.CoopEngines then -----coop calc engines to rotors
  767. for i = 1, self.NumEngines do
  768. rpm = rpm + self.engines[i].RPMSCL
  769. power = power + self.engines[i].enginePower
  770. end
  771. self.EnginesRPM = rpm/self.NumEngines
  772. self.EnginePower = power
  773. if !self.rotors[1].Disabled then
  774. self.rotors[1].EngRpm = self.EnginesRPM
  775. self.rotorRpm = self.rotors[1].rotorRPM
  776. else
  777. self.rotorRpm = 0
  778. end
  779. else ------separate calc engine to rotor assuming 1 engine per rotor
  780. for i = 1, self.NumEngines do
  781. rpm = rpm + self.engines[i].RPMSCL
  782. power = power + self.engines[i].enginePower
  783. end
  784. self.EnginesRPM = rpm/self.NumEngines
  785. self.EnginePower = power
  786. for i = 1, self.NumEngines do
  787. if !self.rotors[i].Disabled then
  788. self.rotors[i].EngRpm = self.engines[i].RPMSCL
  789. end
  790. end
  791. for i = 1, self.NumEngines do
  792. if !self.rotors[i].Disabled then
  793. rotrpm = rotrpm + self.rotors[i].rotorRPM
  794. end
  795. end
  796. self.rotorRpm = rotrpm/self.NumRotors
  797. end
  798. ------------------------------------------------------------------------------------------------throttle calc
  799. self.Hover = self:calcHover(self.phys,pos,vel,ang)
  800. self.Autolvl = self:autoLevelCalc(self.phys,pos,vel,ang)
  801.  
  802. self.Roll = self.Hover.r+self.Autolvl.r
  803. self.Pitch = self.Hover.p+self.Autolvl.p
  804. self.Yaw = math.Clamp(self.Yaw - (self.Yaw - math.abs(self.controls.yaw))/20,0,1)
  805.  
  806. local thr = math.Clamp(self.Hover.t+self.Autolvl.t, -1, 1)
  807.  
  808. if self.IncrementalThr == 1 then
  809. self.Throttle = math.Clamp(self.Throttle+(self.controls.throttle*self.ThrSensitivity/256)+thr, -1, 1)
  810. elseif self.IncrementalThr == 0 then
  811. self.SmoothThrottle = math.Clamp(self.SmoothThrottle - (self.SmoothThrottle - math.pow( math.abs(self.controls.throttle), 10 ))/50,0,1)
  812. self.Throttle = math.Clamp(self.SmoothThrottle*self.controls.throttle+thr, -1, 1)
  813. end
  814. ------------------------------------------------------------------------------------------------fuelcalc
  815. if self.EnableFuel then
  816. local mul = (hvap.aircraft.cvars.fuelconsumptionmult:GetFloat()*self.FuelConMult*frt)/25
  817. local subval = 0
  818. for k, v in pairs(self.engines) do
  819. subval = (subval + v.FuelSub)
  820. end
  821. if subval < math.huge then
  822. self.Fuel = math.Clamp(self.Fuel - (subval + (self.active and (math.abs(self.Throttle) + ((1-self.FSCL)*math.random(0.01,0.5))) or 0) )*mul, 0, self.BaseFuel)
  823. end
  824. self.FuelScl = self.Fuel/self.BaseFuel
  825.  
  826. if self.active and self.EnableFuel then
  827. if self.FuelScl <= 0.15 or self.FSCL <= 0.15 then
  828. if math.random(0,512) == 256 then
  829. self.active = false
  830. end
  831. end
  832. end
  833.  
  834. if self.active and self.FuelScl <= 0 then
  835. self.active = false
  836. end
  837.  
  838. if self.Refueling then
  839. if !self.sounds.Refuel:IsPlaying() then
  840. self.sounds.Refuel:PlayEx(1,80+self.FuelScl*25)
  841. else
  842. self.sounds.Refuel:ChangePitch(80+self.FuelScl*25,0.1)
  843. end
  844. else
  845. if self.sounds.Refuel:IsPlaying() then
  846. self.sounds.Refuel:Stop()
  847. end
  848. end
  849.  
  850. end
  851. ------------------------------------------------------------------------------------------------engine health calc
  852. for i = 1, self.NumEngines do
  853. ehealth = ehealth + self.engines[i].engineHealth
  854. end
  855. self.EnginesHealth = ehealth/self.EnginesMaxHealth
  856. ------------------------------------------------------------------------------------------------
  857. self.FSCL = math.Clamp(self.FuselageHealth/self.FuselageBaseHealth,0,1)
  858. ------------------------------------------------------------------------------------------------
  859. if self.nextUpdate<crt then
  860. self:RocketAlert()
  861.  
  862. self.Refueling = false
  863. self.nextUpdate = crt+0.2
  864.  
  865. if self.FuselageHealth > 0 then
  866. local tr=util.QuickTrace(pos,Vector(0,0,-999999),self.Entity)
  867. self.ALT = pos.z-tr.HitPos.z
  868. end
  869.  
  870. if self:WaterLevel() > 0 and self.waterDamage > 0 then
  871. self:DamageFuselage(self:WaterLevel()*self.waterDamage)
  872. end
  873.  
  874. if self.active and self.EnableFuel then
  875. if self.FuelScl <= 0.15 or self.FSCL <= 0.15 then
  876. if math.random(0,512) == 256 then
  877. self.active = false
  878. end
  879. end
  880. if self.FuelScl <= 0 then
  881. self.active = false
  882. end
  883. end
  884.  
  885. if self.skin != self:GetSkin() then
  886. self.skin = self:GetSkin()
  887. self:updateSkin(self.skin)
  888. end
  889.  
  890. end
  891. ------------------------------------------------------------------------------------------------
  892. if self.CvarTick<crt then
  893. self.CvarTick = crt+4
  894. self.StartSpd = hvap.aircraft.cvars.startSpeed:GetFloat()
  895. self.EnableFuel = tobool(hvap.aircraft.cvars.fuelenable:GetInt())
  896. self.FuelConMultCvar = hvap.aircraft.cvars.fuelconsumptionmult:GetFloat()
  897. self.SpeedMult = hvap.aircraft.cvars.speedMult:GetInt()
  898. self.PilotDamageCvar = hvap.aircraft.cvars.noplayerdamage:GetInt()
  899. self.waterDamage = hvap.aircraft.cvars.waterDamage:GetInt()
  900. end
  901. ------------------------------------------------------------------------------------------------
  902. if !self.dead and self.FSCL == 0 then
  903. if hvap.aircraft.cvars.kickdeath:GetInt() == 1 then
  904. for i = 1, #self.seats do
  905. if self.passengers[i]:IsValid() then
  906. self:Bail(self.passengers[i])
  907. end
  908. end
  909. end
  910. local effectdata = EffectData()
  911. effectdata:SetOrigin(self.Entity:GetPos())
  912. effectdata:SetScale((self.FuselageBaseHealth/self.FuselageHPMult)/50)
  913. util.Effect("hvap_explode", effectdata)
  914. util.BlastDamage(self.Entity, self.Entity, self:GetPos(), (self.FuselageBaseHealth/self.FuselageHPMult)/5, self.BBoxRadius)
  915. self.dead = true
  916. self.active = false
  917. end
  918. ------------------------------------------------------------------------------------------------
  919. if self.CriticalDeath then
  920. local effectdata = EffectData()
  921. effectdata:SetOrigin(self.Entity:GetPos())
  922. effectdata:SetScale(self.FuselageBaseHealth/32)
  923. util.Effect("hvap_explode", effectdata)
  924. util.BlastDamage(self.Entity, self.Entity, self:GetPos(), (self.FuselageBaseHealth/self.FuselageHPMult)/5, self.BBoxRadius)
  925. self:MakeGibs()
  926. self:Remove()
  927. end
  928. ------------------------------------------------------------------------------------------------
  929. if self.skin != self:GetSkin() then
  930. self.skin = self:GetSkin()
  931. self:updateSkin(self.skin)
  932. end
  933. ------------------------------------------------------------------------------------------------
  934. self:updateSeats()
  935. self:TurretThink()
  936. self:SecondaryThink(crt)
  937. self:setVar("on", self.active, true)
  938. self:setVar("Targeted", self.Targeted, true)
  939. self:setVar("up", self.Throttle)
  940. self:setVar("rotorRpm", self.rotorRpm)
  941. self:setVar("engineRpm", self.EnginesRPM)
  942. self:setVar("ehp", self.EnginesHealth)
  943. self:setVar("fhp", self.FSCL)
  944. self:setVar("fuel", self.FuelScl)
  945. self:NextThink(crt)
  946. return true
  947. end
  948.  
  949. function ENT:SecondaryThink(crt)
  950.  
  951. end
  952.  
  953. function ENT:TurretThink()
  954. if !self.Turrets or !self.turrets then return end
  955. for k, v in pairs(self.turrets) do
  956. local tr = self:GetViewTarget(v.info)
  957. if tr then
  958.  
  959. for key, value in pairs(v) do
  960. if key != "info" then
  961. for _, t in pairs(value) do
  962. if IsValid(t) then
  963. local viewAng = ( tr.HitPos - t:GetPos() ):Angle()
  964. viewAng:Normalize()
  965.  
  966. local clampAng = Angle(
  967. t.pitch and viewAng.p or 0,
  968. t.yaw and viewAng.y or 0,
  969. viewAng.r
  970. )
  971.  
  972. local setangles = LerpAngle( self.RotSPD, t:GetAngles(), clampAng )
  973.  
  974. t:SetAngles( setangles )
  975.  
  976. if t.localto and t.offset then
  977. local localtoent = self.turrets[k][key][t.localto]
  978. t:SetPos(localtoent:LocalToWorld(t.offset))
  979. end
  980. end
  981. end
  982. end
  983. end
  984.  
  985. end
  986. end
  987. end
  988.  
  989. function ENT:setVar(name, var, b)
  990. if b then
  991. if self:GetNWBool(name) != var then
  992. self:SetNWBool(name, var)
  993. end
  994. else
  995. if self:GetNWFloat(name) != var then
  996. self:SetNWFloat(name, var)
  997. end
  998. end
  999. end
  1000.  
  1001. function ENT:receiveInput(name, value, seat)--CONTROLS
  1002. if seat == 1 then
  1003. if name == "Start" and value>0.5 then
  1004. self:setEngine(!self.active)
  1005. elseif name == "Throttle" then
  1006. self.controls.throttle = value or 0
  1007. elseif name == "Pitch" then
  1008. self.controls.pitch = value or 0
  1009. elseif name == "Yaw" then
  1010. self.controls.yaw = value or 0
  1011. elseif name == "Roll" then
  1012. self.controls.roll = value or 0
  1013. elseif name == "Hover" and value>0.5 then
  1014. self:SetHover(!self:GetHover())
  1015. elseif name == "FreeView" then
  1016. self.passengers[seat].hvap.mouseInput = (value < 0.5)
  1017. elseif name == "CounterMeasure" then
  1018. self:fireCounter(value > 0.5)
  1019. elseif name == "Doors" and value>0.5 and self.HasDoors then
  1020. self:Doors(!self.DoorOpen)
  1021. elseif name == "Gear" and value>0.5 and self.HasGear then
  1022. self:LandingGear(!self.GearDown)
  1023. end
  1024. end
  1025.  
  1026. if name == "Exit" and value>0.5 and self.passengers[seat].hvap.lastEnter<CurTime()-0.5 then
  1027. self:EjectPassenger(self.passengers[seat])
  1028. elseif name == "Bail" and value>0.5 and self.passengers[seat].hvap.lastEnter<CurTime()-0.5 then
  1029. self:Bail(self.passengers[seat])
  1030. elseif name == "FirstFire" then
  1031. self:fireWeapon1(value > 0.5, seat)
  1032. elseif name == "SecondFire" then
  1033. self:fireWeapon2(value > 0.5, seat)
  1034. elseif name == "NextWeapon" and value > 0.5 then
  1035. self:nextWeapon(seat, self.passengers[seat])
  1036. elseif name == "Function1" and value>0.5 then
  1037. self:Function1(seat)
  1038. elseif name == "Function2" and value>0.5 then
  1039. self:Function2(seat)
  1040. elseif name == "Function3" and value>0.5 then
  1041. self:Function3(seat)
  1042. elseif name == "FirstMenu" and value>0.5 then
  1043. self:FirstMenu(seat)
  1044. elseif name == "SecondMenu" and value>0.5 then
  1045. self:SecondMenu(seat)
  1046. elseif name == "Hover" and value>0.5 and seat != 1 then
  1047. self:HoverFunction(seat)
  1048. end
  1049. end
  1050.  
  1051. function ENT:Function1(k)
  1052.  
  1053. end
  1054.  
  1055. function ENT:Function2(k)
  1056.  
  1057. end
  1058.  
  1059. function ENT:Function3(k)
  1060.  
  1061. end
  1062.  
  1063. function ENT:FirstMenu(k)
  1064.  
  1065. end
  1066.  
  1067. function ENT:SecondMenu(k)
  1068.  
  1069. end
  1070.  
  1071. function ENT:HoverFunction(k)
  1072.  
  1073. end
  1074.  
  1075. function ENT:GetSeat(player)
  1076. for i, p in pairs(self.passengers) do
  1077. if p == player then
  1078. return self.seats[i]
  1079. end
  1080. end
  1081. end
  1082.  
  1083. function ENT:setEngine(b)
  1084. if self.disabled or self.FuelScl == 0 then b = false end
  1085. if b then
  1086. if self.active then return end
  1087. self.active = true
  1088. elseif self.active then
  1089. self.active=false
  1090. end
  1091. self:SetNWBool("active", self.active)
  1092. end
  1093.  
  1094. function ENT:calcHover(ph,pos,vel,ang)
  1095. if self:GetHover() and !self.spinout and !self.disabled then
  1096. local v=self:WorldToLocal(pos+vel)
  1097. local av=ph:GetAngleVelocity()
  1098.  
  1099. if math.abs(self.controls.pitch) >= 0.1 then
  1100. pitch = 0
  1101. else
  1102. pitch = math.Clamp(-ang.p*0.64-av.y*0.64-v.x*0.064,-06465,0.64)
  1103. end
  1104. if math.abs(self.controls.roll) >= 0.1 then
  1105. roll = 0
  1106. else
  1107. roll = math.Clamp(-ang.r*0.64-av.x*0.64+v.y*0.064,-0.64,0.64)
  1108. end
  1109. if math.abs(self.controls.throttle) >= 0.1 then
  1110. throttle = 0
  1111. else
  1112. throttle = math.Clamp(-v.z*0.128+av:Length()*0.064, -0.1, 1)
  1113. end
  1114.  
  1115. return{p=pitch,r=roll,t=throttle}
  1116. else
  1117. return {p=0,r=0,t=0}
  1118. end
  1119. end
  1120.  
  1121. function ENT:autoLevelCalc(ph,pos,vel,ang)
  1122. if self.AutoLevel == 1 and !self:GetHover() and !self.spinout and !self.disabled and #self.passengers > 0 then
  1123. local v=self:WorldToLocal(pos+vel)
  1124. local av=ph:GetAngleVelocity()
  1125.  
  1126. if math.abs(self.controls.pitch) >= 0.1 then
  1127. pitch = 0
  1128. else
  1129. pitch = math.Clamp(-ang.p*0.128-av.y-v.x*0.005, -0.128, 0.128)
  1130. end
  1131. if math.abs(self.controls.roll) >= 0.1 then
  1132. roll = 0
  1133. else
  1134. roll = math.Clamp(-ang.r*0.128-av.x+v.y*0.015, -0.128, 0.128)
  1135. end
  1136. if math.abs(self.controls.throttle) >= 0.1 then
  1137. throttle = 0
  1138. else
  1139. throttle = math.Clamp(-v.z*0.128+av:Length()*0.032, -1, 1)
  1140. end
  1141.  
  1142. return{p=pitch,r=roll,t=throttle}
  1143. else
  1144. return {p=0,r=0,t=0}
  1145. end
  1146. end
  1147.  
  1148. function ENT:PhysicsUpdate(ph)
  1149. local vel = ph:GetVelocity()
  1150. local vell = math.Round(vel:Length()*0.068796244/2,1)
  1151. local pos = self:GetPos()
  1152. local ang = self:GetAngles()
  1153. local lvel = self:WorldToLocal(pos+vel)
  1154. local up = self:GetUp()
  1155. local phm = FrameTime()*66
  1156. local spinout = Vector(0,0,0)
  1157. local spinoutv = Vector(0,0,0)
  1158.  
  1159. local rot = Vector (
  1160. math.Clamp((self.controls.roll +self.Roll )*self.rotorRpm, -1.28,1.28),
  1161. math.Clamp((self.controls.pitch +self.Pitch )*self.rotorRpm, -1.28,1.28),
  1162. math.Clamp((self.controls.yaw *math.pow(self.Yaw, 0.5 ))*self.rotorRpm, -1.28,1.28)
  1163. )
  1164. local throttle = self:GetUp()*((self.Throttle*(self.rotorRpm+0.01))*((self.EnginePower)/300)+self.rotorRpm*(9+self.controls.throttle))
  1165. local brakez = self:LocalToWorld(Vector(0, 0, lvel.z*vel:Length()*self.rotorRpm/100000*self.Aerodynamics.RailRotor)) - pos
  1166.  
  1167. if self.CoopEngines then
  1168. if self.rotors[1].Disabled and !self.disabled and self.active or self.RearRotor.Disabled and !self.disabled and self.active then
  1169. spinout = Vector(math.Rand(-4,4)*self.rotorRpm,math.Rand(-4,4)*self.rotorRpm,math.random(4,12)*self.rotorRpm)
  1170. spinoutv = Vector(math.random(-6,6),math.random(-6,6),-1*(math.random(2,4)*up:Length()))
  1171. self.spinout = true
  1172. end
  1173. else
  1174. for i = 1, self.NumRotors do
  1175. if self.rotors[i].Disabled and self.active and !self.disabled and self.active or self.engines[i].engineRpm == 0 and self.active and !self.disabled and self.active then
  1176. spinout = Vector(math.Rand(-4,4)*self.rotorRpm,math.Rand(-4,4)*self.rotorRpm,math.random(4,12)*self.rotorRpm)
  1177. spinoutv = Vector(math.random(-6,6),math.random(-6,6),-1*(math.random(2,4)*up:Length()))
  1178. self.spinout = true
  1179. end
  1180. end
  1181. end
  1182.  
  1183. util.ScreenShake( pos, math.Clamp((vell-30)/16,0,5)*(math.Clamp((rot:Length()-1.128),0,1)/10), 200, 1.6, self.BBoxRadius )
  1184.  
  1185. local controlAng = (rot*1.6+spinout)*self.Aerodynamics.Rotate
  1186. local aeroVelocity, aeroAng = self:calcAerodynamics(ph)
  1187. ph:AddVelocity(((throttle-brakez)+aeroVelocity+spinoutv)*phm)
  1188. ph:AddAngleVelocity((aeroAng + controlAng)*phm)
  1189.  
  1190. if self.Wheels then
  1191. for k,v in pairs(self.wheels) do
  1192. if IsValid(v) then
  1193. local phy = v:GetPhysicsObject()
  1194. phy:AddVelocity(((throttle-brakez)+aeroVelocity+spinoutv)*phm*0.9)
  1195. phy:AddAngleVelocity((aeroAng + controlAng)*phm*0.8)
  1196. end
  1197. end
  1198. end
  1199.  
  1200. end
  1201.  
  1202. function ENT:Rearm(amt, b, phy, rkt)
  1203. if b then
  1204. if self.Weapons2 then
  1205. for k, v in pairs(self.weapons2) do
  1206. if !v.DisableRearm and v:GetAmmo() < v.Ammo then
  1207. v:takeAmmo( -v.ReloadAmt*amt )
  1208. sound.Play( "HVAP.Reload.Pickup", self:GetPos() )
  1209. end
  1210. if phy and v.PhysOrd then
  1211. if v.Rocket == rkt then
  1212. v:ReloadBombs(amt)
  1213. end
  1214. end
  1215. end
  1216. end
  1217. if self.Weapons then
  1218. for k, v in pairs(self.weapons) do
  1219. if !v.DisableRearm and v:GetAmmo() < v.Ammo then
  1220. v:takeAmmo( -v.ReloadAmt*amt )
  1221. sound.Play( "HVAP.Reload.Pickup", self:GetPos() )
  1222. end
  1223. end
  1224. if phy and v.PhysOrd then
  1225. if v.Rocket == rkt then
  1226. v:ReloadBombs(amt)
  1227. end
  1228. end
  1229. end
  1230. else
  1231. if self.Weapons2 then
  1232. for k, v in pairs(self.weapons2) do
  1233. if !v.DisableRearm and v:GetAmmo() != v.Ammo then
  1234. v:SetAmmo(v.Ammo)
  1235. end
  1236. end
  1237. end
  1238. if self.Weapons then
  1239. for k, v in pairs(self.weapons) do
  1240. if !v.DisableRearm and v:GetAmmo() != v.Ammo then
  1241. v:SetAmmo(v.Ammo)
  1242. end
  1243. end
  1244. end
  1245. end
  1246. end
  1247.  
  1248. function ENT:Refuel(amt, b)
  1249. if self.Fuel != self.BaseFuel then
  1250. self.Fuel = math.Clamp( self.Fuel+amt, 0,self.BaseFuel)
  1251. if b then
  1252. self.Refueling = true
  1253. else
  1254. self.Refueling = false
  1255. end
  1256. end
  1257. end
  1258.  
  1259. function ENT:Repair(amt, b, c)
  1260. if b then
  1261. if self.FuselageHealth < self.FuselageBaseHealth then
  1262. self.FuselageHealth = math.Clamp(self.FuselageHealth + amt, 0, self.FuselageBaseHealth )
  1263. sound.Play( "HVAP.Misc.Repair.Small", self:GetPos() )
  1264. end
  1265. if self.disabled then
  1266. self.disabled = false
  1267. end
  1268. if self.dead then
  1269. self.dead = false
  1270. end
  1271. if c then
  1272. if self.FSCL >= 0.99 then
  1273. for k, v in pairs(self.rotors) do
  1274. if amt == 1 and !v.Disabed then
  1275. v:ResetRot()
  1276. else
  1277. v:Repair(amt, b, c)
  1278. end
  1279. end
  1280. end
  1281. for k, v in pairs(self.engines) do
  1282. if v:IsValid() then
  1283. v:Repair(amt, b, c)
  1284. end
  1285. end
  1286. end
  1287. else
  1288. for k, v in pairs(self.rotors) do
  1289. if amt == 1 and !v.Disabed then
  1290. v:ResetRot()
  1291. else
  1292. v:Repair(amt)
  1293. end
  1294. end
  1295. for k, v in pairs(self.engines) do
  1296. if v:IsValid() then
  1297. v:Repair(amt)
  1298. end
  1299. end
  1300. if self.FuselageHealth < self.FuselageBaseHealth then
  1301. self.FuselageHealth = math.Clamp(self.FuselageHealth + self.FuselageBaseHealth/amt, self.FuselageBaseHealth/amt, self.FuselageBaseHealth )
  1302. end
  1303. if self.disabled then
  1304. self.disabled = false
  1305. end
  1306. if self.dead then
  1307. self.dead = false
  1308. end
  1309. end
  1310. end
  1311.  
  1312. function ENT:PhysicsCollide(cdat, phys)
  1313. if cdat.DeltaTime > 0.5 then
  1314. local mass = cdat.HitObject:GetMass()
  1315. if cdat.HitEntity:GetClass() == "worldspawn" then
  1316. mass = 3200
  1317. end
  1318. local dmg = (math.pow(cdat.Speed, 2)*math.Clamp(mass, 0, 5000))/10000000
  1319.  
  1320. if !dmg or dmg <= 32 then return end
  1321.  
  1322. local lasta=(self.LastDamageTaken<CurTime()+6 and self.LastAttacker or self.Entity)
  1323. for k, p in pairs(self.passengers) do
  1324. if p and p:IsValid() then
  1325. p:TakeDamage(dmg/16, lasta, self.Entity)
  1326. end
  1327. end
  1328. for i = 1, self.NumEngines do
  1329. self.engines[i]:DamageEngine(dmg)
  1330. end
  1331. self:DamageFuselage(dmg, lasta)
  1332. sound.Play( "HVAP.Vehicle.Collide", self:GetPos() )
  1333.  
  1334. end
  1335. end
  1336.  
  1337. function ENT:OnTakeDamage(dmg)
  1338. if self.Unbreakable then return end
  1339. local crt = CurTime()
  1340. self.LastAttacker=dmg:GetAttacker()
  1341. self.LastDamageTaken=crt
  1342.  
  1343. if !dmg:IsExplosionDamage() then
  1344. dmg:ScaleDamage(10)
  1345. end
  1346.  
  1347. local pos=self:WorldToLocal(dmg:GetDamagePosition())
  1348. local dmgVal = dmg:GetDamage()
  1349. local driver = self:getPassenger()
  1350. local lasta=(self.LastDamageTaken<crt+6 and self.LastAttacker or self.Entity)
  1351. -------------------------engine damage
  1352. for k, v in pairs(self.engines) do
  1353. if v:IsValid() then
  1354. local dist = pos:Distance(self.Engines[k].pos)/(dmg:IsExplosionDamage() and 24 or 1)
  1355. local edmg = dmgVal/dist
  1356. if dist <= self.Engines[k].radius*1.128 then
  1357. v:DamageEngine(edmg/2)
  1358. end
  1359. end
  1360. end
  1361. -------------------------rotor damage
  1362. for k, v in pairs(self.rotors) do
  1363. if v:IsValid() then
  1364. local dist = pos:Distance(self.Rotors[k].pos)
  1365. if dist < 16 then
  1366. local rdmg = math.Clamp((dmgVal/dist),1,24)
  1367. v:DamageRotor(rdmg/4)
  1368. end
  1369. end
  1370. end
  1371. -------------------------pilot snipe calc
  1372. if self.PilotDamageCvar != 1 then
  1373. for k, p in pairs(self.passengers) do
  1374. local dist = pos:Distance(self.Seats[k].pos)
  1375. if p and p:IsValid() and dist<=(self.PlyDmgDist*1.92) then
  1376. local pdmg = ((dmgVal/dist)*self.PlyDmgMult) / (dmg:IsExplosionDamage() and 2 or 1)
  1377. p:TakeDamage(pdmg*0.4, lasta, self.Entity)
  1378. end
  1379. end
  1380. end
  1381. self:DamageFuselage(dmgVal/(dmg:IsExplosionDamage() and 2 or 16), lasta)
  1382. end
  1383.  
  1384. function ENT:DamageFuselage(dmg, lasta)
  1385. if self.Unbreakable then return end
  1386. local crt = CurTime()
  1387.  
  1388. self.FuselageHealth = math.Clamp(self.FuselageHealth - dmg, 0, self.FuselageBaseHealth)
  1389.  
  1390. if dmg > 0.01 then
  1391. util.ScreenShake( self:GetPos(), dmg/10, 200, 1.6, self.BBoxRadius*2 )
  1392. end
  1393.  
  1394. if !self.disabled then
  1395. if dmg > 0.01 then
  1396. if self.FSCL > 0.60 and crt>self.LastDamageTaken+0.28 then
  1397. sound.Play( self.Sounds.Damaged, self:GetPos() )
  1398. elseif self.FSCL > 0.40 and crt>self.LastDamageTaken+0.4 then
  1399. sound.Play( self.Sounds.Alarm75, self:GetPos() )
  1400. elseif self.FSCL > 0.20 and crt>self.LastDamageTaken+0.5 then
  1401. sound.Play( self.Sounds.Alarm50, self:GetPos() )
  1402. elseif self.FSCL > 0.20 and crt>self.LastDamageTaken+0.6 then
  1403. sound.Play( self.Sounds.Alarm25, self:GetPos() )
  1404. end
  1405. end
  1406. if self.FuselageHealth == 0 then
  1407. for i = 1, self.NumEngines do
  1408. self.engines[i]:DamageEngine(10000)
  1409. end
  1410. self.disabled = true
  1411. end
  1412. elseif self.dead and !self.CriticalDeath then
  1413. self.CriticalHealth = math.Clamp( self.CriticalHealth - dmg, 0, self.CriticalBaseHealth )
  1414. if self.CriticalHealth == 0 then
  1415. self.CriticalDeath = true
  1416. end
  1417. end
  1418. end
  1419.  
  1420. function ENT:CPPIGetOwner()
  1421. return self.SpawnedBy
  1422. end
  1423.  
  1424. function ENT:AddOnRemove(f)
  1425. if type(f)=="function" then
  1426. table.insert(self.OnRemoveFunctions,f)
  1427. elseif type(f)=="Entity" or type(f)=="Vehicle" then
  1428. table.insert(self.OnRemoveEntities,f)
  1429. end
  1430. end
  1431.  
  1432. function ENT:OnRemove()
  1433. self:StopAllSounds()
  1434. for _,p in pairs(self.passengers) do
  1435. if IsValid(p) then
  1436. p:SetNWInt("hvap_passenger_id",0)
  1437. end
  1438. end
  1439. for _,f in pairs(self.OnRemoveFunctions) do
  1440. f()
  1441. end
  1442. for _,e in pairs(self.OnRemoveEntities) do
  1443. if IsValid(e) then e:Remove() end
  1444. end
  1445. for _,e in pairs(self.Children) do
  1446. if IsValid(e) then e:Remove() end
  1447. end
  1448. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement