LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

PhysicsObject

Description
Class for physics objects
Parent
Object
Functions

addChildenToNodeObject

Description
Add childs to node object
Definition
addChildenToNodeObject(integer nodeId)
Arguments
integernodeIdid of node
Code
355function 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
368end

delete

Description
Deleting physics object
Definition
delete()
Code
30function 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)
39end

getAllowsAutoDelete

Description
Get allows auto delete
Definition
getAllowsAutoDelete()
Return Values
booleanallowsAutoDeleteallows auto delete
Code
44function PhysicsObject:getAllowsAutoDelete()
45 return true
46end

getDefaultRigidBodyType

Description
Get default rigid body type
Definition
getDefaultRigidBodyType()
Return Values
stringrigidBodyTyperigid body type
Code
329function PhysicsObject:getDefaultRigidBodyType()
330 if self.isServer then
331 return RigidBodyType.DYNAMIC
332 else
333 return RigidBodyType.KINEMATIC
334 end
335end

getUpdatePriority

Description
Get update priority
Definition
getUpdatePriority(float skipCount, float x, float y, float z, float coeff, table connection)
Arguments
floatskipCountskip count
floatxx position
floatyy position
floatzz position
floatcoeffcoeff
tableconnectionconnection
Return Values
floatprioritypriority
Code
248function 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
253end

loadOnCreate

Description
Load on create
Definition
loadOnCreate(integer nodeId)
Arguments
integernodeIdnode id
Code
51function PhysicsObject:loadOnCreate(nodeId)
52 self:setNodeId(nodeId)
53 if not self.isServer then
54 self:onGhostRemove()
55 end
56end

new

Description
Creating physics object
Definition
new(boolean isServer, boolean isClient, table customMt)
Arguments
booleanisServeris server
booleanisClientis client
tablecustomMtcustomMt
Return Values
tableinstanceInstance of object
Code
15function 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
26end

onGhostAdd

Description
On ghost add
Definition
onGhostAdd()
Code
264function PhysicsObject:onGhostAdd()
265 setVisibility(self.nodeId, true)
266 addToPhysics(self.nodeId)
267end

onGhostRemove

Description
On ghost remove
Definition
onGhostRemove()
Code
257function PhysicsObject:onGhostRemove()
258 setVisibility(self.nodeId, false)
259 removeFromPhysics(self.nodeId)
260end

readStream

Description
Called on client side on join
Definition
readStream(integer streamId, table connection)
Arguments
integerstreamIdstream ID
tableconnectionconnection
Code
84function 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
103end

readUpdateStream

Description
Called on client side on update
Definition
readUpdateStream(integer streamId, integer timestamp, table connection)
Arguments
integerstreamIdstream ID
integertimestamptimestamp
tableconnectionconnection
Code
131function 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
149end

setLocalPositionQuaternion

Description
Set local pose
Definition
setLocalPositionQuaternion(float x, float y, float z, float xRot, float yRot, float zRot, float w_rot)
Arguments
floatxx position
floatyz position
floatzz position
floatxRotx rotation
floatyRoty rotation
floatzRotz rotation
floatw_rotw rotation
Code
309function 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
323end

setNodeId

Description
Set node id
Definition
setNodeId(integer nodeId)
Arguments
integernodeIdnode Id
Code
61function 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)
78end

setWorldPositionQuaternion

Description
Set world pose
Definition
setWorldPositionQuaternion(float x, float y, float z, float xRot, float yRot, float zRot, float w_rot)
Arguments
floatxx position
floatyz position
floatzz position
floatxRotx rotation
floatyRoty rotation
floatzRotz rotation
floatw_rotw rotation
Code
284function 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
298end

testScope

Description
Test scope
Definition
testScope(float x, float y, float z, float coeff)
Arguments
floatxx position
floatyy position
floatzz position
floatcoeffcoeff
Return Values
booleaninScopein scope
Code
228function 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
237end

update

Description
Update
Definition
update(float dt)
Arguments
floatdttime since last call in ms
Code
175function 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
191end

updateMove

Description
Update move
Definition
updateMove()
Return Values
booleanhasMovedhas moved
Code
197function 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
210end

updateTick

Description
updateTick
Definition
updateTick(float dt)
Arguments
floatdttime since last call in ms
Code
215function PhysicsObject:updateTick(dt)
216 if self.isServer then
217 self:updateMove()
218 end
219end

wakeUp

Description
Wake of the physics of the object
Definition
wakeUp()
Code
271function PhysicsObject:wakeUp()
272 I3DUtil.wakeUpObject(self.nodeId)
273end

writeStream

Description
Called on server side on join
Definition
writeStream(integer streamId, table connection)
Arguments
integerstreamIdstream ID
tableconnectionconnection
Code
109function 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
124end

writeUpdateStream

Description
Called on server side on update
Definition
writeUpdateStream(integer streamId, table connection, integer dirtyMask)
Arguments
integerstreamIdstream ID
tableconnectionconnection
integerdirtyMaskdirty mask
Code
156function 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
170end