Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de
1 | -- |
2 | -- DynamicMountAttacher |
3 | -- Class for vehicle which can dynamically mount objects (e.g. bales and pallets) |
4 | -- |
5 | -- @author Stefan Geiger |
6 | -- @date 12/09/11 |
7 | -- |
8 | -- Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved. |
9 | |
10 | DynamicMountAttacher = {}; |
11 | |
12 | function DynamicMountAttacher.prerequisitesPresent(specializations) |
13 | return true; |
14 | end; |
15 | |
16 | function DynamicMountAttacher:load(xmlFile) |
17 | |
18 | self.dynamicMountTriggerCallback = DynamicMountAttacher.dynamicMountTriggerCallback; |
19 | self.addDynamicMountedObject = DynamicMountAttacher.addDynamicMountedObject; |
20 | self.removeDynamicMountedObject = DynamicMountAttacher.removeDynamicMountedObject; |
21 | |
22 | -- Allow mountable object to attach them selfs to us |
23 | self.dynamicMountAttacherNode = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.dynamicMountAttacher#index")); |
24 | self.dynamicMountAttacherForceLimitScale = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.dynamicMountAttacher#forceLimitScale"), 1); |
25 | self.dynamicMountAttacherTimeToMount = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.dynamicMountAttacher#timeToMount"), 1000); |
26 | |
27 | if self.isServer then |
28 | local attacherTriggerTriggerNode = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.dynamicMountAttacherTrigger#triggerNode")); |
29 | local attacherTriggerRootNode = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.dynamicMountAttacherTrigger#rootNode")); |
30 | local attacherTriggerJointNode = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.dynamicMountAttacherTrigger#jointNode")); |
31 | if attacherTriggerTriggerNode ~= nil and attacherTriggerRootNode ~= nil and attacherTriggerJointNode ~= nil then |
32 | local forceAcceleration = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.dynamicMountAttacherTrigger#forceAcceleration"), 30); |
33 | addTrigger(attacherTriggerTriggerNode, "dynamicMountTriggerCallback", self); |
34 | local mountTypeString = Utils.getNoNil(getXMLString(xmlFile, "vehicle.dynamicMountAttacherTrigger#mountType"), "TYPE_AUTO_ATTACH_XZ"); |
35 | local mountType = Utils.getNoNil(DynamicMountUtil[mountTypeString], DynamicMountUtil.TYPE_AUTO_ATTACH_XZ); |
36 | self.dynamicMountAttacherTrigger = {triggerNode=attacherTriggerTriggerNode, rootNode=attacherTriggerRootNode, jointNode=attacherTriggerJointNode, forceAcceleration=forceAcceleration, mountType = mountType}; |
37 | end |
38 | self.dynamicMountedObjects = {}; |
39 | self.pendingDynamicMountObjects = {}; |
40 | end |
41 | end; |
42 | |
43 | function DynamicMountAttacher:delete() |
44 | if self.isServer then |
45 | for object,_ in pairs(self.dynamicMountedObjects) do |
46 | object:unmountDynamic(); |
47 | end |
48 | end |
49 | if self.dynamicMountAttacherTrigger ~= nil then |
50 | removeTrigger(self.dynamicMountAttacherTrigger.triggerNode); |
51 | end |
52 | end; |
53 | |
54 | function DynamicMountAttacher:mouseEvent(posX, posY, isDown, isUp, button) |
55 | end; |
56 | |
57 | function DynamicMountAttacher:keyEvent(unicode, sym, modifier, isDown) |
58 | end; |
59 | |
60 | function DynamicMountAttacher:update(dt) |
61 | end; |
62 | |
63 | function DynamicMountAttacher:updateTick(dt) |
64 | if self.isServer then |
65 | for object,state in pairs(self.pendingDynamicMountObjects) do |
66 | if self.dynamicMountedObjects[object] == nil then |
67 | if object.lastMoveTime + self.dynamicMountAttacherTimeToMount < g_currentMission.time then |
68 | local doAttach = false; |
69 | if object.components ~= nil then |
70 | if entityExists(object.components[1].node) then |
71 | doAttach = true; |
72 | end; |
73 | end; |
74 | if object.nodeId ~= nil then |
75 | if entityExists(object.nodeId) then |
76 | doAttach = true; |
77 | end; |
78 | end; |
79 | if doAttach then |
80 | local trigger = self.dynamicMountAttacherTrigger; |
81 | if object:mountDynamic(self, trigger.rootNode, trigger.jointNode, trigger.mountType, trigger.forceAcceleration) then |
82 | self:addDynamicMountedObject(object); |
83 | end |
84 | else |
85 | self.pendingDynamicMountObjects[object] = nil; |
86 | end; |
87 | end |
88 | end |
89 | end |
90 | end |
91 | end; |
92 | |
93 | function DynamicMountAttacher:draw() |
94 | end; |
95 | |
96 | function DynamicMountAttacher:addDynamicMountedObject(object) |
97 | self.dynamicMountedObjects[object] = object; |
98 | end |
99 | |
100 | function DynamicMountAttacher:removeDynamicMountedObject(object, isDeleting) |
101 | self.dynamicMountedObjects[object] = nil; |
102 | if isDeleting then |
103 | self.pendingDynamicMountObjects[object] = nil; |
104 | end |
105 | end |
106 | |
107 | function DynamicMountAttacher:dynamicMountTriggerCallback(triggerId, otherActorId, onEnter, onLeave, onStay, otherShapeId) |
108 | if onEnter then |
109 | local object = g_currentMission:getNodeObject(otherActorId); |
110 | if object == nil then |
111 | object = g_currentMission.nodeToVehicle[otherActorId]; |
112 | end; |
113 | if object == self:getRootAttacherVehicle() or object == self.attacherVehicle then |
114 | object = nil; |
115 | end; |
116 | if object ~= nil and object ~= self and object.getSupportsMountDynamic ~= nil and object:getSupportsMountDynamic() and object.lastMoveTime ~= nil then |
117 | self.pendingDynamicMountObjects[object] = Utils.getNoNil(self.pendingDynamicMountObjects[object], 0) + 1; |
118 | end |
119 | elseif onLeave then |
120 | local object = g_currentMission:getNodeObject(otherActorId); |
121 | if object == nil then |
122 | object = g_currentMission.nodeToVehicle[otherActorId]; |
123 | end; |
124 | if object ~= nil then |
125 | if self.pendingDynamicMountObjects[object] ~= nil then |
126 | local count = self.pendingDynamicMountObjects[object]-1; |
127 | if count == 0 then |
128 | self.pendingDynamicMountObjects[object] = nil; |
129 | |
130 | if self.dynamicMountedObjects[object] ~= nil then |
131 | self:removeDynamicMountedObject(object, false); |
132 | object:unmountDynamic(); |
133 | end |
134 | else |
135 | self.pendingDynamicMountObjects[object] = count; |
136 | end |
137 | end |
138 | end |
139 | end |
140 | end;
|
Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de