LUADOC - Farming Simulator 19

Script v1.7.1.0

Engine v1.7.1.0

Foundation Reference

AIConveyorBelt

Description
Specialization for extending conveyor belts with AI functionality
Functions

actionEventChangeAngle

Description
Definition
actionEventChangeAngle()
Code
235function AIConveyorBelt.actionEventChangeAngle(self, actionName, inputValue, callbackState, isAnalog)
236 local spec = self.spec_aiConveyorBelt
237 local newAngle = spec.currentAngle + spec.stepSize
238 if newAngle > spec.maxAngle then
239 newAngle = spec.minAngle
240 end
241
242 self:setAIConveyorBeltAngle(newAngle)
243end

getAINeedsTrafficCollisionBox

Description
Definition
getAINeedsTrafficCollisionBox()
Code
202function AIConveyorBelt:getAINeedsTrafficCollisionBox(superFunc)
203 return false
204end

getCanBeSelected

Description
Definition
getCanBeSelected()
Code
196function AIConveyorBelt:getCanBeSelected(superFunc)
197 return true
198end

getCanStartAIVehicle

Description
Definition
getCanStartAIVehicle()
Code
182function AIConveyorBelt:getCanStartAIVehicle(superFunc)
183 if g_currentMission.disableAIVehicle then
184 return false
185 end
186
187 if AIVehicle.numHirablesHired >= g_currentMission.maxNumHirables then
188 return false
189 end
190
191 return self.spec_aiConveyorBelt.isAllowed
192end

getDirectionAndSpeedToTargetAngle

Description
Definition
getDirectionAndSpeedToTargetAngle()
Code
156function AIConveyorBelt:getDirectionAndSpeedToTargetAngle(direction, minAngle, maxAngle)
157 local dx, _, dz = localDirectionToWorld(self.components[1].node, 0, 0, 1)
158 local yRot = MathUtil.getYRotationFromDirection(dx, dz)
159
160 local angleDifference
161 if direction > 0 then
162 if yRot > maxAngle then
163 return -1, 0
164 end
165 angleDifference = maxAngle - yRot
166 elseif direction < 0 then
167 if yRot < minAngle then
168 return 1, 0
169 end
170 angleDifference = yRot - minAngle
171 else
172 angleDifference = 0
173 end
174
175 local speed = MathUtil.clamp(math.deg(angleDifference) / 2.5, 0.1, 1) * direction
176
177 return direction, speed
178end

onAIStart

Description
Definition
onAIStart()
Code
208function AIConveyorBelt:onAIStart()
209 local spec = self.spec_aiConveyorBelt
210
211 local dx, _, dz = localDirectionToWorld(self.components[1].node, 0, 0, 1)
212 local yRot = MathUtil.getYRotationFromDirection(dx, dz)
213
214 spec.minTargetWorldYRot = yRot - math.rad(spec.currentAngle) / 2
215 spec.maxTargetWorldYRot = yRot + math.rad(spec.currentAngle) / 2
216 spec.currentDirection = 1
217end

onLoad

Description
Called on loading
Definition
onLoad(table savegame)
Arguments
tablesavegamesavegame
Code
54function AIConveyorBelt:onLoad(savegame)
55 local spec = self.spec_aiConveyorBelt
56
57 spec.isAllowed = hasXMLProperty(self.xmlFile, "vehicle.ai.conveyorBelt")
58
59 spec.minAngle = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ai.conveyorBelt#minAngle"), 5)
60 spec.maxAngle = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ai.conveyorBelt#maxAngle"), 45)
61 spec.stepSize = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ai.conveyorBelt#stepSize"), 5)
62 spec.currentAngle = spec.maxAngle
63
64 spec.minTargetWorldYRot = 0
65 spec.maxTargetWorldYRot = 0
66 spec.currentDirection = 0
67 spec.currentSpeed = 0
68
69 spec.speed = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ai.conveyorBelt#speed"), 1)
70 spec.direction = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ai.conveyorBelt#direction"), -1)
71end

onPostLoad

Description
Definition
onPostLoad()
Code
75function AIConveyorBelt:onPostLoad(savegame)
76 local spec = self.spec_aiConveyorBelt
77 if savegame ~= nil and not savegame.resetVehicles then
78 spec.currentAngle = Utils.getNoNil(getXMLFloat(savegame.xmlFile, savegame.key..".aiConveyorBelt#currentAngle"), spec.currentAngle)
79 end
80end

onReadStream

Description
Called on client side on join
Definition
onReadStream(integer streamId, integer connection)
Arguments
integerstreamIdstreamId
integerconnectionconnection
Code
93function AIConveyorBelt:onReadStream(streamId, connection)
94 self:setAIConveyorBeltAngle(streamReadInt8(streamId), true)
95end

onRegisterActionEvents

Description
Definition
onRegisterActionEvents()
Code
221function AIConveyorBelt:onRegisterActionEvents(isActiveForInput, isActiveForInputIgnoreSelection)
222 if self.isClient then
223 local spec = self.spec_aiConveyorBelt
224 self:clearActionEventsTable(spec.actionEvents)
225
226 if isActiveForInputIgnoreSelection and spec.isAllowed then
227 local _, actionEventId = self:addActionEvent(spec.actionEvents, InputAction.IMPLEMENT_EXTRA3, self, AIConveyorBelt.actionEventChangeAngle, false, true, false, true, nil)
228 g_inputBinding:setActionEventTextPriority(actionEventId, GS_PRIO_NORMAL)
229 end
230 end
231end

onUpdate

