Esempio n. 1
0
            public static BlockSystem <T> SearchByFilter(Program program, BlockFilter <T> filter)
            {
                List <T> list = new List <T>();

                try
                {
                    if (filter.ByGroup)
                    {
                        List <IMyBlockGroup> groups = new List <IMyBlockGroup>();
                        program.GridTerminalSystem.GetBlockGroups(groups, filter.GroupVisitor());
                        List <T> group_list = new List <T>();
                        groups.ForEach(delegate(IMyBlockGroup group)
                        {
                            group_list.Clear();
                            group.GetBlocksOfType <T>(list, filter.BlockVisitor());
                            list.AddList(group_list);
                        });
                    }
                    else
                    {
                        program.GridTerminalSystem.GetBlocksOfType <T>(list, filter.BlockVisitor());
                    }
                }
                catch { }
                program.Echo(String.Format("List<{0}>:{1}", filter.Value, list.Count));
                return(new BlockSystem <T>()
                {
                    program = program,
                    List = list
                });
            }
Esempio n. 2
0
        private void ReadFilters(BinaryReader reader, long baseStreamOffset = 0)
        {
            int nonLastSizeChangers = 0;

            for (int i = 0; i < _numFilters; i++)
            {
                var filter = BlockFilter.Read(reader);
                if ((i + 1 == _numFilters && !filter.AllowAsLast) ||
                    (i + 1 < _numFilters && !filter.AllowAsNonLast))
                {
                    throw new InvalidDataException("Block Filters in bad order");
                }

                if (filter.ChangesDataSize && i + 1 < _numFilters)
                {
                    nonLastSizeChangers++;
                }

                filter.ValidateFilter();
                Filters.Push(filter);
            }
            if (nonLastSizeChangers > 2)
            {
                throw new InvalidDataException("More than two non-last block filters cannot change stream size");
            }

            int blockHeaderPaddingSize = BlockHeaderSize -
                                         (4 + (int)(reader.BaseStream.Position - baseStreamOffset));

            byte[] blockHeaderPadding = reader.ReadBytes(blockHeaderPaddingSize);
            if (!blockHeaderPadding.All(b => b == 0))
            {
                throw new InvalidDataException("Block header contains unknown fields");
            }
        }
Esempio n. 3
0
        public static bool CanCreate(ICoreClientAPI api, Entity entity)
        {
            if (api.Side.IsClient())
            {
                if (ConfigLoader.Config.FDShow)
                {
                    var playerEntity = api.World.Player.Entity;
                    var playerPos    = playerEntity.Pos.XYZ.AddCopy(playerEntity.LocalEyePos);
                    var entityPos    = entity.Pos.XYZ.AddCopy(entity.LocalEyePos);
                    var blockSel     = new BlockSelection();
                    var entitySel    = new EntitySelection();

                    if (playerPos.DistanceTo(entityPos) > ConfigLoader.Config.FDRange)
                    {
                        return(false);
                    }

                    BlockFilter bFilter = (pos, block) => block.CollisionBoxes != null;

                    api.World.RayTraceForSelection(playerPos, entityPos, ref blockSel, ref entitySel, bFilter);

                    return(entitySel?.Entity?.Equals(entity) ?? false);
                }
            }
            return(false);
        }
Esempio n. 4
0
        public int NewBlockFilter()
        {
            BlockFilter filter = _filterStore.CreateBlockFilter(_blockTree.Head.Number);

            _filterStore.SaveFilter(filter);
            return(filter.Id);
        }
