Script v1.7.1.0
- AI
- Animals
- Contracts
- Debug
- Economy
- Effects
- Events
- Farms
- GUI
- Handtools
- I3d
- Materials
- Misc
- Objects
- AnimatedMapObject
- AnimatedObject
- AnimatedObjectEvent
- Bale
- Basketball
- Bga
- BgaSellStation
- BunkerSilo
- BuyingStation
- DigitalDisplay
- DogBall
- HelpIcons
- LoadingStation
- NightIllumination
- Nightlight2
- NightlightFlicker
- PhysicsObject
- Rotator
- SellingStation
- SimParticleSystem
- Storage
- StorageSystem
- SunAdmirer
- TourIcons
- UnloadingStation
- VehicleSellingPoint
- WildlifeSpawner
- 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
PhysicsObject
DescriptionClass for physics objectsParent
ObjectFunctions
- addChildsToNodeObject
- delete
- getAllowsAutoDelete
- getDefaultRigidBodyType
- getUpdatePriority
- loadOnCreate
- new
- onGhostAdd
- onGhostRemove
- readStream
- readUpdateStream
- setNodeId
- setWorldPositionQuaternion
- testScope
- update
- updateMove
- updateTick
- writeStream
- writeUpdateStream
addChildsToNodeObject
DescriptionAdd childs to node objectDefinition
addChildsToNodeObject(integer nodeId)Arguments
integer | nodeId | id of node |
297 | function PhysicsObject:addChildsToNodeObject(nodeId) |
298 | for i=0,getNumOfChildren(nodeId)-1 do |
299 | self:addChildsToNodeObject(getChildAt(nodeId, i)) |
300 | end |
301 | local rigidBodyType = getRigidBodyType(nodeId) |
302 | if rigidBodyType ~= "NoRigidBody" then |
303 | g_currentMission:addNodeObject(nodeId, self) |
304 | |
305 | if self.isServer then |
306 | addWakeUpReport(nodeId, "onPhysicObjectWakeUpCallback", self) |
307 | end |
308 | end |
309 | end |
delete
DescriptionDeleting physics objectDefinition
delete()Code
30 | function PhysicsObject:delete() |
31 | self:removeWakeUpReports(self.nodeId) |
32 | g_currentMission:removeNodeObject(self.nodeId) |
33 | delete(self.nodeId) |
34 | self.nodeId = 0 |
35 | PhysicsObject:superClass().delete(self) |
36 | end |
getAllowsAutoDelete
DescriptionGet allows auto deleteDefinition
getAllowsAutoDelete()Return Values
boolean | allowsAutoDelete | allows auto delete |
41 | function PhysicsObject:getAllowsAutoDelete() |
42 | return true |
43 | end |
getDefaultRigidBodyType
DescriptionGet default rigid body typeDefinition
getDefaultRigidBodyType()Return Values
string | rigidBodyType | rigid body type |
286 | function PhysicsObject:getDefaultRigidBodyType() |
287 | if self.isServer then |
288 | return "Dynamic" |
289 | else |
290 | return "Kinematic" |
291 | end |
292 | 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 |
241 | function PhysicsObject:getUpdatePriority(skipCount, x, y, z, coeff, connection) |
242 | local x1, y1, z1 = getWorldTranslation(self.nodeId) |
243 | local dist = math.sqrt((x1-x)*(x1-x) + (y1-y)*(y1-y) + (z1-z)*(z1-z)) |
244 | local clipDist = math.min(getClipDistance(self.nodeId)*coeff, self.forcedClipDistance) |
245 | return (1-dist/clipDist)* 0.8 + 0.5*skipCount * 0.2 |
246 | end |
loadOnCreate
DescriptionLoad on createDefinition
loadOnCreate(integer nodeId)Arguments
integer | nodeId | node id |
48 | function PhysicsObject:loadOnCreate(nodeId) |
49 | self:setNodeId(nodeId) |
50 | if not self.isServer then |
51 | self:onGhostRemove() |
52 | end |
53 | 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
257 | function PhysicsObject:onGhostAdd() |
258 | setVisibility(self.nodeId, true) |
259 | addToPhysics(self.nodeId) |
260 | end |
onGhostRemove
DescriptionOn ghost removeDefinition
onGhostRemove()Code
250 | function PhysicsObject:onGhostRemove() |
251 | setVisibility(self.nodeId, false) |
252 | removeFromPhysics(self.nodeId) |
253 | end |
readStream
DescriptionCalled on client side on joinDefinition
readStream(integer streamId, table connection)Arguments
integer | streamId | stream ID |
table | connection | connection |
81 | function PhysicsObject:readStream(streamId, connection) |
82 | assert(self.nodeId ~= 0) |
83 | if connection:getIsServer() then |
84 | local paramsXZ = g_currentMission.vehicleXZPosCompressionParams |
85 | local paramsY = g_currentMission.vehicleYPosCompressionParams |
86 | local x = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ) |
87 | local y = NetworkUtil.readCompressedWorldPosition(streamId, paramsY) |
88 | local z = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ) |
89 | local xRot = NetworkUtil.readCompressedAngle(streamId) |
90 | local yRot = NetworkUtil.readCompressedAngle(streamId) |
91 | local zRot = NetworkUtil.readCompressedAngle(streamId) |
92 | |
93 | local quatX, quatY, quatZ, quatW = mathEulerToQuaternion(xRot,yRot,zRot) |
94 | self:setWorldPositionQuaternion(x, y, z, quatX, quatY, quatZ, quatW, true) |
95 | |
96 | self.networkTimeInterpolator:reset() |
97 | end |
98 | 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 |
124 | function PhysicsObject:readUpdateStream(streamId, timestamp, connection) |
125 | if connection:getIsServer() then |
126 | if streamReadBool(streamId) then |
127 | local paramsXZ = g_currentMission.vehicleXZPosCompressionParams |
128 | local paramsY = g_currentMission.vehicleYPosCompressionParams |
129 | local x = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ) |
130 | local y = NetworkUtil.readCompressedWorldPosition(streamId, paramsY) |
131 | local z = NetworkUtil.readCompressedWorldPosition(streamId, paramsXZ) |
132 | local xRot = NetworkUtil.readCompressedAngle(streamId) |
133 | local yRot = NetworkUtil.readCompressedAngle(streamId) |
134 | local zRot = NetworkUtil.readCompressedAngle(streamId) |
135 | |
136 | local quatX, quatY, quatZ, quatW = mathEulerToQuaternion(xRot,yRot,zRot) |
137 | self.positionInterpolator:setTargetPosition(x, y, z) |
138 | self.quaternionInterpolator:setTargetQuaternion(quatX, quatY, quatZ, quatW) |
139 | self.networkTimeInterpolator:startNewPhaseNetwork() |
140 | end |
141 | end |
142 | end |
setNodeId
DescriptionSet node idDefinition
setNodeId(integer nodeId)Arguments
integer | nodeId | node Id |
58 | function PhysicsObject:setNodeId(nodeId) |
59 | self.nodeId = nodeId |
60 | setRigidBodyType(self.nodeId, self:getDefaultRigidBodyType()) |
61 | addToPhysics(self.nodeId) |
62 | |
63 | local x, y, z = getTranslation(self.nodeId) |
64 | local xRot, yRot, zRot = getRotation(self.nodeId) |
65 | self.sendPosX, self.sendPosY, self.sendPosZ = x, y, z |
66 | self.sendRotX, self.sendRotY, self.sendRotZ = xRot, yRot, zRot |
67 | |
68 | if not self.isServer then |
69 | local quatX, quatY, quatZ, quatW = mathEulerToQuaternion(xRot, yRot, zRot) |
70 | self.positionInterpolator = InterpolatorPosition:new(x, y, z) |
71 | self.quaternionInterpolator = InterpolatorQuaternion:new(quatX, quatY, quatZ, quatW) |
72 | end |
73 | |
74 | self:addChildsToNodeObject(self.nodeId) |
75 | end |
setWorldPositionQuaternion
DescriptionSet 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 |
271 | function PhysicsObject:setWorldPositionQuaternion(x, y, z, quatX, quatY, quatZ, quatW, changeInterp) |
272 | if not self.isServer then |
273 | if changeInterp then |
274 | self.positionInterpolator:setPosition(x, y, z) |
275 | self.quaternionInterpolator:setQuaternion(quatX, quatY, quatZ, quatW) |
276 | end |
277 | end |
278 | |
279 | setTranslation(self.nodeId, x, y, z) |
280 | setQuaternion(self.nodeId, quatX, quatY, quatZ, quatW) |
281 | 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 |
221 | function PhysicsObject:testScope(x,y,z, coeff) |
222 | local x1, y1, z1 = getWorldTranslation(self.nodeId) |
223 | local dist = (x1-x)*(x1-x) + (y1-y)*(y1-y) + (z1-z)*(z1-z) |
224 | local clipDist = math.min(getClipDistance(self.nodeId)*coeff, self.forcedClipDistance) |
225 | if dist < clipDist*clipDist then |
226 | return true |
227 | else |
228 | return false |
229 | end |
230 | end |
update
DescriptionUpdateDefinition
update(float dt)Arguments
float | dt | time since last call in ms |
168 | function PhysicsObject:update(dt) |
169 | if not self.isServer then |
170 | self.networkTimeInterpolator:update(dt) |
171 | local interpolationAlpha = self.networkTimeInterpolator:getAlpha() |
172 | local posX, posY, posZ = self.positionInterpolator:getInterpolatedValues(interpolationAlpha) |
173 | local quatX, quatY, quatZ, quatW = self.quaternionInterpolator:getInterpolatedValues(interpolationAlpha) |
174 | self:setWorldPositionQuaternion(posX, posY, posZ, quatX, quatY, quatZ, quatW, false) |
175 | |
176 | if self.networkTimeInterpolator:isInterpolating() then |
177 | self:raiseActive() |
178 | end |
179 | else |
180 | if not getIsSleeping(self.nodeId) then |
181 | self:raiseActive() |
182 | end |
183 | end |
184 | end |
updateMove
DescriptionUpdate moveDefinition
updateMove()Return Values
boolean | hasMoved | has moved |
190 | function PhysicsObject:updateMove() |
191 | local x, y, z = getTranslation(self.nodeId) |
192 | local xRot, yRot, zRot = getRotation(self.nodeId) |
193 | 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 |
194 | math.abs(self.sendRotX-xRot)>0.02 or math.abs(self.sendRotY-yRot)>0.02 or math.abs(self.sendRotZ-zRot)>0.02 |
195 | |
196 | if hasMoved then |
197 | self:raiseDirtyFlags(self.physicsObjectDirtyFlag) |
198 | self.sendPosX, self.sendPosY, self.sendPosZ = x, y ,z |
199 | self.sendRotX, self.sendRotY, self.sendRotZ = xRot, yRot, zRot |
200 | end |
201 | |
202 | return hasMoved |
203 | end |
updateTick
DescriptionupdateTickDefinition
updateTick(float dt)Arguments
float | dt | time since last call in ms |
208 | function PhysicsObject:updateTick(dt) |
209 | if self.isServer then |
210 | self:updateMove() |
211 | end |
212 | end |
writeStream
DescriptionCalled on server side on joinDefinition
writeStream(integer streamId, table connection)Arguments
integer | streamId | stream ID |
table | connection | connection |
104 | function PhysicsObject:writeStream(streamId, connection) |
105 | if not connection:getIsServer() then |
106 | local x,y,z = getTranslation(self.nodeId) |
107 | local xRot,yRot,zRot = getRotation(self.nodeId) |
108 | local paramsXZ = g_currentMission.vehicleXZPosCompressionParams |
109 | local paramsY = g_currentMission.vehicleYPosCompressionParams |
110 | NetworkUtil.writeCompressedWorldPosition(streamId, x, paramsXZ) |
111 | NetworkUtil.writeCompressedWorldPosition(streamId, y, paramsY) |
112 | NetworkUtil.writeCompressedWorldPosition(streamId, z, paramsXZ) |
113 | NetworkUtil.writeCompressedAngle(streamId, xRot) |
114 | NetworkUtil.writeCompressedAngle(streamId, yRot) |
115 | NetworkUtil.writeCompressedAngle(streamId, zRot) |
116 | end |
117 | 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 |
149 | function PhysicsObject:writeUpdateStream(streamId, connection, dirtyMask) |
150 | if not connection:getIsServer() then |
151 | if streamWriteBool(streamId, bitAND(dirtyMask, self.physicsObjectDirtyFlag) ~= 0) then |
152 | local paramsXZ = g_currentMission.vehicleXZPosCompressionParams |
153 | local paramsY = g_currentMission.vehicleYPosCompressionParams |
154 | NetworkUtil.writeCompressedWorldPosition(streamId, self.sendPosX, paramsXZ) |
155 | NetworkUtil.writeCompressedWorldPosition(streamId, self.sendPosY, paramsY) |
156 | NetworkUtil.writeCompressedWorldPosition(streamId, self.sendPosZ, paramsXZ) |
157 | |
158 | NetworkUtil.writeCompressedAngle(streamId, self.sendRotX) |
159 | NetworkUtil.writeCompressedAngle(streamId, self.sendRotY) |
160 | NetworkUtil.writeCompressedAngle(streamId, self.sendRotZ) |
161 | end |
162 | end |
163 | end |