Description
Called on update
Definition
onUpdate(float dt, boolean isActiveForInput, boolean isSelected)
Arguments
floatdttime since last call in ms
booleanisActiveForInputtrue if vehicle is active for input
booleanisSelectedtrue if vehicle is selected
Code
110function AIConveyorBelt:onUpdate(dt, isActiveForInput, isActiveForInputIgnoreSelection, isSelected)
111 local spec = self.spec_aiConveyorBelt
112 if self.isServer then
113 if self:getIsAIActive() then
114 spec.currentDirection, spec.currentSpeed = self:getDirectionAndSpeedToTargetAngle(spec.currentDirection, spec.minTargetWorldYRot, spec.maxTargetWorldYRot)
115
116 self:getMotor():setSpeedLimit(math.abs(spec.currentSpeed * spec.speed))
117 WheelsUtil.updateWheelsPhysics(self, dt, spec.currentSpeed * spec.speed * spec.direction, spec.currentDirection * spec.direction, false, true)
118 end
119 end
120end

onUpdateTick

Description
Called on updateTick
Definition
onUpdateTick(float dt, boolean isActiveForInput, boolean isSelected)
Arguments
floatdttime since last call in ms
booleanisActiveForInputtrue if vehicle is active for input
booleanisSelectedtrue if vehicle is selected
Code
127function AIConveyorBelt:onUpdateTick(dt, isActiveForInput, isActiveForInputIgnoreSelection, isSelected)
128 local spec = self.spec_aiConveyorBelt
129 if self.isClient then
130 local actionEvent = spec.actionEvents[InputAction.IMPLEMENT_EXTRA3]
131 if actionEvent ~= nil then
132 g_inputBinding:setActionEventActive(actionEvent.actionEventId, isActiveForInputIgnoreSelection)
133 if isActiveForInputIgnoreSelection then
134 g_inputBinding:setActionEventText(actionEvent.actionEventId, string.format(g_i18n:getText("action_conveyorBeltChangeAngle"), string.format("%.0f", spec.currentAngle)))
135 end
136 end
137 end
138end

onWriteStream

Description
Called on server side on join
Definition
onWriteStream(integer streamId, integer connection)
Arguments
integerstreamIdstreamId
integerconnectionconnection
Code
101function AIConveyorBelt:onWriteStream(streamId, connection)
102 streamWriteInt8(streamId, self.spec_aiConveyorBelt.currentAngle)
103end

prerequisitesPresent

Description
Checks if all prerequisite specializations are loaded
Definition
prerequisitesPresent(table specializations)
Arguments
tablespecializationsspecializations
Return Values
booleanhasPrerequisitetrue if all prerequisite specializations are loaded
Code
19function AIConveyorBelt.prerequisitesPresent(specializations)
20 return SpecializationUtil.hasSpecialization(AIVehicle, specializations) and SpecializationUtil.hasSpecialization(Motorized, specializations)
21end

registerEventListeners

Description
Definition
registerEventListeners()
Code
40function AIConveyorBelt.registerEventListeners(vehicleType)
41 SpecializationUtil.registerEventListener(vehicleType, "onLoad", AIConveyorBelt)
42 SpecializationUtil.registerEventListener(vehicleType, "onPostLoad", AIConveyorBelt)
43 SpecializationUtil.registerEventListener(vehicleType, "onReadStream", AIConveyorBelt)
44 SpecializationUtil.registerEventListener(vehicleType, "onWriteStream", AIConveyorBelt)
45 SpecializationUtil.registerEventListener(vehicleType, "onUpdate", AIConveyorBelt)
46 SpecializationUtil.registerEventListener(vehicleType, "onUpdateTick", AIConveyorBelt)
47 SpecializationUtil.registerEventListener(vehicleType, "onAIStart", AIConveyorBelt)
48 SpecializationUtil.registerEventListener(vehicleType, "onRegisterActionEvents", AIConveyorBelt)
49end

registerFunctions

Description
Definition
registerFunctions()
Code
25function AIConveyorBelt.registerFunctions(vehicleType)
26 SpecializationUtil.registerFunction(vehicleType, "setAIConveyorBeltAngle", AIConveyorBelt.setAIConveyorBeltAngle)
27 SpecializationUtil.registerFunction(vehicleType, "getDirectionAndSpeedToTargetAngle", AIConveyorBelt.getDirectionAndSpeedToTargetAngle)
28end

registerOverwrittenFunctions

Description
Definition
registerOverwrittenFunctions()
Code
32function AIConveyorBelt.registerOverwrittenFunctions(vehicleType)
33 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getCanStartAIVehicle", AIConveyorBelt.getCanStartAIVehicle)
34 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getCanBeSelected", AIConveyorBelt.getCanBeSelected)
35 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getAINeedsTrafficCollisionBox", AIConveyorBelt.getAINeedsTrafficCollisionBox)
36end

saveToXMLFile

Description
Definition
saveToXMLFile()
Code
84function AIConveyorBelt:saveToXMLFile(xmlFile, key, usedModNames)
85 local spec = self.spec_aiConveyorBelt
86 setXMLFloat(xmlFile, key.."#currentAngle", spec.currentAngle)
87end

setAIConveyorBeltAngle

Description
Definition
setAIConveyorBeltAngle()
Code
142function AIConveyorBelt:setAIConveyorBeltAngle(angle, noEventSend)
143 if noEventSend == nil or noEventSend == false then
144 if g_server ~= nil then
145 g_server:broadcastEvent(AIConveyorBeltSetAngleEvent:new(self, angle), nil, nil, self)
146 else
147 g_client:getServerConnection():sendEvent(AIConveyorBeltSetAngleEvent:new(self, angle))
148 end
149 end
150
151 self.spec_aiConveyorBelt.currentAngle = angle
152end