Script v1.7.1.0
- AI
- AIDriveStrategy
- AIDriveStrategyBaler
- AIDriveStrategyCollision
- AIDriveStrategyCombine
- AIDriveStrategyConveyor
- AIDriveStrategyStraight
- AITurnStrategy
- AITurnStrategyBulb1
- AITurnStrategyBulb1Revers...
- AITurnStrategyBulb2
- AITurnStrategyBulb2Revers...
- AITurnStrategyBulb3
- AITurnStrategyBulb3Revers...
- AITurnStrategyDefault
- AITurnStrategyDefaultReve...
- AITurnStrategyHalfCircle
- AITurnStrategyHalfCircleR...
- HelperManager
- NPCManager
- Animals
- Contracts
- Debug
- Economy
- Effects
- Events
- Farms
- GUI
- Handtools
- I3d
- Materials
- Misc
- Objects
- Placeables
- Player
- Shop
- Sounds
- Specializations
- 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
AIDriveStrategyCollision
Descriptiondrive strategy to stop vehicle on collision (aiTrafficCollision trigger) Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved.Parent
AIDriveStrategyFunctions
- addCollisionTrigger
- delete
- getDriveData
- new
- onTrafficCollisionTrigger
- removeCollisionTrigger
- setAIVehicle
- setCollisionTriggerDirection
- setHasCollision
- update
- updateDriving
addCollisionTrigger
DescriptionDefinitionaddCollisionTrigger()Code
136 | function 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 |
151 | end |
delete
DescriptionDefinitiondelete()Code
35 | function AIDriveStrategyCollision:delete() |
36 | AIDriveStrategyCollision:superClass().delete(self) |
37 | |
38 | if self.vehicle.isServer then |
39 | self:removeCollisionTrigger(self.collisionTriggerByVehicle) |
40 | end |
41 | end |
getDriveData
DescriptionDefinitiongetDriveData()Code
90 | function 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 |
115 | end |
new
DescriptionDefinitionnew()Code
11 | function 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 |
31 | end |
onTrafficCollisionTrigger
DescriptionDefinitiononTrafficCollisionTrigger()Code
166 | function 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 |
188 | end |
removeCollisionTrigger
DescriptionDefinitionremoveCollisionTrigger()Code
155 | function 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 |
162 | end |
setAIVehicle
DescriptionDefinitionsetAIVehicle()Code
45 | function 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 |
51 | end |
setCollisionTriggerDirection
DescriptionDefinitionsetCollisionTriggerDirection()Code
79 | function 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 |
86 | end |
setHasCollision
DescriptionDefinitionsetHasCollision()Code
119 | function 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 |
127 | end |
update
DescriptionDefinitionupdate()Code
55 | function 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 |
75 | end |
updateDriving
DescriptionDefinitionupdateDriving()Code
131 | function AIDriveStrategyCollision:updateDriving(dt) |
132 | end |