diff --git a/Dalamud/Game/Network/Internal/NetworkHandlers.cs b/Dalamud/Game/Network/Internal/NetworkHandlers.cs index 4092e0f40..9d552b519 100644 --- a/Dalamud/Game/Network/Internal/NetworkHandlers.cs +++ b/Dalamud/Game/Network/Internal/NetworkHandlers.cs @@ -27,7 +27,7 @@ internal class NetworkHandlers : IDisposable, IServiceType { private readonly IMarketBoardUploader uploader; - private readonly ISubject messages; + private readonly IObservable messages; private readonly IDisposable handleMarketBoardItemRequest; private readonly IDisposable handleMarketTaxRates; @@ -45,14 +45,33 @@ internal class NetworkHandlers : IDisposable, IServiceType this.uploader = new UniversalisMarketBoardUploader(); this.CfPop = (_, _) => { }; - this.messages = new Subject(); + this.messages = Observable.Create(observer => + { + void Observe(IntPtr dataPtr, ushort opCode, uint sourceActorId, uint targetActorId, NetworkMessageDirection direction) + { + var dataManager = Service.GetNullable(); + observer.OnNext(new NetworkMessage + { + DataManager = dataManager, + Data = dataPtr, + Opcode = opCode, + SourceActorId = sourceActorId, + TargetActorId = targetActorId, + Direction = direction, + }); + } + + gameNetwork.NetworkMessage += Observe; + return () => + { + gameNetwork.NetworkMessage -= Observe; + }; + }); this.handleMarketBoardItemRequest = this.HandleMarketBoardItemRequest(); this.handleMarketTaxRates = this.HandleMarketTaxRates(); this.handleMarketBoardPurchaseHandler = this.HandleMarketBoardPurchaseHandler(); this.handleCfPop = this.HandleCfPop(); - - gameNetwork.NetworkMessage += this.ObserveNetworkMessage; } /// @@ -84,21 +103,6 @@ internal class NetworkHandlers : IDisposable, IServiceType this.handleCfPop.Dispose(); } - private void ObserveNetworkMessage( - IntPtr dataPtr, ushort opCode, uint sourceActorId, uint targetActorId, NetworkMessageDirection direction) - { - var dataManager = Service.GetNullable(); - this.messages.OnNext(new NetworkMessage - { - DataManager = dataManager, - Data = dataPtr, - Opcode = opCode, - SourceActorId = sourceActorId, - TargetActorId = targetActorId, - Direction = direction, - }); - } - private IObservable OnNetworkMessage() { return this.messages.Where(message => message.DataManager?.IsDataReady == true);