LUADOC - Farming Simulator 19

Script v1.7.1.0

Engine v1.7.1.0

Foundation Reference

ForageWagon

Description
Specialization for a forage wagon, expands functions of FillUnit, Pickup and WorkArea by adding a fillEffect
Functions

doCheckSpeedLimit

Description
Definition
doCheckSpeedLimit()
Code
268function ForageWagon:doCheckSpeedLimit(superFunc)
269 return superFunc(self) or (self:getIsTurnedOn() and self:getIsLowered())
270end

getConsumingLoad

Description
Definition
getConsumingLoad()
Code
274function ForageWagon:getConsumingLoad(superFunc)
275 local value, count = superFunc(self)
276
277 local spec = self.spec_forageWagon
278 local loadPercentage = spec.pickUpLitersBuffer:get(1000) / spec.maxPickupLitersPerSecond
279
280 return value+loadPercentage, count+1
281end

getDefaultSpeedLimit

Description
Definition
getDefaultSpeedLimit()
Code
340function ForageWagon.getDefaultSpeedLimit()
341 return 20
342end

getIsSpeedRotatingPartActive

Description
Definition
getIsSpeedRotatingPartActive()
Code
239function ForageWagon:getIsSpeedRotatingPartActive(superFunc, speedRotatingPart)
240 local spec = self.spec_forageWagon
241
242 if speedRotatingPart.rotateOnlyIfFillLevelIncreased ~= nil then
243 if speedRotatingPart.rotateOnlyIfFillLevelIncreased and not spec.isFilling then
244 return false
245 end
246 end
247
248 return superFunc(self, speedRotatingPart)
249end

getIsWorkAreaActive

Description
Definition
getIsWorkAreaActive()
Code
253function ForageWagon:getIsWorkAreaActive(superFunc, workArea)
254 local spec = self.spec_forageWagon
255
256 local forageWagonArea = self.spec_workArea.workAreas[spec.workAreaIndex]
257 if forageWagonArea ~= nil and workArea == forageWagonArea then
258 if not self:getIsTurnedOn() or not self:allowPickingUp() then
259 return false
260 end
261 end
262
263 return superFunc(self, workArea)
264end

initSpecialization

Description
Definition
initSpecialization()
Code
15function ForageWagon.initSpecialization()
16 g_workAreaTypeManager:addWorkAreaType("forageWagon", false)
17end

loadSpeedRotatingPartFromXML

Description
Definition
loadSpeedRotatingPartFromXML()
Code
227function ForageWagon:loadSpeedRotatingPartFromXML(superFunc, speedRotatingPart, xmlFile, key)
228 if not superFunc(self, speedRotatingPart, xmlFile, key) then
229 return false
230 end
231
232 speedRotatingPart.rotateOnlyIfFillLevelIncreased = Utils.getNoNil(getXMLBool(xmlFile, key .. "#rotateOnlyIfFillLevelIncreased"), false)
233
234 return true
235end

onDeactivate

Description
Definition
onDeactivate()
Code
330function ForageWagon:onDeactivate()
331 if self.isClient then
332 local spec = self.spec_forageWagon
333 spec.fillTimer = 0
334 self:setFillEffectActive(false)
335 end
336end

onDelete

Description
Definition
onDelete()
Code
94function ForageWagon:onDelete()
95 if self.isClient then
96 local spec = self.spec_forageWagon
97
98 if spec.fillEffects ~= nil then
99 g_effectManager:deleteEffects(spec.fillEffects)
100 end
101 end
102end

onEndWorkAreaProcessing

Description
Definition
onEndWorkAreaProcessing()
Code
299function ForageWagon:onEndWorkAreaProcessing(dt, hasProcessed)
300 local spec = self.spec_forageWagon
301
302 if self.isServer then
303 if spec.workAreaParameters.lastPickupLiters > 0 then
304 local loadInfo = self:getFillVolumeLoadInfo(spec.loadInfoIndex)
305 local filledLiters = self:addFillUnitFillLevel(self:getOwnerFarmId(), spec.fillUnitIndex, spec.workAreaParameters.lastPickupLiters, spec.workAreaParameters.forcedFillType, ToolType.UNDEFINED, loadInfo)
306
307 if filledLiters + 0.01 < spec.workAreaParameters.lastPickupLiters then
308 self:setIsTurnedOn(false)
309 self:setPickupState(false)
310 end
311
312 spec.fillTimer = 500
313 end
314 end
315end

onLoad

Description
Definition
onLoad()
Code
64function ForageWagon:onLoad(savegame)
65 local spec = self.spec_forageWagon
66
67 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.forageWagon#turnedOnTipScrollerSpeedFactor") -- FS17 to FS19
68 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.turnedOnRotationNodes.turnedOnRotationNode#type", "vehicle.turnOnVehicle.rotationNodes.rotationNode", "forageWagon") -- FS17 to FS19
69
70 spec.isFilling = false
71 spec.isFillingSent = false
72 spec.fillTimer = 0
73
74 spec.workAreaIndex = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.forageWagon#workAreaIndex"), 1)
75 spec.fillUnitIndex = Utils.getNoNil(getXMLInt(self.xmlFile, "vehicle.forageWagon#fillUnitIndex"), 1)
76 spec.loadInfoIndex = Utils.getNoNil(getXMLInt(self.xmlFile, "vehicle.forageWagon#loadInfoIndex"), 1)
77
78 spec.maxPickupLitersPerSecond = Utils.getNoNil(getXMLInt(self.xmlFile, "vehicle.forageWagon#maxPickupLitersPerSecond"), 500)
79
80 if self.isClient then
81 spec.fillEffects = g_effectManager:loadEffect(self.xmlFile, "vehicle.forageWagon.fillEffect", self.components, self, self.i3dMappings)
82 end
83
84 spec.workAreaParameters = {}
85 spec.workAreaParameters.forcedFillType = FillType.UNKNOWN
86
87 spec.pickUpLitersBuffer = ValueBuffer:new(750)
88
89 spec.dirtyFlag = self:getNextDirtyFlag()
90end

onReadStream

Description
Definition
onReadStream()
Code
106function ForageWagon:onReadStream(streamId, connection)
107 local spec = self.spec_forageWagon
108 spec.isFilling = streamReadBool(streamId)
109 self:setFillEffectActive(spec.isFilling)
110end

onReadUpdateStream

Description
Definition
onReadUpdateStream()
Code
121function ForageWagon:onReadUpdateStream(streamId, timestamp, connection)
122 if connection:getIsServer() then
123 local spec = self.spec_forageWagon
124 spec.isFilling = streamReadBool(streamId)
125 self:setFillEffectActive(spec.isFilling)
126 end
127end

onStartWorkAreaProcessing

Description
Definition
onStartWorkAreaProcessing()
Code
285function ForageWagon:onStartWorkAreaProcessing(dt)
286 local spec = self.spec_forageWagon
287
288 spec.workAreaParameters.forcedFillType = FillType.UNKNOWN
289 local fillLevel = self:getFillUnitFillLevel(spec.fillUnitIndex)
290 if fillLevel > self:getFillTypeChangeThreshold(spec.fillUnitIndex) then
291 spec.workAreaParameters.forcedFillType = self:getFillUnitFillType(spec.fillUnitIndex)
292 end
293
294 spec.workAreaParameters.lastPickupLiters = 0
295end

onTurnedOff

Description
Definition
onTurnedOff()
Code
319function ForageWagon:onTurnedOff()
320 local spec = self.spec_forageWagon
321
322 if self.isClient then
323 spec.fillTimer = 0
324 self:setFillEffectActive(false)
325 end
326end

onUpdateTick

Description
Definition
onUpdateTick()
Code
140function ForageWagon:onUpdateTick(dt, isActiveForInput, isActiveForInputIgnoreSelection, isSelected)
141 local spec = self.spec_forageWagon
142
143 if self.isServer then
144 local isFilling = false
145 if spec.fillTimer > 0 then
146 spec.fillTimer = spec.fillTimer - dt
147 isFilling = true
148 end
149 spec.isFilling = isFilling
150
151 if spec.isFilling ~= spec.isFillingSent then
152 self:raiseDirtyFlags(spec.dirtyFlag)
153 spec.isFillingSent = spec.isFilling
154 self:setFillEffectActive(spec.isFilling)
155 end
156
157 spec.pickUpLitersBuffer:add(spec.workAreaParameters.lastPickupLiters)
158 end
159end

onWriteStream

Description
Definition
onWriteStream()
Code
114function ForageWagon:onWriteStream(streamId, connection)
115 local spec = self.spec_forageWagon
116 streamWriteBool(streamId, spec.isFillingSent)
117end

onWriteUpdateStream

Description
Definition
onWriteUpdateStream()
Code
131function ForageWagon:onWriteUpdateStream(streamId, connection, dirtyMask)
132 if not connection:getIsServer() then
133 local spec = self.spec_forageWagon
134 streamWriteBool(streamId, spec.isFillingSent)
135 end
136end

prerequisitesPresent

Description
Definition
prerequisitesPresent()
Code
21function ForageWagon.prerequisitesPresent(specializations)
22 return SpecializationUtil.hasSpecialization(FillUnit, specializations) and
23 SpecializationUtil.hasSpecialization(TurnOnVehicle, specializations) and
24 SpecializationUtil.hasSpecialization(Pickup, specializations) and
25 SpecializationUtil.hasSpecialization(WorkArea, specializations)
26end

processForageWagonArea

Description
Definition
processForageWagonArea()
Code
163function ForageWagon:processForageWagonArea(workArea)
164 local spec = self.spec_forageWagon
165
166 local radius = 0.5
167 local lsx, lsy, lsz, lex, ley, lez = DensityMapHeightUtil.getLineByArea(workArea.start, workArea.width, workArea.height)
168 local pickupLiters = 0
169
170 if spec.workAreaParameters.forcedFillType ~= FillType.UNKNOWN then
171 pickupLiters = -DensityMapHeightUtil.tipToGroundAroundLine(self, -math.huge, spec.workAreaParameters.forcedFillType, lsx,lsy,lsz, lex,ley,lez, radius, nil, nil, false, nil)
172
173 if spec.workAreaParameters.forcedFillType == g_fruitTypeManager:getWindrowFillTypeIndexByFruitTypeIndex(FruitType.GRASS) then
174 pickupLiters = pickupLiters - DensityMapHeightUtil.tipToGroundAroundLine(self, -math.huge, g_fruitTypeManager:getWindrowFillTypeIndexByFruitTypeIndex(FruitType.DRYGRASS), lsx,lsy,lsz, lex,ley,lez, radius, nil, nil, false, nil)
175 elseif spec.workAreaParameters.forcedFillType == g_fruitTypeManager:getWindrowFillTypeIndexByFruitTypeIndex(FruitType.DRYGRASS) then
176 pickupLiters = pickupLiters - DensityMapHeightUtil.tipToGroundAroundLine(self, -math.huge, g_fruitTypeManager:getWindrowFillTypeIndexByFruitTypeIndex(FruitType.GRASS), lsx,lsy,lsz, lex,ley,lez, radius, nil, nil, false, nil)
177 end
178 else
179 local supportedFillTypes = self:getFillUnitSupportedFillTypes(spec.fillUnitIndex)
180 if supportedFillTypes ~= nil then
181 for fillType,state in pairs(supportedFillTypes) do
182 if state then
183 pickupLiters = -DensityMapHeightUtil.tipToGroundAroundLine(self, -math.huge, fillType, lsx,lsy,lsz, lex,ley,lez, radius, nil, nil, false, nil)
184 if pickupLiters > 0 then
185 spec.workAreaParameters.forcedFillType = fillType
186 break
187 end
188 end
189 end
190 end
191 end
192
193 workArea.lastPickUpLiters = pickupLiters
194 workArea.pickupParticlesActive = pickupLiters > 0
195 spec.workAreaParameters.lastPickupLiters = spec.workAreaParameters.lastPickupLiters + pickupLiters
196
197 local realArea, area = 0, 0
198
199 if self.movingDirection == 1 then
200 local width = MathUtil.vector3Length(lsx-lex, lsy-ley, lsz-lez)
201 area = width * self.lastMovedDistance
202 realArea = area
203 end
204
205 return realArea, area
206end

