Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_SoundGroup.c
Go to the documentation of this file.
1//------------------------------------------------------------------------------------------------
2[BaseContainerProps(configRoot: false)]
4{
5 [Attribute("", UIWidgets.EditBox, "Sound event name")]
6 string m_sSoundEvent;
7
8 [Attribute("", UIWidgets.Object, "")]
9 ref array<ref SCR_SoundType> m_aSoundType;
10
11 //------------------------------------------------------------------------------------------------
18 // Called by SCR_RandomPositionalSounds when searching for new sound to play
19 void GetSoundTypeAndPosition(SCR_RandomPositionalSounds randomPositionaSounds, vector cameraPosition, float spawnDistance, out int soundType, out vector position)
20 {
21 }
22
23 //------------------------------------------------------------------------------------------------
29 protected float GetWaterSurfaceY(ChimeraWorld world, vector worldPos, out EWaterSurfaceType waterSurfaceType, out float lakeArea)
30 {
31 vector waterSurfacePos;
32 vector transformWS[4];
33 vector obbExtents;
34
35 ChimeraWorldUtils.TryGetWaterSurface(world, worldPos, waterSurfacePos, waterSurfaceType, transformWS, obbExtents);
36 lakeArea = obbExtents[0] * obbExtents[2];
37
38 return waterSurfacePos[1];
39 }
40}
41
42//------------------------------------------------------------------------------------------------
43[BaseContainerProps(configRoot: true)]
44class SCR_TreeSoundGroup : SCR_SoundGroup
46 private const float TREE_LEAFY_HEIGHT_LIMIT = 10;
47 private const float TREE_CONIFER_HEIGHT_LIMIT = 12;
49 //------------------------------------------------------------------------------------------------
51 override void GetSoundTypeAndPosition(SCR_RandomPositionalSounds randomPositionaSounds, vector cameraPosition, float spawnDistance, out int soundType, out vector position)
52 {
53 // Choose dominant tree type
54 SCR_AmbientSoundsComponent ambientSoundsComponent = randomPositionaSounds.GetAmbientSoundsComponent();
55
56 ETreeSoundTypes treeSoundType = ambientSoundsComponent.GetDominantTree();
57 if (treeSoundType == EAmbientSoundType.TreeConifer)
58 {
59 IEntity tree = ambientSoundsComponent.GetRandomTree(EAmbientSoundFlags.TreeConifer, TREE_CONIFER_HEIGHT_LIMIT);
60 if (!tree)
61 return;
62
63 soundType = 0;
64 position = GetRandomPositionOnEntity(tree);
65 }
66 else if (treeSoundType == EAmbientSoundType.TreeLeafy)
67 {
68 IEntity tree = ambientSoundsComponent.GetRandomTree(EAmbientSoundFlags.TreeLeafy, TREE_LEAFY_HEIGHT_LIMIT);
69 if (!tree)
70 return;
71
72 soundType = 1;
73 position = GetRandomPositionOnEntity(tree);
74 }
75 }
76
77 //------------------------------------------------------------------------------------------------
79
80 private vector GetRandomPositionOnEntity(const IEntity entity)
81 {
82 vector mins, maxs;
83 entity.GetWorldBounds(mins, maxs);
84
85 vector pos;
86
87 // Get position
88 pos = entity.GetOrigin();
89
90 // Set random height
91 pos[1] = pos[1] + (maxs[1] - mins[1]) * Math.RandomFloatInclusive(0.5, 1);
92
93 return pos;
94 }
95}
96
97//------------------------------------------------------------------------------------------------
98[BaseContainerProps(configRoot: true)]
100{
101 protected const int LAKE_AREA_LIMIT = 100000;
102
103 protected int m_iAngleOffset;
104
105 //------------------------------------------------------------------------------------------------
110 {
111 // Angle for random position is rotated by 36 deg for each GenerateRandomPosition() call
112 const float angle = m_iAngleOffset * 36.0;
113
115 if (m_iAngleOffset > 9)
116 m_iAngleOffset = 0;
117
118 return vector.FromYaw(angle) * spawnDistance;
119 }
120}
121
122//------------------------------------------------------------------------------------------------
123[BaseContainerProps(configRoot: true)]
124class SCR_TerrainSoundGroup : SCR_PositionSoundGroup
125{
126 private const int COAST_HIGHT_LIMIT = 3;
127
128 override void GetSoundTypeAndPosition(SCR_RandomPositionalSounds randomPositionaSounds, vector cameraPosition, float spawnDistance, out int soundType, out vector position)
129 {
130 position = cameraPosition + GenerateRandomPositionLocal(spawnDistance);
131
132 // Get surface height
133 float surfaceHeight = randomPositionaSounds.GetWorld().GetSurfaceY(position[0], position[2]);
134 position[1] = surfaceHeight;
135
136 // Ignore when near sea coast
137 if (Math.AbsFloat(position[1]) < COAST_HIGHT_LIMIT)
138 {
139 return;
140 }
141
142 EWaterSurfaceType waterSurfaceType;
143 float lakeArea;
144 float waterSurfaceY = GetWaterSurfaceY(randomPositionaSounds.GetWorld(), position, waterSurfaceType, lakeArea);
145
146 switch (waterSurfaceType)
147 {
148 case EWaterSurfaceType.WST_NONE:
149 {
150 // Trace and get soundInfo
151 int soundInfo = -1;
152 randomPositionaSounds.GetAmbientSoundsComponent().TracePointToTerrain(position, soundInfo);
153
154 // Get soundGroup
155 soundType = randomPositionaSounds.GetTerrainType(soundInfo);
156 return;
157 }
158 case EWaterSurfaceType.WST_OCEAN:
159 {
160 position[1] = 0;
161 soundType = ETerrainType.OCEAN;
162 return;
163 }
164 case EWaterSurfaceType.WST_POND:
165 {
166 if (lakeArea > LAKE_AREA_LIMIT)
167 {
168 position[1] = waterSurfaceY;
169 soundType = ETerrainType.POND;
170 return;
171 }
172 else
173 {
174 soundType = ETerrainType.POND_SMALL;
175 return;
176 }
177 }
178 }
179 }
180}
181
182//------------------------------------------------------------------------------------------------
183[BaseContainerProps(configRoot: true)]
185{
186 override void GetSoundTypeAndPosition(SCR_RandomPositionalSounds randomPositionaSounds, vector cameraPosition, float spawnDistance, out int soundType, out vector position)
187 {
188 ChimeraWorld world = randomPositionaSounds.GetWorld();
189
190 position = cameraPosition + GenerateRandomPositionLocal(spawnDistance);
191
192 // Check for fresh water
193 float surfaceHeight = world.GetSurfaceY(position[0], position[2]);
194 position[1] = surfaceHeight;
195
196 EWaterSurfaceType waterSurfaceType;
197 float lakeArea;
198 float waterSurfaceY = GetWaterSurfaceY(world, position, waterSurfaceType, lakeArea);
199
200 switch (waterSurfaceType)
201 {
202 case EWaterSurfaceType.WST_NONE:
203 {
204 SoundWorld soundWorld = world.GetSoundWorld();
205
206 if(!soundWorld)
207 return;
208
209 float sea, forest, city, meadow;
210 soundWorld.GetMapValuesAtPos(position, sea, forest, city, meadow);
211
212 // Get maximum
213 float vals[] = { meadow, forest, city, sea };
214 float v = vals[0];
215 soundType = 0;
216 for (int i = 1; i < 4; i++)
217 {
218 if (vals[i] > v)
219 {
220 v = vals[i];
221 soundType = i;
222 }
223 }
224
225 return;
226 }
227 case EWaterSurfaceType.WST_OCEAN:
228 {
229 position[1] = 0;
230 soundType = ESoundMapType.SEA;
231 return;
232 }
233 case EWaterSurfaceType.WST_POND:
234 {
235 if (lakeArea > LAKE_AREA_LIMIT)
236 {
237 position[1] = waterSurfaceY;
238 soundType = ESoundMapType.POND;
239 return;
240 }
241 }
242 }
243 }
244}
245
246//------------------------------------------------------------------------------------------------
247[BaseContainerProps(configRoot: true)]
248class SCR_VegetationSoundGroup : SCR_SoundGroup
249{
250 private const float TREE_HEIGHT_LIMIT = 5.0;
251 private const float BUSH_HEIGHT_LIMIT = 0.5;
252
253 //------------------------------------------------------------------------------------------------
255 override void GetSoundTypeAndPosition(SCR_RandomPositionalSounds randomPositionaSounds, vector cameraPosition, float spawnDistance, out int soundType, out vector position)
256 {
257 IEntity entity = randomPositionaSounds.GetAmbientSoundsComponent().GetRandomTree(EAmbientSoundFlags.TreeWithered, TREE_HEIGHT_LIMIT);
258 if (entity)
259 {
260 soundType = 0;
261 position = entity.GetOrigin();
262 position[1] = position[1] + TREE_HEIGHT_LIMIT;
263 return;
264 }
265
266 entity = randomPositionaSounds.GetAmbientSoundsComponent().GetRandomTree(EAmbientSoundFlags.TreeBush, BUSH_HEIGHT_LIMIT);
267 if (entity)
268 {
269 soundType = 1;
270 position = entity.GetOrigin();
271 return;
272 }
273 }
274}
EWaterSurfaceType
SCR_AIAnimation_Loitering BaseContainerProps
Commanding menu commanding element class.
vector position
void GetSoundTypeAndPosition(SCR_RandomPositionalSounds randomPositionaSounds, vector cameraPosition, float spawnDistance, out int soundType, out vector position)
const int LAKE_AREA_LIMIT
ETerrainType
enum EVehicleType IEntity
proto external vector GetOrigin()
proto external void GetWorldBounds(out vector mins, out vector maxs)
Definition Math.c:13
vector GenerateRandomPositionLocal(float spawnDistance)
float GetWaterSurfaceY(ChimeraWorld world, vector worldPos, out EWaterSurfaceType waterSurfaceType, out float lakeArea)
EAmbientSoundFlags
EAmbientSoundType
SCR_FieldOfViewSettings Attribute
ETreeSoundTypes