Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @name Standalone Jet HUD
- @inputs [Active]:number [Chair Base]:entity [EGP]:wirelink
- @outputs [Ops Us]:number [Angles]:angle
- @persist [SimplifiedMode RadarAngle RadarDistance MaxFoes PrevFoes N GroundAlt HUDHeading HUDKnots HUDAlt HUDMach HUDAlpha HUDGForce]:number
- @persist [Velocity AnglesX Altitude GForce IsTracking]:number [Angles]:angle
- @persist [Color]:vector4 [Driver]:entity [Chairs Foes Filter LaddersL LaddersR FoeDisplays FoeTrackers]:array
- #Ops = floor(ops())
- #Us = floor(cpuUsage() * 1000000)
- if (first() | dupefinished())
- {
- SimplifiedMode = 0 #Set this to 1 in case your computer starts dying. Disables the elevation ladder.
- RadarDistance = 15000
- RadarAngle = 20
- Color = vec4(20, 200, 20, 255)
- MaxFoes = 6
- #--------------------------
- findIncludePlayerProps(owner())
- findInSphere(Base:pos(), 1000)
- Filter = findToArray()
- findClearWhiteList()
- findExcludeEntities(Filter)
- findIncludeClass("prop_vehicle_prisoner_pod")
- rangerPersist(1)
- rangerFilter(Filter)
- R = rangerOffset(Base:pos(), Base:toWorld(vec(0, 0, -999999)))
- GroundAlt = R:position()[3]
- #1 = Base aimer holo
- #2 = Elevation ladder holo
- #(3 - 8) = Homing targets
- for (I = 1, 2 + MaxFoes) { holoCreate(I, vec(), vec()) }
- holoPos(1, Base:toWorld(vec(5000, 0, 0)))
- holoParent(1, Base)
- holoPos(2, Base:toWorld(vec()))
- holoAng(2, Base:toWorld(ang()))
- holoParent(2, Base)
- function trackingSound()
- {
- if (IsTracking & !Foes:count())
- {
- IsTracking = 0
- soundStop(1)
- }
- elseif (!IsTracking & Foes:count())
- {
- IsTracking = 1
- Chair:soundPlay(1, 0, "acf_extra/airfx/radar_track.wav")
- }
- }
- function drawMarkers()
- {
- local Count = Foes:count()
- if (!Count & !PrevFoes) { return }
- elseif (Count != PrevFoes)
- {
- local Cond = Count > PrevFoes
- local From = Cond ? PrevFoes : Count
- local To = Cond ? Count : PrevFoes
- local Alpha = 255 * Cond
- for (I = From, To)
- {
- local ID = FoeDisplays[I, number]
- EGP:egpAlpha(ID, Alpha)
- }
- }
- foreach (K:number, V:entity = Foes)
- {
- local ID = FoeTrackers[K, number]
- EGP:egpParent(ID, V)
- if (K == MaxFoes) { break }
- }
- }
- function getPilotedChairs()
- {
- PrevFoes = Foes:count()
- Foes = array()
- if (Chairs:count())
- {
- local N = 0
- foreach (K, V:entity = Chairs)
- {
- if (V:driver()) { N++ Foes[N, entity] = V }
- }
- }
- drawMarkers()
- trackingSound()
- }
- function coneRadarFind()
- {
- if (!Active | !findCanQuery()) { return }
- local Position = Base:pos()
- findInCone(Position, Base:forward(), RadarDistance, RadarAngle)
- findSortByDistance(Position)
- Chairs = findToArray()
- getPilotedChairs()
- timer("Radar", 1000)
- }
- function updateLadderDegrees()
- {
- if (SimplifiedMode) { return }
- for (I = 1, 4)
- {
- local Left = LaddersL[I, number]
- local Right = LaddersR[I, number]
- local Angle = AnglesX + 5 * (I - 2)
- local Number = ""+Angle
- if (Angle == 0) { Number = "" }
- elseif (Angle > 90) { Number = ""+(90*2-Angle) }
- elseif (Angle < -90) { Number = ""+(-90*2-Angle) }
- EGP:egpSetText(Left, Number)
- EGP:egpSetText(Right, Number)
- }
- }
- function number getWingSweepAngle(Mach, MinMach, MaxMach)
- {
- return Mach <= MinMach ? 20 : Mach >= MaxMach ? 68 : 20 + 80 * Mach
- }
- }
- elseif (changed(Active) & Active)
- {
- timer("Radar", 1000)
- soundPurge()
- Driver = Chair:driver()
- Res = egpScrSize(Driver) / 2
- X = Res[1]
- Y = Res[2]
- Scale = X / 960
- Size = max(1,2*Scale)
- PrevFoes = N = 0
- #The actual shape for the HUD and its borders
- Screen = array(vec2(350, 350) * Scale,
- vec2(350, -250) * Scale,
- vec2(150, -350) * Scale,
- vec2(-150, -350) * Scale,
- vec2(-350, -250) * Scale,
- vec2(-350, 350) * Scale)
- #Display for the closest target on the list
- Marker1 = array(vec2(20, 0) * Scale,
- vec2(0, 20) * Scale,
- vec2(0, -20) * Scale,
- vec2(20, 0) * Scale,
- vec2(-20, 0) * Scale,
- vec2(0, -20) * Scale,
- vec2(0, 20) * Scale,
- vec2(-20, 0) * Scale)
- #Display for the rest of the targets on the list
- Marker = array(vec2(20, 0) * Scale,
- vec2(0, 20) * Scale,
- vec2(-20, 0) * Scale,
- vec2(0, -20) * Scale)
- BoxLeft = array(vec2(260, 15) * Scale,
- vec2(170, 15) * Scale,
- vec2(150, 0) * Scale,
- vec2(170, -15) * Scale,
- vec2(260, -15) * Scale)
- BoxRight = array(vec2(-260, 15) * Scale,
- vec2(-170, 15) * Scale,
- vec2(-150, 0) * Scale,
- vec2(-170, -15) * Scale,
- vec2(-260, -15) * Scale)
- EGP:egpClear()
- N++ BaseAim = N
- EGP:egp3DTracker(N, vec())
- EGP:egpParent(N, holoEntity(1))
- #Creating homing target displays
- for (I = 1, MaxFoes)
- {
- N++ FoeTrackers[I, number] = N
- EGP:egp3DTracker(N, vec())
- EGP:egpParent(N, holoEntity(2 + I))
- local Shape = I == 1 ? Marker1 : Marker
- N++ FoeDisplays[I, number] = N
- EGP:egpPolyOutline(N, Shape)
- EGP:egpParent(N, N - 1)
- }
- N++ HUDDark = N
- EGP:egpPoly(N, Screen)
- EGP:egpParent(N, BaseAim)
- EGP:egpOrder(N, 0)
- N++
- EGP:egpPolyOutline(N, Screen)
- EGP:egpParent(N, BaseAim)
- N++
- EGP:egpCircleOutline(N, vec2(), vec2(5) * Scale)
- EGP:egpParent(N, BaseAim)
- N++
- EGP:egpLine(N, vec2(5, 0) * Scale, vec2(25, 0) * Scale)
- EGP:egpParent(N, BaseAim)
- N++
- EGP:egpLine(N, vec2(-5, 0) * Scale, vec2(-25 , 0) * Scale)
- EGP:egpParent(N, BaseAim)
- N++
- EGP:egpLine(N, vec2(0, -5) * Scale, vec2(0, -20) * Scale)
- EGP:egpParent(N, BaseAim)
- N++
- EGP:egpBoxOutline(N, vec2(0, -250) * Scale, vec2(75, 30) * Scale)
- EGP:egpParent(N, BaseAim)
- N++
- EGP:egpPolyOutline(N, BoxLeft)
- EGP:egpParent(N, BaseAim)
- N++
- EGP:egpPolyOutline(N, BoxRight)
- EGP:egpParent(N, BaseAim)
- N++ HUDHeading = N
- EGP:egpText(N, "XXX", vec2(0, -250) * Scale)
- EGP:egpAlign(N, 1, 1)
- EGP:egpParent(N, BaseAim)
- N++ HUDAlt = N
- EGP:egpText(N, "XXXX", vec2(180, 15) * Scale)
- EGP:egpAlign(N, 0, 2)
- EGP:egpParent(N, BaseAim)
- N++ HUDKnots = N
- EGP:egpText(N, "XXXX", vec2(-180, 15) * Scale)
- EGP:egpAlign(N, 2, 2)
- EGP:egpParent(N, BaseAim)
- N++
- EGP:egpText(N, "a", vec2(-240, 140) * Scale)
- EGP:egpAlign(N, 1, 2)
- EGP:egpParent(N, BaseAim)
- N++ HUDAlpha = N
- EGP:egpText(N, "XXXX", vec2(-175, 140) * Scale)
- EGP:egpAlign(N, 2, 2)
- EGP:egpParent(N, BaseAim)
- N++
- EGP:egpText(N, "M", vec2(-240, 160) * Scale)
- EGP:egpAlign(N, 1, 2)
- EGP:egpParent(N, BaseAim)
- N++ HUDMach = N
- EGP:egpText(N, "XXXX", vec2(-175, 160) * Scale)
- EGP:egpAlign(N, 2, 2)
- EGP:egpParent(N, BaseAim)
- N++
- EGP:egpText(N, "G", vec2(-240, 180) * Scale)
- EGP:egpAlign(N, 1, 2)
- EGP:egpParent(N, BaseAim)
- N++ HUDGForce = N
- EGP:egpText(N, "XXXX", vec2(-175, 180) * Scale)
- EGP:egpAlign(N, 2, 2)
- EGP:egpParent(N, BaseAim)
- if (!SimplifiedMode)
- {
- #Creating elevation ladder lines
- for (I = 1, 4)
- {
- local Angle = -10 + 5 * I
- local PosX = 5000 * cos(Angle)
- local PosZ = 5000 * sin(Angle)
- N++ Tracker = N
- EGP:egp3DTracker(N, vec(PosX, 0, PosZ))
- EGP:egpParent(N, holoEntity(2))
- N++
- EGP:egpLine(N, vec2(30, 0) * Scale, vec2(110, 0) * Scale)
- EGP:egpParent(N, Tracker)
- N++
- EGP:egpLine(N, vec2(-30, 0) * Scale, vec2(-110, 0) * Scale)
- EGP:egpParent(N, Tracker)
- N++ LaddersL[I, number] = N
- EGP:egpText(N, "XX", vec2(-120, 0) * Scale)
- EGP:egpAlign(N, 2, 1)
- EGP:egpParent(N, Tracker)
- N++ LaddersR[I, number] = N
- EGP:egpText(N, "XX", vec2(120, 0) * Scale)
- EGP:egpAlign(N, 0, 1)
- EGP:egpParent(N, Tracker)
- }
- }
- for (I = 1, N)
- {
- EGP:egpColor(I, Color)
- EGP:egpSize(I, Size)
- }
- EGP:egpColor(HUDDark, vec4(30, 30, 30, 200))
- EGP:egpSize(HUDHeading, 30 * Scale)
- EGP:egpSize(HUDKnots, 30 * Scale)
- EGP:egpSize(HUDAlt, 30 * Scale)
- EGP:egpSize(HUDAlpha, 20 * Scale)
- EGP:egpSize(HUDAlpha - 1, 20 * Scale)
- EGP:egpSize(HUDMach, 20 * Scale)
- EGP:egpSize(HUDMach - 1, 20 * Scale)
- EGP:egpSize(HUDGForce, 20 * Scale)
- EGP:egpSize(HUDGForce - 1, 20 * Scale)
- foreach (K:number, V:number = FoeDisplays)
- {
- EGP:egpAlpha(V, 0)
- }
- foreach (K:number, V:number = LaddersL:add(LaddersR))
- {
- EGP:egpSize(V, 20 * Scale)
- }
- }
- elseif (clkName())
- {
- switch (clkName())
- {
- case "Radar", coneRadarFind()
- case "interval",
- if (!Active) { break }
- interval(150)
- Velocity = floor(Base:vel():length() * 4) #Multiplied by 4 because of the 1:4 scale.
- Angles = floor(-Base:angles(), 1)
- AnglesX = floor(Angles[1] / 5) * 5
- Altitude = floor((Base:pos()[3] - GroundAlt) * 0.333) #Multiplied by 0.333 instead of 0.083 because of the 1:4 scale
- GForce = floor(1 + $Velocity * 0.0173, 2) #Delta Vel(in/s) / Interval in seconds(s) * 0.0026
- if (changed(Velocity))
- {
- local Knots = floor(toUnit("knots", Velocity))
- local Mach = floor(toUnit("mach", Velocity), 2)
- EGP:egpSetText(HUDKnots, "" + Knots)
- EGP:egpSetText(HUDMach, "" + Mach)
- }
- if (changed(Angles))
- {
- local Heading = 180 + floor(Angles[2])
- EGP:egpAngle(BaseAim, Angles[3])
- EGP:egpSetText(HUDHeading, "" + Heading)
- EGP:egpSetText(HUDAlpha, "" + Angles[1])
- holoAng(2, -ang(AnglesX, Angles[2], 0))
- }
- if (changed(AnglesX)) { updateLadderDegrees() }
- if (changed(Altitude)) { EGP:egpSetText(HUDAlt, "" + Altitude) }
- if (changed(GForce)) { EGP:egpSetText(HUDGForce, "" + GForce) }
- break
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement