Script v1.7.1.0
- AI
- Animals
- Contracts
- Debug
- Economy
- Effects
- Events
- Farms
- GUI
- Handtools
- I3d
- Materials
- Misc
- Objects
- Placeables
- Player
- Shop
- Sounds
- Specializations
- AIConveyorBelt
- AIImplement
- AIVehicle
- AnimatedVehicle
- ArticulatedAxis
- Attachable
- AttacherJointControl
- AttacherJoints
- BaleGrab
- BaleLoader
- Baler
- BaleWrapper
- BaseMaterial
- BunkerSiloCompacter
- BunkerSiloInteractor
- BuyableBale
- CCTDrivable
- Combine
- ConnectionHoses
- ConveyorBelt
- Cover
- CrabSteering
- Crawlers
- Cultivator
- Cutter
- Cylindered
- CylinderedFoldable
- Dashboard
- Dischargeable
- Drivable
- DynamicallyLoadedParts
- DynamicMountAttacher
- Enterable
- FertilizingCultivator
- FertilizingSowingMachine
- FillTriggerVehicle
- FillUnit
- FillVolume
- Foldable
- FoliageBending
- ForageWagon
- FrontloaderAttacher
- FruitPreparer
- GroundAdjustedNodes
- GroundReference
- Honk
- HookLiftContainer
- HookLiftTrailer
- IKChains
- JigglingParts
- Leveler
- Lights
- LivestockTrailer
- Locomotive
- LogGrab
- ManureBarrel
- MixerWagon
- Motorized
- Mountable
- Mower
- Pickup
- Pipe
- Plow
- PowerConsumer
- PowerTakeOffs
- RandomlyMovingParts
- ReceivingHopper
- ReverseDriving
- Rideable
- RidgeMarker
- Roller
- Ropes
- SemiTrailerFront
- Shovel
- SlopeCompensation
- SmartAttach
- SowingMachine
- SpeedRotatingParts
- SplineVehicle
- Sprayer
- StrawBlower
- StumpCutter
- Suspensions
- Tedder
- TensionBeltObject
- TensionBelts
- TipOccluder
- Trailer
- TreePlanter
- TreeSaw
- TurnOnVehicle
- Washable
- WaterTrailer
- Wearable
- Weeder
- Wheels
- Windrower
- Wipers
- WoodCrusher
- WoodHarvester
- WorkArea
- WorkMode
- WorkParticles
- Triggers
- Utils
- Vehicles
- Weather
Engine v1.7.1.0
- AI
- Animation
- Camera
- Entity
- Fillplanes
- General
- I3D
- Input
- Lighting
- Math
- Network
- Node
- Overlays
- Particle System
- Physics
- Rendering
- Scenegraph
- Shape
- Sound
- Spline
- String
- Terrain Detail
- Text Rendering
- Tire Track
- XML
- general
Foundation Reference
ForageWagon
DescriptionSpecialization for a forage wagon, expands functions of FillUnit, Pickup and WorkArea by adding a fillEffectFunctions
- doCheckSpeedLimit
- getConsumingLoad
- getDefaultSpeedLimit
- getIsSpeedRotatingPartActive
- getIsWorkAreaActive
- initSpecialization
- loadSpeedRotatingPartFromXML
- onDeactivate
- onDelete
- onEndWorkAreaProcessing
- onLoad
- onReadStream
- onReadUpdateStream
- onStartWorkAreaProcessing
- onTurnedOff
- onUpdateTick
- onWriteStream
- onWriteUpdateStream
- prerequisitesPresent
- processForageWagonArea
- registerEventListeners
- registerFunctions
- registerOverwrittenFunctions
- setFillEffectActive
doCheckSpeedLimit
DescriptionDefinitiondoCheckSpeedLimit()Code
268 | function ForageWagon:doCheckSpeedLimit(superFunc) |
269 | return superFunc(self) or (self:getIsTurnedOn() and self:getIsLowered()) |
270 | end |
getConsumingLoad
DescriptionDefinitiongetConsumingLoad()Code
274 | function 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 |
281 | end |
getDefaultSpeedLimit
DescriptionDefinitiongetDefaultSpeedLimit()Code
340 | function ForageWagon.getDefaultSpeedLimit() |
341 | return 20 |
342 | end |
getIsSpeedRotatingPartActive
DescriptionDefinitiongetIsSpeedRotatingPartActive()Code
239 | function 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) |
249 | end |
getIsWorkAreaActive
DescriptionDefinitiongetIsWorkAreaActive()Code
253 | function 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) |
264 | end |
initSpecialization
DescriptionDefinitioninitSpecialization()Code
15 | function ForageWagon.initSpecialization() |
16 | g_workAreaTypeManager:addWorkAreaType("forageWagon", false) |
17 | end |
loadSpeedRotatingPartFromXML
DescriptionDefinitionloadSpeedRotatingPartFromXML()Code
227 | function 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 |
235 | end |
onDeactivate
DescriptionDefinitiononDeactivate()Code
330 | function ForageWagon:onDeactivate() |
331 | if self.isClient then |
332 | local spec = self.spec_forageWagon |
333 | spec.fillTimer = 0 |
334 | self:setFillEffectActive(false) |
335 | end |
336 | end |
onDelete
DescriptionDefinitiononDelete()Code
94 | function 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 |
102 | end |
onEndWorkAreaProcessing
DescriptionDefinitiononEndWorkAreaProcessing()Code
299 | function 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 |
315 | end |
onLoad
DescriptionDefinitiononLoad()Code
64 | function 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() |
90 | end |
onReadStream
DescriptionDefinitiononReadStream()Code
106 | function ForageWagon:onReadStream(streamId, connection) |
107 | local spec = self.spec_forageWagon |
108 | spec.isFilling = streamReadBool(streamId) |
109 | self:setFillEffectActive(spec.isFilling) |
110 | end |
onReadUpdateStream
DescriptionDefinitiononReadUpdateStream()Code
121 | function 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 |
127 | end |
onStartWorkAreaProcessing
DescriptionDefinitiononStartWorkAreaProcessing()Code
285 | function 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 |
295 | end |
onTurnedOff
DescriptionDefinitiononTurnedOff()Code
319 | function ForageWagon:onTurnedOff() |
320 | local spec = self.spec_forageWagon |
321 | |
322 | if self.isClient then |
323 | spec.fillTimer = 0 |
324 | self:setFillEffectActive(false) |
325 | end |
326 | end |
onUpdateTick
DescriptionDefinitiononUpdateTick()Code
140 | function 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 |
159 | end |
onWriteStream
DescriptionDefinitiononWriteStream()Code
114 | function ForageWagon:onWriteStream(streamId, connection) |
115 | local spec = self.spec_forageWagon |
116 | streamWriteBool(streamId, spec.isFillingSent) |
117 | end |
onWriteUpdateStream
DescriptionDefinitiononWriteUpdateStream()Code
131 | function ForageWagon:onWriteUpdateStream(streamId, connection, dirtyMask) |
132 | if not connection:getIsServer() then |
133 | local spec = self.spec_forageWagon |
134 | streamWriteBool(streamId, spec.isFillingSent) |
135 | end |
136 | end |
prerequisitesPresent
DescriptionDefinitionprerequisitesPresent()Code
21 | function 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) |
26 | end |
processForageWagonArea
DescriptionDefinitionprocessForageWagonArea()Code
163 | function 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 |
206 | end |
registerEventListeners
DescriptionDefinitionregisterEventListeners()Code
47 | function 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) |
59 | end |
registerFunctions
DescriptionDefinitionregisterFunctions()Code
30 | function ForageWagon.registerFunctions(vehicleType) |
31 | SpecializationUtil.registerFunction(vehicleType, "processForageWagonArea", ForageWagon.processForageWagonArea) |
32 | SpecializationUtil.registerFunction(vehicleType, "setFillEffectActive", ForageWagon.setFillEffectActive) |
33 | end |
registerOverwrittenFunctions
DescriptionDefinitionregisterOverwrittenFunctions()Code
37 | function 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) |
43 | end |
setFillEffectActive
DescriptionDefinitionsetFillEffectActive()Code
210 | function 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 |
223 | end |