LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

SpeedSliderDisplay

Description
Vehicle Speed Slider for Mobile Version
Parent
HUDDisplayElement
Functions

createBackground

Description
Create an empty background overlay as a base frame for this element.
Definition
createBackground()
Code
619function SpeedSliderDisplay.createBackground()
620 local width, height = getNormalizedScreenValues(unpack(SpeedSliderDisplay.SIZE.BACKGROUND))
621 local posX, posY = SpeedSliderDisplay.getBackgroundPosition(1, width)
622
623 return Overlay.new(nil, posX, posY, width, height) -- empty overlay, only used as a positioning frame
624end

createBar

Description
Definition
createBar()
Code
400function SpeedSliderDisplay:createBar(position, size, color)
401 local baseX, baseY = self:getPosition()
402
403 local posX, posY = getNormalizedScreenValues(unpack(position))
404 local sizeX, sizeY = getNormalizedScreenValues(unpack(size))
405 local barOverlay = Overlay.new(self.hudAtlasPath, baseX + posX, baseY + posY, sizeX, sizeY)
406 barOverlay:setUVs(GuiUtils.getUVs(HUDElement.UV.FILL))
407 barOverlay:setColor(unpack(color))
408
409 return HUDElement.new(barOverlay)
410end

createComponents

Description
Definition
createComponents()
Code
73function SpeedSliderDisplay:createComponents()
74 local baseX, baseY = self:getPosition()
75
76 for _, element in ipairs(self.hudElements) do
77 element:delete()
78 end
79 self.hudElements = {}
80
81 --background
82 local bgSizeX, bgSizeY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.SIZE.BACKGROUND))
83 local backgroundOverlay = Overlay.new(self.hudAtlasPath, baseX, baseY, bgSizeX, bgSizeY)
84 backgroundOverlay:setUVs(GuiUtils.getUVs(SpeedSliderDisplay.UV.BACKGROUND))
85 self.backgroundHudElement = HUDElement.new(backgroundOverlay)
86 table.insert(self.hudElements, self.backgroundHudElement)
87
88 self.snapSteps = {}
89 self.snapSteps[1] = self:createHUDElement(SpeedSliderDisplay.POSITION.SNAP1, SpeedSliderDisplay.SIZE.SNAP, SpeedSliderDisplay.UV.SNAP)
90 self.snapSteps[2] = self:createHUDElement(SpeedSliderDisplay.POSITION.SNAP2, SpeedSliderDisplay.SIZE.SNAP, SpeedSliderDisplay.UV.SNAP)
91 self.snapSteps[3] = self:createHUDElement(SpeedSliderDisplay.POSITION.SNAP3, SpeedSliderDisplay.SIZE.SNAP, SpeedSliderDisplay.UV.SNAP)
92
93 for i=1, 3 do
94 table.insert(self.hudElements, self.snapSteps[i])
95 self.snapSteps[i]:setVisible(false)
96 end
97
98 --positive bar
99 self.positiveBarHudElement = self:createBar(SpeedSliderDisplay.POSITION.POSITIVE_BAR, SpeedSliderDisplay.SIZE.POSITIVE_BAR, SpeedSliderDisplay.COLOR.POSITIVE_BAR)
100 table.insert(self.hudElements, self.positiveBarHudElement)
101
102 --positive bar
103 self.negativeBarHudElement = self:createBar(SpeedSliderDisplay.POSITION.NEGATIVE_BAR, SpeedSliderDisplay.SIZE.NEGATIVE_BAR, SpeedSliderDisplay.COLOR.NEGATIVE_BAR)
104 table.insert(self.hudElements, self.negativeBarHudElement)
105 self.negativeBarPosX, self.negativeBarPosY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.POSITION.NEGATIVE_BAR))
106 local _, negativeBarSizeY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.SIZE.NEGATIVE_BAR))
107 self.negativeBarSizeY = negativeBarSizeY
108
109 --gamepad background
110 local gpbgPosX, gpbgPosY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.POSITION.GAMEPAD_BACKGROUND))
111 local gpbgSizeX, gpbgSizeY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.SIZE.GAMEPAD_BACKGROUND))
112 local gamepadBackgroundOverlay = Overlay.new(self.hudAtlasPath, baseX + gpbgPosX, baseY + gpbgPosY, gpbgSizeX, gpbgSizeY)
113 gamepadBackgroundOverlay:setUVs(GuiUtils.getUVs(SpeedSliderDisplay.UV.GAMEPAD_BACKGROUND))
114 self.gamepadBackgroundHudElement = HUDElement.new(gamepadBackgroundOverlay)
115 table.insert(self.hudElements, self.gamepadBackgroundHudElement)
116
117 -- lower border of gamepad background
118 local gpbgbPosX, gpbgbPosY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.POSITION.GAMEPAD_BACKGROUND))
119 local gpbgbSizeX, gpbgbSizeY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.SIZE.GAMEPAD_BACKGROUND_BORDER))
120 local gamepadBackgroundBorderOverlay = Overlay.new(self.hudAtlasPath, baseX + gpbgbPosX, baseY + gpbgbPosY, gpbgbSizeX, gpbgbSizeY)
121 gamepadBackgroundBorderOverlay:setUVs(GuiUtils.getUVs(SpeedSliderDisplay.UV.GAMEPAD_BACKGROUND_BORDER))
122 self.gamepadBackgroundHudElement:addChild(HUDElement.new(gamepadBackgroundBorderOverlay))
123
124 -- player jump background
125 local pljbgPosX, pljbgPosY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.POSITION.PLAYER_JUMP_BACKGROUND))
126 local pljbgSizeX, pljbgSizeY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.SIZE.PLAYER_JUMP_BACKGROUND))
127 self.playerJumpBackgroundHudElement = HUDFrameElement.new(self.hudAtlasPath, baseX + pljbgPosX, baseY + pljbgPosY, pljbgSizeX, pljbgSizeY, nil, false, 2)
128 self.playerJumpBackgroundHudElement:setColor(unpack(SpeedSliderDisplay.COLOR.PLAYER_JUMP_BACKGROUND))
129 self.playerJumpBackgroundHudElement:setFrameColor(unpack(SpeedSliderDisplay.COLOR.PLAYER_JUMP_BACKGROUND_FRAME))
130 table.insert(self.hudElements, self.playerJumpBackgroundHudElement)
131
132 -- text
133 self.textPosX, self.textPosY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.POSITION.SPEED_TEXT))
134 local _, textSize = getNormalizedScreenValues(unpack(SpeedSliderDisplay.SIZE.SPEED_TEXT))
135 self.textSize = textSize
136
137 -- slider
138 local slOffX, slOffY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.POSITION.SLIDER_OFFSET))
139 local slSizeX, slSizeY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.SIZE.SLIDER_SIZE))
140 local sliderOverlay = Overlay.new(self.hudAtlasPath, baseX+slOffX, baseY+slOffY, slSizeX, slSizeY)
141 sliderOverlay:setUVs(GuiUtils.getUVs(SpeedSliderDisplay.UV.SLIDER))
142
143 self.sliderPosX = slOffX
144 self.sliderPosY = slOffY
145 self.backgroundSizeY = bgSizeY - slOffY * 2
146
147 local _, slAreaY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.SIZE.SLIDER_AREA))
148 self.sliderAreaY = slAreaY
149
150 local _, slCenterY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.POSITION.SLIDER_CENTER))
151 self.restPosition = slCenterY / slAreaY
152
153 local sliderMin = self.sliderPosY
154 local sliderMax = sliderMin + self.sliderAreaY
155 local sliderCenter = sliderMin + self.sliderAreaY * self.restPosition
156 self.sliderHudElement = HUDSliderElement.new(sliderOverlay, backgroundOverlay, 2.5, 0.4, 4, 2, sliderMin, sliderCenter, sliderMax, sliderMax)
157 self.sliderHudElement:setCallback(self.onSliderPositionChanged, self)
158 table.insert(self.hudElements, self.sliderHudElement)
159
160 for _, element in ipairs(self.hudElements) do
161 self:addChild(element)
162 end
163
164 self.sliderHudElement:setAxisPosition(sliderCenter)
165end

