Pumpkin/pumpkin/src/block/block_manager.rs
2025-01-12 16:45:22 +01:00

110 lines
2.9 KiB
Rust

use crate::block::pumpkin_block::{BlockMetadata, PumpkinBlock};
use crate::entity::player::Player;
use crate::server::Server;
use pumpkin_inventory::OpenContainer;
use pumpkin_util::math::position::BlockPos;
use pumpkin_world::block::block_registry::Block;
use pumpkin_world::item::item_registry::Item;
use std::collections::HashMap;
use std::sync::Arc;
pub enum BlockActionResult {
/// Allow other actions to be executed
Continue,
/// Block other actions
Consume,
}
#[derive(Default)]
pub struct BlockManager {
blocks: HashMap<String, Arc<dyn PumpkinBlock>>,
}
impl BlockManager {
pub fn register<T: PumpkinBlock + BlockMetadata + 'static>(&mut self, block: T) {
self.blocks.insert(block.name(), Arc::new(block));
}
pub async fn on_use(
&self,
block: &Block,
player: &Player,
location: BlockPos,
server: &Server,
) {
let pumpkin_block = self.get_pumpkin_block(block);
if let Some(pumpkin_block) = pumpkin_block {
pumpkin_block.on_use(block, player, location, server).await;
}
}
pub async fn on_use_with_item(
&self,
block: &Block,
player: &Player,
location: BlockPos,
item: &Item,
server: &Server,
) -> BlockActionResult {
let pumpkin_block = self.get_pumpkin_block(block);
if let Some(pumpkin_block) = pumpkin_block {
return pumpkin_block
.on_use_with_item(block, player, location, item, server)
.await;
}
BlockActionResult::Continue
}
pub async fn on_placed(
&self,
block: &Block,
player: &Player,
location: BlockPos,
server: &Server,
) {
let pumpkin_block = self.get_pumpkin_block(block);
if let Some(pumpkin_block) = pumpkin_block {
pumpkin_block
.on_placed(block, player, location, server)
.await;
}
}
pub async fn on_broken(
&self,
block: &Block,
player: &Player,
location: BlockPos,
server: &Server,
) {
let pumpkin_block = self.get_pumpkin_block(block);
if let Some(pumpkin_block) = pumpkin_block {
pumpkin_block
.on_broken(block, player, location, server)
.await;
}
}
pub async fn on_close(
&self,
block: &Block,
player: &Player,
location: BlockPos,
server: &Server,
container: &mut OpenContainer,
) {
let pumpkin_block = self.get_pumpkin_block(block);
if let Some(pumpkin_block) = pumpkin_block {
pumpkin_block
.on_close(block, player, location, server, container)
.await;
}
}
#[must_use]
pub fn get_pumpkin_block(&self, block: &Block) -> Option<&Arc<dyn PumpkinBlock>> {
self.blocks
.get(format!("minecraft:{}", block.name).as_str())
}
}