1
+ num randPrecision = 100;
2
+ num goldenAngle = 2.39996;
3
+ num pi = 3.14159;
4
+ num twopi = 6.28318530718;
5
+
6
+ num trunkHeight = 10+randomInt(18);
7
+ num trunkBase = 1;
8
+ str trunkBlock = "minecraft:stripped_crimson_hyphae";
9
+ str rootBlock = "minecraft:stripped_crimson_hyphae";
10
+ str undergroundRootBlock = "minecraft:stripped_crimson_hyphae";
11
+ str underwaterRootBlock = "minecraft:stripped_crimson_hyphae";
12
+
13
+ num sideBranchInterval = 1+randomInt(2);
14
+ num sideBranchMinHeight = 2+randomInt(3);
15
+ num sideBranchLengthMin = 3;
16
+ num sideBranchLengthVariation = 6;
17
+ num sideBranchVerticalVariation = 0;
18
+ num sideBranchVerticalDirection = 1+randomInt(randPrecision)/randPrecision/2;
19
+ num sideBranchLeafRadiusMin = 4;
20
+ num sideBranchLeafTranslate = 0;
21
+ num sideBranchLeafTopFlatness = 2;
22
+ num sideBranchLeafBottomFlatness = 4;
23
+ num sideBranchLeafDensity = 0.6;
24
+ str sideBranchLeafStructure = "oak_leaves_clump";
25
+ str sideBranchBlockX = "minecraft:stripped_crimson_hyphae";
26
+ str sideBranchBlockY = "minecraft:stripped_crimson_hyphae";
27
+ str sideBranchBlockZ = "minecraft:stripped_crimson_hyphae";
28
+
29
+ num topBranches = 10+randomInt(3);
30
+ num topBranchLengthUpwardsMin = 9+randomInt(3);
31
+ num topBranchLengthOutwardsMin = 11+randomInt(3);
32
+ num topBranchVerticalDirection = 0.4;
33
+ num topBranchLeafRadiusMin = 4;
34
+ num topBranchLeafTranslate = 0;
35
+ num topBranchLeafTopFlatness = 2;
36
+ num topBranchLeafBottomFlatness = 4;
37
+ num topBranchLeafDensity = 0.6;
38
+ str topBranchLeafStructure = "oak_leaves_clump";
39
+ str topBranchBlockX = "minecraft:stripped_crimson_hyphae";
40
+ str topBranchBlockY = "minecraft:stripped_crimson_hyphae";
41
+ str topBranchBlockZ = "minecraft:stripped_crimson_hyphae";
42
+
43
+ if (getBlock(0,trunkHeight,0) != "minecraft:air") fail;
44
+
45
+ // Generate roots at base of trunk
46
+ num roots = 6+randomInt(3);
47
+ num rootMaxLength = 15;
48
+ num rootDroop = -0.04;
49
+ num rootVerticalDirection = -0.4-randomInt(randPrecision)/randPrecision*0.3;
50
+ num rootAngle = randomInt(randPrecision)/randPrecision*2*pi;
51
+ for (num r = 0; r < roots; r = r + 1) {
52
+ // Branch direction vector
53
+ num dx = sin(rootAngle);
54
+ num dy = rootVerticalDirection;
55
+ num dz = cos(rootAngle);
56
+ // Normalize vector
57
+ num mag = sqrt(pow(dx,2)+pow(dy,2)+pow(dz,2));
58
+ dx = dx/mag;
59
+ dy = dy/mag;
60
+ dz = dz/mag;
61
+
62
+ for (num i = 0; i <= rootMaxLength; i = i + 0.5) {
63
+ num cx = i*dx;
64
+ num cy = trunkBase+i*dy;
65
+ num cz = i*dz;
66
+
67
+ // Place root block
68
+ block(cx, cy, cz, rootBlock);
69
+
70
+ if (i == rootMaxLength) {
71
+ num radius = sideBranchLeafRadiusMin;
72
+ num radiusSquared = pow(radius, 2);
73
+ for (num lox = ceil(-radius); lox <= ceil(radius); lox = lox + 1) {
74
+ for (num loy = ceil(-radius/sideBranchLeafBottomFlatness); loy <= ceil(radius/sideBranchLeafTopFlatness); loy = loy + 1) {
75
+ for (num loz = ceil(-radius); loz <= ceil(radius); loz = loz + 1) {
76
+ num squashFactor = sideBranchLeafBottomFlatness;
77
+ if (loy > 0) squashFactor = sideBranchLeafTopFlatness;
78
+ num distanceSquared = pow(lox,2)+pow(loy*squashFactor,2)+pow(loz,2);
79
+ if (distanceSquared<radiusSquared && randomInt(randPrecision) / randPrecision < sideBranchLeafDensity) {
80
+ structure(lox+cx, loy+cy, loz+cz, sideBranchLeafStructure, "NONE", "CW_90", "CCW_90", "CW_180");
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+
87
+ // Point vector down more
88
+ dy = dy - rootDroop;
89
+ // Normalize vector
90
+ mag = sqrt(pow2(dx)+pow2(dy)+pow2(dz));
91
+ dx = dx/mag;
92
+ dy = dy/mag;
93
+ dz = dz/mag;
94
+ }
95
+
96
+ rootAngle = rootAngle + goldenAngle;
97
+ }
98
+
99
+ num branchAngle = randomInt(randPrecision)/randPrecision*2*pi;
100
+ for (num i = 0; i < trunkHeight; i = i + 1) {
101
+ if (i > sideBranchMinHeight) {
102
+ if (i % sideBranchInterval == 0) {
103
+ // Branch direction vector
104
+ num dx = sin(branchAngle);
105
+ num dy = sideBranchVerticalDirection + randomInt(randPrecision)/randPrecision*sideBranchVerticalVariation;
106
+ num dz = cos(branchAngle);
107
+ // Normalize vector
108
+ num mag = sqrt(pow(dx,2)+pow(dy,2)+pow(dz,2));
109
+ dx = dx/mag;
110
+ dy = dy/mag;
111
+ dz = dz/mag;
112
+ // Branch origin
113
+ num ox = 0;
114
+ num oy = i+trunkBase;
115
+ num oz = 0;
116
+ // Set branch block based on largest unsigned vector component
117
+ str branchBlock = sideBranchBlockY;
118
+ if (abs(dx) > max(abs(dy),abs(dz))) branchBlock = sideBranchBlockX;
119
+ else if (abs(dz) > max(abs(dy),abs(dx))) branchBlock = sideBranchBlockZ;
120
+ num branchLength = sideBranchLengthMin + randomInt(randPrecision)/randPrecision*sideBranchLengthVariation;
121
+ // Generate branch
122
+ for (num l = 1; l <= branchLength; l = l + 1) {
123
+ block(l*dx+ox, l*dy+oy, l*dz+oz, branchBlock);
124
+ }
125
+ // Rotate angle of next branch
126
+ branchAngle = branchAngle + goldenAngle;
127
+ // Generate leaf cluster at the end of the branch
128
+ num radius = sideBranchLeafRadiusMin;
129
+ num radiusSquared = pow(radius, 2);
130
+ // Leaf cluster origin (end of branch)
131
+ num lox = ox+branchLength*dx;
132
+ num loy = oy+branchLength*dy + sideBranchLeafTranslate;
133
+ num loz = oz+branchLength*dz;
134
+ for (num cx = ceil(-radius); cx <= ceil(radius); cx = cx + 1) {
135
+ for (num cy = ceil(-radius/sideBranchLeafBottomFlatness); cy <= ceil(radius/sideBranchLeafTopFlatness); cy = cy + 1) {
136
+ for (num cz = ceil(-radius); cz <= ceil(radius); cz = cz + 1) {
137
+ num squashFactor = sideBranchLeafBottomFlatness;
138
+ if (cy > 0) squashFactor = sideBranchLeafTopFlatness;
139
+ num distanceSquared = pow(cx,2)+pow(cy*squashFactor,2)+pow(cz,2);
140
+ if (distanceSquared<radiusSquared && randomInt(randPrecision) / randPrecision < sideBranchLeafDensity) {
141
+ structure(lox+cx, loy+cy, loz+cz, sideBranchLeafStructure, "NONE", "CW_90", "CCW_90", "CW_180");
142
+ }
143
+ }
144
+ }
145
+ }
146
+ }
147
+ }
148
+ block(0, i+trunkBase, 0, trunkBlock);
149
+ block(1, i+trunkBase, 0, trunkBlock);
150
+ block(0, i+trunkBase, 1, trunkBlock);
151
+ block(1, i+trunkBase, 1, trunkBlock);
152
+ }
153
+
154
+ for (num b = 1; b <= topBranches; b = b + 1) {
155
+ num t = b/topBranches;
156
+ num ti = 1-t;
157
+ // Branch direction vector
158
+ num dx = sin(branchAngle) * t;
159
+ num dy = topBranchVerticalDirection;
160
+ num dz = cos(branchAngle) * t;
161
+ // Normalize vector
162
+ num mag = sqrt(pow(dx,2)+pow(dy,2)+pow(dz,2));
163
+ dx = dx/mag;
164
+ dy = dy/mag;
165
+ dz = dz/mag;
166
+ // Branch origin
167
+ num ox = 0;
168
+ num oy = trunkBase + trunkHeight;
169
+ num oz = 0;
170
+ // Set branch block based on largest unsigned vector component
171
+ str branchBlock = topBranchBlockY;
172
+ if (abs(dx) > max(abs(dy),abs(dz))) branchBlock = topBranchBlockX;
173
+ else if (abs(dz) > max(abs(dy),abs(dx))) branchBlock = topBranchBlockZ;
174
+ num branchLength = topBranchLengthUpwardsMin*ti + topBranchLengthOutwardsMin*t;
175
+ // Generate branch
176
+ for (num l = 0; l <= branchLength; l = l + 1) {
177
+ block(l*dx+ox, l*dy+oy, l*dz+oz, branchBlock);
178
+ }
179
+ // Rotate angle of next branch
180
+ branchAngle = branchAngle + goldenAngle;
181
+ // Generate leaf cluster at the end of the branch
182
+ num radius = topBranchLeafRadiusMin;
183
+ num radiusSquared = pow(radius, 2);
184
+ // Leaf cluster origin (end of branch)
185
+ num lox = ox+branchLength*dx;
186
+ num loy = oy+branchLength*dy + topBranchLeafTranslate;
187
+ num loz = oz+branchLength*dz;
188
+ for (num cx = ceil(-radius); cx <= ceil(radius); cx = cx + 1) {
189
+ for (num cy = ceil(-radius/topBranchLeafBottomFlatness); cy <= ceil(radius/topBranchLeafTopFlatness); cy = cy + 1) {
190
+ for (num cz = ceil(-radius); cz <= ceil(radius); cz = cz + 1) {
191
+ num squashFactor = topBranchLeafBottomFlatness;
192
+ if (cy > 0) squashFactor = topBranchLeafTopFlatness;
193
+ num distanceSquared = pow(cx,2)+pow(cy*squashFactor,2)+pow(cz,2);
194
+ if (distanceSquared < radiusSquared && randomInt(randPrecision)/randPrecision < topBranchLeafDensity) {
195
+ structure(lox+cx, loy+cy, loz+cz, topBranchLeafStructure, "NONE", "CW_90", "CCW_90", "CW_180");
196
+ }
197
+ }
198
+ }
199
+ }
200
+ }
201
+
202
+ for (num x = -10; x < 10; x = x + 1) {
203
+ for (num y = 15; y < 40; y = y + 1) {
204
+ for (num z = -10; z < 10; z = z + 1) {
205
+ structure(x,y,z,"warped_buds", "NONE");
206
+ }
207
+ }
208
+ }
0 commit comments