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
- 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
AIJobFieldWork
ParentAIJobFunctions
- applyCurrentState
- getDescription
- getIsAvailableForVehicle
- getIsStartable
- getIsStartErrorText
- getPricePerMs
- getStartTaskIndex
- getTarget
- getTitle
- new
- setValues
- start
- stop
- validate
applyCurrentState
DescriptionDefinitionapplyCurrentState()Code
97 | function AIJobFieldWork:applyCurrentState(vehicle, mission, farmId, isDirectStart) |
98 | AIJobFieldWork:superClass().applyCurrentState(self, vehicle, mission, farmId, isDirectStart) |
99 | |
100 | self.vehicleParameter:setVehicle(vehicle) |
101 | |
102 | local x, z, angle, _ |
103 | if vehicle.getLastJob ~= nil then |
104 | local lastJob = vehicle:getLastJob() |
105 | if not isDirectStart and lastJob ~= nil and lastJob:isa(AIJobFieldWork) then |
106 | x, z = lastJob.positionAngleParameter:getPosition() |
107 | angle = lastJob.positionAngleParameter:getAngle() |
108 | end |
109 | end |
110 | |
111 | local snappingAngle = vehicle:getDirectionSnapAngle() |
112 | local terrainAngle = math.pi / math.max(g_currentMission.fieldGroundSystem:getGroundAngleMaxValue() + 1, 4) -- snap at least in 45deg angles |
113 | snappingAngle = math.max(snappingAngle, terrainAngle) |
114 | self.positionAngleParameter:setSnappingAngle(snappingAngle) |
115 | |
116 | if x == nil or z == nil then |
117 | x, _, z = getWorldTranslation(vehicle.rootNode) |
118 | end |
119 | if angle == nil then |
120 | local dirX, _, dirZ = localDirectionToWorld(vehicle.rootNode, 0, 0, 1) |
121 | angle = MathUtil.getYRotationFromDirection(dirX, dirZ) |
122 | end |
123 | |
124 | self.positionAngleParameter:setPosition(x, z) |
125 | self.positionAngleParameter:setAngle(angle) |
126 | end |
getDescription
DescriptionDefinitiongetDescription()Code
187 | function AIJobFieldWork:getDescription() |
188 | local desc = AIJobFieldWork:superClass().getDescription(self) |
189 | |
190 | local nextTask = self:getTaskByIndex(self.currentTaskIndex) |
191 | if nextTask == self.driveToTask then |
192 | desc = desc .. " - " .. g_i18n:getText("ai_taskDescriptionDriveToField") |
193 | elseif nextTask == self.fieldWorkTask then |
194 | desc = desc .. " - " .. g_i18n:getText("ai_taskDescriptionFieldWork") |
195 | end |
196 | |
197 | return desc |
198 | end |
getIsAvailableForVehicle
DescriptionDefinitiongetIsAvailableForVehicle()Code
130 | function AIJobFieldWork:getIsAvailableForVehicle(vehicle) |
131 | return vehicle.getCanStartFieldWork and vehicle:getCanStartFieldWork() |
132 | end |
getIsStartable
DescriptionDefinitiongetIsStartable()Code
202 | function AIJobFieldWork:getIsStartable(connection) |
203 | if g_currentMission.aiSystem:getAILimitedReached() then |
204 | return false, AIJobFieldWork.START_ERROR_LIMIT_REACHED |
205 | end |
206 | |
207 | local vehicle = self.vehicleParameter:getVehicle() |
208 | if vehicle == nil then |
209 | return false, AIJobFieldWork.START_ERROR_VEHICLE_DELETED |
210 | end |
211 | |
212 | if not g_currentMission:getHasPlayerPermission("hireAssistant", connection, vehicle:getOwnerFarmId()) then |
213 | return false, AIJobFieldWork.START_ERROR_NO_PERMISSION |
214 | end |
215 | |
216 | if vehicle:getIsInUse(connection) then |
217 | return false, AIJobFieldWork.START_ERROR_VEHICLE_IN_USE |
218 | end |
219 | |
220 | return true, AIJob.START_SUCCESS |
221 | end |
getIsStartErrorText
DescriptionDefinitiongetIsStartErrorText()Code
225 | function AIJobFieldWork.getIsStartErrorText(state) |
226 | if state == AIJobFieldWork.START_ERROR_LIMIT_REACHED then |
227 | return g_i18n:getText("ai_startStateLimitReached") |
228 | elseif state == AIJobFieldWork.START_ERROR_VEHICLE_DELETED then |
229 | return g_i18n:getText("ai_startStateVehicleDeleted") |
230 | elseif state == AIJobFieldWork.START_ERROR_NO_PERMISSION then |
231 | return g_i18n:getText("ai_startStateNoPermission") |
232 | elseif state == AIJobFieldWork.START_ERROR_VEHICLE_IN_USE then |
233 | return g_i18n:getText("ai_startStateVehicleInUse") |
234 | end |
235 | |
236 | return g_i18n:getText("ai_startStateSuccess") |
237 | end |
getPricePerMs
DescriptionDefinitiongetPricePerMs()Code
241 | function AIJobFieldWork:getPricePerMs() |
242 | return 0.0005 |
243 | end |
getStartTaskIndex
DescriptionDefinitiongetStartTaskIndex()Code
53 | function AIJobFieldWork:getStartTaskIndex() |
54 | if self.isDirectStart then |
55 | return 2 |
56 | end |
57 | |
58 | -- check if already at target position |
59 | local vehicle = self.vehicleParameter:getVehicle() |
60 | local x, _, z = getWorldTranslation(vehicle.rootNode) |
61 | local tx, tz = self.positionAngleParameter:getPosition() |
62 | local targetReached = MathUtil.vector2Length(x-tx, z-tz) < 3 |
63 | if targetReached then |
64 | return 2 |
65 | end |
66 | |
67 | return 1 |
68 | end |
getTarget
DescriptionDefinitiongetTarget()Code
136 | function AIJobFieldWork:getTarget() |
137 | local angle = 0 |
138 | if self.driveToTask.dirX ~= nil then |
139 | angle = MathUtil.getYRotationFromDirection(self.driveToTask.dirX, self.driveToTask.dirZ) |
140 | end |
141 | |
142 | return self.driveToTask.x, self.driveToTask.z, angle |
143 | end |
getTitle
DescriptionDefinitiongetTitle()Code
147 | function AIJobFieldWork:getTitle() |
148 | local vehicle = self.vehicleParameter:getVehicle() |
149 | if vehicle ~= nil then |
150 | return vehicle:getName() |
151 | end |
152 | |
153 | return "" |
154 | end |
new
DescriptionDefinitionnew()Code
22 | function AIJobFieldWork.new(isServer, customMt) |
23 | local self = AIJob.new(isServer, customMt or AIJobFieldWork_mt) |
24 | |
25 | self.driveToTask = AITaskDriveTo.new(isServer, self) |
26 | self.fieldWorkTask = AITaskFieldWork.new(isServer, self) |
27 | |
28 | self:addTask(self.driveToTask) |
29 | self:addTask(self.fieldWorkTask) |
30 | |
31 | self.isDirectStart = false |
32 | |
33 | self.vehicleParameter = AIParameterVehicle.new() |
34 | self.positionAngleParameter = AIParameterPositionAngle.new(math.rad(0)) |
35 | |
36 | self:addNamedParameter("vehicle", self.vehicleParameter) |
37 | self:addNamedParameter("positionAngle", self.positionAngleParameter) |
38 | |
39 | local vehicleGroup = AIParameterGroup.new(g_i18n:getText("ai_parameterGroupTitleVehicle")) |
40 | vehicleGroup:addParameter(self.vehicleParameter) |
41 | |
42 | local positionGroup = AIParameterGroup.new(g_i18n:getText("ai_parameterGroupTitlePosition")) |
43 | positionGroup:addParameter(self.positionAngleParameter) |
44 | |
45 | table.insert(self.groupedParameters, vehicleGroup) |
46 | table.insert(self.groupedParameters, positionGroup) |
47 | |
48 | return self |
49 | end |
setValues
DescriptionDefinitionsetValues()Code
158 | function AIJobFieldWork:setValues() |
159 | self:resetTasks() |
160 | |
161 | local vehicle = self.vehicleParameter:getVehicle() |
162 | self.driveToTask:setVehicle(vehicle) |
163 | self.fieldWorkTask:setVehicle(vehicle) |
164 | |
165 | local angle = self.positionAngleParameter:getAngle() |
166 | local x, z = self.positionAngleParameter:getPosition() |
167 | local dirX, dirZ = MathUtil.getDirectionFromYRotation(angle) |
168 | self.driveToTask:setTargetDirection(dirX, dirZ) |
169 | self.driveToTask:setTargetPosition(x, z) |
170 | end |
start
DescriptionDefinitionstart()Code
72 | function AIJobFieldWork:start(farmId) |
73 | AIJobFieldWork:superClass().start(self, farmId) |
74 | |
75 | -- Client start notification will be done by vehicle |
76 | if self.isServer then |
77 | local vehicle = self.vehicleParameter:getVehicle() |
78 | vehicle:createAgent(self.helperIndex) |
79 | vehicle:aiJobStarted(self, self.helperIndex, farmId) |
80 | end |
81 | end |
stop
DescriptionDefinitionstop()Code
85 | function AIJobFieldWork:stop(aiMessage) |
86 | -- Client stop notifcation will be done by vehicle |
87 | if self.isServer then |
88 | local vehicle = self.vehicleParameter:getVehicle() |
89 | vehicle:deleteAgent() |
90 | vehicle:aiJobFinished() |
91 | end |
92 | AIJobFieldWork:superClass().stop(self, aiMessage) |
93 | end |
validate
DescriptionDefinitionvalidate()Code
174 | function AIJobFieldWork:validate(farmId) |
175 | self:setParamterValid(true) |
176 | |
177 | local isValid, errorMessage = self.vehicleParameter:validate() |
178 | if not isValid then |
179 | self.vehicleParameter:setIsValid(false) |
180 | end |
181 | |
182 | return isValid, errorMessage |
183 | end |