feat: Structures

This commit is contained in:
Alexander Medvedev
2026-01-03 23:36:19 +01:00
parent 714e970292
commit 01d3be963d
13 changed files with 772 additions and 483 deletions

252
Cargo.lock generated
View File

@@ -161,9 +161,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]] [[package]]
name = "axum" name = "axum"
version = "0.8.7" version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8"
dependencies = [ dependencies = [
"axum-core", "axum-core",
"bytes", "bytes",
@@ -186,9 +186,9 @@ dependencies = [
[[package]] [[package]]
name = "axum-core" name = "axum-core"
version = "0.5.5" version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures-core", "futures-core",
@@ -258,9 +258,9 @@ dependencies = [
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.19.0" version = "3.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
[[package]] [[package]]
name = "byteorder" name = "byteorder"
@@ -282,9 +282,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.49" version = "1.2.51"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203"
dependencies = [ dependencies = [
"find-msvc-tools", "find-msvc-tools",
"shlex", "shlex",
@@ -313,13 +313,13 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]] [[package]]
name = "chacha20" name = "chacha20"
version = "0.10.0-rc.5" version = "0.10.0-rc.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99cbf41c6ec3c4b9eaf7f8f5c11a72cd7d3aa0428125c20d5ef4d09907a0f019" checksum = "f895fb33c1ad22da4bc79d37c0bddff8aee2ba4575705345eb73b8ffbc386074"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"cpufeatures", "cpufeatures",
"rand_core 0.10.0-rc-2", "rand_core 0.10.0-rc-3",
] ]
[[package]] [[package]]
@@ -361,18 +361,18 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.5.53" version = "4.5.54"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
] ]
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.5.53" version = "4.5.54"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"clap_lex", "clap_lex",
@@ -514,30 +514,13 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "crc"
version = "3.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675"
dependencies = [
"crc-catalog",
]
[[package]]
name = "crc-catalog"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
[[package]] [[package]]
name = "crc-fast" name = "crc-fast"
version = "1.9.0" version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fd92aca2c6001b1bf5ba0ff84ee74ec8501b52bbef0cac80bf25a6c1d87a83d" checksum = "e75b2483e97a5a7da73ac68a05b629f9c53cff58d8ed1c77866079e18b00dba5"
dependencies = [ dependencies = [
"crc",
"digest 0.10.7", "digest 0.10.7",
"rustversion",
"spin", "spin",
] ]
@@ -642,9 +625,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]] [[package]]
name = "crossfire" name = "crossfire"
version = "2.1.8" version = "2.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cdbed44ce04d3b1581f2f41713381a799fdff8cedc0abafd7ada78284063dc3" checksum = "7f19636ec7667a64122ad23414cd773dcdd32532a7df7a4f68ad16bba0db5f02"
dependencies = [ dependencies = [
"crossbeam-queue", "crossbeam-queue",
"crossbeam-utils", "crossbeam-utils",
@@ -705,7 +688,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6715836b4946e8585016e80b79c7561476aff3b22f7b756778e7b109d86086c6" checksum = "6715836b4946e8585016e80b79c7561476aff3b22f7b756778e7b109d86086c6"
dependencies = [ dependencies = [
"num-traits", "num-traits",
"rand_core 0.10.0-rc-2", "rand_core 0.10.0-rc-3",
"serdect", "serdect",
"subtle", "subtle",
"zeroize", "zeroize",
@@ -723,9 +706,9 @@ dependencies = [
[[package]] [[package]]
name = "crypto-common" name = "crypto-common"
version = "0.2.0-rc.5" version = "0.2.0-rc.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "919bd05924682a5480aec713596b9e2aabed3a0a6022fab6847f85a99e5f190a" checksum = "e6165b8029cdc3e765b74d3548f85999ee799d5124877ce45c2c85ca78e4d4aa"
dependencies = [ dependencies = [
"hybrid-array", "hybrid-array",
] ]
@@ -738,7 +721,7 @@ checksum = "fdd9b2855017318a49714c07ee8895b89d3510d54fa6d86be5835de74c389609"
dependencies = [ dependencies = [
"crypto-bigint 0.7.0-rc.10", "crypto-bigint 0.7.0-rc.10",
"libm", "libm",
"rand_core 0.10.0-rc-2", "rand_core 0.10.0-rc-3",
] ]
[[package]] [[package]]
@@ -788,18 +771,18 @@ dependencies = [
[[package]] [[package]]
name = "derive_more" name = "derive_more"
version = "2.1.0" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10b768e943bed7bf2cab53df09f4bc34bfd217cdb57d971e769874c9a6710618" checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
dependencies = [ dependencies = [
"derive_more-impl", "derive_more-impl",
] ]
[[package]] [[package]]
name = "derive_more-impl" name = "derive_more-impl"
version = "2.1.0" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d286bfdaf75e988b4a78e013ecd79c581e06399ab53fbacd2d916c2f904f30b" checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
dependencies = [ dependencies = [
"convert_case", "convert_case",
"proc-macro2", "proc-macro2",
@@ -822,13 +805,13 @@ dependencies = [
[[package]] [[package]]
name = "digest" name = "digest"
version = "0.11.0-rc.4" version = "0.11.0-rc.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea390c940e465846d64775e55e3115d5dc934acb953de6f6e6360bc232fe2bf7" checksum = "ebf9423bafb058e4142194330c52273c343f8a5beb7176d052f0e73b17dd35b9"
dependencies = [ dependencies = [
"block-buffer 0.11.0", "block-buffer 0.11.0",
"const-oid 0.10.1", "const-oid 0.10.1",
"crypto-common 0.2.0-rc.5", "crypto-common 0.2.0-rc.8",
"subtle", "subtle",
] ]
@@ -941,7 +924,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.52.0", "windows-sys 0.61.2",
] ]
[[package]] [[package]]
@@ -962,9 +945,9 @@ dependencies = [
[[package]] [[package]]
name = "find-msvc-tools" name = "find-msvc-tools"
version = "0.1.5" version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff"
[[package]] [[package]]
name = "flate2" name = "flate2"
@@ -1120,6 +1103,19 @@ dependencies = [
"wasip2", "wasip2",
] ]
[[package]]
name = "getrandom"
version = "0.4.0-rc.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b99f0d993a2b9b97b9a201193aa8ad21305cde06a3be9a7e1f8f4201e5cc27e"
dependencies = [
"cfg-if",
"libc",
"r-efi",
"rand_core 0.10.0-rc-3",
"wasip2",
]
[[package]] [[package]]
name = "group" name = "group"
version = "0.13.0" version = "0.13.0"
@@ -1227,7 +1223,7 @@ version = "0.13.0-rc.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1c597ac7d6cc8143e30e83ef70915e7f883b18d8bec2e2b2bce47f5bbb06d57" checksum = "f1c597ac7d6cc8143e30e83ef70915e7f883b18d8bec2e2b2bce47f5bbb06d57"
dependencies = [ dependencies = [
"digest 0.11.0-rc.4", "digest 0.11.0-rc.5",
] ]
[[package]] [[package]]
@@ -1395,9 +1391,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
[[package]] [[package]]
name = "icu_properties" name = "icu_properties"
version = "2.1.1" version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"
dependencies = [ dependencies = [
"icu_collections", "icu_collections",
"icu_locale_core", "icu_locale_core",
@@ -1409,9 +1405,9 @@ dependencies = [
[[package]] [[package]]
name = "icu_properties_data" name = "icu_properties_data"
version = "2.1.1" version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"
[[package]] [[package]]
name = "icu_provider" name = "icu_provider"
@@ -1496,15 +1492,15 @@ dependencies = [
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.15" version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
[[package]] [[package]]
name = "jiff" name = "jiff"
version = "0.2.16" version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" checksum = "a87d9b8105c23642f50cbbae03d1f75d8422c5cb98ce7ee9271f7ff7505be6b8"
dependencies = [ dependencies = [
"jiff-static", "jiff-static",
"log", "log",
@@ -1515,9 +1511,9 @@ dependencies = [
[[package]] [[package]]
name = "jiff-static" name = "jiff-static"
version = "0.2.16" version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" checksum = "b787bebb543f8969132630c51fd0afab173a86c6abae56ff3b9e5e3e3f9f6e58"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1542,15 +1538,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.178" version = "0.2.179"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" checksum = "c5a2d376baa530d1238d133232d15e239abad80d05838b4b59354e5268af431f"
[[package]] [[package]]
name = "libloading" name = "libloading"
version = "0.9.0" version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"windows-link", "windows-link",
@@ -1845,9 +1841,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]] [[package]]
name = "pest" name = "pest"
version = "2.8.4" version = "2.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7"
dependencies = [ dependencies = [
"memchr", "memchr",
"ucd-trie", "ucd-trie",
@@ -1855,9 +1851,9 @@ dependencies = [
[[package]] [[package]]
name = "pest_derive" name = "pest_derive"
version = "2.8.4" version = "2.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed"
dependencies = [ dependencies = [
"pest", "pest",
"pest_generator", "pest_generator",
@@ -1865,9 +1861,9 @@ dependencies = [
[[package]] [[package]]
name = "pest_generator" name = "pest_generator"
version = "2.8.4" version = "2.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5"
dependencies = [ dependencies = [
"pest", "pest",
"pest_meta", "pest_meta",
@@ -1878,9 +1874,9 @@ dependencies = [
[[package]] [[package]]
name = "pest_meta" name = "pest_meta"
version = "2.8.4" version = "2.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365"
dependencies = [ dependencies = [
"pest", "pest",
"sha2 0.10.9", "sha2 0.10.9",
@@ -1993,9 +1989,9 @@ dependencies = [
[[package]] [[package]]
name = "portable-atomic" name = "portable-atomic"
version = "1.11.1" version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950"
[[package]] [[package]]
name = "portable-atomic-util" name = "portable-atomic-util"
@@ -2054,9 +2050,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.103" version = "1.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@@ -2327,12 +2323,11 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]] [[package]]
name = "rand" name = "rand"
version = "0.10.0-rc.5" version = "0.10.0-rc.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/rust-random/rand#75fe38fff59e5abb16ed5a146d61960cad27dc0f"
checksum = "be866deebbade98028b705499827ad6967c8bb1e21f96a2609913c8c076e9307"
dependencies = [ dependencies = [
"chacha20", "chacha20",
"getrandom 0.3.4", "getrandom 0.4.0-rc.0",
"rand_core 0.10.0-rc-2", "rand_core 0.10.0-rc-3",
] ]
[[package]] [[package]]
@@ -2346,9 +2341,9 @@ dependencies = [
[[package]] [[package]]
name = "rand_core" name = "rand_core"
version = "0.10.0-rc-2" version = "0.10.0-rc-3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "104a23e4e8b77312a823b6b5613edbac78397e2f34320bc7ac4277013ec4478e" checksum = "f66ee92bc15280519ef199a274fe0cafff4245d31bc39aaa31c011ad56cb1f05"
[[package]] [[package]]
name = "rayon" name = "rayon"
@@ -2441,12 +2436,12 @@ dependencies = [
"const-oid 0.10.1", "const-oid 0.10.1",
"crypto-bigint 0.7.0-rc.10", "crypto-bigint 0.7.0-rc.10",
"crypto-primes", "crypto-primes",
"digest 0.11.0-rc.4", "digest 0.11.0-rc.5",
"pkcs1", "pkcs1",
"pkcs8 0.11.0-rc.8", "pkcs8 0.11.0-rc.8",
"rand_core 0.10.0-rc-2", "rand_core 0.10.0-rc-3",
"sha1", "sha1",
"signature 3.0.0-rc.5", "signature 3.0.0-rc.6",
"spki 0.8.0-rc.4", "spki 0.8.0-rc.4",
"subtle", "subtle",
"zeroize", "zeroize",
@@ -2477,7 +2472,7 @@ dependencies = [
"errno", "errno",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys",
"windows-sys 0.52.0", "windows-sys 0.61.2",
] ]
[[package]] [[package]]
@@ -2497,9 +2492,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls-pki-types" name = "rustls-pki-types"
version = "1.13.1" version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282"
dependencies = [ dependencies = [
"zeroize", "zeroize",
] ]
@@ -2545,12 +2540,6 @@ dependencies = [
"twox-hash 2.1.2", "twox-hash 2.1.2",
] ]
[[package]]
name = "ryu"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]] [[package]]
name = "same-file" name = "same-file"
version = "1.0.6" version = "1.0.6"
@@ -2618,15 +2607,15 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.145" version = "1.0.148"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" checksum = "3084b546a1dd6289475996f182a22aba973866ea8e8b02c51d9f46b1336a22da"
dependencies = [ dependencies = [
"itoa", "itoa",
"memchr", "memchr",
"ryu",
"serde", "serde",
"serde_core", "serde_core",
"zmij",
] ]
[[package]] [[package]]
@@ -2642,9 +2631,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_spanned" name = "serde_spanned"
version = "1.0.3" version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776"
dependencies = [ dependencies = [
"serde_core", "serde_core",
] ]
@@ -2667,7 +2656,7 @@ checksum = "aa1ae819b9870cadc959a052363de870944a1646932d274a4e270f64bf79e5ef"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"cpufeatures", "cpufeatures",
"digest 0.11.0-rc.4", "digest 0.11.0-rc.5",
] ]
[[package]] [[package]]
@@ -2689,7 +2678,7 @@ checksum = "19d43dc0354d88b791216bb5c1bfbb60c0814460cc653ae0ebd71f286d0bd927"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"cpufeatures", "cpufeatures",
"digest 0.11.0-rc.4", "digest 0.11.0-rc.5",
] ]
[[package]] [[package]]
@@ -2730,10 +2719,11 @@ dependencies = [
[[package]] [[package]]
name = "signal-hook-registry" name = "signal-hook-registry"
version = "1.4.7" version = "1.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
dependencies = [ dependencies = [
"errno",
"libc", "libc",
] ]
@@ -2749,12 +2739,12 @@ dependencies = [
[[package]] [[package]]
name = "signature" name = "signature"
version = "3.0.0-rc.5" version = "3.0.0-rc.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a0251c9d6468f4ba853b6352b190fb7c1e405087779917c238445eb03993826" checksum = "597a96996ccff7dfa16f052bd995b4cecc72af22c35138738dc029f0ead6608d"
dependencies = [ dependencies = [
"digest 0.11.0-rc.4", "digest 0.11.0-rc.5",
"rand_core 0.10.0-rc-2", "rand_core 0.10.0-rc-3",
] ]
[[package]] [[package]]
@@ -2858,9 +2848,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.111" version = "2.0.112"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" checksum = "21f182278bf2d2bcb3c88b1b08a37df029d71ce3d3ae26168e3c653b213b99d4"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -2905,7 +2895,7 @@ dependencies = [
"fastrand", "fastrand",
"once_cell", "once_cell",
"rustix", "rustix",
"windows-sys 0.52.0", "windows-sys 0.61.2",
] ]
[[package]] [[package]]
@@ -3011,9 +3001,9 @@ dependencies = [
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.48.0" version = "1.49.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86"
dependencies = [ dependencies = [
"bytes", "bytes",
"libc", "libc",
@@ -3064,9 +3054,9 @@ dependencies = [
[[package]] [[package]]
name = "toml" name = "toml"
version = "0.9.8" version = "0.9.10+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48"
dependencies = [ dependencies = [
"indexmap", "indexmap",
"serde_core", "serde_core",
@@ -3079,27 +3069,27 @@ dependencies = [
[[package]] [[package]]
name = "toml_datetime" name = "toml_datetime"
version = "0.7.3" version = "0.7.5+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
dependencies = [ dependencies = [
"serde_core", "serde_core",
] ]
[[package]] [[package]]
name = "toml_parser" name = "toml_parser"
version = "1.0.4" version = "1.0.6+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"
dependencies = [ dependencies = [
"winnow", "winnow",
] ]
[[package]] [[package]]
name = "toml_writer" name = "toml_writer"
version = "1.0.4" version = "1.0.6+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607"
[[package]] [[package]]
name = "tonic" name = "tonic"
@@ -3174,9 +3164,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
[[package]] [[package]]
name = "tracing" name = "tracing"
version = "0.1.43" version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [ dependencies = [
"pin-project-lite", "pin-project-lite",
"tracing-attributes", "tracing-attributes",
@@ -3196,9 +3186,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing-core" name = "tracing-core"
version = "0.1.35" version = "0.1.36"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"valuable", "valuable",
@@ -3441,9 +3431,9 @@ dependencies = [
[[package]] [[package]]
name = "webpki-roots" name = "webpki-roots"
version = "1.0.4" version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c"
dependencies = [ dependencies = [
"rustls-pki-types", "rustls-pki-types",
] ]
@@ -3470,7 +3460,7 @@ version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.61.2",
] ]
[[package]] [[package]]
@@ -3770,3 +3760,9 @@ dependencies = [
"quote", "quote",
"syn", "syn",
] ]
[[package]]
name = "zmij"
version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "317f17ff091ac4515f17cc7a190d2769a8c9a96d227de5d64b500b01cda8f2cd"

View File

@@ -30,7 +30,7 @@ debug = true
[workspace.dependencies] [workspace.dependencies]
log = "0.4" log = "0.4"
tokio = { version = "1.48", default-features = false } tokio = { version = "1.49", default-features = false }
syn = { version = "2.0", default-features = false, features=["printing"] } syn = { version = "2.0", default-features = false, features=["printing"] }
@@ -60,7 +60,7 @@ console-subscriber = { version = "0.5.0", default-features = false }
crc-fast = "1.9.0" crc-fast = "1.9.0"
criterion = { version = "0.8", default-features = false } criterion = { version = "0.8", default-features = false }
crossbeam-utils = "0.8.21" crossbeam-utils = "0.8.21"
crossfire = "2.1.8" crossfire = "2.1.9"
dashmap = "6.1" dashmap = "6.1"
ecdsa = "0.16.9" ecdsa = "0.16.9"
enum_dispatch = "0.3.13" enum_dispatch = "0.3.13"
@@ -70,7 +70,7 @@ heck = "0.5"
hmac = "=0.13.0-rc.3" hmac = "=0.13.0-rc.3"
indexmap = "2.12" indexmap = "2.12"
itertools = "0.14.0" itertools = "0.14.0"
libloading = "0.9" libloading = "0.8"
lru = "0.16.2" lru = "0.16.2"
lz4-java-wrc = "0.2.0" lz4-java-wrc = "0.2.0"
md5 = "0.8" md5 = "0.8"
@@ -92,7 +92,7 @@ pumpkin-registry = { path = "pumpkin-registry" }
pumpkin-util = { path = "pumpkin-util" } pumpkin-util = { path = "pumpkin-util" }
pumpkin-world = { path = "pumpkin-world" } pumpkin-world = { path = "pumpkin-world" }
quote = "1.0" quote = "1.0"
rand = "=0.10.0-rc.5" rand = { git = "https://github.com/rust-random/rand"}
rsa = "=0.10.0-rc.10" rsa = "=0.10.0-rc.10"
rustc-hash = "2.1.1" rustc-hash = "2.1.1"
rustyline-async = "0.4.7" rustyline-async = "0.4.7"

View File

@@ -1,12 +1,5 @@
{ {
"ancient_city": { "minecraft:ancient_city": {
"use_expansion_hack": false,
"max_distance_from_center": 116,
"start_jigsaw_name": "minecraft:city_anchor",
"size": 7,
"start_height": {
"absolute": -27
},
"biomes": "#minecraft:has_structure/ancient_city", "biomes": "#minecraft:has_structure/ancient_city",
"spawn_overrides": { "spawn_overrides": {
"ambient": { "ambient": {
@@ -45,40 +38,47 @@
"step": "underground_decoration", "step": "underground_decoration",
"terrain_adaptation": "beard_box", "terrain_adaptation": "beard_box",
"start_pool": "minecraft:ancient_city/city_center", "start_pool": "minecraft:ancient_city/city_center",
"start_jigsaw_name": "minecraft:city_anchor",
"size": 7,
"start_height": {
"absolute": -27
},
"use_expansion_hack": false,
"max_distance_from_center": 116,
"type": "minecraft:jigsaw" "type": "minecraft:jigsaw"
}, },
"bastion_remnant": { "minecraft:bastion_remnant": {
"use_expansion_hack": false,
"max_distance_from_center": 80,
"size": 6,
"start_height": {
"absolute": 33
},
"biomes": "#minecraft:has_structure/bastion_remnant", "biomes": "#minecraft:has_structure/bastion_remnant",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"start_pool": "minecraft:bastion/starts", "start_pool": "minecraft:bastion/starts",
"size": 6,
"start_height": {
"absolute": 33
},
"use_expansion_hack": false,
"max_distance_from_center": 80,
"type": "minecraft:jigsaw" "type": "minecraft:jigsaw"
}, },
"buried_treasure": { "minecraft:buried_treasure": {
"biomes": "#minecraft:has_structure/buried_treasure", "biomes": "#minecraft:has_structure/buried_treasure",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "underground_structures", "step": "underground_structures",
"type": "minecraft:buried_treasure" "type": "minecraft:buried_treasure"
}, },
"desert_pyramid": { "minecraft:desert_pyramid": {
"biomes": "#minecraft:has_structure/desert_pyramid", "biomes": "#minecraft:has_structure/desert_pyramid",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"type": "minecraft:desert_pyramid" "type": "minecraft:desert_pyramid"
}, },
"end_city": { "minecraft:end_city": {
"biomes": "#minecraft:has_structure/end_city", "biomes": "#minecraft:has_structure/end_city",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"type": "minecraft:end_city" "type": "minecraft:end_city"
}, },
"fortress": { "minecraft:fortress": {
"biomes": "#minecraft:has_structure/nether_fortress", "biomes": "#minecraft:has_structure/nether_fortress",
"spawn_overrides": { "spawn_overrides": {
"monster": { "monster": {
@@ -120,39 +120,39 @@
"step": "underground_decoration", "step": "underground_decoration",
"type": "minecraft:fortress" "type": "minecraft:fortress"
}, },
"igloo": { "minecraft:igloo": {
"biomes": "#minecraft:has_structure/igloo", "biomes": "#minecraft:has_structure/igloo",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"type": "minecraft:igloo" "type": "minecraft:igloo"
}, },
"jungle_pyramid": { "minecraft:jungle_pyramid": {
"biomes": "#minecraft:has_structure/jungle_temple", "biomes": "#minecraft:has_structure/jungle_temple",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"type": "minecraft:jungle_temple" "type": "minecraft:jungle_temple"
}, },
"mansion": { "minecraft:mansion": {
"biomes": "#minecraft:has_structure/woodland_mansion", "biomes": "#minecraft:has_structure/woodland_mansion",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"type": "minecraft:woodland_mansion" "type": "minecraft:woodland_mansion"
}, },
"mineshaft": { "minecraft:mineshaft": {
"biomes": "#minecraft:has_structure/mineshaft", "biomes": "#minecraft:has_structure/mineshaft",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "underground_structures", "step": "underground_structures",
"mineshaft_type": "normal", "mineshaft_type": "normal",
"type": "minecraft:mineshaft" "type": "minecraft:mineshaft"
}, },
"mineshaft_mesa": { "minecraft:mineshaft_mesa": {
"biomes": "#minecraft:has_structure/mineshaft_mesa", "biomes": "#minecraft:has_structure/mineshaft_mesa",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "underground_structures", "step": "underground_structures",
"mineshaft_type": "mesa", "mineshaft_type": "mesa",
"type": "minecraft:mineshaft" "type": "minecraft:mineshaft"
}, },
"monument": { "minecraft:monument": {
"biomes": "#minecraft:has_structure/ocean_monument", "biomes": "#minecraft:has_structure/ocean_monument",
"spawn_overrides": { "spawn_overrides": {
"axolotls": { "axolotls": {
@@ -178,7 +178,7 @@
"step": "surface_structures", "step": "surface_structures",
"type": "minecraft:ocean_monument" "type": "minecraft:ocean_monument"
}, },
"nether_fossil": { "minecraft:nether_fossil": {
"biomes": "#minecraft:has_structure/nether_fossil", "biomes": "#minecraft:has_structure/nether_fossil",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "underground_decoration", "step": "underground_decoration",
@@ -194,7 +194,7 @@
}, },
"type": "minecraft:nether_fossil" "type": "minecraft:nether_fossil"
}, },
"ocean_ruin_cold": { "minecraft:ocean_ruin_cold": {
"biomes": "#minecraft:has_structure/ocean_ruin_cold", "biomes": "#minecraft:has_structure/ocean_ruin_cold",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
@@ -203,7 +203,7 @@
"cluster_probability": 0.9, "cluster_probability": 0.9,
"type": "minecraft:ocean_ruin" "type": "minecraft:ocean_ruin"
}, },
"ocean_ruin_warm": { "minecraft:ocean_ruin_warm": {
"biomes": "#minecraft:has_structure/ocean_ruin_warm", "biomes": "#minecraft:has_structure/ocean_ruin_warm",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
@@ -212,14 +212,7 @@
"cluster_probability": 0.9, "cluster_probability": 0.9,
"type": "minecraft:ocean_ruin" "type": "minecraft:ocean_ruin"
}, },
"pillager_outpost": { "minecraft:pillager_outpost": {
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"size": 7,
"start_height": {
"absolute": 0
},
"biomes": "#minecraft:has_structure/pillager_outpost", "biomes": "#minecraft:has_structure/pillager_outpost",
"spawn_overrides": { "spawn_overrides": {
"monster": { "monster": {
@@ -237,176 +230,183 @@
"step": "surface_structures", "step": "surface_structures",
"terrain_adaptation": "beard_thin", "terrain_adaptation": "beard_thin",
"start_pool": "minecraft:pillager_outpost/base_plates", "start_pool": "minecraft:pillager_outpost/base_plates",
"size": 7,
"start_height": {
"absolute": 0
},
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"type": "minecraft:jigsaw" "type": "minecraft:jigsaw"
}, },
"ruined_portal": { "minecraft:ruined_portal": {
"biomes": "#minecraft:has_structure/ruined_portal_standard", "biomes": "#minecraft:has_structure/ruined_portal_standard",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"setups": [ "setups": [
{ {
"vines": false,
"can_be_cold": true,
"replace_with_blackstone": false,
"weight": 0.5,
"placement": "underground", "placement": "underground",
"air_pocket_probability": 1.0, "air_pocket_probability": 1.0,
"mossiness": 0.2, "mossiness": 0.2,
"overgrown": false "overgrown": false,
},
{
"vines": false, "vines": false,
"can_be_cold": true, "can_be_cold": true,
"replace_with_blackstone": false, "replace_with_blackstone": false,
"weight": 0.5, "weight": 0.5
},
{
"placement": "on_land_surface", "placement": "on_land_surface",
"air_pocket_probability": 0.5, "air_pocket_probability": 0.5,
"mossiness": 0.2, "mossiness": 0.2,
"overgrown": false "overgrown": false,
"vines": false,
"can_be_cold": true,
"replace_with_blackstone": false,
"weight": 0.5
} }
], ],
"type": "minecraft:ruined_portal" "type": "minecraft:ruined_portal"
}, },
"ruined_portal_desert": { "minecraft:ruined_portal_desert": {
"biomes": "#minecraft:has_structure/ruined_portal_desert", "biomes": "#minecraft:has_structure/ruined_portal_desert",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"setups": [ "setups": [
{ {
"vines": false,
"can_be_cold": false,
"replace_with_blackstone": false,
"weight": 1.0,
"placement": "partly_buried", "placement": "partly_buried",
"air_pocket_probability": 0.0, "air_pocket_probability": 0.0,
"mossiness": 0.0, "mossiness": 0.0,
"overgrown": false "overgrown": false,
"vines": false,
"can_be_cold": false,
"replace_with_blackstone": false,
"weight": 1.0
} }
], ],
"type": "minecraft:ruined_portal" "type": "minecraft:ruined_portal"
}, },
"ruined_portal_jungle": { "minecraft:ruined_portal_jungle": {
"biomes": "#minecraft:has_structure/ruined_portal_jungle", "biomes": "#minecraft:has_structure/ruined_portal_jungle",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"setups": [ "setups": [
{ {
"vines": true,
"can_be_cold": false,
"replace_with_blackstone": false,
"weight": 1.0,
"placement": "on_land_surface", "placement": "on_land_surface",
"air_pocket_probability": 0.5, "air_pocket_probability": 0.5,
"mossiness": 0.8, "mossiness": 0.8,
"overgrown": true "overgrown": true,
"vines": true,
"can_be_cold": false,
"replace_with_blackstone": false,
"weight": 1.0
} }
], ],
"type": "minecraft:ruined_portal" "type": "minecraft:ruined_portal"
}, },
"ruined_portal_mountain": { "minecraft:ruined_portal_mountain": {
"biomes": "#minecraft:has_structure/ruined_portal_mountain", "biomes": "#minecraft:has_structure/ruined_portal_mountain",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"setups": [ "setups": [
{ {
"vines": false,
"can_be_cold": true,
"replace_with_blackstone": false,
"weight": 0.5,
"placement": "in_mountain", "placement": "in_mountain",
"air_pocket_probability": 1.0, "air_pocket_probability": 1.0,
"mossiness": 0.2, "mossiness": 0.2,
"overgrown": false "overgrown": false,
},
{
"vines": false, "vines": false,
"can_be_cold": true, "can_be_cold": true,
"replace_with_blackstone": false, "replace_with_blackstone": false,
"weight": 0.5, "weight": 0.5
},
{
"placement": "on_land_surface", "placement": "on_land_surface",
"air_pocket_probability": 0.5, "air_pocket_probability": 0.5,
"mossiness": 0.2, "mossiness": 0.2,
"overgrown": false "overgrown": false,
"vines": false,
"can_be_cold": true,
"replace_with_blackstone": false,
"weight": 0.5
} }
], ],
"type": "minecraft:ruined_portal" "type": "minecraft:ruined_portal"
}, },
"ruined_portal_nether": { "minecraft:ruined_portal_nether": {
"biomes": "#minecraft:has_structure/ruined_portal_nether", "biomes": "#minecraft:has_structure/ruined_portal_nether",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"setups": [ "setups": [
{ {
"vines": false,
"can_be_cold": false,
"replace_with_blackstone": true,
"weight": 1.0,
"placement": "in_nether", "placement": "in_nether",
"air_pocket_probability": 0.5, "air_pocket_probability": 0.5,
"mossiness": 0.0, "mossiness": 0.0,
"overgrown": false "overgrown": false,
"vines": false,
"can_be_cold": false,
"replace_with_blackstone": true,
"weight": 1.0
} }
], ],
"type": "minecraft:ruined_portal" "type": "minecraft:ruined_portal"
}, },
"ruined_portal_ocean": { "minecraft:ruined_portal_ocean": {
"biomes": "#minecraft:has_structure/ruined_portal_ocean", "biomes": "#minecraft:has_structure/ruined_portal_ocean",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"setups": [ "setups": [
{ {
"vines": false,
"can_be_cold": true,
"replace_with_blackstone": false,
"weight": 1.0,
"placement": "on_ocean_floor", "placement": "on_ocean_floor",
"air_pocket_probability": 0.0, "air_pocket_probability": 0.0,
"mossiness": 0.8, "mossiness": 0.8,
"overgrown": false "overgrown": false,
"vines": false,
"can_be_cold": true,
"replace_with_blackstone": false,
"weight": 1.0
} }
], ],
"type": "minecraft:ruined_portal" "type": "minecraft:ruined_portal"
}, },
"ruined_portal_swamp": { "minecraft:ruined_portal_swamp": {
"biomes": "#minecraft:has_structure/ruined_portal_swamp", "biomes": "#minecraft:has_structure/ruined_portal_swamp",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"setups": [ "setups": [
{ {
"vines": true,
"can_be_cold": false,
"replace_with_blackstone": false,
"weight": 1.0,
"placement": "on_ocean_floor", "placement": "on_ocean_floor",
"air_pocket_probability": 0.0, "air_pocket_probability": 0.0,
"mossiness": 0.5, "mossiness": 0.5,
"overgrown": false "overgrown": false,
"vines": true,
"can_be_cold": false,
"replace_with_blackstone": false,
"weight": 1.0
} }
], ],
"type": "minecraft:ruined_portal" "type": "minecraft:ruined_portal"
}, },
"shipwreck": { "minecraft:shipwreck": {
"biomes": "#minecraft:has_structure/shipwreck", "biomes": "#minecraft:has_structure/shipwreck",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"is_beached": false, "is_beached": false,
"type": "minecraft:shipwreck" "type": "minecraft:shipwreck"
}, },
"shipwreck_beached": { "minecraft:shipwreck_beached": {
"biomes": "#minecraft:has_structure/shipwreck_beached", "biomes": "#minecraft:has_structure/shipwreck_beached",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"is_beached": true, "is_beached": true,
"type": "minecraft:shipwreck" "type": "minecraft:shipwreck"
}, },
"stronghold": { "minecraft:stronghold": {
"biomes": "#minecraft:has_structure/stronghold", "biomes": "#minecraft:has_structure/stronghold",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"terrain_adaptation": "bury", "terrain_adaptation": "bury",
"type": "minecraft:stronghold" "type": "minecraft:stronghold"
}, },
"swamp_hut": { "minecraft:swamp_hut": {
"biomes": "#minecraft:has_structure/swamp_hut", "biomes": "#minecraft:has_structure/swamp_hut",
"spawn_overrides": { "spawn_overrides": {
"creature": { "creature": {
@@ -435,22 +435,72 @@
"step": "surface_structures", "step": "surface_structures",
"type": "minecraft:swamp_hut" "type": "minecraft:swamp_hut"
}, },
"trail_ruins": { "minecraft:trail_ruins": {
"use_expansion_hack": false,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"size": 7,
"start_height": {
"absolute": -15
},
"biomes": "#minecraft:has_structure/trail_ruins", "biomes": "#minecraft:has_structure/trail_ruins",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "underground_structures", "step": "underground_structures",
"terrain_adaptation": "bury", "terrain_adaptation": "bury",
"start_pool": "minecraft:trail_ruins/tower", "start_pool": "minecraft:trail_ruins/tower",
"size": 7,
"start_height": {
"absolute": -15
},
"use_expansion_hack": false,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"type": "minecraft:jigsaw" "type": "minecraft:jigsaw"
}, },
"trial_chambers": { "minecraft:trial_chambers": {
"biomes": "#minecraft:has_structure/trial_chambers",
"spawn_overrides": {
"ambient": {
"bounding_box": "piece",
"spawns": []
},
"axolotls": {
"bounding_box": "piece",
"spawns": []
},
"creature": {
"bounding_box": "piece",
"spawns": []
},
"misc": {
"bounding_box": "piece",
"spawns": []
},
"monster": {
"bounding_box": "piece",
"spawns": []
},
"underground_water_creature": {
"bounding_box": "piece",
"spawns": []
},
"water_ambient": {
"bounding_box": "piece",
"spawns": []
},
"water_creature": {
"bounding_box": "piece",
"spawns": []
}
},
"step": "underground_structures",
"terrain_adaptation": "encapsulate",
"start_pool": "minecraft:trial_chambers/chamber/end",
"size": 20,
"start_height": {
"min_inclusive": {
"absolute": -40
},
"max_inclusive": {
"absolute": -20
},
"type": "minecraft:uniform"
},
"use_expansion_hack": false,
"max_distance_from_center": 116,
"pool_aliases": [ "pool_aliases": [
{ {
"groups": [ "groups": [
@@ -545,131 +595,81 @@
], ],
"dimension_padding": 10, "dimension_padding": 10,
"liquid_settings": "ignore_waterlogging", "liquid_settings": "ignore_waterlogging",
"use_expansion_hack": false,
"max_distance_from_center": 116,
"size": 20,
"start_height": {
"min_inclusive": {
"absolute": -40
},
"max_inclusive": {
"absolute": -20
},
"type": "minecraft:uniform"
},
"biomes": "#minecraft:has_structure/trial_chambers",
"spawn_overrides": {
"ambient": {
"bounding_box": "piece",
"spawns": []
},
"axolotls": {
"bounding_box": "piece",
"spawns": []
},
"creature": {
"bounding_box": "piece",
"spawns": []
},
"misc": {
"bounding_box": "piece",
"spawns": []
},
"monster": {
"bounding_box": "piece",
"spawns": []
},
"underground_water_creature": {
"bounding_box": "piece",
"spawns": []
},
"water_ambient": {
"bounding_box": "piece",
"spawns": []
},
"water_creature": {
"bounding_box": "piece",
"spawns": []
}
},
"step": "underground_structures",
"terrain_adaptation": "encapsulate",
"start_pool": "minecraft:trial_chambers/chamber/end",
"type": "minecraft:jigsaw" "type": "minecraft:jigsaw"
}, },
"village_desert": { "minecraft:village_desert": {
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"size": 6,
"start_height": {
"absolute": 0
},
"biomes": "#minecraft:has_structure/village_desert", "biomes": "#minecraft:has_structure/village_desert",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"terrain_adaptation": "beard_thin", "terrain_adaptation": "beard_thin",
"start_pool": "minecraft:village/desert/town_centers", "start_pool": "minecraft:village/desert/town_centers",
"type": "minecraft:jigsaw"
},
"village_plains": {
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"size": 6, "size": 6,
"start_height": { "start_height": {
"absolute": 0 "absolute": 0
}, },
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"type": "minecraft:jigsaw"
},
"minecraft:village_plains": {
"biomes": "#minecraft:has_structure/village_plains", "biomes": "#minecraft:has_structure/village_plains",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"terrain_adaptation": "beard_thin", "terrain_adaptation": "beard_thin",
"start_pool": "minecraft:village/plains/town_centers", "start_pool": "minecraft:village/plains/town_centers",
"type": "minecraft:jigsaw"
},
"village_savanna": {
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"size": 6, "size": 6,
"start_height": { "start_height": {
"absolute": 0 "absolute": 0
}, },
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"type": "minecraft:jigsaw"
},
"minecraft:village_savanna": {
"biomes": "#minecraft:has_structure/village_savanna", "biomes": "#minecraft:has_structure/village_savanna",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"terrain_adaptation": "beard_thin", "terrain_adaptation": "beard_thin",
"start_pool": "minecraft:village/savanna/town_centers", "start_pool": "minecraft:village/savanna/town_centers",
"type": "minecraft:jigsaw"
},
"village_snowy": {
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"size": 6, "size": 6,
"start_height": { "start_height": {
"absolute": 0 "absolute": 0
}, },
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"type": "minecraft:jigsaw"
},
"minecraft:village_snowy": {
"biomes": "#minecraft:has_structure/village_snowy", "biomes": "#minecraft:has_structure/village_snowy",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"terrain_adaptation": "beard_thin", "terrain_adaptation": "beard_thin",
"start_pool": "minecraft:village/snowy/town_centers", "start_pool": "minecraft:village/snowy/town_centers",
"type": "minecraft:jigsaw"
},
"village_taiga": {
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"size": 6, "size": 6,
"start_height": { "start_height": {
"absolute": 0 "absolute": 0
}, },
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"type": "minecraft:jigsaw"
},
"minecraft:village_taiga": {
"biomes": "#minecraft:has_structure/village_taiga", "biomes": "#minecraft:has_structure/village_taiga",
"spawn_overrides": {}, "spawn_overrides": {},
"step": "surface_structures", "step": "surface_structures",
"terrain_adaptation": "beard_thin", "terrain_adaptation": "beard_thin",
"start_pool": "minecraft:village/taiga/town_centers", "start_pool": "minecraft:village/taiga/town_centers",
"size": 6,
"start_height": {
"absolute": 0
},
"use_expansion_hack": true,
"project_start_to_heightmap": "WORLD_SURFACE_WG",
"max_distance_from_center": 80,
"type": "minecraft:jigsaw" "type": "minecraft:jigsaw"
} }
} }

View File

@@ -1,4 +1,7 @@
use crate::math::{position::BlockPos, vector3::Vector3}; use crate::math::{
position::BlockPos,
vector3::{Axis, Vector3},
};
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]
pub struct BlockBox { pub struct BlockBox {
@@ -21,6 +24,21 @@ impl BlockBox {
}, },
} }
} }
pub fn create_box(
x: i32,
y: i32,
z: i32,
axis: Axis,
width: i32,
height: i32,
depth: i32,
) -> Self {
if axis == Axis::Z {
Self::new(x, y, z, x + width - 1, y + height - 1, z + depth - 1)
} else {
Self::new(x, y, z, x + depth - 1, y + height - 1, z + width - 1)
}
}
pub fn from_pos(pos: BlockPos) -> Self { pub fn from_pos(pos: BlockPos) -> Self {
Self { Self {

View File

@@ -69,17 +69,15 @@ pub fn get_decorator_seed(population_seed: u64, index: usize, step: usize) -> u6
} }
#[inline] #[inline]
pub fn get_region_seed(world_seed: u64, region_x: i32, region_z: i32, salt: i32) -> u64 { pub fn get_region_seed(world_seed: u64, region_x: i32, region_z: i32, salt: u32) -> u64 {
let region_x_long: u64 = region_x as u64; let x_part = (region_x as i64).wrapping_mul(341873128712) as u64;
let region_z_long: u64 = region_z as u64; let z_part = (region_z as i64).wrapping_mul(132897987541) as u64;
let salt_long: u64 = salt as u64;
region_x_long
.wrapping_mul(341873128712)
.wrapping_add(region_z_long.wrapping_mul(132897987541))
.wrapping_add(world_seed)
.wrapping_add(salt_long)
}
world_seed
.wrapping_add(x_part)
.wrapping_add(z_part)
.wrapping_add(salt as i64 as u64)
}
#[inline] #[inline]
pub fn get_carver_seed( pub fn get_carver_seed(
random: &mut RandomGenerator, random: &mut RandomGenerator,
@@ -152,8 +150,16 @@ pub fn hash_block_pos(x: i32, y: i32, z: i32) -> i64 {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::random::get_region_seed;
use super::hash_block_pos; use super::hash_block_pos;
#[test]
fn region_seed() {
let seed = get_region_seed(12345612, 1, 1, 14357620);
assert_eq!(seed, 474797819485)
}
#[test] #[test]
fn block_position_hash() { fn block_position_hash() {
let values: [((i32, i32, i32), i64); 8] = [ let values: [((i32, i32, i32), i64); 8] = [

View File

@@ -515,6 +515,8 @@ pub enum StagedChunkEnum {
Empty = 1, // EMPTY STRUCTURE_STARTS STRUCTURE_REFERENCES Empty = 1, // EMPTY STRUCTURE_STARTS STRUCTURE_REFERENCES
/// Chunk with biomes populated, ready for noise generation /// Chunk with biomes populated, ready for noise generation
Biomes, Biomes,
StructureStart,
StructureReferences,
/// Chunk with terrain noise generated, ready for surface building /// Chunk with terrain noise generated, ready for surface building
Noise, Noise,
/// Chunk with surface built, ready for features and structures /// Chunk with surface built, ready for features and structures
@@ -528,12 +530,14 @@ pub enum StagedChunkEnum {
impl From<u8> for StagedChunkEnum { impl From<u8> for StagedChunkEnum {
fn from(v: u8) -> Self { fn from(v: u8) -> Self {
match v { match v {
1 => Empty, 1 => Self::Empty,
2 => Biomes, 2 => Self::Biomes,
3 => Noise, 3 => Self::StructureStart,
4 => Surface, 4 => Self::StructureReferences,
5 => Features, 5 => Self::Noise,
6 => Full, 6 => Self::Surface,
7 => Self::Features,
8 => Self::Full,
_ => panic!(), _ => panic!(),
} }
} }
@@ -543,8 +547,8 @@ impl From<ChunkStatus> for StagedChunkEnum {
fn from(status: ChunkStatus) -> Self { fn from(status: ChunkStatus) -> Self {
match status { match status {
ChunkStatus::Empty => Empty, ChunkStatus::Empty => Empty,
ChunkStatus::StructureStarts => Empty, ChunkStatus::StructureStarts => StagedChunkEnum::StructureStart,
ChunkStatus::StructureReferences => Empty, ChunkStatus::StructureReferences => StagedChunkEnum::StructureReferences,
ChunkStatus::Biomes => Biomes, ChunkStatus::Biomes => Biomes,
ChunkStatus::Noise => Noise, ChunkStatus::Noise => Noise,
ChunkStatus::Surface => Surface, ChunkStatus::Surface => Surface,
@@ -561,12 +565,14 @@ impl From<ChunkStatus> for StagedChunkEnum {
impl From<StagedChunkEnum> for ChunkStatus { impl From<StagedChunkEnum> for ChunkStatus {
fn from(status: StagedChunkEnum) -> Self { fn from(status: StagedChunkEnum) -> Self {
match status { match status {
Empty => ChunkStatus::Empty, StagedChunkEnum::Empty => ChunkStatus::Empty,
Biomes => ChunkStatus::Biomes, StagedChunkEnum::StructureStart => ChunkStatus::StructureStarts,
Noise => ChunkStatus::Noise, StagedChunkEnum::StructureReferences => ChunkStatus::StructureReferences,
Surface => ChunkStatus::Surface, StagedChunkEnum::Biomes => ChunkStatus::Biomes,
Features => ChunkStatus::Features, StagedChunkEnum::Noise => ChunkStatus::Noise,
Full => ChunkStatus::Full, StagedChunkEnum::Surface => ChunkStatus::Surface,
StagedChunkEnum::Features => ChunkStatus::Features,
StagedChunkEnum::Full => ChunkStatus::Full,
_ => panic!(), _ => panic!(),
} }
} }
@@ -589,34 +595,40 @@ impl StagedChunkEnum {
const fn get_direct_radius(self) -> i32 { const fn get_direct_radius(self) -> i32 {
// self exclude // self exclude
match self { match self {
Empty => 0, Self::Empty => 0,
Biomes => 0, Self::StructureStart => 0,
Noise => 0, Self::StructureReferences => 0,
Surface => 0, Self::Biomes => 0,
Features => 1, Self::Noise => 0,
Full => 1, Self::Surface => 0,
Self::Features => 1,
Self::Full => 1,
_ => panic!(), _ => panic!(),
} }
} }
const fn get_write_radius(self) -> i32 { const fn get_write_radius(self) -> i32 {
// self exclude // self exclude
match self { match self {
Empty => 0, Self::Empty => 0,
Biomes => 0, Self::StructureStart => 0,
Noise => 0, Self::StructureReferences => 0,
Surface => 0, Self::Biomes => 0,
Features => 1, Self::Noise => 0,
Full => 0, Self::Surface => 0,
Self::Features => 1,
Self::Full => 0,
_ => panic!(), _ => panic!(),
} }
} }
const fn get_direct_dependencies(self) -> &'static [StagedChunkEnum] { const fn get_direct_dependencies(self) -> &'static [StagedChunkEnum] {
match self { match self {
Biomes => &[Empty], Self::Biomes => &[Self::Empty],
Noise => &[Biomes], Self::StructureStart => &[Self::Biomes],
Surface => &[Noise], Self::StructureReferences => &[Self::StructureStart],
Features => &[Surface, Surface], Self::Noise => &[Self::StructureReferences],
Full => &[Features, Features], Self::Surface => &[Self::Noise],
Self::Features => &[Self::Surface, Self::Surface],
Self::Full => &[Self::Features, Self::Features],
_ => panic!(), _ => panic!(),
} }
} }
@@ -754,7 +766,7 @@ impl Chunk {
fn get_stage_id(&self) -> u8 { fn get_stage_id(&self) -> u8 {
match self { match self {
Chunk::Proto(data) => data.stage_id(), Chunk::Proto(data) => data.stage_id(),
Chunk::Level(_) => 6, Chunk::Level(_) => 8,
} }
} }
fn get_proto_chunk_mut(&mut self) -> &mut ProtoChunk { fn get_proto_chunk_mut(&mut self) -> &mut ProtoChunk {
@@ -1103,6 +1115,12 @@ impl Cache {
let mid = ((self.size * self.size) >> 1) as usize; let mid = ((self.size * self.size) >> 1) as usize;
match stage { match stage {
Empty => panic!("empty stage"), Empty => panic!("empty stage"),
StagedChunkEnum::StructureStart => self.chunks[mid]
.get_proto_chunk_mut()
.set_structure_starts(random_config),
StagedChunkEnum::StructureReferences => self.chunks[mid]
.get_proto_chunk_mut()
.set_structure_references(),
Biomes => self.chunks[mid] Biomes => self.chunks[mid]
.get_proto_chunk_mut() .get_proto_chunk_mut()
.step_to_biomes(dimension, noise_router), .step_to_biomes(dimension, noise_router),
@@ -1125,7 +1143,7 @@ impl Cache {
self.chunks[mid].get_proto_chunk_mut().stage = Full; self.chunks[mid].get_proto_chunk_mut().stage = Full;
self.chunks[mid].upgrade_to_level_chunk(settings); self.chunks[mid].upgrade_to_level_chunk(settings);
} }
_ => panic!("unknown stage {stage:?}"), StagedChunkEnum::None => {}
} }
} }
} }
@@ -1213,7 +1231,7 @@ struct ChunkHolder {
pub occupied: NodeKey, pub occupied: NodeKey,
pub occupied_by: EdgeKey, pub occupied_by: EdgeKey,
pub public: bool, pub public: bool,
pub tasks: [NodeKey; 7], pub tasks: [NodeKey; 9],
} }
impl Default for ChunkHolder { impl Default for ChunkHolder {
@@ -1225,7 +1243,7 @@ impl Default for ChunkHolder {
occupied: NodeKey::null(), occupied: NodeKey::null(),
occupied_by: EdgeKey::null(), occupied_by: EdgeKey::null(),
public: false, public: false,
tasks: [NodeKey::null(); 7], tasks: [NodeKey::null(); 9],
} }
} }
} }

View File

@@ -136,6 +136,7 @@ pub struct ProtoChunk {
pub flat_motion_blocking_no_leaves_height_map: Box<[i16]>, pub flat_motion_blocking_no_leaves_height_map: Box<[i16]>,
// may want to use chunk status // may want to use chunk status
structure_starts: HashMap<Structure, StructureInstance>, structure_starts: HashMap<Structure, StructureInstance>,
// Height of the chunk for indexing // Height of the chunk for indexing
height: u16, height: u16,
bottom_y: i8, bottom_y: i8,
@@ -479,7 +480,6 @@ impl ProtoChunk {
} }
pub fn step_to_biomes(&mut self, dimension: Dimension, noise_router: &ProtoNoiseRouters) { pub fn step_to_biomes(&mut self, dimension: Dimension, noise_router: &ProtoNoiseRouters) {
debug_assert_eq!(self.stage, StagedChunkEnum::Empty);
let start_x = start_block_x(self.x); let start_x = start_block_x(self.x);
let start_z = start_block_z(self.z); let start_z = start_block_z(self.z);
let horizontal_biome_end = biome_coords::from_block(16); let horizontal_biome_end = biome_coords::from_block(16);
@@ -501,7 +501,7 @@ impl ProtoChunk {
random_config: &GlobalRandomConfig, random_config: &GlobalRandomConfig,
noise_router: &ProtoNoiseRouters, noise_router: &ProtoNoiseRouters,
) { ) {
debug_assert_eq!(self.stage, StagedChunkEnum::Biomes); //debug_assert_eq!(self.stage, StagedChunkEnum::Biomes);
let generation_shape = &settings.shape; let generation_shape = &settings.shape;
let horizontal_cell_count = CHUNK_DIM / generation_shape.horizontal_cell_block_count(); let horizontal_cell_count = CHUNK_DIM / generation_shape.horizontal_cell_block_count();
@@ -913,17 +913,14 @@ impl ProtoChunk {
let _chunk_box = chunk.get_block_box_for_chunk(); let _chunk_box = chunk.get_block_box_for_chunk();
for (_structure_config, instance) in chunk.structure_starts.clone() { for (_structure_config, instance) in chunk.structure_starts.clone() {
dbg!("generating");
match instance { match instance {
StructureInstance::Start(pos, _stype) => { StructureInstance::Start(pos, _stype) => {
// Use the collector directly to place blocks // Use the collector directly to place blocks
pos.collector pos.collector
.generate_in_chunk(chunk, random_config.seed as i64); .generate_in_chunk(chunk, random_config.seed as i64);
} }
StructureInstance::Reference(_start_block_pos) => { StructureInstance::Reference(_start_block_pos) => {}
// In Minecraft, a Reference tells the engine to look up the
// "Start" data from the chunk at start_block_pos and generate its pieces here.
// If you are only generating "Starts" for now, this can be a TODO.
}
} }
} }
// TODO: This needs to be different depending on what biomes are in the chunk -> affects the // TODO: This needs to be different depending on what biomes are in the chunk -> affects the
@@ -947,42 +944,40 @@ impl ProtoChunk {
} }
pub fn set_structure_starts(&mut self, random_config: &GlobalRandomConfig) { pub fn set_structure_starts(&mut self, random_config: &GlobalRandomConfig) {
for (name, set) in STRUCTURE_SETS.iter() { for (_set_name, set) in STRUCTURE_SETS.iter() {
let calculator = StructurePlacementCalculator { let calculator = StructurePlacementCalculator {
seed: random_config.seed as i64, seed: random_config.seed as i64,
}; };
// 1. Check if the placement allows a structure to start in THIS specific chunk
if !set.placement.should_generate(calculator, self.x, self.z) { if !set.placement.should_generate(calculator, self.x, self.z) {
continue; continue;
} }
if set.structures.len() == 1
// 2. Iterate through potential structures in the set && let Some(structure_entry) = set.structures.first()
for structure_entry in &set.structures { {
// FIX: Pass the 'name', 'seed', 'coords', and 'self' (the ProtoChunk)
let position = structure_entry.structure.try_generate( let position = structure_entry.structure.try_generate(
name,
random_config.seed as i64, random_config.seed as i64,
self.x, self.x,
self.z, self.z,
self, self,
); );
if let Some(pos) = position { if let Some(pos) = position
// Ensure the structure config exists in our registry && let Some(structure_config) = STRUCTURES.get(&structure_entry.structure)
if let Some(structure_config) = STRUCTURES.get(name) { {
// Minecraft logic: Insert the START in the origin chunk self.structure_starts.insert(
self.structure_starts.insert( structure_config.clone(),
structure_config.clone(), StructureInstance::Start(pos, structure_entry.structure.clone()),
StructureInstance::Start(pos, structure_entry.structure.clone()), );
);
// Minecraft optimization: Usually only one structure start per chunk
return;
}
} }
} }
// TODO add weight
} }
self.stage = StagedChunkEnum::StructureStart;
}
pub fn set_structure_references(&mut self) {
self.stage = StagedChunkEnum::StructureReferences;
} }
fn get_block_box_for_chunk(&self) -> BlockBox { fn get_block_box_for_chunk(&self) -> BlockBox {

View File

@@ -6,11 +6,14 @@ use serde::Deserialize;
use crate::{ use crate::{
ProtoChunk, ProtoChunk,
generation::structure::{ generation::{
placement::StructurePlacement, biome_coords,
structures::{ structure::{
StructureGenerator, StructurePosition, buried_treasure::BuriedTreasureGenerator, placement::StructurePlacement,
nether_fortress::NetherFortressGenerator, structures::{
StructureGenerator, StructurePosition, buried_treasure::BuriedTreasureGenerator,
nether_fortress::NetherFortressGenerator, swamp_hut::SwampHutGenerator,
},
}, },
}, },
}; };
@@ -21,55 +24,169 @@ pub mod structures;
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct StructureSet { pub struct StructureSet {
pub placement: StructurePlacement, pub placement: StructurePlacement,
pub structures: Vec<Structures>, pub structures: Vec<WeightedEntry>,
} }
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct Structures { pub struct WeightedEntry {
pub structure: StructureType, pub structure: StructureKeys,
pub weight: u32,
} }
#[derive(Deserialize, Clone)] #[derive(Deserialize, Clone)]
pub enum StructureType { pub enum StructureType {
#[serde(rename = "minecraft:buried_treasure")] #[serde(rename = "minecraft:buried_treasure")]
BuriedTreasure(BuriedTreasureGenerator), BuriedTreasure(BuriedTreasureGenerator),
#[serde(rename = "minecraft:desert_pyramid")]
DesertPyramid,
#[serde(rename = "minecraft:end_city")]
EndCity,
#[serde(rename = "minecraft:fortress")] #[serde(rename = "minecraft:fortress")]
NetherFortress(NetherFortressGenerator), NetherFortress(NetherFortressGenerator),
#[serde(rename = "minecraft:igloo")]
Igloo,
#[serde(rename = "minecraft:jigsaw")]
Jigsaw,
#[serde(rename = "minecraft:jungle_temple")]
JungleTemple,
#[serde(rename = "minecraft:mineshaft")]
Mineshaft,
#[serde(rename = "minecraft:nether_fossil")]
NetherFossil,
#[serde(rename = "minecraft:ocean_monument")]
OceanMonument,
#[serde(rename = "minecraft:ocean_ruin")]
OceanRuin,
#[serde(rename = "minecraft:ruined_portal")]
RuinedPortal,
#[serde(rename = "minecraft:shipwreck")]
Shipwreck,
#[serde(rename = "minecraft:stronghold")]
Stronghold,
#[serde(rename = "minecraft:swamp_hut")]
SwampHut(SwampHutGenerator),
#[serde(rename = "minecraft:woodland_mansion")]
WoodlandMansion,
} }
impl StructureType { #[derive(Deserialize, Clone, PartialEq, Eq, Hash)]
pub enum StructureKeys {
#[serde(rename = "minecraft:pillager_outpost")]
PillagerOutpost,
#[serde(rename = "minecraft:mineshaft")]
Mineshaft,
#[serde(rename = "minecraft:mineshaft_mesa")]
MineshaftMesa,
#[serde(rename = "minecraft:mansion")]
Mansion,
#[serde(rename = "minecraft:jungle_pyramid")]
JunglePyramid,
#[serde(rename = "minecraft:desert_pyramid")]
DesertPyramid,
#[serde(rename = "minecraft:igloo")]
Igloo,
#[serde(rename = "minecraft:shipwreck")]
Shipwreck,
#[serde(rename = "minecraft:shipwreck_beached")]
ShipwreckBeached,
#[serde(rename = "minecraft:swamp_hut")]
SwampHut,
#[serde(rename = "minecraft:stronghold")]
Stronghold,
#[serde(rename = "minecraft:monument")]
Monument,
#[serde(rename = "minecraft:ocean_ruin_cold")]
OceanRuinCold,
#[serde(rename = "minecraft:ocean_ruin_warm")]
OceanRuinWarm,
#[serde(rename = "minecraft:fortress")]
Fortress,
#[serde(rename = "minecraft:nether_fossil")]
NetherFossil,
#[serde(rename = "minecraft:end_city")]
EndCity,
#[serde(rename = "minecraft:buried_treasure")]
BuriedTreasure,
#[serde(rename = "minecraft:bastion_remnant")]
BastionRemnant,
#[serde(rename = "minecraft:village_plains")]
VillagePlains,
#[serde(rename = "minecraft:village_desert")]
VillageDesert,
#[serde(rename = "minecraft:village_savanna")]
VillageSavanna,
#[serde(rename = "minecraft:village_snowy")]
VillageSnowy,
#[serde(rename = "minecraft:village_taiga")]
VillageTaiga,
#[serde(rename = "minecraft:ruined_portal")]
RuinedPortal,
#[serde(rename = "minecraft:ruined_portal_desert")]
RuinedPortalDesert,
#[serde(rename = "minecraft:ruined_portal_jungle")]
RuinedPortalJungle,
#[serde(rename = "minecraft:ruined_portal_swamp")]
RuinedPortalSwamp,
#[serde(rename = "minecraft:ruined_portal_mountain")]
RuinedPortalMountain,
#[serde(rename = "minecraft:ruined_portal_ocean")]
RuinedPortalOcean,
#[serde(rename = "minecraft:ruined_portal_nether")]
RuinedPortalNether,
#[serde(rename = "minecraft:ancient_city")]
AncientCity,
#[serde(rename = "minecraft:trail_ruins")]
TrailRuins,
#[serde(rename = "minecraft:trial_chambers")]
TrialChambers,
}
#[derive(Deserialize, Clone)]
pub struct EmptyStruct {}
impl StructureKeys {
pub fn try_generate( pub fn try_generate(
&self, &self,
name: &str,
seed: i64, seed: i64,
chunk_x: i32, chunk_x: i32,
chunk_z: i32, chunk_z: i32,
chunk_ref_for_biomes: &ProtoChunk, chunk_ref_for_biomes: &ProtoChunk,
) -> Option<StructurePosition> { ) -> Option<StructurePosition> {
let structure_pos = match self { let structure_pos = match self {
StructureType::BuriedTreasure(generator) => { StructureKeys::BuriedTreasure => BuriedTreasureGenerator::get_structure_position(
generator.try_generate(seed, chunk_x, chunk_z) &BuriedTreasureGenerator,
} seed,
StructureType::NetherFortress(generator) => { chunk_x,
generator.try_generate(seed, chunk_x, chunk_z) chunk_z,
} ),
StructureKeys::Fortress => NetherFortressGenerator::get_structure_position(
&NetherFortressGenerator,
seed,
chunk_x,
chunk_z,
),
StructureKeys::SwampHut => SwampHutGenerator::get_structure_position(
&SwampHutGenerator,
seed,
chunk_x,
chunk_z,
),
// TODO
_ => None,
}; };
if let Some(pos) = structure_pos if let Some(pos) = structure_pos
&& let Some(structure_data) = STRUCTURES.get(name) && let Some(structure_data) = STRUCTURES.get(self)
{ {
// Get the biome at the structure's starting position // Get the biome at the structure's starting position
let current_biome = chunk_ref_for_biomes.get_biome( let current_biome = chunk_ref_for_biomes.get_biome(
pos.start_pos.0.x, biome_coords::from_block(pos.start_pos.0.x),
pos.start_pos.0.y, biome_coords::from_block(pos.start_pos.0.y),
pos.start_pos.0.z, biome_coords::from_block(pos.start_pos.0.z),
); );
let biomes = Biome::get_tag_values(&structure_data.biomes).unwrap();
// Check if the biome is allowed for this structure // Check if the biome is allowed for this structure
if Biome::get_tag_values(&structure_data.biomes) if biomes.contains(&current_biome.registry_id) {
.unwrap_or_default()
.contains(&current_biome.registry_id)
{
return Some(pos); return Some(pos);
} }
} }
@@ -91,8 +208,8 @@ pub struct Structure {
biomes: String, biomes: String,
} }
pub static STRUCTURES: LazyLock<HashMap<String, Structure>> = LazyLock::new( pub static STRUCTURES: LazyLock<HashMap<StructureKeys, Structure>> = LazyLock::new(
|| include_json_static!("../../../../assets/structures.json", HashMap<String, Structure>), || include_json_static!("../../../../assets/structures.json", HashMap<StructureKeys, Structure>),
); );
pub static STRUCTURE_SETS: LazyLock<HashMap<String, StructureSet>> = LazyLock::new( pub static STRUCTURE_SETS: LazyLock<HashMap<String, StructureSet>> = LazyLock::new(

View File

@@ -1,7 +1,8 @@
use pumpkin_util::{ use pumpkin_util::{
math::floor_div, math::floor_div,
random::{ random::{
RandomGenerator, RandomImpl, get_carver_seed, get_region_seed, xoroshiro128::Xoroshiro, RandomGenerator, RandomImpl, get_carver_seed, get_region_seed, legacy_rand::LegacyRand,
xoroshiro128::Xoroshiro,
}, },
}; };
use serde::Deserialize; use serde::Deserialize;
@@ -10,7 +11,7 @@ use serde::Deserialize;
pub struct StructurePlacement { pub struct StructurePlacement {
frequency_reduction_method: Option<FrequencyReductionMethod>, frequency_reduction_method: Option<FrequencyReductionMethod>,
frequency: Option<f32>, frequency: Option<f32>,
salt: i32, salt: u32,
#[serde(flatten)] #[serde(flatten)]
r#type: StructurePlacementType, r#type: StructurePlacementType,
} }
@@ -43,8 +44,11 @@ impl StructurePlacement {
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
pub enum FrequencyReductionMethod { pub enum FrequencyReductionMethod {
Default, Default,
#[serde(rename = "legacy_type_1")]
LegacyType1, LegacyType1,
#[serde(rename = "legacy_type_2")]
LegacyType2, LegacyType2,
#[serde(rename = "legacy_type_3")]
LegacyType3, LegacyType3,
} }
@@ -54,7 +58,7 @@ impl FrequencyReductionMethod {
seed: i64, seed: i64,
chunk_x: i32, chunk_x: i32,
chunk_z: i32, chunk_z: i32,
salt: i32, salt: u32,
frequency: f32, frequency: f32,
) -> bool { ) -> bool {
match self { match self {
@@ -105,7 +109,7 @@ impl StructurePlacementType {
calculator: &StructurePlacementCalculator, calculator: &StructurePlacementCalculator,
chunk_x: i32, chunk_x: i32,
chunk_z: i32, chunk_z: i32,
salt: i32, salt: u32,
) -> bool { ) -> bool {
match self { match self {
StructurePlacementType::RandomSpread(placement) => { StructurePlacementType::RandomSpread(placement) => {
@@ -120,7 +124,7 @@ impl StructurePlacementType {
pub struct RandomSpreadStructurePlacement { pub struct RandomSpreadStructurePlacement {
spacing: i32, spacing: i32,
separation: i32, separation: i32,
spread_type: SpreadType, spread_type: Option<SpreadType>,
} }
#[derive(Deserialize)] #[derive(Deserialize)]
@@ -142,14 +146,15 @@ impl SpreadType {
} }
impl RandomSpreadStructurePlacement { impl RandomSpreadStructurePlacement {
fn get_start_chunk(&self, seed: i64, chunk_x: i32, chunk_z: i32, salt: i32) -> (i32, i32) { fn get_start_chunk(&self, seed: i64, chunk_x: i32, chunk_z: i32, salt: u32) -> (i32, i32) {
let x = floor_div(chunk_x, self.spacing); let x = floor_div(chunk_x, self.spacing);
let z = floor_div(chunk_z, self.spacing); let z = floor_div(chunk_z, self.spacing);
let region_seed = get_region_seed(seed as u64, x, z, salt); let region_seed = get_region_seed(seed as u64, x, z, salt);
let mut random = RandomGenerator::Xoroshiro(Xoroshiro::from_seed(region_seed)); let mut random = RandomGenerator::Legacy(LegacyRand::from_seed(region_seed));
let bound = self.spacing - self.separation; let bound = self.spacing - self.separation;
let rand_x = self.spread_type.get(&mut random, bound); let spread_type = self.spread_type.as_ref().unwrap_or(&SpreadType::Linear);
let rand_z = self.spread_type.get(&mut random, bound); let rand_x = spread_type.get(&mut random, bound);
let rand_z = spread_type.get(&mut random, bound);
(x * self.spacing + rand_x, z * self.spacing + rand_z) (x * self.spacing + rand_x, z * self.spacing + rand_z)
} }
@@ -158,7 +163,7 @@ impl RandomSpreadStructurePlacement {
calculator: &StructurePlacementCalculator, calculator: &StructurePlacementCalculator,
chunk_x: i32, chunk_x: i32,
chunk_z: i32, chunk_z: i32,
salt: i32, salt: u32,
) -> bool { ) -> bool {
let pos = self.get_start_chunk(calculator.seed, chunk_x, chunk_z, salt); let pos = self.get_start_chunk(calculator.seed, chunk_x, chunk_z, salt);
(chunk_x == pos.0) && (chunk_z == pos.1) (chunk_x == pos.0) && (chunk_z == pos.1)
@@ -168,3 +173,31 @@ impl RandomSpreadStructurePlacement {
pub struct StructurePlacementCalculator { pub struct StructurePlacementCalculator {
pub seed: i64, pub seed: i64,
} }
#[cfg(test)]
mod tests {
use pumpkin_util::random::{
RandomGenerator, RandomImpl, get_region_seed, legacy_rand::LegacyRand,
};
use crate::generation::structure::placement::RandomSpreadStructurePlacement;
#[test]
fn test_get_start_chunk_random() {
let region_seed = get_region_seed(123, 1, 1, 14357620);
let mut random = RandomGenerator::Legacy(LegacyRand::from_seed(region_seed));
assert_eq!(random.next_bounded_i32(32 - 8), 8)
}
#[test]
fn test_get_start_chunk() {
let random = RandomSpreadStructurePlacement {
spacing: 32,
separation: 8,
spread_type: None,
};
let (x, z) = random.get_start_chunk(123, 1, 1, 14357620);
assert_eq!(x, 5);
assert_eq!(z, 4);
}
}

View File

@@ -19,7 +19,12 @@ use crate::{
pub struct BuriedTreasureGenerator; pub struct BuriedTreasureGenerator;
impl StructureGenerator for BuriedTreasureGenerator { impl StructureGenerator for BuriedTreasureGenerator {
fn try_generate(&self, _seed: i64, chunk_x: i32, chunk_z: i32) -> Option<StructurePosition> { fn get_structure_position(
&self,
_seed: i64,
chunk_x: i32,
chunk_z: i32,
) -> Option<StructurePosition> {
let x = get_center_x(chunk_x); let x = get_center_x(chunk_x);
let z = get_center_z(chunk_z); let z = get_center_z(chunk_z);

View File

@@ -5,7 +5,7 @@ use pumpkin_util::math::{block_box::BlockBox, position::BlockPos, vector3::Vecto
use crate::{ use crate::{
ProtoChunk, ProtoChunk,
generation::{height_limit::HeightLimitView, structure::StructureType}, generation::{height_limit::HeightLimitView, structure::StructureKeys},
}; };
pub mod buried_treasure; pub mod buried_treasure;
@@ -101,8 +101,6 @@ pub fn fill_downwards(x: i32, y: i32, z: i32, state: &BlockState, chunk: &mut Pr
let start_y = y; let start_y = y;
let end_y = chunk.bottom_y() as i32; // e.g. -64 let end_y = chunk.bottom_y() as i32; // e.g. -64
// FIX: Use .rev() because ranges like 60..-64 are empty.
// Also, usually you want to stop if you hit a solid block (optional, depends on need).
for current_y in (end_y..=start_y).rev() { for current_y in (end_y..=start_y).rev() {
chunk.set_block_state(&Vector3::new(x, current_y, z), state); chunk.set_block_state(&Vector3::new(x, current_y, z), state);
} }
@@ -160,13 +158,18 @@ pub struct StructurePosition {
} }
pub trait StructureGenerator { pub trait StructureGenerator {
fn try_generate(&self, seed: i64, chunk_x: i32, chunk_z: i32) -> Option<StructurePosition>; fn get_structure_position(
&self,
seed: i64,
chunk_x: i32,
chunk_z: i32,
) -> Option<StructurePosition>;
} }
#[derive(Clone)] #[derive(Clone)]
pub enum StructureInstance { pub enum StructureInstance {
/// This chunk is the "owner" of the structure. /// This chunk is the "owner" of the structure.
Start(StructurePosition, StructureType), Start(StructurePosition, StructureKeys),
/// This chunk just contains a piece of a structure starting elsewhere. /// This chunk just contains a piece of a structure starting elsewhere.
/// Stores the BlockPos of the 'Start' so you can look it up. /// Stores the BlockPos of the 'Start' so you can look it up.
Reference(BlockPos), Reference(BlockPos),

View File

@@ -17,7 +17,12 @@ use crate::{
pub struct NetherFortressGenerator; pub struct NetherFortressGenerator;
impl StructureGenerator for NetherFortressGenerator { impl StructureGenerator for NetherFortressGenerator {
fn try_generate(&self, _seed: i64, chunk_x: i32, chunk_z: i32) -> Option<StructurePosition> { fn get_structure_position(
&self,
_seed: i64,
chunk_x: i32,
chunk_z: i32,
) -> Option<StructurePosition> {
let start_x = chunk_pos::start_block_x(chunk_x); let start_x = chunk_pos::start_block_x(chunk_x);
let start_z = chunk_pos::start_block_z(chunk_z); let start_z = chunk_pos::start_block_z(chunk_z);
let start_y = 64; let start_y = 64;

View File

@@ -1,7 +1,11 @@
use pumpkin_data::Block; use pumpkin_data::Block;
use pumpkin_util::{ use pumpkin_util::{
HeightMap, HeightMap,
math::{block_box::BlockBox, position::BlockPos, vector3::Vector3}, math::{
block_box::BlockBox,
position::BlockPos,
vector3::{Axis, Vector3},
},
}; };
use serde::Deserialize; use serde::Deserialize;
@@ -20,14 +24,17 @@ use crate::{
pub struct SwampHutGenerator; pub struct SwampHutGenerator;
impl StructureGenerator for SwampHutGenerator { impl StructureGenerator for SwampHutGenerator {
fn try_generate(&self, _seed: i64, chunk_x: i32, chunk_z: i32) -> Option<StructurePosition> { fn get_structure_position(
&self,
_seed: i64,
chunk_x: i32,
chunk_z: i32,
) -> Option<StructurePosition> {
let x = get_center_x(chunk_x); let x = get_center_x(chunk_x);
let z = get_center_z(chunk_z); let z = get_center_z(chunk_z);
let box_min_x = x;
let box_min_z = z;
let bounding_box = // TODO: random axis
BlockBox::new(box_min_x, 60, box_min_z, box_min_x + 7, 80, box_min_z + 7); let bounding_box = BlockBox::create_box(x, 64, z, Axis::X, 7, 7, 9);
let mut collector = StructurePiecesCollector::default(); let mut collector = StructurePiecesCollector::default();
collector.add_piece(Box::new(SwampHutPiece { bounding_box })); collector.add_piece(Box::new(SwampHutPiece { bounding_box }));
@@ -50,62 +57,148 @@ impl StructurePiece for SwampHutPiece {
} }
fn place(&self, chunk: &mut ProtoChunk, _seed: i64) { fn place(&self, chunk: &mut ProtoChunk, _seed: i64) {
let origin_x = self.bounding_box.min.x; let min = self.bounding_box.min;
let origin_z = self.bounding_box.min.z; let origin_x = min.x;
let origin_z = min.z;
// Find surface height (approximate, usually slightly submerged in swamp) // Vanilla uses adjustToAverageHeight.
let floor_y = chunk.get_top_y(&HeightMap::OceanFloorWg, origin_x + 3, origin_z + 3) + 3; // +3 to lift it up let surface_y = chunk.get_top_y(&HeightMap::OceanFloorWg, origin_x + 3, origin_z + 3);
let origin_y = surface_y + 1;
let origin_y = floor_y; let spruce_planks = &Block::SPRUCE_PLANKS.default_state;
let oak_log = &Block::OAK_LOG.default_state;
let oak_fence = &Block::OAK_FENCE.default_state;
let air = &Block::AIR.default_state;
let fill_rel = |min_x, min_y, min_z, max_x, max_y, max_z, block, c: &mut ProtoChunk| { // 1. THE FLOOR
fill(
origin_x + 1,
origin_y + 1,
origin_z + 1,
origin_x + 5,
origin_y + 1,
origin_z + 7,
spruce_planks,
chunk,
);
// 2. THE CEILING
fill(
origin_x + 1,
origin_y + 4,
origin_z + 2,
origin_x + 5,
origin_y + 4,
origin_z + 7,
spruce_planks,
chunk,
);
// 3. THE ENTRANCE PLATFORM
fill(
origin_x + 2,
origin_y + 1,
origin_z,
origin_x + 4,
origin_y + 1,
origin_z,
spruce_planks,
chunk,
);
// Front Wall
fill(
origin_x + 2,
origin_y + 2,
origin_z + 2,
origin_x + 3,
origin_y + 3,
origin_z + 2,
spruce_planks,
chunk,
);
// Left Wall
fill(
origin_x + 1,
origin_y + 2,
origin_z + 3,
origin_x + 1,
origin_y + 3,
origin_z + 6,
spruce_planks,
chunk,
);
// Right Wall
fill(
origin_x + 5,
origin_y + 2,
origin_z + 3,
origin_x + 5,
origin_y + 3,
origin_z + 6,
spruce_planks,
chunk,
);
// Back Wall
fill(
origin_x + 2,
origin_y + 2,
origin_z + 7,
origin_x + 4,
origin_y + 3,
origin_z + 7,
spruce_planks,
chunk,
);
// 5. THE LOGS
let logs = [(1, 2), (5, 2), (1, 7), (5, 7)];
for (lx, lz) in logs {
fill( fill(
origin_x + min_x, origin_x + lx,
origin_y + min_y, origin_y,
origin_z + min_z, origin_z + lz,
origin_x + max_x, origin_x + lx,
origin_y + max_y, origin_y + 3,
origin_z + max_z, origin_z + lz,
block, oak_log,
c, chunk,
) );
}; fill_downwards(origin_x + lx, origin_y - 1, origin_z + lz, oak_log, chunk);
let offset = |x, y, z| Vector3::new(origin_x + x, origin_y + y, origin_z + z);
// 1. Stilts (Logs downwards)
let spruce_log = &Block::SPRUCE_LOG.default_state;
let stilts = [(1, 1), (1, 6), (6, 1), (6, 6)];
for (sx, sz) in stilts {
fill_downwards(origin_x + sx, origin_y, origin_z + sz, spruce_log, chunk);
} }
// 2. Main Platform (Spruce Planks) // Placed at Y=2 (feet level) or Y=3 (eye level)
let spruce_planks = &Block::SPRUCE_PLANKS.default_state; let y_floor = origin_y + 2;
fill_rel(0, 0, 0, 7, 0, 7, spruce_planks, chunk); let y_eye = origin_y + 3;
// 3. Walls chunk.set_block_state(
fill_rel(0, 1, 0, 7, 3, 0, spruce_planks, chunk); // North &Vector3::new(origin_x + 3, y_floor, origin_z + 6),
fill_rel(0, 1, 7, 7, 3, 7, spruce_planks, chunk); // South Block::CRAFTING_TABLE.default_state,
fill_rel(0, 1, 0, 0, 3, 7, spruce_planks, chunk); // West );
fill_rel(7, 1, 0, 7, 3, 7, spruce_planks, chunk); // East chunk.set_block_state(
&Vector3::new(origin_x + 4, y_floor, origin_z + 6),
Block::CAULDRON.default_state,
);
chunk.set_block_state(
&Vector3::new(origin_x + 1, y_eye, origin_z + 5),
Block::POTTED_RED_MUSHROOM.default_state,
);
// 4. Roof (Simple block roof for now, stairs are complex without proper state orientation helpers) // Fences & Gaps
fill_rel(0, 4, 0, 7, 4, 7, spruce_planks, chunk); chunk.set_block_state(&Vector3::new(origin_x + 2, y_eye, origin_z + 2), oak_fence); // Above the door
fill_rel(1, 5, 1, 6, 5, 6, spruce_planks, chunk); chunk.set_block_state(&Vector3::new(origin_x + 3, y_eye, origin_z + 7), oak_fence); // Back window
chunk.set_block_state(
&Vector3::new(origin_x + 1, y_floor, origin_z + 1),
oak_fence,
); // Balcony left
chunk.set_block_state(
&Vector3::new(origin_x + 5, y_floor, origin_z + 1),
oak_fence,
); // Balcony right
// 5. Windows/Air // Clear window air (Java: addBlock AIR at 1, 3, 4 and 5, 3, 4/5)
fill_rel(1, 1, 1, 6, 3, 6, Block::AIR.default_state, chunk); // Clear inside chunk.set_block_state(&Vector3::new(origin_x + 1, y_eye, origin_z + 4), air);
chunk.set_block_state(&Vector3::new(origin_x + 5, y_eye, origin_z + 4), air);
// 6. Interior Decorations chunk.set_block_state(&Vector3::new(origin_x + 5, y_eye, origin_z + 5), air);
chunk.set_block_state(&offset(2, 1, 2), Block::CRAFTING_TABLE.default_state);
chunk.set_block_state(&offset(2, 1, 3), Block::CAULDRON.default_state);
// Note: Flower Pot usually requires block entity data or specific state, simplifying here
chunk.set_block_state(&offset(5, 1, 3), Block::POTTED_BLUE_ORCHID.default_state);
// Fence on balcony
chunk.set_block_state(&offset(3, 1, 0), Block::OAK_FENCE.default_state);
} }
} }