Esempio n. 5
0
        public bool RayIntersectsBlockSelectionBox(BlockPos pos, BlockFilter filter)
        {
            if (filter?.Invoke(pos, blockSelectionTester.GetBlock(pos)) == false)
            {
                return(false);
            }

            Cuboidf[] selectionBoxes = blockSelectionTester.GetBlockIntersectionBoxes(pos);
            if (selectionBoxes == null)
            {
                return(false);
            }

            bool intersects = false;

            for (int i = 0; i < selectionBoxes.Length; i++)
            {
                tmpCuboidd.Set(selectionBoxes[i]).Translate(pos.X, pos.Y, pos.Z);
                if (RayIntersectsWithCuboid(tmpCuboidd, ref hitOnBlockFaceTmp, ref hitPositionTmp))
                {
                    if (intersects && hitPosition.SquareDistanceTo(ray.origin) <= hitPositionTmp.SquareDistanceTo(ray.origin))
                    {
                        continue;
                    }

                    hitOnSelectionBox = i;
                    intersects        = true;
                    hitOnBlockFace    = hitOnBlockFaceTmp;
                    hitPosition.Set(hitPositionTmp);
                }
            }

            return(intersects);
        }
Esempio n. 6
0
        public void GetBlockByHash(NodeCoreAdminClient adminClient)
        {
            Console.WriteLine("GetBlockByHash");
            Console.WriteLine("NC_CLI command: getblockfromhash <blockHash>");

            String blockHash = "0000000000002A866690AF6E6B7B784151DDB0565BE16EE0";


            BlockFilter filter = new BlockFilter();

            filter.Hash = blockHash.ToByteString();
            GetBlocksRequest request = new GetBlocksRequest();

            request.Filters.Add(filter);
            request.SearchLength = 2000;

            GetBlocksReply reply = adminClient.AdminClient.GetBlocks(request);

            if (reply.Success)
            {
                if (reply.Blocks.Count > 0)
                {
                    //Display info
                    int iBlockIndex = reply.Blocks[0].Number;
                    Console.WriteLine("BlockIndex={0}", iBlockIndex);
                }
            }

            Console.WriteLine("--------------------");
            Console.WriteLine();
        }
Esempio n. 7
0
        public void GetBlockByIndex(NodeCoreAdminClient adminClient)
        {
            Console.WriteLine("GetBlockByIndex");
            Console.WriteLine("NC_CLI command: getblockfromindex <blockIndex>");

            int iBlockIndex = 100;

            BlockFilter filter = new BlockFilter();

            filter.Index = iBlockIndex;
            GetBlocksRequest request = new GetBlocksRequest();

            request.Filters.Add(filter);
            request.SearchLength = 2000;

            GetBlocksReply reply = adminClient.AdminClient.GetBlocks(request);

            if (reply.Success)
            {
                if (reply.Blocks.Count > 0)
                {
                    //Display info
                    String blockHash = reply.Blocks[0].Hash.ToHexString();
                    Console.WriteLine("BlockHash={0}", blockHash);
                }
            }

            Console.WriteLine("--------------------");
            Console.WriteLine();
        }
Esempio n. 8
0
        private void Search()
        {
            BlockFilter <IMyTextPanel> block_filter = BlockFilter <IMyTextPanel> .Create(Me, MyProperty.lcd_filter);

            lcds = BlockSystem <IMyTextPanel> .SearchByFilter(this, block_filter);

            search = false;
        }
Esempio n. 9
0
            private void Search()
            {
                BlockFilter <IMyProductionBlock> block_filter = BlockFilter <IMyProductionBlock> .Create(DisplayLcd.lcd, filter);

                producers = BlockSystem <IMyProductionBlock> .SearchByFilter(DisplayLcd.program, block_filter);

                search = false;
            }
Esempio n. 10
0
            private void Search()
            {
                BlockFilter <IMyShipDrill> block_filter = BlockFilter <IMyShipDrill> .Create(DisplayLcd.lcd, filter);

                drill_inventories = BlockSystem <IMyShipDrill> .SearchByFilter(DisplayLcd.program, block_filter);

                search = false;
            }
Esempio n. 11
0
            private void Search()
            {
                BlockFilter <IMyTerminalBlock> block_filter = BlockFilter <IMyTerminalBlock> .Create(DisplayLcd.lcd, filter);

                block_filter.HasInventory = true;
                inventories = BlockSystem <IMyTerminalBlock> .SearchByFilter(DisplayLcd.program, block_filter);

                search = false;
            }