createHUDElement

Description
Definition
createHUDElement()
Code
385function SpeedSliderDisplay:createHUDElement(position, size, uvs, color)
386 local baseX, baseY = self:getPosition()
387 local posX, posY = getNormalizedScreenValues(unpack(position))
388 local sizeX, sizeY = getNormalizedScreenValues(unpack(size))
389 local overlay = Overlay.new(self.hudAtlasPath, baseX + posX, baseY + posY, sizeX, sizeY)
390 overlay:setUVs(GuiUtils.getUVs(uvs))
391 if color ~= nil then
392 overlay:setColor(unpack(color))
393 end
394
395 return HUDElement.new(overlay)
396end

delete

Description
Definition
delete()
Code
65function SpeedSliderDisplay:delete()
66 g_messageCenter:unsubscribeAll(self)
67 SpeedSliderDisplay:superClass().delete(self)
68end

draw

Description
Definition
draw()
Code
567function SpeedSliderDisplay:draw()
568 SpeedSliderDisplay:superClass().draw(self)
569
570 if self.vehicle ~= nil and not self.isRideable then
571 local speed = self.vehicle:getLastSpeed()
572 local baseX, baseY = self:getPosition()
573
574 setTextColor(1, 1, 1, 1)
575 setTextBold(true)
576 setTextAlignment(RenderText.ALIGN_CENTER)
577 renderText(baseX+self.textPosX, baseY+self.textPosY, self.textSize, string.format("%02d", speed))
578 setTextAlignment(RenderText.ALIGN_LEFT)
579 setTextBold(false)
580 end
581end

