Uploaded image for project: 'Minecraft (Bedrock codebase)'
  1. Minecraft (Bedrock codebase)
  2. MCPE-168409

BlockPermutation.matches() and blockPermutation.withProperty() methods do not work with custom blocks. Script API

XMLWordPrintable

    • Unconfirmed
    • Multiple

      The BlockPermutation.matches() and blockPermutation.withProperty() methods do not work with custom blocks, they only work with vanilla blocks.

      For example, if I try to use the '.matches()' method it will always return false no matter if I'm comparing it to its exact same properties, it only works if I leave the properties as undefined and only match the block name.

      Now, if I use the '.withProperty()' method, it will always throw an error if I try to get the 'BlockPermutation' with the specified properties, this doesn't happen with vanilla blocks.

      import { world } from "@minecraft/server"
      
      
      world.events.itemUseOn.subscribe(i => {
      
          const block = i.source.dimension.getBlock(i.getBlockLocation())
      
          if (i.item.typeId === 'minecraft:stick') {
              const permutation = block.permutation
      
              world.sendMessage(`§acustom_block 1 - ${permutation.matches('test:custom_block', { 'block:test': 0 } )}`)
              world.sendMessage(`§ccustom_block 2 - ${permutation.matches('test:custom_block', permutation.getAllProperties() )}`)
              world.sendMessage(`§estone_slab - ${permutation.matches('minecraft:stone_slab', { stone_slab_type: 'stone_brick', top_slot_bit: false })}`)
      
              //block.setPermutation(block.permutation.withProperty('top_slot_bit', true ))
              block.setPermutation(block.permutation.withProperty('block:test', 1 ))
      
          }
      })
      

      custom_block.json:

       
      {
        "format_version": "1.19.70",
        "minecraft:block": {
          "description": {
            "identifier": "test:custom_block",
            "menu_category": {
              "category": "Construction"
            },
            "properties": {
              "block:test": [ 0, 1 ]
            }
          },
          "components": {
            "minecraft:material_instances": {
              "*": { "texture": "custom_block" }
            },
            "minecraft:on_interact": {
              "event": "test"
            }
          },
          "events": {
            "test": {
              "sequence": [
                {
                  "condition": "!q.block_property('block:test')",
                  "run_command": { "command": "say block_property = 0" }
                },
                {
                  "condition": "q.block_property('block:test')",
                  "run_command": { "command": "say block_property = 1" }
                }
              ]
            }
          }
        }
      }
      
      

      I will leave the world where I took the test so they can review it.

      Well, to execute the error you must enter the world that I sent in the attached files, in the world you will find a script file and a custom block that when you right click or interact on it you will see a "/say" in the chat that will indicate if its "block:test" property is set to 0 or 1.

      In the script you will find:

      world.events.itemUseOn.subscribe(i => {
           const block = i.source.dimension.getBlock(i.getBlockLocation())
           if (i.item.typeId === 'minecraft:stick') { ... } }
      

      With this, right-clicking or interacting with a stick in the player's hand on a block will execute the code inside the if

      {...} on the block.

      Now inside the if {...}

      you will find four tests I made to execute the error, first in the:

      world.sendMessage(`${permutation.matches('test:custom_block', { 'block:test': 0 } )}`)
      

      it is checked if "test:custom_block" has the property "block:test" equal to 0, this will always return false regardless of whether it is true.

      In the second test I ran getAllProperties() to make sure I wasn't misspelling the name 'block:test':

      world.sendMessage(`${permutation.matches('test:custom_block', permutation.getAllProperties() )}`)
      

      but it always returns false.

      In the third test I decided to do it with a vanilla block, in this case with a stone slab:

      world.sendMessage(`${permutation.matches('minecraft:stone_slab', { stone_slab_type: 'stone_brick', top_slot_bit: false })}`)
      

      When doing so, it returned true if it was compared correctly, that is, it works correctly with vanilla blocks.

      In the fourth test I decided to use setPermutation(withProperty()) to change the property of the custom block:

      block.setPermutation(block.permutation.withProperty('block:test', 1 ))
      

      This will always give an error in the content log history:

      [Scripting][error] -Error: Failed to set property 'block:test' on block 'test:custom_block'
      

      I also did the test with the stone slab and it works correctly.
      All of this makes me suspect that it doesn't support properties with namespaces.
       

            Effect99 Fabián Marín
            Votes:
            1 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: