Repository: Pumpkin-MC/Pumpkin
Pull request #670: Add dirt path, log stripping and oxidized copper support
Author: login: tetram2674562
Labels: name: waiting-for-testing
description: Pull requests that need to be tested by a maintainer
Created: 2025-03-26T22:51:27Z | Merged: 2025-04-28T18:58:31Z

## Description

What was added : 
- When you right click using a shovel on the dirt, you can now make dirt path.
- When you right click using a axe on any log, wood you can get his stripped equivalent. 
- When you right click on any oxidized copper block with an axe, you can deoxidize it (from one stage).
- When you right click on any (oxidized) copper block with an honeycomb, you can wax it. 

How it was added? 

I took the code someone made for the hoe and modify it to be compatible with the shovel, the axe and honeycomb.
I modified the block checking statement in order to make it more understable (and I think this is more optimized? Let's discuss about this if you're okay !)


## Testing

This was tested and showed on the discord. But you can also test it yourself by building this branch !

_Please excuse myself for my poor english vocabulary !_


Diff:
diff --git a/pumpkin/src/block/mod.rs b/pumpkin/src/block/mod.rs
index d4883813f5..2c579a472f 100644
--- a/pumpkin/src/block/mod.rs
+++ b/pumpkin/src/block/mod.rs
@@ -95,7 +95,6 @@ pub fn default_registry() -> Arc<BlockRegistry> {
     // Fluids
     manager.register_fluid(FlowingWater);
     manager.register_fluid(FlowingLava);
-
     Arc::new(manager)
 }
 
diff --git a/pumpkin/src/item/items/axe.rs b/pumpkin/src/item/items/axe.rs
new file mode 100644
index 0000000000..f9b7b0358a
--- /dev/null
+++ b/pumpkin/src/item/items/axe.rs
@@ -0,0 +1,245 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::Block;
+use pumpkin_data::block_properties::BlockProperties;
+use pumpkin_data::block_properties::{OakDoorLikeProperties, PaleOakWoodLikeProperties};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct AxeItem;
+
+impl ItemMetadata for AxeItem {
+    fn ids() -> Box<[u16]> {
+        Item::get_tag_values("#minecraft:axes")
+            .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 AxeItem {
+    #[allow(clippy::too_many_lines)]
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        // I tried to follow mojang order of doing things.
+        let world = player.world().await;
+        let replacement_block = try_use_axe(block);
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            let new_block = Block::from_id(replacement_block.unwrap());
+            let new_block = &new_block.unwrap();
+            let new_state_id = if block.is_tagged_with("#minecraft:logs") == Some(true) {
+                let log_information = world.get_block_state_id(&location).await.unwrap();
+                let log_props = PaleOakWoodLikeProperties::from_state_id(log_information, block);
+                // create new properties for the new log.
+                let mut new_log_properties = PaleOakWoodLikeProperties::default(new_block);
+                new_log_properties.axis = log_props.axis;
+
+                // create new properties for the new log.
+
+                // Set old axis to the new log.
+                new_log_properties.axis = log_props.axis;
+                new_log_properties.to_state_id(new_block)
+            }
+            // Let's check if It's a door
+            else if block.is_tagged_with("#minecraft:doors") == Some(true) {
+                // get block state of the old log.
+                let door_information = world.get_block_state_id(&location).await.unwrap();
+                // get the log properties
+                let door_props = OakDoorLikeProperties::from_state_id(door_information, block);
+                // create new properties for the new log.
+                let mut new_door_properties = OakDoorLikeProperties::default(new_block);
+                // Set old axis to the new log.
+                new_door_properties.facing = door_props.facing;
+                new_door_properties.open = door_props.open;
+                new_door_properties.half = door_props.half;
+                new_door_properties.hinge = door_props.hinge;
+                new_door_properties.powered = door_props.powered;
+                new_door_properties.to_state_id(new_block)
+            } else {
+                new_block.default_state_id
+            };
+            // TODO Implements trapdoors when It's implemented
+            world
+                .set_block_state(&location, new_state_id, BlockFlags::NOTIFY_ALL)
+                .await;
+            return;
+        }
+    }
+}
+fn try_use_axe(block: &Block) -> Option<u16> {
+    // Trying to get the strip equivalent
+    let block_id = get_stripped_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    // Else decrease the level of oxidation
+    let block_id = get_deoxidized_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    // Else unwax the block
+    let block_id = get_unwaxed_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    None
+}
+
+fn get_stripped_equivalent(block: &Block) -> Option<u16> {
+    let new_block_id = match &block.id {
+        id if id == &Block::CHERRY_LOG.id => Block::STRIPPED_CHERRY_LOG.id,
+        id if id == &Block::JUNGLE_LOG.id => Block::STRIPPED_JUNGLE_LOG.id,
+        id if id == &Block::PALE_OAK_LOG.id => Block::STRIPPED_PALE_OAK_LOG.id,
+
+        id if id == &Block::DARK_OAK_LOG.id => Block::STRIPPED_DARK_OAK_LOG.id,
+
+        id if id == &Block::MANGROVE_LOG.id => Block::STRIPPED_MANGROVE_LOG.id,
+        id if id == &Block::OAK_WOOD.id => Block::STRIPPED_OAK_WOOD.id,
+        id if id == &Block::BIRCH_WOOD.id => Block::STRIPPED_BIRCH_WOOD.id,
+        id if id == &Block::SPRUCE_WOOD.id => Block::STRIPPED_SPRUCE_WOOD.id,
+        id if id == &Block::ACACIA_WOOD.id => Block::STRIPPED_ACACIA_WOOD.id,
+        id if id == &Block::CHERRY_WOOD.id => Block::STRIPPED_CHERRY_WOOD.id,
+        id if id == &Block::JUNGLE_WOOD.id => Block::STRIPPED_JUNGLE_WOOD.id,
+        id if id == &Block::PALE_OAK_WOOD.id => Block::STRIPPED_PALE_OAK_WOOD.id,
+        id if id == &Block::DARK_OAK_WOOD.id => Block::STRIPPED_DARK_OAK_WOOD.id,
+        id if id == &Block::MANGROVE_WOOD.id => Block::STRIPPED_MANGROVE_WOOD.id,
+        _ => block.id,
+    };
+    if new_block_id == block.id {
+        return None;
+    }
+    Some(new_block_id)
+}
+
+fn get_deoxidized_equivalent(block: &Block) -> Option<u16> {
+    match &block.id {
+        id if id == &Block::OXIDIZED_COPPER.id => Some(Block::WEATHERED_COPPER.id),
+        id if id == &Block::WEATHERED_COPPER.id => Some(Block::EXPOSED_COPPER.id),
+        id if id == &Block::EXPOSED_COPPER.id => Some(Block::COPPER_BLOCK.id),
+        id if id == &Block::OXIDIZED_CHISELED_COPPER.id => {
+            Some(Block::WEATHERED_CHISELED_COPPER.id)
+        }
+        id if id == &Block::WEATHERED_CHISELED_COPPER.id => Some(Block::EXPOSED_CHISELED_COPPER.id),
+        id if id == &Block::EXPOSED_CHISELED_COPPER.id => Some(Block::CHISELED_COPPER.id),
+        id if id == &Block::OXIDIZED_COPPER_GRATE.id => Some(Block::WEATHERED_COPPER_GRATE.id),
+        id if id == &Block::WEATHERED_COPPER_GRATE.id => Some(Block::EXPOSED_COPPER_GRATE.id),
+        id if id == &Block::EXPOSED_COPPER_GRATE.id => Some(Block::COPPER_GRATE.id),
+        id if id == &Block::OXIDIZED_CUT_COPPER.id => Some(Block::WEATHERED_CUT_COPPER.id),
+        id if id == &Block::WEATHERED_CUT_COPPER.id => Some(Block::EXPOSED_CUT_COPPER.id),
+        id if id == &Block::EXPOSED_CUT_COPPER.id => Some(Block::CUT_COPPER.id),
+        id if id == &Block::OXIDIZED_CUT_COPPER_STAIRS.id => {
+            Some(Block::WEATHERED_CUT_COPPER_STAIRS.id)
+        }
+        id if id == &Block::WEATHERED_CUT_COPPER_STAIRS.id => {
+            Some(Block::EXPOSED_CUT_COPPER_STAIRS.id)
+        }
+        id if id == &Block::EXPOSED_CUT_COPPER_STAIRS.id => Some(Block::CUT_COPPER_STAIRS.id),
+        id if id == &Block::OXIDIZED_CUT_COPPER_SLAB.id => {
+            Some(Block::WEATHERED_CUT_COPPER_SLAB.id)
+        }
+        id if id == &Block::WEATHERED_CUT_COPPER_SLAB.id => Some(Block::EXPOSED_CUT_COPPER_SLAB.id),
+        id if id == &Block::EXPOSED_CUT_COPPER_SLAB.id => Some(Block::CUT_COPPER_SLAB.id),
+        id if id == &Block::OXIDIZED_COPPER_BULB.id => Some(Block::WEATHERED_COPPER_BULB.id),
+        id if id == &Block::WEATHERED_COPPER_BULB.id => Some(Block::EXPOSED_COPPER_BULB.id),
+        id if id == &Block::EXPOSED_COPPER_BULB.id => Some(Block::COPPER_BULB.id),
+        id if id == &Block::OXIDIZED_COPPER_DOOR.id => Some(Block::WEATHERED_COPPER_DOOR.id),
+        id if id == &Block::WEATHERED_COPPER_DOOR.id => Some(Block::EXPOSED_COPPER_DOOR.id),
+        id if id == &Block::EXPOSED_COPPER_DOOR.id => Some(Block::COPPER_DOOR.id),
+        id if id == &Block::OXIDIZED_COPPER_TRAPDOOR.id => {
+            Some(Block::WEATHERED_COPPER_TRAPDOOR.id)
+        }
+        id if id == &Block::WEATHERED_COPPER_TRAPDOOR.id => Some(Block::EXPOSED_COPPER_TRAPDOOR.id),
+        id if id == &Block::EXPOSED_COPPER_TRAPDOOR.id => Some(Block::COPPER_TRAPDOOR.id),
+        _ => None,
+    }
+}
+
+fn get_unwaxed_equivalent(block: &Block) -> Option<u16> {
+    match &block.id {
+        id if id == &Block::WAXED_OXIDIZED_COPPER.id => Some(Block::OXIDIZED_COPPER.id),
+        id if id == &Block::WAXED_WEATHERED_COPPER.id => Some(Block::WEATHERED_COPPER.id),
+        id if id == &Block::WAXED_EXPOSED_COPPER.id => Some(Block::EXPOSED_COPPER.id),
+        id if id == &Block::WAXED_COPPER_BLOCK.id => Some(Block::COPPER_BLOCK.id),
+        id if id == &Block::WAXED_OXIDIZED_CHISELED_COPPER.id => {
+            Some(Block::OXIDIZED_CHISELED_COPPER.id)
+        }
+        id if id == &Block::WAXED_WEATHERED_CHISELED_COPPER.id => {
+            Some(Block::WEATHERED_CHISELED_COPPER.id)
+        }
+        id if id == &Block::WAXED_EXPOSED_CHISELED_COPPER.id => {
+            Some(Block::EXPOSED_CHISELED_COPPER.id)
+        }
+        id if id == &Block::WAXED_CHISELED_COPPER.id => Some(Block::CHISELED_COPPER.id),
+        id if id == &Block::WAXED_COPPER_GRATE.id => Some(Block::COPPER_GRATE.id),
+        id if id == &Block::WAXED_OXIDIZED_COPPER_GRATE.id => Some(Block::OXIDIZED_COPPER_GRATE.id),
+        id if id == &Block::WAXED_WEATHERED_COPPER_GRATE.id => {
+            Some(Block::WEATHERED_COPPER_GRATE.id)
+        }
+        id if id == &Block::WAXED_EXPOSED_COPPER_GRATE.id => Some(Block::EXPOSED_COPPER_GRATE.id),
+        id if id == &Block::WAXED_OXIDIZED_CUT_COPPER.id => Some(Block::OXIDIZED_CUT_COPPER.id),
+        id if id == &Block::WAXED_WEATHERED_CUT_COPPER.id => Some(Block::WEATHERED_CUT_COPPER.id),
+        id if id == &Block::WAXED_EXPOSED_CUT_COPPER.id => Some(Block::EXPOSED_CUT_COPPER.id),
+        id if id == &Block::WAXED_CUT_COPPER.id => Some(Block::CUT_COPPER.id),
+        id if id == &Block::WAXED_OXIDIZED_CUT_COPPER_STAIRS.id => {
+            Some(Block::OXIDIZED_CUT_COPPER_STAIRS.id)
+        }
+        id if id == &Block::WAXED_WEATHERED_CUT_COPPER_STAIRS.id => {
+            Some(Block::WEATHERED_CUT_COPPER_STAIRS.id)
+        }
+        id if id == &Block::WAXED_EXPOSED_CUT_COPPER_STAIRS.id => {
+            Some(Block::EXPOSED_CUT_COPPER_STAIRS.id)
+        }
+        id if id == &Block::WAXED_CUT_COPPER_STAIRS.id => Some(Block::CUT_COPPER_STAIRS.id),
+        id if id == &Block::WAXED_OXIDIZED_CUT_COPPER_SLAB.id => {
+            Some(Block::OXIDIZED_CUT_COPPER_SLAB.id)
+        }
+        id if id == &Block::WAXED_WEATHERED_CUT_COPPER_SLAB.id => {
+            Some(Block::WEATHERED_CUT_COPPER_SLAB.id)
+        }
+        id if id == &Block::WAXED_EXPOSED_CUT_COPPER_SLAB.id => {
+            Some(Block::EXPOSED_CUT_COPPER_SLAB.id)
+        }
+        id if id == &Block::WAXED_CUT_COPPER_SLAB.id => Some(Block::CUT_COPPER_SLAB.id),
+        id if id == &Block::WAXED_OXIDIZED_COPPER_BULB.id => Some(Block::OXIDIZED_COPPER_BULB.id),
+        id if id == &Block::WAXED_WEATHERED_COPPER_BULB.id => Some(Block::WEATHERED_COPPER_BULB.id),
+        id if id == &Block::WAXED_EXPOSED_COPPER_BULB.id => Some(Block::EXPOSED_COPPER_BULB.id),
+        id if id == &Block::WAXED_COPPER_BULB.id => Some(Block::COPPER_BULB.id),
+        id if id == &Block::WAXED_OXIDIZED_COPPER_DOOR.id => Some(Block::OXIDIZED_COPPER_DOOR.id),
+        id if id == &Block::WAXED_WEATHERED_COPPER_DOOR.id => Some(Block::WEATHERED_COPPER_DOOR.id),
+        id if id == &Block::WAXED_EXPOSED_COPPER_DOOR.id => Some(Block::EXPOSED_COPPER_DOOR.id),
+        id if id == &Block::WAXED_COPPER_DOOR.id => Some(Block::COPPER_DOOR.id),
+        id if id == &Block::WAXED_OXIDIZED_COPPER_TRAPDOOR.id => {
+            Some(Block::OXIDIZED_COPPER_TRAPDOOR.id)
+        }
+        id if id == &Block::WAXED_WEATHERED_COPPER_TRAPDOOR.id => {
+            Some(Block::WEATHERED_COPPER_TRAPDOOR.id)
+        }
+        id if id == &Block::WAXED_EXPOSED_COPPER_TRAPDOOR.id => {
+            Some(Block::EXPOSED_COPPER_TRAPDOOR.id)
+        }
+        id if id == &Block::WAXED_COPPER_TRAPDOOR.id => Some(Block::COPPER_TRAPDOOR.id),
+        _ => None,
+    }
+}
diff --git a/pumpkin/src/item/items/honeycomb.rs b/pumpkin/src/item/items/honeycomb.rs
new file mode 100644
index 0000000000..64da786cf0
--- /dev/null
+++ b/pumpkin/src/item/items/honeycomb.rs
@@ -0,0 +1,139 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::Block;
+use pumpkin_data::block_properties::BlockProperties;
+use pumpkin_data::block_properties::OakDoorLikeProperties;
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct HoneyCombItem;
+
+impl ItemMetadata for HoneyCombItem {
+    fn ids() -> Box<[u16]> {
+        [Item::HONEYCOMB.id].into()
+    }
+}
+
+#[async_trait]
+impl PumpkinItem for HoneyCombItem {
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        let world = player.world().await;
+
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+        let replacement_block = get_waxed_equivalent(block);
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            // get block state of the old log.
+            // get the log properties
+            // create new properties for the new log.
+            let new_block = &Block::from_id(replacement_block.unwrap()).unwrap();
+
+            let new_state_id = if block.is_tagged_with("#minecraft:doors").is_some()
+                && block.is_tagged_with("#minecraft:doors").unwrap()
+            {
+                // get block state of the old log.
+                let door_information = world.get_block_state_id(&location).await.unwrap();
+                // get the log properties
+                let door_props = OakDoorLikeProperties::from_state_id(door_information, block);
+                // create new properties for the new log.
+                let mut new_door_properties = OakDoorLikeProperties::default(new_block);
+                // Set old axis to the new log.
+                new_door_properties.facing = door_props.facing;
+                new_door_properties.open = door_props.open;
+                new_door_properties.half = door_props.half;
+                new_door_properties.hinge = door_props.hinge;
+                new_door_properties.powered = door_props.powered;
+                new_door_properties.to_state_id(new_block)
+            } else {
+                new_block.default_state_id
+            };
+
+            // TODO Implements trapdoors
+            world
+                .set_block_state(&location, new_state_id, BlockFlags::NOTIFY_ALL)
+                .await;
+            return;
+        }
+    }
+}
+
+fn get_waxed_equivalent(block: &Block) -> Option<u16> {
+    match &block.id {
+        id if id == &Block::OXIDIZED_COPPER.id => Some(Block::WAXED_OXIDIZED_COPPER.id),
+        id if id == &Block::WEATHERED_COPPER.id => Some(Block::WAXED_WEATHERED_COPPER.id),
+        id if id == &Block::EXPOSED_COPPER.id => Some(Block::WAXED_EXPOSED_COPPER.id),
+        id if id == &Block::COPPER_BLOCK.id => Some(Block::WAXED_COPPER_BLOCK.id),
+        id if id == &Block::OXIDIZED_CHISELED_COPPER.id => {
+            Some(Block::WAXED_OXIDIZED_CHISELED_COPPER.id)
+        }
+        id if id == &Block::WEATHERED_CHISELED_COPPER.id => {
+            Some(Block::WAXED_WEATHERED_CHISELED_COPPER.id)
+        }
+        id if id == &Block::EXPOSED_CHISELED_COPPER.id => {
+            Some(Block::WAXED_EXPOSED_CHISELED_COPPER.id)
+        }
+        id if id == &Block::CHISELED_COPPER.id => Some(Block::WAXED_CHISELED_COPPER.id),
+        id if id == &Block::OXIDIZED_COPPER_GRATE.id => Some(Block::WAXED_OXIDIZED_COPPER_GRATE.id),
+        id if id == &Block::WEATHERED_COPPER_GRATE.id => {
+            Some(Block::WAXED_WEATHERED_COPPER_GRATE.id)
+        }
+        id if id == &Block::EXPOSED_COPPER_GRATE.id => Some(Block::WAXED_EXPOSED_COPPER_GRATE.id),
+        id if id == &Block::COPPER_GRATE.id => Some(Block::WAXED_COPPER_GRATE.id),
+        id if id == &Block::OXIDIZED_CUT_COPPER.id => Some(Block::WAXED_OXIDIZED_CUT_COPPER.id),
+        id if id == &Block::WEATHERED_CUT_COPPER.id => Some(Block::WAXED_WEATHERED_CUT_COPPER.id),
+        id if id == &Block::EXPOSED_CUT_COPPER.id => Some(Block::WAXED_EXPOSED_CUT_COPPER.id),
+        id if id == &Block::CUT_COPPER.id => Some(Block::WAXED_CUT_COPPER.id),
+        id if id == &Block::OXIDIZED_CUT_COPPER_STAIRS.id => {
+            Some(Block::WAXED_OXIDIZED_CUT_COPPER_STAIRS.id)
+        }
+        id if id == &Block::WEATHERED_CUT_COPPER_STAIRS.id => {
+            Some(Block::WAXED_WEATHERED_CUT_COPPER_STAIRS.id)
+        }
+        id if id == &Block::EXPOSED_CUT_COPPER_STAIRS.id => {
+            Some(Block::WAXED_EXPOSED_CUT_COPPER_STAIRS.id)
+        }
+        id if id == &Block::CUT_COPPER_STAIRS.id => Some(Block::WAXED_CUT_COPPER_STAIRS.id),
+        id if id == &Block::OXIDIZED_CUT_COPPER_SLAB.id => {
+            Some(Block::WAXED_OXIDIZED_CUT_COPPER_SLAB.id)
+        }
+        id if id == &Block::WEATHERED_CUT_COPPER_SLAB.id => {
+            Some(Block::WAXED_WEATHERED_CUT_COPPER_SLAB.id)
+        }
+        id if id == &Block::EXPOSED_CUT_COPPER_SLAB.id => {
+            Some(Block::WAXED_EXPOSED_CUT_COPPER_SLAB.id)
+        }
+        id if id == &Block::CUT_COPPER_SLAB.id => Some(Block::WAXED_CUT_COPPER_SLAB.id),
+        id if id == &Block::OXIDIZED_COPPER_BULB.id => Some(Block::WAXED_OXIDIZED_COPPER_BULB.id),
+        id if id == &Block::WEATHERED_COPPER_BULB.id => Some(Block::WAXED_WEATHERED_COPPER_BULB.id),
+        id if id == &Block::EXPOSED_COPPER_BULB.id => Some(Block::WAXED_EXPOSED_COPPER_BULB.id),
+        id if id == &Block::COPPER_BULB.id => Some(Block::WAXED_COPPER_BULB.id),
+        id if id == &Block::OXIDIZED_COPPER_DOOR.id => Some(Block::WAXED_OXIDIZED_COPPER_DOOR.id),
+        id if id == &Block::WEATHERED_COPPER_DOOR.id => Some(Block::WAXED_WEATHERED_COPPER_DOOR.id),
+        id if id == &Block::EXPOSED_COPPER_DOOR.id => Some(Block::WAXED_EXPOSED_COPPER_DOOR.id),
+        id if id == &Block::COPPER_DOOR.id => Some(Block::WAXED_COPPER_DOOR.id),
+        id if id == &Block::OXIDIZED_COPPER_TRAPDOOR.id => {
+            Some(Block::WAXED_OXIDIZED_COPPER_TRAPDOOR.id)
+        }
+        id if id == &Block::WEATHERED_COPPER_TRAPDOOR.id => {
+            Some(Block::WAXED_WEATHERED_COPPER_TRAPDOOR.id)
+        }
+        id if id == &Block::EXPOSED_COPPER_TRAPDOOR.id => {
+            Some(Block::WAXED_EXPOSED_COPPER_TRAPDOOR.id)
+        }
+        id if id == &Block::COPPER_TRAPDOOR.id => Some(Block::WAXED_COPPER_TRAPDOOR.id),
+        _ => None,
+    }
+}
diff --git a/pumpkin/src/item/items/mod.rs b/pumpkin/src/item/items/mod.rs
index b40b9c9cb3..b45f3dd571 100644
--- a/pumpkin/src/item/items/mod.rs
+++ b/pumpkin/src/item/items/mod.rs
@@ -1,14 +1,19 @@
+mod axe;
 mod egg;
 mod hoe;