getAccelerateAndBrakeValue

Description
Definition
getAccelerateAndBrakeValue()
Code
444function SpeedSliderDisplay:getAccelerateAndBrakeValue()
445 return MathUtil.clamp((self.sliderPosition - self.restPosition) / (1-self.restPosition), 0, 1), 1 - MathUtil.clamp(self.sliderPosition / self.restPosition, 0, 1)
446end

getBackgroundPosition

Description
Get the position of the background element, which provides this element's absolute position.
Definition
getBackgroundPosition(scale Current, float width)
Arguments
scaleCurrentUI scale
floatwidthScaled background width in pixels
Return Values
floatXposition in screen space
floatYposition in screen space
Code
608function SpeedSliderDisplay.getBackgroundPosition(scale, width)
609 local offX, offY = getNormalizedScreenValues(unpack(SpeedSliderDisplay.POSITION.BACKGROUND))
610 return 1 - g_safeFrameOffsetX - width - offX * scale, g_safeFrameOffsetY - offY * scale
611end

getIsSliderActive

Description
Definition
getIsSliderActive()
Code
519function SpeedSliderDisplay:getIsSliderActive()
520 if self.lastInputHelpMode == GS_INPUT_HELP_MODE_GAMEPAD then
521 return false
522 end
523
524 if self.vehicle ~= nil and self.vehicle:getIsAIActive() then
525 return false
526 end
527
528 if self.player ~= nil then
529 return false
530 end
531
532 return true
533end

hideSlider

