LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

MixerWagonHUDExtension

Description
Custom HUD drawing extension for MixerWagon. Displays the fill levels of the mixer wagon.
Parent
VehicleHUDExtension
Functions

canDraw

Description
Determine if the HUD extension should be drawn.
Definition
canDraw()
Code
73function MixerWagonHUDExtension:canDraw()
74 return self.vehicle:getIsActiveForInput(true)
75end

draw

Description
Draw mixing ratio information for a mixing wagon when it is active.
Definition
draw(float leftPosX, float rightPosX, float posY)
Arguments
floatleftPosXLeft input help panel column start position
floatrightPosXRight input help panel column start position
floatposYCurrent input help panel drawing vertical offset
Return Values
floatModifiedinput help panel drawing vertical offset
Code
90function MixerWagonHUDExtension:draw(leftPosX, rightPosX, posY)
91 -- posY is bottom of the display
92
93 setTextColor(unpack(self.uiTextColor))
94 setTextBold(true)
95 setTextAlignment(RenderText.ALIGN_LEFT)
96 local text = string.format("%s (%s)", g_i18n:getText("info_mixingRatio"), self.vehicle:getFullName())
97 renderText(leftPosX, posY + self.displayHeight - self.uiTextSize * 1.5, self.uiTextSize, text)
98 setTextBold(false)
99
100 local totalFillLevel = 0
101 if self.vehicle:getFillUnitFillLevel(self.mixerWagon.fillUnitIndex) > 0 then
102 for i, mixerWagonFillType in ipairs(self.mixerWagon.mixerWagonFillTypes) do
103 totalFillLevel = totalFillLevel + mixerWagonFillType.fillLevel
104 -- fill type display status is a synchronous array -> set corresponding fill level info
105 self.fillTypeStatus[i].fillLevel = mixerWagonFillType.fillLevel
106 end
107 end
108
109 local barY = posY + #self.fillTypeStatus * self.helpHeightPerFruit + self.helpHeightPerFruit * 0.3
110 for _, fillTypeDisplay in ipairs(self.fillTypeStatus) do
111 barY = barY - self.helpHeightPerFruit
112
113 local percentage = 0
114 if self.vehicle:getFillUnitFillLevel(self.mixerWagon.fillUnitIndex) > 0 then
115 percentage = fillTypeDisplay.fillLevel / totalFillLevel
116 end
117
118 if fillTypeDisplay.fillLevel > 0 then
119 if self.vehicle:getFillUnitFillType(self.mixerWagon.fillUnitIndex) ~= FillType.FORAGE_MIXING or (percentage >= fillTypeDisplay.minPercentage and percentage <= fillTypeDisplay.maxPercentage) then
120 fillTypeDisplay.statusBar:setColor(unpack(fillTypeDisplay.statusBarColor))
121 else
122 fillTypeDisplay.statusBar:setColor(unpack(fillTypeDisplay.statusBarColor2))
123 end
124 end
125
126 fillTypeDisplay.statusBar:setPosition(rightPosX - fillTypeDisplay.statusBar.width, barY + (self.helpHeightPerFruit - fillTypeDisplay.statusBar.height) * 0.5)
127 fillTypeDisplay.statusBar:setValue(percentage)
128 fillTypeDisplay.statusBar:render()
129
130 if fillTypeDisplay.overlay ~= nil then
131 fillTypeDisplay.overlay:setPosition(leftPosX, barY + (self.helpHeightPerFruit - fillTypeDisplay.overlay.height) * 0.5)
132 fillTypeDisplay.overlay:render()
133 end
134
135 setTextAlignment(RenderText.ALIGN_RIGHT)
136 renderText(leftPosX + self.fillLevelTextOffsetX, barY + self.fillLevelTextOffsetY, self.uiTextSize, string.format("%1.1f%%", percentage * 100))
137 setTextAlignment(RenderText.ALIGN_LEFT)
138
139 local y = fillTypeDisplay.statusBar.y + fillTypeDisplay.statusBar.height * 0.5
140 local maxLeft = fillTypeDisplay.statusBar.x + fillTypeDisplay.statusBar.width
141 local xLeft = math.min(fillTypeDisplay.statusBar.x + fillTypeDisplay.statusBar.width * fillTypeDisplay.minPercentage, maxLeft)
142 local xRight = math.min(fillTypeDisplay.statusBar.x + fillTypeDisplay.statusBar.width * fillTypeDisplay.maxPercentage, maxLeft)
143
144 self.fillRangeMarkerOverlay:setInvertX(false)
145 self.fillRangeMarkerOverlay:setPosition(xLeft, y)
146 self.fillRangeMarkerOverlay:render()
147 self.fillRangeMarkerOverlay:setInvertX(true) -- base sprite points right, need to point to the left now
148 self.fillRangeMarkerOverlay:setPosition(xRight - self.fillRangeMarkerOverlay.width, y)
149 self.fillRangeMarkerOverlay:render()
150 end
151
152 return posY
153end

