Since tall flowers are considered two blocks, both halves trigger a loot table when broken. In vanilla, the game gets around this by having the loot tables check (and only drop the flower) if it is a bottom half, meaning if you break a glitched floating top half of a flower it would drop nothing, and you could break a glitched bottom half only (with no top) and it would still drop.
Anyways, I seem to be running into this issue trying to assign custom conditional drops. As you can see in the loot table attached below, I would like the flower to drop it's respective dye instead of itself when broken with a sword. Except, if I do it normal way, the half directly broken passes the check and drops dye, but the other half fails the check (as it was not directly broken with a sword) and drops another tall flower meaning it can be cycled for infinite die XD
This was as close as I could get. It drops the flower as expected if I break either half with my fist, it drops only dye (like i want) when I break the bottom half with a sword, but when i break the top half with a sword it also drops the flower again. If I remove the lower half check and drop at the end, then wouldn't it not drop when broken by hand?
What am I doing wrong?
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:alternatives",
"children": [
{
"type": "minecraft:item",
"name": "minecraft:red_dye",
"functions": [
{
"function": "minecraft:set_count",
"count": 2
}
],
"conditions": [
{
"condition": "minecraft:block_state_property",
"block": "minecraft:rose_bush",
"properties": {
"half": "lower"
}
},
{
"condition": "minecraft:match_tool",
"predicate": {
"items": [
"minecraft:wooden_sword",
"minecraft:stone_sword",
"minecraft:iron_sword",
"minecraft:golden_sword",
"minecraft:diamond_sword",
"minecraft:netherite_sword"
]
}
}
]
},
{
"type": "minecraft:alternatives",
"children": [
{
"type": "minecraft:item",
"name": "minecraft:red_dye",
"functions": [
{
"function": "minecraft:set_count",
"count": 2
}
],
"conditions": [
{
"condition": "minecraft:block_state_property",
"block": "minecraft:rose_bush",
"properties": {
"half": "upper"
}
},
{
"condition": "minecraft:match_tool",
"predicate": {
"items": [
"minecraft:wooden_sword",
"minecraft:stone_sword",
"minecraft:iron_sword",
"minecraft:golden_sword",
"minecraft:diamond_sword",
"minecraft:netherite_sword"
]
}
}
]
},
{
"type": "minecraft:item",
"name": "minecraft:rose_bush",
"conditions": [
{
"condition": "minecraft:inverted",
"term": {
"condition": "minecraft:match_tool",
"predicate": {
"items": [
"minecraft:wooden_sword",
"minecraft:stone_sword",
"minecraft:iron_sword",
"minecraft:golden_sword",
"minecraft:diamond_sword",
"minecraft:netherite_sword"
]
}
}
},
{
"condition": "minecraft:block_state_property",
"block": "minecraft:rose_bush",
"properties": {
"half": "lower"
}
}
]
}
]
}
]
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}
mined:rose_bush
/... and every time the value is greater than 0, check if the player holds a sword and give the items based on this. Not really a clean solution sadly :(