Description
Hide slider and only show speed display
Definition
hideSlider()
Code
181function SpeedSliderDisplay:hideSlider()
182 local _, yOffset = getNormalizedScreenValues(unpack(SpeedSliderDisplay.POSITION.GAMEPAD_BACKGROUND))
183 local startX, startY = self:getPosition()
184
185 local sequence = TweenSequence.new(self)
186 sequence:insertTween(MultiValueTween.new(self.setPosition, {startX, startY}, {self.origX, self.origY - yOffset}, HUDDisplayElement.MOVE_ANIMATION_DURATION), 0)
187 sequence:start()
188
189 self.animation = sequence
190
191 self.sliderState = false
192 self.sliderHudElement:setTouchIsActive(false)
193
194 self:updateElementsVisibility()
195end

new

Description
Creates a new SpeedSliderDisplay instance.
Definition
new(string hudAtlasPath)
Arguments
stringhudAtlasPathPath to the HUD texture atlas.
Code
35function SpeedSliderDisplay.new(hud, hudAtlasPath)
36 local backgroundOverlay = SpeedSliderDisplay.createBackground()
37 local self = SpeedSliderDisplay:superClass().new(backgroundOverlay, nil, SpeedSliderDisplay_mt)
38
39 self.hud = hud
40 self.uiScale = 1.0
41 self.hudAtlasPath = hudAtlasPath
42
43 self.vehicle = nil -- currently controlled vehicle
44 self.player = nil
45 self.isRideable = false
46
47 self.sliderPosition = 0
48 self.restPosition = 0.25
49
50 self.hudElements = {}
51
52 self.lastInputHelpMode = GS_INPUT_HELP_MODE_KEYBOARD
53
54 self.sliderState = nil
55
56 self:createComponents()
57
58 g_messageCenter:subscribe(MessageType.GUI_DIALOG_OPENED, self.onDialogOpened, self)
59
60 return self
61end

onAIVehicleStateChanged

Description
Definition
onAIVehicleStateChanged()
Code
550function SpeedSliderDisplay:onAIVehicleStateChanged(state, vehicle)
551 if vehicle == self.vehicle then
552 self:updateVisibilityState()
553 end
554end

onDialogOpened

Description
Definition
onDialogOpened()
Code
628function SpeedSliderDisplay:onDialogOpened(guiName, overlappingDialog)
629 -- only reset silder if it's a direct dialog, not in a menu since the game is paused there anyway
630 if not overlappingDialog then
631 self.sliderHudElement:resetSlider()
632 end
633end

onInputHelpModeChange

Description
Definition
onInputHelpModeChange()
Code
537function SpeedSliderDisplay:onInputHelpModeChange(inputHelpMode)
538 self.lastInputHelpMode = inputHelpMode
539
540 -- reset speed slider if user starts using gamepad
541 if inputHelpMode == GS_INPUT_HELP_MODE_GAMEPAD then
542 self.sliderHudElement:setAxisPosition(self.sliderPosY + self.sliderAreaY * self.restPosition)
543 end
544
545 self:updateVisibilityState()
546end

onJumpEventCallback

Description
Definition
onJumpEventCallback()
Code
450function SpeedSliderDisplay:onJumpEventCallback()
451 if self.vehicle ~= nil then
452 if self.isRideable then
453 if self.vehicle:getIsRideableJumpAllowed() then
454 self.vehicle:jump()
455 end
456 end
457 end
458
459 if self.player ~= nil then
460 self.player:onInputJump(nil, 1)
461 end
462end

onSliderPositionChanged

