Ejemplo n.º 1
0
        public int GetNextPacketLength(bool delta)
        {
            int len = 3;

            int itemMin = 0;
            int itemMax = Entry.DataType.Bools;

            int item = WritingCurrentItem;

            // bools
            // bools are always networked
            while (item >= itemMin && item < itemMax)
            {
                len  += 1;
                item += 8;
                if (item > itemMax)
                {
                    item = itemMax;
                }
                if (len >= EntryPacketSplitSize)
                {
                    return(len);
                }
            }

            // bytes
            itemMin += Entry.DataType.Bools;
            itemMax += Entry.DataType.Bytes;
            if (Entry.DataType.Bytes > 0)
            {
                len++;
            }
            while (item >= itemMin && item < itemMax)
            {
                len += ((!delta && Bytes[item - itemMin] == Entry.Bytes[item - itemMin]) ||
                        (delta && !Stales[item]) ? 0 : 2);
                item += 1;

                if (len >= EntryPacketSplitSize)
                {
                    return(len);
                }
            }

            // ushorts
            itemMin += Entry.DataType.Bytes;
            itemMax += Entry.DataType.UShorts;
            if (Entry.DataType.UShorts > 0)
            {
                len++;
            }
            while (item >= itemMin && item < itemMax)
            {
                len += ((!delta && UShorts[item - itemMin] == Entry.UShorts[item - itemMin]) ||
                        (delta && !Stales[item]) ? 0 : 3);
                item += 1;

                if (len >= EntryPacketSplitSize)
                {
                    return(len);
                }
            }

            // ints
            itemMin += Entry.DataType.UShorts;
            itemMax += Entry.DataType.Ints;
            if (Entry.DataType.Ints > 0)
            {
                len++;
            }
            while (item >= itemMin && item < itemMax)
            {
                len += ((!delta && Ints[item - itemMin] == Entry.Ints[item - itemMin]) ||
                        (delta && !Stales[item]) ? 0 : 5);
                item += 1;

                if (len >= EntryPacketSplitSize)
                {
                    return(len);
                }
            }

            // floats
            itemMin += Entry.DataType.Ints;
            itemMax += Entry.DataType.Floats;
            if (Entry.DataType.Floats > 0)
            {
                len++;
            }
            while (item >= itemMin && item < itemMax)
            {
                len += ((!delta && Floats[item - itemMin] == Entry.Floats[item - itemMin]) ||
                        (delta && !Stales[item]) ? 0 : 5);
                item += 1;

                if (len >= EntryPacketSplitSize)
                {
                    return(len);
                }
            }

            // doubles
            itemMin += Entry.DataType.Floats;
            itemMax += Entry.DataType.Doubles;
            if (Entry.DataType.Doubles > 0)
            {
                len++;
            }
            while (item >= itemMin && item < itemMax)
            {
                len += ((!delta && Doubles[item - itemMin] == Entry.Doubles[item - itemMin]) ||
                        (delta && !Stales[item]) ? 0 : 9);
                item += 1;

                if (len >= EntryPacketSplitSize)
                {
                    return(len);
                }
            }

            // strings
            itemMin += Entry.DataType.Doubles;
            itemMax += Entry.DataType.Strings;
            int sdepth      = WritingStringDepth;
            int possibleLen = 0;

            if (Entry.DataType.Strings > 0)
            {
                len++;
            }
            while (item >= itemMin && item < itemMax)
            {
                if ((!delta && Strings[item - itemMin] == Entry.GetStringAtIndex(item - itemMin)) ||
                    (delta && !Stales[item]))
                {
                    item += 1;
                    continue;
                }

                possibleLen = 3 + StringLengths[item - itemMin] - sdepth;
                sdepth      = 0; // if we're part way through a string,
                // apply that depth, but only to the first string we consider

                // need to handle splitting
                if (possibleLen + len > EntryPacketSplitSize)
                {
                    return(EntryPacketSplitSize);
                }

                len  += possibleLen;
                item += 1;

                if (len >= EntryPacketSplitSize)
                {
                    return(len);
                }
            }

            return(len);
        }
