Pumpkin/pumpkin/src/item/items/shovel.rs
2025-06-22 21:28:14 +02:00

65 lines
1.9 KiB
Rust

use crate::entity::player::Player;
use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
use crate::server::Server;
use async_trait::async_trait;
use pumpkin_data::Block;
use pumpkin_data::BlockDirection;
use pumpkin_data::item::Item;
use pumpkin_data::tag::Tagable;
use pumpkin_util::math::position::BlockPos;
use pumpkin_world::world::BlockFlags;
pub struct ShovelItem;
impl ItemMetadata for ShovelItem {
fn ids() -> Box<[u16]> {
Item::get_tag_values("#minecraft:shovels")
.expect("This is a valid vanilla tag")
.iter()
.map(|key| {
Item::from_registry_key(key)
.expect("We just got this key from the registry")
.id
})
.collect::<Vec<_>>()
.into_boxed_slice()
}
}
#[async_trait]
impl PumpkinItem for ShovelItem {
async fn use_on_block(
&self,
_item: &Item,
player: &Player,
location: BlockPos,
face: BlockDirection,
block: &Block,
_server: &Server,
) {
// Yes, Minecraft does hardcode these
if block == &Block::GRASS_BLOCK
|| block == &Block::DIRT
|| block == &Block::COARSE_DIRT
|| block == &Block::ROOTED_DIRT
|| block == &Block::PODZOL
|| block == &Block::MYCELIUM
{
let world = player.world().await;
if face != BlockDirection::Down && world.get_block_state(&location.up()).await.is_air()
{
world
.set_block_state(
&location,
Block::DIRT_PATH.default_state.id,
BlockFlags::NOTIFY_ALL,
)
.await;
}
}
if block == &Block::CAMPFIRE || block == &Block::SOUL_CAMPFIRE {
// TODO Implements campfire
}
}
}