Esempio n. 12
0
        public void Can_save_and_load_block_filter()
        {
            FilterStore store  = new();
            BlockFilter filter = store.CreateBlockFilter(1);

            store.SaveFilter(filter);
            Assert.True(store.FilterExists(0), "exists");
            Assert.AreEqual(FilterType.BlockFilter, store.GetFilterType(filter.Id), "type");
        }
Esempio n. 13
0
        public void Cannot_overwrite_filters()
        {
            FilterStore store = new FilterStore();

            BlockFilter externalFilter = new BlockFilter(100, 1);

            store.SaveFilter(externalFilter);
            Assert.Throws <InvalidOperationException>(() => store.SaveFilter(externalFilter));
        }
Esempio n. 14
0
        public IEnumerable <BlockData> GetBlocks(BlockFilter blockFilter = null)
        {
            var blockData  = new List <BlockData>();
            var collection = Database.GetCollection <MongoBlockData>(Blocks);
            var builder    = Builders <MongoBlockData> .Filter;
            var filterDefs = new List <FilterDefinition <MongoBlockData> >();

            if (blockFilter != null)
            {
                if (!string.IsNullOrWhiteSpace(blockFilter.BlockId))
                {
                    filterDefs.Add(builder.Eq(x => x.Hash, blockFilter.BlockId));
                }

                if (!string.IsNullOrWhiteSpace(blockFilter.TxId))
                {
                    filterDefs.Add(builder.Where(x => x.Transactions.Select(t => t.Hash).Contains(blockFilter.TxId)));
                }

                if (!string.IsNullOrWhiteSpace(blockFilter.ScriptPubKey))
                {
                    filterDefs.Add(builder.Where(x => x.Transactions.Any(t => t.Outputs.Any(o => o.ScriptPubKey == blockFilter.ScriptPubKey))));
                }

                if (blockFilter.UnSpents != null && blockFilter.UnSpents.Any())
                {
                    filterDefs.Add(builder.Where(x => x.Transactions.Any(t => t.Inputs.Any(i => blockFilter.UnSpents.Contains(i.PrevOut.Hash)))));
                }
                var filterDef = filterDefs.Any() ? filterDefs.Aggregate((x, y) => x & y) : builder.Empty;
                var blocks    = collection.Find <MongoBlockData>(filterDef).ToList();
                if (!string.IsNullOrWhiteSpace(blockFilter.SenderPubKey))
                {
                    var blocksSpents =
                        blocks.Where(
                            b =>
                            b.Transactions.Any(
                                t =>
                                t.Inputs.Any(
                                    i => TransactionHelper.IsFrom(blockFilter.SenderPubKey, i.ScriptSig))));
                    foreach (var block in blocksSpents)
                    {
                        blockData.Add(block);
                    }
                }
                else
                {
                    foreach (var block in blocks)
                    {
                        blockData.Add(block);
                    }
                }
            }


            return(blockData);
        }
Esempio n. 15
0
        public BlockData GetBlock(string blockId)
        {
            var blockFilter = new BlockFilter {
                BlockId = blockId
            };

            var blocks = DataService.GetBlocks(blockFilter);

            return(blocks.FirstOrDefault());
        }
Esempio n. 16
0
        /// <summary>
        /// Get certain blocks based on a filter
        /// </summary>
        /// <param name="filter">Filter to get blocks</param>
        /// <param name="onscreen">Should the blocks be visible on the screen</param>
        /// <returns>Array of filtered blocks</returns>
        public Block[] GetAllBlocks(BlockFilter filter, bool onscreen)
        {
            List <Block> blocks = new List <Block>();

            for (int i = 0; i < chunks.Count; i++)
            {
                blocks.AddRange(chunks[i].GetBlocks(filter, onscreen));
            }
            return(blocks.ToArray());
        }
