Add collision shapes and fix latest version

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/6/head
trivernis 2 years ago
parent aa151453de
commit c2b1363560
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

@ -1,6 +1,6 @@
[package]
name = "minecraft-data-rs"
version = "0.4.3"
version = "0.4.4"
authors = ["trivernis <trivernis@protonmail.com>"]
edition = "2018"
readme = "README.md"
@ -12,10 +12,9 @@ repository = "https://github.com/Trivernis/minecraft-data-rs"
[dependencies]
thiserror = "1.0.30"
serde_json = "1.0.74"
serde_derive = "1.0.133"
serde = "1.0.133"
serde_json = "1.0.79"
serde_derive = "1.0.136"
serde = "1.0.136"
include_dir = "0.7.2"
itertools = "0.10.3"
lazy_static = "1.4.0"
schemafy = "0.6.0"

@ -1,5 +1,6 @@
use crate::data::{get_version_specific_file, BLOCKS_FILE};
use crate::data::{get_version_specific_file, BLOCKS_FILE, BLOCK_COLLISION_SHAPES_FILE};
use crate::models::block::Block;
use crate::models::block_collision_shapes::BlockCollisionShapes;
use crate::models::version::Version;
use crate::DataResult;
use std::collections::HashMap;
@ -38,4 +39,12 @@ impl Blocks {
Ok(blocks_map)
}
/// Returns the block collision shapes object
pub fn block_collision_shapes(&self) -> DataResult<BlockCollisionShapes> {
let content = get_version_specific_file(&self.version, BLOCK_COLLISION_SHAPES_FILE)?;
let collision_shapes = serde_json::from_str(&content)?;
Ok(collision_shapes)
}
}

@ -14,18 +14,29 @@ use std::sync::Arc;
#[cfg(test)]
mod tests;
pub mod biomes;
pub mod blocks;
pub mod enchantments;
pub mod entities;
pub mod foods;
pub mod items;
pub mod loot;
pub mod recipes;
pub mod versions;
mod biomes;
mod blocks;
mod enchantments;
mod entities;
mod foods;
mod items;
mod loot;
mod recipes;
mod versions;
pub use biomes::*;
pub use blocks::*;
pub use enchantments::*;
pub use entities::*;
pub use foods::*;
pub use items::*;
pub use loot::*;
pub use recipes::*;
pub use versions::*;
/// A type wrapping access to all the metadata
/// about the selected minecraft version
#[allow(missing_docs)]
pub struct Api {
pub version: Arc<Version>,
pub items: Items,

@ -1,4 +1,5 @@
use crate::api::tests::{get_api, get_test_versions};
use crate::models::block_collision_shapes::CollisionShapeIds;
#[test]
pub fn test_blocks_array() {
@ -56,3 +57,24 @@ pub fn test_block_states() {
}
}
}
#[test]
pub fn test_block_collision_states() {
for version in get_test_versions() {
let api = get_api(version);
let shapes = api.blocks.block_collision_shapes().unwrap();
for (_block, ids) in shapes.blocks {
match ids {
CollisionShapeIds::Value(id) => {
assert!(shapes.shapes.get(&id).is_some());
}
CollisionShapeIds::Array(ids) => {
for id in ids {
assert!(shapes.shapes.get(&id).is_some());
}
}
}
}
}
}

@ -24,12 +24,13 @@ pub fn versions_by_minecraft_version() -> DataResult<HashMap<String, Version>> {
Ok(indexed_versions)
}
/// Returns the latest stable version (hardcoded at the moment)
/// Returns the latest stable version for which data paths exists.
/// Patch versions using the same data path as the major version are ignored.
pub fn latest_stable() -> DataResult<Version> {
let latest = versions()?
let latest = available_versions()?
.into_iter()
.filter_map(|v| {
let version_string = v.minecraft_version.clone();
let version_string = v.clone();
let mut parts = version_string.split(".");
Some((
@ -43,6 +44,7 @@ pub fn latest_stable() -> DataResult<Version> {
format!("{:#05}.{:#05}.{:#05}", maj, min, patch.unwrap_or(0))
})
.map(|(v, _, _, _)| v)
.filter_map(|v| versions_by_minecraft_version().ok()?.remove(&v))
.rev()
.next();

@ -10,6 +10,7 @@ pub static MINECRAFT_DATA: Dir = include_dir::include_dir!("minecraft-data/data"
pub static BIOMES_FILE: &str = "biomes";
pub static BLOCK_LOOT_FILE: &str = "blockLoot";
pub static BLOCKS_FILE: &str = "blocks";
pub static BLOCK_COLLISION_SHAPES_FILE: &str = "blockCollisionShapes";
#[allow(unused)]
pub static COMMANDS_FILE: &str = "commands";
pub static ENTITIES_FILE: &str = "entities";

@ -20,8 +20,10 @@
#[macro_use]
extern crate serde_derive;
/// Provides data access methods
pub mod api;
pub(crate) mod data;
/// Contains the type definitions for the data
pub mod models;
pub(crate) mod utils;

@ -0,0 +1,20 @@
use std::collections::HashMap;
#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all(deserialize = "camelCase", serialize = "snake_case"))]
pub struct BlockCollisionShapes {
pub blocks: HashMap<String, CollisionShapeIds>,
pub shapes: HashMap<u16, CollisionShape>,
}
#[derive(Deserialize, Debug, Clone)]
#[serde(
rename_all(deserialize = "camelCase", serialize = "snake_case"),
untagged
)]
pub enum CollisionShapeIds {
Value(u16),
Array(Vec<u16>),
}
pub type CollisionShape = Vec<Vec<f32>>;

@ -1,10 +1,11 @@
pub mod biome;
pub mod block;
pub mod block_collision_shapes;
pub mod block_loot;
pub mod enchantment;
pub mod entity;
pub mod entity_loot;
pub mod food;
pub mod item;
pub mod recipe;
pub mod version;
pub mod entity;

@ -1,7 +1,11 @@
/// A type wrapping a minecraft version
#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all(deserialize = "camelCase", serialize = "snake_case"))]
pub struct Version {
/// API Version
pub version: i32,
/// The full minecraft version (e.g. (`1.8.1`)
pub minecraft_version: String,
/// The major version of this minecraft version (e.g. `1.8`)
pub major_version: String,
}

@ -1,9 +1,11 @@
use std::io;
use thiserror::Error;
#[allow(missing_docs)]
pub type DataResult<T> = Result<T, DataError>;
#[derive(Error, Debug)]
#[allow(missing_docs)]
pub enum DataError {
#[error("IO Error: {0}")]
IOError(#[from] io::Error),

Loading…
Cancel
Save