Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de
1 | -- SlideDoorTrigger class |
2 | -- |
3 | -- Upon player entry, this trigger moves its children. Each child is assumed to be a slide door and contains user attributes that indicate in which direction it moves. |
4 | -- The slide doors pause when fully opened and then close automatically (if the player does not remain inside the trigger). |
5 | -- |
6 | -- Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved. |
7 | |
8 | SlideDoorTrigger = {} |
9 | |
10 | local SlideDoorTrigger_mt = Class(SlideDoorTrigger); |
11 | |
12 | function SlideDoorTrigger:onCreate(id) |
13 | g_currentMission:addUpdateable(SlideDoorTrigger:new(id)); |
14 | --print("Created SlideDoorTrigger, id: ", id); |
15 | end; |
16 | |
17 | function SlideDoorTrigger:new(triggerId) |
18 | local self = {}; |
19 | setmetatable(self, SlideDoorTrigger_mt); |
20 | |
21 | self.triggerId = triggerId; |
22 | addTrigger(triggerId, "triggerCallback", self); |
23 | |
24 | local num = getNumOfChildren(triggerId); |
25 | |
26 | self.slideDoors = {}; |
27 | |
28 | for i = 1, num do |
29 | local slideDoor = {}; |
30 | slideDoor.node = getChildAt(triggerId, i - 1); |
31 | slideDoor.startX, slideDoor.startY, slideDoor.startZ = getTranslation(slideDoor.node); |
32 | slideDoor.endX = slideDoor.startX + tonumber(Utils.getNoNil(getUserAttribute(slideDoor.node, "translateX"), "0")); |
33 | slideDoor.endY = slideDoor.startY + tonumber(Utils.getNoNil(getUserAttribute(slideDoor.node, "translateY"), "0")); |
34 | slideDoor.endZ = slideDoor.startZ + tonumber(Utils.getNoNil(getUserAttribute(slideDoor.node, "translateZ"), "0")); |
35 | table.insert(self.slideDoors, slideDoor); |
36 | end; |
37 | |
38 | self.opening = false; |
39 | self.closing = false; |
40 | self.pausing = false; |
41 | |
42 | self.playerLeft = false; |
43 | |
44 | self.speed = tonumber(Utils.getNoNil(getUserAttribute(triggerId, "speed"), "0.001")); |
45 | |
46 | self.pauseDuration = tonumber(Utils.getNoNil(getUserAttribute(triggerId, "pauseDuration"), "2000")); |
47 | self.pauseTime = self.pauseDuration; |
48 | |
49 | self.doorPos = 0; |
50 | |
51 | self.isEnabled = true; |
52 | |
53 | |
54 | return self; |
55 | end; |
56 | |
57 | function SlideDoorTrigger:delete() |
58 | if self.triggerId ~= nil then |
59 | removeTrigger(self.triggerId); |
60 | self.triggerId = nil; |
61 | end; |
62 | end; |
63 | |
64 | function SlideDoorTrigger:update(dt) |
65 | if self.isEnabled then |
66 | local moving = false; |
67 | |
68 | if self.pausing then |
69 | self.pauseTime = self.pauseTime - dt; |
70 | if self.pauseTime <= 0 then |
71 | self.pausing = false; |
72 | self.closing = true; |
73 | end; |
74 | end; |
75 | |
76 | if self.opening then |
77 | moving = true; |
78 | self.doorPos = self.doorPos + self.speed * dt; |
79 | if self.doorPos > 1 then |
80 | self.doorPos = 1; |
81 | self.opening = false; |
82 | if self.playerLeft then |
83 | self.pausing = true; |
84 | self.pauseTime = self.pauseDuration; |
85 | end; |
86 | end; |
87 | end; |
88 | |
89 | if self.closing then |
90 | moving = true; |
91 | self.doorPos = self.doorPos - self.speed * dt; |
92 | if self.doorPos < 0 then |
93 | self.doorPos = 0; |
94 | self.closing = false; |
95 | end; |
96 | end; |
97 | |
98 | if moving then |
99 | for _, slideDoor in pairs(self.slideDoors) do |
100 | local x = (1 - self.doorPos) * slideDoor.startX + self.doorPos * slideDoor.endX; |
101 | local y = (1 - self.doorPos) * slideDoor.startY + self.doorPos * slideDoor.endY; |
102 | local z = (1 - self.doorPos) * slideDoor.startZ + self.doorPos * slideDoor.endZ; |
103 | setTranslation(slideDoor.node, x, y, z); |
104 | end; |
105 | end; |
106 | |
107 | end; |
108 | end; |
109 | |
110 | function SlideDoorTrigger:triggerCallback(triggerId, otherId, onEnter, onLeave, onStay) |
111 | if self.isEnabled and (onEnter or onLeave) then |
112 | if g_currentMission.players[otherId] ~= nil then |
113 | if onEnter then |
114 | self.playerLeft = false; |
115 | |
116 | if self.pausing then |
117 | self.pausing = false; |
118 | end; |
119 | |
120 | self.opening = true; |
121 | self.closing = false; |
122 | else |
123 | self.playerLeft = true; |
124 | if not self.opening then |
125 | self.pausing = true; |
126 | self.pauseTime = self.pauseDuration; |
127 | end; |
128 | end; |
129 | end; |
130 | end; |
131 | end;
|
Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de