Make block state macro comptime-again

This commit is contained in:
lukas0008 2024-10-19 20:48:19 +02:00
parent c3dcec2dde
commit 7300bda967
2 changed files with 53 additions and 16 deletions

View File

@ -238,24 +238,61 @@ pub fn block_state_impl(item: TokenStream) -> TokenStream {
}; };
let id = state.id; let id = state.id;
let category_name = block_info.definition.category.clone();
if std::env::var("CARGO_PKG_NAME").unwrap() == "pumpkin-world" { if std::env::var("CARGO_PKG_NAME").unwrap() == "pumpkin-world" {
quote! { let category_name: proc_macro2::TokenStream = format!(
crate::block::block_state::BlockState::new_unchecked( "crate::block::BlockCategory::{}",
#id as u16, &pascal_case(
crate::block::Block::from_registry_id(#block_name), &block_info
crate::block::BlockCategory::from_registry_id(#category_name), .definition
.category
.split_once(':')
.expect("Bad minecraft id")
.1,
) )
}
} else {
quote! {
pumpkin_world::block::block_id::BlockStateId::new_unchecked(
#id as u16,
pumpkin_world::block::Block::from_registry_id(#block_name),
pumpkin_world::block::BlockCategory::from_registry_id(#category_name),
) )
.parse()
.unwrap();
let block_name: proc_macro2::TokenStream = format!(
"crate::block::Block::{}",
&pascal_case(&block_name.split_once(':').expect("Bad minecraft id").1,)
)
.parse()
.unwrap();
quote! {
crate::block::BlockState {
state_id: #id as u16,
category: #category_name,
block: #block_name,
} }
} }
.into() .into()
} else {
let category_name: proc_macro2::TokenStream = format!(
"pumpkin_world::block::BlockCategory::{}",
&pascal_case(
&block_info
.definition
.category
.split_once(':')
.expect("Bad minecraft id")
.1,
)
)
.parse()
.unwrap();
let block_name: proc_macro2::TokenStream = format!(
"pumpkin_world::block::Block::{}",
&pascal_case(&block_name.split_once(':').expect("Bad minecraft id").1,)
)
.parse()
.unwrap();
quote! {
pumpkin_world::block::BlockState {
state_id: #id as u16,
category: #category_name,
block: #block_name,
}
}
.into()
}
} }

View File

@ -6,9 +6,9 @@ use super::block_registry::{Block, BlockCategory, BLOCKS};
#[derive(Clone)] #[derive(Clone)]
pub struct BlockState { pub struct BlockState {
state_id: u16, pub state_id: u16,
block: Block, pub block: Block,
category: BlockCategory, pub category: BlockCategory,
} }
impl BlockState { impl BlockState {