getDisplayHeight

Description
Get this HUD extension's display height.
Definition
getDisplayHeight()
Return Values
floatDisplayheight in screen space
Code
80function MixerWagonHUDExtension:getDisplayHeight()
81 return self:canDraw() and self.displayHeight or 0
82end

new

Description
Create a new instance of MixerWagonHUDExtension.
Definition
new(table vehicle, float uiScale, table uiTextColor, float uiTextSize)
Arguments
tablevehicleVehicle which has the specialization required by a sub-class
floatuiScaleCurrent UI scale
tableuiTextColorHUD text drawing color as an RGBA array
floatuiTextSizeHUD text size
Code
24function MixerWagonHUDExtension.new(vehicle, uiScale, uiTextColor, uiTextSize)
25 local self = VehicleHUDExtension.new(MixerWagonHUDExtension_mt, vehicle, uiScale, uiTextColor, uiTextSize)
26 self.mixerWagon = vehicle.spec_mixerWagon
27
28 self.fillTypeStatus = {} -- array of fill type display entries, definition see below
29
30 for _, mixerWagonFillType in ipairs(self.mixerWagon.mixerWagonFillTypes) do
31 local fillType = g_fillTypeManager:getFillTypeByIndex(next(mixerWagonFillType.fillTypes))
32 if fillType ~= nil then
33 local entry = {fillType=fillType, overlay=nil, statusBar=nil, statusBarColor=nil, statusBarColor2=nil,
34 minPercentage=0, maxPercentage=0, fillLevel=0}
35
36 entry.minPercentage = mixerWagonFillType.minPercentage
37 entry.maxPercentage = mixerWagonFillType.maxPercentage
38
39 local width, height = getNormalizedScreenValues(30 * uiScale, 30 * uiScale)
40 entry.overlay = Overlay.new(fillType.hudOverlayFilename, 0, 0, width, height)
41 entry.overlay:setColor(unpack(uiTextColor))
42 self:addComponentForCleanup(entry.overlay)
43
44 entry.statusBarColor = MixerWagonHUDExtension.COLOR.STATUS_BAR_GOOD
45 entry.statusBarColor2 = MixerWagonHUDExtension.COLOR.STATUS_BAR_BAD
46 width, height = getNormalizedScreenValues(315 * uiScale, 12 * uiScale)
47 entry.statusBar = StatusBar.new(g_baseUIFilename, g_colorBgUVs, nil, MixerWagonHUDExtension.COLOR.STATUS_BAR_BG, entry.statusBarColor2, nil, 0, 0, width, height)
48 self:addComponentForCleanup(entry.statusBar)
49
50 table.insert(self.fillTypeStatus, entry)
51 end
52 end
53
54 local _
55 self.fillLevelTextOffsetX, self.fillLevelTextOffsetY = getNormalizedScreenValues(105 * uiScale, 7 * uiScale)
56 _, self.helpHeightPerFruit = getNormalizedScreenValues(0, 28 * uiScale)
57 _, self.helpHeightOffset = getNormalizedScreenValues(0, 12 * uiScale)
58
59 local width, height = getNormalizedScreenValues(9 * uiScale, 12.5 * uiScale)
60 self.fillRangeMarkerOverlay = Overlay.new(g_baseUIFilename, 0, 0, width, height)
61 self.fillRangeMarkerOverlay:setAlignment(Overlay.ALIGN_VERTICAL_MIDDLE, Overlay.ALIGN_HORIZONTAL_LEFT)
62 self.fillRangeMarkerOverlay:setUVs(GuiUtils.getUVs(MixerWagonHUDExtension.UV.RANGE_MARKER_ARROW))
63 self.fillRangeMarkerOverlay:setColor(unpack(uiTextColor))
64 self:addComponentForCleanup(self.fillRangeMarkerOverlay)
65
66 self.displayHeight = (#self.mixerWagon.mixerWagonFillTypes + 1) * self.helpHeightPerFruit + self.helpHeightOffset
67
68 return self
69end