pumpkin-java-multiversion/tools/codegen/remap/painting_variant.rs
Alexander Medvedev 73bb3ba8f6 first commit
2026-09-20 16:18:25 +02:00

89 lines
2.7 KiB
Rust

use proc_macro2::{Literal, TokenStream};
use quote::{format_ident, quote};
use crate::remap::{MappingNode, ParsedMappings, Remapper};
use crate::remap_nodes;
use crate::version::JavaMinecraftVersion;
/// Generates the `TokenStream` for per-version painting variant ID remap tables and the
/// `remap_painting_variant_id_for_version`/`remap_motive_id_for_version` functions.
pub fn build() -> TokenStream {
let remapper: Remapper<_, Option<Vec<u32>>> = Remapper {
version: JavaMinecraftVersion::V_26_3,
remapper: |first, second| match (first, second) {
(Some(first), Some(second)) => Some(
first
.iter()
.map(|&id| second.get(id as usize).copied().unwrap_or(id))
.collect(),
),
(None, Some(second)) => Some(second.clone()),
(Some(first), None) => Some(first.clone()),
(None, None) => None,
},
serializer: |&file| {
ParsedMappings::parse_mapping_file(file, "paintings")
.map(|mappings| mappings.to_u32(file))
},
};
let all_mappings = remap_nodes!(remapper);
let mut static_values = TokenStream::new();
let mut match_arms = TokenStream::new();
for (ver, mapping) in &all_mappings {
let Some(mapping) = mapping else {
continue;
};
let ident = format_ident!(
"{}",
format!(
"PAINTING_VARIANT_ID_REMAP_{:?}_TO_{:?}",
remapper.version, ver
)
.to_uppercase()
);
let mapping_tokens: Vec<_> = mapping
.iter()
.copied()
.map(Literal::u32_unsuffixed)
.collect();
static_values.extend(quote! {
pub static #ident: &[u32] = &[#(#mapping_tokens),*];
});
let versions = crate::remap::version_patterns(*ver);
match_arms.extend(quote! {
#(#versions)|* => #ident
.get(painting_variant_id as usize)
.copied()
.unwrap_or(painting_variant_id),
});
}
quote! {
use pumpkin_util::version::JavaMinecraftVersion;
#static_values
#[must_use]
pub fn remap_painting_variant_id_for_version(
painting_variant_id: u32,
version: JavaMinecraftVersion,
) -> u32 {
match version {
#match_arms
_ => painting_variant_id,
}
}
#[must_use]
pub fn remap_motive_id_for_version(
motive_id: u32,
version: JavaMinecraftVersion,
) -> u32 {
remap_painting_variant_id_for_version(motive_id, version)
}
}
}