Script v1.4.4.0
Engine v7.0.0.2
- General
- Entity
- Node
- Scenegraph
- Lighting
- Camera
- Shape
- Particle System
- Physics
- Spline
- Animation
- Overlays
- Sound
- Input
- XML
- Network
- Callbacks
- Text Rendering
- Terrain Detail
- Tire Track
- Editor
- Rendering
- String
- Math
- I3D
- Fillplanes
Foundation Reference
MountableObject
DescriptionClass for mountable objectsParent
PhysicsObjectFunctions
- new
- delete
- getAllowsAutoDelete
- testScope
- updateTick
- mount
- unmount
- mountDynamic
- unmountDynamic
- setNodeId
- dynamicMountTriggerCallback
- onDynamicMountJointBreak
- getMeshNodes
new
DescriptionCreating mountable objectDefinition
new(boolean isServer, boolean isClient, table customMt)Arguments
boolean | isServer | is server |
boolean | isClient | is client |
table | customMt | customMt |
table | instance | Instance of object |
18 | function MountableObject:new(isServer, isClient, customMt) |
19 | local mt = customMt; |
20 | if mt == nil then |
21 | mt = MountableObject_mt; |
22 | end; |
23 | |
24 | local self = PhysicsObject:new(isServer, isClient, mt); |
25 | self.dynamicMountSingleAxisFreeX = false; |
26 | self.dynamicMountSingleAxisFreeY = false; |
27 | |
28 | self.lastMoveTime = -100000; |
29 | return self; |
30 | end; |
delete
DescriptionDeleting mountable objectDefinition
delete()Code
34 | function MountableObject:delete() |
35 | if self.dynamicMountTriggerId ~= nil then |
36 | removeTrigger(self.dynamicMountTriggerId); |
37 | end |
38 | if self.dynamicMountJointIndex ~= nil then |
39 | removeJointBreakReport(self.dynamicMountJointIndex); |
40 | removeJoint(self.dynamicMountJointIndex); |
41 | end |
42 | if self.dynamicMountObject ~= nil then |
43 | self.dynamicMountObject:removeDynamicMountedObject(self, true); |
44 | end |
45 | if self.mountObject ~= nil and self.mountObject.removeMountedObject ~= nil then |
46 | self.mountObject:removeMountedObject(self, true); |
47 | end |
48 | MountableObject:superClass().delete(self); |
49 | end; |
getAllowsAutoDelete
DescriptionGet allows auto deleteDefinition
getAllowsAutoDelete()Return Values
boolean | allowsAutoDelete | allows auto delete |
54 | function MountableObject:getAllowsAutoDelete() |
55 | return self.mountObject == nil and MountableObject:superClass().getAllowsAutoDelete(self); |
56 | end |
testScope
DescriptionTest scopeDefinition
testScope(float x, float y, float z, float coeff)Arguments
float | x | x position |
float | y | y position |
float | z | z position |
float | coeff | coeff |
boolean | inScope | in scope |
73 | function MountableObject:testScope(x,y,z, coeff) |
74 | if self.mountObject ~= nil then |
75 | return self.mountObject:testScope(x,y,z, coeff); |
76 | else |
77 | return MountableObject:superClass().testScope(self, x,y,z, coeff); |
78 | end; |
79 | end; |
updateTick
DescriptionupdateTickDefinition
updateTick(float dt)Arguments
float | dt | time since last call in ms |
92 | function MountableObject:updateTick(dt) |
93 | if self.isServer then |
94 | if self:updateMove() then |
95 | self.lastMoveTime = g_currentMission.time; |
96 | end; |
97 | end; |
98 | end; |
mount
DescriptionMount mountable object to target objectDefinition
mount(table object, integer node, float x, float y, float z, float rx, float ry, float rz)Arguments
table | object | target object |
integer | node | target node id |
float | x | x position |
float | y | z position |
float | z | z position |
float | rx | rx rotation |
float | ry | ry rotation |
float | rz | rz rotation |
110 | function MountableObject:mount(object, node, x,y,z, rx,ry,rz) |
111 | -- set isDelete = true to remove mountableObject from pendingDynamicMountObjects (no delete leave callback) |
112 | self:unmountDynamic(true); |
113 | |
114 | if self.mountObject == nil then |
115 | removeFromPhysics(self.nodeId); |
116 | end; |
117 | link(node, self.nodeId); |
118 | local rx,ry,rz,rw = mathEulerToQuaternion(rx,ry,rz); |
119 | self:setPose(x,y,z, rx,ry,rz,rw); |
120 | self.mountObject = object; |
121 | end; |
unmount
DescriptionUnmount mountable objectDefinition
unmount()Return Values
boolean | success | success |
126 | function MountableObject:unmount() |
127 | if self.mountObject ~= nil then |
128 | self.mountObject = nil; |
129 | local x,y,z = getWorldTranslation(self.nodeId); |
130 | local rx,ry,rz,rw = getWorldQuaternion(self.nodeId); |
131 | |
132 | link(getRootNode(), self.nodeId); |
133 | self:setPose(x,y,z, rx,ry,rz,rw); |
134 | addToPhysics(self.nodeId); |
135 | return true; |
136 | end |
137 | return false; |
138 | end; |
mountDynamic
DescriptionMount mountable object dynamically to target objectDefinition
mountDynamic(table object, integer objectActorId, integer jointNode, integer mountType, float forceAcceleration)Arguments
table | object | target object |
integer | objectActorId | target actor id |
integer | jointNode | joint node id |
integer | mountType | mount type |
float | forceAcceleration | force acceleration |
boolean | success | success |
148 | function MountableObject:mountDynamic(object, objectActorId, jointNode, mountType, forceAcceleration) |
149 | if not self:getSupportsMountDynamic() or self.mountObject ~= nil then |
150 | return false; |
151 | end |
152 | return DynamicMountUtil.mountDynamic(self, self.nodeId, object, objectActorId, jointNode, mountType, forceAcceleration*self.dynamicMountForceLimitScale); |
153 | end |
unmountDynamic
DescriptionUnmount mountable objectDefinition
unmountDynamic(boolean isDeleting)Arguments
boolean | isDeleting | is deleting |
158 | function MountableObject:unmountDynamic(isDelete) |
159 | DynamicMountUtil.unmountDynamic(self, isDelete); |
160 | end |
setNodeId
DescriptionSet node idDefinition
setNodeId(integer nodeId)Arguments
integer | nodeId | node Id |
169 | function MountableObject:setNodeId(nodeId) |
170 | MountableObject:superClass().setNodeId(self, nodeId); |
171 | |
172 | if self.isServer then |
173 | self.dynamicMountTriggerId = Utils.indexToObject(nodeId, getUserAttribute(nodeId, "dynamicMountTriggerIndex")); |
174 | if self.dynamicMountTriggerId ~= nil then |
175 | addTrigger(self.dynamicMountTriggerId, "dynamicMountTriggerCallback", self); |
176 | end |
177 | self.dynamicMountTriggerForceAcceleration = Utils.getNoNil(tonumber(getUserAttribute(nodeId, "dynamicMountTriggerForceAcceleration")), 4); |
178 | self.dynamicMountForceLimitScale = Utils.getNoNil(tonumber(getUserAttribute(nodeId, "dynamicMountForceLimitScale")), 1); |
179 | self.dynamicMountSingleAxisFreeY = getUserAttribute(nodeId, "dynamicMountSingleAxisFreeY") == true; |
180 | self.dynamicMountSingleAxisFreeX = getUserAttribute(nodeId, "dynamicMountSingleAxisFreeX") == true; |
181 | end |
182 | end; |
dynamicMountTriggerCallback
DescriptionTrigger callbackDefinition
dynamicMountTriggerCallback(integer triggerId, integer otherId, boolean onEnter, boolean onLeave, boolean onStay, integer otherShapeId)Arguments
integer | triggerId | id of trigger |
integer | otherId | id of actor |
boolean | onEnter | on enter |
boolean | onLeave | on leave |
boolean | onStay | on stay |
integer | otherShapeId | id of other actor |
192 | function MountableObject:dynamicMountTriggerCallback(triggerId, otherActorId, onEnter, onLeave, onStay, otherShapeId) |
193 | if onEnter then |
194 | if self.mountObject == nil then |
195 | local vehicle = g_currentMission.nodeToVehicle[otherActorId]; |
196 | if vehicle ~= nil and vehicle.dynamicMountAttacherNode ~= nil then |
197 | if self.dynamicMountObjectActorId == nil then |
198 | self:mountDynamic(vehicle, otherActorId, vehicle.dynamicMountAttacherNode, DynamicMountUtil.TYPE_FORK, self.dynamicMountTriggerForceAcceleration*vehicle.dynamicMountAttacherForceLimitScale); |
199 | self.dynamicMountObjectTriggerCount = 1; |
200 | elseif otherActorId ~= self.dynamicMountObjectActorId and self.dynamicMountObjectTriggerCount == nil then |
201 | -- we are already attached to another actor, but not from our mount trigger (e.g. a bale trailer) |
202 | self:unmountDynamic(); |
203 | self:mountDynamic(vehicle, otherActorId, vehicle.dynamicMountAttacherNode, DynamicMountUtil.TYPE_FORK, self.dynamicMountTriggerForceAcceleration*vehicle.dynamicMountAttacherForceLimitScale); |
204 | self.dynamicMountObjectTriggerCount = 1; |
205 | elseif otherActorId == self.dynamicMountObjectActorId then |
206 | if self.dynamicMountObjectTriggerCount ~= nil then |
207 | self.dynamicMountObjectTriggerCount = self.dynamicMountObjectTriggerCount+1; |
208 | end |
209 | end |
210 | end |
211 | end |
212 | elseif onLeave then |
213 | if otherActorId == self.dynamicMountObjectActorId and self.dynamicMountObjectTriggerCount ~= nil then |
214 | self.dynamicMountObjectTriggerCount = self.dynamicMountObjectTriggerCount-1; |
215 | if self.dynamicMountObjectTriggerCount == 0 then |
216 | self:unmountDynamic(); |
217 | self.dynamicMountObjectTriggerCount = nil; |
218 | end |
219 | end |
220 | end |
221 | end; |
onDynamicMountJointBreak
DescriptionCalled if joint breaksDefinition
onDynamicMountJointBreak(integer jointIndex, integer breakingImpulse)Arguments
integer | jointIndex | index of joint |
integer | breakingImpulse | breaking impulse |
227 | function MountableObject:onDynamicMountJointBreak(jointIndex, breakingImpulse) |
228 | if jointIndex == self.dynamicMountJointIndex then |
229 | self:unmountDynamic(); |
230 | end |
231 | -- Do not delete the joint internally, we already deleted it with unmountDynamic |
232 | return false; |
233 | end |
getMeshNodes
DescriptionGet mesh nodesDefinition
getMeshNodes()Return Values
nil | nil | nil |
238 | function MountableObject:getMeshNodes() |
239 | return nil; |
240 | end; |