LUADOC - Farming Simulator 19

Script v1.7.1.0

Engine v1.7.1.0

Foundation Reference

AIDriveStrategyCollision

Description
drive strategy to stop vehicle on collision (aiTrafficCollision trigger) Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved.
Parent
AIDriveStrategy
Functions

addCollisionTrigger

Description
Definition
addCollisionTrigger()
Code
136function AIDriveStrategyCollision:addCollisionTrigger(collisionTriggerByVehicle, object)
137 if collisionTriggerByVehicle[object] == nil then
138 local collisionTriggers = {}
139 object:getAICollisionTriggers(collisionTriggers)
140
141 if object.getAIImplementCollisionTriggers ~= nil then
142 object:getAIImplementCollisionTriggers(collisionTriggers)
143 end
144
145 for vehicle, trigger in pairs(collisionTriggers) do
146 addTrigger(trigger, "onTrafficCollisionTrigger", self)
147 collisionTriggerByVehicle[vehicle] = trigger
148 self.numCollidingVehicles[trigger] = 0
149 end
150 end
151end

delete

Description
Definition
delete()
Code
35function AIDriveStrategyCollision:delete()
36 AIDriveStrategyCollision:superClass().delete(self)
37
38 if self.vehicle.isServer then
39 self:removeCollisionTrigger(self.collisionTriggerByVehicle)
40 end
41end

getDriveData

Description
Definition
getDriveData()
Code
90function AIDriveStrategyCollision:getDriveData(dt, vX,vY,vZ)
91 -- we do not check collisions at the back, at least currently
92 if self.vehicle.movingDirection < 0 and self.vehicle:getLastSpeed(true) > 2 then
93 return nil, nil, nil, nil, nil
94 end
95
96 for _, count in pairs(self.numCollidingVehicles) do
97 if count > 0 then
98 local tX,_,tZ = localToWorld(self.vehicle:getAIVehicleDirectionNode(), 0,0,1)
99 if VehicleDebug.state == VehicleDebug.DEBUG_AI then
100 self.vehicle:addAIDebugText(" AIDriveStrategyCollision :: STOP due to collision ")
101 end
102
103 self:setHasCollision(true)
104
105 return tX, tZ, true, 0, math.huge
106 end
107 end
108
109 self:setHasCollision(false)
110
111 if VehicleDebug.state == VehicleDebug.DEBUG_AI then
112 self.vehicle:addAIDebugText(" AIDriveStrategyCollision :: no collision ")
113 end
114 return nil, nil, nil, nil, nil
115end

new

Description
Definition
new()
Code
11function AIDriveStrategyCollision:new(customMt)
12 if customMt == nil then
13 customMt = AIDriveStrategyCollision_mt
14 end
15
16 local self = AIDriveStrategy:new(customMt)
17
18 self.setHasCollision = AIDriveStrategyCollision.setHasCollision
19 self.addCollisionTrigger = AIDriveStrategyCollision.addCollisionTrigger
20 self.removeCollisionTrigger = AIDriveStrategyCollision.removeCollisionTrigger
21 self.setCollisionTriggerDirection = AIDriveStrategyCollision.setCollisionTriggerDirection
22
23 self.numCollidingVehicles = {}
24 self.vehicleIgnoreList = {}
25
26 self.collisionTriggerByVehicle = {}
27
28 self.lastHasCollision = false
29
30 return self
31end

onTrafficCollisionTrigger

Description
Definition
onTrafficCollisionTrigger()
Code
166function AIDriveStrategyCollision:onTrafficCollisionTrigger(triggerId, otherId, onEnter, onLeave, onStay, otherShapeId)
167 if onEnter or onLeave then
168 if g_currentMission.players[otherId] ~= nil then
169 if onEnter then
170 self.numCollidingVehicles[triggerId] = self.numCollidingVehicles[triggerId]+1
171 elseif onLeave then
172 self.numCollidingVehicles[triggerId] = math.max(self.numCollidingVehicles[triggerId]-1, 0)
173 end
174 else
175 local vehicle = g_currentMission.nodeToObject[otherId]
176 if vehicle ~= nil then
177 local rootVehicle = vehicle:getRootVehicle()
178 if self.collisionTriggerByVehicle[vehicle] == nil and self.collisionTriggerByVehicle[rootVehicle] == nil then
179 if onEnter then
180 self.numCollidingVehicles[triggerId] = self.numCollidingVehicles[triggerId]+1
181 elseif onLeave then
182 self.numCollidingVehicles[triggerId] = math.max(self.numCollidingVehicles[triggerId]-1, 0)
183 end
184 end
185 end
186 end
187 end
188end

removeCollisionTrigger

Description
Definition
removeCollisionTrigger()
Code
155function AIDriveStrategyCollision:removeCollisionTrigger(collisionTriggerByVehicle)
156 for _, trigger in pairs(collisionTriggerByVehicle) do
157 if trigger ~= nil and trigger ~= 0 then
158 removeTrigger(trigger)
159 end
160 self.numCollidingVehicles[trigger] = nil
161 end
162end

setAIVehicle

Description
Definition
setAIVehicle()
Code
45function AIDriveStrategyCollision:setAIVehicle(vehicle)
46 AIDriveStrategyCollision:superClass().setAIVehicle(self, vehicle)
47
48 if self.vehicle.isServer then
49 self:addCollisionTrigger(self.collisionTriggerByVehicle, self.vehicle)
50 end
51end

setCollisionTriggerDirection

Description
Definition
setCollisionTriggerDirection()
Code
79function AIDriveStrategyCollision:setCollisionTriggerDirection(trigger, dx,dy,dz, ux,uy,uz)
80 if trigger ~= nil and trigger ~= 0 then
81 local parent = getParent(trigger)
82 local dirX,dirY,dirZ = worldDirectionToLocal(parent, dx,dy,dz)
83 local upX,upY,upZ = worldDirectionToLocal(parent, ux,uy,uz)
84 setDirection(trigger, dirX,dirY,dirZ, upX,upY,upZ)
85 end
86end

setHasCollision

Description
Definition
setHasCollision()
Code
119function AIDriveStrategyCollision:setHasCollision(state)
120 if state ~= self.lastHasCollision then
121 self.lastHasCollision = state
122
123 if g_server ~= nil then
124 g_server:broadcastEvent(AIVehicleIsBlockedEvent:new(self.vehicle, state), true, nil, self.vehicle)
125 end
126 end
127end

update

Description
Definition
update()
Code
55function AIDriveStrategyCollision:update(dt)
56 local colDirX = 0
57 if self.vehicle.rotatedTime > 0 then
58 colDirX = self.vehicle.rotatedTime / self.vehicle.maxRotTime
59 elseif self.vehicle.rotatedTime < 0 then
60 colDirX = -self.vehicle.rotatedTime / self.vehicle.minRotTime
61 end
62 colDirX = MathUtil.sign(colDirX) * colDirX * colDirX
63
64 -- apply limitation?
65 colDirX = math.max(-0.3, math.min(0.3, colDirX))
66
67 if self.lastColDirX ~= colDirX then
68 local dX,dY,dZ = localDirectionToWorld(self.vehicle:getAIVehicleDirectionNode(), colDirX, 0, 1)
69 local uX,uY,uZ = localDirectionToWorld(self.vehicle:getAIVehicleDirectionNode(), 0, 1, 0)
70
71 for vehicle, trigger in pairs(self.collisionTriggerByVehicle) do
72 self:setCollisionTriggerDirection(trigger, dX,dY,dZ, uX,uY,uZ)
73 end
74 end
75end

updateDriving

Description
Definition
updateDriving()
Code
131function AIDriveStrategyCollision:updateDriving(dt)
132end