Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
                }
            }
        }