Esempio n. 17
0
        private void Search()
        {
            BlockFilter <IMyDoor> block_filter1 = BlockFilter <IMyDoor> .Create(Me, "*");

            doors = BlockSystem <IMyDoor> .SearchByFilter(this, block_filter1);

            BlockFilter <IMySensorBlock> block_filter2 = BlockFilter <IMySensorBlock> .Create(Me, "*");

            sensors = BlockSystem <IMySensorBlock> .SearchByFilter(this, block_filter2);
        }
Esempio n. 18
0
 private void ConnectStream()
 {
     _decomStream = BaseStream;
     while (Filters.Any())
     {
         BlockFilter filter = Filters.Pop();
         filter.SetBaseStream(_decomStream);
         _decomStream = filter;
     }
     _streamConnected = true;
 }
Esempio n. 19
0
        public BlockSelection GetSelectedBlock(Vec3d from, Vec3d to, BlockFilter filter = null)
        {
            LoadRayAndPos(new Line3D()
            {
                Start = new double[] { from.X, from.Y, from.Z },
                End   = new double[] { to.X, to.Y, to.Z }
            });

            float maxDistance = from.DistanceTo(to);

            return(GetSelectedBlock(maxDistance, filter));
        }
Esempio n. 20
0
        private void Assert(IEnumerable <Action <FilterBuilder> > filterBuilders,
                            IEnumerable <Action <ReceiptBuilder> > receiptBuilders,
                            Action <IEnumerable <FilterLog> > logsAssertion)
        {
            var filters  = new List <FilterBase>();
            var receipts = new List <TxReceipt>();

            foreach (var filterBuilder in filterBuilders)
            {
                filters.Add(BuildFilter(filterBuilder));
            }

            foreach (var receiptBuilder in receiptBuilders)
            {
                receipts.Add(BuildReceipt(receiptBuilder));
            }

            // adding always a simple block filter and test
            Block       block       = Build.A.Block.TestObject;
            BlockFilter blockFilter = new BlockFilter(_currentFilterId++, 0);

            filters.Add(blockFilter);

            _filterStore.GetFilters <LogFilter>().Returns(filters.OfType <LogFilter>().ToArray());
            _filterStore.GetFilters <BlockFilter>().Returns(filters.OfType <BlockFilter>().ToArray());
            _filterManager = new FilterManager(_filterStore, _blockProcessor, _txPool, _logManager);

            _blockProcessor.BlockProcessed += Raise.EventWith(_blockProcessor, new BlockProcessedEventArgs(block));

            var index = 1;

            foreach (var receipt in receipts)
            {
                _blockProcessor.TransactionProcessed += Raise.EventWith(_blockProcessor,
                                                                        new TxProcessedEventArgs(index, Build.A.Transaction.TestObject, receipt));
                index++;
            }

            NUnit.Framework.Assert.Multiple(() =>
            {
                foreach (var filter in filters.OfType <LogFilter>())
                {
                    var logs = _filterManager.GetLogs(filter.Id);
                    logsAssertion(logs);
                }

                var hashes = _filterManager.GetBlocksHashes(blockFilter.Id);
                NUnit.Framework.Assert.AreEqual(1, hashes.Length);
            });
        }
Esempio n. 21
0
        public void Remove_filter_removes_and_notifies()
        {
            FilterStore store  = new();
            BlockFilter filter = store.CreateBlockFilter(1);

            store.SaveFilter(filter);
            bool hasNotified = false;

            store.FilterRemoved += (s, e) => hasNotified = true;
            store.RemoveFilter(0);

            Assert.True(hasNotified, "notied");
            Assert.False(store.FilterExists(0), "exists");
        }
Esempio n. 22
0
        public void Ids_are_incremented_when_storing_externally_created_filter()
        {
            FilterStore store = new FilterStore();

            BlockFilter externalFilter = new BlockFilter(100, 1);

            store.SaveFilter(externalFilter);
            LogFilter filter = store.CreateLogFilter(new FilterBlock(1), new FilterBlock(2));

            store.SaveFilter(filter);

            Assert.True(store.FilterExists(100), "exists 100");
            Assert.True(store.FilterExists(101), "exists 101");
            Assert.AreEqual(FilterType.LogFilter, store.GetFilterType(filter.Id), "type");
        }
Esempio n. 23
0
            public static List <IMyBlockGroup> SearchGroupFilter(Program program, BlockFilter <T> filter)
            {
                List <IMyBlockGroup> groups = new List <IMyBlockGroup>();

                try
                {
                    if (filter.ByGroup)
                    {
                        program.GridTerminalSystem.GetBlockGroups(groups, filter.GroupVisitor());
                    }
                }
                catch { }
                program.Echo(String.Format("List <{0}> count: {1}", filter.Value, groups.Count));
                return(groups);
            }
Esempio n. 24
0
        private void Search()
        {
            BlockFilter <IMyBlockGroup> group_filter = BlockFilter <IMyBlockGroup> .Create(Me, MyProperty.filter);

            Groups = BlockSystem <IMyBlockGroup> .SearchGroupFilter(this, group_filter);

            Airlocks = new List <Airlock>();
            if (Groups != null)
            {
                Groups.ForEach(delegate(IMyBlockGroup group)
                {
                    Airlocks.Add(new Airlock(this, group.Name));
                });
            }
        }
Esempio n. 25
0
        public BlockSelection GetSelectedBlock(float maxDistance, BlockFilter filter = null)
        {
            float distanceSq = 0;

            // Get the face where our ray will exit
            BlockFacing lastExitedBlockFace = GetExitingFullBlockFace(pos, ref lastExitedBlockFacePos);

            if (lastExitedBlockFace == null)
            {
                return(null);
            }

            float maxDistanceSq = (maxDistance + 1) * (maxDistance + 1);

            // Wander along the block exiting faces until we collide with a block selection box
            while (!RayIntersectsBlockSelectionBox(pos, filter))
            {
                if (distanceSq >= maxDistanceSq)
                {
                    return(null);
                }

                pos.Offset(lastExitedBlockFace);

                lastExitedBlockFace = GetExitingFullBlockFace(pos, ref lastExitedBlockFacePos);
                if (lastExitedBlockFace == null)
                {
                    return(null);
                }

                distanceSq = pos.DistanceSqTo(ray.origin.X - 0.5f, ray.origin.Y - 0.5f, ray.origin.Z - 0.5f);
            }


            if (hitPosition.SquareDistanceTo(ray.origin) > maxDistance * maxDistance)
            {
                return(null);
            }


            return(new BlockSelection()
            {
                Face = hitOnBlockFace,
                Position = pos.Copy(),
                HitPosition = hitPosition.SubCopy(pos.X, pos.Y, pos.Z),
                SelectionBoxIndex = hitOnSelectionBox
            });
        }
Esempio n. 26
0
        static void BlockTest()
        {
            IScheduledItem item =
                new BlockFilter(
                    new SimpleInterval(DateTime.Parse("1/01/2004"), TimeSpan.FromMinutes(15)),
                    "Daily",
                    "6:00 AM",
                    "5:00 PM");

            TestItem(item, new DateTime(2004, 1, 1), true, new DateTime(2004, 1, 1, 6, 15, 0));
            TestItem(item, new DateTime(2004, 1, 1, 6, 0, 0), true, new DateTime(2004, 1, 1, 6, 0, 0));
            TestItem(item, new DateTime(2004, 1, 1, 6, 0, 0), false, new DateTime(2004, 1, 1, 6, 15, 0));
            TestItem(item, new DateTime(2004, 1, 1, 6, 0, 1), true, new DateTime(2004, 1, 1, 6, 15, 0));
            TestItem(item, new DateTime(2004, 1, 1, 6, 15, 0), true, new DateTime(2004, 1, 1, 6, 15, 0));
            TestItem(item, new DateTime(2004, 1, 1, 16, 45, 0), false, new DateTime(2004, 1, 1, 17, 0, 0));
            TestItem(item, new DateTime(2004, 1, 1, 17, 1, 0), true, new DateTime(2004, 1, 2, 6, 15, 0));
        }
