public void NaiveSetBlockTest()
        {
            var chunk = NamespacedChunk.CreateEmpty();

#pragma warning disable 0618
            chunk.SetBlock(13, 40, 8, new NamespacedBlock("test_block"));
#pragma warning restore 0618

            chunk.SetBlock(new[] {
                new ChangeBlockRequest(1, 41, 3, 0),
                new ChangeBlockRequest(1, 41, 2, 1),
                new ChangeBlockRequest(1, 99, 2, 1),
                new ChangeBlockRequest(1, 10, 2, 1),
            }, new List <NamespacedBlock>()
            {
                new NamespacedBlock("test_block"),
                new NamespacedBlock("test_block2")
            });

            Assert.AreEqual(chunk.GetBlock(13, 40, 8).Name, "test_block");
            Assert.AreEqual(chunk.GetBlock(1, 41, 3).Name, "test_block");
            Assert.AreEqual(chunk.GetBlock(1, 41, 2).Name, "test_block2");
            Assert.AreEqual(chunk.GetBlock(1, 99, 2).Name, "test_block2");
            Assert.AreEqual(chunk.GetBlock(1, 10, 2).Name, "test_block2");

            Assert.AreSame(chunk.GetBlock(1, 41, 3), chunk.GetBlock(13, 40, 8));
        }
        public void UnderlyingNamespacedChunkTest()
        {
            const string IdGrass = "minecraft:grass_block";

            var baseChunk = NamespacedChunk.CreateEmpty();

#pragma warning disable 0618
            baseChunk.SetBlock(4, 4, 4, new NamespacedBlock(IdGrass));
#pragma warning restore 0618
            var dispatcher = new BlockFactoryDispatcher(null);
            dispatcher.AddDispatcherFromAssembly(typeof(BlockFactoryDispatcher).Assembly);

            var chunk1 = new Chunk(baseChunk, AccessMode.Write, dispatcher);
            Assert.IsTrue(chunk1.GetBlock(4, 4, 5) is Air);
            Assert.IsTrue(chunk1.GetBlock(4, 4, 4) is Grass);

            var blocks = chunk1.AllBlocks().ToArray();
            Assert.AreEqual(blocks.Length, 16 * 16 * 16);
            Assert.AreEqual(blocks[0].Block, blocks[blocks.Length - 1].Block);

            foreach (var it in chunk1.AllBlocks((index, name) => name == IdGrass))
            {
                Assert.AreEqual(it.X, 4);
                Assert.AreEqual(it.Y, 4);
                Assert.AreEqual(it.Z, 4);
                Assert.IsTrue(it.Block is Grass);
            }

            Assert.DoesNotThrow(() => chunk1.SetBlock(7, 7, 7, SimpleBlocks.Grass));
            Assert.DoesNotThrow(() => chunk1.SaveToLowLevelStorage());

            Assert.AreEqual(baseChunk.GetBlock(7, 7, 7).Name, IdGrass);
        }
        public void ChunkCompactTest()
        {
            var chunk = NamespacedChunk.CreateEmpty();

            using (var t = chunk.CreateChangeBlockTransaction())
            {
                t.CompactBeforeCommit = false;

                t.SetBlock(5, 7, 9, new NamespacedBlock("test_block"));
                t.SetBlock(5, 7, 10, new NamespacedBlock("test_block2"));
                t.CommitChanges();

                Assert.AreEqual(t.GetPaletteInformation(7 >> 4).Count(), 3);

                t.SetBlock(5, 7, 10, NamespacedBlock.AirBlock);
                t.CommitChanges();

                Assert.AreEqual(t.GetPaletteInformation(7 >> 4).Count(), 3);
            }

            chunk.Compact();

            using (var t = chunk.CreateChangeBlockTransaction())
            {
                Assert.AreEqual(t.GetPaletteInformation(7 >> 4).Count(), 2);
            }
        }
        public void HeightMapTest()
        {
            var chunk  = NamespacedChunk.CreateEmpty();
            var blocks = new ChangeBlockRequest[] {
                new ChangeBlockRequest(15, 255, 13, 0),
                new ChangeBlockRequest(7, 60, 0, 1)
            };

            using (var t = chunk.CreateChangeBlockTransaction())
            {
                t.SetBlock(blocks, new[] {
                    new NamespacedBlock("SS"),
                    new NamespacedBlock("TT")
                });
                t.CommitChanges();
            }

            var map = chunk.HeightMap;

            map.Calculate(chunk);

            Assert.AreEqual(map.State, AttributeVersion.Post113);
            Assert.AreEqual(map.GetAt(0, 0, HeightmapType.MotionBlocking), -1);
            Assert.AreEqual(map.GetAt(15, 13), 255);
            Assert.AreEqual(map.GetAt(7, 0), 60);
            Assert.AreEqual(map.GetAt(8, 9), 0);
        }
        public void GetSetTest()
        {
            var chunk = NamespacedChunk.CreateEmpty();

            using (var t = chunk.CreateChangeBlockTransaction())
            {
                t.SetBlock(13, 40, 8, new NamespacedBlock("test_block"));

                t.SetBlock(new [] {
                    new ChangeBlockRequest(1, 41, 3, 0),
                    new ChangeBlockRequest(1, 41, 2, 1),
                    new ChangeBlockRequest(1, 99, 2, 1),
                    new ChangeBlockRequest(1, 10, 2, 1),
                }, new List <NamespacedBlock>()
                {
                    new NamespacedBlock("test_block"),
                    new NamespacedBlock("test_block2")
                });

                Assert.IsTrue(t.IsValid);

                t.CommitChanges();
            }

            Assert.AreEqual(chunk.GetBlock(13, 40, 8).Name, "test_block");
            Assert.AreEqual(chunk.GetBlock(1, 41, 3).Name, "test_block");
            Assert.AreEqual(chunk.GetBlock(1, 41, 2).Name, "test_block2");
            Assert.AreEqual(chunk.GetBlock(1, 99, 2).Name, "test_block2");
            Assert.AreEqual(chunk.GetBlock(1, 10, 2).Name, "test_block2");

            Assert.AreSame(chunk.GetBlock(1, 41, 3), chunk.GetBlock(13, 40, 8));
        }
