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" {
let category_name: proc_macro2::TokenStream = format!(
"crate::block::BlockCategory::{}",
&pascal_case(
&block_info
.definition
.category
.split_once(':')
.expect("Bad minecraft id")
.1,
)
)
.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! { quote! {
crate::block::block_state::BlockState::new_unchecked( crate::block::BlockState {
#id as u16, state_id: #id as u16,
crate::block::Block::from_registry_id(#block_name), category: #category_name,
crate::block::BlockCategory::from_registry_id(#category_name), block: #block_name,
) }
} }
.into()
} else { } 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! { quote! {
pumpkin_world::block::block_id::BlockStateId::new_unchecked( pumpkin_world::block::BlockState {
#id as u16, state_id: #id as u16,
pumpkin_world::block::Block::from_registry_id(#block_name), category: #category_name,
pumpkin_world::block::BlockCategory::from_registry_id(#category_name), block: #block_name,
) }
} }
.into()
} }
.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 {