+mod honeycomb;
+mod shovel;
 mod snowball;
 mod sword;
 mod trident;
 
-use std::sync::Arc;
-
+use axe::AxeItem;
 use egg::EggItem;
 use hoe::HoeItem;
+use honeycomb::HoneyCombItem;
+use shovel::ShovelItem;
 use snowball::SnowBallItem;
+use std::sync::Arc;
 use sword::SwordItem;
 use trident::TridentItem;
 
@@ -22,6 +27,9 @@ pub fn default_registry() -> Arc<ItemRegistry> {
     manager.register(EggItem);
     manager.register(SwordItem);
     manager.register(TridentItem);
+    manager.register(ShovelItem);
+    manager.register(AxeItem);
+    manager.register(HoneyCombItem);
 
     Arc::new(manager)
 }
diff --git a/pumpkin/src/item/items/shovel.rs b/pumpkin/src/item/items/shovel.rs
new file mode 100644
index 0000000000..4657b15e47
--- /dev/null
+++ b/pumpkin/src/item/items/shovel.rs
@@ -0,0 +1,69 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::Block;
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+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
+                    .unwrap()
+                    .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
+        }
+    }
+}


Reviews:
user: login: Snowiiii
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-05T10:20:58Z
user: login: tetram2674562
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-05T10:22:10Z
user: login: Snowiiii
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T13:42:56Z
user: login: Snowiiii
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T13:43:03Z
user: login: Snowiiii
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T13:46:11Z
user: login: Snowiiii
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T13:46:40Z
user: login: tetram2674562
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T16:56:21Z
user: login: tetram2674562
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T18:28:00Z
user: login: tetram2674562
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T18:33:37Z
user: login: tetram2674562
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T18:33:55Z
user: login: Snowiiii
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-12T09:16:11Z
user: login: Snowiiii
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-12T09:16:51Z
user: login: tetram2674562
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-12T09:17:53Z
user: login: Snowiiii
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-15T08:23:01Z
user: login: Snowiiii
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-04-15T08:28:49Z
user: login: tetram2674562
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-15T11:53:33Z
user: login: Snowiiii
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-20T08:45:09Z
user: login: Snowiiii
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-24T12:29:54Z

Review comments:
diff_hunk: @@ -89,6 +89,9 @@ rustc-hash = "2.1.1"
 # Task handling
 tokio-util = { version = "0.7.14", features = ["rt"] }
 
+# Block equivalent
+lazy_static = "1.5.0"
path: pumpkin/Cargo.toml
user: login: Snowiiii
body: lazy_static is outdated, it was replaced by the Offical `LazyLock`
created_at: 2025-04-05T10:20:58Z
author_association: MEMBER
diff_hunk: @@ -89,6 +89,9 @@ rustc-hash = "2.1.1"
 # Task handling
 tokio-util = { version = "0.7.14", features = ["rt"] }
 
+# Block equivalent
+lazy_static = "1.5.0"
path: pumpkin/Cargo.toml
user: login: tetram2674562
body: Ok, I've asked on the pumpkin discord and someone said that I should use lazy_static but ok I'll use Lazylock, Thanks you.
created_at: 2025-04-05T10:22:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -21,6 +21,7 @@ pub(crate) mod redstone;
 pub(crate) mod sugar_cane;
 pub(crate) mod tnt;
 pub(crate) mod torches;
