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