public static void Decode <T>(this BitBuffer buffer, List <T> receivedList, Func <T> decode) where T : IPoolable <T> { var decoded = buffer.UnpackAll(decode); foreach (var delta in decoded) { receivedList.Add(delta); } }
public static void DecodePacket <T>(this BitBuffer buffer, T packet, Int32Compressor eventTypeCompressor, Func <int, Event> eventFactory, Action <BitBuffer, T> onDecodePayload) where T : Packet { // Read: [Header] { // Read: [LocalTick] packet.SenderTick = buffer.ReadTick(); // Read: [AckTick] packet.AckTick = buffer.ReadTick(); // Read: [AckReliableEventId] packet.AckEventId = buffer.ReadSequenceId(); } // Read: [Events] (Early Pack) DecodeEvents(); // Read: [Payload] //packet.DecodePayload(buffer); onDecodePayload(buffer, packet); // Read: [Events] (Fill Pack) DecodeEvents(); void DecodeEvents() { var decoded = buffer.UnpackAll(() => { var packetTick = packet.SenderTick; { /// <summary> /// Note that the packetTick may not be the tick this event was created on /// if we're re-trying to send this event in subsequent packets. This tick /// is intended for use in tick diffs for compression. /// </summary> // Event Decode // Read: [EventType] var typeCode = buffer.ReadInt(eventTypeCompressor); var evnt = eventFactory(typeCode); // Read: [EventId] evnt.EventId = buffer.ReadSequenceId(); // Read: [HasEntityId] var hasEntityId = buffer.ReadBool(); if (hasEntityId) { // Read: [EntityId] evnt.EntityId = buffer.ReadEntityId(); } // Read: [EventData] evnt.DecodeData(buffer, packetTick); return(evnt); } }); foreach (var evnt in decoded) { packet.Events.Add(evnt); } } }