20 | function BaleGrab:load(savegame) |
21 | |
22 | self.dynamicMountTriggerCallback = BaleGrab.dynamicMountTriggerCallback; |
23 | self.addDynamicMountedObject = BaleGrab.addDynamicMountedObject; |
24 | self.removeDynamicMountedObject = BaleGrab.removeDynamicMountedObject; |
25 | |
26 | if self.isServer then |
27 | local attacherTriggerTriggerNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.baleGrab#triggerNode")); |
28 | local attacherTriggerRootNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.baleGrab#rootNode")); |
29 | local attacherTriggerJointNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.baleGrab#jointNode")); |
30 | local attacherJointTypeString = Utils.getNoNil(getXMLString(self.xmlFile, "vehicle.baleGrab#jointType"), "TYPE_AUTO_ATTACH_Y"); |
31 | local attacherJointType = DynamicMountUtil.TYPE_AUTO_ATTACH_Y; |
32 | if attacherJointTypeString == "TYPE_FORK" then |
33 | attacherJointType = DynamicMountUtil.TYPE_FORK; |
34 | elseif attacherJointTypeString == "TYPE_AUTO_ATTACH_XZ" then |
35 | attacherJointType = DynamicMountUtil.TYPE_AUTO_ATTACH_XZ; |
36 | elseif attacherJointTypeString == "TYPE_AUTO_ATTACH_XYZ" then |
37 | attacherJointType = DynamicMountUtil.TYPE_AUTO_ATTACH_XYZ; |
38 | end; |
39 | if attacherTriggerTriggerNode ~= nil and attacherTriggerRootNode ~= nil and attacherTriggerJointNode ~= nil then |
40 | local forceAcceleration = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.baleGrab#forceAcceleration"), 20); |
41 | addTrigger(attacherTriggerTriggerNode, "dynamicMountTriggerCallback", self); |
42 | |
43 | local grabRefComponentJointIndex1 = getXMLInt(self.xmlFile, "vehicle.baleGrab#grabRefComponentJointIndex1"); |
44 | local grabRefComponentJointIndex2 = getXMLInt(self.xmlFile, "vehicle.baleGrab#grabRefComponentJointIndex2"); |
45 | local componentJoint1, componentJoint2; |
46 | if grabRefComponentJointIndex1 ~= nil then |
47 | componentJoint1 = self.componentJoints[grabRefComponentJointIndex1+1]; |
48 | end |
49 | if grabRefComponentJointIndex2 ~= nil then |
50 | componentJoint2 = self.componentJoints[grabRefComponentJointIndex2+1]; |
51 | end |
52 | local rotDiffThreshold1 = math.rad(Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.baleGrab#rotDiffThreshold1"), 2)); |
53 | local rotDiffThreshold2 = math.rad(Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.baleGrab#rotDiffThreshold2"), 2)); |
54 | self.dynamicMountAttacherTrigger = { |
55 | triggerNode=attacherTriggerTriggerNode, rootNode=attacherTriggerRootNode, jointNode=attacherTriggerJointNode, attacherJointType=attacherJointType, forceAcceleration=forceAcceleration, |
56 | componentJoint1=componentJoint1, rotDiffThreshold1=rotDiffThreshold1, cosRotDiffThreshold1=math.cos(rotDiffThreshold1), |
57 | componentJoint2=componentJoint2, rotDiffThreshold2=rotDiffThreshold2, cosRotDiffThreshold2=math.cos(rotDiffThreshold2) |
58 | }; |
59 | end |
60 | self.dynamicMountedObjects = {}; |
61 | self.pendingDynamicMountObjects = {}; |
62 | end |
63 | end; |
90 | function BaleGrab:updateTick(dt) |
91 | if self.isServer and self:getIsActive() then |
92 | local attachTrigger = self.dynamicMountAttacherTrigger |
93 | |
94 | local isClosed = true; |
95 | if attachTrigger.componentJoint1 ~= nil then |
96 | isClosed = BaleGrab.isComponentJointOutsideLimit(self, attachTrigger.componentJoint1, attachTrigger.rotDiffThreshold1, attachTrigger.cosRotDiffThreshold1); |
97 | end |
98 | if isClosed and attachTrigger.componentJoint2 ~= nil then |
99 | isClosed = BaleGrab.isComponentJointOutsideLimit(self, attachTrigger.componentJoint2, attachTrigger.rotDiffThreshold2, attachTrigger.cosRotDiffThreshold2); |
100 | end |
101 | if isClosed then |
102 | for object,_ in pairs(self.pendingDynamicMountObjects) do |
103 | if self.dynamicMountedObjects[object] == nil then |
104 | object:unmountDynamic(); |
105 | if object:mountDynamic(self, self.dynamicMountAttacherTrigger.rootNode, self.dynamicMountAttacherTrigger.jointNode, self.dynamicMountAttacherTrigger.attacherJointType, self.dynamicMountAttacherTrigger.forceAcceleration) then |
106 | self:addDynamicMountedObject(object); |
107 | end; |
108 | end |
109 | end |
110 | else |
111 | for object,_ in pairs(self.dynamicMountedObjects) do |
112 | self:removeDynamicMountedObject(object, false); |
113 | object:unmountDynamic(); |
114 | end; |
115 | end; |
116 | end |
117 | end; |
148 | function BaleGrab:dynamicMountTriggerCallback(triggerId, otherActorId, onEnter, onLeave, onStay, otherShapeId) |
149 | if onEnter then |
150 | local object = g_currentMission:getNodeObject(otherActorId); |
151 | if object == nil then |
152 | object = g_currentMission.nodeToVehicle[otherActorId]; |
153 | end; |
154 | if object ~= nil and object ~= self and object.getSupportsMountDynamic ~= nil and object:getSupportsMountDynamic() then |
155 | self.pendingDynamicMountObjects[object] = Utils.getNoNil(self.pendingDynamicMountObjects[object], 0) + 1; |
156 | end |
157 | elseif onLeave then |
158 | local object = g_currentMission:getNodeObject(otherActorId); |
159 | if object == nil then |
160 | object = g_currentMission.nodeToVehicle[otherActorId]; |
161 | end; |
162 | if object ~= nil then |
163 | if self.pendingDynamicMountObjects[object] ~= nil then |
164 | local count = self.pendingDynamicMountObjects[object]-1; |
165 | if count == 0 then |
166 | self.pendingDynamicMountObjects[object] = nil; |
167 | |
168 | if self.dynamicMountedObjects[object] ~= nil then |
169 | self:removeDynamicMountedObject(object, false); |
170 | object:unmountDynamic(); |
171 | end |
172 | else |
173 | self.pendingDynamicMountObjects[object] = count; |
174 | end |
175 | end |
176 | end |
177 | end |
178 | end; |