Path: blob/master/src/library/classes/blockBuilder.ts
1784 views
import { BlockPermutation, BlockStates, BlockTypes, ItemStack } from "@minecraft/server";12export class BlockBuilder {3/**4* Converts block data value to block states.5* @param block the block identifier6* @param data the data value7* @returns an object with block state properties and corresponding values8*/9dataValueToStates(block: string, data: number) {10const props = BlockPermutation.resolve(block).getAllStates();11for (const state in props) {12const { validValues } = BlockStates.get(state);13props[state] = validValues[data % validValues.length];14data /= validValues.length;15}16return props;17}1819dataValueToPermutation(block: string, data: number) {20return BlockPermutation.resolve(block, this.dataValueToStates(block, data));21}2223statesToDataValue(props: Record<string, string | number | boolean>) {24let data = 0;25let factor = 1;26for (const state in props) {27const { validValues } = BlockStates.get(state);28data += validValues.indexOf(props[state]) * factor;29factor *= validValues.length;30}31return data;32}3334*iteratePermutations(block: string) {35let permutation = BlockPermutation.resolve(block);36const props = Object.keys(permutation.getAllStates());37if (props.length == 0) {38yield permutation;39return;40}41yield* recurseStates(props.length);42function* recurseStates(i: number): Generator<BlockPermutation> {43const state = props[--i];44for (const val of Array.from(BlockStates.get(state).validValues)) {45permutation = permutation.withState(<any>state, val);46if (permutation.getState(<any>state) != val) return;47if (i == 0) {48yield permutation;49} else {50yield* recurseStates(i);51}52}53}54}5556itemToPermutation(item: ItemStack) {57const block = item.typeId;58if (!BlockTypes.get(block)) return undefined;59for (const permutation of this.iteratePermutations(block)) {60if (permutation.getItemStack().isStackableWith(item)) {61if (permutation.getState("persistent_bit") != undefined) {62return permutation.withState("persistent_bit", true);63}64return permutation;65}66}67return BlockPermutation.resolve(block);68}6970isAirOrFluid(block: BlockPermutation) {71if (!block) return true;72const type = block.type.id;73return type == "minecraft:air" || type == "minecraft:water" || type == "minecraft:lava";74}75}76export const Block = new BlockBuilder();777879