Sprache Deutsch Language English

Script Dokumentation LS 2015 - Butterfly (Patch 1.3)

Script Dokumentation Übersicht

scripts/objects/Butterfly.lua

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
3Butterfly = {}
4
5local Butterfly_mt = Class(Butterfly);
6
7function Butterfly:onCreate(id)
8 g_currentMission:addUpdateable(Butterfly:new(id));
9 -- print("created Butterfly, id: ", id);
10end;
11
12function 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;
40end;
41
42function Butterfly:delete()
43
44end;
45
46function 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
131end;
Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de
Script Dokumentation Übersicht