/// <summary> /// Sends a packet right before a different type of packet is about to be sent. /// </summary> /// <typeparam name="T">The type of packet to be sent "after"</typeparam> /// <param name="toSendBefore">The packet to be sent before</param> /// <param name="afterDir">The direction that type of packet is going to be sent to</param> /// <param name="conn">The connection where the "before" packet should be sent to</param> public static void RegisterSendBefore <T>(this Packet toSendBefore, Direction afterDir, StarConnection conn) where T : Packet { var bEvt = Observable.FromEventPattern <PacketEventArgs>(p => conn.PacketSent += p, p => conn.PacketSent -= p).Select(p => p.EventArgs); StarConnection sendToConn; if (afterDir == Direction.Client) { sendToConn = conn.Proxy.ServerConnection; } else { sendToConn = conn.Proxy.ClientConnection; } var sEvt = Observable.FromEventPattern <PacketEventArgs>(p => sendToConn.PacketSending += p, p => sendToConn.PacketSending -= p).Select(p => p.EventArgs); var afterObs = sEvt.Where(p => p.Packet.GetType() == typeof(T)); var beforeObs = bEvt.Where(p => p.Packet == toSendBefore); afterObs.Take(1).Finally(() => conn.SendPacket(toSendBefore)).Subscribe(p => { p.Packet.Ignore = true; beforeObs.Take(1).Subscribe(x => { p.Packet.Ignore = false; sendToConn.SendPacket(p.Packet); }); }); }
/// <summary> /// Sends a packet right before a different instance of a packet is about to be sent. /// </summary> /// <param name="toSendBefore">The packet to send before</param> /// <param name="toSendAfter">The packet to send after</param> /// <param name="conn">The connection where the "before" packet should be sent to</param> public static void RegisterSendBefore(this Packet toSendBefore, Packet toSendAfter, StarConnection conn) { var bEvt = Observable.FromEventPattern <PacketEventArgs>(p => conn.PacketSent += p, p => conn.PacketSent -= p).Select(p => p.EventArgs); StarConnection sendToConn; if (toSendAfter.Direction == Direction.Client) { sendToConn = conn.Proxy.ClientConnection; } else { sendToConn = conn.Proxy.ServerConnection; } var sEvt = Observable.FromEventPattern <PacketEventArgs>(p => sendToConn.PacketSending += p, p => sendToConn.PacketSending -= p).Select(p => p.EventArgs); var afterObs = sEvt.Where(p => p.Packet == toSendAfter); var beforeObs = bEvt.Where(p => p.Packet == toSendBefore); beforeObs.Take(1).Subscribe(_ => { toSendAfter.Ignore = false; sendToConn.SendPacket(toSendAfter); }); afterObs.Take(1).Finally(() => conn.SendPacket(toSendBefore)).Subscribe(_ => { toSendAfter.Ignore = true; }); conn.SendPacket(toSendBefore); }