+
path: pumpkin/src/block/blocks/mod.rs
user: login: Snowiiii
body: please remove the empty space
created_at: 2025-04-11T13:42:55Z
author_association: MEMBER
diff_hunk: @@ -66,7 +66,6 @@ pub fn default_registry() -> Arc<BlockRegistry> {
     manager.register(TargetBlock);
     manager.register_fluid(FlowingWater);
     manager.register_fluid(FlowingLava);
-
path: pumpkin/src/block/mod.rs
user: login: Snowiiii
body: please remove the empty space
created_at: 2025-04-11T13:43:03Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,225 @@
+use crate::entity::player::Player;
+use crate::item::items::honeycomb::WAXED2UNWAXED;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+use std::collections::HashMap;
+use std::sync::LazyLock;
+
+pub struct AxeItem;
+
+// Need review. Since I can't verify if a block is equal to another (like mojang did) I'm going to do it with there id.
+
+static STRIPPED_BLOCKS: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::OAK_WOOD.id, Block::STRIPPED_OAK_WOOD.id),
+        (Block::OAK_LOG.id, Block::STRIPPED_OAK_LOG.id),
+        (Block::DARK_OAK_WOOD.id, Block::STRIPPED_DARK_OAK_WOOD.id),
+        (Block::DARK_OAK_LOG.id, Block::STRIPPED_DARK_OAK_LOG.id),
+        (Block::PALE_OAK_WOOD.id, Block::STRIPPED_PALE_OAK_WOOD.id),
+        (Block::PALE_OAK_LOG.id, Block::STRIPPED_PALE_OAK_LOG.id),
+        (Block::ACACIA_WOOD.id, Block::STRIPPED_ACACIA_WOOD.id),
+        (Block::ACACIA_LOG.id, Block::STRIPPED_ACACIA_LOG.id),
+        (Block::CHERRY_WOOD.id, Block::STRIPPED_CHERRY_WOOD.id),
+        (Block::CHERRY_LOG.id, Block::STRIPPED_CHERRY_LOG.id),
+        (Block::BIRCH_WOOD.id, Block::STRIPPED_BIRCH_WOOD.id),
+        (Block::BIRCH_LOG.id, Block::STRIPPED_BIRCH_LOG.id),
+        (Block::JUNGLE_WOOD.id, Block::STRIPPED_JUNGLE_WOOD.id),
+        (Block::JUNGLE_LOG.id, Block::STRIPPED_JUNGLE_LOG.id),
+        (Block::SPRUCE_WOOD.id, Block::STRIPPED_SPRUCE_WOOD.id),
+        (Block::SPRUCE_LOG.id, Block::STRIPPED_SPRUCE_LOG.id),
+        (Block::WARPED_STEM.id, Block::STRIPPED_WARPED_STEM.id),
+        (Block::WARPED_HYPHAE.id, Block::STRIPPED_WARPED_HYPHAE.id),
+        (Block::CRIMSON_STEM.id, Block::STRIPPED_CRIMSON_STEM.id),
+        (Block::CRIMSON_HYPHAE.id, Block::STRIPPED_CRIMSON_HYPHAE.id),
+        (Block::MANGROVE_WOOD.id, Block::STRIPPED_MANGROVE_WOOD.id),
+        (Block::MANGROVE_LOG.id, Block::STRIPPED_MANGROVE_LOG.id),
+        (Block::BAMBOO_BLOCK.id, Block::STRIPPED_BAMBOO_BLOCK.id),
+    ])
+});
+
+static DECREASE_OXIDATION: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::EXPOSED_COPPER.id, Block::COPPER_BLOCK.id),
+        (Block::WEATHERED_COPPER.id, Block::EXPOSED_COPPER.id),
+        (Block::OXIDIZED_COPPER.id, Block::WEATHERED_COPPER.id),
+        (Block::EXPOSED_CUT_COPPER.id, Block::CUT_COPPER.id),
+        (Block::WEATHERED_CUT_COPPER.id, Block::EXPOSED_CUT_COPPER.id),
+        (
+            Block::OXIDIZED_CUT_COPPER.id,
+            Block::WEATHERED_CUT_COPPER.id,
+        ),
+        (Block::EXPOSED_CHISELED_COPPER.id, Block::CHISELED_COPPER.id),
+        (
+            Block::WEATHERED_CHISELED_COPPER.id,
+            Block::EXPOSED_CHISELED_COPPER.id,
+        ),
+        (
+            Block::OXIDIZED_CHISELED_COPPER.id,
+            Block::WEATHERED_CHISELED_COPPER.id,
+        ),
+        (Block::EXPOSED_CUT_COPPER_SLAB.id, Block::CUT_COPPER_SLAB.id),
+        (
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+            Block::EXPOSED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_SLAB.id,
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+            Block::CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_STAIRS.id,
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+        ),
+        (Block::EXPOSED_COPPER_DOOR.id, Block::COPPER_DOOR.id),
+        (
+            Block::WEATHERED_COPPER_DOOR.id,
+            Block::EXPOSED_COPPER_DOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_DOOR.id,
+            Block::WEATHERED_COPPER_DOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_TRAPDOOR.id, Block::COPPER_TRAPDOOR.id),
+        (
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+            Block::EXPOSED_COPPER_TRAPDOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_TRAPDOOR.id,
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_GRATE.id, Block::COPPER_GRATE.id),
+        (
+            Block::WEATHERED_COPPER_GRATE.id,
+            Block::EXPOSED_COPPER_GRATE.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_GRATE.id,
+            Block::WEATHERED_COPPER_GRATE.id,
+        ),
+        (Block::EXPOSED_COPPER_BULB.id, Block::COPPER_BULB.id),
+        (
+            Block::WEATHERED_COPPER_BULB.id,
+            Block::EXPOSED_COPPER_BULB.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_BULB.id,
+            Block::WEATHERED_COPPER_BULB.id,
+        ),
+    ])
+});
path: pumpkin/src/item/items/axe.rs
user: login: Snowiiii
body: I think instead of a hashmap you could also just use a match in a function
created_at: 2025-04-11T13:46:10Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,192 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{Block, BlockProperties, OakDoorLikeProperties};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+use std::collections::HashMap;
+use std::sync::LazyLock;
+
+pub struct HoneyCombItem;
+pub static UNWAXED2WAXED: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::COPPER_BLOCK.id, Block::WAXED_COPPER_BLOCK.id),
+        (Block::EXPOSED_COPPER.id, Block::WAXED_EXPOSED_COPPER.id),
+        (Block::WEATHERED_COPPER.id, Block::WAXED_WEATHERED_COPPER.id),
+        (Block::OXIDIZED_COPPER.id, Block::WAXED_OXIDIZED_COPPER.id),
+        (Block::CUT_COPPER.id, Block::WAXED_CUT_COPPER.id),
+        (
+            Block::EXPOSED_CUT_COPPER.id,
+            Block::WAXED_EXPOSED_CUT_COPPER.id,
+        ),
+        (
+            Block::WEATHERED_CUT_COPPER.id,
+            Block::WAXED_WEATHERED_CUT_COPPER.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER.id,
+            Block::WAXED_OXIDIZED_CUT_COPPER.id,
+        ),
+        (Block::CUT_COPPER_SLAB.id, Block::WAXED_CUT_COPPER_SLAB.id),
+        (
+            Block::EXPOSED_CUT_COPPER_SLAB.id,
+            Block::WAXED_EXPOSED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+            Block::WAXED_WEATHERED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_SLAB.id,
+            Block::WAXED_OXIDIZED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::CUT_COPPER_STAIRS.id,
+            Block::WAXED_CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+            Block::WAXED_EXPOSED_CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+            Block::WAXED_WEATHERED_CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_STAIRS.id,
+            Block::WAXED_OXIDIZED_CUT_COPPER_STAIRS.id,
+        ),
+        (Block::CHISELED_COPPER.id, Block::WAXED_CHISELED_COPPER.id),
+        (
+            Block::EXPOSED_CHISELED_COPPER.id,
+            Block::WAXED_EXPOSED_CHISELED_COPPER.id,
+        ),
+        (
+            Block::WEATHERED_CHISELED_COPPER.id,
+            Block::WAXED_WEATHERED_CHISELED_COPPER.id,
+        ),
+        (
+            Block::OXIDIZED_CHISELED_COPPER.id,
+            Block::WAXED_OXIDIZED_CHISELED_COPPER.id,
+        ),
+        (Block::COPPER_DOOR.id, Block::WAXED_COPPER_DOOR.id),
+        (
+            Block::EXPOSED_COPPER_DOOR.id,
+            Block::WAXED_EXPOSED_COPPER_DOOR.id,
+        ),
+        (
+            Block::WEATHERED_COPPER_DOOR.id,
+            Block::WAXED_WEATHERED_COPPER_DOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_DOOR.id,
+            Block::WAXED_OXIDIZED_COPPER_DOOR.id,
+        ),
+        (Block::COPPER_TRAPDOOR.id, Block::WAXED_COPPER_TRAPDOOR.id),
+        (
+            Block::EXPOSED_COPPER_TRAPDOOR.id,
+            Block::WAXED_EXPOSED_COPPER_TRAPDOOR.id,
+        ),
+        (
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+            Block::WAXED_WEATHERED_COPPER_TRAPDOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_TRAPDOOR.id,
+            Block::WAXED_OXIDIZED_COPPER_TRAPDOOR.id,
+        ),
+        (Block::COPPER_GRATE.id, Block::WAXED_COPPER_GRATE.id),
+        (
+            Block::EXPOSED_COPPER_GRATE.id,
+            Block::WAXED_EXPOSED_COPPER_GRATE.id,
+        ),
+        (
+            Block::WEATHERED_COPPER_GRATE.id,
+            Block::WAXED_WEATHERED_COPPER_GRATE.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_GRATE.id,
+            Block::WAXED_OXIDIZED_COPPER_GRATE.id,
+        ),
+        (Block::COPPER_BULB.id, Block::WAXED_COPPER_BULB.id),
+        (
+            Block::EXPOSED_COPPER_BULB.id,
+            Block::WAXED_EXPOSED_COPPER_BULB.id,
+        ),
+        (
+            Block::WEATHERED_COPPER_BULB.id,
+            Block::WAXED_WEATHERED_COPPER_BULB.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_BULB.id,
+            Block::WAXED_OXIDIZED_COPPER_BULB.id,
+        ),
+    ])
+});
+pub static WAXED2UNWAXED: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    UNWAXED2WAXED
+        .iter()
+        .map(|(k, v)| (*v, *k))
+        .collect::<HashMap<_, _>>()
+});
path: pumpkin/src/item/items/honeycomb.rs
user: login: Snowiiii
body: Here you could replace it with a match aswell
created_at: 2025-04-11T13:46:40Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,225 @@
+use crate::entity::player::Player;
+use crate::item::items::honeycomb::WAXED2UNWAXED;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+use std::collections::HashMap;
+use std::sync::LazyLock;
+
+pub struct AxeItem;
+
+// Need review. Since I can't verify if a block is equal to another (like mojang did) I'm going to do it with there id.
+
+static STRIPPED_BLOCKS: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::OAK_WOOD.id, Block::STRIPPED_OAK_WOOD.id),
+        (Block::OAK_LOG.id, Block::STRIPPED_OAK_LOG.id),
+        (Block::DARK_OAK_WOOD.id, Block::STRIPPED_DARK_OAK_WOOD.id),
+        (Block::DARK_OAK_LOG.id, Block::STRIPPED_DARK_OAK_LOG.id),
+        (Block::PALE_OAK_WOOD.id, Block::STRIPPED_PALE_OAK_WOOD.id),
+        (Block::PALE_OAK_LOG.id, Block::STRIPPED_PALE_OAK_LOG.id),
+        (Block::ACACIA_WOOD.id, Block::STRIPPED_ACACIA_WOOD.id),
+        (Block::ACACIA_LOG.id, Block::STRIPPED_ACACIA_LOG.id),
+        (Block::CHERRY_WOOD.id, Block::STRIPPED_CHERRY_WOOD.id),
+        (Block::CHERRY_LOG.id, Block::STRIPPED_CHERRY_LOG.id),
+        (Block::BIRCH_WOOD.id, Block::STRIPPED_BIRCH_WOOD.id),
+        (Block::BIRCH_LOG.id, Block::STRIPPED_BIRCH_LOG.id),
+        (Block::JUNGLE_WOOD.id, Block::STRIPPED_JUNGLE_WOOD.id),
+        (Block::JUNGLE_LOG.id, Block::STRIPPED_JUNGLE_LOG.id),
+        (Block::SPRUCE_WOOD.id, Block::STRIPPED_SPRUCE_WOOD.id),
+        (Block::SPRUCE_LOG.id, Block::STRIPPED_SPRUCE_LOG.id),
+        (Block::WARPED_STEM.id, Block::STRIPPED_WARPED_STEM.id),
+        (Block::WARPED_HYPHAE.id, Block::STRIPPED_WARPED_HYPHAE.id),
+        (Block::CRIMSON_STEM.id, Block::STRIPPED_CRIMSON_STEM.id),
+        (Block::CRIMSON_HYPHAE.id, Block::STRIPPED_CRIMSON_HYPHAE.id),
+        (Block::MANGROVE_WOOD.id, Block::STRIPPED_MANGROVE_WOOD.id),
+        (Block::MANGROVE_LOG.id, Block::STRIPPED_MANGROVE_LOG.id),
+        (Block::BAMBOO_BLOCK.id, Block::STRIPPED_BAMBOO_BLOCK.id),
+    ])
+});
+
+static DECREASE_OXIDATION: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::EXPOSED_COPPER.id, Block::COPPER_BLOCK.id),
+        (Block::WEATHERED_COPPER.id, Block::EXPOSED_COPPER.id),
+        (Block::OXIDIZED_COPPER.id, Block::WEATHERED_COPPER.id),
+        (Block::EXPOSED_CUT_COPPER.id, Block::CUT_COPPER.id),
+        (Block::WEATHERED_CUT_COPPER.id, Block::EXPOSED_CUT_COPPER.id),
+        (
+            Block::OXIDIZED_CUT_COPPER.id,
+            Block::WEATHERED_CUT_COPPER.id,
+        ),
+        (Block::EXPOSED_CHISELED_COPPER.id, Block::CHISELED_COPPER.id),
+        (
+            Block::WEATHERED_CHISELED_COPPER.id,
+            Block::EXPOSED_CHISELED_COPPER.id,
+        ),
+        (
+            Block::OXIDIZED_CHISELED_COPPER.id,
+            Block::WEATHERED_CHISELED_COPPER.id,
+        ),
+        (Block::EXPOSED_CUT_COPPER_SLAB.id, Block::CUT_COPPER_SLAB.id),
+        (
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+            Block::EXPOSED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_SLAB.id,
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+            Block::CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_STAIRS.id,
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+        ),
+        (Block::EXPOSED_COPPER_DOOR.id, Block::COPPER_DOOR.id),
+        (
+            Block::WEATHERED_COPPER_DOOR.id,
+            Block::EXPOSED_COPPER_DOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_DOOR.id,
+            Block::WEATHERED_COPPER_DOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_TRAPDOOR.id, Block::COPPER_TRAPDOOR.id),
+        (
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+            Block::EXPOSED_COPPER_TRAPDOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_TRAPDOOR.id,
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_GRATE.id, Block::COPPER_GRATE.id),
+        (
+            Block::WEATHERED_COPPER_GRATE.id,
+            Block::EXPOSED_COPPER_GRATE.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_GRATE.id,
+            Block::WEATHERED_COPPER_GRATE.id,
+        ),
+        (Block::EXPOSED_COPPER_BULB.id, Block::COPPER_BULB.id),
+        (
+            Block::WEATHERED_COPPER_BULB.id,
+            Block::EXPOSED_COPPER_BULB.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_BULB.id,
+            Block::WEATHERED_COPPER_BULB.id,
+        ),
+    ])
+});
path: pumpkin/src/item/items/axe.rs
user: login: tetram2674562
body: I guess I'll just go back to my first commit and copy paste the section about properties.
created_at: 2025-04-11T16:56:21Z
author_association: CONTRIBUTOR
diff_hunk: @@ -66,7 +66,6 @@ pub fn default_registry() -> Arc<BlockRegistry> {
     manager.register(TargetBlock);
     manager.register_fluid(FlowingWater);
     manager.register_fluid(FlowingLava);
-
path: pumpkin/src/block/mod.rs
user: login: tetram2674562
body: It's saying that I've removed it, no? (maybe you're talking about another space :c)
created_at: 2025-04-11T18:28:00Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,225 @@
+use crate::entity::player::Player;
+use crate::item::items::honeycomb::WAXED2UNWAXED;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+use std::collections::HashMap;
+use std::sync::LazyLock;
+
+pub struct AxeItem;
+
+// Need review. Since I can't verify if a block is equal to another (like mojang did) I'm going to do it with there id.
+
+static STRIPPED_BLOCKS: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::OAK_WOOD.id, Block::STRIPPED_OAK_WOOD.id),
+        (Block::OAK_LOG.id, Block::STRIPPED_OAK_LOG.id),
+        (Block::DARK_OAK_WOOD.id, Block::STRIPPED_DARK_OAK_WOOD.id),
+        (Block::DARK_OAK_LOG.id, Block::STRIPPED_DARK_OAK_LOG.id),
+        (Block::PALE_OAK_WOOD.id, Block::STRIPPED_PALE_OAK_WOOD.id),
+        (Block::PALE_OAK_LOG.id, Block::STRIPPED_PALE_OAK_LOG.id),
+        (Block::ACACIA_WOOD.id, Block::STRIPPED_ACACIA_WOOD.id),
+        (Block::ACACIA_LOG.id, Block::STRIPPED_ACACIA_LOG.id),
+        (Block::CHERRY_WOOD.id, Block::STRIPPED_CHERRY_WOOD.id),
+        (Block::CHERRY_LOG.id, Block::STRIPPED_CHERRY_LOG.id),
+        (Block::BIRCH_WOOD.id, Block::STRIPPED_BIRCH_WOOD.id),
+        (Block::BIRCH_LOG.id, Block::STRIPPED_BIRCH_LOG.id),
+        (Block::JUNGLE_WOOD.id, Block::STRIPPED_JUNGLE_WOOD.id),
+        (Block::JUNGLE_LOG.id, Block::STRIPPED_JUNGLE_LOG.id),
+        (Block::SPRUCE_WOOD.id, Block::STRIPPED_SPRUCE_WOOD.id),
+        (Block::SPRUCE_LOG.id, Block::STRIPPED_SPRUCE_LOG.id),
+        (Block::WARPED_STEM.id, Block::STRIPPED_WARPED_STEM.id),
+        (Block::WARPED_HYPHAE.id, Block::STRIPPED_WARPED_HYPHAE.id),
+        (Block::CRIMSON_STEM.id, Block::STRIPPED_CRIMSON_STEM.id),
+        (Block::CRIMSON_HYPHAE.id, Block::STRIPPED_CRIMSON_HYPHAE.id),
+        (Block::MANGROVE_WOOD.id, Block::STRIPPED_MANGROVE_WOOD.id),
+        (Block::MANGROVE_LOG.id, Block::STRIPPED_MANGROVE_LOG.id),
+        (Block::BAMBOO_BLOCK.id, Block::STRIPPED_BAMBOO_BLOCK.id),
+    ])
+});
+
+static DECREASE_OXIDATION: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::EXPOSED_COPPER.id, Block::COPPER_BLOCK.id),
+        (Block::WEATHERED_COPPER.id, Block::EXPOSED_COPPER.id),
+        (Block::OXIDIZED_COPPER.id, Block::WEATHERED_COPPER.id),
+        (Block::EXPOSED_CUT_COPPER.id, Block::CUT_COPPER.id),
+        (Block::WEATHERED_CUT_COPPER.id, Block::EXPOSED_CUT_COPPER.id),
+        (
+            Block::OXIDIZED_CUT_COPPER.id,
+            Block::WEATHERED_CUT_COPPER.id,
+        ),
+        (Block::EXPOSED_CHISELED_COPPER.id, Block::CHISELED_COPPER.id),
+        (
+            Block::WEATHERED_CHISELED_COPPER.id,
+            Block::EXPOSED_CHISELED_COPPER.id,
+        ),
+        (
+            Block::OXIDIZED_CHISELED_COPPER.id,
+            Block::WEATHERED_CHISELED_COPPER.id,
+        ),
+        (Block::EXPOSED_CUT_COPPER_SLAB.id, Block::CUT_COPPER_SLAB.id),
+        (
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+            Block::EXPOSED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_SLAB.id,
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+            Block::CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_STAIRS.id,
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+        ),
+        (Block::EXPOSED_COPPER_DOOR.id, Block::COPPER_DOOR.id),
+        (
+            Block::WEATHERED_COPPER_DOOR.id,
+            Block::EXPOSED_COPPER_DOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_DOOR.id,
+            Block::WEATHERED_COPPER_DOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_TRAPDOOR.id, Block::COPPER_TRAPDOOR.id),
+        (
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+            Block::EXPOSED_COPPER_TRAPDOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_TRAPDOOR.id,
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_GRATE.id, Block::COPPER_GRATE.id),
+        (
+            Block::WEATHERED_COPPER_GRATE.id,
+            Block::EXPOSED_COPPER_GRATE.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_GRATE.id,
+            Block::WEATHERED_COPPER_GRATE.id,
+        ),
+        (Block::EXPOSED_COPPER_BULB.id, Block::COPPER_BULB.id),
+        (
+            Block::WEATHERED_COPPER_BULB.id,
+            Block::EXPOSED_COPPER_BULB.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_BULB.id,
+            Block::WEATHERED_COPPER_BULB.id,
+        ),
+    ])
+});
path: pumpkin/src/item/items/axe.rs
user: login: tetram2674562
body: I remember why I forgot about making a big match, It was because clippy was crying because of my function being longer than 100 lines.
created_at: 2025-04-11T18:33:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,225 @@
+use crate::entity::player::Player;
+use crate::item::items::honeycomb::WAXED2UNWAXED;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+use std::collections::HashMap;
+use std::sync::LazyLock;
+
+pub struct AxeItem;
+
+// Need review. Since I can't verify if a block is equal to another (like mojang did) I'm going to do it with there id.
+
+static STRIPPED_BLOCKS: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::OAK_WOOD.id, Block::STRIPPED_OAK_WOOD.id),
+        (Block::OAK_LOG.id, Block::STRIPPED_OAK_LOG.id),
+        (Block::DARK_OAK_WOOD.id, Block::STRIPPED_DARK_OAK_WOOD.id),
+        (Block::DARK_OAK_LOG.id, Block::STRIPPED_DARK_OAK_LOG.id),
+        (Block::PALE_OAK_WOOD.id, Block::STRIPPED_PALE_OAK_WOOD.id),
+        (Block::PALE_OAK_LOG.id, Block::STRIPPED_PALE_OAK_LOG.id),
+        (Block::ACACIA_WOOD.id, Block::STRIPPED_ACACIA_WOOD.id),
+        (Block::ACACIA_LOG.id, Block::STRIPPED_ACACIA_LOG.id),
+        (Block::CHERRY_WOOD.id, Block::STRIPPED_CHERRY_WOOD.id),
+        (Block::CHERRY_LOG.id, Block::STRIPPED_CHERRY_LOG.id),
+        (Block::BIRCH_WOOD.id, Block::STRIPPED_BIRCH_WOOD.id),
+        (Block::BIRCH_LOG.id, Block::STRIPPED_BIRCH_LOG.id),
+        (Block::JUNGLE_WOOD.id, Block::STRIPPED_JUNGLE_WOOD.id),
+        (Block::JUNGLE_LOG.id, Block::STRIPPED_JUNGLE_LOG.id),
+        (Block::SPRUCE_WOOD.id, Block::STRIPPED_SPRUCE_WOOD.id),
+        (Block::SPRUCE_LOG.id, Block::STRIPPED_SPRUCE_LOG.id),
+        (Block::WARPED_STEM.id, Block::STRIPPED_WARPED_STEM.id),
+        (Block::WARPED_HYPHAE.id, Block::STRIPPED_WARPED_HYPHAE.id),
+        (Block::CRIMSON_STEM.id, Block::STRIPPED_CRIMSON_STEM.id),
+        (Block::CRIMSON_HYPHAE.id, Block::STRIPPED_CRIMSON_HYPHAE.id),
+        (Block::MANGROVE_WOOD.id, Block::STRIPPED_MANGROVE_WOOD.id),
+        (Block::MANGROVE_LOG.id, Block::STRIPPED_MANGROVE_LOG.id),
+        (Block::BAMBOO_BLOCK.id, Block::STRIPPED_BAMBOO_BLOCK.id),
+    ])
+});
+
+static DECREASE_OXIDATION: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::EXPOSED_COPPER.id, Block::COPPER_BLOCK.id),
+        (Block::WEATHERED_COPPER.id, Block::EXPOSED_COPPER.id),
+        (Block::OXIDIZED_COPPER.id, Block::WEATHERED_COPPER.id),
+        (Block::EXPOSED_CUT_COPPER.id, Block::CUT_COPPER.id),
+        (Block::WEATHERED_CUT_COPPER.id, Block::EXPOSED_CUT_COPPER.id),
+        (
+            Block::OXIDIZED_CUT_COPPER.id,
+            Block::WEATHERED_CUT_COPPER.id,
+        ),
+        (Block::EXPOSED_CHISELED_COPPER.id, Block::CHISELED_COPPER.id),
+        (
+            Block::WEATHERED_CHISELED_COPPER.id,
+            Block::EXPOSED_CHISELED_COPPER.id,
+        ),
+        (
+            Block::OXIDIZED_CHISELED_COPPER.id,
+            Block::WEATHERED_CHISELED_COPPER.id,
+        ),
+        (Block::EXPOSED_CUT_COPPER_SLAB.id, Block::CUT_COPPER_SLAB.id),
+        (
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+            Block::EXPOSED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_SLAB.id,
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+            Block::CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_STAIRS.id,
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+        ),
+        (Block::EXPOSED_COPPER_DOOR.id, Block::COPPER_DOOR.id),
+        (
+            Block::WEATHERED_COPPER_DOOR.id,
+            Block::EXPOSED_COPPER_DOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_DOOR.id,
+            Block::WEATHERED_COPPER_DOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_TRAPDOOR.id, Block::COPPER_TRAPDOOR.id),
+        (
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+            Block::EXPOSED_COPPER_TRAPDOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_TRAPDOOR.id,
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_GRATE.id, Block::COPPER_GRATE.id),
+        (
+            Block::WEATHERED_COPPER_GRATE.id,
+            Block::EXPOSED_COPPER_GRATE.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_GRATE.id,
+            Block::WEATHERED_COPPER_GRATE.id,
+        ),
+        (Block::EXPOSED_COPPER_BULB.id, Block::COPPER_BULB.id),
+        (
+            Block::WEATHERED_COPPER_BULB.id,
+            Block::EXPOSED_COPPER_BULB.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_BULB.id,
+            Block::WEATHERED_COPPER_BULB.id,
+        ),
+    ])
+});
path: pumpkin/src/item/items/axe.rs
user: login: tetram2674562
body: Do you think I should do it anyway? @Snowiiii 
created_at: 2025-04-11T18:33:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,225 @@
+use crate::entity::player::Player;
+use crate::item::items::honeycomb::WAXED2UNWAXED;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+use std::collections::HashMap;
+use std::sync::LazyLock;
+
+pub struct AxeItem;
+
+// Need review. Since I can't verify if a block is equal to another (like mojang did) I'm going to do it with there id.
+
+static STRIPPED_BLOCKS: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::OAK_WOOD.id, Block::STRIPPED_OAK_WOOD.id),
+        (Block::OAK_LOG.id, Block::STRIPPED_OAK_LOG.id),
+        (Block::DARK_OAK_WOOD.id, Block::STRIPPED_DARK_OAK_WOOD.id),
+        (Block::DARK_OAK_LOG.id, Block::STRIPPED_DARK_OAK_LOG.id),
+        (Block::PALE_OAK_WOOD.id, Block::STRIPPED_PALE_OAK_WOOD.id),
+        (Block::PALE_OAK_LOG.id, Block::STRIPPED_PALE_OAK_LOG.id),
+        (Block::ACACIA_WOOD.id, Block::STRIPPED_ACACIA_WOOD.id),
+        (Block::ACACIA_LOG.id, Block::STRIPPED_ACACIA_LOG.id),
+        (Block::CHERRY_WOOD.id, Block::STRIPPED_CHERRY_WOOD.id),
+        (Block::CHERRY_LOG.id, Block::STRIPPED_CHERRY_LOG.id),
+        (Block::BIRCH_WOOD.id, Block::STRIPPED_BIRCH_WOOD.id),
+        (Block::BIRCH_LOG.id, Block::STRIPPED_BIRCH_LOG.id),
+        (Block::JUNGLE_WOOD.id, Block::STRIPPED_JUNGLE_WOOD.id),
+        (Block::JUNGLE_LOG.id, Block::STRIPPED_JUNGLE_LOG.id),
+        (Block::SPRUCE_WOOD.id, Block::STRIPPED_SPRUCE_WOOD.id),
+        (Block::SPRUCE_LOG.id, Block::STRIPPED_SPRUCE_LOG.id),
+        (Block::WARPED_STEM.id, Block::STRIPPED_WARPED_STEM.id),
+        (Block::WARPED_HYPHAE.id, Block::STRIPPED_WARPED_HYPHAE.id),
+        (Block::CRIMSON_STEM.id, Block::STRIPPED_CRIMSON_STEM.id),
+        (Block::CRIMSON_HYPHAE.id, Block::STRIPPED_CRIMSON_HYPHAE.id),
+        (Block::MANGROVE_WOOD.id, Block::STRIPPED_MANGROVE_WOOD.id),
+        (Block::MANGROVE_LOG.id, Block::STRIPPED_MANGROVE_LOG.id),
+        (Block::BAMBOO_BLOCK.id, Block::STRIPPED_BAMBOO_BLOCK.id),
+    ])
+});
+
+static DECREASE_OXIDATION: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::EXPOSED_COPPER.id, Block::COPPER_BLOCK.id),
+        (Block::WEATHERED_COPPER.id, Block::EXPOSED_COPPER.id),
+        (Block::OXIDIZED_COPPER.id, Block::WEATHERED_COPPER.id),
+        (Block::EXPOSED_CUT_COPPER.id, Block::CUT_COPPER.id),
+        (Block::WEATHERED_CUT_COPPER.id, Block::EXPOSED_CUT_COPPER.id),
+        (
+            Block::OXIDIZED_CUT_COPPER.id,
+            Block::WEATHERED_CUT_COPPER.id,
+        ),
+        (Block::EXPOSED_CHISELED_COPPER.id, Block::CHISELED_COPPER.id),
+        (
+            Block::WEATHERED_CHISELED_COPPER.id,
+            Block::EXPOSED_CHISELED_COPPER.id,
+        ),
+        (
+            Block::OXIDIZED_CHISELED_COPPER.id,
+            Block::WEATHERED_CHISELED_COPPER.id,
+        ),
+        (Block::EXPOSED_CUT_COPPER_SLAB.id, Block::CUT_COPPER_SLAB.id),
+        (
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+            Block::EXPOSED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_SLAB.id,
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+            Block::CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_STAIRS.id,
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+        ),
+        (Block::EXPOSED_COPPER_DOOR.id, Block::COPPER_DOOR.id),
+        (
+            Block::WEATHERED_COPPER_DOOR.id,
+            Block::EXPOSED_COPPER_DOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_DOOR.id,
+            Block::WEATHERED_COPPER_DOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_TRAPDOOR.id, Block::COPPER_TRAPDOOR.id),
+        (
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+            Block::EXPOSED_COPPER_TRAPDOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_TRAPDOOR.id,
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_GRATE.id, Block::COPPER_GRATE.id),
+        (
+            Block::WEATHERED_COPPER_GRATE.id,
+            Block::EXPOSED_COPPER_GRATE.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_GRATE.id,
+            Block::WEATHERED_COPPER_GRATE.id,
+        ),
+        (Block::EXPOSED_COPPER_BULB.id, Block::COPPER_BULB.id),
+        (
+            Block::WEATHERED_COPPER_BULB.id,
+            Block::EXPOSED_COPPER_BULB.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_BULB.id,
+            Block::WEATHERED_COPPER_BULB.id,
+        ),
+    ])
+});
path: pumpkin/src/item/items/axe.rs
user: login: Snowiiii
body: > I remember why I forgot about making a big match, It was because clippy was crying because of my function being longer than 100 lines.

