Skip to content

Commit 7bdea41

Browse files
authored
Fixes for sound errors from RC3 (#1730)
* Remove bubbles from whitelist * Refactor Model.helper.Validate * Fix MedicalCabinet sounds * Dev-QoL for FMOD Processors
1 parent 8c5c52c commit 7bdea41

12 files changed

+163
-181
lines changed

NitroxClient/Communication/MultiplayerSession/ConnectionState/AwaitingSessionReservation.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using NitroxClient.Communication.Abstract;
33
using NitroxModel.Helper;
44
using NitroxModel.MultiplayerSession;
5+
using NitroxModel.Packets.Exceptions;
56

67
namespace NitroxClient.Communication.MultiplayerSession.ConnectionState
78
{
@@ -62,7 +63,10 @@ private static void ReservationIsNotNull(IMultiplayerSessionConnectionContext se
6263

6364
private void ReservationPacketIsCorrelated(IMultiplayerSessionConnectionContext sessionConnectionContext)
6465
{
65-
Validate.PacketCorrelation(sessionConnectionContext.Reservation, reservationCorrelationId);
66+
if (!reservationCorrelationId.Equals(sessionConnectionContext.Reservation.CorrelationId))
67+
{
68+
throw new UncorrelatedPacketException(sessionConnectionContext.Reservation, reservationCorrelationId);
69+
}
6670
}
6771
}
6872
}

NitroxClient/Communication/MultiplayerSession/ConnectionState/EstablishingSessionPolicy.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using NitroxClient.Communication.Abstract;
33
using NitroxModel.Helper;
4+
using NitroxModel.Packets.Exceptions;
45

56
namespace NitroxClient.Communication.MultiplayerSession.ConnectionState
67
{
@@ -50,7 +51,10 @@ private static void SessionPolicyIsNotNull(IMultiplayerSessionConnectionContext
5051

5152
private void SessionPolicyPacketCorrelation(IMultiplayerSessionConnectionContext sessionConnectionContext)
5253
{
53-
Validate.PacketCorrelation(sessionConnectionContext.SessionPolicy, policyRequestCorrelationId);
54+
if (!policyRequestCorrelationId.Equals(sessionConnectionContext.SessionPolicy.CorrelationId))
55+
{
56+
throw new UncorrelatedPacketException(sessionConnectionContext.SessionPolicy, policyRequestCorrelationId);
57+
}
5458
}
5559

5660
private void AwaitReservationCredentials(IMultiplayerSessionConnectionContext sessionConnectionContext)

NitroxClient/Communication/Packets/Processors/MedicalCabinetClickedProcessor.cs

+23-14
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,43 @@
1-
using NitroxClient.Communication.Packets.Processors.Abstract;
1+
using NitroxClient.Communication.Abstract;
2+
using NitroxClient.Communication.Packets.Processors.Abstract;
3+
using NitroxClient.GameLogic.FMOD;
24
using NitroxClient.MonoBehaviours;
35
using NitroxClient.Unity.Helper;
4-
using NitroxModel.Helper;
56
using NitroxModel.Packets;
67
using UnityEngine;
78

8-
namespace NitroxClient.Communication.Packets.Processors
9+
namespace NitroxClient.Communication.Packets.Processors;
10+
11+
public class MedicalCabinetClickedProcessor : ClientPacketProcessor<MedicalCabinetClicked>
912
{
10-
public class MedicalCabinetClickedProcessor : ClientPacketProcessor<MedicalCabinetClicked>
13+
private readonly IPacketSender packetSender;
14+
15+
public MedicalCabinetClickedProcessor(IPacketSender packetSender)
1116
{
12-
public override void Process(MedicalCabinetClicked packet)
13-
{
14-
GameObject gameObject = NitroxEntity.RequireObjectFrom(packet.Id);
15-
MedicalCabinet cabinet = gameObject.RequireComponent<MedicalCabinet>();
17+
this.packetSender = packetSender;
18+
}
1619

17-
bool medkitPickedUp = !packet.HasMedKit && cabinet.hasMedKit;
20+
public override void Process(MedicalCabinetClicked packet)
21+
{
22+
GameObject gameObject = NitroxEntity.RequireObjectFrom(packet.Id);
23+
MedicalCabinet cabinet = gameObject.RequireComponent<MedicalCabinet>();
1824

19-
cabinet.hasMedKit = packet.HasMedKit;
20-
cabinet.timeSpawnMedKit = packet.NextSpawnTime;
25+
bool medkitPickedUp = !packet.HasMedKit && cabinet.hasMedKit;
26+
bool doorChangedState = cabinet.doorOpen != packet.DoorOpen;
2127

22-
bool isDoorOpen = cabinet.doorOpen;
23-
bool doorChangedState = isDoorOpen != packet.DoorOpen;
28+
cabinet.hasMedKit = packet.HasMedKit;
29+
cabinet.timeSpawnMedKit = packet.NextSpawnTime;
2430

31+
using (packetSender.Suppress<PlayFMODCustomEmitter>())
32+
using (FMODSystem.SuppressSounds())
33+
{
2534
if (doorChangedState)
2635
{
2736
cabinet.Invoke(nameof(MedicalCabinet.ToggleDoorState), 0f);
2837
}
2938
else if (medkitPickedUp)
3039
{
31-
cabinet.Invoke(nameof(MedicalCabinet.ToggleDoorState), 1.8f);
40+
cabinet.Invoke(nameof(MedicalCabinet.ToggleDoorState), 2f);
3241
}
3342
}
3443
}

NitroxClient/Communication/Packets/Processors/PlayFMODCustomEmitterProcessor.cs

+21-25
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,37 @@
11
using NitroxClient.Communication.Abstract;
22
using NitroxClient.Communication.Packets.Processors.Abstract;
33
using NitroxClient.MonoBehaviours;
4-
using NitroxModel.DataStructures.Util;
5-
using NitroxModel.Helper;
4+
using NitroxClient.Unity.Helper;
65
using NitroxModel.Packets;
76
using UnityEngine;
87

9-
namespace NitroxClient.Communication.Packets.Processors
8+
namespace NitroxClient.Communication.Packets.Processors;
9+
10+
public class PlayFMODCustomEmitterProcessor : ClientPacketProcessor<PlayFMODCustomEmitter>
1011
{
11-
public class PlayFMODCustomEmitterProcessor : ClientPacketProcessor<PlayFMODCustomEmitter>
12+
private readonly IPacketSender packetSender;
13+
14+
public PlayFMODCustomEmitterProcessor(IPacketSender packetSender)
1215
{
13-
private readonly IPacketSender packetSender;
16+
this.packetSender = packetSender;
17+
}
1418

15-
public PlayFMODCustomEmitterProcessor(IPacketSender packetSender)
16-
{
17-
this.packetSender = packetSender;
18-
}
1919

20+
public override void Process(PlayFMODCustomEmitter packet)
21+
{
22+
GameObject soundSource = NitroxEntity.RequireObjectFrom(packet.Id);
23+
FMODEmitterController fmodEmitterController = soundSource.RequireComponent<FMODEmitterController>();
2024

21-
public override void Process(PlayFMODCustomEmitter packet)
25+
using (packetSender.Suppress<PlayFMODCustomEmitter>())
26+
using (packetSender.Suppress<PlayFMODCustomLoopingEmitter>())
2227
{
23-
Optional<GameObject> soundSource = NitroxEntity.GetObjectFrom(packet.Id);
24-
Validate.IsPresent(soundSource);
25-
26-
FMODEmitterController fmodEmitterController = soundSource.Value.GetComponent<FMODEmitterController>();
27-
Validate.IsTrue(fmodEmitterController);
28-
29-
using (packetSender.Suppress<PlayFMODCustomEmitter>())
28+
if (packet.Play)
29+
{
30+
fmodEmitterController.PlayCustomEmitter(packet.AssetPath);
31+
}
32+
else
3033
{
31-
if (packet.Play)
32-
{
33-
fmodEmitterController.PlayCustomEmitter(packet.AssetPath);
34-
}
35-
else
36-
{
37-
fmodEmitterController.StopCustomEmitter(packet.AssetPath);
38-
}
34+
fmodEmitterController.StopCustomEmitter(packet.AssetPath);
3935
}
4036
}
4137
}
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,18 @@
11
using NitroxClient.Communication.Packets.Processors.Abstract;
22
using NitroxClient.MonoBehaviours;
3-
using NitroxModel.DataStructures.Util;
4-
using NitroxModel.Helper;
3+
using NitroxClient.Unity.Helper;
54
using NitroxModel.Packets;
65
using UnityEngine;
76

8-
namespace NitroxClient.Communication.Packets.Processors
7+
namespace NitroxClient.Communication.Packets.Processors;
8+
9+
public class PlayFMODCustomLoopingEmitterProcessor : ClientPacketProcessor<PlayFMODCustomLoopingEmitter>
910
{
10-
public class PlayFMODCustomLoopingEmitterProcessor : ClientPacketProcessor<PlayFMODCustomLoopingEmitter>
11+
public override void Process(PlayFMODCustomLoopingEmitter packet)
1112
{
12-
public override void Process(PlayFMODCustomLoopingEmitter packet)
13-
{
14-
Optional<GameObject> soundSource = NitroxEntity.GetObjectFrom(packet.Id);
15-
Validate.IsPresent(soundSource);
16-
17-
FMODEmitterController fmodEmitterController = soundSource.Value.GetComponent<FMODEmitterController>();
18-
Validate.IsTrue(fmodEmitterController);
13+
GameObject soundSource = NitroxEntity.RequireObjectFrom(packet.Id);
14+
FMODEmitterController fmodEmitterController = soundSource.RequireComponent<FMODEmitterController>();
1915

20-
fmodEmitterController.PlayCustomLoopingEmitter(packet.AssetPath);
21-
}
16+
fmodEmitterController.PlayCustomLoopingEmitter(packet.AssetPath);
2217
}
2318
}

NitroxClient/Communication/Packets/Processors/PlayFMODStudioEventEmitterProcessor.cs

+20-25
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,36 @@
11
using NitroxClient.Communication.Abstract;
22
using NitroxClient.Communication.Packets.Processors.Abstract;
33
using NitroxClient.MonoBehaviours;
4-
using NitroxModel.DataStructures.Util;
5-
using NitroxModel.Helper;
4+
using NitroxClient.Unity.Helper;
65
using NitroxModel.Packets;
76
using UnityEngine;
87

9-
namespace NitroxClient.Communication.Packets.Processors
8+
namespace NitroxClient.Communication.Packets.Processors;
9+
10+
public class PlayFMODStudioEventEmitterProcessor : ClientPacketProcessor<PlayFMODStudioEmitter>
1011
{
11-
public class PlayFMODStudioEventEmitterProcessor : ClientPacketProcessor<PlayFMODStudioEmitter>
12+
private readonly IPacketSender packetSender;
13+
14+
public PlayFMODStudioEventEmitterProcessor(IPacketSender packetSender)
1215
{
13-
private readonly IPacketSender packetSender;
16+
this.packetSender = packetSender;
17+
}
1418

15-
public PlayFMODStudioEventEmitterProcessor(IPacketSender packetSender)
16-
{
17-
this.packetSender = packetSender;
18-
}
1919

20+
public override void Process(PlayFMODStudioEmitter packet)
21+
{
22+
GameObject soundSource = NitroxEntity.RequireObjectFrom(packet.Id);
23+
FMODEmitterController fmodEmitterController = soundSource.RequireComponent<FMODEmitterController>();
2024

21-
public override void Process(PlayFMODStudioEmitter packet)
25+
using (packetSender.Suppress<PlayFMODStudioEmitter>())
2226
{
23-
Optional<GameObject> soundSource = NitroxEntity.GetObjectFrom(packet.Id);
24-
Validate.IsPresent(soundSource);
25-
26-
FMODEmitterController fmodEmitterController = soundSource.Value.GetComponent<FMODEmitterController>();
27-
Validate.IsTrue(fmodEmitterController);
28-
29-
using (packetSender.Suppress<PlayFMODStudioEmitter>())
27+
if (packet.Play)
28+
{
29+
fmodEmitterController.PlayStudioEmitter(packet.AssetPath);
30+
}
31+
else
3032
{
31-
if (packet.Play)
32-
{
33-
fmodEmitterController.PlayStudioEmitter(packet.AssetPath);
34-
}
35-
else
36-
{
37-
fmodEmitterController.StopStudioEmitter(packet.AssetPath, packet.AllowFadeout);
38-
}
33+
fmodEmitterController.StopStudioEmitter(packet.AssetPath, packet.AllowFadeout);
3934
}
4035
}
4136
}

NitroxClient/GameLogic/EscapePodManager.cs

+17
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,29 @@ public GameObject CreateNewEscapePod(EscapePodModel model)
119119
NitroxEntity.SetNewId(radio.gameObject, model.RadioId);
120120

121121
DamageEscapePod(model.Damaged, model.RadioDamaged);
122+
FixStartMethods(escapePod);
122123

123124
SURPRESS_ESCAPE_POD_AWAKE_METHOD = false;
124125

125126
return escapePod;
126127
}
127128

129+
/// <summary>
130+
/// Start() isn't executed for the EscapePod and children (Why? Idk, maybe because it's a scene...) so we call the components here where we have patches in Start.
131+
/// </summary>
132+
private static void FixStartMethods(GameObject escapePod)
133+
{
134+
foreach (FMOD_CustomEmitter customEmitter in escapePod.GetComponentsInChildren<FMOD_CustomEmitter>())
135+
{
136+
customEmitter.Start();
137+
}
138+
139+
foreach (FMOD_StudioEventEmitter studioEventEmitter in escapePod.GetComponentsInChildren<FMOD_StudioEventEmitter>())
140+
{
141+
studioEventEmitter.Start();
142+
}
143+
}
144+
128145
public void DamageEscapePod(bool damage, bool radio)
129146
{
130147
if (damage)

NitroxClient/Resources/soundsWhitelist.csv

+4-4
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,8 @@ event:/player/adviseSelfScan;false;false;0
265265
event:/player/aurora_warning_1;false;false;0
266266
event:/player/aurora_warning_2;false;false;0
267267
event:/player/aurora_warning_3;false;false;0
268-
event:/player/breathing;true;false;20
269-
event:/player/bubbles;true;false;20
268+
event:/player/breathing;false;false;20
269+
event:/player/bubbles;false;false;20
270270
event:/player/cold_damage;true;false;20
271271
event:/player/coughing;true;false;20
272272
event:/player/cube terminal_close;false;false;0
@@ -712,7 +712,7 @@ event:/sub_module/fabricator/fabricator_click;false;false;0
712712
event:/sub_module/fabricator/menu_up;false;false;0
713713
event:/sub_module/fabricator/negative;false;false;0
714714
event:/sub_module/fabricator/open;true;false;20
715-
event:/sub_module/first_aid/spawn;true;false;20
715+
event:/sub_module/first_aid/spawn;false;false;20
716716
event:/sub_module/workbench/close;true;false;20
717717
event:/sub_module/workbench/open;true;false;20
718718
event:/tools/airbladder/airbladder_deflate;false;false;0
@@ -814,4 +814,4 @@ event:/tools/transfuser/take_sample;false;false;0
814814
event:/tools/use_loot;false;false;0
815815
event:/tools/welder/deploy;false;false;20
816816
event:/tools/welder/first_use;false;false;20
817-
event:/tools/welder/weld_loop;true;false;20
817+
event:/tools/welder/weld_loop;true;false;20

NitroxClient/Unity/Helper/GameObjectHelper.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,23 @@ public static bool TryGetComponentInParent<T>(this GameObject go, out T componen
2727
public static T RequireComponent<T>(this GameObject o) where T : Component
2828
{
2929
T component = o.GetComponent<T>();
30-
Validate.NotNull(component, $"{o.name} did not have a component of type {typeof(T)}");
30+
Validate.IsTrue(component, $"{o.name} did not have a component of type {typeof(T)}");
3131

3232
return component;
3333
}
3434

3535
public static T RequireComponentInChildren<T>(this GameObject o, bool includeInactive = false) where T : Component
3636
{
3737
T component = o.GetComponentInChildren<T>(includeInactive);
38-
Validate.NotNull(component, $"{o.name} did not have a component of type {typeof(T)} in its children");
38+
Validate.IsTrue(component, $"{o.name} did not have a component of type {typeof(T)} in its children");
3939

4040
return component;
4141
}
4242

4343
public static T RequireComponentInParent<T>(this GameObject o) where T : Component
4444
{
4545
T component = o.GetComponentInParent<T>();
46-
Validate.NotNull(component, $"{o.name} did not have a component of type {typeof(T)} in its parent");
46+
Validate.IsTrue(component, $"{o.name} did not have a component of type {typeof(T)} in its parent");
4747

4848
return component;
4949
}
@@ -74,7 +74,7 @@ public static Transform RequireTransform(this Transform tf, string name)
7474
public static GameObject RequireGameObject(string name)
7575
{
7676
GameObject go = GameObject.Find(name);
77-
Validate.NotNull(go, "No global GameObject found with " + name + "!");
77+
Validate.IsTrue(go, "No global GameObject found with " + name + "!");
7878

7979
return go;
8080
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace System.Runtime.CompilerServices;
2+
3+
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
4+
internal sealed class CallerArgumentExpressionAttribute : Attribute
5+
{
6+
public CallerArgumentExpressionAttribute(string parameterName)
7+
{
8+
ParameterName = parameterName;
9+
}
10+
11+
public string ParameterName { get; }
12+
}

0 commit comments

Comments
 (0)