Description
Definition
onSliderPositionChanged()
Code
413function SpeedSliderDisplay:onSliderPositionChanged(position)
414 self.sliderPosition = MathUtil.clamp(position, 0, 1)
415 local selfX, selfY = self:getPosition()
416
417 local acc, brake = self:getAccelerateAndBrakeValue()
418
419 self.positiveBarHudElement:setScale(1, acc)
420 self.positiveBarHudElement:setColor(unpack(self.cruiseControlIsActive and SpeedSliderDisplay.COLOR.CRUISE_CONTROL or SpeedSliderDisplay.COLOR.POSITIVE_BAR))
421
422 self.negativeBarHudElement:setPosition(selfX + self.negativeBarPosX, selfY + self.negativeBarPosY + self.negativeBarSizeY * (1-brake))
423 self.negativeBarHudElement:setScale(1, brake)
424
425 if self.vehicle ~= nil then
426 if self.isRideable then
427 for gait=1, #SpeedSliderDisplay.RIDEABLE_SNAP_POSITIONS do
428 if math.abs(position - SpeedSliderDisplay.RIDEABLE_SNAP_POSITIONS[gait]) < 0.01 then
429 self.vehicle:setCurrentGait(gait)
430
431 self.lastGait = gait
432 self.lastGaitTime = g_time
433 break
434 end
435 end
436
437 self:setJumpButtonActive(self.vehicle:getIsRideableJumpAllowed(true))
438 end
439 end
440end

onSliderVisibilityChangeFinished

Description
Called when the sliders visibility changed
Definition
onSliderVisibilityChangeFinished()
Code
234function SpeedSliderDisplay:onSliderVisibilityChangeFinished(visibility)
235 if visibility then
236 self:updateElementsVisibility()
237
238 for i=1, 3 do
239 self.snapSteps[i]:setVisible(self.isRideable)
240 end
241 end
242end

setPlayer

Description
Set the reference to the current player.
Definition
setPlayer()
Code
278function SpeedSliderDisplay:setPlayer(player)
279 self.player = player
280
281 if player ~= nil then
282 if self.vehicle ~= nil then
283 self:setVehicle(nil)
284 end
285
286 self:removeJumpButton()
287 self:addJumpButton()
288 self:setJumpButtonActive(true)
289
290 self.sliderHudElement:resetSlider()
291 self.sliderHudElement:clearSnapPositions()
292 for i=1, #SpeedSliderDisplay.PLAYER_SNAP_POSITIONS do
293 self.sliderHudElement:addSnapPosition(self.sliderPosY + self.sliderAreaY * SpeedSliderDisplay.PLAYER_SNAP_POSITIONS[i])
294 end
295 end
296
297 self:updateVisibilityState()
298 self:updateElementsVisibility()
299end

setScale

Description
Set this element's scale.
Definition
setScale()
Code
588function SpeedSliderDisplay:setScale(uiScale)
589 SpeedSliderDisplay:superClass().setScale(self, uiScale, uiScale)
590
591 local currentVisibility = self:getVisible()
592 self:setVisible(true, false)
593
594 self.uiScale = uiScale
595 local posX, posY = SpeedSliderDisplay.getBackgroundPosition(uiScale, self:getWidth())
596 self:setPosition(posX, posY)
597
598 self:storeOriginalPosition()
599 self:setVisible(currentVisibility, false)
600end

setSliderState

Description
Set silder state
Definition
setSliderState()
Code
169function SpeedSliderDisplay:setSliderState(state)
170 if self.sliderState ~= state then
171 if state then
172 self:showSlider()
173 else
174 self:hideSlider()
175 end
176 end
177end

setVehicle

Description
Set the currently controlled vehicle which provides display data.
Definition
setVehicle(table vehicle)
Arguments
tablevehicleCurrently controlled vehicle
Code
247function SpeedSliderDisplay:setVehicle(vehicle)
248 self.vehicle = vehicle
249
250 if vehicle ~= nil then
251 self.isRideable = SpecializationUtil.hasSpecialization(Rideable, vehicle.specializations)
252
253 if self.player ~= nil then
254 self:setPlayer(nil)
255 end
256
257 self:removeJumpButton()
258 self.sliderHudElement:resetSlider()
259 self.sliderHudElement:clearSnapPositions()
260 if self.isRideable then
261 for i=1, #SpeedSliderDisplay.RIDEABLE_SNAP_POSITIONS do
262 self.sliderHudElement:addSnapPosition(self.sliderPosY + self.sliderAreaY * SpeedSliderDisplay.RIDEABLE_SNAP_POSITIONS[i])
263 end
264
265 self:addJumpButton()
266 end
267
268 for i=1, 3 do
269 self.snapSteps[i]:setVisible(self.isRideable)
270 end
271 end
272
273 self:updateElementsVisibility()
274end

