diff --git a/paper-api/src/main/java/org/bukkit/block/BlockType.java b/paper-api/src/main/java/org/bukkit/block/BlockType.java index 6e24b05c9..d8fde88e3 100644 --- a/paper-api/src/main/java/org/bukkit/block/BlockType.java +++ b/paper-api/src/main/java/org/bukkit/block/BlockType.java @@ -1,5 +1,6 @@ package org.bukkit.block; +import java.util.Collection; import java.util.function.Consumer; import org.bukkit.Keyed; import org.bukkit.Material; @@ -120,6 +121,7 @@ import org.bukkit.inventory.ItemType; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; /** * While this API is in a public interface, it is not intended for use by @@ -169,6 +171,15 @@ public interface BlockType extends Keyed, Translatable, net.kyori.adventure.tran @Override B createBlockData(); + /** + * Creates a collection of {@link BlockData} instances for this block type, with all + * possible combinations of properties values. + * + * @return new block data collection + */ + @Override + @Unmodifiable @NotNull Collection createBlockDataStates(); + /** * Creates a new {@link BlockData} instance for this block type, with all * properties initialized to unspecified defaults, except for those provided @@ -3480,6 +3491,14 @@ public interface BlockType extends Keyed, Translatable, net.kyori.adventure.tran @NotNull BlockData createBlockData(); + /** + * Creates a collection of {@link BlockData} instances for this block type, with all + * possible combinations of properties values. + * + * @return new block data collection + */ + @Unmodifiable @NotNull Collection createBlockDataStates(); + /** * Creates a new {@link BlockData} instance for this block type, with all * properties initialized to unspecified defaults, except for those provided diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockType.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockType.java index 90fe14f10..6827c30a2 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockType.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockType.java @@ -3,7 +3,9 @@ package org.bukkit.craftbukkit.block; import com.google.common.base.Preconditions; import java.lang.reflect.Method; import java.util.Arrays; +import java.util.Collection; import java.util.function.Consumer; +import com.google.common.collect.ImmutableList; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.Registries; import net.minecraft.world.InteractionHand; @@ -147,6 +149,16 @@ public class CraftBlockType implements BlockType.Typed, return this.createBlockData((String) null); } + @Override + public @NotNull Collection createBlockDataStates() { + final ImmutableList possibleStates = this.block.getStateDefinition().getPossibleStates(); + final ImmutableList.Builder builder = ImmutableList.builderWithExpectedSize(possibleStates.size()); + for (final BlockState possibleState : possibleStates) { + builder.add(this.blockDataClass.cast(possibleState.createCraftBlockData())); + } + return builder.build(); + } + @Override public B createBlockData(Consumer consumer) { B data = this.createBlockData();