Script v1_7_1_0
- AI
- Animals
- Collections
- Contracts
- Debug
- Economy
- Elements
- EnvironmentalScore
- Errors
- Events
- GUI
- Handtools
- Hud
- I3d
- Input
- Jobs
- Maps
- Materials
- Misc
- Objects
- Parameters
- Placeables
- Placement
- Player
- Shop
- Sounds
- Specialization
- Specializations
- AIConveyorBelt
- AIDrivable
- AIFieldWorker
- AIImplement
- AIJobVehicle
- AIVehicle
- AIVehicleObstacle
- AnimatedVehicle
- ArticulatedAxis
- Attachable
- AttacherJointControl
- AttacherJoints
- AutoLoader
- BaleGrab
- BaleLoader
- Baler
- BaleWrapper
- BaseMaterial
- BigBag
- BunkerSiloCompacter
- BunkerSiloInteractor
- CCTDrivable
- Combine
- ConnectionHoses
- ConveyorBelt
- Cover
- CrabSteering
- Crawlers
- CropSensor
- Cultivator
- Cutter
- Cylindered
- CylinderedFoldable
- Dashboard
- Dischargeable
- Drivable
- DynamicallyLoadedParts
- DynamicMountAttacher
- Enterable
- ExtendedAIVehicle
- ExtendedCombine
- ExtendedMotorized
- ExtendedMower
- ExtendedSowingMachine
- ExtendedSprayer
- ExtendedWearable
- FertilizingCultivator
- FertilizingSowingMachine
- FillTriggerVehicle
- FillUnit
- FillVolume
- Foldable
- FoliageBending
- ForageWagon
- FrontloaderAttacher
- FruitPreparer
- GroundAdjustedNodes
- GroundReference
- HeadlandAnimation
- Honk
- HookLiftContainer
- HookLiftTrailer
- IKChains
- InlineWrapper
- JigglingParts
- Leveler
- LicensePlates
- Lights
- LivestockTrailer
- Locomotive
- LogGrab
- ManureBarrel
- ManureSensor
- MixerWagon
- Motorized
- Mountable
- Mower
- Mulcher
- MultipleItemPurchase
- Pallet
- Pickup
- Pipe
- PlaceableAI
- PlaceableAnimatedObjects
- PlaceableBeehive
- PlaceableBeehivePalletSpa...
- PlaceableBunkerSilo
- PlaceableBuyingStation
- PlaceableCartridgePlayer
- PlaceableChargingStation
- PlaceableClearAreas
- PlaceableColorable
- PlaceableDeletedNodes
- PlaceableDoghouse
- PlaceableDynamicallyLoade...
- PlaceableFarmhouse
- PlaceableFence
- PlaceableFoliageAreas
- PlaceableGreenhouse
- PlaceableHighPressureWash...
- PlaceableHotspots
- PlaceableHusbandry
- PlaceableHusbandryAnimals
- PlaceableHusbandryFeeding...
- PlaceableHusbandryFence
- PlaceableHusbandryFood
- PlaceableHusbandryLiquidM...
- PlaceableHusbandryMilk
- PlaceableHusbandryPallets
- PlaceableHusbandryStraw
- PlaceableHusbandryWater
- PlaceableIncomePerHour
- PlaceableIndoorAreas
- PlaceableInfoTrigger
- PlaceableLeveling
- PlaceableLights
- PlaceableManureHeap
- PlaceablePlacement
- PlaceableProductionPoint
- PlaceableSellingStation
- PlaceableSilo
- PlaceableSiloExtension
- PlaceableSolarPanels
- PlaceableTipOcclusionArea...
- PlaceableTrainSystem
- PlaceableTriggerMarkers
- PlaceableVine
- PlaceableWardrobe
- PlaceableWeatherStation
- PlaceableWeighingStation
- PlaceableWindTurbine
- PlaceableWorkshop
- Plow
- PlowPacker
- PowerConsumer
- PowerTakeOffs
- PrecisionFarmingStatistic
- PushHandTool
- RandomlyMovingParts
- ReceivingHopper
- ReverseDriving
- Rideable
- RidgeMarker
- Roller
- Ropes
- RTKStation
- SaltSpreader
- SemiTrailerFront
- Shovel
- SlopeCompensation
- SmartAttach
- SoilSampler
- SowingMachine
- SpeedRotatingParts
- SplineVehicle
- Sprayer
- StonePicker
- StrawBlower
- StumpCutter
- SupportVehicle
- Suspensions
- Tedder
- TensionBeltObject
- TensionBelts
- TestAreas
- TipOccluder
- Trailer
- TreePlanter
- TreeSaplingPallet
- TreeSaw
- TurnOnVehicle
- VariableWorkWidth
- VehicleSettings
- VineCutter
- VineDetector
- VinePrepruner
- Washable
- WaterTrailer
- Wearable
- Weeder
- WeedSpotSpray
- Wheels
- WindBending
- Windrower
- Wipers
- WoodCrusher
- WoodHarvester
- WorkArea
- WorkMode
- WorkParticles
- StateMachine
- Statistics
- Tasks
- Triggers
- Utils
- Vehicles
Engine v1_7_1_0
- AI
- Animation
- Camera
- Entity
- Fillplanes
- general
- General
- I3D
- Input
- Lighting
- Math
- Network
- Node
- NoteNode
- Overlays
- Particle System
- Physics
- Rendering
- Scenegraph
- Shape
- Sound
- Spline
- String
- Terrain Detail
- Text Rendering
- Tire Track
- VoiceChat
- XML
Foundation Reference
FruitPreparer
DescriptionSpecialization for tools preparing the fruits for harvesting e.g. potato haulm toppers and sugar beet defoliatorsFunctions
- doCheckSpeedLimit
- getAllowCutterAIFruitRequirements
- getDefaultSpeedLimit
- getDirtMultiplier
- getDoGroundManipulation
- getIsRandomlyMovingPartActive
- getWearMultiplier
- initSpecialization
- loadRandomlyMovingPartFromXML
- loadWorkAreaFromXML
- onDelete
- onEndWorkAreaProcessing
- onLoad
- onReadUpdateStream
- onTurnedOff
- onTurnedOn
- onWriteUpdateStream
- prerequisitesPresent
- processFruitPreparerArea
- registerEventListeners
- registerFunctions
- registerOverwrittenFunctions
doCheckSpeedLimit
DescriptionReturns if speed limit should be checkedDefinition
doCheckSpeedLimit()Return Values
boolean | checkSpeedlimit | check speed limit |
208 | function FruitPreparer:doCheckSpeedLimit(superFunc) |
209 | return superFunc(self) or (self:getIsTurnedOn() and (self.getIsImplementChainLowered == nil or self:getIsImplementChainLowered())) |
210 | end |
getAllowCutterAIFruitRequirements
DescriptionDefinitiongetAllowCutterAIFruitRequirements()Code
214 | function FruitPreparer:getAllowCutterAIFruitRequirements(superFunc) |
215 | return false |
216 | end |
getDefaultSpeedLimit
DescriptionReturns default speed limitDefinition
getDefaultSpeedLimit()Return Values
float | speedLimit | speed limit |
267 | function FruitPreparer.getDefaultSpeedLimit() |
268 | return 15 |
269 | end |
getDirtMultiplier
DescriptionDefinitiongetDirtMultiplier()Code
220 | function FruitPreparer:getDirtMultiplier(superFunc) |
221 | local spec = self.spec_fruitPreparer |
222 | |
223 | if spec.isWorking then |
224 | return superFunc(self) + self:getWorkDirtMultiplier() * self:getLastSpeed() / self.speedLimit |
225 | end |
226 | |
227 | return superFunc(self) |
228 | end |
getDoGroundManipulation
DescriptionReturns if tool does ground manipulationDefinition
getDoGroundManipulation()Return Values
boolean | doGroundManipulation | do ground manipulation |
200 | function FruitPreparer:getDoGroundManipulation(superFunc) |
201 | local spec = self.spec_fruitPreparer |
202 | return superFunc(self) and spec.isWorking |
203 | end |
getIsRandomlyMovingPartActive
DescriptionDefinitiongetIsRandomlyMovingPartActive()Code
254 | function FruitPreparer:getIsRandomlyMovingPartActive(superFunc, part) |
255 | local retValue = superFunc(self, part) |
256 | |
257 | if part.moveOnlyIfPreparerCut then |
258 | retValue = retValue and self.spec_fruitPreparer.isWorking |
259 | end |
260 | |
261 | return retValue |
262 | end |
getWearMultiplier
DescriptionDefinitiongetWearMultiplier()Code
232 | function FruitPreparer:getWearMultiplier(superFunc) |
233 | local spec = self.spec_fruitPreparer |
234 | |
235 | if spec.isWorking then |
236 | return superFunc(self) + self:getWorkWearMultiplier() * self:getLastSpeed() / self.speedLimit |
237 | end |
238 | |
239 | return superFunc(self) |
240 | end |
initSpecialization
DescriptionCalled on specialization initializingDefinition
initSpecialization()Code
15 | function FruitPreparer.initSpecialization() |
16 | g_workAreaTypeManager:addWorkAreaType("fruitPreparer", false) |
17 | |
18 | local schema = Vehicle.xmlSchema |
19 | schema:setXMLSpecializationType("FruitPreparer") |
20 | |
21 | schema:register(XMLValueType.STRING, "vehicle.fruitPreparer#fruitType", "Fruit type") |
22 | schema:register(XMLValueType.BOOL, "vehicle.fruitPreparer#aiUsePreparedState", "AI uses prepared state instead of unprepared state", "true if vehicle has also the Cutter specialization") |
23 | |
24 | schema:register(XMLValueType.INT, WorkArea.WORK_AREA_XML_KEY .. ".fruitPreparer#dropWorkAreaIndex", "Drop area index") |
25 | schema:register(XMLValueType.INT, WorkArea.WORK_AREA_XML_CONFIG_KEY .. ".fruitPreparer#dropWorkAreaIndex", "Drop area index") |
26 | |
27 | AnimationManager.registerAnimationNodesXMLPaths(schema, "vehicle.fruitPreparer.animationNodes") |
28 | SoundManager.registerSampleXMLPaths(schema, "vehicle.fruitPreparer.sounds", "work") |
29 | |
30 | schema:register(XMLValueType.BOOL, RandomlyMovingParts.RANDOMLY_MOVING_PART_XML_KEY .. "#moveOnlyIfPreparerCut", "Move only if fruit preparer cuts something", false) |
31 | |
32 | schema:setXMLSpecializationType() |
33 | end |
loadRandomlyMovingPartFromXML
DescriptionDefinitionloadRandomlyMovingPartFromXML()Code
244 | function FruitPreparer:loadRandomlyMovingPartFromXML(superFunc, part, xmlFile, key) |
245 | local retValue = superFunc(self, part, xmlFile, key) |
246 | |
247 | part.moveOnlyIfPreparerCut = xmlFile:getValue(key .. "#moveOnlyIfPreparerCut", false) |
248 | |
249 | return retValue |
250 | end |
loadWorkAreaFromXML
DescriptionLoads work areas from xmlDefinition
loadWorkAreaFromXML(table workArea, integer xmlFile, string key)Arguments
table | workArea | workArea |
integer | xmlFile | id of xml object |
string | key | key |
boolean | success | success |
183 | function FruitPreparer:loadWorkAreaFromXML(superFunc, workArea, xmlFile, key) |
184 | local retValue = superFunc(self, workArea, xmlFile, key) |
185 | |
186 | if workArea.type == WorkAreaType.FRUITPREPARER then |
187 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, key.."#dropStartIndex", key..".fruitPreparer#dropWorkAreaIndex") -- FS17 to FS19 |
188 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, key.."#dropWidthIndex", key..".fruitPreparer#dropWorkAreaIndex") -- FS17 to FS19 |
189 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, key.."#dropHeightIndex", key..".fruitPreparer#dropWorkAreaIndex") -- FS17 to FS19 |
190 | |
191 | workArea.dropWorkAreaIndex = xmlFile:getValue(key..".fruitPreparer#dropWorkAreaIndex") |
192 | end |
193 | |
194 | return retValue |
195 | end |
onDelete
DescriptionCalled on deletingDefinition
onDelete()Code
125 | function FruitPreparer:onDelete() |
126 | local spec = self.spec_fruitPreparer |
127 | g_soundManager:deleteSamples(spec.samples) |
128 | g_animationManager:deleteAnimations(spec.animationNodes) |
129 | end |
onEndWorkAreaProcessing
DescriptionDefinitiononEndWorkAreaProcessing()Code
273 | function FruitPreparer:onEndWorkAreaProcessing(dt) |
274 | if self.isServer then |
275 | local spec = self.spec_fruitPreparer |
276 | local isWorking = g_time - spec.lastWorkTime < 500 |
277 | if isWorking ~= spec.isWorking then |
278 | self:raiseDirtyFlags(spec.dirtyFlag) |
279 | spec.isWorking = isWorking |
280 | end |
281 | end |
282 | end |
onLoad
DescriptionCalled on loadingDefinition
onLoad(table savegame)Arguments
table | savegame | savegame |
77 | function FruitPreparer:onLoad(savegame) |
78 | local spec = self.spec_fruitPreparer |
79 | |
80 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, "vehicle.turnOnAnimation#name", "vehicle.turnOnVehicle.turnedAnimation#name") -- FS15 to FS17 |
81 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, "vehicle.turnOnAnimation#speed", "vehicle.turnOnVehicle.turnedAnimation#turnOnSpeedScale") -- FS15 to FS17 |
82 | |
83 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, "vehicle.fruitPreparer#useReelStateToTurnOn") -- FS17 to FS19 |
84 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, "vehicle.fruitPreparer#onlyActiveWhenLowered") -- FS17 to FS19 |
85 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, "vehicle.vehicle.fruitPreparerSound", "vehicle.fruitPreparer.sounds.work") -- FS17 to FS19 |
86 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, "vehicle.turnedOnRotationNodes.turnedOnRotationNode", "vehicle.fruitPreparer.animationNodes.animationNode", "fruitPreparer") -- FS17 to FS19 |
87 | |
88 | if self.isClient then |
89 | spec.samples = {} |
90 | spec.samples.work = g_soundManager:loadSampleFromXML(self.xmlFile, "vehicle.fruitPreparer.sounds", "work", self.baseDirectory, self.components, 0, AudioGroup.VEHICLE, self.i3dMappings, self) |
91 | |
92 | spec.animationNodes = g_animationManager:loadAnimations(self.xmlFile, "vehicle.fruitPreparer.animationNodes", self.components, self, self.i3dMappings) |
93 | end |
94 | |
95 | spec.fruitType = FruitType.UNKNOWN |
96 | local fruitType = self.xmlFile:getValue("vehicle.fruitPreparer#fruitType") |
97 | if fruitType ~= nil then |
98 | local desc = g_fruitTypeManager:getFruitTypeByName(fruitType) |
99 | if desc ~= nil then |
100 | spec.fruitType = desc.index |
101 | |
102 | if self.setAIFruitRequirements ~= nil then |
103 | self:setAIFruitRequirements(desc.index, desc.minPreparingGrowthState, desc.maxPreparingGrowthState) |
104 | |
105 | local aiUsePreparedState = self.xmlFile:getValue("vehicle.fruitPreparer#aiUsePreparedState", self.spec_cutter ~= nil) |
106 | if aiUsePreparedState then |
107 | self:addAIFruitRequirement(desc.index, desc.preparedGrowthState, desc.preparedGrowthState) |
108 | end |
109 | end |
110 | else |
111 | Logging.xmlWarning(self.xmlFile, "Unable to find fruitType '%s' in fruitPreparer", fruitType) |
112 | end |
113 | else |
114 | Logging.xmlWarning(self.xmlFile, "Missing fruitType in fruitPreparer") |
115 | end |
116 | |
117 | spec.isWorking = false |
118 | spec.lastWorkTime = -math.huge |
119 | |
120 | spec.dirtyFlag = self:getNextDirtyFlag() |
121 | end |
onReadUpdateStream
DescriptionCalled on on updateDefinition
onReadUpdateStream(integer streamId, integer timestamp, table connection)Arguments
integer | streamId | stream ID |
integer | timestamp | timestamp |
table | connection | connection |
136 | function FruitPreparer:onReadUpdateStream(streamId, timestamp, connection) |
137 | if connection:getIsServer() then |
138 | local spec = self.spec_fruitPreparer |
139 | spec.isWorking = streamReadBool(streamId) |
140 | end |
141 | end |
onTurnedOff
DescriptionCalled on turn offDefinition
onTurnedOff(boolean noEventSend)Arguments
boolean | noEventSend | no event send |
169 | function FruitPreparer:onTurnedOff() |
170 | if self.isClient then |
171 | local spec = self.spec_fruitPreparer |
172 | g_soundManager:stopSamples(spec.samples) |
173 | g_animationManager:stopAnimations(spec.animationNodes) |
174 | end |
175 | end |
onTurnedOn
DescriptionCalled on turn onDefinition
onTurnedOn(boolean noEventSend)Arguments
boolean | noEventSend | no event send |
158 | function FruitPreparer:onTurnedOn() |
159 | if self.isClient then |
160 | local spec = self.spec_fruitPreparer |
161 | g_soundManager:playSample(spec.samples.work) |
162 | g_animationManager:startAnimations(spec.animationNodes) |
163 | end |
164 | end |
onWriteUpdateStream
DescriptionCalled on on updateDefinition
onWriteUpdateStream(integer streamId, table connection, integer dirtyMask)Arguments
integer | streamId | stream ID |
table | connection | connection |
integer | dirtyMask | dirty mask |
148 | function FruitPreparer:onWriteUpdateStream(streamId, connection, dirtyMask) |
149 | if not connection:getIsServer() then |
150 | local spec = self.spec_fruitPreparer |
151 | streamWriteBool(streamId, spec.isWorking) |
152 | end |
153 | end |
prerequisitesPresent
DescriptionChecks if all prerequisite specializations are loadedDefinition
prerequisitesPresent(table specializations)Arguments
table | specializations | specializations |
boolean | hasPrerequisite | true if all prerequisite specializations are loaded |
39 | function FruitPreparer.prerequisitesPresent(specializations) |
40 | return SpecializationUtil.hasSpecialization(WorkArea, specializations) and SpecializationUtil.hasSpecialization(TurnOnVehicle, specializations) |
41 | end |
processFruitPreparerArea
DescriptionDefinitionprocessFruitPreparerArea()Code
286 | function FruitPreparer:processFruitPreparerArea(workArea) |
287 | local spec = self.spec_fruitPreparer |
288 | local workAreaSpec = self.spec_workArea |
289 | |
290 | local xs,_,zs = getWorldTranslation(workArea.start) |
291 | local xw,_,zw = getWorldTranslation(workArea.width) |
292 | local xh,_,zh = getWorldTranslation(workArea.height) |
293 | |
294 | local dxs, dzs = xs, zs |
295 | local dxw, dzw = xw, zw |
296 | local dxh, dzh = xh, zh |
297 | |
298 | if workArea.dropWorkAreaIndex ~= nil then |
299 | local dropArea = workAreaSpec.workAreas[workArea.dropWorkAreaIndex] |
300 | if dropArea ~= nil then |
301 | dxs, _, dzs = getWorldTranslation(dropArea.start) |
302 | dxw, _, dzw = getWorldTranslation(dropArea.width) |
303 | dxh, _, dzh = getWorldTranslation(dropArea.height) |
304 | end |
305 | end |
306 | |
307 | local area = FSDensityMapUtil.updateFruitPreparerArea(spec.fruitType, xs,zs, xw,zw, xh,zh, dxs,dzs, dxw,dzw, dxh,dzh) |
308 | if area > 0 then |
309 | spec.lastWorkTime = g_time |
310 | end |
311 | |
312 | return 0, area |
313 | end |
registerEventListeners
DescriptionDefinitionregisterEventListeners()Code
64 | function FruitPreparer.registerEventListeners(vehicleType) |
65 | SpecializationUtil.registerEventListener(vehicleType, "onLoad", FruitPreparer) |
66 | SpecializationUtil.registerEventListener(vehicleType, "onDelete", FruitPreparer) |
67 | SpecializationUtil.registerEventListener(vehicleType, "onReadUpdateStream", FruitPreparer) |
68 | SpecializationUtil.registerEventListener(vehicleType, "onWriteUpdateStream", FruitPreparer) |
69 | SpecializationUtil.registerEventListener(vehicleType, "onTurnedOn", FruitPreparer) |
70 | SpecializationUtil.registerEventListener(vehicleType, "onTurnedOff", FruitPreparer) |
71 | SpecializationUtil.registerEventListener(vehicleType, "onEndWorkAreaProcessing", FruitPreparer) |
72 | end |
registerFunctions
DescriptionDefinitionregisterFunctions()Code
45 | function FruitPreparer.registerFunctions(vehicleType) |
46 | SpecializationUtil.registerFunction(vehicleType, "processFruitPreparerArea", FruitPreparer.processFruitPreparerArea) |
47 | end |
registerOverwrittenFunctions
DescriptionDefinitionregisterOverwrittenFunctions()Code
51 | function FruitPreparer.registerOverwrittenFunctions(vehicleType) |
52 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "loadWorkAreaFromXML", FruitPreparer.loadWorkAreaFromXML) |
53 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getDoGroundManipulation", FruitPreparer.getDoGroundManipulation) |
54 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "doCheckSpeedLimit", FruitPreparer.doCheckSpeedLimit) |
55 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getAllowCutterAIFruitRequirements", FruitPreparer.getAllowCutterAIFruitRequirements) |
56 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getDirtMultiplier", FruitPreparer.getDirtMultiplier) |
57 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getWearMultiplier", FruitPreparer.getWearMultiplier) |
58 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "loadRandomlyMovingPartFromXML", FruitPreparer.loadRandomlyMovingPartFromXML) |
59 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getIsRandomlyMovingPartActive", FruitPreparer.getIsRandomlyMovingPartActive) |
60 | end |