Ejemplo n.º 2
0
        public DynamicDataClone(DynamicDataEntry entry)
        {
            Entry = entry;

            if (entry != null)
            {
                Stales = new bool[entry.DataType.TotalCount];

                if (entry.DataType.Bools > 0)
                {
                    Bools = new bool[entry.DataType.Bools];
                    if (Bools.Length > 0)
                    {
                        PackedBoolSize = (8 + (Bools.Length - (Bools.Length % 8))) / 8;
                        for (int i = 0; i < entry.DataType.Bools; i++)
                        {
                            Bools[i] = entry.Bools[i];
                        }
                    }
                }
                if (entry.DataType.Bytes > 0)
                {
                    Bytes = new byte[entry.DataType.Bytes];
                    for (int i = 0; i < entry.DataType.Bytes; i++)
                    {
                        Bytes[i] = entry.Bytes[i];
                    }
                }
                if (entry.DataType.UShorts > 0)
                {
                    UShorts = new ushort[entry.DataType.UShorts];
                    for (int i = 0; i < entry.DataType.UShorts; i++)
                    {
                        UShorts[i] = entry.UShorts[i];
                    }
                }
                if (entry.DataType.Ints > 0)
                {
                    Ints = new int[entry.DataType.Ints];
                    for (int i = 0; i < entry.DataType.Ints; i++)
                    {
                        Ints[i] = entry.Ints[i];
                    }
                }
                if (entry.DataType.Floats > 0)
                {
                    Floats = new float[entry.DataType.Floats];
                    for (int i = 0; i < entry.DataType.Floats; i++)
                    {
                        Floats[i] = entry.Floats[i];
                    }
                }
                if (entry.DataType.Doubles > 0)
                {
                    Doubles = new double[entry.DataType.Doubles];
                    for (int i = 0; i < entry.DataType.Doubles; i++)
                    {
                        Doubles[i] = entry.Doubles[i];
                    }
                }
                if (entry.DataType.Strings > 0)
                {
                    Strings = new string[entry.DataType.Strings];
                    for (int i = 0; i < entry.DataType.Strings; i++)
                    {
                        Strings[i] = entry.GetStringAtIndex(i);
                    }
                    StringLengths = new int[entry.DataType.Strings];
                }
            }
        }
Ejemplo n.º 3
0
        // reuse a clone
        // we will try to reuse our arrays if possible
        public void LoadFromEntry(DynamicDataEntry entry)
        {
            Entry = entry;

            if (Stales == null || Stales.Length < entry.DataType.TotalCount)
            {
                Stales = new bool[entry.DataType.TotalCount];
            }

            if (entry.DataType.Bools > 0)
            {
                if (Bools == null || Bools.Length < entry.DataType.Bools)
                {
                    Bools = new bool[entry.DataType.Bools];
                }
                if (Bools.Length > 0)
                {
                    PackedBoolSize = (8 + (Bools.Length - (Bools.Length % 8))) / 8;
                    for (int i = 0; i < entry.DataType.Bools; i++)
                    {
                        Bools[i] = entry.Bools[i];
                    }
                }
            }
            else
            {
                PackedBoolSize = 0;
            }

            if (entry.DataType.Bytes > 0)
            {
                if (Bytes == null || Bytes.Length < entry.DataType.Bytes)
                {
                    Bytes = new byte[entry.DataType.Bytes];
                }
                for (int i = 0; i < entry.DataType.Bytes; i++)
                {
                    Bytes[i] = entry.Bytes[i];
                }
            }

            if (entry.DataType.UShorts > 0)
            {
                if (UShorts == null || UShorts.Length < entry.DataType.UShorts)
                {
                    UShorts = new ushort[entry.DataType.UShorts];
                }
                for (int i = 0; i < entry.DataType.UShorts; i++)
                {
                    UShorts[i] = entry.UShorts[i];
                }
            }

            if (entry.DataType.Ints > 0)
            {
                if (Ints == null || Ints.Length < entry.DataType.Ints)
                {
                    Ints = new int[entry.DataType.Ints];
                }
                for (int i = 0; i < entry.DataType.Ints; i++)
                {
                    Ints[i] = entry.Ints[i];
                }
            }

            if (entry.DataType.Floats > 0)
            {
                if (Floats == null || Floats.Length < entry.DataType.Floats)
                {
                    Floats = new float[entry.DataType.Floats];
                }
                for (int i = 0; i < entry.DataType.Floats; i++)
                {
                    Floats[i] = entry.Floats[i];
                }
            }

            if (entry.DataType.Doubles > 0)
            {
                if (Doubles == null || Doubles.Length < entry.DataType.Doubles)
                {
                    Doubles = new double[entry.DataType.Doubles];
                }
                for (int i = 0; i < entry.DataType.Doubles; i++)
                {
                    Doubles[i] = entry.Doubles[i];
                }
            }

            if (entry.DataType.Strings > 0)
            {
                if (Strings == null || Strings.Length < entry.DataType.Strings)
                {
                    Strings = new string[entry.DataType.Strings];
                }
                for (int i = 0; i < entry.DataType.Strings; i++)
                {
                    Strings[i] = entry.GetStringAtIndex(i);
                }
                if (StringLengths == null || StringLengths.Length < entry.DataType.Strings)
                {
                    StringLengths = new int[entry.DataType.Strings];
                }
            }
        }