public override void SendMessage(Event e) { SendBuffer[0] = e; NetOutgoingMessage msg = Client.CreateMessage(); Serializer.SerializeEvents(msg, SendBuffer); Client.SendMessage(msg, NetDeliveryMethod.ReliableOrdered); }
/// <summary> /// Read events from network message and set their sender /// </summary> /// <param name="msg">Network message</param> /// <param name="sender">Sender</param> /// <returns>Collection of events</returns> internal static IEnumerable<Event> DeserializeEvents(NetIncomingMessage msg, Player sender) { if (msg == null) throw new ArgumentNullException(nameof(msg)); try { int eventCount = msg.ReadByte(); Event[] result = new Event[eventCount]; object[] constructorParams = new object[] { msg, sender }; for (int i = 0; i < eventCount; i++) { byte eventTypeID = msg.ReadByte(); if (!EventTypes.ContainsKey(eventTypeID)) throw new Exception($"unknown event type ID: {eventTypeID}"); var type = EventTypes[eventTypeID]; var constructor = type.GetConstructor(new Type[] { typeof(NetIncomingMessage), typeof(Player) }); if (constructor == null) throw new Exception($"cannot deserialize event {type} as it does not have the necessary constructor"); var deserializedEvent = (Event)constructor.Invoke(constructorParams); result[i] = deserializedEvent; } return result; } catch (Exception e) { // should only happen when event is deserialized using incorrect amount of data System.Diagnostics.Debug.WriteLine("Packet deserialization error, dropping messages"); System.Diagnostics.Debug.WriteLine($"Error: {e.Message}"); return new Event[0]; } }
/// <summary> /// Send event to the server /// </summary> /// <param name="e"></param> public abstract void SendMessage(Event e);
/// <summary> /// Send event to the server /// </summary> /// <param name="e">Event to be sent</param> public void EnqueueEvent(Event e) { e.Sender = Player; ClientEventQueue.Enqueue(e); }
internal override void SendToPlayer(Event e, Player recipient) { SendToAll(e); }
internal override void SendToAll(Event e) { ServerEventQueue.Enqueue(e); }
/// <summary> /// Send event to all players /// </summary> /// <param name="e"></param> internal abstract void SendToAll(Event e);
/// <summary> /// Sends event to specific player. Player will receive /// these events after events sent to everyone. /// </summary> /// <param name="e">Event to be sent</param> /// <param name="recipient">Recipient of the event</param> internal abstract void SendToPlayer(Event e, Player recipient);
internal override void SendToPlayer(Event e, Player recipient) { NetworkPlayer player = recipient as NetworkPlayer; player.PendingEvents.Enqueue(e); }
internal override void SendToAll(Event e) { SendingQueue.Enqueue(e); if (SendingQueue.Count == 255) FlushGlobalMessages(); }