コード例 #1
0
        /// <summary>
        /// </summary>
        /// <param name="NeededBlocks"></param>
        /// <returns></returns>
        public bool HasAnyBlocksNeeded(BlockListState NeededBlocks)
        {
            foreach (ManifestBlockListState NeededState in NeededBlocks.States)
            {
                if (NeededState.IsActive)
                {
                    ManifestBlockListState OurState = GetStateById(NeededState.Id);
                    if (OurState != null)
                    {
                        foreach (SparseStateArray.Range NeededRange in NeededState.BlockState.Ranges)
                        {
                            if (!NeededRange.State)
                            {
                                if (OurState.BlockState.IsAnyInRangeSet(NeededRange.Start, NeededRange.End))
                                {
                                    return(true);
                                }
                            }
                        }
                    }
                }
            }

            return(false);
        }
コード例 #2
0
        /// <summary>
        /// </summary>
        /// <param name="serializer"></param>
        public void Serialize(NetMessageSerializer serializer)
        {
            int StateCount = States.Length;

            serializer.Serialize(ref StateCount);

            Array.Resize(ref States, StateCount);

            for (int i = 0; i < StateCount; i++)
            {
                if (serializer.IsLoading)
                {
                    States[i] = new ManifestBlockListState();
                }

                ManifestBlockListState State = States[i];
                serializer.Serialize(ref State.Id);
                serializer.Serialize(ref State.IsActive);

                if (State.BlockState.Ranges == null)
                {
                    State.BlockState.Ranges = new List <SparseStateArray.Range>();
                }

                int RangeCount = State.BlockState.Ranges.Count;
                serializer.Serialize(ref RangeCount);

                int Size = State.BlockState.Size;
                serializer.Serialize(ref Size);
                State.BlockState.Size = Size;

                for (int j = 0; j < RangeCount; j++)
                {
                    if (serializer.IsLoading)
                    {
                        State.BlockState.Ranges.Add(new SparseStateArray.Range());
                    }

                    SparseStateArray.Range Range = State.BlockState.Ranges[j];

                    int TempStart = Range.Start;
                    serializer.Serialize(ref TempStart);
                    Range.Start = TempStart;

                    int TempEnd = Range.End;
                    serializer.Serialize(ref TempEnd);
                    Range.End = TempEnd;

                    bool TmpState = Range.State;
                    serializer.Serialize(ref TmpState);
                    Range.State = TmpState;

                    State.BlockState.Ranges[j] = Range;
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// </summary>
        /// <param name="Base"></param>
        /// <returns></returns>
        public void Union(BlockListState Other)
        {
            foreach (ManifestBlockListState OtherState in Other.States)
            {
                ManifestBlockListState OwnState = GetStateById(OtherState.Id);
                if (OwnState == null)
                {
                    OwnState            = new ManifestBlockListState();
                    OwnState.Id         = OtherState.Id;
                    OwnState.IsActive   = true;
                    OwnState.BlockState = OtherState.BlockState.Clone();

                    Array.Resize(ref States, States.Length + 1);
                    States[States.Length - 1] = OwnState;
                }
                else
                {
                    OwnState.BlockState.Union(OtherState.BlockState);
                }
            }
        }