Ejemplo n.º 1
0
        public void Queue(Event ev)
        {
            if (ev.Reliability == ReliabilityModes.Unreliable)
            {
                // push on unreliable send queue
                unreliableSend.Add(EventUnreliable.Wrap(ev));

                // incr refs!
                ev.IncrementRefs();
            }
            else
            {
                if (reliableOrderedSend.TryEnqueue(EventReliable.Wrap(ev)))
                {
                    ev.IncrementRefs();
                }
                else
                {
                    NetLog.Warn("The reliable-ordered event queue for {0} is full, disconnecting", connection);
                    connection.Disconnect();
                }
            }
        }
Ejemplo n.º 2
0
        public override void Pack(Packet packet)
        {
            int startPos = packet.Position;

            // prune events and calculate priority for remaining ones
            for (int i = 0; i < unreliableSend.Count; ++i)
            {
                EventUnreliable r = unreliableSend[i];

                if (r.NetworkEvent.IsEntityEvent)
                {
                    var existsOnRemote = connection.entityChannel.ExistsOnRemote(r.NetworkEvent.TargetEntity);
                    if (existsOnRemote == false)
                    {
                        unreliableSend[i].NetworkEvent.DecrementRefs();
                        unreliableSend.RemoveAt(i);

                        i -= 1;

                        continue;
                    }
                }

                r.Priority =
                    r.NetworkEvent.IsEntityEvent
                    ? r.NetworkEvent.TargetEntity.PriorityCalculator.CalculateEventPriority(connection, r.NetworkEvent)
                    : 10;

                unreliableSend[i] = r;
            }

            // sort on priority (descending)
            unreliableSend.Sort(EventUnreliable.PriorityComparer.Instance);

            int ptrStart = packet.Position;

            // pack reliable events into packet
            EventReliable reliable;

            while (reliableOrderedSend.TryNext(out reliable))
            {
                int ptr = packet.Position;

                bool packOk         = PackEvent(reliable.NetworkEvent, packet, reliable.Sequence);
                bool notOverflowing = packet.Overflowing == false;

                if (packOk == false)
                {
                    NetLog.Error("Reliable failed to pack, this means all other reliable events will stall");
                }

                if (packOk && notOverflowing)
                {
                    packet.ReliableEvents.Add(reliable);
                }
                else
                {
                    // reset ptr
                    packet.Position = ptr;

                    // flag for sending
                    reliableOrderedSend.SetSend(reliable);
                    break;
                }
            }

            // pack unreliable events into packet
            for (int i = 0; i < unreliableSend.Count; ++i)
            {
                int ptr = packet.Position;

                bool packOk         = PackEvent(unreliableSend[i].NetworkEvent, packet, 0);
                bool notOverflowing = packet.Overflowing == false;

                if (packOk && notOverflowing)
                {
                    //unreliableSend[i].NetworkEvent.DecrementRefs();
                    unreliableSend.RemoveAt(i);
                }
                else
                {
                    // reset ptr
                    packet.Position = ptr;
                }
            }

            packet.WriteStopMarker();

            // prune entities which have been skipped twice
            for (int i = 0; i < unreliableSend.Count; ++i)
            {
                EventUnreliable r = unreliableSend[i];

                if (r.Skipped)
                {
                    unreliableSend.RemoveAt(i);
                }
                else
                {
                    // this will be pruned next time if it's not sent
                    r.Skipped = true;

                    unreliableSend[i] = r;
                }
            }

            packet.Stats.EventBits = packet.Position - startPos;
        }