Exemplo n.º 1
0
 public override void SendMessage(Event e)
 {
     SendBuffer[0] = e;
     NetOutgoingMessage msg = Client.CreateMessage();
     Serializer.SerializeEvents(msg, SendBuffer);
     Client.SendMessage(msg, NetDeliveryMethod.ReliableOrdered);
 }
Exemplo n.º 2
0
        /// <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];
            }
        }
Exemplo n.º 3
0
 /// <summary>
 /// Send event to the server
 /// </summary>
 /// <param name="e"></param>
 public abstract void SendMessage(Event e);
Exemplo n.º 4
0
 /// <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);
 }
Exemplo n.º 5
0
 internal override void SendToPlayer(Event e, Player recipient)
 {
     SendToAll(e);
 }
Exemplo n.º 6
0
 internal override void SendToAll(Event e)
 {
     ServerEventQueue.Enqueue(e);
 }
Exemplo n.º 7
0
 /// <summary>
 /// Send event to all players
 /// </summary>
 /// <param name="e"></param>
 internal abstract void SendToAll(Event e);
Exemplo n.º 8
0
 /// <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);
Exemplo n.º 9
0
 internal override void SendToPlayer(Event e, Player recipient)
 {
     NetworkPlayer player = recipient as NetworkPlayer;
     player.PendingEvents.Enqueue(e);
 }
Exemplo n.º 10
0
 internal override void SendToAll(Event e)
 {
     SendingQueue.Enqueue(e);
     if (SendingQueue.Count == 255)
         FlushGlobalMessages();
 }