13 [
Attribute(
"0",
UIWidgets.Slider,
"Minimum distance from selected point for sound to be played [m]",
"0 60 1",
category:
"Spawn Setup")]
14 int m_iMinimumDistance;
17 int m_iTimeIntervalMin;
20 int m_iTimeIntervalMax;
29 ref array<ref PointInfo> m_aSpawnPoints;
32 bool m_bInteriorSignal;
39 for (
int i=0; i<3; ++i)
42 if (m_vMins[i] > m_vMaxs[i])
44 m_vMaxs[i] = m_vMins[i] + 0.1;
54 Print(
string.Format(
"Requirement not met: Mins <= Maxs on %1 %2",
this, prefabSource.GetName()),
LogLevel.WARNING);
56 Print(
"Requirement not met: Mins <= Maxs on " +
this,
LogLevel.WARNING);
60 private float CalculateLocalOffset(
int i)
62 if (m_vMins[i]==m_vMaxs[i])
65 return Math.RandomFloat(m_vMins[i], m_vMaxs[i]);
68 vector CalculateOBBLocalOffset()
71 v[0] = CalculateLocalOffset(0);
72 v[1] = CalculateLocalOffset(1);
73 v[2] = CalculateLocalOffset(2);
77 vector CalculatePointsLocalOffset()
80 m_aSpawnPoints.GetRandomElement().GetLocalTransform(mat);
88 private static const float RANDOM_PERCENTAGE_MIN = 0.7;
89 private static const float RANDOM_PERCENTAGE_MAX = 1.3;
94 private void TriggeredSoundHandler(
IEntity owner,
float timeSlice)
97 SCR_BuildingSoundComponentClass prefabData = SCR_BuildingSoundComponentClass.Cast(
GetComponentData(owner));
100 GetTimeInterval(prefabData);
104 Math3D.MatrixIdentity4(mat);
105 mat[3] = GetSoundPosition(prefabData);
108 if (prefabData.m_iMinimumDistance > 0)
111 owner.
GetWorld().GetCurrentCamera(cameraMat);
114 if (
vector.Distance(mat[3], cameraMat[3]) < prefabData.m_iMinimumDistance)
121 if (prefabData.m_bInteriorSignal)
123 SetInteriorSignal(owner);
131 private void SetInteriorSignal(
IEntity owner)
135 float gInterior =
AudioSystem.GetVariableValue(
"GInterior",
"{A60F08955792B575}Sounds/_SharedData/Variables/GlobalVariables.conf");
140 owner.
GetWorld().GetCurrentCamera(mat);
142 interior = IsInWorldBounds(mat[3], owner);
145 SignalsManagerComponent signalsManagerComponent = SignalsManagerComponent.Cast(owner.
FindComponent(SignalsManagerComponent));
146 if (signalsManagerComponent)
147 signalsManagerComponent.SetSignalValue(signalsManagerComponent.AddOrFindSignal(
"Interior"), interior);
151 private bool IsInWorldBounds(vector point,
IEntity entity)
153 vector mins = vector.Zero;
154 vector maxs = vector.Zero;
158 return !(point[0] < mins[0] || point[0] > maxs[0] || point[1] < mins[1] || point[1] > maxs[1] || point[2] < mins[2] || point[2] > maxs[2]);
162 private void GetTimeInterval(SCR_BuildingSoundComponentClass prefabData)
164 GameSignalsManager signals =
GetGame().GetSignalsManager();
165 float windSpeed = signals.GetSignalValue(signals.AddOrFindSignal(
"WindSpeed"));
166 float timeInterval = Interpolate(windSpeed, SCR_AmbientSoundsComponent.WINDSPEED_MIN, SCR_AmbientSoundsComponent.WINDSPEED_MAX, prefabData.m_iTimeIntervalMax, prefabData.m_iTimeIntervalMin);
168 m_fTriggerInterval = Math.RandomFloat(timeInterval * RANDOM_PERCENTAGE_MIN, timeInterval * RANDOM_PERCENTAGE_MAX);
172 private vector GetSoundPosition(SCR_BuildingSoundComponentClass prefabData)
178 v = prefabData.CalculateOBBLocalOffset();
182 v = prefabData.CalculatePointsLocalOffset();
190 private float Interpolate(
float in,
float Xmin,
float Xmax,
float Ymin,
float Ymax)
198 return ((Ymin * (Xmax - in) + Ymax * (in - Xmin)) / (Xmax - Xmin));
202 override void UpdateSoundJob(
IEntity owner,
float timeSlice)
204 super.UpdateSoundJob(owner, timeSlice);
211 TriggeredSoundHandler(owner, timeSlice);
215 override void OnUpdateSoundJobBegin(
IEntity owner)
217 GetTimeInterval(SCR_BuildingSoundComponentClass.Cast(GetComponentData(owner)));
225 void SCR_BuildingSoundComponent(IEntityComponentSource src,
IEntity ent,
IEntity parent)
231 if (prefabData.m_vMins == vector.Zero && prefabData.m_vMaxs == vector.Zero)
233 SetScriptedMethodsCall(
false);
239 if (!prefabData.m_aSpawnPoints)
241 SetScriptedMethodsCall(
false);
245 if (prefabData.m_aSpawnPoints.IsEmpty())
247 SetScriptedMethodsCall(
false);
252 SetScriptedMethodsCall(
true);