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
AIImplement
DescriptionSpecialization for extending implements with AI functionalityFunctions
- addAIFruitProhibitions
- addAIFruitRequirement
- addAITerrainDetailProhibitedRange
- addAITerrainDetailRequiredRange
- addVehicleToAIImplementList
- aiImplementEndLine
- aiImplementStartLine
- clearAIFruitProhibitions
- clearAIFruitRequirements
- clearAITerrainDetailProhibitedRange
- clearAITerrainDetailRequiredRange
- createFieldCropsQuery
- getAIAllowTurnBackward
- getAIBlockTurnBackward
- getAIFruitExtraRequirements
- getAIFruitProhibitions
- getAIFruitRequirements
- getAIHasNoFullCoverageArea
- getAIImplementCollisionTriggers
- getAIInvertMarkersOnTurn
- getAILookAheadSize
- getAILowerIfAnyIsLowered
- getAIMarkers
- getAIMinTurningRadius
- getAINeedsLowering
- getAISizeMarkers
- getAITerrainDetailProhibitedRange
- getAITerrainDetailRequiredRange
- getAIToolReverserDirectionNode
- getAITurnRadiusLimitation
- getAllowTireTracks
- getCanAIImplementContinueWork
- getCanImplementBeUsedForAI
- getDoConsumePtoPower
- getFieldCropsQuery
- getIsAIImplementInLine
- onLoad
- onPostLoad
- prerequisitesPresent
- registerEventListeners
- registerEvents
- registerFunctions
- registerOverwrittenFunctions
- setAIFruitExtraRequirements
- setAIFruitProhibitions
- setAIFruitRequirements
- setAIMarkersInverted
- updateFieldCropsQuery
addAIFruitProhibitions
DescriptionDefinitionaddAIFruitProhibitions()Code
416 | function AIImplement:addAIFruitProhibitions(fruitType, minGrowthState, maxGrowthState) |
417 | local spec = self.spec_aiImplement |
418 | |
419 | table.insert(spec.prohibitedFruitTypes, {fruitType=fruitType or 0, |
420 | minGrowthState=minGrowthState or 0, |
421 | maxGrowthState=maxGrowthState or 0}) |
422 | self:updateFieldCropsQuery() |
423 | end |
addAIFruitRequirement
DescriptionDefinitionaddAIFruitRequirement()Code
381 | function AIImplement:addAIFruitRequirement(fruitType, minGrowthState, maxGrowthState) |
382 | local spec = self.spec_aiImplement |
383 | |
384 | table.insert(spec.requiredFruitTypes, {fruitType=fruitType or 0, |
385 | minGrowthState=minGrowthState or 0, |
386 | maxGrowthState=maxGrowthState or 0}) |
387 | self:updateFieldCropsQuery() |
388 | end |
addAITerrainDetailProhibitedRange
DescriptionDefinitionaddAITerrainDetailProhibitedRange()Code
477 | function AIImplement:addAITerrainDetailProhibitedRange(detailType1, detailType2, minState, maxState) |
478 | table.insert(self.spec_aiImplement.terrainDetailProhibitedValueRanges, {detailType1, detailType2, minState, maxState}) |
479 | self:updateFieldCropsQuery() |
480 | end |
addAITerrainDetailRequiredRange
DescriptionDefinitionaddAITerrainDetailRequiredRange()Code
444 | function AIImplement:addAITerrainDetailRequiredRange(detailType1, detailType2, minState, maxState) |
445 | table.insert(self.spec_aiImplement.terrainDetailRequiredValueRanges, {detailType1, detailType2, minState, maxState}) |
446 | self:updateFieldCropsQuery() |
447 | end |
addVehicleToAIImplementList
DescriptionDefinitionaddVehicleToAIImplementList()Code
220 | function AIImplement:addVehicleToAIImplementList(superFunc, list) |
221 | if self:getCanImplementBeUsedForAI() then |
222 | table.insert(list, {object=self}) |
223 | end |
224 | |
225 | superFunc(self, list) |
226 | end |
aiImplementEndLine
DescriptionDefinitionaiImplementEndLine()Code
591 | function AIImplement:aiImplementEndLine() |
592 | self.spec_aiImplement.isLineStarted = false |
593 | SpecializationUtil.raiseEvent(self, "onAIImplementEndLine") |
594 | end |
aiImplementStartLine
DescriptionDefinitionaiImplementStartLine()Code
584 | function AIImplement:aiImplementStartLine() |
585 | self.spec_aiImplement.isLineStarted = true |
586 | SpecializationUtil.raiseEvent(self, "onAIImplementStartLine") |
587 | end |
clearAIFruitProhibitions
DescriptionDefinitionclearAIFruitProhibitions()Code
427 | function AIImplement:clearAIFruitProhibitions() |
428 | local spec = self.spec_aiImplement |
429 | if #spec.prohibitedFruitTypes > 0 then |
430 | spec.prohibitedFruitTypes = {} |
431 | end |
432 | self:updateFieldCropsQuery() |
433 | end |
clearAIFruitRequirements
DescriptionDefinitionclearAIFruitRequirements()Code
392 | function AIImplement:clearAIFruitRequirements() |
393 | local spec = self.spec_aiImplement |
394 | if #spec.requiredFruitTypes > 0 then |
395 | spec.requiredFruitTypes = {} |
396 | end |
397 | self:updateFieldCropsQuery() |
398 | end |
clearAITerrainDetailProhibitedRange
DescriptionDefinitionclearAITerrainDetailProhibitedRange()Code
484 | function AIImplement:clearAITerrainDetailProhibitedRange() |
485 | self.spec_aiImplement.terrainDetailProhibitedValueRanges = {} |
486 | self:updateFieldCropsQuery() |
487 | end |
clearAITerrainDetailRequiredRange
DescriptionDefinitionclearAITerrainDetailRequiredRange()Code
451 | function AIImplement:clearAITerrainDetailRequiredRange() |
452 | self.spec_aiImplement.terrainDetailRequiredValueRanges = {} |
453 | self:updateFieldCropsQuery() |
454 | end |
createFieldCropsQuery
DescriptionCreates field crops queryDefinition
createFieldCropsQuery()Code
527 | function AIImplement:createFieldCropsQuery() |
528 | local spec = self.spec_aiImplement |
529 | local query = FieldCropsQuery:new(g_currentMission.terrainDetailId) |
530 | local _, useWindrowFruitType = self:getAIFruitExtraRequirements() |
531 | |
532 | local fruitRequirements = self:getAIFruitRequirements() |
533 | |
534 | for i=1, #fruitRequirements do |
535 | local fruitRequirement = fruitRequirements[i] |
536 | if fruitRequirement.fruitType ~= FruitType.UNKNOWN then |
537 | local ids = g_currentMission.fruits[fruitRequirement.fruitType] |
538 | if ids ~= nil and ids.id ~= 0 then |
539 | if useWindrowFruitType then |
540 | return 0, 1 |
541 | end |
542 | |
543 | local desc = g_fruitTypeManager:getFruitTypeByIndex(fruitRequirement.fruitType) |
544 | query:addRequiredCropType(ids.id, fruitRequirement.minGrowthState+1, fruitRequirement.maxGrowthState+1, desc.startStateChannel, desc.numStateChannels, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels) |
545 | end |
546 | end |
547 | end |
548 | |
549 | local fruitProhibitions = self:getAIFruitProhibitions() |
550 | for i=1, #fruitProhibitions do |
551 | local fruitProhibition = fruitProhibitions[i] |
552 | if fruitProhibition.fruitType ~= FruitType.UNKNOWN then |
553 | local ids = g_currentMission.fruits[fruitProhibition.fruitType] |
554 | if ids ~= nil and ids.id ~= 0 then |
555 | local desc = g_fruitTypeManager:getFruitTypeByIndex(fruitProhibition.fruitType) |
556 | query:addProhibitedCropType(ids.id, fruitProhibition.minGrowthState+1, fruitProhibition.maxGrowthState+1, desc.startStateChannel, desc.numStateChannels, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels) |
557 | end |
558 | end |
559 | end |
560 | |
561 | local terrainDetailRequiredValueRanges = self:getAITerrainDetailRequiredRange() |
562 | for i=1, #terrainDetailRequiredValueRanges do |
563 | local valueRange = terrainDetailRequiredValueRanges[i] |
564 | query:addRequiredGroundValue(valueRange[1], valueRange[2], valueRange[3], valueRange[4]) |
565 | end |
566 | |
567 | local terrainDetailProhibitValueRanges = self:getAITerrainDetailProhibitedRange() |
568 | for i=1, #terrainDetailProhibitValueRanges do |
569 | local valueRange = terrainDetailProhibitValueRanges[i] |
570 | query:addProhibitedGroundValue(valueRange[1], valueRange[2], valueRange[3], valueRange[4]) |
571 | end |
572 | |
573 | spec.fieldCropyQuery = query |
574 | end |
getAIAllowTurnBackward
DescriptionDefinitiongetAIAllowTurnBackward()Code
330 | function AIImplement:getAIAllowTurnBackward() |
331 | return self.spec_aiImplement.allowTurnBackward |
332 | end |
getAIBlockTurnBackward
DescriptionDefinitiongetAIBlockTurnBackward()Code
336 | function AIImplement:getAIBlockTurnBackward() |
337 | return self.spec_aiImplement.blockTurnBackward |
338 | end |
getAIFruitExtraRequirements
DescriptionDefinitiongetAIFruitExtraRequirements()Code
366 | function AIImplement:getAIFruitExtraRequirements() |
367 | local spec = self.spec_aiImplement |
368 | return spec.useDensityHeightMap, spec.useWindrowFruitType |
369 | end |
getAIFruitProhibitions
DescriptionDefinitiongetAIFruitProhibitions()Code
437 | function AIImplement:getAIFruitProhibitions() |
438 | return self.spec_aiImplement.prohibitedFruitTypes |
439 | end |
getAIFruitRequirements
DescriptionDefinitiongetAIFruitRequirements()Code
402 | function AIImplement:getAIFruitRequirements() |
403 | return self.spec_aiImplement.requiredFruitTypes |
404 | end |
getAIHasNoFullCoverageArea
DescriptionDefinitiongetAIHasNoFullCoverageArea()Code
303 | function AIImplement:getAIHasNoFullCoverageArea() |
304 | return self.spec_aiImplement.hasNoFullCoverageArea, self.spec_aiImplement.hasNoFullCoverageAreaOffset |
305 | end |
getAIImplementCollisionTriggers
DescriptionDefinitiongetAIImplementCollisionTriggers()Code
309 | function AIImplement:getAIImplementCollisionTriggers(collisionTriggers) |
310 | local spec = self.spec_aiImplement |
311 | if spec.collisionTrigger ~= nil then |
312 | collisionTriggers[self] = spec.collisionTrigger |
313 | end |
314 | end |
getAIInvertMarkersOnTurn
DescriptionDefinitiongetAIInvertMarkersOnTurn()Code
284 | function AIImplement:getAIInvertMarkersOnTurn(turnLeft) |
285 | return false |
286 | end |
getAILookAheadSize
DescriptionDefinitiongetAILookAheadSize()Code
297 | function AIImplement:getAILookAheadSize() |
298 | return self.spec_aiImplement.lookAheadSize |
299 | end |
getAILowerIfAnyIsLowered
DescriptionDefinitiongetAILowerIfAnyIsLowered()Code
324 | function AIImplement:getAILowerIfAnyIsLowered() |
325 | return self.spec_aiImplement.lowerIfAnyIsLowerd |
326 | end |
getAIMarkers
DescriptionDefinitiongetAIMarkers()Code
256 | function AIImplement:getAIMarkers() |
257 | local spec = self.spec_aiImplement |
258 | if spec.useAttributesOfAttachedImplement then |
259 | if self.getAttachedImplements ~= nil then |
260 | for _, implement in ipairs(self:getAttachedImplements()) do |
261 | if implement.object.getAIMarkers ~= nil then |
262 | return implement.object:getAIMarkers() |
263 | end |
264 | end |
265 | end |
266 | end |
267 | |
268 | if spec.aiMarkersInverted then |
269 | return spec.rightMarker, spec.leftMarker, spec.backMarker, true |
270 | else |
271 | return spec.leftMarker, spec.rightMarker, spec.backMarker, false |
272 | end |
273 | end |
getAIMinTurningRadius
DescriptionDefinitiongetAIMinTurningRadius()Code
250 | function AIImplement:getAIMinTurningRadius() |
251 | return self.spec_aiImplement.minTurningRadius |
252 | end |
getAINeedsLowering
DescriptionDefinitiongetAINeedsLowering()Code
318 | function AIImplement:getAINeedsLowering() |
319 | return self.spec_aiImplement.needsLowering |
320 | end |
getAISizeMarkers
DescriptionDefinitiongetAISizeMarkers()Code
290 | function AIImplement:getAISizeMarkers() |
291 | local spec = self.spec_aiImplement |
292 | return spec.sizeLeftMarker, spec.sizeRightMarker, spec.sizeBackMarker |
293 | end |
getAITerrainDetailProhibitedRange
DescriptionDefinitiongetAITerrainDetailProhibitedRange()Code
491 | function AIImplement:getAITerrainDetailProhibitedRange() |
492 | local spec = self.spec_aiImplement |
493 | |
494 | if spec.useAttributesOfAttachedImplement then |
495 | if self.getAttachedImplements ~= nil then |
496 | for _, implement in ipairs(self:getAttachedImplements()) do |
497 | if implement.object.getAITerrainDetailProhibitedRange ~= nil then |
498 | return implement.object:getAITerrainDetailProhibitedRange() |
499 | end |
500 | end |
501 | end |
502 | end |
503 | |
504 | return spec.terrainDetailProhibitedValueRanges |
505 | end |
getAITerrainDetailRequiredRange
DescriptionDefinitiongetAITerrainDetailRequiredRange()Code
458 | function AIImplement:getAITerrainDetailRequiredRange() |
459 | local spec = self.spec_aiImplement |
460 | |
461 | if spec.useAttributesOfAttachedImplement then |
462 | if self.getAttachedImplements ~= nil then |
463 | for _, implement in ipairs(self:getAttachedImplements()) do |
464 | if implement.object.getAITerrainDetailRequiredRange ~= nil then |
465 | return implement.object:getAITerrainDetailRequiredRange() |
466 | end |
467 | end |
468 | end |
469 | end |
470 | |
471 | return spec.terrainDetailRequiredValueRanges |
472 | end |
getAIToolReverserDirectionNode
DescriptionDefinitiongetAIToolReverserDirectionNode()Code
342 | function AIImplement:getAIToolReverserDirectionNode() |
343 | return self.spec_aiImplement.toolReverserDirectionNode |
344 | end |
getAITurnRadiusLimitation
DescriptionDefinitiongetAITurnRadiusLimitation()Code
348 | function AIImplement:getAITurnRadiusLimitation() |
349 | local spec = self.spec_aiImplement |
350 | |
351 | return spec.turningRadiusLimitation.radius, spec.turningRadiusLimitation.rotationJoint, spec.turningRadiusLimitation.wheels |
352 | end |
getAllowTireTracks
DescriptionDefinitiongetAllowTireTracks()Code
230 | function AIImplement:getAllowTireTracks(superFunc) |
231 | return superFunc(self) and not self:getIsAIActive() |
232 | end |
getCanAIImplementContinueWork
DescriptionDefinitiongetCanAIImplementContinueWork()Code
203 | function AIImplement:getCanAIImplementContinueWork() |
204 | return true |
205 | end |
getCanImplementBeUsedForAI
DescriptionDefinitiongetCanImplementBeUsedForAI()Code
209 | function AIImplement:getCanImplementBeUsedForAI() |
210 | local leftMarker, rightMarker, backMarker, _ = self:getAIMarkers() |
211 | if leftMarker == nil or rightMarker == nil or backMarker == nil then |
212 | return false |
213 | end |
214 | |
215 | return true |
216 | end |
getDoConsumePtoPower
DescriptionDefinitiongetDoConsumePtoPower()Code
236 | function AIImplement:getDoConsumePtoPower(superFunc) |
237 | -- do not consume power during headland to avoid slow turning |
238 | local rootVehicle = self:getRootVehicle() |
239 | if rootVehicle.getAIIsTurning ~= nil then |
240 | if rootVehicle:getAIIsTurning() then |
241 | return false |
242 | end |
243 | end |
244 | |
245 | return superFunc(self) |
246 | end |
getFieldCropsQuery
DescriptionReturns field crops query and creates it on first runDefinition
getFieldCropsQuery()Code
509 | function AIImplement:getFieldCropsQuery() |
510 | if self.spec_aiImplement.fieldCropyQuery == nil then |
511 | self:createFieldCropsQuery() |
512 | end |
513 | |
514 | return self.spec_aiImplement.fieldCropyQuery |
515 | end |
getIsAIImplementInLine
DescriptionDefinitiongetIsAIImplementInLine()Code
578 | function AIImplement:getIsAIImplementInLine() |
579 | return self.spec_aiImplement.isLineStarted |
580 | end |
onLoad
DescriptionCalled on loadingDefinition
onLoad(table savegame)Arguments
table | savegame | savegame |
110 | function AIImplement:onLoad(savegame) |
111 | local spec = self.spec_aiImplement |
112 | |
113 | local baseName = "vehicle.ai" |
114 | |
115 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".areaMarkers#leftIndex", baseName .. ".areaMarkers#leftNode") -- FS17 to FS 19 |
116 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".areaMarkers#rightIndex", baseName .. ".areaMarkers#rightNode") -- FS17 to FS 19 |
117 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".areaMarkers#backIndex", baseName .. ".areaMarkers#backNode") -- FS17 to FS 19 |
118 | |
119 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".sizeMarkers#leftIndex", baseName .. ".sizeMarkers#leftNode") -- FS17 to FS 19 |
120 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".sizeMarkers#rightIndex", baseName .. ".sizeMarkers#rightNode") -- FS17 to FS 19 |
121 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".sizeMarkers#backIndex", baseName .. ".sizeMarkers#backNode") -- FS17 to FS 19 |
122 | |
123 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".trafficCollisionTrigger#index", baseName .. ".collisionTrigger#node") -- FS17 to FS 19 |
124 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".trafficCollisionTrigger#node", baseName .. ".collisionTrigger#node") -- FS17 to FS 19 |
125 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".collisionTrigger#index", baseName .. ".collisionTrigger#node") -- FS17 to FS 19 |
126 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.aiLookAheadSize#value", baseName .. ".lookAheadSize#value") -- FS17 to FS 19 |
127 | |
128 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".toolReverserDirectionNode#index", baseName .. ".toolReverserDirectionNode#node") -- FS17 to FS 19 |
129 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".turningRadiusLimiation", baseName .. ".turningRadiusLimitation") -- FS17 to FS 19 |
130 | |
131 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, baseName .. ".forceTurnNoBackward#value", baseName .. ".allowTurnBackward#value (inverted)") -- FS17 to FS 19 |
132 | |
133 | |
134 | spec.minTurningRadius = getXMLFloat(self.xmlFile, baseName .. ".minTurningRadius#value") |
135 | |
136 | spec.leftMarker = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, baseName .. ".areaMarkers#leftNode"), self.i3dMappings) |
137 | spec.rightMarker = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, baseName .. ".areaMarkers#rightNode"), self.i3dMappings) |
138 | spec.backMarker = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, baseName .. ".areaMarkers#backNode"), self.i3dMappings) |
139 | spec.aiMarkersInverted = false |
140 | |
141 | spec.sizeLeftMarker = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, baseName .. ".sizeMarkers#leftNode"), self.i3dMappings) |
142 | spec.sizeRightMarker = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, baseName .. ".sizeMarkers#rightNode"), self.i3dMappings) |
143 | spec.sizeBackMarker = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, baseName .. ".sizeMarkers#backNode"), self.i3dMappings) |
144 | |
145 | spec.collisionTrigger = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, baseName .. ".collisionTrigger#node"), self.i3dMappings) |
146 | if spec.collisionTrigger ~= nil then |
147 | local rigidBodyType = getRigidBodyType(spec.collisionTrigger) |
148 | if rigidBodyType ~= "Kinematic" then |
149 | g_logManager:xmlWarning(self.configFileName, "'aiCollisionTrigger' is not a kinematic body type") |
150 | end |
151 | |
152 | self:doCollisionMaskCheck(MathUtil.bitsToMask(20, 13), nil, spec.collisionTrigger, "aiCollisionTrigger") |
153 | end |
154 | |
155 | spec.needsLowering = Utils.getNoNil(getXMLBool(self.xmlFile, baseName .. ".needsLowering#value"), true) |
156 | spec.lowerIfAnyIsLowerd = Utils.getNoNil(getXMLBool(self.xmlFile, baseName .. ".needsLowering#lowerIfAnyIsLowerd"), false) |
157 | |
158 | spec.allowTurnBackward = Utils.getNoNil(getXMLBool(self.xmlFile, baseName .. ".allowTurnBackward#value"), true) |
159 | spec.blockTurnBackward = Utils.getNoNil(getXMLBool(self.xmlFile, baseName .. ".blockTurnBackward#value"), false) |
160 | |
161 | spec.toolReverserDirectionNode = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, baseName .. ".toolReverserDirectionNode#node"), self.i3dMappings) |
162 | |
163 | spec.turningRadiusLimitation = {} |
164 | spec.turningRadiusLimitation.rotationJoint = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, baseName .. ".turningRadiusLimitation#rotationJointNode"), self.i3dMappings) |
165 | if spec.turningRadiusLimitation.rotationJoint ~= nil then |
166 | spec.turningRadiusLimitation.wheelIndices = {StringUtil.getVectorFromString(getXMLString(self.xmlFile, baseName .. ".turningRadiusLimitation#wheelIndices"))} |
167 | end |
168 | |
169 | spec.turningRadiusLimitation.radius = getXMLFloat(self.xmlFile, baseName .. ".turningRadiusLimitation#radius") |
170 | |
171 | spec.lookAheadSize = Utils.getNoNil(getXMLFloat(self.xmlFile, baseName .. ".lookAheadSize#value"), 2) |
172 | spec.useAttributesOfAttachedImplement = Utils.getNoNil(getXMLBool(self.xmlFile, baseName .. ".useAttributesOfAttachedImplement#value"), false) |
173 | |
174 | spec.hasNoFullCoverageArea = Utils.getNoNil(getXMLString(self.xmlFile, baseName .. ".hasNoFullCoverageArea#value"), false) |
175 | spec.hasNoFullCoverageAreaOffset = Utils.getNoNil(getXMLFloat(self.xmlFile, baseName .. ".hasNoFullCoverageArea#offset"), 0) |
176 | |
177 | spec.terrainDetailRequiredValueRanges = {} |
178 | spec.terrainDetailProhibitedValueRanges = {} |
179 | |
180 | spec.requiredFruitTypes = {} |
181 | spec.prohibitedFruitTypes = {} |
182 | |
183 | spec.isLineStarted = false |
184 | end |
onPostLoad
DescriptionDefinitiononPostLoad()Code
188 | function AIImplement:onPostLoad(savegame) |
189 | if self.getWheels ~= nil then |
190 | local spec = self.spec_aiImplement |
191 | if spec.turningRadiusLimitation.wheelIndices ~= nil then |
192 | spec.turningRadiusLimitation.wheels = {} |
193 | local wheels = self:getWheels() |
194 | for _, index in ipairs(spec.turningRadiusLimitation.wheelIndices) do |
195 | table.insert(spec.turningRadiusLimitation.wheels, wheels[index]) |
196 | end |
197 | end |
198 | end |
199 | 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 |
17 | function AIImplement.prerequisitesPresent(specializations) |
18 | return true |
19 | end |
registerEventListeners
DescriptionDefinitionregisterEventListeners()Code
102 | function AIImplement.registerEventListeners(vehicleType) |
103 | SpecializationUtil.registerEventListener(vehicleType, "onLoad", AIImplement) |
104 | SpecializationUtil.registerEventListener(vehicleType, "onPostLoad", AIImplement) |
105 | end |
registerEvents
DescriptionDefinitionregisterEvents()Code
23 | function AIImplement.registerEvents(vehicleType) |
24 | SpecializationUtil.registerEvent(vehicleType, "onAIImplementStart") |
25 | SpecializationUtil.registerEvent(vehicleType, "onAIImplementActive") |
26 | SpecializationUtil.registerEvent(vehicleType, "onAIImplementEnd") |
27 | |
28 | SpecializationUtil.registerEvent(vehicleType, "onAIImplementStartLine") |
29 | SpecializationUtil.registerEvent(vehicleType, "onAIImplementEndLine") |
30 | |
31 | SpecializationUtil.registerEvent(vehicleType, "onAIImplementStartTurn") |
32 | SpecializationUtil.registerEvent(vehicleType, "onAIImplementTurnProgress") |
33 | SpecializationUtil.registerEvent(vehicleType, "onAIImplementEndTurn") |
34 | |
35 | SpecializationUtil.registerEvent(vehicleType, "onAIImplementBlock") |
36 | SpecializationUtil.registerEvent(vehicleType, "onAIImplementContinue") |
37 | end |
registerFunctions
DescriptionDefinitionregisterFunctions()Code
41 | function AIImplement.registerFunctions(vehicleType) |
42 | SpecializationUtil.registerFunction(vehicleType, "getCanAIImplementContinueWork", AIImplement.getCanAIImplementContinueWork) |
43 | SpecializationUtil.registerFunction(vehicleType, "getCanImplementBeUsedForAI", AIImplement.getCanImplementBeUsedForAI) |
44 | SpecializationUtil.registerFunction(vehicleType, "getAIMinTurningRadius", AIImplement.getAIMinTurningRadius) |
45 | SpecializationUtil.registerFunction(vehicleType, "getAIMarkers", AIImplement.getAIMarkers) |
46 | SpecializationUtil.registerFunction(vehicleType, "setAIMarkersInverted", AIImplement.setAIMarkersInverted) |
47 | SpecializationUtil.registerFunction(vehicleType, "getAIInvertMarkersOnTurn", AIImplement.getAIInvertMarkersOnTurn) |
48 | SpecializationUtil.registerFunction(vehicleType, "getAISizeMarkers", AIImplement.getAISizeMarkers) |
49 | SpecializationUtil.registerFunction(vehicleType, "getAILookAheadSize", AIImplement.getAILookAheadSize) |
50 | SpecializationUtil.registerFunction(vehicleType, "getAIHasNoFullCoverageArea", AIImplement.getAIHasNoFullCoverageArea) |
51 | |
52 | SpecializationUtil.registerFunction(vehicleType, "getAIImplementCollisionTriggers", AIImplement.getAIImplementCollisionTriggers) |
53 | |
54 | SpecializationUtil.registerFunction(vehicleType, "getAINeedsLowering", AIImplement.getAINeedsLowering) |
55 | SpecializationUtil.registerFunction(vehicleType, "getAILowerIfAnyIsLowered", AIImplement.getAILowerIfAnyIsLowered) |
56 | SpecializationUtil.registerFunction(vehicleType, "getAIAllowTurnBackward", AIImplement.getAIAllowTurnBackward) |
57 | SpecializationUtil.registerFunction(vehicleType, "getAIBlockTurnBackward", AIImplement.getAIBlockTurnBackward) |
58 | SpecializationUtil.registerFunction(vehicleType, "getAIToolReverserDirectionNode", AIImplement.getAIToolReverserDirectionNode) |
59 | SpecializationUtil.registerFunction(vehicleType, "getAITurnRadiusLimitation", AIImplement.getAITurnRadiusLimitation) |
60 | |
61 | SpecializationUtil.registerFunction(vehicleType, "setAIFruitProhibitions", AIImplement.setAIFruitProhibitions) |
62 | SpecializationUtil.registerFunction(vehicleType, "addAIFruitProhibitions", AIImplement.addAIFruitProhibitions) |
63 | SpecializationUtil.registerFunction(vehicleType, "clearAIFruitProhibitions", AIImplement.clearAIFruitProhibitions) |
64 | SpecializationUtil.registerFunction(vehicleType, "getAIFruitProhibitions", AIImplement.getAIFruitProhibitions) |
65 | |
66 | SpecializationUtil.registerFunction(vehicleType, "setAIFruitExtraRequirements", AIImplement.setAIFruitExtraRequirements) |
67 | SpecializationUtil.registerFunction(vehicleType, "getAIFruitExtraRequirements", AIImplement.getAIFruitExtraRequirements) |
68 | |
69 | SpecializationUtil.registerFunction(vehicleType, "setAIFruitRequirements", AIImplement.setAIFruitRequirements) |
70 | SpecializationUtil.registerFunction(vehicleType, "addAIFruitRequirement", AIImplement.addAIFruitRequirement) |
71 | SpecializationUtil.registerFunction(vehicleType, "clearAIFruitRequirements", AIImplement.clearAIFruitRequirements) |
72 | SpecializationUtil.registerFunction(vehicleType, "getAIFruitRequirements", AIImplement.getAIFruitRequirements) |
73 | |
74 | SpecializationUtil.registerFunction(vehicleType, "addAITerrainDetailRequiredRange", AIImplement.addAITerrainDetailRequiredRange) |
75 | SpecializationUtil.registerFunction(vehicleType, "clearAITerrainDetailRequiredRange", AIImplement.clearAITerrainDetailRequiredRange) |
76 | SpecializationUtil.registerFunction(vehicleType, "getAITerrainDetailRequiredRange", AIImplement.getAITerrainDetailRequiredRange) |
77 | |
78 | SpecializationUtil.registerFunction(vehicleType, "addAITerrainDetailProhibitedRange", AIImplement.addAITerrainDetailProhibitedRange) |
79 | SpecializationUtil.registerFunction(vehicleType, "clearAITerrainDetailProhibitedRange", AIImplement.clearAITerrainDetailProhibitedRange) |
80 | SpecializationUtil.registerFunction(vehicleType, "getAITerrainDetailProhibitedRange", AIImplement.getAITerrainDetailProhibitedRange) |
81 | |
82 | SpecializationUtil.registerFunction(vehicleType, "getFieldCropsQuery", AIImplement.getFieldCropsQuery) |
83 | SpecializationUtil.registerFunction(vehicleType, "updateFieldCropsQuery", AIImplement.updateFieldCropsQuery) |
84 | SpecializationUtil.registerFunction(vehicleType, "createFieldCropsQuery", AIImplement.createFieldCropsQuery) |
85 | |
86 | SpecializationUtil.registerFunction(vehicleType, "getIsAIImplementInLine", AIImplement.getIsAIImplementInLine) |
87 | |
88 | SpecializationUtil.registerFunction(vehicleType, "aiImplementStartLine", AIImplement.aiImplementStartLine) |
89 | SpecializationUtil.registerFunction(vehicleType, "aiImplementEndLine", AIImplement.aiImplementEndLine) |
90 | end |
registerOverwrittenFunctions
DescriptionDefinitionregisterOverwrittenFunctions()Code
94 | function AIImplement.registerOverwrittenFunctions(vehicleType) |
95 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "addVehicleToAIImplementList", AIImplement.addVehicleToAIImplementList) |
96 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getAllowTireTracks", AIImplement.getAllowTireTracks) |
97 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getDoConsumePtoPower", AIImplement.getDoConsumePtoPower) |
98 | end |
setAIFruitExtraRequirements
DescriptionDefinitionsetAIFruitExtraRequirements()Code
356 | function AIImplement:setAIFruitExtraRequirements(useDensityHeightMap, useWindrowFruitType) |
357 | local spec = self.spec_aiImplement |
358 | |
359 | spec.useDensityHeightMap = useDensityHeightMap or spec.useDensityHeightMap or false |
360 | spec.useWindrowFruitType = useWindrowFruitType or spec.useWindrowFruitType or false |
361 | self:updateFieldCropsQuery() |
362 | end |
setAIFruitProhibitions
DescriptionDefinitionsetAIFruitProhibitions()Code
408 | function AIImplement:setAIFruitProhibitions(fruitType, minGrowthState, maxGrowthState) |
409 | self:clearAIFruitProhibitions() |
410 | self:addAIFruitProhibitions(fruitType, minGrowthState, maxGrowthState) |
411 | self:updateFieldCropsQuery() |
412 | end |
setAIFruitRequirements
DescriptionDefinitionsetAIFruitRequirements()Code
373 | function AIImplement:setAIFruitRequirements(fruitType, minGrowthState, maxGrowthState) |
374 | self:clearAIFruitRequirements() |
375 | self:addAIFruitRequirement(fruitType, minGrowthState, maxGrowthState) |
376 | self:updateFieldCropsQuery() |
377 | end |
setAIMarkersInverted
DescriptionDefinitionsetAIMarkersInverted()Code
277 | function AIImplement:setAIMarkersInverted(state) |
278 | local spec = self.spec_aiImplement |
279 | spec.aiMarkersInverted = not spec.aiMarkersInverted |
280 | end |
updateFieldCropsQuery
DescriptionRecreate if the Field crops query already exists (= if it was already used)Definition
updateFieldCropsQuery()Code
519 | function AIImplement:updateFieldCropsQuery() |
520 | if self.spec_aiImplement.fieldCropyQuery ~= nil then |
521 | self:createFieldCropsQuery() |
522 | end |
523 | end |