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