diff --git a/pumpkin-util/src/loot_table.rs b/pumpkin-util/src/loot_table.rs index 461d99033..f7e1104ba 100644 --- a/pumpkin-util/src/loot_table.rs +++ b/pumpkin-util/src/loot_table.rs @@ -171,8 +171,7 @@ impl UniformLootNumberProvider { } pub fn get(&self, random: &mut impl RandomImpl) -> f32 { - // TODO - random.next_f32() + random.next_f32() * (self.max - self.min) + self.min } pub fn get_max(&self) -> f32 { diff --git a/pumpkin/src/block/mod.rs b/pumpkin/src/block/mod.rs index 15871cbcb..b10fa80fd 100644 --- a/pumpkin/src/block/mod.rs +++ b/pumpkin/src/block/mod.rs @@ -66,7 +66,6 @@ use blocks::{ }; use fluid::lava::FlowingLava; use fluid::water::FlowingWater; -use loot::LootTableExt; use pumpkin_data::block_properties::Integer0To15; use pumpkin_data::{Block, BlockState}; @@ -101,16 +100,15 @@ use crate::block::blocks::lectern::LecternBlock; use crate::block::blocks::shulker_box::ShulkerBoxBlock; use crate::block::blocks::skull_block::SkullBlock; use crate::block::blocks::smoker::SmokerBlock; -use crate::block::loot::LootContextParameters; use crate::block::registry::BlockRegistry; use crate::world::World; +use crate::world::loot::{LootContextParameters, LootTableExt}; use crate::{block::blocks::crafting_table::CraftingTableBlock, entity::player::Player}; use crate::{block::blocks::jukebox::JukeboxBlock, entity::experience_orb::ExperienceOrbEntity}; use std::sync::Arc; pub mod blocks; mod fluid; -pub mod loot; pub mod pumpkin_block; pub mod pumpkin_fluid; pub mod registry; diff --git a/pumpkin/src/entity/living.rs b/pumpkin/src/entity/living.rs index ca58a3b79..6f0665da1 100644 --- a/pumpkin/src/entity/living.rs +++ b/pumpkin/src/entity/living.rs @@ -6,8 +6,8 @@ use std::{collections::HashMap, sync::atomic::AtomicI32}; use super::EntityBase; use super::{Entity, NBTStorage, effect::Effect}; -use crate::block::loot::{LootContextParameters, LootTableExt}; use crate::server::Server; +use crate::world::loot::{LootContextParameters, LootTableExt}; use async_trait::async_trait; use crossbeam::atomic::AtomicCell; use pumpkin_config::advanced_config; @@ -255,7 +255,12 @@ impl LivingEntity { EntityStatus::PlayDeathSoundOrAddProjectileHitParticles, ) .await; - self.drop_loot().await; + let params = LootContextParameters { + killed_by_player: cause.map(|c| c.get_entity().entity_type == EntityType::PLAYER), + ..Default::default() + }; + + self.drop_loot(params).await; self.entity.pose.store(EntityPose::Dying); let level_info = world.level_info.read().await; @@ -310,13 +315,10 @@ impl LivingEntity { } } - async fn drop_loot(&self) { + async fn drop_loot(&self, params: LootContextParameters) { if let Some(loot_table) = &self.get_entity().entity_type.loot_table { let world = self.entity.world.read().await; let pos = self.entity.block_pos.load(); - let params = LootContextParameters { - ..Default::default() - }; for stack in loot_table.get_loot(params) { world.drop_stack(&pos, stack).await; } diff --git a/pumpkin/src/world/explosion.rs b/pumpkin/src/world/explosion.rs index e4d3c31d3..58cc58d9f 100644 --- a/pumpkin/src/world/explosion.rs +++ b/pumpkin/src/world/explosion.rs @@ -5,8 +5,9 @@ use pumpkin_data::{Block, BlockState}; use pumpkin_util::math::{position::BlockPos, vector3::Vector3}; use crate::{ - block::{drop_loot, loot::LootContextParameters, pumpkin_block::ExplodeArgs}, + block::{drop_loot, pumpkin_block::ExplodeArgs}, server::Server, + world::loot::LootContextParameters, }; use super::{BlockFlags, World}; @@ -88,6 +89,7 @@ impl Explosion { let params = LootContextParameters { block_state: Some(state), explosion_radius: Some(self.power), + ..Default::default() }; drop_loot(world, block, &pos, false, params).await; } diff --git a/pumpkin/src/block/loot.rs b/pumpkin/src/world/loot.rs similarity index 98% rename from pumpkin/src/block/loot.rs rename to pumpkin/src/world/loot.rs index 45e317b5d..2abf184cd 100644 --- a/pumpkin/src/block/loot.rs +++ b/pumpkin/src/world/loot.rs @@ -13,6 +13,7 @@ use rand::Rng; pub struct LootContextParameters { pub explosion_radius: Option, pub block_state: Option<&'static BlockState>, + pub killed_by_player: Option, } pub trait LootTableExt { @@ -164,6 +165,7 @@ impl LootConditionExt for LootCondition { } true } + Self::KilledByPlayer => params.killed_by_player.unwrap_or(false), Self::BlockStateProperty { block: _, properties, diff --git a/pumpkin/src/world/mod.rs b/pumpkin/src/world/mod.rs index 243c3d786..80b99b8d1 100644 --- a/pumpkin/src/world/mod.rs +++ b/pumpkin/src/world/mod.rs @@ -6,9 +6,11 @@ use std::{ pub mod chunker; pub mod explosion; +pub mod loot; pub mod portal; pub mod time; +use crate::world::loot::LootContextParameters; use crate::{ PLUGIN_MANAGER, block::{ @@ -27,10 +29,7 @@ use crate::{ }, server::{CURRENT_BEDROCK_MC_VERSION, Server}, }; -use crate::{ - block::{BlockEvent, loot::LootContextParameters}, - entity::item::ItemEntity, -}; +use crate::{block::BlockEvent, entity::item::ItemEntity}; use async_trait::async_trait; use border::Worldborder; use bytes::BufMut;