def test_hash(self): stone = blockstate_to_block("minecraft:stone") water = blockstate_to_block('minecraft:water[level="1"]') granite = blockstate_to_block("minecraft:granite") dirt = blockstate_to_block("minecraft:dirt") conglomerate_1 = stone + water + dirt conglomerate_2 = stone + dirt + water self.assertNotEqual(conglomerate_1, conglomerate_2) self.assertNotEqual(hash(conglomerate_1), hash(conglomerate_2)) conglomerate_3 = dirt + water + dirt conglomerate_4 = dirt + dirt + water self.assertNotEqual(conglomerate_3, conglomerate_4) self.assertNotEqual(hash(conglomerate_3), hash(conglomerate_4)) conglomerate_5 = conglomerate_1 + granite conglomerate_6 = conglomerate_3 + granite self.assertNotEqual(conglomerate_1, conglomerate_5) self.assertNotEqual(conglomerate_3, conglomerate_6) self.assertNotEqual(conglomerate_5, conglomerate_6) self.assertNotEqual(hash(conglomerate_5), hash(conglomerate_6))
def test_replace_single_block(self): subbox1 = SelectionBox((1, 70, 3), (5, 71, 6)) box1 = SelectionGroup((subbox1,)) self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, 70, 3, "overworld").blockstate, ) self.assertEqual( 'universal_minecraft:granite[polished="false"]', self.world.get_block(1, 70, 5, "overworld").blockstate, ) self.world.run_operation( replace, "overworld", box1, { "original_blocks": [ blockstate_to_block( "universal_minecraft:granite[polished=false]" ) ], "replacement_blocks": [ blockstate_to_block("universal_minecraft:stone") ], }, ) self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, 70, 3, "overworld").blockstate, ) self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, 70, 5, "overworld").blockstate, ) self.world.undo() self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, 70, 3, "overworld").blockstate, ) self.assertEqual( 'universal_minecraft:granite[polished="false"]', self.world.get_block(1, 70, 5, "overworld").blockstate, ) self.world.redo() self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, 70, 3, "overworld").blockstate, ) self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, 70, 5, "overworld").blockstate, )
def test_extra_blocks_immutable(self): stone = blockstate_to_block("minecraft:stone") dirt = blockstate_to_block("minecraft:dirt") stone2 = stone self.assertIs(stone, stone2) stone2 += dirt self.assertIsNot(stone, stone2) stone3 = stone2 self.assertIs(stone2, stone3) stone3 -= dirt self.assertIsNot(stone, stone3)
def setUp(self): self.manager = BlockManager() initial_dirt = blockstate_to_block("minecraft:dirt") initial_stone = blockstate_to_block("minecraft:stone") initial_granite = blockstate_to_block("minecraft:granite") initial_dirt_water = initial_dirt + blockstate_to_block("minecraft:water") # Partially populate the manager self.manager.get_add_block(initial_dirt) self.manager.get_add_block(initial_stone) self.manager.get_add_block(initial_granite) self.manager.get_add_block(initial_dirt_water)
def test_get_block_from_manager(self): dirt = blockstate_to_block("minecraft:dirt") stone = blockstate_to_block("minecraft:stone") granite = blockstate_to_block("minecraft:granite") water = blockstate_to_block("minecraft:water") dirt_water = dirt + water self.assertEqual(dirt, self.manager[0]) self.assertEqual(stone, self.manager[1]) self.assertEqual(granite, self.manager[2]) self.assertEqual(dirt_water, self.manager[3]) with self.assertRaises(KeyError): brain_coral = blockstate_to_block("minecraft:brain_coral") internal_id = self.manager[brain_coral]
def test_get_index_from_manager(self): dirt = blockstate_to_block("minecraft:dirt") stone = blockstate_to_block("minecraft:stone") granite = blockstate_to_block("minecraft:granite") self.assertEqual(0, self.manager[dirt]) self.assertEqual(1, self.manager[stone]) self.assertEqual(2, self.manager[granite]) water = blockstate_to_block("minecraft:water") dirt_water = dirt + water self.assertNotEqual(dirt, dirt_water) self.assertIsNot(dirt, dirt_water) self.assertEqual(3, self.manager[dirt_water]) with self.assertRaises(KeyError): random_block = self.manager[10000]
def test_extra_blocks(self): stone = blockstate_to_block("minecraft:stone") water = blockstate_to_block('minecraft:water[level="1"]') granite = blockstate_to_block("minecraft:granite") dirt = blockstate_to_block("minecraft:dirt") conglomerate_1 = stone + water + dirt self.assertIsInstance(conglomerate_1, Block) self.assertEqual("minecraft", conglomerate_1.namespace) self.assertEqual("stone", conglomerate_1.base_name) self.assertEqual({}, conglomerate_1.properties) self.assertEqual(2, len(conglomerate_1.extra_blocks)) for block_1, block_2 in zip(conglomerate_1.extra_blocks, (water, dirt)): self.assertEqual(block_1, block_2) self.assertEqual(0, len(block_1.extra_blocks)) conglomerate_2 = conglomerate_1 + granite self.assertIsInstance(conglomerate_2, Block) self.assertEqual("minecraft", conglomerate_2.namespace) self.assertEqual("stone", conglomerate_2.base_name) self.assertEqual({}, conglomerate_2.properties) self.assertEqual(3, len(conglomerate_2.extra_blocks)) for block_1, block_2 in zip( conglomerate_2.extra_blocks, (water, dirt, granite) ): self.assertEqual(block_1, block_2) self.assertEqual(0, len(block_1.extra_blocks)) self.assertNotEqual(conglomerate_1, conglomerate_2) conglomerate_3 = conglomerate_2 - dirt self.assertIsInstance(conglomerate_3, Block) self.assertEqual("minecraft", conglomerate_3.namespace) self.assertEqual("stone", conglomerate_3.base_name) self.assertEqual({}, conglomerate_3.properties) self.assertEqual(2, len(conglomerate_3.extra_blocks)) for block_1, block_2 in zip(conglomerate_3.extra_blocks, (water, granite)): self.assertEqual(block_1, block_2) self.assertEqual(0, len(block_1.extra_blocks)) self.assertRaises(TypeError, lambda: stone + 1) self.assertRaises(TypeError, lambda: stone - 1)
def test_fill_operation(self): subbox_1 = SelectionBox((1, 70, 3), (5, 71, 5)) box = SelectionGroup((subbox_1,)) # Start sanity check self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, 70, 3, "overworld").blockstate, ) self.assertEqual( 'universal_minecraft:granite[polished="false"]', self.world.get_block(1, 70, 5, "overworld").blockstate, ) # End sanity check self.world.run_operation( fill, "overworld", box, blockstate_to_block("universal_minecraft:stone") ) for x, y, z in box: self.assertEqual( "universal_minecraft:stone", self.world.get_block(x, y, z, "overworld").blockstate, f"Failed at coordinate ({x},{y},{z})", ) self.world.undo() self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, 70, 3, "overworld").blockstate, ) self.assertEqual( 'universal_minecraft:granite[polished="false"]', self.world.get_block(1, 70, 5, "overworld").blockstate, ) self.world.redo() for x, y, z in box: self.assertEqual( "universal_minecraft:stone", self.world.get_block(x, y, z, "overworld").blockstate, f"Failed at coordinate ({x},{y},{z})", )
def test_replace_multiblock(self): subbox1 = SelectionBox((1, 70, 3), (2, 75, 4)) box1 = SelectionGroup((subbox1,)) self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, 70, 3, "overworld").blockstate, ) for y in range(71, 75): self.assertEqual( "universal_minecraft:air", self.world.get_block(1, y, 3, "overworld").blockstate, f"Failed at coordinate (1,{y},3)", ) self.world.run_operation( replace, "overworld", box1, { "original_blocks": [ blockstate_to_block("universal_minecraft:stone"), blockstate_to_block("universal_minecraft:air"), ], "replacement_blocks": [ blockstate_to_block( "universal_minecraft:granite[polished=false]" ), blockstate_to_block("universal_minecraft:stone"), ], }, ) self.assertEqual( 'universal_minecraft:granite[polished="false"]', self.world.get_block(1, 70, 3, "overworld").blockstate, ) for y in range(71, 75): self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, y, 3, "overworld").blockstate, f"Failed at coordinate (1,{y},3)", ) self.world.undo() self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, 70, 3, "overworld").blockstate, ) for y in range(71, 75): self.assertEqual( "universal_minecraft:air", self.world.get_block(1, y, 3, "overworld").blockstate, f"Failed at coordinate (1,{y},3)", ) self.world.redo() self.assertEqual( 'universal_minecraft:granite[polished="false"]', self.world.get_block(1, 70, 3, "overworld").blockstate, ) for y in range(71, 75): self.assertEqual( "universal_minecraft:stone", self.world.get_block(1, y, 3, "overworld").blockstate, f"Failed at coordinate (1,{y},3)", )
import amulet_nbt from amulet.api.chunk import Chunk from amulet.api.wrapper import Translator from amulet.api.block import Block, blockstate_to_block from amulet.api.registry import BlockManager from amulet.api.data_types import ( VersionIdentifierType, AnyNDArray, BlockNDArray, ) if TYPE_CHECKING: from PyMCTranslate import Version, TranslationManager water = blockstate_to_block('minecraft:water[level="0"]') class JavaBlockstateTranslator(Translator): def _translator_key( self, version_number: int ) -> Tuple[str, Union[int, Tuple[int, int, int]]]: return "java", version_number @staticmethod def is_valid(key): return key[0] == "java" and key[1] >= 1444 @staticmethod def _unpack_blocks( translation_manager: "TranslationManager",
def test_get_from_blockstate(self): # This is mostly just sanity checks air = blockstate_to_block("minecraft:air") self.assertIsInstance(air, Block) self.assertEqual("minecraft", air.namespace) self.assertEqual("air", air.base_name) self.assertEqual({}, air.properties) self.assertEqual((), air.extra_blocks) self.assertEqual("minecraft:air", air.blockstate) stone = blockstate_to_block("minecraft:stone") self.assertIsInstance(stone, Block) self.assertEqual("minecraft", stone.namespace) self.assertEqual("stone", stone.base_name) self.assertEqual({}, stone.properties) self.assertEqual((), stone.extra_blocks) self.assertEqual("minecraft:stone", stone.blockstate) self.assertNotEqual(air, stone) oak_leaves = blockstate_to_block( 'minecraft:oak_leaves[distance="1",persistent="true"]' ) self.assertIsInstance(oak_leaves, Block) self.assertEqual("minecraft", oak_leaves.namespace) self.assertEqual("oak_leaves", oak_leaves.base_name) self.assertEqual( {"distance": nbt.TAG_String("1"), "persistent": nbt.TAG_String("true")}, oak_leaves.properties, ) self.assertEqual((), oak_leaves.extra_blocks) self.assertEqual( 'minecraft:oak_leaves[distance="1",persistent="true"]', oak_leaves.blockstate, ) oak_leaves_2 = Block( namespace="minecraft", base_name="oak_leaves", properties={ "persistent": nbt.TAG_String("true"), "distance": nbt.TAG_String("1"), }, ) self.assertEqual("minecraft", oak_leaves_2.namespace) self.assertEqual("oak_leaves", oak_leaves_2.base_name) self.assertEqual( {"distance": nbt.TAG_String("1"), "persistent": nbt.TAG_String("true")}, oak_leaves_2.properties, ) self.assertEqual((), oak_leaves_2.extra_blocks) self.assertEqual( 'minecraft:oak_leaves[distance="1",persistent="true"]', oak_leaves_2.blockstate, ) self.assertEqual(oak_leaves, oak_leaves_2) oak_leaves_3 = blockstate_to_block( 'minecraft:oak_leaves[persistent="true",distance="1"]' ) self.assertEqual("minecraft", oak_leaves_3.namespace) self.assertEqual("oak_leaves", oak_leaves_3.base_name) self.assertEqual( {"distance": nbt.TAG_String("1"), "persistent": nbt.TAG_String("true")}, oak_leaves_3.properties, ) self.assertEqual((), oak_leaves_3.extra_blocks) self.assertEqual( 'minecraft:oak_leaves[distance="1",persistent="true"]', oak_leaves_3.blockstate, ) self.assertEqual(oak_leaves, oak_leaves_3)
def test_remove_layer(self): stone = blockstate_to_block("minecraft:stone") water = blockstate_to_block('minecraft:water[level="1"]') granite = blockstate_to_block("minecraft:granite") dirt = blockstate_to_block("minecraft:dirt") oak_log_axis_x = blockstate_to_block("minecraft:oak_log[axis=x]") conglomerate_1 = stone + water + dirt + dirt + granite self.assertIsInstance(conglomerate_1, Block) self.assertEqual("minecraft", conglomerate_1.namespace) self.assertEqual("stone", conglomerate_1.base_name) self.assertEqual({}, conglomerate_1.properties) self.assertEqual(4, len(conglomerate_1.extra_blocks)) for block_1, block_2 in zip( conglomerate_1.extra_blocks, (water, dirt, dirt, granite) ): self.assertEqual(block_1, block_2) self.assertEqual(0, len(block_1.extra_blocks)) new_conglomerate = conglomerate_1.remove_layer(2) for block_1, block_2 in zip( new_conglomerate.extra_blocks, (water, dirt, granite) ): self.assertEqual(block_1, block_2) self.assertEqual(0, len(block_1.extra_blocks)) conglomerate_2 = granite + water + stone + dirt + oak_log_axis_x self.assertIsInstance(conglomerate_2, Block) self.assertEqual("minecraft", conglomerate_2.namespace) self.assertEqual("granite", conglomerate_2.base_name) self.assertEqual({}, conglomerate_2.properties) self.assertEqual(4, len(conglomerate_2.extra_blocks)) for block_1, block_2 in zip( conglomerate_2.extra_blocks, (water, stone, dirt, oak_log_axis_x) ): self.assertEqual(block_1, block_2) self.assertEqual(0, len(block_1.extra_blocks)) new_conglomerate = conglomerate_2.remove_layer(3) self.assertEqual(3, len(new_conglomerate.extra_blocks)) for block_1, block_2 in zip( new_conglomerate.extra_blocks, (water, stone, oak_log_axis_x) ): self.assertEqual(block_1, block_2) self.assertEqual(0, len(block_1.extra_blocks)) new_base = conglomerate_2.remove_layer(0) self.assertEqual(3, len(new_base.extra_blocks)) self.assertEqual("minecraft", new_base.namespace) self.assertEqual("water", new_base.base_name) self.assertEqual({"level": nbt.TAG_String("1")}, new_base.properties) for block_1, block_2 in zip( new_base.extra_blocks, (stone, dirt, oak_log_axis_x) ): self.assertEqual(block_1, block_2) self.assertEqual(0, len(block_1.extra_blocks)) self.assertNotEqual(new_base, new_base.remove_layer(1)) with self.assertRaises(InvalidBlockException): no_block = granite.remove_layer(0) with self.assertRaises(InvalidBlockException): non_present_layer = granite.remove_layer(7) non_present_layer = conglomerate_2.remove_layer(5) conglomerate_2.remove_layer(4) # Check if last layer can still be removed