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
AIJobGoTo
ParentAIJobFunctions
- applyCurrentState
- getDescription
- getIsAvailableForVehicle
- getIsStartable
- getIsStartErrorText
- getTarget
- getTitle
- new
- setValues
- start
- stop
- validate
applyCurrentState
DescriptionDefinitionapplyCurrentState()Code
109 | function AIJobGoTo:applyCurrentState(vehicle, mission, farmId, isDirectStart) |
110 | AIJobGoTo:superClass().applyCurrentState(self, vehicle, mission, farmId, isDirectStart) |
111 | |
112 | self.vehicleParameter:setVehicle(vehicle) |
113 | |
114 | local x, z, angle, _ |
115 | if vehicle.getLastJob ~= nil then |
116 | local lastJob = vehicle:getLastJob() |
117 | if not isDirectStart and lastJob ~= nil and lastJob:isa(AIJobGoTo) then |
118 | x, z = lastJob.positionAngleParameter:getPosition() |
119 | angle = lastJob.positionAngleParameter:getAngle() |
120 | end |
121 | end |
122 | |
123 | local snappingAngle = vehicle:getDirectionSnapAngle() |
124 | local terrainAngle = math.pi / math.max(g_currentMission.fieldGroundSystem:getGroundAngleMaxValue() + 1, 4) -- snap at least in 45deg angles |
125 | snappingAngle = math.max(snappingAngle, terrainAngle) |
126 | self.positionAngleParameter:setSnappingAngle(snappingAngle) |
127 | |
128 | if x == nil or z == nil then |
129 | x, _, z = getWorldTranslation(vehicle.rootNode) |
130 | end |
131 | if angle == nil then |
132 | local dirX, _, dirZ = localDirectionToWorld(vehicle.rootNode, 0, 0, 1) |
133 | angle = MathUtil.getYRotationFromDirection(dirX, dirZ) |
134 | end |
135 | |
136 | self.positionAngleParameter:setPosition(x, z) |
137 | self.positionAngleParameter:setAngle(angle) |
138 | end |
getDescription
DescriptionDefinitiongetDescription()Code
177 | function AIJobGoTo:getDescription() |
178 | local desc = AIJobGoTo:superClass().getDescription(self) |
179 | |
180 | local nextTask = self:getTaskByIndex(self.currentTaskIndex) |
181 | if nextTask == self.driveToTask then |
182 | desc = desc .. " - " .. g_i18n:getText("ai_taskDescriptionDriveToTarget") |
183 | end |
184 | |
185 | return desc |
186 | end |
getIsAvailableForVehicle
DescriptionDefinitiongetIsAvailableForVehicle()Code
88 | function AIJobGoTo:getIsAvailableForVehicle(vehicle) |
89 | if vehicle.createAgent == nil or vehicle.setAITarget == nil or not vehicle:getCanStartAIVehicle() then |
90 | return false |
91 | end |
92 | |
93 | return true |
94 | end |
getIsStartable
DescriptionDefinitiongetIsStartable()Code
190 | function AIJobGoTo:getIsStartable(connection) |
191 | if g_currentMission.aiSystem:getAILimitedReached() then |
192 | return false, AIJobGoTo.START_ERROR_LIMIT_REACHED |
193 | end |
194 | |
195 | local vehicle = self.vehicleParameter:getVehicle() |
196 | if vehicle == nil then |
197 | return false, AIJobGoTo.START_ERROR_VEHICLE_DELETED |
198 | end |
199 | |
200 | if not g_currentMission:getHasPlayerPermission("hireAssistant", connection, vehicle:getOwnerFarmId()) then |
201 | return false, AIJobGoTo.START_ERROR_NO_PERMISSION |
202 | end |
203 | |
204 | if vehicle:getIsInUse(connection) then |
205 | return false, AIJobGoTo.START_ERROR_VEHICLE_IN_USE |
206 | end |
207 | |
208 | return true, AIJob.START_SUCCESS |
209 | end |
getIsStartErrorText
DescriptionDefinitiongetIsStartErrorText()Code
213 | function AIJobGoTo.getIsStartErrorText(state) |
214 | if state == AIJobGoTo.START_ERROR_LIMIT_REACHED then |
215 | return g_i18n:getText("ai_startStateLimitReached") |
216 | elseif state == AIJobGoTo.START_ERROR_VEHICLE_DELETED then |
217 | return g_i18n:getText("ai_startStateVehicleDeleted") |
218 | elseif state == AIJobGoTo.START_ERROR_NO_PERMISSION then |
219 | return g_i18n:getText("ai_startStateNoPermission") |
220 | elseif state == AIJobGoTo.START_ERROR_VEHICLE_IN_USE then |
221 | return g_i18n:getText("ai_startStateVehicleInUse") |
222 | end |
223 | |
224 | return g_i18n:getText("ai_startStateSuccess") |
225 | end |
getTarget
DescriptionDefinitiongetTarget()Code
77 | function AIJobGoTo:getTarget() |
78 | local angle = nil |
79 | if self.driveToTask.dirX ~= nil then |
80 | angle = MathUtil.getYRotationFromDirection(self.driveToTask.dirX, self.driveToTask.dirZ) |
81 | end |
82 | |
83 | return self.driveToTask.x, self.driveToTask.z, angle |
84 | end |
getTitle
DescriptionDefinitiongetTitle()Code
98 | function AIJobGoTo:getTitle() |
99 | local vehicle = self.vehicleParameter:getVehicle() |
100 | if vehicle ~= nil then |
101 | return vehicle:getName() |
102 | end |
103 | |
104 | return "" |
105 | end |
new
DescriptionDefinitionnew()Code
22 | function AIJobGoTo.new(isServer, customMt) |
23 | local self = AIJob.new(isServer, customMt or AIJobGoTo_mt) |
24 | |
25 | self.driveToTask = AITaskDriveTo.new(isServer, self) |
26 | self:addTask(self.driveToTask) |
27 | |
28 | self.vehicleParameter = AIParameterVehicle.new() |
29 | self.positionAngleParameter = AIParameterPositionAngle.new(math.rad(0)) |
30 | |
31 | self:addNamedParameter("vehicle", self.vehicleParameter) |
32 | self:addNamedParameter("positionAngle", self.positionAngleParameter) |
33 | |
34 | local vehicleGroup = AIParameterGroup.new(g_i18n:getText("ai_parameterGroupTitleVehicle")) |
35 | vehicleGroup:addParameter(self.vehicleParameter) |
36 | |
37 | local positionGroup = AIParameterGroup.new(g_i18n:getText("ai_parameterGroupTitlePosition")) |
38 | positionGroup:addParameter(self.positionAngleParameter) |
39 | |
40 | table.insert(self.groupedParameters, vehicleGroup) |
41 | table.insert(self.groupedParameters, positionGroup) |
42 | |
43 | return self |
44 | end |
setValues
DescriptionDefinitionsetValues()Code
142 | function AIJobGoTo:setValues() |
143 | self:resetTasks() |
144 | |
145 | self.driveToTask:setVehicle(self.vehicleParameter:getVehicle()) |
146 | |
147 | local angle = self.positionAngleParameter:getAngle() |
148 | local x, z = self.positionAngleParameter:getPosition() |
149 | local dirX, dirZ = MathUtil.getDirectionFromYRotation(angle) |
150 | self.driveToTask:setTargetDirection(dirX, dirZ) |
151 | self.driveToTask:setTargetPosition(x, z) |
152 | end |
start
DescriptionDefinitionstart()Code
48 | function AIJobGoTo:start(farmId) |
49 | AIJobGoTo:superClass().start(self, farmId) |
50 | |
51 | local vehicle = self.vehicleParameter:getVehicle() |
52 | if vehicle ~= nil then |
53 | if self.isServer then |
54 | vehicle:createAgent(self.helperIndex) |
55 | end |
56 | vehicle:aiJobStarted(self, self.helperIndex, farmId) |
57 | end |
58 | end |
stop
DescriptionDefinitionstop()Code
62 | function AIJobGoTo:stop(aiMessage) |
63 | |
64 | local vehicle = self.vehicleParameter:getVehicle() |
65 | if vehicle ~= nil then |
66 | if self.isServer then |
67 | vehicle:deleteAgent() |
68 | end |
69 | vehicle:aiJobFinished() |
70 | end |
71 | |
72 | AIJobGoTo:superClass().stop(self, aiMessage) |
73 | end |
validate
DescriptionDefinitionvalidate()Code
156 | function AIJobGoTo:validate(farmId) |
157 | self:setParamterValid(true) |
158 | |
159 | local isVehicleValid, errorMessageVehicle = self.vehicleParameter:validate() |
160 | if not isVehicleValid then |
161 | self.vehicleParameter:setIsValid(false) |
162 | end |
163 | |
164 | local isPositionValid, errorMessagePosition = self.positionAngleParameter:validate() |
165 | if not isPositionValid then |
166 | self.positionAngleParameter:setIsValid(false) |
167 | end |
168 | |
169 | local isValid = isVehicleValid and isPositionValid |
170 | local errorMessage = errorMessageVehicle or errorMessagePosition |
171 | |
172 | return isValid, errorMessage |
173 | end |