From da268b548b5686318c1f898f10e1ea6c7d2e6e89 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Fri, 10 Jan 2025 15:31:20 +0100 Subject: [PATCH] parse ChunkStatus at compile time --- assets/chunk_status.json | 1 + pumpkin-data/Cargo.toml | 3 +++ pumpkin-data/build/build.rs | 2 ++ pumpkin-data/build/chunk_status.rs | 31 ++++++++++++++++++++++++++++++ pumpkin-data/build/particle.rs | 6 +++--- pumpkin-data/build/sound.rs | 6 +++--- pumpkin-data/src/lib.rs | 4 ++++ pumpkin-world/Cargo.toml | 1 + pumpkin-world/src/chunk/mod.rs | 29 +--------------------------- 9 files changed, 49 insertions(+), 34 deletions(-) create mode 100644 assets/chunk_status.json create mode 100644 pumpkin-data/build/chunk_status.rs diff --git a/assets/chunk_status.json b/assets/chunk_status.json new file mode 100644 index 000000000..ad1937ca1 --- /dev/null +++ b/assets/chunk_status.json @@ -0,0 +1 @@ +["empty","structure_starts","structure_references","biomes","noise","surface","carvers","features","initialize_light","light","spawn","full"] \ No newline at end of file diff --git a/pumpkin-data/Cargo.toml b/pumpkin-data/Cargo.toml index 7fa999011..9e96d644f 100644 --- a/pumpkin-data/Cargo.toml +++ b/pumpkin-data/Cargo.toml @@ -4,6 +4,9 @@ version.workspace = true edition.workspace = true build = "build/build.rs" +[dependencies] +serde.workspace = true + [build-dependencies] serde.workspace = true serde_json.workspace = true diff --git a/pumpkin-data/build/build.rs b/pumpkin-data/build/build.rs index 118e449da..33024f6cb 100644 --- a/pumpkin-data/build/build.rs +++ b/pumpkin-data/build/build.rs @@ -3,6 +3,7 @@ use std::{env, fs, path::Path, process::Command}; use proc_macro2::{Span, TokenStream}; use syn::Ident; +mod chunk_status; mod packet; mod particle; mod screen; @@ -13,6 +14,7 @@ pub fn main() { write_generated_file(screen::build(), "screen.rs"); write_generated_file(particle::build(), "particle.rs"); write_generated_file(sound::build(), "sound.rs"); + write_generated_file(chunk_status::build(), "chunk_status.rs"); } pub fn write_generated_file(content: TokenStream, out_file: &str) { diff --git a/pumpkin-data/build/chunk_status.rs b/pumpkin-data/build/chunk_status.rs new file mode 100644 index 000000000..079717cc6 --- /dev/null +++ b/pumpkin-data/build/chunk_status.rs @@ -0,0 +1,31 @@ +use heck::ToPascalCase; +use proc_macro2::TokenStream; +use quote::quote; + +use crate::ident; + +pub(crate) fn build() -> TokenStream { + println!("cargo:rerun-if-changed=assets/chunk_status.json"); + + let chunk_status: Vec = + serde_json::from_str(include_str!("../../assets/chunk_status.json")) + .expect("Failed to parse chunk_status.json"); + let mut variants = TokenStream::new(); + + for status in chunk_status.iter() { + let full_name = format!("minecraft:{status}"); + let name = ident(status.to_pascal_case()); + variants.extend([quote! { + #[serde(rename = #full_name)] + #name, + }]); + } + quote! { + use serde::{Deserialize, Serialize}; + + #[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] + pub enum ChunkStatus { + #variants + } + } +} diff --git a/pumpkin-data/build/particle.rs b/pumpkin-data/build/particle.rs index d81f3d336..a36d13fb9 100644 --- a/pumpkin-data/build/particle.rs +++ b/pumpkin-data/build/particle.rs @@ -7,13 +7,13 @@ use crate::ident; pub(crate) fn build() -> TokenStream { println!("cargo:rerun-if-changed=assets/particles.json"); - let screens: Vec = serde_json::from_str(include_str!("../../assets/particles.json")) + let particle: Vec = serde_json::from_str(include_str!("../../assets/particles.json")) .expect("Failed to parse particles.json"); let mut variants = TokenStream::new(); - for (id, screen) in screens.iter().enumerate() { + for (id, particle) in particle.iter().enumerate() { let id = id as u8; - let name = ident(screen.to_pascal_case()); + let name = ident(particle.to_pascal_case()); variants.extend([quote! { #name = #id, diff --git a/pumpkin-data/build/sound.rs b/pumpkin-data/build/sound.rs index 996cbe20a..20ae5987b 100644 --- a/pumpkin-data/build/sound.rs +++ b/pumpkin-data/build/sound.rs @@ -7,13 +7,13 @@ use crate::ident; pub(crate) fn build() -> TokenStream { println!("cargo:rerun-if-changed=assets/sounds.json"); - let screens: Vec = serde_json::from_str(include_str!("../../assets/sounds.json")) + let sound: Vec = serde_json::from_str(include_str!("../../assets/sounds.json")) .expect("Failed to parse sounds.json"); let mut variants = TokenStream::new(); - for (id, screen) in screens.iter().enumerate() { + for (id, sound) in sound.iter().enumerate() { let id = id as u16; - let name = ident(screen.to_pascal_case()); + let name = ident(sound.to_pascal_case()); variants.extend([quote! { #name = #id, diff --git a/pumpkin-data/src/lib.rs b/pumpkin-data/src/lib.rs index 98336ed6c..aa6626e34 100644 --- a/pumpkin-data/src/lib.rs +++ b/pumpkin-data/src/lib.rs @@ -13,3 +13,7 @@ pub mod particle { pub mod sound { include!(concat!(env!("OUT_DIR"), "/sound.rs")); } + +pub mod chunk_status { + include!(concat!(env!("OUT_DIR"), "/chunk_status.rs")); +} diff --git a/pumpkin-world/Cargo.toml b/pumpkin-world/Cargo.toml index 391f13f0c..e92a82d08 100644 --- a/pumpkin-world/Cargo.toml +++ b/pumpkin-world/Cargo.toml @@ -8,6 +8,7 @@ pumpkin-nbt = { path = "../pumpkin-nbt" } pumpkin-util = { path = "../pumpkin-util" } pumpkin-config = { path = "../pumpkin-config" } pumpkin-macros = { path = "../pumpkin-macros" } +pumpkin-data = { path = "../pumpkin-data" } bytes.workspace = true diff --git a/pumpkin-world/src/chunk/mod.rs b/pumpkin-world/src/chunk/mod.rs index 68a87ffed..fe689aeff 100644 --- a/pumpkin-world/src/chunk/mod.rs +++ b/pumpkin-world/src/chunk/mod.rs @@ -1,4 +1,5 @@ use fastnbt::LongArray; +use pumpkin_data::chunk_status::ChunkStatus; use pumpkin_util::math::{ceil_log2, vector2::Vector2}; use serde::{Deserialize, Serialize}; use std::{collections::HashMap, iter::repeat_with}; @@ -161,34 +162,6 @@ struct ChunkNbt { heightmaps: ChunkHeightmaps, } -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] -enum ChunkStatus { - #[serde(rename = "minecraft:empty")] - Empty, - #[serde(rename = "minecraft:structure_starts")] - StructureStarts, - #[serde(rename = "minecraft:structure_references")] - StructureReferences, - #[serde(rename = "minecraft:biomes")] - Biomes, - #[serde(rename = "minecraft:noise")] - Noise, - #[serde(rename = "minecraft:surface")] - Surface, - #[serde(rename = "minecraft:carvers")] - Carvers, - #[serde(rename = "minecraft:features")] - Features, - #[serde(rename = "minecraft:initialize_light")] - InitLight, - #[serde(rename = "minecraft:light")] - Light, - #[serde(rename = "minecraft:spawn")] - Spawn, - #[serde(rename = "minecraft:full")] - Full, -} - /// The Heightmap for a completely empty chunk impl Default for ChunkHeightmaps { fn default() -> Self {