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
- AnimatedMapObject
- AnimatedObject
- Bale
- Basketball
- BgaSellStation
- BunkerSilo
- BuyingStation
- DigitalDisplay
- DogBall
- HelpIcons
- InlineBale
- InlineBaleSingle
- LoadingStation
- MountableObject
- NightIllumination
- Nightlight2
- NightlightFlicker
- PackedBale
- PhysicsObject
- ProductionPoint
- Rotator
- SellingStation
- SimParticleSystem
- Storage
- SunAdmirer
- TourIconsMobile
- UnloadingStation
- VehicleSellingPoint
- WildlifeSpawner
- 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
PhysicsObject
DescriptionClass for physics objectsParent
ObjectFunctions
- addChildenToNodeObject
- delete
- getAllowsAutoDelete
- getDefaultRigidBodyType
- getUpdatePriority
- loadOnCreate
- new
- onGhostAdd
- onGhostRemove
- readStream
- readUpdateStream
- setLocalPositionQuaternion
- setNodeId
- setWorldPositionQuaternion
- testScope
- update
- updateMove
- updateTick
- wakeUp
- writeStream
- writeUpdateStream
addChildenToNodeObject
DescriptionAdd childs to node objectDefinition
addChildenToNodeObject(integer nodeId)Arguments
integer | nodeId | id of node |
355 | function PhysicsObject:addChildenToNodeObject(nodeId) |
356 | for i=0,getNumOfChildren(nodeId)-1 do |
357 | self:addChildenToNodeObject(getChildAt(nodeId, i)) |
358 | end |
359 | |
360 | local rigidBodyType = getRigidBodyType(nodeId) |
361 | if rigidBodyType ~= RigidBodyType.NONE then |
362 | g_currentMission:addNodeObject(nodeId, self) |
363 | |
364 | if self.isServer then |
365 | addWakeUpReport(nodeId, "onPhysicObjectWakeUpCallback", self) |
366 | end |
367 | end |
368 | end |
delete
DescriptionDeleting physics objectDefinition
delete()Code
30 | function PhysicsObject:delete() |
31 | if self.nodeId ~= 0 then |
32 | self:removeChildrenFromNodeObject(self.nodeId) |
33 | delete(self.nodeId) |
34 | end |
35 | |
36 | self.nodeId = 0 |
37 | |
38 | PhysicsObject:superClass().delete(self) |
39 | end |
getAllowsAutoDelete
DescriptionGet allows auto deleteDefinition
getAllowsAutoDelete()Return Values
boolean | allowsAutoDelete | allows auto delete |
44 | function PhysicsObject:getAllowsAutoDelete() |
45 | return true |
46 | end |
getDefaultRigidBodyType
DescriptionGet default rigid body typeDefinition
getDefaultRigidBodyType()Return Values
string | rigidBodyType | rigid body type |
329 | function PhysicsObject:getDefaultRigidBodyType() |
330 | if self.isServer then |
331 | return RigidBodyType.DYNAMIC |
332 | else |
333 | return RigidBodyType.KINEMATIC |
334 | end |
335 | end |
getUpdatePriority
DescriptionGet update priorityDefinition
getUpdatePriority(float skipCount, float x, float y, float z, float coeff, table connection)Arguments
float | skipCount | skip count |
float | x | x position |
float | y | y position |
float | z | z position |
float | coeff | coeff |
table | connection | connection |
float | priority | priority |
248 | function PhysicsObject:getUpdatePriority(skipCount, x, y, z, coeff, connection, isGuiVisible) |
249 | local x1, y1, z1 = getWorldTranslation(self.nodeId) |
250 | local dist = math.sqrt((x1-x)*(x1-x) + (y1-y)*(y1-y) + (z1-z)*(z1-z)) |
251 | local clipDist = math.min(getClipDistance(self.nodeId)*coeff, self.forcedClipDistance) |
252 | return (1-dist/clipDist)* 0.8 + 0.5*skipCount * 0.2 |
253 | end |
loadOnCreate
DescriptionLoad on createDefinition
loadOnCreate(integer nodeId)Arguments
integer | nodeId | node id |
51 | function PhysicsObject:loadOnCreate(nodeId) |
52 | self:setNodeId(nodeId) |
53 | if not self.isServer then |
54 | self:onGhostRemove() |
55 | end |
56 | end |
new
DescriptionCreating physics 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 |
15 | function PhysicsObject.new(isServer, isClient, customMt) |
16 | |
17 | local self = Object.new(isServer, isClient, customMt or PhysicsObject_mt) |
18 | |
19 | self.nodeId = 0 |
20 | self.networkTimeInterpolator = InterpolationTime.new(1.2) |
21 | self.forcedClipDistance = 60 |
22 | |
23 | self.physicsObjectDirtyFlag = self:getNextDirtyFlag() |
24 | |
25 | return self |
26 | end |
onGhostAdd
DescriptionOn ghost addDefinition
onGhostAdd()Code
264 | function PhysicsObject:onGhostAdd() |
265 | setVisibility(self.nodeId, true) |
266 | addToPhysics(self.nodeId) |
267 | end |
onGhostRemove
DescriptionOn ghost removeDefinition
onGhostRemove()Code
257 | function PhysicsObject:onGhostRemove() |
258 | setVisibility(self.nodeId, false) |
259 | removeFromPhysics(self.nodeId) |
260 | end |
readStream
DescriptionCalled on client side on joinDefinition
readStream(integer streamId, table connection)Arguments
integer | streamId | stream ID |
table | connection | connection |
84 | function PhysicsObject:readStream(streamId, connection, objectId) |
85 | PhysicsObject:superClass().readStream(self, streamId, connection, objectId) |
86 | |
87 | assert(self.nodeId ~= 0) |
88 | if connection:getIsServer() then |
89 | local paramsXZ = g_currentMission.vehicleXZPosCompressionParams |
90 | local paramsY = g_currentMission.vehicleYPosCompressionParams |
91 | local x = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ) |
92 | local y = NetworkUtil.readCompressedWorldPosition(streamId, paramsY) |
93 | local z = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ) |
94 | local xRot = NetworkUtil.readCompressedAngle(streamId) |
95 | local yRot = NetworkUtil.readCompressedAngle(streamId) |
96 | local zRot = NetworkUtil.readCompressedAngle(streamId) |
97 | |
98 | local quatX, quatY, quatZ, quatW = mathEulerToQuaternion(xRot,yRot,zRot) |
99 | self:setWorldPositionQuaternion(x, y, z, quatX, quatY, quatZ, quatW, true) |
100 | |
101 | self.networkTimeInterpolator:reset() |
102 | end |
103 | end |
readUpdateStream
DescriptionCalled on client side on updateDefinition
readUpdateStream(integer streamId, integer timestamp, table connection)Arguments
integer | streamId | stream ID |
integer | timestamp | timestamp |
table | connection | connection |
131 | function PhysicsObject:readUpdateStream(streamId, timestamp, connection) |
132 | if connection:getIsServer() then |
133 | if streamReadBool(streamId) then |
134 | local paramsXZ = g_currentMission.vehicleXZPosCompressionParams |
135 | local paramsY = g_currentMission.vehicleYPosCompressionParams |
136 | local x = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ) |
137 | local y = NetworkUtil.readCompressedWorldPosition(streamId, paramsY) |
138 | local z = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ) |
139 | local xRot = NetworkUtil.readCompressedAngle(streamId) |
140 | local yRot = NetworkUtil.readCompressedAngle(streamId) |
141 | local zRot = NetworkUtil.readCompressedAngle(streamId) |
142 | |
143 | local quatX, quatY, quatZ, quatW = mathEulerToQuaternion(xRot,yRot,zRot) |
144 | self.positionInterpolator:setTargetPosition(x, y, z) |
145 | self.quaternionInterpolator:setTargetQuaternion(quatX, quatY, quatZ, quatW) |
146 | self.networkTimeInterpolator:startNewPhaseNetwork() |
147 | end |
148 | end |
149 | end |
setLocalPositionQuaternion
DescriptionSet local poseDefinition
setLocalPositionQuaternion(float x, float y, float z, float xRot, float yRot, float zRot, float w_rot)Arguments
float | x | x position |
float | y | z position |
float | z | z position |
float | xRot | x rotation |
float | yRot | y rotation |
float | zRot | z rotation |
float | w_rot | w rotation |
309 | function PhysicsObject:setLocalPositionQuaternion(x, y, z, quatX, quatY, quatZ, quatW, changeInterp) |
310 | setTranslation(self.nodeId, x, y, z) |
311 | setQuaternion(self.nodeId, quatX, quatY, quatZ, quatW) |
312 | |
313 | if changeInterp then |
314 | if not self.isServer then |
315 | self.positionInterpolator:setPosition(getWorldTranslation(self.nodeId)) |
316 | self.quaternionInterpolator:setQuaternion(getWorldQuaternion(self.nodeId)) |
317 | else |
318 | self:raiseDirtyFlags(self.physicsObjectDirtyFlag) |
319 | self.sendPosX, self.sendPosY, self.sendPosZ = getWorldTranslation(self.nodeId) |
320 | self.sendRotX, self.sendRotY, self.sendRotZ = getWorldRotation(self.nodeId) |
321 | end |
322 | end |
323 | end |
setNodeId
DescriptionSet node idDefinition
setNodeId(integer nodeId)Arguments
integer | nodeId | node Id |
61 | function PhysicsObject:setNodeId(nodeId) |
62 | self.nodeId = nodeId |
63 | setRigidBodyType(self.nodeId, self:getDefaultRigidBodyType()) |
64 | addToPhysics(self.nodeId) |
65 | |
66 | local x, y, z = getTranslation(self.nodeId) |
67 | local xRot, yRot, zRot = getRotation(self.nodeId) |
68 | self.sendPosX, self.sendPosY, self.sendPosZ = x, y, z |
69 | self.sendRotX, self.sendRotY, self.sendRotZ = xRot, yRot, zRot |
70 | |
71 | if not self.isServer then |
72 | local quatX, quatY, quatZ, quatW = mathEulerToQuaternion(xRot, yRot, zRot) |
73 | self.positionInterpolator = InterpolatorPosition.new(x, y, z) |
74 | self.quaternionInterpolator = InterpolatorQuaternion.new(quatX, quatY, quatZ, quatW) |
75 | end |
76 | |
77 | self:addChildenToNodeObject(self.nodeId) |
78 | end |
setWorldPositionQuaternion
DescriptionSet world poseDefinition
setWorldPositionQuaternion(float x, float y, float z, float xRot, float yRot, float zRot, float w_rot)Arguments
float | x | x position |
float | y | z position |
float | z | z position |
float | xRot | x rotation |
float | yRot | y rotation |
float | zRot | z rotation |
float | w_rot | w rotation |
284 | function PhysicsObject:setWorldPositionQuaternion(x, y, z, quatX, quatY, quatZ, quatW, changeInterp) |
285 | setWorldTranslation(self.nodeId, x, y, z) |
286 | setWorldQuaternion(self.nodeId, quatX, quatY, quatZ, quatW) |
287 | |
288 | if changeInterp then |
289 | if not self.isServer then |
290 | self.positionInterpolator:setPosition(x, y, z) |
291 | self.quaternionInterpolator:setQuaternion(quatX, quatY, quatZ, quatW) |
292 | else |
293 | self:raiseDirtyFlags(self.physicsObjectDirtyFlag) |
294 | self.sendPosX, self.sendPosY, self.sendPosZ = x, y ,z |
295 | self.sendRotX, self.sendRotY, self.sendRotZ = getWorldRotation(self.nodeId) |
296 | end |
297 | end |
298 | 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 |
228 | function PhysicsObject:testScope(x,y,z, coeff) |
229 | local x1, y1, z1 = getWorldTranslation(self.nodeId) |
230 | local dist = (x1-x)*(x1-x) + (y1-y)*(y1-y) + (z1-z)*(z1-z) |
231 | local clipDist = math.min(getClipDistance(self.nodeId)*coeff, self.forcedClipDistance) |
232 | if dist < clipDist*clipDist then |
233 | return true |
234 | else |
235 | return false |
236 | end |
237 | end |
update
DescriptionUpdateDefinition
update(float dt)Arguments
float | dt | time since last call in ms |
175 | function PhysicsObject:update(dt) |
176 | if not self.isServer then |
177 | self.networkTimeInterpolator:update(dt) |
178 | local interpolationAlpha = self.networkTimeInterpolator:getAlpha() |
179 | local posX, posY, posZ = self.positionInterpolator:getInterpolatedValues(interpolationAlpha) |
180 | local quatX, quatY, quatZ, quatW = self.quaternionInterpolator:getInterpolatedValues(interpolationAlpha) |
181 | self:setWorldPositionQuaternion(posX, posY, posZ, quatX, quatY, quatZ, quatW, false) |
182 | |
183 | if self.networkTimeInterpolator:isInterpolating() then |
184 | self:raiseActive() |
185 | end |
186 | else |
187 | if not getIsSleeping(self.nodeId) then |
188 | self:raiseActive() |
189 | end |
190 | end |
191 | end |
updateMove
DescriptionUpdate moveDefinition
updateMove()Return Values
boolean | hasMoved | has moved |
197 | function PhysicsObject:updateMove() |
198 | local x, y, z = getWorldTranslation(self.nodeId) |
199 | local xRot, yRot, zRot = getWorldRotation(self.nodeId) |
200 | local hasMoved = math.abs(self.sendPosX-x)>0.005 or math.abs(self.sendPosY-y)>0.005 or math.abs(self.sendPosZ-z)>0.005 or |
201 | math.abs(self.sendRotX-xRot)>0.02 or math.abs(self.sendRotY-yRot)>0.02 or math.abs(self.sendRotZ-zRot)>0.02 |
202 | |
203 | if hasMoved then |
204 | self:raiseDirtyFlags(self.physicsObjectDirtyFlag) |
205 | self.sendPosX, self.sendPosY, self.sendPosZ = x, y ,z |
206 | self.sendRotX, self.sendRotY, self.sendRotZ = xRot, yRot, zRot |
207 | end |
208 | |
209 | return hasMoved |
210 | end |
updateTick
DescriptionupdateTickDefinition
updateTick(float dt)Arguments
float | dt | time since last call in ms |
215 | function PhysicsObject:updateTick(dt) |
216 | if self.isServer then |
217 | self:updateMove() |
218 | end |
219 | end |
wakeUp
DescriptionWake of the physics of the objectDefinition
wakeUp()Code
271 | function PhysicsObject:wakeUp() |
272 | I3DUtil.wakeUpObject(self.nodeId) |
273 | end |
writeStream
DescriptionCalled on server side on joinDefinition
writeStream(integer streamId, table connection)Arguments
integer | streamId | stream ID |
table | connection | connection |
109 | function PhysicsObject:writeStream(streamId, connection) |
110 | PhysicsObject:superClass().writeStream(self, streamId, connection) |
111 | |
112 | if not connection:getIsServer() then |
113 | local x,y,z = getWorldTranslation(self.nodeId) |
114 | local xRot,yRot,zRot = getWorldRotation(self.nodeId) |
115 | local paramsXZ = g_currentMission.vehicleXZPosCompressionParams |
116 | local paramsY = g_currentMission.vehicleYPosCompressionParams |
117 | NetworkUtil.writeCompressedWorldPosition(streamId, x, paramsXZ) |
118 | NetworkUtil.writeCompressedWorldPosition(streamId, y, paramsY) |
119 | NetworkUtil.writeCompressedWorldPosition(streamId, z, paramsXZ) |
120 | NetworkUtil.writeCompressedAngle(streamId, xRot) |
121 | NetworkUtil.writeCompressedAngle(streamId, yRot) |
122 | NetworkUtil.writeCompressedAngle(streamId, zRot) |
123 | end |
124 | end |
writeUpdateStream
DescriptionCalled on server side on updateDefinition
writeUpdateStream(integer streamId, table connection, integer dirtyMask)Arguments
integer | streamId | stream ID |
table | connection | connection |
integer | dirtyMask | dirty mask |
156 | function PhysicsObject:writeUpdateStream(streamId, connection, dirtyMask) |
157 | if not connection:getIsServer() then |
158 | if streamWriteBool(streamId, bitAND(dirtyMask, self.physicsObjectDirtyFlag) ~= 0) then |
159 | local paramsXZ = g_currentMission.vehicleXZPosCompressionParams |
160 | local paramsY = g_currentMission.vehicleYPosCompressionParams |
161 | NetworkUtil.writeCompressedWorldPosition(streamId, self.sendPosX, paramsXZ) |
162 | NetworkUtil.writeCompressedWorldPosition(streamId, self.sendPosY, paramsY) |
163 | NetworkUtil.writeCompressedWorldPosition(streamId, self.sendPosZ, paramsXZ) |
164 | |
165 | NetworkUtil.writeCompressedAngle(streamId, self.sendRotX) |
166 | NetworkUtil.writeCompressedAngle(streamId, self.sendRotY) |
167 | NetworkUtil.writeCompressedAngle(streamId, self.sendRotZ) |
168 | end |
169 | end |
170 | end |