You can just use `expect[...]` to ignore clippy warns

> Do you think I should do it anyway? @Snowiiii

yes
created_at: 2025-04-12T09:16:11Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,225 @@
+use crate::entity::player::Player;
+use crate::item::items::honeycomb::WAXED2UNWAXED;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+use std::collections::HashMap;
+use std::sync::LazyLock;
+
+pub struct AxeItem;
+
+// Need review. Since I can't verify if a block is equal to another (like mojang did) I'm going to do it with there id.
+
+static STRIPPED_BLOCKS: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::OAK_WOOD.id, Block::STRIPPED_OAK_WOOD.id),
+        (Block::OAK_LOG.id, Block::STRIPPED_OAK_LOG.id),
+        (Block::DARK_OAK_WOOD.id, Block::STRIPPED_DARK_OAK_WOOD.id),
+        (Block::DARK_OAK_LOG.id, Block::STRIPPED_DARK_OAK_LOG.id),
+        (Block::PALE_OAK_WOOD.id, Block::STRIPPED_PALE_OAK_WOOD.id),
+        (Block::PALE_OAK_LOG.id, Block::STRIPPED_PALE_OAK_LOG.id),
+        (Block::ACACIA_WOOD.id, Block::STRIPPED_ACACIA_WOOD.id),
+        (Block::ACACIA_LOG.id, Block::STRIPPED_ACACIA_LOG.id),
+        (Block::CHERRY_WOOD.id, Block::STRIPPED_CHERRY_WOOD.id),
+        (Block::CHERRY_LOG.id, Block::STRIPPED_CHERRY_LOG.id),
+        (Block::BIRCH_WOOD.id, Block::STRIPPED_BIRCH_WOOD.id),
+        (Block::BIRCH_LOG.id, Block::STRIPPED_BIRCH_LOG.id),
+        (Block::JUNGLE_WOOD.id, Block::STRIPPED_JUNGLE_WOOD.id),
+        (Block::JUNGLE_LOG.id, Block::STRIPPED_JUNGLE_LOG.id),
+        (Block::SPRUCE_WOOD.id, Block::STRIPPED_SPRUCE_WOOD.id),
+        (Block::SPRUCE_LOG.id, Block::STRIPPED_SPRUCE_LOG.id),
+        (Block::WARPED_STEM.id, Block::STRIPPED_WARPED_STEM.id),
+        (Block::WARPED_HYPHAE.id, Block::STRIPPED_WARPED_HYPHAE.id),
+        (Block::CRIMSON_STEM.id, Block::STRIPPED_CRIMSON_STEM.id),
+        (Block::CRIMSON_HYPHAE.id, Block::STRIPPED_CRIMSON_HYPHAE.id),
+        (Block::MANGROVE_WOOD.id, Block::STRIPPED_MANGROVE_WOOD.id),
+        (Block::MANGROVE_LOG.id, Block::STRIPPED_MANGROVE_LOG.id),
+        (Block::BAMBOO_BLOCK.id, Block::STRIPPED_BAMBOO_BLOCK.id),
+    ])
+});
+
+static DECREASE_OXIDATION: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::EXPOSED_COPPER.id, Block::COPPER_BLOCK.id),
+        (Block::WEATHERED_COPPER.id, Block::EXPOSED_COPPER.id),
+        (Block::OXIDIZED_COPPER.id, Block::WEATHERED_COPPER.id),
+        (Block::EXPOSED_CUT_COPPER.id, Block::CUT_COPPER.id),
+        (Block::WEATHERED_CUT_COPPER.id, Block::EXPOSED_CUT_COPPER.id),
+        (
+            Block::OXIDIZED_CUT_COPPER.id,
+            Block::WEATHERED_CUT_COPPER.id,
+        ),
+        (Block::EXPOSED_CHISELED_COPPER.id, Block::CHISELED_COPPER.id),
+        (
+            Block::WEATHERED_CHISELED_COPPER.id,
+            Block::EXPOSED_CHISELED_COPPER.id,
+        ),
+        (
+            Block::OXIDIZED_CHISELED_COPPER.id,
+            Block::WEATHERED_CHISELED_COPPER.id,
+        ),
+        (Block::EXPOSED_CUT_COPPER_SLAB.id, Block::CUT_COPPER_SLAB.id),
+        (
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+            Block::EXPOSED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_SLAB.id,
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+            Block::CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_STAIRS.id,
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+        ),
+        (Block::EXPOSED_COPPER_DOOR.id, Block::COPPER_DOOR.id),
+        (
+            Block::WEATHERED_COPPER_DOOR.id,
+            Block::EXPOSED_COPPER_DOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_DOOR.id,
+            Block::WEATHERED_COPPER_DOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_TRAPDOOR.id, Block::COPPER_TRAPDOOR.id),
+        (
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+            Block::EXPOSED_COPPER_TRAPDOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_TRAPDOOR.id,
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_GRATE.id, Block::COPPER_GRATE.id),
+        (
+            Block::WEATHERED_COPPER_GRATE.id,
+            Block::EXPOSED_COPPER_GRATE.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_GRATE.id,
+            Block::WEATHERED_COPPER_GRATE.id,
+        ),
+        (Block::EXPOSED_COPPER_BULB.id, Block::COPPER_BULB.id),
+        (
+            Block::WEATHERED_COPPER_BULB.id,
+            Block::EXPOSED_COPPER_BULB.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_BULB.id,
+            Block::WEATHERED_COPPER_BULB.id,
+        ),
+    ])
+});
path: pumpkin/src/item/items/axe.rs
user: login: Snowiiii
body: but i think it may make sense to make multiple functions with match 
created_at: 2025-04-12T09:16:51Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,225 @@
+use crate::entity::player::Player;
+use crate::item::items::honeycomb::WAXED2UNWAXED;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+use std::collections::HashMap;
+use std::sync::LazyLock;
+
+pub struct AxeItem;
+
+// Need review. Since I can't verify if a block is equal to another (like mojang did) I'm going to do it with there id.
+
+static STRIPPED_BLOCKS: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::OAK_WOOD.id, Block::STRIPPED_OAK_WOOD.id),
+        (Block::OAK_LOG.id, Block::STRIPPED_OAK_LOG.id),
+        (Block::DARK_OAK_WOOD.id, Block::STRIPPED_DARK_OAK_WOOD.id),
+        (Block::DARK_OAK_LOG.id, Block::STRIPPED_DARK_OAK_LOG.id),
+        (Block::PALE_OAK_WOOD.id, Block::STRIPPED_PALE_OAK_WOOD.id),
+        (Block::PALE_OAK_LOG.id, Block::STRIPPED_PALE_OAK_LOG.id),
+        (Block::ACACIA_WOOD.id, Block::STRIPPED_ACACIA_WOOD.id),
+        (Block::ACACIA_LOG.id, Block::STRIPPED_ACACIA_LOG.id),
+        (Block::CHERRY_WOOD.id, Block::STRIPPED_CHERRY_WOOD.id),
+        (Block::CHERRY_LOG.id, Block::STRIPPED_CHERRY_LOG.id),
+        (Block::BIRCH_WOOD.id, Block::STRIPPED_BIRCH_WOOD.id),
+        (Block::BIRCH_LOG.id, Block::STRIPPED_BIRCH_LOG.id),
+        (Block::JUNGLE_WOOD.id, Block::STRIPPED_JUNGLE_WOOD.id),
+        (Block::JUNGLE_LOG.id, Block::STRIPPED_JUNGLE_LOG.id),
+        (Block::SPRUCE_WOOD.id, Block::STRIPPED_SPRUCE_WOOD.id),
+        (Block::SPRUCE_LOG.id, Block::STRIPPED_SPRUCE_LOG.id),
+        (Block::WARPED_STEM.id, Block::STRIPPED_WARPED_STEM.id),
+        (Block::WARPED_HYPHAE.id, Block::STRIPPED_WARPED_HYPHAE.id),
+        (Block::CRIMSON_STEM.id, Block::STRIPPED_CRIMSON_STEM.id),
+        (Block::CRIMSON_HYPHAE.id, Block::STRIPPED_CRIMSON_HYPHAE.id),
+        (Block::MANGROVE_WOOD.id, Block::STRIPPED_MANGROVE_WOOD.id),
+        (Block::MANGROVE_LOG.id, Block::STRIPPED_MANGROVE_LOG.id),
+        (Block::BAMBOO_BLOCK.id, Block::STRIPPED_BAMBOO_BLOCK.id),
+    ])
+});
+
+static DECREASE_OXIDATION: LazyLock<HashMap<u16, u16>> = LazyLock::new(|| {
+    HashMap::from([
+        (Block::EXPOSED_COPPER.id, Block::COPPER_BLOCK.id),
+        (Block::WEATHERED_COPPER.id, Block::EXPOSED_COPPER.id),
+        (Block::OXIDIZED_COPPER.id, Block::WEATHERED_COPPER.id),
+        (Block::EXPOSED_CUT_COPPER.id, Block::CUT_COPPER.id),
+        (Block::WEATHERED_CUT_COPPER.id, Block::EXPOSED_CUT_COPPER.id),
+        (
+            Block::OXIDIZED_CUT_COPPER.id,
+            Block::WEATHERED_CUT_COPPER.id,
+        ),
+        (Block::EXPOSED_CHISELED_COPPER.id, Block::CHISELED_COPPER.id),
+        (
+            Block::WEATHERED_CHISELED_COPPER.id,
+            Block::EXPOSED_CHISELED_COPPER.id,
+        ),
+        (
+            Block::OXIDIZED_CHISELED_COPPER.id,
+            Block::WEATHERED_CHISELED_COPPER.id,
+        ),
+        (Block::EXPOSED_CUT_COPPER_SLAB.id, Block::CUT_COPPER_SLAB.id),
+        (
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+            Block::EXPOSED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_SLAB.id,
+            Block::WEATHERED_CUT_COPPER_SLAB.id,
+        ),
+        (
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+            Block::CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+            Block::EXPOSED_CUT_COPPER_STAIRS.id,
+        ),
+        (
+            Block::OXIDIZED_CUT_COPPER_STAIRS.id,
+            Block::WEATHERED_CUT_COPPER_STAIRS.id,
+        ),
+        (Block::EXPOSED_COPPER_DOOR.id, Block::COPPER_DOOR.id),
+        (
+            Block::WEATHERED_COPPER_DOOR.id,
+            Block::EXPOSED_COPPER_DOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_DOOR.id,
+            Block::WEATHERED_COPPER_DOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_TRAPDOOR.id, Block::COPPER_TRAPDOOR.id),
+        (
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+            Block::EXPOSED_COPPER_TRAPDOOR.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_TRAPDOOR.id,
+            Block::WEATHERED_COPPER_TRAPDOOR.id,
+        ),
+        (Block::EXPOSED_COPPER_GRATE.id, Block::COPPER_GRATE.id),
+        (
+            Block::WEATHERED_COPPER_GRATE.id,
+            Block::EXPOSED_COPPER_GRATE.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_GRATE.id,
+            Block::WEATHERED_COPPER_GRATE.id,
+        ),
+        (Block::EXPOSED_COPPER_BULB.id, Block::COPPER_BULB.id),
+        (
+            Block::WEATHERED_COPPER_BULB.id,
+            Block::EXPOSED_COPPER_BULB.id,
+        ),
+        (
+            Block::OXIDIZED_COPPER_BULB.id,
+            Block::WEATHERED_COPPER_BULB.id,
+        ),
+    ])
+});
path: pumpkin/src/item/items/axe.rs
user: login: tetram2674562
body: > but i think we may make sense to make multiple functions with match