showSlider

Description
Show slider and speed display
Definition
showSlider()
Code
199function SpeedSliderDisplay:showSlider()
200 local startX, startY = self:getPosition()
201
202 local sequence = TweenSequence.new(self)
203 sequence:insertTween(MultiValueTween.new(self.setPosition, {startX, startY}, {self.origX, self.origY}, HUDDisplayElement.MOVE_ANIMATION_DURATION), 0)
204 sequence:addCallback(self.onSliderVisibilityChangeFinished, true)
205 sequence:start()
206
207 self.animation = sequence
208
209 self.sliderState = true
210
211 self.sliderHudElement:resetSlider()
212 self.sliderHudElement:setTouchIsActive(true)
213end

update

Description
Update the fill levels state.
Definition
update()
Code
470function SpeedSliderDisplay:update(dt)
471 SpeedSliderDisplay:superClass().update(self, dt)
472
473 if self.sliderHudElement ~= nil then
474 self.sliderHudElement:update(dt)
475 end
476
477 if self.vehicle ~= nil then
478 if self.vehicle.setAccelerationPedalInput ~= nil then
479 local acceleration, brake = self:getAccelerateAndBrakeValue()
480
481 local direction = acceleration > 0 and 1 or (brake > 0 and -1 or 0)
482 self.vehicle:setTargetSpeedAndDirection(math.abs(acceleration + brake), direction)
483 end
484
485 -- reset slider if the gait was changed from rideable due to collisions or user input on pc
486 if self.isRideable then
487 local currentGait = self.vehicle:getCurrentGait()
488 if currentGait ~= self.lastGait then
489 if self.lastGaitTime < g_time - 250 then
490 if SpeedSliderDisplay.RIDEABLE_SNAP_POSITIONS[currentGait] ~= nil then
491 self.sliderHudElement:setAxisPosition(self.sliderPosY + self.sliderAreaY * SpeedSliderDisplay.RIDEABLE_SNAP_POSITIONS[currentGait])
492 self.lastGait = currentGait
493 end
494 end
495 end
496 end
497 end
498
499 if self.player ~= nil then
500 local acceleration, brake = self:getAccelerateAndBrakeValue()
501 self.player:onInputMoveForward(nil, -(acceleration - brake))
502
503 if acceleration > 0.75 then
504 self.player:onInputRun(nil, 1)
505 end
506 end
507
508 -- debug enable mouse
509 if self.vehicle ~= nil or self.player ~= nil then
510 if not g_gui:getIsGuiVisible() then
511 local show = Utils.getNoNil(Input.isKeyPressed(Input.KEY_lctrl), false)
512 g_inputBinding:setShowMouseCursor(show, false)
513 end
514 end
515end

updateElementsVisibility

Description
Hide slider and only show speed display
Definition
updateElementsVisibility()
Code
217function SpeedSliderDisplay:updateElementsVisibility()
218 for _, element in ipairs(self.hudElements) do
219 if not self.sliderState then
220 if self.player ~= nil then
221 element:setVisible(element == self.playerJumpBackgroundHudElement)
222 else
223 element:setVisible(element == self.gamepadBackgroundHudElement)
224 end
225 else
226 element:setVisible(element ~= self.playerJumpBackgroundHudElement and element ~= self.gamepadBackgroundHudElement)
227 end
228 end
229end

updateVisibilityState

Description
Definition
updateVisibilityState()
Code
558function SpeedSliderDisplay:updateVisibilityState()
559 local sliderState = self:getIsSliderActive()
560 if sliderState ~= self.sliderState then
561 self:setSliderState(sliderState, true)
562 end
563end