Minecraft – (Java Minecraft 1.14) How to set the probability of nested entries in a loot table

minecraft-data-packsminecraft-java-edition

I'm trying to add a new drop, 'Dark Quartz', as a rare drop for the nether quartz ore, using a datapack. I want to replace the old loot table and add a new one, so I've copied the vanilla one out of the vanilla datapack and put it in the minecraft namespace in my datapack:

{
  "type": "minecraft:block",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:alternatives",
          "children": [
            {
              "type": "minecraft:item",
              "conditions": [
                {
                  "condition": "minecraft:match_tool",
                  "predicate": {
                    "enchantments": [
                      {
                        "enchantment": "minecraft:silk_touch",
                        "levels": {
                          "min": 1
                        }
                      }
                    ]
                  }
                }
              ],
              "name": "minecraft:nether_quartz_ore"
            },
            {
              "type": "minecraft:item",
              "functions": [
                {
                  "function": "minecraft:apply_bonus",
                  "enchantment": "minecraft:fortune",
                  "formula": "minecraft:ore_drops"
                },
                {
                  "function": "minecraft:explosion_decay"
                }
              ],
              "name": "minecraft:quartz"
            }
          ]
        }
      ]
    }
  ]
}

As you can see, there is one entry of the type minecraft:alternatives. This will select one entry from a list of "children": sub-entries. There are two sub-entries: one for if the player uses a silk touch pick, and one for if they use a pickaxe with fortune (including Fortune 0). I want to make the second entry, with the Fortune, have a 1/20 chance of additionally dropping a Dark Quartz item.

I know that to do this I can't add a third entry, because it would drop the Dark Quartz instead of the normal quartz, so therefore I need to nest two sub-sub-entries in the second sub-entry, and have the normal quartz sub-sub-entry get picked always and the other sub-sub-entry get picked 1/20 times.

This is where I'm stuck, because I don't know if nesting in this way is possible, or how to make one entry always be selected and the other be selected a certain portion of the time. Additionally, I would ideally have it where if there was no fortune on the pick, the only drop would be either quartz (19/20) or dark quartz (1/20). If there was a fortune great enough to have multiple drops, only one of the normal quartzes would have a 1/20 percent chance of being a Dark Quartz, while the rest would stay the same. However, I would be content with just getting the dark quartz to additionally be selected 5% of the time, as I originally detailed. If you need it for reference, the entry for my Dark Quartz should look something like this:

{
  "type": "minecraft:item",
  "functions": [
    {
      "function": "set_name",
      "name": {"text":"Dark Quartz","color":"dark_gray","italic":"false"}
    },
    {
      "function": "set_nbt",
      "tag": "{DarkQuartz:1b,CustomModelData:1}"
    },
    {
      "function": "minecraft:explosion_decay"
    }
  ],
  "name": "minecraft:quartz"
}

Any help is appreciated.

Best Answer

Ok, so after a bit of thinking time I got it. Here is the file:

{
  "type": "minecraft:block",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:alternatives",
          "children": [
            {
              "type": "minecraft:item",
              "conditions": [
                {
                  "condition": "minecraft:match_tool",
                  "predicate": {
                    "enchantments": [
                      {
                        "enchantment": "minecraft:silk_touch",
                        "levels": {
                          "min": 1
                        }
                      }
                    ]
                  }
                }
              ],
              "name": "minecraft:nether_quartz_ore"
            },
            {
              "type": "minecraft:sequence",
              "children": [
                {
                  "type": "minecraft:item",
                  "functions": [
                    {
                      "function": "minecraft:apply_bonus",
                      "enchantment": "minecraft:fortune",
                      "formula": "minecraft:ore_drops"
                    },
                    {
                      "function": "minecraft:explosion_decay"
                    }
                  ],
                  "name": "minecraft:quartz"
                },
                {
                  "type": "minecraft:item",
                  "conditions": [
                    {
                      "condition": "random_chance",
                      "chance": 0.05
                    }
                  ],
                  "functions": [
                    {
                      "function": "set_name",
                      "name": {"text":"Dark Quartz","color":"dark_gray","italic":"false"}
                    },
                    {
                      "function": "set_nbt",
                      "tag": "{DarkQuartz:1b,CustomModelData:1}"
                    },
                    {
                      "function": "minecraft:explosion_decay"
                    }
                  ],
                  "name": "minecraft:quartz"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

And now for an explanation: The loot table has one pool, with one roll, meaning that only one entry will be selected. That one entry is of the type "minecraft:alternatives", which means that the first entry with successful conditions out of several children sub-entries will be the one choosen. There are two children pools: one for silk touch picks and one for non silk touch picks. The first is of type "minecraft:item", meaning it just has an item, while the second is of the type "minecraft:sequence", meaning it has a few sub-entries of its own. If the first is chosen, one nether quartz ore is dropped and that's the end of things. If the first is NOT chosen, we go into the second entry, which as we said earlier is a "minecraft:sequence" type. This means that out of several children entries, items will be chosen from all entries in a row until an entry fails the conditions, at which point everything stops. We have two entries: the first with no conditions (meaning it will always give an item, provided we have not used a silk touch pick and are therefore in the "minecraft:sequence" entry) and the second with a "random_chance" condition (meaning it only gives an item when a randomly generated number between 0 and 1 is below the "chance" value,in this case 0.05). Testing shows it works: mining 20 nether quartz ores with a normal pick, I get 20 nether quartz and 1 dark quartz. With a silk touch pick I get 20 nether quartz ore, and with a fortune III pick I get 39 nether quartz and 1 dark quartz.