Esempio n. 6
0
        public void SimpleNamespacedChunkSLTest()
        {
            var region = (RegionFile)Activator.CreateInstance(typeof(RegionFile), true);
            var dict   = (Dictionary <int, LowLevelChunk>)(typeof(RegionFile)
                                                           .GetField("_cachedChunks", BindingFlags.Instance | BindingFlags.NonPublic)
                                                           .GetValue(region));

            var chunk = NamespacedChunk.CreateEmpty();

#pragma warning disable 0618
            chunk.SetBlock(1, 1, 1, new NamespacedBlock("test_block"));
#pragma warning restore 0618
            chunk.CommitChanges();
            dict[5] = chunk;

            using (var stream = new MemoryStream())
            {
                Assert.DoesNotThrow(() => region.SaveToStream(stream));
                stream.Seek(0, SeekOrigin.Begin);

                var region2 = RegionFile.CreateFromStream(stream, 0, 0, RegionLoadApproach.InMemory);
                var block   = (region2.GetChunkData(5) as NamespacedChunk).GetBlock(1, 1, 1);
                Assert.AreEqual(block.Name, "test_block");
            }
        }
        public void CompactBlockBitsTest()
        {
            var chunk = NamespacedChunk.CreateEmpty();

            using (var t = chunk.CreateChangeBlockTransaction())
            {
                t.SetBlock(1, 1, 0, new NamespacedBlock("test0"));
                t.SetBlock(1, 1, 1, new NamespacedBlock("test1"));
                t.SetBlock(1, 1, 2, new NamespacedBlock("test2"));
                t.SetBlock(1, 1, 3, new NamespacedBlock("test3"));
                t.SetBlock(1, 1, 4, new NamespacedBlock("test4"));
                t.SetBlock(1, 1, 5, new NamespacedBlock("test5"));
                t.SetBlock(1, 1, 6, new NamespacedBlock("test6"));
                t.SetBlock(1, 1, 7, new NamespacedBlock("test7"));
                t.SetBlock(1, 1, 8, new NamespacedBlock("test8"));
                t.SetBlock(1, 1, 9, new NamespacedBlock("test9"));
                t.SetBlock(1, 1, 10, new NamespacedBlock("test10"));
                t.SetBlock(1, 1, 11, new NamespacedBlock("test11"));
                t.SetBlock(1, 1, 12, new NamespacedBlock("test12"));
                t.SetBlock(1, 1, 13, new NamespacedBlock("test13"));
                t.SetBlock(1, 1, 14, new NamespacedBlock("test14"));
                t.SetBlock(1, 1, 15, new NamespacedBlock("test15"));
                t.SetBlock(2, 1, 0, new NamespacedBlock("test16"));
                t.SetBlock(2, 1, 1, new NamespacedBlock("test17"));

                t.CommitChanges();

                var blockstates = typeof(NamespacedChunk).GetField("_blockStates", BindingFlags.Instance | BindingFlags.NonPublic);

                Assert.AreEqual(((IDynBitArray[])blockstates.GetValue(chunk))[0].CellSize, 5);

                t.SetBlock(1, 1, 2, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 3, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 4, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 5, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 6, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 7, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 8, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 9, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 10, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 11, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 12, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 13, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 14, NamespacedBlock.AirBlock);
                t.SetBlock(1, 1, 15, NamespacedBlock.AirBlock);
                t.SetBlock(2, 1, 0, NamespacedBlock.AirBlock);
                t.SetBlock(2, 1, 1, NamespacedBlock.AirBlock);

                t.CompactBlockBitsIfPossible = false;
                t.CommitChanges();

                Assert.AreEqual(((IDynBitArray[])blockstates.GetValue(chunk))[0].CellSize, 5);

                chunk.Compact();

                Assert.AreEqual(((IDynBitArray[])blockstates.GetValue(chunk))[0].CellSize, 4);
            }
        }
        public void MultipleVersionTest()
        {
            var chunk = NamespacedChunk.CreateEmpty();

            using (var t = chunk.CreateChangeBlockTransaction())
                using (var t2 = chunk.CreateChangeBlockTransaction())
                {
                    t.SetBlock(13, 40, 8, new NamespacedBlock("test_block"));
                    t.CommitChanges();

                    t2.SetBlock(10, 40, 8, new NamespacedBlock("test_block"));
                    Assert.IsTrue(t2.IsUpdatedOutside);
                    Assert.Throws <InvalidOperationException>(() => t2.CommitChanges());
                }
        }
        public void CompactPaletteTest()
        {
            var chunk = NamespacedChunk.CreateEmpty();

            using (var t = chunk.CreateChangeBlockTransaction())
            {
                t.SetBlock(5, 7, 9, new NamespacedBlock("test_block"));
                t.CommitChanges();

                var infos = t.GetPaletteInformation(7 >> 4)
                            .OrderBy(info => info.Block.Name).ToArray();

                Assert.AreEqual(infos.Length, 2);
                Assert.AreEqual(infos[1].Block.Name, "test_block");
                Assert.AreEqual(infos[0].Count, 4095);
                Assert.AreEqual(infos[1].Count, 1);

                t.SetBlock(5, 7, 9, NamespacedBlock.AirBlock);
                t.CommitChanges();

                Assert.AreEqual(t.GetPaletteInformation(7 >> 4).Count(), 0);

                t.SetBlock(5, 7, 9, new NamespacedBlock("test_block"));
                t.SetBlock(5, 7, 10, new NamespacedBlock("test_block2"));
                t.CommitChanges();

                Assert.AreEqual(t.GetPaletteInformation(7 >> 4).Count(), 3);

                t.SetBlock(5, 7, 10, NamespacedBlock.AirBlock);
                t.CommitChanges();

                Assert.AreEqual(t.GetPaletteInformation(7 >> 4).Count(), 2);

                t.CompactBeforeCommit = false;

                t.SetBlock(5, 7, 9, new NamespacedBlock("test_block"));
                t.SetBlock(5, 7, 10, new NamespacedBlock("test_block2"));
                t.CommitChanges();

                Assert.AreEqual(t.GetPaletteInformation(7 >> 4).Count(), 3);

                t.SetBlock(5, 7, 10, NamespacedBlock.AirBlock);
                t.CommitChanges();

                Assert.AreEqual(t.GetPaletteInformation(7 >> 4).Count(), 3);
            }
        }
        public void MultipleCommitTest()
        {
            var chunk = NamespacedChunk.CreateEmpty();

            using (var t = chunk.CreateChangeBlockTransaction())
            {
                t.SetBlock(13, 40, 8, new NamespacedBlock("test_block"));

                t.CommitChanges();

                t.SetBlock(new[] {
                    new ChangeBlockRequest(1, 41, 3, 0),
                    new ChangeBlockRequest(1, 41, 2, 1),
                    new ChangeBlockRequest(1, 99, 2, 1),
                    new ChangeBlockRequest(1, 10, 2, 1),
                }, new List <NamespacedBlock>()
                {
                    new NamespacedBlock("test_block"),
                    new NamespacedBlock("test_block2")
                });

                t.CommitChanges();

                t.SetBlock(15, 2, 15, new NamespacedBlock("test_block"));

                t.Rollback();

                Assert.IsFalse(t.IsModified);
                Assert.IsTrue(t.IsAbandoned);
                Assert.Throws <InvalidOperationException>(() => t.SetBlock(1, 2, 3, null));
                Assert.IsFalse(t.IsValid);
            }

            Assert.AreEqual(chunk.GetBlock(13, 40, 8).Name, "test_block");
            Assert.AreEqual(chunk.GetBlock(1, 41, 3).Name, "test_block");
            Assert.AreEqual(chunk.GetBlock(1, 41, 2).Name, "test_block2");
            Assert.AreEqual(chunk.GetBlock(1, 99, 2).Name, "test_block2");
            Assert.AreEqual(chunk.GetBlock(1, 10, 2).Name, "test_block2");

            Assert.AreSame(chunk.GetBlock(1, 41, 3), chunk.GetBlock(13, 40, 8));
        }
        public void AdvancedConcurrencyTest()
        {
            var chunk = NamespacedChunk.CreateEmpty();

            using (var t = chunk.CreateChangeBlockTransaction())
                using (var t2 = chunk.CreateChangeBlockTransaction())
                {
                    t.ConcurrencyMode             = t2.ConcurrencyMode
                                                  = ConcurrencyStrategy.UpdateOtherSection;

                    t.SetBlock(1, 1, 1, new NamespacedBlock("test_block"));
                    t.CommitChanges();

                    t2.SetBlock(90, 90, 90, new NamespacedBlock("test_block2"));
                    Assert.DoesNotThrow(() => t2.CommitChanges());
                    Assert.AreEqual(t2.GetBlock(1, 1, 1).Name, "test_block");
                }

            Assert.AreEqual(chunk.GetBlock(1, 1, 1).Name, "test_block");
            Assert.AreEqual(chunk.GetBlock(90, 90, 90).Name, "test_block2");
        }