From ff1f3a0fbdf1f6fb058c54a0ed32a2b239d08a3f Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Thu, 15 Jan 2026 21:10:18 +0100 Subject: [PATCH] remove: pumpkin-registry it is gone for good, i made the new registry be parsed from compile time in pumpkin-nbt and even parse the nbt code at compile time as well, And like expected this gives a massive speedup in first time parsing and also decreased bin size --- Cargo.lock | 69 ++++---- Cargo.toml | 2 - flake.nix | 1 - pumpkin-data/Cargo.toml | 2 + pumpkin-data/build/build.rs | 2 + pumpkin-data/build/registry.rs | 149 ++++++++++++++++++ pumpkin-data/src/lib.rs | 4 + .../src/java/client/config/registry_data.rs | 4 + pumpkin-registry/Cargo.toml | 13 -- pumpkin-registry/src/banner_pattern.rs | 8 - pumpkin-registry/src/biome.rs | 70 -------- pumpkin-registry/src/cat.rs | 6 - pumpkin-registry/src/chat_type.rs | 16 -- pumpkin-registry/src/chicken.rs | 6 - pumpkin-registry/src/cow.rs | 6 - pumpkin-registry/src/damage_type.rs | 12 -- pumpkin-registry/src/enchantment.rs | 12 -- pumpkin-registry/src/frog.rs | 6 - pumpkin-registry/src/instrument.rs | 9 -- pumpkin-registry/src/jukebox_song.rs | 14 -- pumpkin-registry/src/lib.rs | 108 ------------- pumpkin-registry/src/paint.rs | 13 -- pumpkin-registry/src/pig.rs | 6 - pumpkin-registry/src/trim_material.rs | 7 - pumpkin-registry/src/trim_pattern.rs | 9 -- pumpkin-registry/src/wolf.rs | 22 --- pumpkin/Cargo.toml | 1 - pumpkin/src/block/blocks/jukebox.rs | 4 +- pumpkin/src/net/java/config.rs | 14 +- pumpkin/src/server/mod.rs | 2 +- 30 files changed, 201 insertions(+), 396 deletions(-) create mode 100644 pumpkin-data/build/registry.rs delete mode 100644 pumpkin-registry/Cargo.toml delete mode 100644 pumpkin-registry/src/banner_pattern.rs delete mode 100644 pumpkin-registry/src/biome.rs delete mode 100644 pumpkin-registry/src/cat.rs delete mode 100644 pumpkin-registry/src/chat_type.rs delete mode 100644 pumpkin-registry/src/chicken.rs delete mode 100644 pumpkin-registry/src/cow.rs delete mode 100644 pumpkin-registry/src/damage_type.rs delete mode 100644 pumpkin-registry/src/enchantment.rs delete mode 100644 pumpkin-registry/src/frog.rs delete mode 100644 pumpkin-registry/src/instrument.rs delete mode 100644 pumpkin-registry/src/jukebox_song.rs delete mode 100644 pumpkin-registry/src/lib.rs delete mode 100644 pumpkin-registry/src/paint.rs delete mode 100644 pumpkin-registry/src/pig.rs delete mode 100644 pumpkin-registry/src/trim_material.rs delete mode 100644 pumpkin-registry/src/trim_pattern.rs delete mode 100644 pumpkin-registry/src/wolf.rs diff --git a/Cargo.lock b/Cargo.lock index 9b5e417e2..1c308b9bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -379,9 +379,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" [[package]] name = "colorchoice" @@ -1522,9 +1522,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.83" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -2110,7 +2110,6 @@ dependencies = [ "pumpkin-macros", "pumpkin-nbt", "pumpkin-protocol", - "pumpkin-registry", "pumpkin-util", "pumpkin-world", "rand", @@ -2159,6 +2158,7 @@ version = "0.1.0-dev+1.21.11" dependencies = [ "crc-fast", "heck", + "indexmap", "phf", "proc-macro2", "pumpkin-nbt", @@ -2229,17 +2229,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "pumpkin-registry" -version = "0.1.0-dev+1.21.11" -dependencies = [ - "indexmap", - "pumpkin-protocol", - "pumpkin-util", - "serde", - "serde_json", -] - [[package]] name = "pumpkin-util" version = "0.1.0-dev+1.21.11" @@ -2323,7 +2312,7 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" version = "0.10.0-rc.6" -source = "git+https://github.com/rust-random/rand#da2211b80e7217403b2bd8305a98ae7bc61c1146" +source = "git+https://github.com/rust-random/rand#f356bbae5817f382b19ac5741b549c4d2cd49b50" dependencies = [ "chacha20", "getrandom 0.4.0-rc.0", @@ -2948,9 +2937,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" dependencies = [ "deranged", "itoa", @@ -2958,22 +2947,22 @@ dependencies = [ "num-conv", "num_threads", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" dependencies = [ "num-conv", "time-core", @@ -3133,9 +3122,9 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -3377,18 +3366,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -3399,9 +3388,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3409,9 +3398,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", @@ -3422,9 +3411,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] @@ -3648,9 +3637,9 @@ checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" [[package]] name = "writeable" @@ -3763,6 +3752,6 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac93432f5b761b22864c774aac244fa5c0fd877678a4c37ebf6cf42208f9c9ec" +checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" diff --git a/Cargo.toml b/Cargo.toml index 748bb905b..6ec2341be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,6 @@ members = [ "pumpkin-inventory", "pumpkin-macros/", "pumpkin-protocol/", - "pumpkin-registry/", "pumpkin-world", "pumpkin/", "pumpkin-data", @@ -88,7 +87,6 @@ pumpkin-inventory = { path = "pumpkin-inventory" } pumpkin-macros = { path = "pumpkin-macros" } pumpkin-nbt = { path = "pumpkin-nbt" } pumpkin-protocol = { path = "pumpkin-protocol" } -pumpkin-registry = { path = "pumpkin-registry" } pumpkin-util = { path = "pumpkin-util" } pumpkin-world = { path = "pumpkin-world" } quote = "1.0" diff --git a/flake.nix b/flake.nix index 58be27082..1194d3d6d 100644 --- a/flake.nix +++ b/flake.nix @@ -56,7 +56,6 @@ ./pumpkin-macros ./pumpkin-nbt ./pumpkin-protocol - ./pumpkin-registry ./pumpkin-util ./pumpkin-world ]; diff --git a/pumpkin-data/Cargo.toml b/pumpkin-data/Cargo.toml index e01dcbfcf..8c87af64d 100644 --- a/pumpkin-data/Cargo.toml +++ b/pumpkin-data/Cargo.toml @@ -13,6 +13,8 @@ serde.workspace = true crc-fast.workspace = true [build-dependencies] +indexmap = { workspace = true, features = ["serde"] } + pumpkin-util.workspace = true pumpkin-nbt.workspace = true diff --git a/pumpkin-data/build/build.rs b/pumpkin-data/build/build.rs index 0f0922294..eb87bc8ec 100644 --- a/pumpkin-data/build/build.rs +++ b/pumpkin-data/build/build.rs @@ -39,6 +39,7 @@ mod potion; mod potion_brewing; mod recipe_remainder; mod recipes; +mod registry; mod scoreboard_slot; mod screen; mod sound; @@ -67,6 +68,7 @@ pub fn main() { (chunk_status::build, "chunk_status.rs"), (game_event::build, "game_event.rs"), (game_rules::build, "game_rules.rs"), + (registry::build, "registry.rs"), (dimension::build, "dimension.rs"), (sound_category::build, "sound_category.rs"), (entity_pose::build, "entity_pose.rs"), diff --git a/pumpkin-data/build/registry.rs b/pumpkin-data/build/registry.rs new file mode 100644 index 000000000..9e8b864ff --- /dev/null +++ b/pumpkin-data/build/registry.rs @@ -0,0 +1,149 @@ +use indexmap::IndexMap; +use proc_macro2::{Literal, TokenStream}; +use quote::quote; +use serde_json::Value; +use std::fs; + +pub(crate) fn build() -> TokenStream { + println!("cargo:rerun-if-changed=../assets/synced_registries.json"); + + let json_str = fs::read_to_string("../assets/synced_registries.json") + .expect("Failed to read synced_registries.json"); + let mut data: IndexMap> = + serde_json::from_str(&json_str).expect("Failed to parse synced_registries.json"); + + let chat_type = if data.contains_key("minecraft:chat_type") { + data.get_mut("minecraft:chat_type") + } else { + data.get_mut("chat_type") + }; + + if let Some(chat_type) = chat_type { + chat_type.insert( + "raw".to_string(), + serde_json::json!({ + "chat": { + "translation_key": "%s", + "parameters": ["content"], + "style": null + }, + "narration": { + "translation_key": "%s says %s", + "parameters": ["sender", "content"], + "style": null + } + }), + ); + } + + let registries_tokens = data.iter().map(|(reg_name, entries)| { + let entry_tokens = entries.iter().map(|(entry_name, entry_data)| { + let mut nbt_bytes = Vec::new(); + pumpkin_nbt::serializer::to_bytes_unnamed(entry_data, &mut nbt_bytes) + .expect("Failed to serialize NBT at build time"); + + let nbt_literal = Literal::byte_string(&nbt_bytes); + + quote! { + StaticRegistryEntry { + name: #entry_name, + nbt_bytes: #nbt_literal, + } + } + }); + + quote! { + StaticRegistry { + registry_id: #reg_name, + entries: &[#(#entry_tokens),*], + } + } + }); + + let jukebox_entries = data + .get("minecraft:jukebox_song") + .or_else(|| data.get("jukebox_song")); + + let jukebox_index_arms = jukebox_entries + .map(|entries| { + entries + .iter() + .enumerate() + .map(|(index, (name, _))| { + quote! { #name => Some(#index), } + }) + .collect::() + }) + .unwrap_or_default(); + + quote! { + use pumpkin_util::resource_location::ResourceLocation; + + pub struct StaticRegistryEntry { + pub name: &'static str, + pub nbt_bytes: &'static [u8], + } + + pub struct StaticRegistry { + pub registry_id: &'static str, + pub entries: &'static [StaticRegistryEntry], + } + + pub static SYNCED_REGISTRIES: &[StaticRegistry] = &[ + #(#registries_tokens),* + ]; + + pub struct RegistryEntryData { + pub entry_id: ResourceLocation, + pub data: Option>, + } + + pub struct Registry { + pub registry_id: ResourceLocation, + pub registry_entries: Vec, + } + + pub struct SyncedRegistry; + + impl SyncedRegistry { + pub fn get_jukebox_song_index(song_key: &str) -> Option { + match song_key { + #jukebox_index_arms + _ => None + } + } + } + + impl Registry { + pub fn get_synced() -> Vec { + SYNCED_REGISTRIES.iter().map(|static_reg| { + let registry_id = if static_reg.registry_id.contains(':') { + ResourceLocation::from(static_reg.registry_id) + } else { + ResourceLocation::vanilla(static_reg.registry_id) + }; + + let registry_entries = static_reg.entries.iter().map(|entry| { + let entry_id = if entry.name.contains(':') { + ResourceLocation::from(entry.name) + } else { + ResourceLocation::vanilla(entry.name) + }; + + let data = Some(entry.nbt_bytes.to_vec().into_boxed_slice()); + + RegistryEntryData { + entry_id, + data, + } + }).collect(); + + Self { + registry_id, + registry_entries, + } + }).collect() + } + } + } +} diff --git a/pumpkin-data/src/lib.rs b/pumpkin-data/src/lib.rs index c1b49957c..7a80be068 100644 --- a/pumpkin-data/src/lib.rs +++ b/pumpkin-data/src/lib.rs @@ -8,6 +8,10 @@ pub mod item; #[path = "generated/packet.rs"] pub mod packet; +#[rustfmt::skip] +#[path = "generated/registry.rs"] +pub mod registry; + #[rustfmt::skip] #[path = "generated/screen.rs"] pub mod screen; diff --git a/pumpkin-protocol/src/java/client/config/registry_data.rs b/pumpkin-protocol/src/java/client/config/registry_data.rs index b9dfd8c63..f4e1adbf6 100644 --- a/pumpkin-protocol/src/java/client/config/registry_data.rs +++ b/pumpkin-protocol/src/java/client/config/registry_data.rs @@ -29,6 +29,10 @@ pub struct RegistryEntry { // TODO: No unwraps impl RegistryEntry { + pub fn new(entry_id: ResourceLocation, data: Option>) -> Self { + Self { entry_id, data } + } + pub fn from_nbt(name: &str, nbt: &impl Serialize) -> Self { let mut data_buf = Vec::new(); pumpkin_nbt::serializer::to_bytes_unnamed(nbt, &mut data_buf).unwrap(); diff --git a/pumpkin-registry/Cargo.toml b/pumpkin-registry/Cargo.toml deleted file mode 100644 index fb3f41731..000000000 --- a/pumpkin-registry/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "pumpkin-registry" -version.workspace = true -edition.workspace = true - -[dependencies] -pumpkin-protocol.workspace = true -pumpkin-util.workspace = true - -indexmap = { workspace = true, features = ["serde"] } - -serde.workspace = true -serde_json.workspace = true diff --git a/pumpkin-registry/src/banner_pattern.rs b/pumpkin-registry/src/banner_pattern.rs deleted file mode 100644 index dc2095a4f..000000000 --- a/pumpkin-registry/src/banner_pattern.rs +++ /dev/null @@ -1,8 +0,0 @@ -use pumpkin_util::resource_location::ResourceLocation; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct BannerPattern { - asset_id: ResourceLocation, - translation_key: String, -} diff --git a/pumpkin-registry/src/biome.rs b/pumpkin-registry/src/biome.rs deleted file mode 100644 index 74546bb98..000000000 --- a/pumpkin-registry/src/biome.rs +++ /dev/null @@ -1,70 +0,0 @@ -use pumpkin_protocol::codec::var_int::VarInt; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Biome { - has_precipitation: bool, - temperature: f32, - #[serde(skip_serializing_if = "Option::is_none")] - temperature_modifier: Option, - downfall: f32, - effects: BiomeEffects, -} -#[derive(Debug, Clone, Serialize, Deserialize)] -struct BiomeEffects { - fog_color: i32, - water_color: i32, - water_fog_color: i32, - sky_color: i32, - #[serde(skip_serializing_if = "Option::is_none")] - foliage_color: Option, - #[serde(skip_serializing_if = "Option::is_none")] - grass_color: Option, - #[serde(skip_serializing_if = "Option::is_none")] - grass_color_modifier: Option, - #[serde(skip_serializing_if = "Option::is_none")] - particle: Option, - #[serde(skip_serializing_if = "Option::is_none")] - ambient_sound: Option, - #[serde(skip_serializing_if = "Option::is_none")] - mood_sound: Option, - #[serde(skip_serializing_if = "Option::is_none")] - additions_sound: Option, - // #[serde(skip_serializing_if = "Option::is_none")] - // music: Option>>, - music_volume: f32, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -struct Particle { - options: ParticleOptions, - probability: f32, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -struct ParticleOptions { - r#type: String, - #[serde(skip_serializing_if = "Option::is_none")] - value: Option, -} -#[derive(Debug, Clone, Serialize, Deserialize)] -struct MoodSound { - sound: String, - tick_delay: i32, - block_search_extent: i32, - offset: f64, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -struct AdditionsSound { - sound: String, - tick_chance: f64, -} - -// #[derive(Debug, Clone, Serialize, Deserialize)] -// struct Music { -// sound: String, -// min_delay: i32, -// max_delay: i32, -// replace_current_music: bool, -// } diff --git a/pumpkin-registry/src/cat.rs b/pumpkin-registry/src/cat.rs deleted file mode 100644 index 96d91230c..000000000 --- a/pumpkin-registry/src/cat.rs +++ /dev/null @@ -1,6 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize)] -pub struct CatVariant { - asset_id: String, -} diff --git a/pumpkin-registry/src/chat_type.rs b/pumpkin-registry/src/chat_type.rs deleted file mode 100644 index 5405bbb33..000000000 --- a/pumpkin-registry/src/chat_type.rs +++ /dev/null @@ -1,16 +0,0 @@ -use pumpkin_util::text::style::Style; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ChatType { - pub chat: Decoration, - pub narration: Decoration, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Decoration { - pub translation_key: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub style: Option