1use super::{
2 ScatteredFeaturePlacer, base_black, base_gray, base_light, dot_deco, generate_water_box, lamp,
3};
4
5pub(super) fn place_monument_building_shell(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
6 let water_height = placer.sea_level().max(64) - placer.world_pos(0, 0, 0).y();
7 generate_water_box(placer, 0, 0, 0, 58, water_height, 58);
8 generate_wing(placer, false, 0);
9 generate_wing(placer, true, 33);
10 generate_entrance_archs(placer);
11 generate_entrance_wall(placer);
12 generate_roof_piece(placer);
13 generate_lower_wall(placer);
14 generate_middle_wall(placer);
15 generate_upper_wall(placer);
16
17 for pillar_x in 0..7 {
18 let mut pillar_z = 0;
19 while pillar_z < 7 {
20 if pillar_z == 0 && pillar_x == 3 {
21 pillar_z = 6;
22 }
23
24 let bx = pillar_x * 9;
25 let bz = pillar_z * 9;
26 for w in 0..4 {
27 for d in 0..4 {
28 placer.place_block(base_light(), bx + w, 0, bz + d);
29 placer.fill_column_down(base_light(), bx + w, -1, bz + d);
30 }
31 }
32
33 if pillar_x != 0 && pillar_x != 6 {
34 pillar_z += 6;
35 } else {
36 pillar_z += 1;
37 }
38 }
39 }
40
41 for i in 0..5 {
42 generate_water_box(placer, -1 - i, i * 2, -1 - i, -1 - i, 23, 58 + i);
43 generate_water_box(placer, 58 + i, i * 2, -1 - i, 58 + i, 23, 58 + i);
44 generate_water_box(placer, -i, i * 2, -1 - i, 57 + i, 23, -1 - i);
45 generate_water_box(placer, -i, i * 2, 58 + i, 57 + i, 23, 58 + i);
46 }
47}
48
49#[expect(
50 clippy::too_many_lines,
51 reason = "direct port of vanilla MonumentBuilding.generateWing"
52)]
53fn generate_wing(placer: &mut ScatteredFeaturePlacer<'_, '_>, is_flipped: bool, xoff: i32) {
54 if !placer.chunk_intersects(xoff, 0, xoff + 23, 20) {
55 return;
56 }
57
58 placer.generate_box(
59 xoff,
60 0,
61 0,
62 xoff + 24,
63 0,
64 20,
65 base_gray(),
66 base_gray(),
67 false,
68 );
69 generate_water_box(placer, xoff, 1, 0, xoff + 24, 10, 20);
70
71 for i in 0..4 {
72 placer.generate_box(
73 xoff + i,
74 i + 1,
75 i,
76 xoff + i,
77 i + 1,
78 20,
79 base_light(),
80 base_light(),
81 false,
82 );
83 placer.generate_box(
84 xoff + i + 7,
85 i + 5,
86 i + 7,
87 xoff + i + 7,
88 i + 5,
89 20,
90 base_light(),
91 base_light(),
92 false,
93 );
94 placer.generate_box(
95 xoff + 17 - i,
96 i + 5,
97 i + 7,
98 xoff + 17 - i,
99 i + 5,
100 20,
101 base_light(),
102 base_light(),
103 false,
104 );
105 placer.generate_box(
106 xoff + 24 - i,
107 i + 1,
108 i,
109 xoff + 24 - i,
110 i + 1,
111 20,
112 base_light(),
113 base_light(),
114 false,
115 );
116 placer.generate_box(
117 xoff + i + 1,
118 i + 1,
119 i,
120 xoff + 23 - i,
121 i + 1,
122 i,
123 base_light(),
124 base_light(),
125 false,
126 );
127 placer.generate_box(
128 xoff + i + 8,
129 i + 5,
130 i + 7,
131 xoff + 16 - i,
132 i + 5,
133 i + 7,
134 base_light(),
135 base_light(),
136 false,
137 );
138 }
139
140 placer.generate_box(
141 xoff + 4,
142 4,
143 4,
144 xoff + 6,
145 4,
146 20,
147 base_gray(),
148 base_gray(),
149 false,
150 );
151 placer.generate_box(
152 xoff + 7,
153 4,
154 4,
155 xoff + 17,
156 4,
157 6,
158 base_gray(),
159 base_gray(),
160 false,
161 );
162 placer.generate_box(
163 xoff + 18,
164 4,
165 4,
166 xoff + 20,
167 4,
168 20,
169 base_gray(),
170 base_gray(),
171 false,
172 );
173 placer.generate_box(
174 xoff + 11,
175 8,
176 11,
177 xoff + 13,
178 8,
179 20,
180 base_gray(),
181 base_gray(),
182 false,
183 );
184 placer.place_block(dot_deco(), xoff + 12, 9, 12);
185 placer.place_block(dot_deco(), xoff + 12, 9, 15);
186 placer.place_block(dot_deco(), xoff + 12, 9, 18);
187
188 let left_pos = xoff + if is_flipped { 19 } else { 5 };
189 let right_pos = xoff + if is_flipped { 5 } else { 19 };
190 for z in (5..=20).rev().step_by(3) {
191 placer.place_block(dot_deco(), left_pos, 5, z);
192 }
193 for z in (7..=19).rev().step_by(3) {
194 placer.place_block(dot_deco(), right_pos, 5, z);
195 }
196 for i in 0..4 {
197 let pos = if is_flipped {
198 xoff + 24 - (17 - i * 3)
199 } else {
200 xoff + 17 - i * 3
201 };
202 placer.place_block(dot_deco(), pos, 5, 5);
203 }
204
205 placer.place_block(dot_deco(), right_pos, 5, 5);
206 placer.generate_box(
207 xoff + 11,
208 1,
209 12,
210 xoff + 13,
211 7,
212 12,
213 base_gray(),
214 base_gray(),
215 false,
216 );
217 placer.generate_box(
218 xoff + 12,
219 1,
220 11,
221 xoff + 12,
222 7,
223 13,
224 base_gray(),
225 base_gray(),
226 false,
227 );
228}
229
230fn generate_entrance_archs(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
231 if !placer.chunk_intersects(22, 5, 35, 17) {
232 return;
233 }
234
235 generate_water_box(placer, 25, 0, 0, 32, 8, 20);
236 for i in 0..4 {
237 let z = 5 + i * 4;
238 placer.generate_box(24, 2, z, 24, 4, z, base_light(), base_light(), false);
239 placer.generate_box(22, 4, z, 23, 4, z, base_light(), base_light(), false);
240 placer.place_block(base_light(), 25, 5, z);
241 placer.place_block(base_light(), 26, 6, z);
242 placer.place_block(lamp(), 26, 5, z);
243 placer.generate_box(33, 2, z, 33, 4, z, base_light(), base_light(), false);
244 placer.generate_box(34, 4, z, 35, 4, z, base_light(), base_light(), false);
245 placer.place_block(base_light(), 32, 5, z);
246 placer.place_block(base_light(), 31, 6, z);
247 placer.place_block(lamp(), 31, 5, z);
248 placer.generate_box(27, 6, z, 30, 6, z, base_gray(), base_gray(), false);
249 }
250}
251
252fn generate_entrance_wall(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
253 if !placer.chunk_intersects(15, 20, 42, 21) {
254 return;
255 }
256
257 placer.generate_box(15, 0, 21, 42, 0, 21, base_gray(), base_gray(), false);
258 generate_water_box(placer, 26, 1, 21, 31, 3, 21);
259 placer.generate_box(21, 12, 21, 36, 12, 21, base_gray(), base_gray(), false);
260 placer.generate_box(17, 11, 21, 40, 11, 21, base_gray(), base_gray(), false);
261 placer.generate_box(16, 10, 21, 41, 10, 21, base_gray(), base_gray(), false);
262 placer.generate_box(15, 7, 21, 42, 9, 21, base_gray(), base_gray(), false);
263 placer.generate_box(16, 6, 21, 41, 6, 21, base_gray(), base_gray(), false);
264 placer.generate_box(17, 5, 21, 40, 5, 21, base_gray(), base_gray(), false);
265 placer.generate_box(21, 4, 21, 36, 4, 21, base_gray(), base_gray(), false);
266 placer.generate_box(22, 3, 21, 26, 3, 21, base_gray(), base_gray(), false);
267 placer.generate_box(31, 3, 21, 35, 3, 21, base_gray(), base_gray(), false);
268 placer.generate_box(23, 2, 21, 25, 2, 21, base_gray(), base_gray(), false);
269 placer.generate_box(32, 2, 21, 34, 2, 21, base_gray(), base_gray(), false);
270 placer.generate_box(28, 4, 20, 29, 4, 21, base_light(), base_light(), false);
271 placer.place_block(base_light(), 27, 3, 21);
272 placer.place_block(base_light(), 30, 3, 21);
273 placer.place_block(base_light(), 26, 2, 21);
274 placer.place_block(base_light(), 31, 2, 21);
275 placer.place_block(base_light(), 25, 1, 21);
276 placer.place_block(base_light(), 32, 1, 21);
277
278 for i in 0..7 {
279 placer.place_block(base_black(), 28 - i, 6 + i, 21);
280 placer.place_block(base_black(), 29 + i, 6 + i, 21);
281 }
282 for i in 0..4 {
283 placer.place_block(base_black(), 28 - i, 9 + i, 21);
284 placer.place_block(base_black(), 29 + i, 9 + i, 21);
285 }
286 placer.place_block(base_black(), 28, 12, 21);
287 placer.place_block(base_black(), 29, 12, 21);
288 for i in 0..3 {
289 placer.place_block(base_black(), 22 - i * 2, 8, 21);
290 placer.place_block(base_black(), 22 - i * 2, 9, 21);
291 placer.place_block(base_black(), 35 + i * 2, 8, 21);
292 placer.place_block(base_black(), 35 + i * 2, 9, 21);
293 }
294
295 generate_water_box(placer, 15, 13, 21, 42, 15, 21);
296 generate_water_box(placer, 15, 1, 21, 15, 6, 21);
297 generate_water_box(placer, 16, 1, 21, 16, 5, 21);
298 generate_water_box(placer, 17, 1, 21, 20, 4, 21);
299 generate_water_box(placer, 21, 1, 21, 21, 3, 21);
300 generate_water_box(placer, 22, 1, 21, 22, 2, 21);
301 generate_water_box(placer, 23, 1, 21, 24, 1, 21);
302 generate_water_box(placer, 42, 1, 21, 42, 6, 21);
303 generate_water_box(placer, 41, 1, 21, 41, 5, 21);
304 generate_water_box(placer, 37, 1, 21, 40, 4, 21);
305 generate_water_box(placer, 36, 1, 21, 36, 3, 21);
306 generate_water_box(placer, 33, 1, 21, 34, 1, 21);
307 generate_water_box(placer, 35, 1, 21, 35, 2, 21);
308}
309
310fn generate_roof_piece(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
311 if !placer.chunk_intersects(21, 21, 36, 36) {
312 return;
313 }
314
315 placer.generate_box(21, 0, 22, 36, 0, 36, base_gray(), base_gray(), false);
316 generate_water_box(placer, 21, 1, 22, 36, 23, 36);
317 for i in 0..4 {
318 placer.generate_box(
319 21 + i,
320 13 + i,
321 21 + i,
322 36 - i,
323 13 + i,
324 21 + i,
325 base_light(),
326 base_light(),
327 false,
328 );
329 placer.generate_box(
330 21 + i,
331 13 + i,
332 36 - i,
333 36 - i,
334 13 + i,
335 36 - i,
336 base_light(),
337 base_light(),
338 false,
339 );
340 placer.generate_box(
341 21 + i,
342 13 + i,
343 22 + i,
344 21 + i,
345 13 + i,
346 35 - i,
347 base_light(),
348 base_light(),
349 false,
350 );
351 placer.generate_box(
352 36 - i,
353 13 + i,
354 22 + i,
355 36 - i,
356 13 + i,
357 35 - i,
358 base_light(),
359 base_light(),
360 false,
361 );
362 }
363
364 placer.generate_box(25, 16, 25, 32, 16, 32, base_gray(), base_gray(), false);
365 placer.generate_box(25, 17, 25, 25, 19, 25, base_light(), base_light(), false);
366 placer.generate_box(32, 17, 25, 32, 19, 25, base_light(), base_light(), false);
367 placer.generate_box(25, 17, 32, 25, 19, 32, base_light(), base_light(), false);
368 placer.generate_box(32, 17, 32, 32, 19, 32, base_light(), base_light(), false);
369 placer.place_block(base_light(), 26, 20, 26);
370 placer.place_block(base_light(), 27, 21, 27);
371 placer.place_block(lamp(), 27, 20, 27);
372 placer.place_block(base_light(), 26, 20, 31);
373 placer.place_block(base_light(), 27, 21, 30);
374 placer.place_block(lamp(), 27, 20, 30);
375 placer.place_block(base_light(), 31, 20, 31);
376 placer.place_block(base_light(), 30, 21, 30);
377 placer.place_block(lamp(), 30, 20, 30);
378 placer.place_block(base_light(), 31, 20, 26);
379 placer.place_block(base_light(), 30, 21, 27);
380 placer.place_block(lamp(), 30, 20, 27);
381 placer.generate_box(28, 21, 27, 29, 21, 27, base_gray(), base_gray(), false);
382 placer.generate_box(27, 21, 28, 27, 21, 29, base_gray(), base_gray(), false);
383 placer.generate_box(28, 21, 30, 29, 21, 30, base_gray(), base_gray(), false);
384 placer.generate_box(30, 21, 28, 30, 21, 29, base_gray(), base_gray(), false);
385}
386
387fn generate_lower_wall(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
388 if placer.chunk_intersects(0, 21, 6, 58) {
389 placer.generate_box(0, 0, 21, 6, 0, 57, base_gray(), base_gray(), false);
390 generate_water_box(placer, 0, 1, 21, 6, 7, 57);
391 placer.generate_box(4, 4, 21, 6, 4, 53, base_gray(), base_gray(), false);
392 for i in 0..4 {
393 placer.generate_box(
394 i,
395 i + 1,
396 21,
397 i,
398 i + 1,
399 57 - i,
400 base_light(),
401 base_light(),
402 false,
403 );
404 }
405 for z in (23..53).step_by(3) {
406 placer.place_block(dot_deco(), 5, 5, z);
407 }
408 placer.place_block(dot_deco(), 5, 5, 52);
409 for i in 0..4 {
410 placer.generate_box(
411 i,
412 i + 1,
413 21,
414 i,
415 i + 1,
416 57 - i,
417 base_light(),
418 base_light(),
419 false,
420 );
421 }
422 placer.generate_box(4, 1, 52, 6, 3, 52, base_gray(), base_gray(), false);
423 placer.generate_box(5, 1, 51, 5, 3, 53, base_gray(), base_gray(), false);
424 }
425
426 if placer.chunk_intersects(51, 21, 58, 58) {
427 placer.generate_box(51, 0, 21, 57, 0, 57, base_gray(), base_gray(), false);
428 generate_water_box(placer, 51, 1, 21, 57, 7, 57);
429 placer.generate_box(51, 4, 21, 53, 4, 53, base_gray(), base_gray(), false);
430 for i in 0..4 {
431 placer.generate_box(
432 57 - i,
433 i + 1,
434 21,
435 57 - i,
436 i + 1,
437 57 - i,
438 base_light(),
439 base_light(),
440 false,
441 );
442 }
443 for z in (23..53).step_by(3) {
444 placer.place_block(dot_deco(), 52, 5, z);
445 }
446 placer.place_block(dot_deco(), 52, 5, 52);
447 placer.generate_box(51, 1, 52, 53, 3, 52, base_gray(), base_gray(), false);
448 placer.generate_box(52, 1, 51, 52, 3, 53, base_gray(), base_gray(), false);
449 }
450
451 if placer.chunk_intersects(0, 51, 57, 57) {
452 placer.generate_box(7, 0, 51, 50, 0, 57, base_gray(), base_gray(), false);
453 generate_water_box(placer, 7, 1, 51, 50, 10, 57);
454 for i in 0..4 {
455 placer.generate_box(
456 i + 1,
457 i + 1,
458 57 - i,
459 56 - i,
460 i + 1,
461 57 - i,
462 base_light(),
463 base_light(),
464 false,
465 );
466 }
467 }
468}
469
470fn generate_middle_wall(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
471 if placer.chunk_intersects(7, 21, 13, 50) {
472 placer.generate_box(7, 0, 21, 13, 0, 50, base_gray(), base_gray(), false);
473 generate_water_box(placer, 7, 1, 21, 13, 10, 50);
474 placer.generate_box(11, 8, 21, 13, 8, 53, base_gray(), base_gray(), false);
475 for i in 0..4 {
476 placer.generate_box(
477 i + 7,
478 i + 5,
479 21,
480 i + 7,
481 i + 5,
482 54,
483 base_light(),
484 base_light(),
485 false,
486 );
487 }
488 for z in (21..=45).step_by(3) {
489 placer.place_block(dot_deco(), 12, 9, z);
490 }
491 }
492
493 if placer.chunk_intersects(44, 21, 50, 54) {
494 placer.generate_box(44, 0, 21, 50, 0, 50, base_gray(), base_gray(), false);
495 generate_water_box(placer, 44, 1, 21, 50, 10, 50);
496 placer.generate_box(44, 8, 21, 46, 8, 53, base_gray(), base_gray(), false);
497 for i in 0..4 {
498 placer.generate_box(
499 50 - i,
500 i + 5,
501 21,
502 50 - i,
503 i + 5,
504 54,
505 base_light(),
506 base_light(),
507 false,
508 );
509 }
510 for z in (21..=45).step_by(3) {
511 placer.place_block(dot_deco(), 45, 9, z);
512 }
513 }
514
515 if placer.chunk_intersects(8, 44, 49, 54) {
516 placer.generate_box(14, 0, 44, 43, 0, 50, base_gray(), base_gray(), false);
517 generate_water_box(placer, 14, 1, 44, 43, 10, 50);
518 for x in (12..=45).step_by(3) {
519 placer.place_block(dot_deco(), x, 9, 45);
520 placer.place_block(dot_deco(), x, 9, 52);
521 if matches!(x, 12 | 18 | 24 | 33 | 39 | 45) {
522 placer.place_block(dot_deco(), x, 9, 47);
523 placer.place_block(dot_deco(), x, 9, 50);
524 placer.place_block(dot_deco(), x, 10, 45);
525 placer.place_block(dot_deco(), x, 10, 46);
526 placer.place_block(dot_deco(), x, 10, 51);
527 placer.place_block(dot_deco(), x, 10, 52);
528 placer.place_block(dot_deco(), x, 11, 47);
529 placer.place_block(dot_deco(), x, 11, 50);
530 placer.place_block(dot_deco(), x, 12, 48);
531 placer.place_block(dot_deco(), x, 12, 49);
532 }
533 }
534 for i in 0..3 {
535 placer.generate_box(
536 8 + i,
537 5 + i,
538 54,
539 49 - i,
540 5 + i,
541 54,
542 base_gray(),
543 base_gray(),
544 false,
545 );
546 }
547 placer.generate_box(11, 8, 54, 46, 8, 54, base_light(), base_light(), false);
548 placer.generate_box(14, 8, 44, 43, 8, 53, base_gray(), base_gray(), false);
549 }
550}
551
552fn generate_upper_wall(placer: &mut ScatteredFeaturePlacer<'_, '_>) {
553 if placer.chunk_intersects(14, 21, 20, 43) {
554 placer.generate_box(14, 0, 21, 20, 0, 43, base_gray(), base_gray(), false);
555 generate_water_box(placer, 14, 1, 22, 20, 14, 43);
556 placer.generate_box(18, 12, 22, 20, 12, 39, base_gray(), base_gray(), false);
557 placer.generate_box(18, 12, 21, 20, 12, 21, base_light(), base_light(), false);
558 for i in 0..4 {
559 placer.generate_box(
560 i + 14,
561 i + 9,
562 21,
563 i + 14,
564 i + 9,
565 43 - i,
566 base_light(),
567 base_light(),
568 false,
569 );
570 }
571 for z in (23..=39).step_by(3) {
572 placer.place_block(dot_deco(), 19, 13, z);
573 }
574 }
575
576 if placer.chunk_intersects(37, 21, 43, 43) {
577 placer.generate_box(37, 0, 21, 43, 0, 43, base_gray(), base_gray(), false);
578 generate_water_box(placer, 37, 1, 22, 43, 14, 43);
579 placer.generate_box(37, 12, 22, 39, 12, 39, base_gray(), base_gray(), false);
580 placer.generate_box(37, 12, 21, 39, 12, 21, base_light(), base_light(), false);
581 for i in 0..4 {
582 placer.generate_box(
583 43 - i,
584 i + 9,
585 21,
586 43 - i,
587 i + 9,
588 43 - i,
589 base_light(),
590 base_light(),
591 false,
592 );
593 }
594 for z in (23..=39).step_by(3) {
595 placer.place_block(dot_deco(), 38, 13, z);
596 }
597 }
598
599 if placer.chunk_intersects(15, 37, 42, 43) {
600 placer.generate_box(21, 0, 37, 36, 0, 43, base_gray(), base_gray(), false);
601 generate_water_box(placer, 21, 1, 37, 36, 14, 43);
602 placer.generate_box(21, 12, 37, 36, 12, 39, base_gray(), base_gray(), false);
603 for i in 0..4 {
604 placer.generate_box(
605 15 + i,
606 i + 9,
607 43 - i,
608 42 - i,
609 i + 9,
610 43 - i,
611 base_light(),
612 base_light(),
613 false,
614 );
615 }
616 for x in (21..=36).step_by(3) {
617 placer.place_block(dot_deco(), x, 13, 38);
618 }
619 }
620}