macro_rules! common_api {
() => {
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct Item(pub(crate) u16);
impl Item {
#[must_use]
pub fn from_id(id: u16) -> Option<Item> {
lookup_id(&g::items::ITEMS, id, |i| i.id).map(|_| Item(id))
}
#[must_use]
pub fn from_name(name: &str) -> Option<Item> {
lookup_name(&g::items::ITEM_NAMES, name).map(Item)
}
#[must_use]
pub const fn id(self) -> u16 {
self.0
}
#[must_use]
pub fn info(self) -> &'static ItemInfo {
lookup_id(&g::items::ITEMS, self.0, |i| i.id).unwrap_or(&g::items::ITEMS[0])
}
pub fn all() -> impl ExactSizeIterator<Item = Item> {
g::items::ITEMS.iter().map(|i| Item(i.id))
}
}
#[must_use]
pub fn entities() -> &'static [EntityInfo] {
&g::entities::ENTITIES
}
#[must_use]
pub fn entity(kind: EntityKind, id: u16) -> Option<&'static EntityInfo> {
lookup_id(&g::entities::ENTITIES, (kind as u8, id), |e| {
(e.kind as u8, e.id)
})
}
#[must_use]
pub fn entity_by_name(name: &str) -> Option<&'static EntityInfo> {
lookup_name(&g::entities::ENTITY_NAMES, name)
.map(|i| &g::entities::ENTITIES[i as usize])
}
#[must_use]
pub fn vanilla_entity_sizes() -> &'static [crate::common::VanillaEntitySize] {
&g::entities::VANILLA_ENTITY_SIZES
}
#[must_use]
pub fn vanilla_entity_size(
name: &str,
) -> Option<&'static crate::common::VanillaEntitySize> {
g::entities::VANILLA_ENTITY_SIZES
.binary_search_by(|e| e.name.cmp(name))
.ok()
.map(|i| &g::entities::VANILLA_ENTITY_SIZES[i])
}
#[must_use]
pub fn biomes() -> &'static [BiomeInfo] {
&g::biomes::BIOMES
}
#[must_use]
pub fn biome(id: u16) -> Option<&'static BiomeInfo> {
lookup_id(&g::biomes::BIOMES, id, |b| b.id)
}
#[must_use]
pub fn biome_by_name(name: &str) -> Option<&'static BiomeInfo> {
lookup_name(&g::biomes::BIOME_NAMES, name).and_then(biome)
}
#[must_use]
pub fn enchantments() -> &'static [EnchantmentInfo] {
&g::enchantments::ENCHANTMENTS
}
#[must_use]
pub fn enchantment(id: u16) -> Option<&'static EnchantmentInfo> {
lookup_id(&g::enchantments::ENCHANTMENTS, id, |e| e.id)
}
#[must_use]
pub fn enchantment_by_name(name: &str) -> Option<&'static EnchantmentInfo> {
lookup_name(&g::enchantments::ENCHANTMENT_NAMES, name).and_then(enchantment)
}
#[must_use]
pub fn foods() -> &'static [FoodInfo] {
&g::foods::FOODS
}
#[must_use]
pub fn food(item: u16) -> Option<&'static FoodInfo> {
lookup_id(&g::foods::FOODS, item, |f| f.item)
}
#[must_use]
pub fn effects() -> &'static [EffectInfo] {
&g::effects::EFFECTS
}
#[must_use]
pub fn effect(id: u8) -> Option<&'static EffectInfo> {
lookup_id(&g::effects::EFFECTS, id, |e| e.id)
}
#[must_use]
pub fn effect_by_name(name: &str) -> Option<&'static EffectInfo> {
lookup_name(&g::effects::EFFECT_NAMES, name).and_then(effect)
}
#[must_use]
pub fn tool_multiplier(material: DigMaterial, tool: u16) -> f32 {
crate::common::tool_multiplier(&g::materials::TOOL_MULTIPLIERS, material, tool)
}
};
}
pub(crate) use common_api;