use proc_macro2::{Literal, TokenStream}; use quote::{format_ident, quote}; use crate::remap::{MappingNode, ParsedMappings, Remapper}; use crate::version::JavaMinecraftVersion; /// Generates the `TokenStream` for per-version entity ID remap tables and the /// `remap_entity_id_for_version` function. pub fn build() -> TokenStream { let node_1_7_6 = MappingNode { version: JavaMinecraftVersion::V_1_7_6, value: "../../assets/viarewind/data/mappings-1.8to1.7.10.nbt", child: None, }; let node_1_8 = MappingNode { version: JavaMinecraftVersion::V_1_8, value: "../../assets/viarewind/data/mappings-1.9.4to1.8.nbt", child: Some(&node_1_7_6), }; let node_1_9 = MappingNode { version: JavaMinecraftVersion::V_1_9, value: "../../assets/viabackwards/data/mappings-1.10to1.9.4.nbt", child: Some(&node_1_8), }; let node_1_10 = MappingNode { version: JavaMinecraftVersion::V_1_10, value: "../../assets/viabackwards/data/mappings-1.11to1.10.nbt", child: Some(&node_1_9), }; let node_1_11 = MappingNode { version: JavaMinecraftVersion::V_1_11, value: "../../assets/viabackwards/data/mappings-1.12to1.11.nbt", child: Some(&node_1_10), }; let node_1_12 = MappingNode { version: JavaMinecraftVersion::V_1_12, value: "../../assets/viabackwards/data/mappings-1.13to1.12.nbt", child: Some(&node_1_11), }; let node_1_13 = MappingNode { version: JavaMinecraftVersion::V_1_13, value: "../../assets/viabackwards/data/mappings-1.13.2to1.13.nbt", child: Some(&node_1_12), }; let node_1_13_2 = MappingNode { version: JavaMinecraftVersion::V_1_13_2, value: "../../assets/viabackwards/data/mappings-1.14to1.13.2.nbt", child: Some(&node_1_13), }; let node_1_14 = MappingNode { version: JavaMinecraftVersion::V_1_14, value: "../../assets/viabackwards/data/mappings-1.15to1.14.nbt", child: Some(&node_1_13_2), }; let node_1_15 = MappingNode { version: JavaMinecraftVersion::V_1_15, value: "../../assets/viabackwards/data/mappings-1.16to1.15.nbt", child: Some(&node_1_14), }; let node_1_16 = MappingNode { version: JavaMinecraftVersion::V_1_16, value: "../../assets/viabackwards/data/mappings-1.16.2to1.16.nbt", child: Some(&node_1_15), }; let node_1_16_2 = MappingNode { version: JavaMinecraftVersion::V_1_16_2, value: "../../assets/viabackwards/data/mappings-1.17to1.16.2.nbt", child: Some(&node_1_16), }; let node_1_17 = MappingNode { version: JavaMinecraftVersion::V_1_17, value: "../../assets/viabackwards/data/mappings-1.18to1.17.nbt", child: Some(&node_1_16_2), }; let node_1_18 = MappingNode { version: JavaMinecraftVersion::V_1_18, value: "../../assets/viabackwards/data/mappings-1.19to1.18.nbt", child: Some(&node_1_17), }; let node_1_19 = MappingNode { version: JavaMinecraftVersion::V_1_19, value: "../../assets/viabackwards/data/mappings-1.19.3to1.19.nbt", child: Some(&node_1_18), }; let node_1_19_3 = MappingNode { version: JavaMinecraftVersion::V_1_19_3, value: "../../assets/viabackwards/data/mappings-1.19.4to1.19.3.nbt", child: Some(&node_1_19), }; let node_1_19_4 = MappingNode { version: JavaMinecraftVersion::V_1_19_4, value: "../../assets/viabackwards/data/mappings-1.20to1.19.4.nbt", child: Some(&node_1_19_3), }; let node_1_20 = MappingNode { version: JavaMinecraftVersion::V_1_20, value: "../../assets/viabackwards/data/mappings-1.20.2to1.20.nbt", child: Some(&node_1_19_4), }; let node_1_20_2 = MappingNode { version: JavaMinecraftVersion::V_1_20_2, value: "../../assets/viabackwards/data/mappings-1.20.3to1.20.2.nbt", child: Some(&node_1_20), }; let node_1_20_3 = MappingNode { version: JavaMinecraftVersion::V_1_20_3, value: "../../assets/viabackwards/data/mappings-1.20.5to1.20.3.nbt", child: Some(&node_1_20_2), }; let node_1_20_5 = MappingNode { version: JavaMinecraftVersion::V_1_20_5, value: "../../assets/viabackwards/data/mappings-1.21to1.20.5.nbt", child: Some(&node_1_20_3), }; let node_1_21 = MappingNode { version: JavaMinecraftVersion::V_1_21, value: "../../assets/viabackwards/data/mappings-1.21.2to1.21.nbt", child: Some(&node_1_20_5), }; let node_1_21_2 = MappingNode { version: JavaMinecraftVersion::V_1_21_2, value: "../../assets/viabackwards/data/mappings-1.21.4to1.21.2.nbt", child: Some(&node_1_21), }; let node_1_21_4 = MappingNode { version: JavaMinecraftVersion::V_1_21_4, value: "../../assets/viabackwards/data/mappings-1.21.5to1.21.4.nbt", child: Some(&node_1_21_2), }; let node_1_21_5 = MappingNode { version: JavaMinecraftVersion::V_1_21_5, value: "../../assets/viabackwards/data/mappings-1.21.6to1.21.5.nbt", child: Some(&node_1_21_4), }; let node_1_21_6 = MappingNode { version: JavaMinecraftVersion::V_1_21_6, value: "../../assets/viabackwards/data/mappings-1.21.7to1.21.6.nbt", child: Some(&node_1_21_5), }; let node_1_21_7 = MappingNode { version: JavaMinecraftVersion::V_1_21_7, value: "../../assets/viabackwards/data/mappings-1.21.9to1.21.7.nbt", child: Some(&node_1_21_6), }; let node_1_21_9 = MappingNode { version: JavaMinecraftVersion::V_1_21_9, value: "../../assets/viabackwards/data/mappings-1.21.11to1.21.9.nbt", child: Some(&node_1_21_7), }; let node_1_21_11 = MappingNode { version: JavaMinecraftVersion::V_1_21_11, value: "../../assets/viabackwards/data/mappings-26.1to1.21.11.nbt", child: Some(&node_1_21_9), }; let node_26_1 = MappingNode { version: JavaMinecraftVersion::V_26_1, value: "../../assets/viabackwards/data/mappings-26.2to26.1.nbt", child: Some(&node_1_21_11), }; let node_26_2 = MappingNode { version: JavaMinecraftVersion::V_26_2, value: "../../assets/viabackwards/data/mappings-26.3to26.2.nbt", child: Some(&node_26_1), }; let remapper: Remapper<_, Option>> = Remapper { version: JavaMinecraftVersion::V_26_3, remapper: |first, second| match (first, second) { (Some(first), Some(second)) => Some( first .iter() .map(|id| second.get(usize::from(*id)).copied().unwrap_or(0)) .collect(), ), (None, Some(second)) => Some(second.clone()), (Some(first), None) => Some(first.clone()), _ => None, }, serializer: |&file| { ParsedMappings::parse_mapping_file(file, "entities") .map(|mappings| mappings.to_u16(file)) }, }; let all_mappings = remapper.process(&node_26_2); 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!("ENTITY_ID_REMAP_{:?}_TO_{:?}", remapper.version, ver).to_uppercase() ); let mapping_tokens: Vec<_> = mapping .iter() .copied() .map(Literal::u16_unsuffixed) .collect(); static_values.extend(quote! { pub static #ident: &[u16] = &[#(#mapping_tokens),*]; }); let versions = crate::remap::version_patterns(*ver); match_arms.extend(quote! { #(#versions)|* => #ident .get(usize::from(entity_id)) .copied() .unwrap_or(0), }); } quote! { #static_values #[must_use] pub fn remap_entity_id_for_version(entity_id: u16, version: pumpkin_util::version::JavaMinecraftVersion) -> u16 { match version { #match_arms _ => entity_id, } } #[must_use] pub fn remap_object_type_for_version( entity_id: u16, _version: pumpkin_util::version::JavaMinecraftVersion, ) -> u8 { match entity_id { 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 => 1, 74 => 2, 3 => 3, 82 | 24 | 25 | 26 | 27 | 28 | 29 => 10, 140 => 50, 44 => 51, 4 => 60, 122 => 61, 42 => 62, 54 => 63, 121 => 64, 46 => 65, 153 => 66, 117 => 67, 78 => 68, 52 => 70, 75 | 58 => 71, 50 => 72, 104 => 73, 49 => 75, 55 => 76, 77 => 77, 2 => 78, 48 => 79, 56 => 90, 124 => 91, 40 => 93, 143 => 94, _ => entity_id as u8, } } } }