Yes you right :D I think It'll make more sense
created_at: 2025-04-12T09:17:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,234 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct AxeItem;
+
+impl ItemMetadata for AxeItem {
+    fn ids() -> Box<[u16]> {
+        Item::get_tag_values("#minecraft:axes")
+            .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 AxeItem {
+    #[allow(clippy::too_many_lines)]
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        // I tried to follow mojang order of doing things.
+        let world = player.world().await;
+        let replacement_block = try_use_axe(block);
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            let new_block = Block::from_id(replacement_block.unwrap());
+            let new_block = &new_block.unwrap();
+            let new_state_id = if block.is_tagged_with("#minecraft:logs").is_some()
+                && block.is_tagged_with("#minecraft:logs").unwrap()
path: pumpkin/src/item/items/axe.rs
user: login: Snowiiii
body: this can be replaced with just and `if let Some(...) = 
created_at: 2025-04-15T08:23:01Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,234 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct AxeItem;
+
+impl ItemMetadata for AxeItem {
+    fn ids() -> Box<[u16]> {
+        Item::get_tag_values("#minecraft:axes")
+            .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 AxeItem {
+    #[allow(clippy::too_many_lines)]
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        // I tried to follow mojang order of doing things.
+        let world = player.world().await;
+        let replacement_block = try_use_axe(block);
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            let new_block = Block::from_id(replacement_block.unwrap());
+            let new_block = &new_block.unwrap();
+            let new_state_id = if block.is_tagged_with("#minecraft:logs").is_some()
+                && block.is_tagged_with("#minecraft:logs").unwrap()
+            {
+                let log_information = world.get_block_state_id(&location).await.unwrap();
+                let log_props = PaleOakWoodLikeProperties::from_state_id(log_information, block);
+                // create new properties for the new log.
+                let mut new_log_properties = PaleOakWoodLikeProperties::default(new_block);
+                new_log_properties.axis = log_props.axis;
+
+                // create new properties for the new log.
+
+                // Set old axis to the new log.
+                new_log_properties.axis = log_props.axis;
+                new_log_properties.to_state_id(new_block)
+            }
+            // Let's check if It's a door
+            else if block.is_tagged_with("#minecraft:doors").is_some()
+                && block.is_tagged_with("#minecraft:doors").unwrap()
path: pumpkin/src/item/items/axe.rs
user: login: Snowiiii
body: this can be replaced with just and `if let Some(...) =
created_at: 2025-04-15T08:24:03Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,128 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{Block, BlockProperties, OakDoorLikeProperties};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct HoneyCombItem;
+
+impl ItemMetadata for HoneyCombItem {
+    fn ids() -> Box<[u16]> {
+        [Item::HONEYCOMB.id].into()
+    }
+}
+
+#[async_trait]
+impl PumpkinItem for HoneyCombItem {
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        let world = player.world().await;
+
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+        let replacement_block = get_waxed_equivalent(block);
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            // get block state of the old log.
+            // get the log properties
+            // create new properties for the new log.
+            let new_block = &Block::from_id(replacement_block.unwrap()).unwrap();
+
+            let new_state_id = if block.is_tagged_with("#minecraft:doors").is_some()
+                && block.is_tagged_with("#minecraft:doors").unwrap()
path: pumpkin/src/item/items/honeycomb.rs
user: login: Snowiiii
body: this can be replaced with just and `if let Some(...) =
created_at: 2025-04-15T08:24:46Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,66 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::Block;
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+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.unwrap().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
+            todo!();
path: pumpkin/src/item/items/shovel.rs
user: login: Snowiiii
body: oh no, don't use todo!(), this can crash the entire server
created_at: 2025-04-15T08:26:04Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,128 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{Block, BlockProperties, OakDoorLikeProperties};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct HoneyCombItem;
+
+impl ItemMetadata for HoneyCombItem {
+    fn ids() -> Box<[u16]> {
+        [Item::HONEYCOMB.id].into()
+    }
+}
+
+#[async_trait]
+impl PumpkinItem for HoneyCombItem {
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        let world = player.world().await;
+
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+        let replacement_block = get_waxed_equivalent(block);
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            // get block state of the old log.
+            // get the log properties
+            // create new properties for the new log.
+            let new_block = &Block::from_id(replacement_block.unwrap()).unwrap();
+
+            let new_state_id = if block.is_tagged_with("#minecraft:doors").is_some()
+                && block.is_tagged_with("#minecraft:doors").unwrap()
+            {
+                // get block state of the old log.
+                let door_information = world.get_block_state_id(&location).await.unwrap();
+                // get the log properties
+                let door_props = OakDoorLikeProperties::from_state_id(door_information, block);
+                // create new properties for the new log.
+                let mut new_door_properties = OakDoorLikeProperties::default(new_block);
+                // Set old axis to the new log.
+                new_door_properties.facing = door_props.facing;
+                new_door_properties.open = door_props.open;
+                new_door_properties.half = door_props.half;
+                new_door_properties.hinge = door_props.hinge;
+                new_door_properties.powered = door_props.powered;
+                new_door_properties.to_state_id(new_block)
+            } else {
+                new_block.default_state_id
+            };
+
+            // TODO Implements trapdoors
+            world
+                .set_block_state(&location, new_state_id, BlockFlags::NOTIFY_ALL)
+                .await;
+            return;
+        }
+    }
+}
+
+fn get_waxed_equivalent(block: &Block) -> Option<u16> {
+    let new_block_id = match &block.id {
+        id if id == &Block::OXIDIZED_COPPER.id => Block::WAXED_OXIDIZED_COPPER.id,
+        id if id == &Block::WEATHERED_COPPER.id => Block::WAXED_WEATHERED_COPPER.id,
+        id if id == &Block::EXPOSED_COPPER.id => Block::WAXED_EXPOSED_COPPER.id,
+        id if id == &Block::COPPER_BLOCK.id => Block::WAXED_COPPER_BLOCK.id,
+        id if id == &Block::OXIDIZED_CHISELED_COPPER.id => Block::WAXED_OXIDIZED_CHISELED_COPPER.id,
+        id if id == &Block::WEATHERED_CHISELED_COPPER.id => {
+            Block::WAXED_WEATHERED_CHISELED_COPPER.id
+        }
+        id if id == &Block::EXPOSED_CHISELED_COPPER.id => Block::WAXED_EXPOSED_CHISELED_COPPER.id,
+        id if id == &Block::CHISELED_COPPER.id => Block::WAXED_CHISELED_COPPER.id,
+        id if id == &Block::OXIDIZED_COPPER_GRATE.id => Block::WAXED_OXIDIZED_COPPER_GRATE.id,
+        id if id == &Block::WEATHERED_COPPER_GRATE.id => Block::WAXED_WEATHERED_COPPER_GRATE.id,
+        id if id == &Block::EXPOSED_COPPER_GRATE.id => Block::WAXED_EXPOSED_COPPER_GRATE.id,
+        id if id == &Block::COPPER_GRATE.id => Block::WAXED_COPPER_GRATE.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER.id => Block::WAXED_OXIDIZED_CUT_COPPER.id,
+        id if id == &Block::WEATHERED_CUT_COPPER.id => Block::WAXED_WEATHERED_CUT_COPPER.id,
+        id if id == &Block::EXPOSED_CUT_COPPER.id => Block::WAXED_EXPOSED_CUT_COPPER.id,
+        id if id == &Block::CUT_COPPER.id => Block::WAXED_CUT_COPPER.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER_STAIRS.id => {
+            Block::WAXED_OXIDIZED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::WEATHERED_CUT_COPPER_STAIRS.id => {
+            Block::WAXED_WEATHERED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::EXPOSED_CUT_COPPER_STAIRS.id => {
+            Block::WAXED_EXPOSED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::CUT_COPPER_STAIRS.id => Block::WAXED_CUT_COPPER_STAIRS.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER_SLAB.id => Block::WAXED_OXIDIZED_CUT_COPPER_SLAB.id,
+        id if id == &Block::WEATHERED_CUT_COPPER_SLAB.id => {
+            Block::WAXED_WEATHERED_CUT_COPPER_SLAB.id
+        }
+        id if id == &Block::EXPOSED_CUT_COPPER_SLAB.id => Block::WAXED_EXPOSED_CUT_COPPER_SLAB.id,
+        id if id == &Block::CUT_COPPER_SLAB.id => Block::WAXED_CUT_COPPER_SLAB.id,
+        id if id == &Block::OXIDIZED_COPPER_BULB.id => Block::WAXED_OXIDIZED_COPPER_BULB.id,
+        id if id == &Block::WEATHERED_COPPER_BULB.id => Block::WAXED_WEATHERED_COPPER_BULB.id,
+        id if id == &Block::EXPOSED_COPPER_BULB.id => Block::WAXED_EXPOSED_COPPER_BULB.id,
+        id if id == &Block::COPPER_BULB.id => Block::WAXED_COPPER_BULB.id,
+        id if id == &Block::OXIDIZED_COPPER_DOOR.id => Block::WAXED_OXIDIZED_COPPER_DOOR.id,
+        id if id == &Block::WEATHERED_COPPER_DOOR.id => Block::WAXED_WEATHERED_COPPER_DOOR.id,
+        id if id == &Block::EXPOSED_COPPER_DOOR.id => Block::WAXED_EXPOSED_COPPER_DOOR.id,
+        id if id == &Block::COPPER_DOOR.id => Block::WAXED_COPPER_DOOR.id,
+        id if id == &Block::OXIDIZED_COPPER_TRAPDOOR.id => Block::WAXED_OXIDIZED_COPPER_TRAPDOOR.id,
+        id if id == &Block::WEATHERED_COPPER_TRAPDOOR.id => {
+            Block::WAXED_WEATHERED_COPPER_TRAPDOOR.id
+        }
+        id if id == &Block::EXPOSED_COPPER_TRAPDOOR.id => Block::WAXED_EXPOSED_COPPER_TRAPDOOR.id,
+        id if id == &Block::COPPER_TRAPDOOR.id => Block::WAXED_COPPER_TRAPDOOR.id,
+        _ => block.id,
+    };
path: pumpkin/src/item/items/honeycomb.rs
user: login: Snowiiii
body: we you use `id if id ==` ?, You already use a match so it should be not needed
created_at: 2025-04-15T08:27:29Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,234 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct AxeItem;
+
+impl ItemMetadata for AxeItem {
+    fn ids() -> Box<[u16]> {
+        Item::get_tag_values("#minecraft:axes")
+            .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 AxeItem {
+    #[allow(clippy::too_many_lines)]
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        // I tried to follow mojang order of doing things.
+        let world = player.world().await;
+        let replacement_block = try_use_axe(block);
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            let new_block = Block::from_id(replacement_block.unwrap());
+            let new_block = &new_block.unwrap();
+            let new_state_id = if block.is_tagged_with("#minecraft:logs").is_some()
+                && block.is_tagged_with("#minecraft:logs").unwrap()
+            {
+                let log_information = world.get_block_state_id(&location).await.unwrap();
+                let log_props = PaleOakWoodLikeProperties::from_state_id(log_information, block);
+                // create new properties for the new log.
+                let mut new_log_properties = PaleOakWoodLikeProperties::default(new_block);
+                new_log_properties.axis = log_props.axis;
+
+                // create new properties for the new log.
+
+                // Set old axis to the new log.
+                new_log_properties.axis = log_props.axis;
+                new_log_properties.to_state_id(new_block)
+            }
+            // Let's check if It's a door
+            else if block.is_tagged_with("#minecraft:doors").is_some()
+                && block.is_tagged_with("#minecraft:doors").unwrap()
+            {
+                // get block state of the old log.
+                let door_information = world.get_block_state_id(&location).await.unwrap();
+                // get the log properties
+                let door_props = OakDoorLikeProperties::from_state_id(door_information, block);
+                // create new properties for the new log.
+                let mut new_door_properties = OakDoorLikeProperties::default(new_block);
+                // Set old axis to the new log.
+                new_door_properties.facing = door_props.facing;
+                new_door_properties.open = door_props.open;
+                new_door_properties.half = door_props.half;
+                new_door_properties.hinge = door_props.hinge;
+                new_door_properties.powered = door_props.powered;
+                new_door_properties.to_state_id(new_block)
+            } else {
+                new_block.default_state_id
+            };
+            // TODO Implements trapdoors when It's implemented
+            world
+                .set_block_state(&location, new_state_id, BlockFlags::NOTIFY_ALL)
+                .await;
+            return;
+        }
+    }
+}
+fn try_use_axe(block: &Block) -> Option<u16> {
+    // Trying to get the strip equivalent
+    let block_id = get_stripped_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    // Else decrease the level of oxidation
+    let block_id = get_deoxidized_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    // Else unwax the block
+    let block_id = get_unwaxed_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    None
+}
+
+fn get_stripped_equivalent(block: &Block) -> Option<u16> {
+    let new_block_id = match &block.id {
+        id if id == &Block::CHERRY_LOG.id => Block::STRIPPED_CHERRY_LOG.id,
+        id if id == &Block::JUNGLE_LOG.id => Block::STRIPPED_JUNGLE_LOG.id,
+        id if id == &Block::PALE_OAK_LOG.id => Block::STRIPPED_PALE_OAK_LOG.id,
+
+        id if id == &Block::DARK_OAK_LOG.id => Block::STRIPPED_DARK_OAK_LOG.id,
+
+        id if id == &Block::MANGROVE_LOG.id => Block::STRIPPED_MANGROVE_LOG.id,
+        id if id == &Block::OAK_WOOD.id => Block::STRIPPED_OAK_WOOD.id,
+        id if id == &Block::BIRCH_WOOD.id => Block::STRIPPED_BIRCH_WOOD.id,
+        id if id == &Block::SPRUCE_WOOD.id => Block::STRIPPED_SPRUCE_WOOD.id,
+        id if id == &Block::ACACIA_WOOD.id => Block::STRIPPED_ACACIA_WOOD.id,
+        id if id == &Block::CHERRY_WOOD.id => Block::STRIPPED_CHERRY_WOOD.id,
+        id if id == &Block::JUNGLE_WOOD.id => Block::STRIPPED_JUNGLE_WOOD.id,
+        id if id == &Block::PALE_OAK_WOOD.id => Block::STRIPPED_PALE_OAK_WOOD.id,
+        id if id == &Block::DARK_OAK_WOOD.id => Block::STRIPPED_DARK_OAK_WOOD.id,
+        id if id == &Block::MANGROVE_WOOD.id => Block::STRIPPED_MANGROVE_WOOD.id,
+        _ => block.id,
+    };
+    if new_block_id == block.id {
+        return None;
+    }
+    Some(new_block_id)
+}
+
+fn get_deoxidized_equivalent(block: &Block) -> Option<u16> {
+    let new_block_id = match &block.id {
+        id if id == &Block::OXIDIZED_COPPER.id => Block::WEATHERED_COPPER.id,
+        id if id == &Block::WEATHERED_COPPER.id => Block::EXPOSED_COPPER.id,
+        id if id == &Block::EXPOSED_COPPER.id => Block::COPPER_BLOCK.id,
+        id if id == &Block::OXIDIZED_CHISELED_COPPER.id => Block::WEATHERED_CHISELED_COPPER.id,
+        id if id == &Block::WEATHERED_CHISELED_COPPER.id => Block::EXPOSED_CHISELED_COPPER.id,
+        id if id == &Block::EXPOSED_CHISELED_COPPER.id => Block::CHISELED_COPPER.id,
+        id if id == &Block::OXIDIZED_COPPER_GRATE.id => Block::WEATHERED_COPPER_GRATE.id,
+        id if id == &Block::WEATHERED_COPPER_GRATE.id => Block::EXPOSED_COPPER_GRATE.id,
+        id if id == &Block::EXPOSED_COPPER_GRATE.id => Block::COPPER_GRATE.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER.id => Block::WEATHERED_CUT_COPPER.id,
+        id if id == &Block::WEATHERED_CUT_COPPER.id => Block::EXPOSED_CUT_COPPER.id,
+        id if id == &Block::EXPOSED_CUT_COPPER.id => Block::CUT_COPPER.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER_STAIRS.id => Block::WEATHERED_CUT_COPPER_STAIRS.id,
+        id if id == &Block::WEATHERED_CUT_COPPER_STAIRS.id => Block::EXPOSED_CUT_COPPER_STAIRS.id,
+        id if id == &Block::EXPOSED_CUT_COPPER_STAIRS.id => Block::CUT_COPPER_STAIRS.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER_SLAB.id => Block::WEATHERED_CUT_COPPER_SLAB.id,
+        id if id == &Block::WEATHERED_CUT_COPPER_SLAB.id => Block::EXPOSED_CUT_COPPER_SLAB.id,
+        id if id == &Block::EXPOSED_CUT_COPPER_SLAB.id => Block::CUT_COPPER_SLAB.id,
+        id if id == &Block::OXIDIZED_COPPER_BULB.id => Block::WEATHERED_COPPER_BULB.id,
+        id if id == &Block::WEATHERED_COPPER_BULB.id => Block::EXPOSED_COPPER_BULB.id,
+        id if id == &Block::EXPOSED_COPPER_BULB.id => Block::COPPER_BULB.id,
+        id if id == &Block::OXIDIZED_COPPER_DOOR.id => Block::WEATHERED_COPPER_DOOR.id,
+        id if id == &Block::WEATHERED_COPPER_DOOR.id => Block::EXPOSED_COPPER_DOOR.id,
+        id if id == &Block::EXPOSED_COPPER_DOOR.id => Block::COPPER_DOOR.id,
+
+        id if id == &Block::OXIDIZED_COPPER_TRAPDOOR.id => Block::WEATHERED_COPPER_TRAPDOOR.id,
+        id if id == &Block::WEATHERED_COPPER_TRAPDOOR.id => Block::EXPOSED_COPPER_TRAPDOOR.id,
+        id if id == &Block::EXPOSED_COPPER_TRAPDOOR.id => Block::COPPER_TRAPDOOR.id,
+        _ => block.id,
+    };
+    if new_block_id == block.id {
+        return None;
+    }
+    Some(new_block_id)
+}
+
+fn get_unwaxed_equivalent(block: &Block) -> Option<u16> {
+    let new_block_id = match &block.id {
+        id if id == &Block::WAXED_OXIDIZED_COPPER.id => Block::OXIDIZED_COPPER.id,
+        id if id == &Block::WAXED_WEATHERED_COPPER.id => Block::WEATHERED_COPPER.id,
+        id if id == &Block::WAXED_EXPOSED_COPPER.id => Block::EXPOSED_COPPER.id,
+        id if id == &Block::WAXED_COPPER_BLOCK.id => Block::COPPER_BLOCK.id,
+        id if id == &Block::WAXED_OXIDIZED_CHISELED_COPPER.id => Block::OXIDIZED_CHISELED_COPPER.id,
+        id if id == &Block::WAXED_WEATHERED_CHISELED_COPPER.id => {
+            Block::WEATHERED_CHISELED_COPPER.id
+        }
+        id if id == &Block::WAXED_EXPOSED_CHISELED_COPPER.id => Block::EXPOSED_CHISELED_COPPER.id,
+        id if id == &Block::WAXED_CHISELED_COPPER.id => Block::CHISELED_COPPER.id,
+        id if id == &Block::WAXED_COPPER_GRATE.id => Block::COPPER_GRATE.id,
+        id if id == &Block::WAXED_OXIDIZED_COPPER_GRATE.id => Block::OXIDIZED_COPPER_GRATE.id,
+        id if id == &Block::WAXED_WEATHERED_COPPER_GRATE.id => Block::WEATHERED_COPPER_GRATE.id,
+        id if id == &Block::WAXED_EXPOSED_COPPER_GRATE.id => Block::EXPOSED_COPPER_GRATE.id,
+        id if id == &Block::WAXED_OXIDIZED_CUT_COPPER.id => Block::OXIDIZED_CUT_COPPER.id,
+        id if id == &Block::WAXED_WEATHERED_CUT_COPPER.id => Block::WEATHERED_CUT_COPPER.id,
+        id if id == &Block::WAXED_EXPOSED_CUT_COPPER.id => Block::EXPOSED_CUT_COPPER.id,
+        id if id == &Block::WAXED_CUT_COPPER.id => Block::CUT_COPPER.id,
+        id if id == &Block::WAXED_OXIDIZED_CUT_COPPER_STAIRS.id => {
+            Block::OXIDIZED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::WAXED_WEATHERED_CUT_COPPER_STAIRS.id => {
+            Block::WEATHERED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::WAXED_EXPOSED_CUT_COPPER_STAIRS.id => {
+            Block::EXPOSED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::WAXED_CUT_COPPER_STAIRS.id => Block::CUT_COPPER_STAIRS.id,
+        id if id == &Block::WAXED_OXIDIZED_CUT_COPPER_SLAB.id => Block::OXIDIZED_CUT_COPPER_SLAB.id,
+        id if id == &Block::WAXED_WEATHERED_CUT_COPPER_SLAB.id => {
+            Block::WEATHERED_CUT_COPPER_SLAB.id
+        }
+        id if id == &Block::WAXED_EXPOSED_CUT_COPPER_SLAB.id => Block::EXPOSED_CUT_COPPER_SLAB.id,
+        id if id == &Block::WAXED_CUT_COPPER_SLAB.id => Block::CUT_COPPER_SLAB.id,
+        id if id == &Block::WAXED_OXIDIZED_COPPER_BULB.id => Block::OXIDIZED_COPPER_BULB.id,
+        id if id == &Block::WAXED_WEATHERED_COPPER_BULB.id => Block::WEATHERED_COPPER_BULB.id,
+        id if id == &Block::WAXED_EXPOSED_COPPER_BULB.id => Block::EXPOSED_COPPER_BULB.id,
+        id if id == &Block::WAXED_COPPER_BULB.id => Block::COPPER_BULB.id,
+        id if id == &Block::WAXED_OXIDIZED_COPPER_DOOR.id => Block::OXIDIZED_COPPER_DOOR.id,
+        id if id == &Block::WAXED_WEATHERED_COPPER_DOOR.id => Block::WEATHERED_COPPER_DOOR.id,
+        id if id == &Block::WAXED_EXPOSED_COPPER_DOOR.id => Block::EXPOSED_COPPER_DOOR.id,
+        id if id == &Block::WAXED_COPPER_DOOR.id => Block::COPPER_DOOR.id,
+        id if id == &Block::WAXED_OXIDIZED_COPPER_TRAPDOOR.id => Block::OXIDIZED_COPPER_TRAPDOOR.id,
+        id if id == &Block::WAXED_WEATHERED_COPPER_TRAPDOOR.id => {
+            Block::WEATHERED_COPPER_TRAPDOOR.id
+        }
+        id if id == &Block::WAXED_EXPOSED_COPPER_TRAPDOOR.id => Block::EXPOSED_COPPER_TRAPDOOR.id,
+        id if id == &Block::WAXED_COPPER_TRAPDOOR.id => Block::COPPER_TRAPDOOR.id,
+        _ => block.id,
+    };
path: pumpkin/src/item/items/axe.rs
user: login: Snowiiii
body: we you use id if id == ?, You already use a match so it should be not needed
created_at: 2025-04-15T08:27:55Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,234 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct AxeItem;
+
+impl ItemMetadata for AxeItem {
+    fn ids() -> Box<[u16]> {
+        Item::get_tag_values("#minecraft:axes")
+            .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 AxeItem {
+    #[allow(clippy::too_many_lines)]
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        // I tried to follow mojang order of doing things.
+        let world = player.world().await;
+        let replacement_block = try_use_axe(block);
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            let new_block = Block::from_id(replacement_block.unwrap());
+            let new_block = &new_block.unwrap();
+            let new_state_id = if block.is_tagged_with("#minecraft:logs").is_some()
+                && block.is_tagged_with("#minecraft:logs").unwrap()
+            {
+                let log_information = world.get_block_state_id(&location).await.unwrap();
+                let log_props = PaleOakWoodLikeProperties::from_state_id(log_information, block);
+                // create new properties for the new log.
+                let mut new_log_properties = PaleOakWoodLikeProperties::default(new_block);
+                new_log_properties.axis = log_props.axis;
+
+                // create new properties for the new log.
+
+                // Set old axis to the new log.
+                new_log_properties.axis = log_props.axis;
+                new_log_properties.to_state_id(new_block)
+            }
+            // Let's check if It's a door
+            else if block.is_tagged_with("#minecraft:doors").is_some()
+                && block.is_tagged_with("#minecraft:doors").unwrap()
+            {
+                // get block state of the old log.
+                let door_information = world.get_block_state_id(&location).await.unwrap();
+                // get the log properties
+                let door_props = OakDoorLikeProperties::from_state_id(door_information, block);
+                // create new properties for the new log.
+                let mut new_door_properties = OakDoorLikeProperties::default(new_block);
+                // Set old axis to the new log.
+                new_door_properties.facing = door_props.facing;
+                new_door_properties.open = door_props.open;
+                new_door_properties.half = door_props.half;
+                new_door_properties.hinge = door_props.hinge;
+                new_door_properties.powered = door_props.powered;
+                new_door_properties.to_state_id(new_block)
+            } else {
+                new_block.default_state_id
+            };
+            // TODO Implements trapdoors when It's implemented
+            world
+                .set_block_state(&location, new_state_id, BlockFlags::NOTIFY_ALL)
+                .await;
+            return;
+        }
+    }
+}
+fn try_use_axe(block: &Block) -> Option<u16> {
+    // Trying to get the strip equivalent
+    let block_id = get_stripped_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    // Else decrease the level of oxidation
+    let block_id = get_deoxidized_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    // Else unwax the block
+    let block_id = get_unwaxed_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    None
+}
+
+fn get_stripped_equivalent(block: &Block) -> Option<u16> {
+    let new_block_id = match &block.id {
+        id if id == &Block::CHERRY_LOG.id => Block::STRIPPED_CHERRY_LOG.id,
+        id if id == &Block::JUNGLE_LOG.id => Block::STRIPPED_JUNGLE_LOG.id,
+        id if id == &Block::PALE_OAK_LOG.id => Block::STRIPPED_PALE_OAK_LOG.id,
+
+        id if id == &Block::DARK_OAK_LOG.id => Block::STRIPPED_DARK_OAK_LOG.id,
+
+        id if id == &Block::MANGROVE_LOG.id => Block::STRIPPED_MANGROVE_LOG.id,
+        id if id == &Block::OAK_WOOD.id => Block::STRIPPED_OAK_WOOD.id,
+        id if id == &Block::BIRCH_WOOD.id => Block::STRIPPED_BIRCH_WOOD.id,
+        id if id == &Block::SPRUCE_WOOD.id => Block::STRIPPED_SPRUCE_WOOD.id,
+        id if id == &Block::ACACIA_WOOD.id => Block::STRIPPED_ACACIA_WOOD.id,
+        id if id == &Block::CHERRY_WOOD.id => Block::STRIPPED_CHERRY_WOOD.id,
+        id if id == &Block::JUNGLE_WOOD.id => Block::STRIPPED_JUNGLE_WOOD.id,
+        id if id == &Block::PALE_OAK_WOOD.id => Block::STRIPPED_PALE_OAK_WOOD.id,
+        id if id == &Block::DARK_OAK_WOOD.id => Block::STRIPPED_DARK_OAK_WOOD.id,
+        id if id == &Block::MANGROVE_WOOD.id => Block::STRIPPED_MANGROVE_WOOD.id,
+        _ => block.id,
+    };
path: pumpkin/src/item/items/axe.rs
user: login: Snowiiii
body: we you use id if id == ?, You already use a match so it should be not needed
created_at: 2025-04-15T08:28:07Z
author_association: MEMBER
diff_hunk: @@ -66,7 +66,6 @@ pub fn default_registry() -> Arc<BlockRegistry> {
     manager.register(TargetBlock);
     manager.register_fluid(FlowingWater);
     manager.register_fluid(FlowingLava);
-
path: pumpkin/src/block/mod.rs
user: login: Snowiiii
body: no, just look at your changed files in github, its still commited
created_at: 2025-04-15T08:28:40Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,128 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{Block, BlockProperties, OakDoorLikeProperties};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct HoneyCombItem;
+
+impl ItemMetadata for HoneyCombItem {
+    fn ids() -> Box<[u16]> {
+        [Item::HONEYCOMB.id].into()
+    }
+}
+
+#[async_trait]
+impl PumpkinItem for HoneyCombItem {
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        let world = player.world().await;
+
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+        let replacement_block = get_waxed_equivalent(block);
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            // get block state of the old log.
+            // get the log properties
+            // create new properties for the new log.
+            let new_block = &Block::from_id(replacement_block.unwrap()).unwrap();
+
+            let new_state_id = if block.is_tagged_with("#minecraft:doors").is_some()
+                && block.is_tagged_with("#minecraft:doors").unwrap()
+            {
+                // get block state of the old log.
+                let door_information = world.get_block_state_id(&location).await.unwrap();
+                // get the log properties
+                let door_props = OakDoorLikeProperties::from_state_id(door_information, block);
+                // create new properties for the new log.
+                let mut new_door_properties = OakDoorLikeProperties::default(new_block);
+                // Set old axis to the new log.
+                new_door_properties.facing = door_props.facing;
+                new_door_properties.open = door_props.open;
+                new_door_properties.half = door_props.half;
+                new_door_properties.hinge = door_props.hinge;
+                new_door_properties.powered = door_props.powered;
+                new_door_properties.to_state_id(new_block)
+            } else {
+                new_block.default_state_id
+            };
+
+            // TODO Implements trapdoors
+            world
+                .set_block_state(&location, new_state_id, BlockFlags::NOTIFY_ALL)
+                .await;
+            return;
+        }
+    }
+}
+
+fn get_waxed_equivalent(block: &Block) -> Option<u16> {
+    let new_block_id = match &block.id {
+        id if id == &Block::OXIDIZED_COPPER.id => Block::WAXED_OXIDIZED_COPPER.id,
+        id if id == &Block::WEATHERED_COPPER.id => Block::WAXED_WEATHERED_COPPER.id,
+        id if id == &Block::EXPOSED_COPPER.id => Block::WAXED_EXPOSED_COPPER.id,
+        id if id == &Block::COPPER_BLOCK.id => Block::WAXED_COPPER_BLOCK.id,
+        id if id == &Block::OXIDIZED_CHISELED_COPPER.id => Block::WAXED_OXIDIZED_CHISELED_COPPER.id,
+        id if id == &Block::WEATHERED_CHISELED_COPPER.id => {
+            Block::WAXED_WEATHERED_CHISELED_COPPER.id
+        }
+        id if id == &Block::EXPOSED_CHISELED_COPPER.id => Block::WAXED_EXPOSED_CHISELED_COPPER.id,
+        id if id == &Block::CHISELED_COPPER.id => Block::WAXED_CHISELED_COPPER.id,
+        id if id == &Block::OXIDIZED_COPPER_GRATE.id => Block::WAXED_OXIDIZED_COPPER_GRATE.id,
+        id if id == &Block::WEATHERED_COPPER_GRATE.id => Block::WAXED_WEATHERED_COPPER_GRATE.id,
+        id if id == &Block::EXPOSED_COPPER_GRATE.id => Block::WAXED_EXPOSED_COPPER_GRATE.id,
+        id if id == &Block::COPPER_GRATE.id => Block::WAXED_COPPER_GRATE.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER.id => Block::WAXED_OXIDIZED_CUT_COPPER.id,
+        id if id == &Block::WEATHERED_CUT_COPPER.id => Block::WAXED_WEATHERED_CUT_COPPER.id,
+        id if id == &Block::EXPOSED_CUT_COPPER.id => Block::WAXED_EXPOSED_CUT_COPPER.id,
+        id if id == &Block::CUT_COPPER.id => Block::WAXED_CUT_COPPER.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER_STAIRS.id => {
+            Block::WAXED_OXIDIZED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::WEATHERED_CUT_COPPER_STAIRS.id => {
+            Block::WAXED_WEATHERED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::EXPOSED_CUT_COPPER_STAIRS.id => {
+            Block::WAXED_EXPOSED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::CUT_COPPER_STAIRS.id => Block::WAXED_CUT_COPPER_STAIRS.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER_SLAB.id => Block::WAXED_OXIDIZED_CUT_COPPER_SLAB.id,
+        id if id == &Block::WEATHERED_CUT_COPPER_SLAB.id => {
+            Block::WAXED_WEATHERED_CUT_COPPER_SLAB.id
+        }
+        id if id == &Block::EXPOSED_CUT_COPPER_SLAB.id => Block::WAXED_EXPOSED_CUT_COPPER_SLAB.id,
+        id if id == &Block::CUT_COPPER_SLAB.id => Block::WAXED_CUT_COPPER_SLAB.id,
+        id if id == &Block::OXIDIZED_COPPER_BULB.id => Block::WAXED_OXIDIZED_COPPER_BULB.id,
+        id if id == &Block::WEATHERED_COPPER_BULB.id => Block::WAXED_WEATHERED_COPPER_BULB.id,
+        id if id == &Block::EXPOSED_COPPER_BULB.id => Block::WAXED_EXPOSED_COPPER_BULB.id,
+        id if id == &Block::COPPER_BULB.id => Block::WAXED_COPPER_BULB.id,
+        id if id == &Block::OXIDIZED_COPPER_DOOR.id => Block::WAXED_OXIDIZED_COPPER_DOOR.id,
+        id if id == &Block::WEATHERED_COPPER_DOOR.id => Block::WAXED_WEATHERED_COPPER_DOOR.id,
+        id if id == &Block::EXPOSED_COPPER_DOOR.id => Block::WAXED_EXPOSED_COPPER_DOOR.id,
+        id if id == &Block::COPPER_DOOR.id => Block::WAXED_COPPER_DOOR.id,
+        id if id == &Block::OXIDIZED_COPPER_TRAPDOOR.id => Block::WAXED_OXIDIZED_COPPER_TRAPDOOR.id,
+        id if id == &Block::WEATHERED_COPPER_TRAPDOOR.id => {
+            Block::WAXED_WEATHERED_COPPER_TRAPDOOR.id
+        }
+        id if id == &Block::EXPOSED_COPPER_TRAPDOOR.id => Block::WAXED_EXPOSED_COPPER_TRAPDOOR.id,
+        id if id == &Block::COPPER_TRAPDOOR.id => Block::WAXED_COPPER_TRAPDOOR.id,
+        _ => block.id,
+    };
path: pumpkin/src/item/items/honeycomb.rs
user: login: tetram2674562
body: I couldn't make the comparaison between the id of the current block and the id of the block I wanted to check with.

![image](https://github.com/user-attachments/assets/1b90ea2a-15a3-43e2-bfcd-efcd5d32f627)

If you have a solution to that I'm open :)
created_at: 2025-04-15T11:53:33Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,128 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{Block, BlockProperties, OakDoorLikeProperties};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct HoneyCombItem;
+
+impl ItemMetadata for HoneyCombItem {
+    fn ids() -> Box<[u16]> {
+        [Item::HONEYCOMB.id].into()
+    }
+}
+
+#[async_trait]
+impl PumpkinItem for HoneyCombItem {
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        let world = player.world().await;
+
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+        let replacement_block = get_waxed_equivalent(block);
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            // get block state of the old log.
+            // get the log properties
+            // create new properties for the new log.
+            let new_block = &Block::from_id(replacement_block.unwrap()).unwrap();
+
+            let new_state_id = if block.is_tagged_with("#minecraft:doors").is_some()
+                && block.is_tagged_with("#minecraft:doors").unwrap()
+            {
+                // get block state of the old log.
+                let door_information = world.get_block_state_id(&location).await.unwrap();
+                // get the log properties
+                let door_props = OakDoorLikeProperties::from_state_id(door_information, block);
+                // create new properties for the new log.
+                let mut new_door_properties = OakDoorLikeProperties::default(new_block);
+                // Set old axis to the new log.
+                new_door_properties.facing = door_props.facing;
+                new_door_properties.open = door_props.open;
+                new_door_properties.half = door_props.half;
+                new_door_properties.hinge = door_props.hinge;
+                new_door_properties.powered = door_props.powered;
+                new_door_properties.to_state_id(new_block)
+            } else {
+                new_block.default_state_id
+            };
+
+            // TODO Implements trapdoors
+            world
+                .set_block_state(&location, new_state_id, BlockFlags::NOTIFY_ALL)
+                .await;
+            return;
+        }
+    }
+}
+
+fn get_waxed_equivalent(block: &Block) -> Option<u16> {
+    let new_block_id = match &block.id {
+        id if id == &Block::OXIDIZED_COPPER.id => Block::WAXED_OXIDIZED_COPPER.id,
+        id if id == &Block::WEATHERED_COPPER.id => Block::WAXED_WEATHERED_COPPER.id,
+        id if id == &Block::EXPOSED_COPPER.id => Block::WAXED_EXPOSED_COPPER.id,
+        id if id == &Block::COPPER_BLOCK.id => Block::WAXED_COPPER_BLOCK.id,
+        id if id == &Block::OXIDIZED_CHISELED_COPPER.id => Block::WAXED_OXIDIZED_CHISELED_COPPER.id,
+        id if id == &Block::WEATHERED_CHISELED_COPPER.id => {
+            Block::WAXED_WEATHERED_CHISELED_COPPER.id
+        }
+        id if id == &Block::EXPOSED_CHISELED_COPPER.id => Block::WAXED_EXPOSED_CHISELED_COPPER.id,
+        id if id == &Block::CHISELED_COPPER.id => Block::WAXED_CHISELED_COPPER.id,
+        id if id == &Block::OXIDIZED_COPPER_GRATE.id => Block::WAXED_OXIDIZED_COPPER_GRATE.id,
+        id if id == &Block::WEATHERED_COPPER_GRATE.id => Block::WAXED_WEATHERED_COPPER_GRATE.id,
+        id if id == &Block::EXPOSED_COPPER_GRATE.id => Block::WAXED_EXPOSED_COPPER_GRATE.id,
+        id if id == &Block::COPPER_GRATE.id => Block::WAXED_COPPER_GRATE.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER.id => Block::WAXED_OXIDIZED_CUT_COPPER.id,
+        id if id == &Block::WEATHERED_CUT_COPPER.id => Block::WAXED_WEATHERED_CUT_COPPER.id,
+        id if id == &Block::EXPOSED_CUT_COPPER.id => Block::WAXED_EXPOSED_CUT_COPPER.id,
+        id if id == &Block::CUT_COPPER.id => Block::WAXED_CUT_COPPER.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER_STAIRS.id => {
+            Block::WAXED_OXIDIZED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::WEATHERED_CUT_COPPER_STAIRS.id => {
+            Block::WAXED_WEATHERED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::EXPOSED_CUT_COPPER_STAIRS.id => {
+            Block::WAXED_EXPOSED_CUT_COPPER_STAIRS.id
+        }
+        id if id == &Block::CUT_COPPER_STAIRS.id => Block::WAXED_CUT_COPPER_STAIRS.id,
+        id if id == &Block::OXIDIZED_CUT_COPPER_SLAB.id => Block::WAXED_OXIDIZED_CUT_COPPER_SLAB.id,
+        id if id == &Block::WEATHERED_CUT_COPPER_SLAB.id => {
+            Block::WAXED_WEATHERED_CUT_COPPER_SLAB.id
+        }
+        id if id == &Block::EXPOSED_CUT_COPPER_SLAB.id => Block::WAXED_EXPOSED_CUT_COPPER_SLAB.id,
+        id if id == &Block::CUT_COPPER_SLAB.id => Block::WAXED_CUT_COPPER_SLAB.id,
+        id if id == &Block::OXIDIZED_COPPER_BULB.id => Block::WAXED_OXIDIZED_COPPER_BULB.id,
+        id if id == &Block::WEATHERED_COPPER_BULB.id => Block::WAXED_WEATHERED_COPPER_BULB.id,
+        id if id == &Block::EXPOSED_COPPER_BULB.id => Block::WAXED_EXPOSED_COPPER_BULB.id,
+        id if id == &Block::COPPER_BULB.id => Block::WAXED_COPPER_BULB.id,
+        id if id == &Block::OXIDIZED_COPPER_DOOR.id => Block::WAXED_OXIDIZED_COPPER_DOOR.id,
+        id if id == &Block::WEATHERED_COPPER_DOOR.id => Block::WAXED_WEATHERED_COPPER_DOOR.id,
+        id if id == &Block::EXPOSED_COPPER_DOOR.id => Block::WAXED_EXPOSED_COPPER_DOOR.id,
+        id if id == &Block::COPPER_DOOR.id => Block::WAXED_COPPER_DOOR.id,
+        id if id == &Block::OXIDIZED_COPPER_TRAPDOOR.id => Block::WAXED_OXIDIZED_COPPER_TRAPDOOR.id,
+        id if id == &Block::WEATHERED_COPPER_TRAPDOOR.id => {
+            Block::WAXED_WEATHERED_COPPER_TRAPDOOR.id
+        }
+        id if id == &Block::EXPOSED_COPPER_TRAPDOOR.id => Block::WAXED_EXPOSED_COPPER_TRAPDOOR.id,
+        id if id == &Block::COPPER_TRAPDOOR.id => Block::WAXED_COPPER_TRAPDOOR.id,
+        _ => block.id,
+    };
path: pumpkin/src/item/items/honeycomb.rs
user: login: Snowiiii
body: that's because you need borrow the checked block something like this
```rust
let new_block_id = match block {
        &Block::WAXED_OXIDIZED_COPPER => Block::OXIDIZED_COPPER,
```
you can also remove the .id everywhere so its simpler because it only compares the ids if you check 2 blocks
created_at: 2025-04-20T08:45:09Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,234 @@
+use crate::entity::player::Player;
+use crate::item::pumpkin_item::{ItemMetadata, PumpkinItem};
+use crate::server::Server;
+use crate::world::BlockFlags;
+use async_trait::async_trait;
+use pumpkin_data::block::{
+    Block, BlockProperties, OakDoorLikeProperties, PaleOakWoodLikeProperties,
+};
+use pumpkin_data::item::Item;
+use pumpkin_data::tag::Tagable;
+use pumpkin_util::math::position::BlockPos;
+use pumpkin_world::block::BlockDirection;
+
+pub struct AxeItem;
+
+impl ItemMetadata for AxeItem {
+    fn ids() -> Box<[u16]> {
+        Item::get_tag_values("#minecraft:axes")
+            .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 AxeItem {
+    #[allow(clippy::too_many_lines)]
+    async fn use_on_block(
+        &self,
+        _item: &Item,
+        player: &Player,
+        location: BlockPos,
+        _face: &BlockDirection,
+        block: &Block,
+        _server: &Server,
+    ) {
+        // I tried to follow mojang order of doing things.
+        let world = player.world().await;
+        let replacement_block = try_use_axe(block);
+        // First we try to strip the block. by getting his equivalent and applying it the axis.
+
+        // If there is a strip equivalent.
+        if replacement_block.is_some() {
+            let new_block = Block::from_id(replacement_block.unwrap());
+            let new_block = &new_block.unwrap();
+            let new_state_id = if block.is_tagged_with("#minecraft:logs").is_some()
+                && block.is_tagged_with("#minecraft:logs").unwrap()
+            {
+                let log_information = world.get_block_state_id(&location).await.unwrap();
+                let log_props = PaleOakWoodLikeProperties::from_state_id(log_information, block);
+                // create new properties for the new log.
+                let mut new_log_properties = PaleOakWoodLikeProperties::default(new_block);
+                new_log_properties.axis = log_props.axis;
+
+                // create new properties for the new log.
+
+                // Set old axis to the new log.
+                new_log_properties.axis = log_props.axis;
+                new_log_properties.to_state_id(new_block)
+            }
+            // Let's check if It's a door
+            else if block.is_tagged_with("#minecraft:doors").is_some()
+                && block.is_tagged_with("#minecraft:doors").unwrap()
+            {
+                // get block state of the old log.
+                let door_information = world.get_block_state_id(&location).await.unwrap();
+                // get the log properties
+                let door_props = OakDoorLikeProperties::from_state_id(door_information, block);
+                // create new properties for the new log.
+                let mut new_door_properties = OakDoorLikeProperties::default(new_block);
+                // Set old axis to the new log.
+                new_door_properties.facing = door_props.facing;
+                new_door_properties.open = door_props.open;
+                new_door_properties.half = door_props.half;
+                new_door_properties.hinge = door_props.hinge;
+                new_door_properties.powered = door_props.powered;
+                new_door_properties.to_state_id(new_block)
+            } else {
+                new_block.default_state_id
+            };
+            // TODO Implements trapdoors when It's implemented
+            world
+                .set_block_state(&location, new_state_id, BlockFlags::NOTIFY_ALL)
+                .await;
+            return;
+        }
+    }
+}
+fn try_use_axe(block: &Block) -> Option<u16> {
+    // Trying to get the strip equivalent
+    let block_id = get_stripped_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    // Else decrease the level of oxidation
+    let block_id = get_deoxidized_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    // Else unwax the block
+    let block_id = get_unwaxed_equivalent(block);
+    if block_id.is_some() {
+        return block_id;
+    }
+    None
+}
+
+fn get_stripped_equivalent(block: &Block) -> Option<u16> {
+    let new_block_id = match &block.id {
+        id if id == &Block::CHERRY_LOG.id => Block::STRIPPED_CHERRY_LOG.id,
+        id if id == &Block::JUNGLE_LOG.id => Block::STRIPPED_JUNGLE_LOG.id,
+        id if id == &Block::PALE_OAK_LOG.id => Block::STRIPPED_PALE_OAK_LOG.id,
+
+        id if id == &Block::DARK_OAK_LOG.id => Block::STRIPPED_DARK_OAK_LOG.id,
+
+        id if id == &Block::MANGROVE_LOG.id => Block::STRIPPED_MANGROVE_LOG.id,
+        id if id == &Block::OAK_WOOD.id => Block::STRIPPED_OAK_WOOD.id,
+        id if id == &Block::BIRCH_WOOD.id => Block::STRIPPED_BIRCH_WOOD.id,
+        id if id == &Block::SPRUCE_WOOD.id => Block::STRIPPED_SPRUCE_WOOD.id,
+        id if id == &Block::ACACIA_WOOD.id => Block::STRIPPED_ACACIA_WOOD.id,
+        id if id == &Block::CHERRY_WOOD.id => Block::STRIPPED_CHERRY_WOOD.id,
+        id if id == &Block::JUNGLE_WOOD.id => Block::STRIPPED_JUNGLE_WOOD.id,
+        id if id == &Block::PALE_OAK_WOOD.id => Block::STRIPPED_PALE_OAK_WOOD.id,
+        id if id == &Block::DARK_OAK_WOOD.id => Block::STRIPPED_DARK_OAK_WOOD.id,
+        id if id == &Block::MANGROVE_WOOD.id => Block::STRIPPED_MANGROVE_WOOD.id,
+        _ => block.id,
+    };
path: pumpkin/src/item/items/axe.rs
user: login: Snowiiii
body: @tetram2674562 ?
created_at: 2025-04-24T12:29:54Z
author_association: MEMBER

PR comments:
user: login: kralverde
created_at: 2025-03-26T23:37:14Z
body: Thank you for making a PR! 

I noticed you are hard coding a lot of blocks, is this really how java does it? You might instead check if the block matches a tag (https://minecraft.wiki/w/Block_tag_(Java_Edition)) e.g. "#minecraft:logs" 

Also I see you are returning the default block state. Instead, you should extract the block properties from the block and apply them to the new state. You can see, for example, how it is done here: https://github.com/Pumpkin-MC/Pumpkin/blob/master/pumpkin/src/block/blocks/logs.rs
author_association: CONTRIBUTOR
user: login: tetram2674562
created_at: 2025-03-27T00:24:34Z
body: I just look back into yarn in order to see how they manage to handle the axe. I think that the way they are doing it is way more understable and way more optimised than my big MATCH. Also you are right, I should keep the block properties and give them back to the newly created block. So I'm going to do those modification.
author_association: CONTRIBUTOR
user: login: Snowiiii
created_at: 2025-03-29T20:48:17Z
body: Hey @tetram2674562, any progress ?
author_association: MEMBER
user: login: tetram2674562
created_at: 2025-03-29T22:54:46Z
body: Hello, yes I'm working on it, sorry for making no commit, I like to commit only when my code is working, as of now I've added strip on the log, I'm currently on implementing Oxidization on the copper blocks (the way mojang do it, because It's more optimized that what I did).
author_association: CONTRIBUTOR
user: login: Snowiiii
created_at: 2025-04-05T10:03:21Z
body: any news @tetram2674562  ?
author_association: MEMBER
user: login: Snowiiii
created_at: 2025-04-09T07:02:56Z
body: @tetram2674562 you need to fix CI
author_association: MEMBER
user: login: tetram2674562
created_at: 2025-04-09T10:29:47Z
body: @Snowiiii I did some changes on my code, if you can lookup, It should be working now.
author_association: CONTRIBUTOR
user: login: Snowiiii
created_at: 2025-04-11T13:47:39Z
body: could you also edit the PR description so i know what item i have to use when clicking on the block
author_association: MEMBER
user: login: Snowiiii
created_at: 2025-04-28T18:58:29Z
body: Thank you @tetram2674562 :+1: 
author_association: MEMBER