registerEventListeners

Description
Definition
registerEventListeners()
Code
47function ForageWagon.registerEventListeners(vehicleType)
48 SpecializationUtil.registerEventListener(vehicleType, "onLoad", ForageWagon)
49 SpecializationUtil.registerEventListener(vehicleType, "onDelete", ForageWagon)
50 SpecializationUtil.registerEventListener(vehicleType, "onReadStream", ForageWagon)
51 SpecializationUtil.registerEventListener(vehicleType, "onWriteStream", ForageWagon)
52 SpecializationUtil.registerEventListener(vehicleType, "onReadUpdateStream", ForageWagon)
53 SpecializationUtil.registerEventListener(vehicleType, "onWriteUpdateStream", ForageWagon)
54 SpecializationUtil.registerEventListener(vehicleType, "onUpdateTick", ForageWagon)
55 SpecializationUtil.registerEventListener(vehicleType, "onStartWorkAreaProcessing", ForageWagon)
56 SpecializationUtil.registerEventListener(vehicleType, "onEndWorkAreaProcessing", ForageWagon)
57 SpecializationUtil.registerEventListener(vehicleType, "onTurnedOff", ForageWagon)
58 SpecializationUtil.registerEventListener(vehicleType, "onDeactivate", ForageWagon)
59end

registerFunctions

Description
Definition
registerFunctions()
Code
30function ForageWagon.registerFunctions(vehicleType)
31 SpecializationUtil.registerFunction(vehicleType, "processForageWagonArea", ForageWagon.processForageWagonArea)
32 SpecializationUtil.registerFunction(vehicleType, "setFillEffectActive", ForageWagon.setFillEffectActive)
33end

registerOverwrittenFunctions

Description
Definition
registerOverwrittenFunctions()
Code
37function ForageWagon.registerOverwrittenFunctions(vehicleType)
38 SpecializationUtil.registerOverwrittenFunction(vehicleType, "loadSpeedRotatingPartFromXML", ForageWagon.loadSpeedRotatingPartFromXML)
39 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getIsWorkAreaActive", ForageWagon.getIsWorkAreaActive)
40 SpecializationUtil.registerOverwrittenFunction(vehicleType, "doCheckSpeedLimit", ForageWagon.doCheckSpeedLimit)
41 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getConsumingLoad", ForageWagon.getConsumingLoad)
42 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getIsSpeedRotatingPartActive", ForageWagon.getIsSpeedRotatingPartActive)
43end

setFillEffectActive

Description
Definition
setFillEffectActive()
Code
210function ForageWagon:setFillEffectActive(isActive)
211 local spec = self.spec_forageWagon
212 if isActive then
213 local lastValidFillType = self:getFillUnitLastValidFillType(spec.fillUnitIndex)
214 if spec.fillEffects ~= nil then
215 g_effectManager:setFillType(spec.fillEffects, lastValidFillType)
216 g_effectManager:startEffects(spec.fillEffects)
217 end
218 else
219 if spec.fillEffects ~= nil then
220 g_effectManager:stopEffects(spec.fillEffects)
221 end
222 end
223end