chore: add pumpkin_macros::translate_cross! macro

validates translations at compile time, also update bedrock translations to latest 26.40.5
This commit is contained in:
Alexander Medvedev 2026-08-10 18:11:00 +02:00
parent 366c9cb323
commit 1ee7be3f8c
46 changed files with 42552 additions and 1144 deletions

359
Cargo.lock generated
View File

@ -40,9 +40,9 @@ dependencies = [
[[package]]
name = "aes"
version = "0.9.1"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1fc76eaeac4c9164506c466d4ffdd8ec9d0c5bf57ee97177c4d8eceb3a0e138"
checksum = "f8eb277bec05f56a0e0591f155a484cbd0f4f07ff2905051a48c72f004f7ed58"
dependencies = [
"cipher 0.5.2",
"cpubits",
@ -65,9 +65,9 @@ dependencies = [
[[package]]
name = "aho-corasick"
version = "1.1.4"
version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
dependencies = [
"memchr",
]
@ -179,9 +179,9 @@ dependencies = [
[[package]]
name = "async-trait"
version = "0.1.91"
version = "0.1.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec"
checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667"
dependencies = [
"proc-macro2",
"quote",
@ -439,9 +439,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.3.0"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8"
checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e"
dependencies = [
"find-msvc-tools",
"jobserver",
@ -573,18 +573,18 @@ dependencies = [
[[package]]
name = "clap"
version = "4.6.4"
version = "4.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7"
checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca"
dependencies = [
"clap_builder",
]
[[package]]
name = "clap_builder"
version = "4.6.2"
version = "4.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b"
checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889"
dependencies = [
"anstyle",
"clap_lex",
@ -617,7 +617,7 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1"
dependencies = [
"thiserror 2.0.19",
"thiserror 2.0.20",
]
[[package]]
@ -699,9 +699,9 @@ checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c"
[[package]]
name = "cookie"
version = "0.18.1"
version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87"
dependencies = [
"percent-encoding",
"time",
@ -761,27 +761,27 @@ dependencies = [
[[package]]
name = "cranelift-assembler-x64"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f0435c6939d6ef218bf0a3063094f2cc5c46f7a44a88f81cf932da8d3922ff8"
checksum = "d552bd33b7a56dc70aeb1e1c960e51a218fa0db50f23873b500a310379450b2d"
dependencies = [
"cranelift-assembler-x64-meta",
]
[[package]]
name = "cranelift-assembler-x64-meta"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aca52511cc21a2c9c927aef493d11c8087bdc5483249a3d93aee41e81b8bd4d1"
checksum = "078e80e4c222279e3330f6aa1a256ca77ddf156d4453166a9f09defedc4594dd"
dependencies = [
"cranelift-srcgen",
]
[[package]]
name = "cranelift-bforest"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6867e99f068454b0c81c50b807af88aa80aaf383105e2be26675d81fc4278466"
checksum = "820ce15d4ad3562d613c31a67b6d0434d403e7091a68d1349903842f7d31737e"
dependencies = [
"cranelift-entity",
"wasmtime-internal-core",
@ -789,9 +789,9 @@ dependencies = [
[[package]]
name = "cranelift-bitset"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3cf66017aed971344230199ad35ca01c955cf824a0e65fed5240452d2a302445"
checksum = "61bca563d4b86d285928d9e27f97f27039bb33a0fc524fa130d7d0c106bf8ab3"
dependencies = [
"serde",
"serde_derive",
@ -800,9 +800,9 @@ dependencies = [
[[package]]
name = "cranelift-codegen"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "933b2e5237665bf9367a34ad2100eed70c94b2796586cb09d9ba11693e061667"
checksum = "709f4b7c0fb57d952658d5b5c07fbdc4149acd7b7f0de9678ae754b9c981949a"
dependencies = [
"bumpalo",
"cranelift-assembler-x64",
@ -831,9 +831,9 @@ dependencies = [
[[package]]
name = "cranelift-codegen-meta"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "322e3ca0603683cc17f0c808559c0fb85ad52b0f20ace0478bdd4ba2fa1e9678"
checksum = "903dc8915af62aad1d9d0f39a5968d33fa80b9aa899ed6f56e47f40ca4512e1e"
dependencies = [
"cranelift-assembler-x64-meta",
"cranelift-codegen-shared",
@ -844,24 +844,24 @@ dependencies = [
[[package]]
name = "cranelift-codegen-shared"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "287ab88211d049178dc8dda243e2db176919d8b29db605c0efc7c6d76ebea0f7"
checksum = "0522d74c227e49f3fd49ab055311486ae4f09083262b66705bed676952491469"
[[package]]
name = "cranelift-control"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c11438f9becf9a1e1e061bf76a33241b941a07ed01a489e9dad5fa79dc3624e9"
checksum = "66560ea1c5cef72e170b18e46d263dba2d3169c9d39e8cafdab2173c6362cc1a"
dependencies = [
"arbitrary",
]
[[package]]
name = "cranelift-entity"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "584ecabe1462593a9cba9efbf9022e0987421ddb548989b455ab8bdd444b743c"
checksum = "b62ef5b17cc814d27e96b66a5b46da0e4ce2b8ac55a6d478048bb99d04b05526"
dependencies = [
"cranelift-bitset",
"serde",
@ -871,9 +871,9 @@ dependencies = [
[[package]]
name = "cranelift-frontend"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34249873145213a12106d5fd8a98a9dc9e90e16525e2337b2907874d1e7e9ee7"
checksum = "a87e0aaa39dbf70693b348a221e45904111704ee8f9fef140498471005f9842d"
dependencies = [
"cranelift-codegen",
"hashbrown 0.17.1",
@ -884,15 +884,15 @@ dependencies = [
[[package]]
name = "cranelift-isle"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6f1c1dc4d6b4bc4f0be12b08cee0e59f7610287827aa62590f8e9ec6f45dff4"
checksum = "cf79003ebfa1eed5e87f3b84446ad5236f540268289960e14f387dc9b28e40b7"
[[package]]
name = "cranelift-native"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31d9e4f6d9a3777b1ffa818000b4a6d7afd1b8787af71a9c58d94baef9076ced"
checksum = "05bf4f235743c81e67ee4db617c5a4a0b65d58d3f0cfc575ee0f1a4e0cd58273"
dependencies = [
"cranelift-codegen",
"libc",
@ -901,9 +901,9 @@ dependencies = [
[[package]]
name = "cranelift-srcgen"
version = "0.134.2"
version = "0.134.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4155f8a1afdef96a0272c67804926eee4ef35f9708ab22ad6878d4c9543df596"
checksum = "f6977c2a71ab1e0d1e62f966b411a498aa04c4dce47d93d52f8a360a06058922"
[[package]]
name = "crc"
@ -1237,6 +1237,12 @@ version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
[[package]]
name = "diff"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
[[package]]
name = "digest"
version = "0.10.7"
@ -1284,13 +1290,13 @@ dependencies = [
[[package]]
name = "displaydoc"
version = "0.2.6"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.119",
"syn 3.0.3",
]
[[package]]
@ -1390,9 +1396,9 @@ dependencies = [
[[package]]
name = "either"
version = "1.16.0"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d"
[[package]]
name = "elliptic-curve"
@ -1527,9 +1533,9 @@ checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24"
[[package]]
name = "find-msvc-tools"
version = "0.1.9"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de"
[[package]]
name = "flate2"
@ -1890,9 +1896,9 @@ dependencies = [
[[package]]
name = "http"
version = "1.4.2"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"
checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0"
dependencies = [
"bytes",
"itoa",
@ -1941,9 +1947,9 @@ checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15"
[[package]]
name = "hybrid-array"
version = "0.4.13"
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c"
checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b"
dependencies = [
"subtle",
"typenum",
@ -2223,9 +2229,9 @@ checksum = "2f0fb0570afe1fed943c5c3d4102d5358592d8625fda6a0007fdbe65a92fba96"
[[package]]
name = "ipnet"
version = "2.12.0"
version = "2.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78"
[[package]]
name = "itertools"
@ -2272,9 +2278,9 @@ dependencies = [
[[package]]
name = "js-sys"
version = "0.3.103"
version = "0.3.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a"
dependencies = [
"cfg-if",
"futures-util",
@ -2283,9 +2289,9 @@ dependencies = [
[[package]]
name = "kqueue"
version = "1.2.0"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5"
checksum = "8d763e5b24120b4ddf50de6c92308156765aabfbbccebf401da7cff2d70a41ea"
dependencies = [
"kqueue-sys",
"libc",
@ -2337,9 +2343,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
[[package]]
name = "libredox"
version = "0.1.18"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652"
checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa"
dependencies = [
"libc",
]
@ -3046,9 +3052,9 @@ dependencies = [
[[package]]
name = "portable-atomic"
version = "1.14.0"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3"
checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85"
[[package]]
name = "postcard"
@ -3086,6 +3092,16 @@ dependencies = [
"zerocopy",
]
[[package]]
name = "pretty_assertions"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d"
dependencies = [
"diff",
"yansi",
]
[[package]]
name = "prettyplease"
version = "0.2.37"
@ -3216,9 +3232,9 @@ dependencies = [
[[package]]
name = "pulley-interpreter"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6064e52588328c1275d690baad99f8d4b3fdd870736966f1a63cfcbb20560b6"
checksum = "bc5c8c21ea032e4efbdf2d067dc45171779dbe0c8ecf20ef4a57efa7474f2b0a"
dependencies = [
"cranelift-bitset",
"log",
@ -3228,9 +3244,9 @@ dependencies = [
[[package]]
name = "pulley-macros"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e832980317bfc7f8c8538ffc9c69b82912f3e33ec70f7c855d521654c70fa62"
checksum = "9f10925455d5dde962e3604eade797ba5488644c8ee14a44191e2f2b58980574"
dependencies = [
"proc-macro2",
"quote",
@ -3285,7 +3301,7 @@ dependencies = [
"sha2 0.11.0",
"sysinfo",
"tempfile",
"thiserror 2.0.19",
"thiserror 2.0.20",
"time",
"tokio",
"tokio-util",
@ -3320,13 +3336,34 @@ dependencies = [
"tracing",
]
[[package]]
name = "pumpkin-codegen"
version = "0.1.0-dev+26.1"
dependencies = [
"heck",
"indexmap",
"md5",
"proc-macro2",
"pumpkin-nbt",
"pumpkin-util",
"quote",
"rayon",
"semver",
"serde",
"serde_json",
"serde_json5",
"serde_repr",
"syn 3.0.3",
"wit-encoder",
]
[[package]]
name = "pumpkin-config"
version = "0.1.0-dev+26.2-26.40"
dependencies = [
"pumpkin-util",
"serde",
"toml 1.1.3+spec-1.1.0",
"toml 1.1.4+spec-1.1.0",
"tracing",
"uuid",
]
@ -3353,7 +3390,7 @@ dependencies = [
"pumpkin-util",
"pumpkin-world",
"rand 0.10.2",
"thiserror 2.0.19",
"thiserror 2.0.20",
"tokio",
"tracing",
]
@ -3364,6 +3401,7 @@ version = "0.1.0-dev+26.2-26.40"
dependencies = [
"heck",
"proc-macro-error2",
"proc-macro2",
"pumpkin-data",
"quote",
"syn 3.0.3",
@ -3379,7 +3417,7 @@ dependencies = [
"flate2",
"pumpkin-codecs",
"tempfile",
"thiserror 2.0.19",
"thiserror 2.0.20",
"tracing",
"uuid",
]
@ -3399,7 +3437,7 @@ dependencies = [
name = "pumpkin-protocol"
version = "0.1.0-dev+26.2-26.40"
dependencies = [
"aes 0.9.1",
"aes 0.9.2",
"async-compression",
"bitflags 2.13.1",
"bytes",
@ -3412,7 +3450,7 @@ dependencies = [
"pumpkin-util",
"pumpkin-world",
"serde",
"thiserror 2.0.19",
"thiserror 2.0.20",
"tokio",
"uuid",
]
@ -3440,7 +3478,7 @@ dependencies = [
"serde_json",
"sha2 0.11.0",
"syn 3.0.3",
"thiserror 2.0.19",
"thiserror 2.0.20",
"tokio",
"ureq",
"uuid",
@ -3475,7 +3513,7 @@ dependencies = [
"sha2 0.11.0",
"slotmap",
"tempfile",
"thiserror 2.0.19",
"thiserror 2.0.20",
"tokio",
"tokio-util",
"tracing",
@ -3657,9 +3695,9 @@ dependencies = [
[[package]]
name = "regex-automata"
version = "0.4.16"
version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
dependencies = [
"aho-corasick",
"memchr",
@ -3854,9 +3892,9 @@ dependencies = [
[[package]]
name = "rustls"
version = "0.23.42"
version = "0.23.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138"
checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06"
dependencies = [
"log",
"once_cell",
@ -4019,6 +4057,7 @@ version = "1.0.151"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
dependencies = [
"indexmap",
"itoa",
"memchr",
"serde",
@ -4399,11 +4438,11 @@ dependencies = [
[[package]]
name = "thiserror"
version = "2.0.19"
version = "2.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9"
checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f"
dependencies = [
"thiserror-impl 2.0.19",
"thiserror-impl 2.0.20",
]
[[package]]
@ -4419,9 +4458,9 @@ dependencies = [
[[package]]
name = "thiserror-impl"
version = "2.0.19"
version = "2.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd"
checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af"
dependencies = [
"proc-macro2",
"quote",
@ -4439,9 +4478,9 @@ dependencies = [
[[package]]
name = "time"
version = "0.3.54"
version = "0.3.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244"
checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134"
dependencies = [
"deranged",
"libc",
@ -4586,9 +4625,9 @@ dependencies = [
[[package]]
name = "toml"
version = "1.1.3+spec-1.1.0"
version = "1.1.4+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53c96ecdfa941c8fc4fcaed14f99ada8ebed502eef533015095a07e3301d4c3c"
checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5"
dependencies = [
"serde_core",
"serde_spanned",
@ -4618,9 +4657,9 @@ dependencies = [
[[package]]
name = "toml_parser"
version = "1.1.2+spec-1.1.0"
version = "1.1.3+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56"
dependencies = [
"winnow 1.0.4",
]
@ -4854,11 +4893,11 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "ureq"
version = "3.3.0"
version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0"
checksum = "972d7902c8735f2695410b8aed7df6ed12a47394aa1c8d7af49f0497b731a94d"
dependencies = [
"base64 0.22.1",
"base64 0.23.1",
"cookie_store",
"log",
"percent-encoding",
@ -4873,11 +4912,11 @@ dependencies = [
[[package]]
name = "ureq-proto"
version = "0.6.0"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c"
checksum = "da5f78b09e6941e1a0f2e30e695e4b120377b54d5e0aec11b594bb57b3971613"
dependencies = [
"base64 0.22.1",
"base64 0.23.1",
"http",
"httparse",
"log",
@ -4983,9 +5022,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen"
version = "0.2.126"
version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70"
dependencies = [
"cfg-if",
"once_cell",
@ -4996,9 +5035,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.126"
version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@ -5006,9 +5045,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.126"
version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284"
dependencies = [
"bumpalo",
"proc-macro2",
@ -5019,9 +5058,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.126"
version = "0.2.127"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf"
dependencies = [
"unicode-ident",
]
@ -5119,9 +5158,9 @@ dependencies = [
[[package]]
name = "wasmtime"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06d9f263ccb212017dae1d109b9997f218a7675db1e9a7bedf07ae1643322bf3"
checksum = "c80ca6098e0d4d06886d91d7f2cc3cb6623eb583c4c0ab3c89cbfb6098c8586c"
dependencies = [
"addr2line",
"async-trait",
@ -5162,9 +5201,9 @@ dependencies = [
[[package]]
name = "wasmtime-environ"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9915e3d90c36a16e0fec8be746ee87e21cf0d4a017ecf09c49b7d1cc6f31b2b6"
checksum = "134f9d136d29c76f6c1b4c9b468e97a2efc38c7d49fd188e39b64870b2fea701"
dependencies = [
"anyhow",
"cpp_demangle",
@ -5193,9 +5232,9 @@ dependencies = [
[[package]]
name = "wasmtime-internal-cache"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b7c25436e1602aad2de80bfb3f586dcdfb6fe426d5b17cba37fabf9a1714d32"
checksum = "65db2eb1bfc5371a3b4107dbf539d0b93d05016fc29625b1648146b47db02071"
dependencies = [
"base64 0.22.1",
"directories-next",
@ -5213,9 +5252,9 @@ dependencies = [
[[package]]
name = "wasmtime-internal-component-macro"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b627ea698db36fb9110aa77868467f1d23791a76a88a433cb6a43e1242073b77"
checksum = "2bf7b91fed3fc34781d57f9c6654ea2513bf0a99f7b0b0523c00de1e6efebe1c"
dependencies = [
"anyhow",
"proc-macro2",
@ -5228,15 +5267,15 @@ dependencies = [
[[package]]
name = "wasmtime-internal-component-util"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f45bf943cff1d2f1976bac6a241ca4ecaf29a6efd5f1ad89e7722439fa5c392f"
checksum = "fc8a678149885cae00289f806fbe74c7863084cf74cace0b8dc73602279400e1"
[[package]]
name = "wasmtime-internal-core"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea33e1f9685be82f90223bebcf2ffefb6b596ea3d82a3c42384527b9c6f5b447"
checksum = "8a0092c4b9d070ac5e278b6d0db10f5e71214190f0347ca57502b4692f796321"
dependencies = [
"hashbrown 0.17.1",
"libm",
@ -5245,9 +5284,9 @@ dependencies = [
[[package]]
name = "wasmtime-internal-cranelift"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b1ce104719932a48dbdfec0cc292c96494b0bfe764946e45fbfd3340e3a68f9"
checksum = "6851ebc9e03cab23d9821d2b2505d380bdfe38f35ccec945247b05274d85c98b"
dependencies = [
"cfg-if",
"cranelift-codegen",
@ -5262,7 +5301,7 @@ dependencies = [
"pulley-interpreter",
"smallvec",
"target-lexicon",
"thiserror 2.0.19",
"thiserror 2.0.20",
"wasmparser 0.252.0",
"wasmtime-environ",
"wasmtime-internal-core",
@ -5272,9 +5311,9 @@ dependencies = [
[[package]]
name = "wasmtime-internal-fiber"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976e4b71b9c0da8a9a7bb8d5fa0abedc4da879b397111fd91ece73be524fe621"
checksum = "9b26da6d5f60d4c438da70bba3553fe810a840533a64156be287dca2081c6991"
dependencies = [
"cc",
"cfg-if",
@ -5287,9 +5326,9 @@ dependencies = [
[[package]]
name = "wasmtime-internal-jit-debug"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1f60ecba3497cfc26284903c2e79023fd5ea991b95b0e8dafe994fd9fca4c4e"
checksum = "ed621ba25d7bf78b7edd7b4749abbb27c2e5cdba836c9504a424ee74b6c23149"
dependencies = [
"cc",
"wasmtime-internal-versioned-export-macros",
@ -5297,9 +5336,9 @@ dependencies = [
[[package]]
name = "wasmtime-internal-jit-icache-coherence"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fae6decb025ae6d12f3391b36deb62a6838d45b18864f796d84bced722ceac0d"
checksum = "5684ba160951baad06a725696f3c590e2fb0e8067c2aebee27bf7f9259058e85"
dependencies = [
"cfg-if",
"libc",
@ -5309,9 +5348,9 @@ dependencies = [
[[package]]
name = "wasmtime-internal-unwinder"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0982122d9470d3d72ed7aa9ed91e69538ae44c1494cd22d78fec7846b248a940"
checksum = "112eead527bffa8ff0646a11fb4339a9d52ddd1da2b9a6fce4aff84c815dd94f"
dependencies = [
"cfg-if",
"cranelift-codegen",
@ -5322,9 +5361,9 @@ dependencies = [
[[package]]
name = "wasmtime-internal-versioned-export-macros"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "363cf88a80e6ed13311d0d34d9bcd02a2e07d98113b994ff41ed386a206f498e"
checksum = "153592e0bed824fc13c6696203fa1bd7bd20eb355316475e39a55f081ef80eca"
dependencies = [
"proc-macro2",
"quote",
@ -5333,9 +5372,9 @@ dependencies = [
[[package]]
name = "wasmtime-internal-wit-bindgen"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87ff41bb1656cbeb7befc42b8a7078b30a5f8393a0c8bca36a6cec94360c1a16"
checksum = "c456ad6e81e0f46abfeca43687d18ea15e289c395b262ea6e0023e2682e088be"
dependencies = [
"anyhow",
"bitflags 2.13.1",
@ -5346,9 +5385,9 @@ dependencies = [
[[package]]
name = "wasmtime-wasi"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed1750b8e5e5d5b1ee3c0eb602d2c49d6a37a36e9996eaf0708b48ac92b62b06"
checksum = "4c1cf60cd6a565213af7074b4aad7bb5e110e3c6c6aae54425aa0500a0e15e86"
dependencies = [
"async-trait",
"bitflags 2.13.1",
@ -5360,7 +5399,7 @@ dependencies = [
"io-lifetimes 3.0.1",
"rand 0.10.2",
"rustix",
"thiserror 2.0.19",
"thiserror 2.0.20",
"tokio",
"tracing",
"url",
@ -5371,9 +5410,9 @@ dependencies = [
[[package]]
name = "wasmtime-wasi-http"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "014b8f05cacb7a5d665536e8a733b887bd192a9c179037580d48d0a6a82ecd34"
checksum = "a499879061ee9f724342d5f5009754b723ae53c7932161ee063a9fe19395e915"
dependencies = [
"async-trait",
"bytes",
@ -5394,9 +5433,9 @@ dependencies = [
[[package]]
name = "wasmtime-wasi-io"
version = "47.0.2"
version = "47.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54777d3afeaf3f32cc444df661d9cb4fd57067971e183c2b1f5251f33b939e68"
checksum = "7fb08e1d7755aaa467ce14080b7b01e33c914a920f6000696f1e42e40ea6387e"
dependencies = [
"async-trait",
"bytes",
@ -5987,6 +6026,19 @@ dependencies = [
"wit-parser 0.254.0",
]
[[package]]
name = "wit-encoder"
version = "0.255.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7cebd2d14c3296dada506c67c1ee5c9440811a2fe88a83367a606ccbd30ebfde"
dependencies = [
"id-arena",
"pretty_assertions",
"semver",
"serde",
"wit-parser 0.255.0",
]
[[package]]
name = "wit-parser"
version = "0.252.0"
@ -6025,6 +6077,25 @@ dependencies = [
"wasmparser 0.254.0",
]
[[package]]
name = "wit-parser"
version = "0.255.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5f6371fc71f15730b756c1dea3562a67adab1a7e519c4ca010173d883695bb"
dependencies = [
"anyhow",
"hashbrown 0.17.1",
"id-arena",
"indexmap",
"log",
"semver",
"serde",
"serde_derive",
"serde_json",
"unicode-ident",
"wasmparser 0.255.0",
]
[[package]]
name = "wnaf"
version = "0.14.0"
@ -6078,6 +6149,12 @@ version = "0.8.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6"
[[package]]
name = "yansi"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
[[package]]
name = "yasna"
version = "0.5.2"
@ -6112,18 +6189,18 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.55"
version = "0.8.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb"
checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.55"
version = "0.8.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb"
checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1"
dependencies = [
"proc-macro2",
"quote",

View File

@ -13,8 +13,8 @@ members = [
"crates/pumpkin-protocol",
"crates/pumpkin-util",
"crates/pumpkin-world",
"tools/pumpkin-codegen",
]
exclude = ["tools/pumpkin-codegen"]
# [workspace.lints.rust]
# missing_docs = "warn"
@ -204,7 +204,7 @@ time = { version = "0.3", default-features = false, features = ["std"] }
arc-swap = { version = "1.9", default-features = false }
tokio-util = { version = "0.7.19", default-features = false }
toml = { version = "1.1", default-features = false, features = ["parse", "display", "serde"] }
ureq = { version = "3.3.0", default-features = false, features = ["rustls"] }
ureq = { version = "3.4.0", default-features = false, features = ["rustls"] }
notify = { version = "8.2.0", default-features = false, features = ["macos_fsevent"] }
sysinfo = { version = "0.39", default-features = false, features = ["system"] }

File diff suppressed because it is too large Load Diff

View File

@ -28,10 +28,12 @@ pub struct AdvancementDisplay {
}
impl AdvancementDisplay {
#[allow(deprecated)]
pub fn get_title(&self) -> TextComponent {
TextComponent::translate(self.title, [])
}
#[allow(deprecated)]
pub fn get_description(&self) -> TextComponent {
TextComponent::translate(self.description, [])
}

View File

@ -1111,6 +1111,7 @@ impl Enchantment {
}
true
}
#[allow(deprecated)]
pub fn get_fullname(&self, level: i32) -> TextComponent {
let mut ret = TextComponent::translate(self.description, []).color_named(
if self.has_tag(&EnchantmentTag::MINECRAFT_CURSE) {

View File

@ -64250,6 +64250,7 @@ impl Item {
}
})
.unwrap_or(self.registry_key);
#[allow(deprecated)]
TextComponent::translate(name, &[])
}
#[doc = "Try to parse an item from a resource location string."]

File diff suppressed because one or more lines are too long

View File

@ -10,9 +10,10 @@ proc-macro = true
[dependencies]
proc-macro-error2.workspace = true
pumpkin-data = { workspace = true, features = ["block", "tag"] }
pumpkin-data = { workspace = true, features = ["block", "tag", "translation"] }
heck.workspace = true
proc-macro2 = "1.0"
quote.workspace = true
syn.workspace = true

View File

@ -626,3 +626,215 @@ fn is_vec(ty: &Type) -> bool {
false
}
}
struct TranslateCrossInput {
java_expr: syn::Expr,
bedrock_expr: syn::Expr,
args: Vec<syn::Expr>,
}
impl syn::parse::Parse for TranslateCrossInput {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let java_expr: syn::Expr = input.parse()?;
let _ = input.parse::<syn::Token![,]>()?;
let bedrock_expr: syn::Expr = input.parse()?;
let mut args = Vec::new();
while !input.is_empty() {
let _ = input.parse::<syn::Token![,]>()?;
if input.is_empty() {
break;
}
args.push(input.parse()?);
}
Ok(Self {
java_expr,
bedrock_expr,
args,
})
}
}
fn eval_translation_key_expr(expr: &syn::Expr) -> Option<(&'static str, proc_macro2::Span)> {
match expr {
syn::Expr::Path(expr_path) => {
let segments: Vec<String> = expr_path
.path
.segments
.iter()
.map(|s| s.ident.to_string())
.collect();
let seg_refs: Vec<&str> = segments.iter().map(String::as_str).collect();
let (is_java, const_ident) = match seg_refs.as_slice() {
["translation", "java", ident]
| ["pumpkin_data" | "crate", "translation", "java", ident] => (true, *ident),
["translation", "bedrock", ident]
| ["pumpkin_data" | "crate", "translation", "bedrock", ident] => (false, *ident),
_ => return None,
};
let key = if is_java {
pumpkin_data::translation::java::get(const_ident)
.and_then(pumpkin_data::translation::java::get_value)
} else {
pumpkin_data::translation::bedrock::get(const_ident)
.and_then(pumpkin_data::translation::bedrock::get_value)
};
key.map(|k| (k, expr.span()))
}
syn::Expr::Lit(syn::ExprLit {
lit: syn::Lit::Str(lit_str),
..
}) => {
// Leaking string slice here is fine since this runs during compilation inside proc macro
let s = Box::leak(lit_str.value().into_boxed_str());
Some((s, lit_str.span()))
}
_ => None,
}
}
fn count_placeholders(format_str: &str) -> usize {
let mut count = 0;
let bytes = format_str.as_bytes();
let mut i = 0;
while i < bytes.len() {
if bytes[i] == b'%' && i + 1 < bytes.len() {
if bytes[i + 1] == b'%' {
i += 2;
continue;
}
// Handle positional specifiers like %1$s, %2$d
let mut j = i + 1;
while j < bytes.len() && bytes[j].is_ascii_digit() {
j += 1;
}
if j < bytes.len() && bytes[j] == b'$' {
count += 1;
i = j + 2; // skip past specifier character following $ (e.g., $s)
continue;
}
// Handle optional width/flags before specifier type like %s, %d, %f, %1s
count += 1;
i = j + 1; // skip past specifier character
continue;
}
i += 1;
}
count
}
/// Validates translation keys and arguments at compile-time and returns a `TextComponent`.
#[proc_macro]
pub fn translate_cross(input: TokenStream) -> TokenStream {
let TranslateCrossInput {
java_expr,
bedrock_expr,
args,
} = parse_macro_input!(input as TranslateCrossInput);
if let Some((java_str, span)) = eval_translation_key_expr(&java_expr) {
let expected = count_placeholders(java_str);
// Java translation keys from generated constants might differ from Bedrock key placeholder formats
if expected != args.len() && matches!(java_expr, syn::Expr::Lit(_)) {
return syn::Error::new(
span,
format!(
"Java translation key `{}` expects {} argument(s), but {} were provided",
java_str,
expected,
args.len()
),
)
.to_compile_error()
.into();
}
}
if let Some((bedrock_str, span)) = eval_translation_key_expr(&bedrock_expr) {
let expected = count_placeholders(bedrock_str);
if expected != args.len() && matches!(bedrock_expr, syn::Expr::Lit(_)) {
return syn::Error::new(
span,
format!(
"Bedrock translation key `{}` expects {} argument(s), but {} were provided",
bedrock_str,
expected,
args.len()
),
)
.to_compile_error()
.into();
}
}
let expanded = quote! {
{
#[allow(deprecated)]
pumpkin_util::text::TextComponent::translate_cross(#java_expr, #bedrock_expr, vec![#(#args),*])
}
};
expanded.into()
}
struct TranslateJavaInput {
java_expr: syn::Expr,
args: Vec<syn::Expr>,
}
impl syn::parse::Parse for TranslateJavaInput {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let java_expr: syn::Expr = input.parse()?;
let mut args = Vec::new();
while !input.is_empty() {
let _ = input.parse::<syn::Token![,]>()?;
if input.is_empty() {
break;
}
args.push(input.parse()?);
}
Ok(Self { java_expr, args })
}
}
/// Validates Java translation keys and arguments at compile-time and returns a `TextComponent`.
#[deprecated(
since = "0.1.0",
note = "Use `pumpkin_macros::translate_cross!` macro instead for cross-platform (Java & Bedrock) translation support."
)]
#[proc_macro]
pub fn translate_java(input: TokenStream) -> TokenStream {
let TranslateJavaInput { java_expr, args } = parse_macro_input!(input as TranslateJavaInput);
if let Some((java_str, span)) = eval_translation_key_expr(&java_expr) {
let expected = count_placeholders(java_str);
if expected != args.len() {
return syn::Error::new(
span,
format!(
"Java translation key `{}` expects {} argument(s), but {} were provided",
java_str,
expected,
args.len()
),
)
.to_compile_error()
.into();
}
}
let expanded = quote! {
{
#[allow(deprecated)]
pumpkin_util::text::TextComponent::translate(#java_expr, vec![#(#args),*])
}
};
expanded.into()
}

View File

@ -663,6 +663,10 @@ impl TextComponent {
///
/// # Returns
/// A new `TextComponent` that will be translated on the client.
#[deprecated(
since = "0.1.0",
note = "Use the `pumpkin_macros::translate_java!` macro instead for compile-time translation key and parameter checking."
)]
#[must_use]
pub fn translate<K: Into<Cow<'static, str>>, W: Into<Vec<Self>>>(key: K, with: W) -> Self {
Self(TextComponentBase {
@ -685,6 +689,10 @@ impl TextComponent {
///
/// # Returns
/// A new `TextComponent` that will be translated natively on both clients.
#[deprecated(
since = "0.1.0",
note = "Use the `pumpkin_macros::translate_cross!` macro instead for compile-time translation key and parameter checking."
)]
#[must_use]
pub fn translate_cross<
K1: Into<Cow<'static, str>>,
@ -1023,6 +1031,7 @@ impl TextComponent {
///
/// # Returns
/// The new component.
#[allow(deprecated)]
#[must_use]
pub fn wrap_in_square_brackets(self) -> Self {
Self::translate("chat.square_brackets", [self])
@ -1277,6 +1286,7 @@ mod test {
#[test]
fn serialize_text_component() {
#[allow(deprecated)]
let msg_comp = TextComponent::translate(
"multiplayer.player.joined",
[TextComponent::text("NAME".to_string())],

View File

@ -5,6 +5,7 @@ description = "Empowering everyone to host fast and efficient Minecraft servers.
edition.workspace = true
rust-version.workspace = true
license.workspace = true
default-run = "pumpkin"
[package.metadata.tauri-winres]
# FileDescription is handled as the Program name by Windows!

View File

@ -97,10 +97,9 @@ impl ScreenHandlerFactory for AnvilScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_REPAIR,
translation::bedrock::CONTAINER_REPAIR,
&[],
translation::bedrock::CONTAINER_REPAIR
)
}
}

View File

@ -39,10 +39,9 @@ impl ScreenHandlerFactory for BarrelScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_BARREL,
translation::bedrock::CONTAINER_BARREL,
&[],
translation::bedrock::CONTAINER_BARREL
)
}
}

View File

@ -37,10 +37,9 @@ impl ScreenHandlerFactory for BeaconScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_BEACON,
translation::bedrock::CONTAINER_BEACON,
&[],
translation::bedrock::CONTAINER_BEACON
)
}
}

View File

@ -11,7 +11,6 @@ use pumpkin_data::translation;
use pumpkin_macros::pumpkin_block_from_tag;
use pumpkin_util::GameMode;
use pumpkin_util::math::position::BlockPos;
use pumpkin_util::text::TextComponent;
use pumpkin_world::world::BlockFlags;
use crate::block::BlockFuture;
@ -247,10 +246,9 @@ impl BlockBehaviour for BedBlock {
{
args.player
.send_system_message_raw(
&TextComponent::translate_cross(
&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_OBSTRUCTED,
translation::java::BLOCK_MINECRAFT_BED_OBSTRUCTED,
[],
translation::bedrock::TILE_BED_OBSTRUCTED
),
true,
)
@ -264,10 +262,9 @@ impl BlockBehaviour for BedBlock {
args.player
.send_system_message_raw(
&TextComponent::translate_cross(
&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_OCCUPIED,
translation::bedrock::TILE_BED_OCCUPIED,
[],
translation::bedrock::TILE_BED_OCCUPIED
),
true,
)
@ -287,10 +284,9 @@ impl BlockBehaviour for BedBlock {
{
args.player
.send_system_message_raw(
&TextComponent::translate_cross(
&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_TOO_FAR_AWAY,
translation::java::BLOCK_MINECRAFT_BED_TOO_FAR_AWAY,
[],
translation::bedrock::TILE_BED_TOOFAR
),
true,
)
@ -311,10 +307,9 @@ impl BlockBehaviour for BedBlock {
.await
{
args.player
.send_system_message(&TextComponent::translate_cross(
.send_system_message(&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_SET_SPAWN,
translation::bedrock::TILE_BED_RESPAWNSET,
[],
translation::bedrock::TILE_BED_RESPAWNSET
))
.await;
}
@ -323,10 +318,9 @@ impl BlockBehaviour for BedBlock {
if !can_sleep(args.world).await {
args.player
.send_system_message_raw(
&TextComponent::translate_cross(
&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_NO_SLEEP,
translation::java::BLOCK_MINECRAFT_BED_NO_SLEEP,
[],
translation::bedrock::TILE_BED_NOSLEEP
),
true,
)
@ -346,10 +340,9 @@ impl BlockBehaviour for BedBlock {
{
args.player
.send_system_message_raw(
&TextComponent::translate_cross(
&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_NOT_SAFE,
translation::java::BLOCK_MINECRAFT_BED_NOT_SAFE,
[],
translation::bedrock::TILE_BED_NOTSAFE
),
true,
)

View File

@ -16,7 +16,6 @@ use pumpkin_inventory::{
screen_handler::{BoxFuture, InventoryPlayer, ScreenHandlerFactory, SharedScreenHandler},
};
use pumpkin_macros::pumpkin_block;
use pumpkin_util::text::TextComponent;
use pumpkin_world::inventory::Inventory;
use tokio::sync::Mutex;
@ -73,10 +72,9 @@ impl ScreenHandlerFactory for BlastingFurnaceScreenFactory {
}
fn get_display_name(&self) -> pumpkin_util::text::TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_BLAST_FURNACE,
translation::bedrock::TILE_BLAST_FURNACE_NAME,
&[],
translation::bedrock::TILE_BLAST_FURNACE_NAME
)
}
}

View File

@ -38,10 +38,9 @@ impl ScreenHandlerFactory for BrewingScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_BREWING,
translation::bedrock::CONTAINER_BREWING,
&[],
translation::bedrock::CONTAINER_BREWING
)
}
}

View File

@ -59,16 +59,14 @@ impl ScreenHandlerFactory for ChestScreenFactory {
fn get_display_name(&self) -> TextComponent {
if self.0.size() > 27 {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_CHESTDOUBLE,
translation::bedrock::CONTAINER_CHESTDOUBLE,
&[],
translation::bedrock::CONTAINER_CHESTDOUBLE
)
} else {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_CHEST,
translation::bedrock::CONTAINER_CHEST,
&[],
translation::bedrock::CONTAINER_CHEST
)
}
}

View File

@ -57,10 +57,9 @@ impl ScreenHandlerFactory for CraftingTableScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_CRAFTING,
translation::bedrock::CONTAINER_CRAFTING,
&[],
translation::bedrock::CONTAINER_CRAFTING
)
}
}

View File

@ -121,10 +121,9 @@ impl ScreenHandlerFactory for EnchantingTableScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_ENCHANT,
translation::bedrock::CONTAINER_ENCHANT,
&[],
translation::bedrock::CONTAINER_ENCHANT
)
}
}

View File

@ -38,10 +38,9 @@ impl ScreenHandlerFactory for EnderChestScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_ENDERCHEST,
translation::bedrock::CONTAINER_ENDERCHEST,
&[],
translation::bedrock::CONTAINER_ENDERCHEST
)
}
}

View File

@ -15,7 +15,6 @@ use pumpkin_inventory::{
screen_handler::{BoxFuture, InventoryPlayer, ScreenHandlerFactory, SharedScreenHandler},
};
use pumpkin_macros::pumpkin_block;
use pumpkin_util::text::TextComponent;
use pumpkin_world::inventory::Inventory;
use tokio::sync::Mutex;
@ -72,10 +71,9 @@ impl ScreenHandlerFactory for FurnaceScreenFactory {
}
fn get_display_name(&self) -> pumpkin_util::text::TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_FURNACE,
translation::bedrock::CONTAINER_FURNACE,
&[],
translation::bedrock::CONTAINER_FURNACE
)
}
}

View File

@ -45,10 +45,9 @@ impl ScreenHandlerFactory for HopperBlockScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_HOPPER,
translation::bedrock::CONTAINER_HOPPER,
&[],
translation::bedrock::CONTAINER_HOPPER
)
}
}

View File

@ -97,10 +97,9 @@ impl ScreenHandlerFactory for LecternScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_LECTERN,
translation::bedrock::TILE_LECTERN_NAME,
&[],
translation::bedrock::TILE_LECTERN_NAME
)
}
}

View File

@ -44,10 +44,9 @@ impl ScreenHandlerFactory for CrafterScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_CRAFTER,
translation::bedrock::CONTAINER_CRAFTER,
&[],
translation::bedrock::CONTAINER_CRAFTER
)
}
}

View File

@ -64,10 +64,9 @@ impl ScreenHandlerFactory for DispenserScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_DISPENSER,
translation::bedrock::CONTAINER_DISPENSER,
&[],
translation::bedrock::CONTAINER_DISPENSER
)
}
}

View File

@ -48,10 +48,9 @@ impl ScreenHandlerFactory for DropperScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_DROPPER,
translation::bedrock::CONTAINER_DROPPER,
&[],
translation::bedrock::CONTAINER_DROPPER
)
}
}

View File

@ -4,7 +4,6 @@ use pumpkin_data::item::Item;
use pumpkin_data::sound::{Sound, SoundCategory};
use pumpkin_data::translation;
use pumpkin_macros::pumpkin_block;
use pumpkin_util::text::TextComponent;
use pumpkin_world::world::BlockFlags;
use crate::block::registry::BlockActionResult;
@ -70,9 +69,9 @@ impl BlockBehaviour for RespawnAnchorBlock {
if props.charges == 0 {
args.player
.send_system_message(&TextComponent::translate(
.send_system_message(&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_BED_NO_SLEEP,
&[],
translation::bedrock::TILE_BED_NOSLEEP
))
.await;
return BlockActionResult::SuccessServer;
@ -105,10 +104,9 @@ impl BlockBehaviour for RespawnAnchorBlock {
);
args.player
.send_system_message(&TextComponent::translate_cross(
.send_system_message(&pumpkin_macros::translate_cross!(
translation::java::BLOCK_MINECRAFT_SET_SPAWN,
translation::bedrock::TILE_BED_RESPAWNSET,
[],
translation::bedrock::TILE_BED_RESPAWNSET
))
.await;
}

View File

@ -40,10 +40,9 @@ impl ScreenHandlerFactory for ShulkerBoxScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_SHULKERBOX,
translation::bedrock::CONTAINER_SHULKERBOX,
&[],
translation::bedrock::CONTAINER_SHULKERBOX
)
}
}

View File

@ -15,7 +15,6 @@ use pumpkin_inventory::{
screen_handler::{BoxFuture, InventoryPlayer, ScreenHandlerFactory, SharedScreenHandler},
};
use pumpkin_macros::pumpkin_block;
use pumpkin_util::text::TextComponent;
use pumpkin_world::inventory::Inventory;
use tokio::sync::Mutex;
@ -72,10 +71,9 @@ impl ScreenHandlerFactory for SmokerScreenFactory {
}
fn get_display_name(&self) -> pumpkin_util::text::TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_SMOKER,
translation::bedrock::TILE_SMOKER_NAME,
&[],
translation::bedrock::TILE_SMOKER_NAME
)
}
}

View File

@ -54,10 +54,9 @@ impl ScreenHandlerFactory for StonecutterScreenFactory {
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::CONTAINER_STONECUTTER,
translation::bedrock::CONTAINER_STONECUTTER,
&[],
translation::bedrock::CONTAINER_STONECUTTER
)
}
}

View File

@ -74,10 +74,9 @@ impl ArgumentConsumer for HexColorArgumentConsumer {
let result = parse_hex_color(raw_arg.value)
.map(|color| Some(Arg::HexColor(color)))
.ok_or_else(|| {
INVALID_HEX_ERROR_TYPE.create_without_context(TextComponent::translate(
translation::java::ARGUMENT_HEXCOLOR_INVALID,
[TextComponent::text(raw_arg.value.to_string())],
))
INVALID_HEX_ERROR_TYPE.create_without_context_args_slice(&[TextComponent::text(
raw_arg.value.to_string(),
)])
});
Box::pin(async move { result })

View File

@ -76,10 +76,9 @@ impl ArgumentConsumer for TeamColorArgumentConsumer {
let result = NamedColor::try_from(raw_arg.value)
.map(|color| Some(Arg::TeamColor(color)))
.map_err(|()| {
INVALID_COLOR_ERROR_TYPE.create_without_context(TextComponent::translate(
translation::java::ARGUMENT_COLOR_INVALID,
[TextComponent::text(raw_arg.value.to_string())],
))
INVALID_COLOR_ERROR_TYPE.create_without_context_args_slice(&[TextComponent::text(
raw_arg.value.to_string(),
)])
});
Box::pin(async move { result })

View File

@ -165,14 +165,13 @@ impl CommandExecutor for PlaceTemplateExecutor {
context
.source
.send_feedback(
TextComponent::translate(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_PLACE_TEMPLATE_SUCCESS,
[
TextComponent::text(template_name.clone()),
TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string()),
],
translation::bedrock::COMMANDS_PLACE_SUCCESS,
TextComponent::text(template_name.clone()),
TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string())
),
true,
)
@ -198,7 +197,7 @@ impl CommandExecutor for PlaceJigsawExecutor {
BlockPos::new(p.x as i32, p.y as i32, p.z as i32)
});
let (piece_count, placer) = {
let (_piece_count, placer) = {
let seed = hash_block_pos(block_pos.0.x, block_pos.0.y, block_pos.0.z) as u64;
let random = RandomGenerator::Legacy(LegacyRand::from_seed(seed));
let world_gen = &context.world().level.world_gen;
@ -259,14 +258,12 @@ impl CommandExecutor for PlaceJigsawExecutor {
context
.source
.send_feedback(
TextComponent::translate(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_PLACE_JIGSAW_SUCCESS,
[
TextComponent::text(piece_count.to_string()),
TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string()),
],
translation::bedrock::COMMANDS_PLACE_SUCCESS,
TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string())
),
true,
)
@ -525,14 +522,13 @@ impl CommandExecutor for PlaceStructureExecutor {
context
.source
.send_feedback(
TextComponent::translate(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_PLACE_STRUCTURE_SUCCESS,
[
TextComponent::text(structure_name),
TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string()),
],
translation::bedrock::COMMANDS_PLACE_SUCCESS,
TextComponent::text(structure_name),
TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string())
),
true,
)
@ -642,14 +638,13 @@ impl CommandExecutor for PlaceFeatureExecutor {
context
.source
.send_feedback(
TextComponent::translate(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_PLACE_FEATURE_SUCCESS,
[
TextComponent::text(feature_name),
TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string()),
],
translation::bedrock::COMMANDS_PLACE_SUCCESS,
TextComponent::text(feature_name),
TextComponent::text(block_pos.0.x.to_string()),
TextComponent::text(block_pos.0.y.to_string()),
TextComponent::text(block_pos.0.z.to_string())
),
true,
)

View File

@ -81,9 +81,10 @@ impl CommandExecutor for QueryExecutor {
QueryMode::GameTime => {
let game_time = level_time.query_gametime();
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_QUERY_GAMETIME,
[TextComponent::text(game_time.to_string())],
translation::bedrock::COMMANDS_TIME_QUERY_GAMETIME,
TextComponent::text(game_time.to_string())
))
.await;
Ok(wrap_time(game_time))
@ -91,12 +92,11 @@ impl CommandExecutor for QueryExecutor {
QueryMode::Time => {
let total_ticks = level_time.time_of_day;
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_QUERY_ABSOLUTE,
[
TextComponent::text(clock_name.to_string()),
TextComponent::text(total_ticks.to_string()),
],
translation::bedrock::COMMANDS_TIME_QUERY_DAYTIME,
TextComponent::text(clock_name.to_string()),
TextComponent::text(total_ticks.to_string())
))
.await;
Ok(wrap_time(total_ticks))
@ -104,21 +104,21 @@ impl CommandExecutor for QueryExecutor {
QueryMode::DayTime => {
let curr_time = level_time.query_daytime();
sender
.send_message(TextComponent::translate_cross(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_QUERY,
translation::bedrock::COMMANDS_TIME_QUERY_DAYTIME,
[TextComponent::text(curr_time.to_string())],
TextComponent::text(curr_time.to_string())
))
.await;
Ok(curr_time as i32)
Ok(wrap_time(curr_time))
}
QueryMode::Day => {
let curr_time = level_time.query_day();
sender
.send_message(TextComponent::translate_cross(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_QUERY,
translation::bedrock::COMMANDS_TIME_QUERY_DAY,
[TextComponent::text(curr_time.to_string())],
TextComponent::text(curr_time.to_string())
))
.await;
Ok(curr_time as i32)
@ -161,12 +161,11 @@ impl CommandExecutor for ActionExecutor {
level_time.set_time(time_count.into());
level_time.send_time(world).await;
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_SET_ABSOLUTE,
[
TextComponent::text(clock_name.to_string()),
TextComponent::text(time_count.to_string()),
],
translation::bedrock::COMMANDS_TIME_SET,
TextComponent::text(clock_name.to_string()),
TextComponent::text(time_count.to_string())
))
.await;
Ok(time_count)
@ -177,12 +176,11 @@ impl CommandExecutor for ActionExecutor {
level_time.send_time(world).await;
let total_ticks = level_time.time_of_day;
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_SET_ABSOLUTE,
[
TextComponent::text(clock_name.to_string()),
TextComponent::text(total_ticks.to_string()),
],
translation::bedrock::COMMANDS_TIME_ADDED,
TextComponent::text(clock_name.to_string()),
TextComponent::text(total_ticks.to_string())
))
.await;
Ok(wrap_time(total_ticks))
@ -191,9 +189,10 @@ impl CommandExecutor for ActionExecutor {
level_time.set_paused(true);
level_time.send_time(world).await;
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_PAUSE,
[TextComponent::text(clock_name.to_string())],
translation::bedrock::COMMANDS_TIME_STOP,
TextComponent::text(clock_name.to_string())
))
.await;
Ok(1)
@ -202,9 +201,10 @@ impl CommandExecutor for ActionExecutor {
level_time.set_paused(false);
level_time.send_time(world).await;
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_RESUME,
[TextComponent::text(clock_name.to_string())],
translation::bedrock::COMMANDS_TIME_SET,
TextComponent::text(clock_name.to_string())
))
.await;
Ok(1)
@ -218,12 +218,11 @@ impl CommandExecutor for ActionExecutor {
level_time.set_rate(rate);
level_time.send_time(world).await;
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_TIME_RATE,
[
TextComponent::text(clock_name.to_string()),
TextComponent::text(rate.to_string()),
],
translation::bedrock::COMMANDS_TIME_SET,
TextComponent::text(clock_name.to_string()),
TextComponent::text(rate.to_string())
))
.await;
Ok(1)

View File

@ -35,9 +35,10 @@ impl CommandExecutor for ListExecutor {
let dimension = world.dimension.minecraft_name.to_string();
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WAYPOINT_LIST_EMPTY,
[TextComponent::text(dimension)],
translation::java::COMMANDS_WAYPOINT_LIST_EMPTY,
TextComponent::text(dimension)
))
.await;
Ok(0)
@ -98,9 +99,10 @@ impl CommandExecutor for ColorExecutor {
ColorAction::Named => {
let color = TeamColorArgumentConsumer::find_arg(args, ARG_COLOR)?;
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR,
[TextComponent::text(color.name()).color_named(color)],
translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR,
TextComponent::text(color.name()).color_named(color)
))
.await;
}
@ -108,17 +110,18 @@ impl CommandExecutor for ColorExecutor {
let color_val = HexColorArgumentConsumer::find_arg(args, ARG_COLOR)?;
let hex_str = format!("{:06X}", color_val & 0xFFFFFF);
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR,
[TextComponent::text(hex_str)],
translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR,
TextComponent::text(hex_str)
))
.await;
}
ColorAction::Reset => {
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR_RESET,
[],
translation::java::COMMANDS_WAYPOINT_MODIFY_COLOR_RESET
))
.await;
}
@ -176,9 +179,9 @@ impl CommandExecutor for StyleExecutor {
}
sender
.send_message(TextComponent::translate(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WAYPOINT_MODIFY_STYLE,
[],
translation::java::COMMANDS_WAYPOINT_MODIFY_STYLE
))
.await;

View File

@ -37,10 +37,9 @@ async fn kick_non_whitelisted_players(server: &Server) {
player
.kick(
DisconnectReason::Kicked,
TextComponent::translate_cross(
pumpkin_macros::translate_cross!(
translation::java::MULTIPLAYER_DISCONNECT_NOT_WHITELISTED,
translation::java::MULTIPLAYER_DISCONNECT_NOT_WHITELISTED,
&[],
translation::bedrock::DISCONNECT_KICKED
),
)
.await;
@ -60,18 +59,18 @@ impl CommandExecutor for OnExecutor {
Box::pin(async move {
let previous = server.white_list.swap(true, Ordering::Relaxed);
if previous {
Err(CommandError::CommandFailed(TextComponent::translate_cross(
translation::java::COMMANDS_WHITELIST_ALREADYON,
translation::java::COMMANDS_WHITELIST_ALREADYON,
&[],
)))
Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_ALREADYON,
translation::bedrock::COMMANDS_ALLOWLIST_ENABLED
),
))
} else {
kick_non_whitelisted_players(server).await;
sender
.send_message(TextComponent::translate_cross(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_ENABLED,
translation::java::COMMANDS_WHITELIST_ENABLED,
&[],
translation::bedrock::COMMANDS_ALLOWLIST_ENABLED
))
.await;
Ok(1)
@ -93,19 +92,19 @@ impl CommandExecutor for OffExecutor {
let previous = server.white_list.swap(false, Ordering::Relaxed);
if previous {
sender
.send_message(TextComponent::translate_cross(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_DISABLED,
translation::java::COMMANDS_WHITELIST_DISABLED,
&[],
translation::bedrock::COMMANDS_ALLOWLIST_DISABLED
))
.await;
Ok(1)
} else {
Err(CommandError::CommandFailed(TextComponent::translate_cross(
translation::java::COMMANDS_WHITELIST_ALREADYOFF,
translation::java::COMMANDS_WHITELIST_ALREADYOFF,
&[],
)))
Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_ALREADYOFF,
translation::bedrock::COMMANDS_ALLOWLIST_DISABLED
),
))
}
})
}
@ -124,10 +123,9 @@ impl CommandExecutor for ListExecutor {
let whitelist = &server.data.whitelist_config.read().await.whitelist;
if whitelist.is_empty() {
sender
.send_message(TextComponent::translate_cross(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_NONE,
translation::java::COMMANDS_WHITELIST_NONE,
[],
translation::bedrock::COMMANDS_ALLOWLIST_LIST
))
.await;
return Ok(0);
@ -142,13 +140,11 @@ impl CommandExecutor for ListExecutor {
let names_len = names.len() as i32;
sender
.send_message(TextComponent::translate_cross(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_LIST,
translation::java::COMMANDS_WHITELIST_LIST,
[
TextComponent::text(whitelist.len().to_string()),
TextComponent::text(names),
],
translation::bedrock::COMMANDS_ALLOWLIST_LIST,
TextComponent::text(whitelist.len().to_string()),
TextComponent::text(names)
))
.await;
@ -170,10 +166,9 @@ impl CommandExecutor for ReloadExecutor {
*server.data.whitelist_config.write().await = WhitelistConfig::load();
kick_non_whitelisted_players(server).await;
sender
.send_message(TextComponent::translate_cross(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_RELOADED,
translation::java::COMMANDS_WHITELIST_RELOADED,
&[],
translation::bedrock::COMMANDS_ALLOWLIST_RELOADED
))
.await;
Ok(1)
@ -212,10 +207,10 @@ impl CommandExecutor for AddExecutor {
.whitelist
.push(WhitelistEntry::new(profile.id, profile.name.clone()));
sender
.send_message(TextComponent::translate_cross(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_ADD_SUCCESS,
translation::java::COMMANDS_WHITELIST_ADD_SUCCESS,
[TextComponent::text(profile.name.clone())],
translation::bedrock::COMMANDS_ALLOWLIST_ADD_SUCCESS,
TextComponent::text(profile.name.clone())
))
.await;
successes += 1;
@ -224,11 +219,12 @@ impl CommandExecutor for AddExecutor {
whitelist.save();
if successes == 0 {
Err(CommandError::CommandFailed(TextComponent::translate_cross(
translation::java::COMMANDS_WHITELIST_ADD_FAILED,
translation::java::COMMANDS_WHITELIST_ADD_FAILED,
&[],
)))
Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_ADD_FAILED,
translation::bedrock::COMMANDS_ALLOWLIST_ADD_FAILED
),
))
} else {
Ok(successes)
}
@ -261,10 +257,10 @@ impl CommandExecutor for RemoveExecutor {
if let Some(i) = i {
whitelist.whitelist.remove(i);
sender
.send_message(TextComponent::translate_cross(
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_REMOVE_SUCCESS,
translation::java::COMMANDS_WHITELIST_REMOVE_SUCCESS,
[TextComponent::text(player.name.clone())],
translation::bedrock::COMMANDS_ALLOWLIST_REMOVE_SUCCESS,
TextComponent::text(player.name.clone())
))
.await;
successes += 1;
@ -277,11 +273,12 @@ impl CommandExecutor for RemoveExecutor {
kick_non_whitelisted_players(server).await;
if successes == 0 {
Err(CommandError::CommandFailed(TextComponent::translate_cross(
translation::java::COMMANDS_WHITELIST_REMOVE_FAILED,
translation::java::COMMANDS_WHITELIST_REMOVE_FAILED,
&[],
)))
Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WHITELIST_REMOVE_FAILED,
translation::bedrock::COMMANDS_ALLOWLIST_REMOVE_FAILED
),
))
} else {
Ok(successes)
}

View File

@ -1,3 +1,4 @@
use pumpkin_data::translation;
use pumpkin_util::{math::vector2::Vector2, text::TextComponent};
use crate::command::{
@ -16,8 +17,6 @@ const NAMES: [&str; 1] = ["worldborder"];
const DESCRIPTION: &str = "Worldborder command.";
const NOTHING_CHANGED_EXCEPTION: &str = "commands.worldborder.set.failed.nochange";
const fn distance_consumer() -> BoundedNumArgumentConsumer<f64> {
BoundedNumArgumentConsumer::new().min(0.0).name("distance")
}
@ -59,10 +58,10 @@ impl CommandExecutor for GetExecutor {
let diameter = border.new_diameter.round() as i32;
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.get",
"commands.worldborder.get",
[TextComponent::text(diameter.to_string())],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_GET,
translation::bedrock::COMMANDS_WORLDBORDER_GET_SUCCESS,
TextComponent::text(diameter.to_string())
))
.await;
@ -96,22 +95,24 @@ impl CommandExecutor for SetExecutor {
};
if (distance - border.new_diameter).abs() < f64::EPSILON {
return Err(CommandError::CommandFailed(TextComponent::translate_cross(
NOTHING_CHANGED_EXCEPTION,
NOTHING_CHANGED_EXCEPTION,
[],
)));
return Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_SET_FAILED_NOCHANGE,
translation::bedrock::COMMANDS_WORLDBORDER_SET_SUCCESS
),
));
}
let d = border.new_diameter;
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.set.immediate",
"commands.worldborder.set.immediate",
[TextComponent::text(format!("{distance:.1}"))],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_SET_IMMEDIATE,
translation::bedrock::COMMANDS_WORLDBORDER_SET_SUCCESS,
TextComponent::text(format!("{distance:.1}")),
TextComponent::text(format!("{d:.1}"))
))
.await;
let d = border.new_diameter;
border.set_diameter(world, distance, None);
Ok((distance - d) as i32)
@ -149,37 +150,37 @@ impl CommandExecutor for SetTimeExecutor {
))));
};
let old_dist = format!("{:.1}", border.new_diameter);
match distance.total_cmp(&border.new_diameter) {
std::cmp::Ordering::Equal => {
return Err(CommandError::CommandFailed(TextComponent::translate_cross(
NOTHING_CHANGED_EXCEPTION,
NOTHING_CHANGED_EXCEPTION,
[],
)));
return Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_SET_FAILED_NOCHANGE,
translation::bedrock::COMMANDS_WORLDBORDER_SET_SUCCESS
),
));
}
std::cmp::Ordering::Less => {
let dist = format!("{distance:.1}");
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.set.shrink",
"commands.worldborder.set.shrink",
[
TextComponent::text(dist),
TextComponent::text(time.to_string()),
],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_SET_SHRINK,
translation::bedrock::COMMANDS_WORLDBORDER_SETSLOWLY_SHRINK_SUCCESS,
TextComponent::text(dist),
TextComponent::text(old_dist),
TextComponent::text(time.to_string())
))
.await;
}
std::cmp::Ordering::Greater => {
let dist = format!("{distance:.1}");
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.set.grow",
"commands.worldborder.set.grow",
[
TextComponent::text(dist),
TextComponent::text(time.to_string()),
],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_SET_GROW,
translation::bedrock::COMMANDS_WORLDBORDER_SETSLOWLY_GROW_SUCCESS,
TextComponent::text(dist),
TextComponent::text(old_dist),
TextComponent::text(time.to_string())
))
.await;
}
@ -218,21 +219,24 @@ impl CommandExecutor for AddExecutor {
};
if distance_add == 0.0 {
return Err(CommandError::CommandFailed(TextComponent::translate_cross(
NOTHING_CHANGED_EXCEPTION,
NOTHING_CHANGED_EXCEPTION,
[],
)));
return Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_SET_FAILED_NOCHANGE,
translation::bedrock::COMMANDS_WORLDBORDER_SET_SUCCESS
),
));
}
let distance = border.new_diameter + distance_add;
let dist = format!("{distance:.1}");
let old_dist = format!("{:.1}", border.new_diameter);
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.set.immediate",
"commands.worldborder.set.immediate",
[TextComponent::text(dist)],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_SET_IMMEDIATE,
translation::bedrock::COMMANDS_WORLDBORDER_SET_SUCCESS,
TextComponent::text(dist),
TextComponent::text(old_dist)
))
.await;
border.set_diameter(world, distance, None);
@ -273,6 +277,7 @@ impl CommandExecutor for AddTimeExecutor {
let distance = distance_add + border.new_diameter;
let old_dist = format!("{:.1}", border.new_diameter);
match distance.total_cmp(&border.new_diameter) {
std::cmp::Ordering::Equal => {
return Err(CommandError::CommandFailed(TextComponent::text(format!(
@ -283,26 +288,24 @@ impl CommandExecutor for AddTimeExecutor {
std::cmp::Ordering::Less => {
let dist = format!("{distance:.1}");
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.set.shrink",
"commands.worldborder.set.shrink",
[
TextComponent::text(dist),
TextComponent::text(time.to_string()),
],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_SET_SHRINK,
translation::bedrock::COMMANDS_WORLDBORDER_SETSLOWLY_SHRINK_SUCCESS,
TextComponent::text(dist),
TextComponent::text(old_dist),
TextComponent::text(time.to_string())
))
.await;
}
std::cmp::Ordering::Greater => {
let dist = format!("{distance:.1}");
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.set.grow",
"commands.worldborder.set.grow",
[
TextComponent::text(dist),
TextComponent::text(time.to_string()),
],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_SET_GROW,
translation::bedrock::COMMANDS_WORLDBORDER_SETSLOWLY_GROW_SUCCESS,
TextComponent::text(dist),
TextComponent::text(old_dist),
TextComponent::text(time.to_string())
))
.await;
}
@ -335,13 +338,11 @@ impl CommandExecutor for CenterExecutor {
let Vector2 { x, y } = Position2DArgumentConsumer.find_arg_default_name(args)?;
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.center.success",
"commands.worldborder.center.success",
[
TextComponent::text(format!("{x:.2}")),
TextComponent::text(format!("{y:.2}")),
],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_CENTER_SUCCESS,
translation::bedrock::COMMANDS_WORLDBORDER_CENTER_SUCCESS,
TextComponent::text(format!("{x:.2}")),
TextComponent::text(format!("{y:.2}"))
))
.await;
border.set_center(world, x, y);
@ -376,19 +377,22 @@ impl CommandExecutor for DamageAmountExecutor {
};
if (damage_per_block - border.damage_per_block).abs() < f32::EPSILON {
return Err(CommandError::CommandFailed(TextComponent::translate_cross(
"commands.worldborder.damage.amount.failed",
"commands.worldborder.damage.amount.failed",
[],
)));
return Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_DAMAGE_AMOUNT_FAILED,
translation::bedrock::COMMANDS_WORLDBORDER_DAMAGE_AMOUNT_SUCCESS
),
));
}
let damage = format!("{damage_per_block:.2}");
let old_damage = format!("{:.2}", border.damage_per_block);
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.damage.amount.success",
"commands.worldborder.damage.amount.success",
[TextComponent::text(damage)],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_DAMAGE_AMOUNT_SUCCESS,
translation::bedrock::COMMANDS_WORLDBORDER_DAMAGE_AMOUNT_SUCCESS,
TextComponent::text(damage),
TextComponent::text(old_damage)
))
.await;
border.damage_per_block = damage_per_block;
@ -422,19 +426,22 @@ impl CommandExecutor for DamageBufferExecutor {
};
if (buffer - border.buffer).abs() < f32::EPSILON {
return Err(CommandError::CommandFailed(TextComponent::translate_cross(
"commands.worldborder.damage.amount.failed",
"commands.worldborder.damage.amount.failed",
[],
)));
return Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_DAMAGE_BUFFER_FAILED,
translation::bedrock::COMMANDS_WORLDBORDER_DAMAGE_BUFFER_SUCCESS
),
));
}
let buf = format!("{buffer:.2}");
let old_buf = format!("{:.2}", border.buffer);
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.damage.buffer.success",
"commands.worldborder.damage.buffer.success",
[TextComponent::text(buf)],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_DAMAGE_BUFFER_SUCCESS,
translation::bedrock::COMMANDS_WORLDBORDER_DAMAGE_BUFFER_SUCCESS,
TextComponent::text(buf),
TextComponent::text(old_buf)
))
.await;
border.buffer = buffer;
@ -468,18 +475,20 @@ impl CommandExecutor for WarningDistanceExecutor {
};
if distance == border.warning_blocks {
return Err(CommandError::CommandFailed(TextComponent::translate_cross(
"commands.worldborder.warning.distance.failed",
"commands.worldborder.warning.distance.failed",
[],
)));
return Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_WARNING_DISTANCE_FAILED,
translation::bedrock::COMMANDS_WORLDBORDER_WARNING_DISTANCE_SUCCESS
),
));
}
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.warning.distance.success",
"commands.worldborder.warning.distance.success",
[TextComponent::text(distance.to_string())],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_WARNING_DISTANCE_SUCCESS,
translation::bedrock::COMMANDS_WORLDBORDER_WARNING_DISTANCE_SUCCESS,
TextComponent::text(distance.to_string()),
TextComponent::text(border.warning_blocks.to_string())
))
.await;
border.set_warning_distance(world, distance);
@ -513,18 +522,20 @@ impl CommandExecutor for WarningTimeExecutor {
};
if time == border.warning_time {
return Err(CommandError::CommandFailed(TextComponent::translate_cross(
"commands.worldborder.warning.time.failed",
"commands.worldborder.warning.time.failed",
[],
)));
return Err(CommandError::CommandFailed(
pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_WARNING_TIME_FAILED,
translation::bedrock::COMMANDS_WORLDBORDER_WARNING_TIME_SUCCESS
),
));
}
sender
.send_message(TextComponent::translate_cross(
"commands.worldborder.warning.time.success",
"commands.worldborder.warning.time.success",
[TextComponent::text(time.to_string())],
.send_message(pumpkin_macros::translate_cross!(
translation::java::COMMANDS_WORLDBORDER_WARNING_TIME_SUCCESS,
translation::bedrock::COMMANDS_WORLDBORDER_WARNING_TIME_SUCCESS,
TextComponent::text(time.to_string()),
TextComponent::text(border.warning_time.to_string())
))
.await;
border.set_warning_delay(world, time);

View File

@ -1,7 +1,7 @@
#![deny(clippy::unwrap_used)]
#![cfg_attr(test, allow(clippy::unwrap_used, clippy::expect_used, clippy::panic))]
// Not warn event sending macros
#![allow(unused_labels)]
#![allow(unused_labels, deprecated)]
#[macro_use]
extern crate pumpkin_macros;

View File

@ -250,9 +250,9 @@ impl JavaClient {
{
self.wait_for_keep_alive.store(false, Ordering::Relaxed);
} else {
self.kick(TextComponent::translate(
self.kick(pumpkin_macros::translate_cross!(
translation::java::DISCONNECT_TIMEOUT,
[],
translation::bedrock::DISCONNECT_TIMEOUT
))
.await;
}

View File

@ -198,7 +198,7 @@ impl JavaClient {
_ = keep_alive_interval.tick() => {
// If the client never responded to the LAST keep-alive, they timed out.
if self.wait_for_keep_alive.load(Ordering::Relaxed) {
self.kick(TextComponent::translate(translation::java::DISCONNECT_TIMEOUT, [])).await;
self.kick(pumpkin_macros::translate_cross!(translation::java::DISCONNECT_TIMEOUT, translation::bedrock::DISCONNECT_TIMEOUT)).await;
break;
}

View File

@ -2193,9 +2193,9 @@ impl JavaClient {
);
self.wait_for_keep_alive.store(false, Ordering::Relaxed);
} else {
self.kick(TextComponent::translate(
self.kick(pumpkin_macros::translate_cross!(
translation::java::DISCONNECT_TIMEOUT,
[],
translation::bedrock::DISCONNECT_TIMEOUT
))
.await;
}

View File

@ -27,5 +27,10 @@ syn = { version = "3.0", features = ["full", "extra-traits"] }
pumpkin-util = { path = "../../crates/pumpkin-util", features = ["codegen"] }
pumpkin-nbt = { path = "../../crates/pumpkin-nbt" }
[lints]
workspace = true
[lints.clippy]
expect_used = "allow"
unwrap_used = "allow"
panic = "allow"
indexing_slicing = "allow"
pedantic = { level = "allow", priority = -1 }
all = { level = "allow", priority = -1 }

View File

@ -314,6 +314,7 @@ pub fn build() -> TokenStream {
}
true
}
#[allow(deprecated)]
pub fn get_fullname(&self, level: i32) -> TextComponent {
let mut ret = TextComponent::translate(self.description, []).color_named(
if self.has_tag(&EnchantmentTag::MINECRAFT_CURSE) {

View File

@ -1614,13 +1614,20 @@ pub fn build() -> TokenStream {
#constants
#[must_use]
#[allow(deprecated)]
pub fn translated_name(&self) -> TextComponent {
TextComponent::translate(
self.components
.iter()
.find_map(|(id, data)| (id == &ItemName).then(|| data.as_any().downcast_ref::<ItemNameImpl>().unwrap().name)).unwrap(),
&[],
)
let name = self
.components
.iter()
.find_map(|(id, data)| {
if id == &ItemName {
data.as_any().downcast_ref::<ItemNameImpl>().map(|n| n.name)
} else {
None
}
})
.unwrap_or(self.registry_key);
TextComponent::translate(name, &[])
}
#[doc = "Try to parse an item from a resource location string."]

View File

@ -9,8 +9,10 @@ pub fn build() -> TokenStream {
.unwrap();
let mut java_constants = TokenStream::new();
let mut java_match_arms = TokenStream::new();
for (name, value) in &java_json {
let ident = to_valid_ident(name);
let ident_str = ident.to_string();
let doc = if !value.is_empty() {
quote!(#[doc = #value])
} else {
@ -20,11 +22,15 @@ pub fn build() -> TokenStream {
#doc
pub const #ident: &str = #name;
});
java_match_arms.extend(quote! {
#ident_str => Some(#ident),
});
}
let bedrock_content =
fs::read_to_string("../../assets/en_us_bedrock.lang").expect("en_us_bedrock is missing");
let mut bedrock_constants = TokenStream::new();
let mut bedrock_match_arms = TokenStream::new();
for line in bedrock_content.lines() {
let line = line.trim();
@ -36,6 +42,7 @@ pub fn build() -> TokenStream {
let name = name.trim();
let value = value.trim();
let ident = to_valid_ident(name);
let ident_str = ident.to_string();
let doc = if !value.is_empty() {
quote!(#[doc = #value])
@ -46,6 +53,32 @@ pub fn build() -> TokenStream {
#doc
pub const #ident: &str = #name;
});
bedrock_match_arms.extend(quote! {
#ident_str => Some(#ident),
});
}
}
let mut java_value_match_arms = TokenStream::new();
for (name, value) in &java_json {
java_value_match_arms.extend(quote! {
#name => Some(#value),
});
}
let mut bedrock_value_match_arms = TokenStream::new();
for line in bedrock_content.lines() {
let line = line.trim();
if line.is_empty() || line.starts_with('#') || line.starts_with('/') {
continue;
}
if let Some((name, value)) = line.split_once('=') {
let name = name.trim();
let value = value.trim();
bedrock_value_match_arms.extend(quote! {
#name => Some(#value),
});
}
}
@ -54,9 +87,33 @@ pub fn build() -> TokenStream {
#![allow(clippy::doc_markdown)]
pub mod java {
#java_constants
pub fn get(const_name: &str) -> Option<&'static str> {
match const_name {
#java_match_arms
_ => None,
}
}
pub fn get_value(key: &str) -> Option<&'static str> {
match key {
#java_value_match_arms
_ => None,
}
}
}
pub mod bedrock {
#bedrock_constants
pub fn get(const_name: &str) -> Option<&'static str> {
match const_name {
#bedrock_match_arms
_ => None,
}
}
pub fn get_value(key: &str) -> Option<&'static str> {
match key {
#bedrock_value_match_arms
_ => None,
}
}
}
}
}