Skip to content

Commit

Permalink
parse ChunkStatus at compile time
Browse files Browse the repository at this point in the history
  • Loading branch information
Snowiiii committed Jan 10, 2025
1 parent 7b205fe commit da268b5
Show file tree
Hide file tree
Showing 9 changed files with 49 additions and 34 deletions.
1 change: 1 addition & 0 deletions assets/chunk_status.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
["empty","structure_starts","structure_references","biomes","noise","surface","carvers","features","initialize_light","light","spawn","full"]
3 changes: 3 additions & 0 deletions pumpkin-data/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions pumpkin-data/build/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) {
Expand Down
31 changes: 31 additions & 0 deletions pumpkin-data/build/chunk_status.rs
Original file line number Diff line number Diff line change
@@ -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<String> =
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
}
}
}
6 changes: 3 additions & 3 deletions pumpkin-data/build/particle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ use crate::ident;
pub(crate) fn build() -> TokenStream {
println!("cargo:rerun-if-changed=assets/particles.json");

let screens: Vec<String> = serde_json::from_str(include_str!("../../assets/particles.json"))
let particle: Vec<String> = 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,
Expand Down
6 changes: 3 additions & 3 deletions pumpkin-data/build/sound.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ use crate::ident;
pub(crate) fn build() -> TokenStream {
println!("cargo:rerun-if-changed=assets/sounds.json");

let screens: Vec<String> = serde_json::from_str(include_str!("../../assets/sounds.json"))
let sound: Vec<String> = 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,
Expand Down
4 changes: 4 additions & 0 deletions pumpkin-data/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
}
1 change: 1 addition & 0 deletions pumpkin-world/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
29 changes: 1 addition & 28 deletions pumpkin-world/src/chunk/mod.rs
Original file line number Diff line number Diff line change
@@ -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};
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit da268b5

Please sign in to comment.