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(); } } }
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; }