Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de
1 | -- Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved. |
2 | |
3 | Butterfly = {} |
4 | |
5 | local Butterfly_mt = Class(Butterfly); |
6 | |
7 | function Butterfly:onCreate(id) |
8 | g_currentMission:addUpdateable(Butterfly:new(id)); |
9 | -- print("created Butterfly, id: ", id); |
10 | end; |
11 | |
12 | function Butterfly:new(id) |
13 | local self = {}; |
14 | setmetatable(self, Butterfly_mt); |
15 | |
16 | self.id = id; |
17 | self.butterflies = {}; |
18 | |
19 | for i = 1, getNumOfChildren(id) do |
20 | local butterflyId = getChildAt(id, i - 1); |
21 | local splineId = getChildAt(butterflyId, 0); |
22 | local meshId = getChildAt(butterflyId, 1); |
23 | local speed = Utils.getNoNil(getUserAttribute(butterflyId, "speed"), 0.005); |
24 | local butterfly = {butterflyId = butterflyId, splineId = splineId, meshId = meshId, speed = speed, splinePos = 0}; |
25 | table.insert(self.butterflies, butterfly); |
26 | end; |
27 | |
28 | self.time = 0; |
29 | self.animTimer = 0; |
30 | self.animDelay = 100; |
31 | self.flip = true; |
32 | |
33 | self.checkClosestButterflyTimer = 0; |
34 | self.checkClosestButterflyInterval = 2000; |
35 | self.activeButterfly = nil; |
36 | |
37 | self.isSunOn = true; |
38 | |
39 | return self; |
40 | end; |
41 | |
42 | function Butterfly:delete() |
43 | |
44 | end; |
45 | |
46 | function Butterfly:update(dt) |
47 | |
48 | if g_currentMission.environment.isSunOn ~= self.isSunOn then |
49 | self.isSunOn = g_currentMission.environment.isSunOn; |
50 | if self.isSunOn then |
51 | setVisibility(self.id, true); |
52 | else |
53 | setVisibility(self.id, false); -- no butterflies at night |
54 | end; |
55 | end; |
56 | |
57 | if self.isSunOn then |
58 | self.checkClosestButterflyTimer = self.checkClosestButterflyTimer - dt; |
59 | if self.checkClosestButterflyTimer <= 0 then |
60 | local closestDistance = 100000000; |
61 | local closestButterfly = nil; |
62 | |
63 | local playerPosition = {0, 0, 0}; |
64 | if g_currentMission.controlPlayer then |
65 | if g_currentMission.player ~= nil then |
66 | playerPosition[1], playerPosition[2], playerPosition[3] = getWorldTranslation(g_currentMission.player.rootNode); |
67 | end |
68 | elseif g_currentMission.controlledVehicle ~= nil then |
69 | playerPosition[1], playerPosition[2], playerPosition[3] = getWorldTranslation(g_currentMission.controlledVehicle.rootNode); |
70 | end; |
71 | |
72 | local butterflyPosition = {0, 0, 0}; |
73 | |
74 | for _, butterfly in pairs(self.butterflies) do |
75 | butterflyPosition[1], butterflyPosition[2], butterflyPosition[3] = getWorldTranslation(butterfly.splineId); |
76 | |
77 | local distance = math.sqrt((playerPosition[1] - butterflyPosition[1]) * (playerPosition[1] - butterflyPosition[1]) + |
78 | (playerPosition[2] - butterflyPosition[2]) * (playerPosition[2] - butterflyPosition[2]) + |
79 | (playerPosition[3] - butterflyPosition[3]) * (playerPosition[3] - butterflyPosition[3])); |
80 | if distance < closestDistance then |
81 | closestDistance = distance; |
82 | closestButterfly = butterfly; |
83 | end; |
84 | end; |
85 | |
86 | -- clip distance |
87 | if closestDistance < 150 then |
88 | for _, butterfly in pairs(self.butterflies) do |
89 | if butterfly.butterflyId == closestButterfly.butterflyId then |
90 | setVisibility(butterfly.butterflyId, true) |
91 | else |
92 | setVisibility(butterfly.butterflyId, false) |
93 | end; |
94 | end; |
95 | self.activeButterfly = closestButterfly; |
96 | else |
97 | for _, butterfly in pairs(self.butterflies) do |
98 | setVisibility(butterfly.butterflyId, false) |
99 | end; |
100 | self.activeButterfly = nil; |
101 | end; |
102 | |
103 | self.checkClosestButterflyTimer = self.checkClosestButterflyInterval |
104 | end; |
105 | |
106 | if self.activeButterfly ~= nil then |
107 | self.animTimer = self.animTimer - dt; |
108 | if self.animTimer <= 0 then |
109 | self.flip = not self.flip; |
110 | setVisibility(getChildAt(self.activeButterfly.meshId, 0), self.flip); |
111 | setVisibility(getChildAt(self.activeButterfly.meshId, 1), not self.flip); |
112 | self.animTimer = self.animDelay; |
113 | end; |
114 | |
115 | self.time = self.time + dt * math.random() * 1; |
116 | self.activeButterfly.splinePos = self.activeButterfly.splinePos + dt * math.random() * 1 * self.activeButterfly.speed * 0.01; |
117 | |
118 | local offset1 = math.sin(self.time * 0.005) * math.cos(self.time * 0.025) * 0.05; |
119 | local offset2 = math.sin(self.time * 0.0175) * math.cos(self.time * 0.0125) * 0.05; |
120 | if self.activeButterfly.splinePos > 1 then |
121 | self.activeButterfly.splinePos = self.activeButterfly.splinePos - 1; |
122 | end; |
123 | |
124 | local x, y, z = getSplinePosition(self.activeButterfly.splineId, self.activeButterfly.splinePos); |
125 | local rx, ry, rz = getSplineOrientation(self.activeButterfly.splineId, self.activeButterfly.splinePos, 0, -1, 0); |
126 | setTranslation(self.activeButterfly.meshId, x + offset1, y + offset2, z + offset1); |
127 | setRotation(self.activeButterfly.meshId, rx, ry, rz); |
128 | end; |
129 | end; |
130 | |
131 | end;
|
Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de