Esempio n. 27
0
        public bool RayIntersectsBlockSelectionBox(BlockPos pos, BlockFilter filter)
        {
            if (filter?.Invoke(pos, blockSelectionTester.GetBlock(pos)) == false)
            {
                return(false);
            }

            Cuboidf[] selectionBoxes = blockSelectionTester.GetBlockIntersectionBoxes(pos);
            if (selectionBoxes == null)
            {
                return(false);
            }

            bool intersects = false;
            bool wasDecor   = false;

            for (int i = 0; i < selectionBoxes.Length; i++)
            {
                tmpCuboidd.Set(selectionBoxes[i]).Translate(pos.X, pos.Y, pos.Z);
                if (RayIntersectsWithCuboid(tmpCuboidd, ref hitOnBlockFaceTmp, ref hitPositionTmp))
                {
                    bool isDecor = selectionBoxes[i] is DecorSelectionBox;
                    if (intersects && (!wasDecor || isDecor) && hitPosition.SquareDistanceTo(ray.origin) <= hitPositionTmp.SquareDistanceTo(ray.origin))
                    {
                        continue;
                    }

                    hitOnSelectionBox = i;
                    intersects        = true;
                    wasDecor          = isDecor;
                    hitOnBlockFace    = hitOnBlockFaceTmp;
                    hitPosition.Set(hitPositionTmp);
                }
            }

            if (intersects && selectionBoxes[hitOnSelectionBox] is DecorSelectionBox dsb)
            {
                Vec3i posAdjust = dsb.PosAdjust;
                if (posAdjust != null)
                {
                    pos.Add(posAdjust);
                }
            }

            return(intersects);
        }
Esempio n. 28
0
        public void Can_get_filters_by_type()
        {
            FilterStore store   = new();
            BlockFilter filter1 = store.CreateBlockFilter(1);

            store.SaveFilter(filter1);
            LogFilter filter2 = store.CreateLogFilter(new BlockParameter(1), new BlockParameter(2));

            store.SaveFilter(filter2);

            LogFilter[]   logFilters   = store.GetFilters <LogFilter>().ToArray();
            BlockFilter[] blockFilters = store.GetFilters <BlockFilter>().ToArray();

            Assert.AreEqual(1, logFilters.Length, "log filters length");
            Assert.AreEqual(1, logFilters[0].Id, "log filters ids");
            Assert.AreEqual(1, blockFilters.Length, "block Filters length");
            Assert.AreEqual(0, blockFilters[0].Id, "block filters ids");
        }
Esempio n. 29
0
        void RunContinuousLogic()
        {
            if (search)
            {
                Search();
            }
            WriteText($"LCD found: {(lcds != null ? lcds.List.Count : 0)}", false);
            BlockFilter <IMyThrust> block_filter = BlockFilter <IMyThrust> .Create(Me, "C:Up");

            BlockSystem <IMyThrust> thrust = BlockSystem <IMyThrust> .SearchByFilter(this, block_filter);

            if (!thrust.IsEmpty)
            {
                ParserInfo parser = new ParserInfo(this);
                IMyThrust  block  = thrust.First;
                parser.ParserTitle(block);
                parser.ParserTerminalBlock(block);
                parser.ParserThrust(block);
                parser.ParserCubeBlock(block);
            }
        }
Esempio n. 30
0
        private void Prepare()
        {
            BlockFilter <IMyRefinery> filterRefinery = new BlockFilter <IMyRefinery>()
            {
                CubeGrid = Me.CubeGrid
            };

            refinery = BlockSystem <IMyRefinery> .SearchByFilter(this, filterRefinery);

            refinery.ForEach(delegate(IMyRefinery block)
            {
                block.UseConveyorSystem = false;
            });
            BlockFilter <IMyCargoContainer> filterContainer = new BlockFilter <IMyCargoContainer>()
            {
                Filter   = "Ore",
                CubeGrid = Me.CubeGrid
            };

            stock = BlockSystem <IMyCargoContainer> .SearchByFilter(this, filterContainer);
        }