From 91e77c33a048187d65f5350a77b2cffe36702823 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Sat, 30 Aug 2025 11:58:43 +0200 Subject: [PATCH] add more loot table conditions fix https://github.com/Pumpkin-MC/Pumpkin/issues/1155 --- Cargo.lock | 22 +++++++++++----------- pumpkin-data/build/loot.rs | 18 ++++++++++++++++++ pumpkin-protocol/Cargo.toml | 2 +- pumpkin-util/src/loot_table.rs | 2 ++ pumpkin/src/world/loot.rs | 6 ++++++ 5 files changed, 38 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 953db2b2f..08517ee4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,9 +125,9 @@ checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "async-compression" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6448dfb3960f0b038e88c781ead1e7eb7929dfc3a71a1336ec9086c00f6d1e75" +checksum = "5bee399cc3a623ec5a2db2c5b90ee0190a2260241fbe0c023ac8f7bab426aaf8" dependencies = [ "compression-codecs", "compression-core", @@ -421,14 +421,14 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "compression-codecs" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46cc6539bf1c592cff488b9f253b30bc0ec50d15407c2cf45e27bd8f308d5905" +checksum = "c7eea68f0e02c2b0aa8856e9a9478444206d4b6828728e7b0697c0f8cca265cb" dependencies = [ "compression-core", "flate2", @@ -439,9 +439,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2957e823c15bde7ecf1e8b64e537aa03a6be5fda0e2334e99887669e75b12e01" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" [[package]] name = "console-api" @@ -916,7 +916,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2475,7 +2475,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2865,7 +2865,7 @@ dependencies = [ "fastrand", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3461,7 +3461,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/pumpkin-data/build/loot.rs b/pumpkin-data/build/loot.rs index 8fa292009..f35c05b9c 100644 --- a/pumpkin-data/build/loot.rs +++ b/pumpkin-data/build/loot.rs @@ -44,6 +44,8 @@ pub struct LootPoolStruct { entries: Vec, rolls: LootNumberProviderTypes, // TODO bonus_rolls: f32, + conditions: Option>, + functions: Option>, } impl ToTokens for LootPoolStruct { @@ -55,12 +57,28 @@ impl ToTokens for LootPoolStruct { .collect(); let rolls = &self.rolls; let bonus_rolls = &self.bonus_rolls; + let conditions_tokens = match &self.conditions { + Some(conds) => { + let cond_tokens: Vec<_> = conds.iter().map(|c| c.to_token_stream()).collect(); + quote! { Some(&[#(#cond_tokens),*]) } + } + None => quote! { None }, + }; + let functions_tokens = match &self.functions { + Some(fns) => { + let cond_tokens: Vec<_> = fns.iter().map(|c| c.to_token_stream()).collect(); + quote! { Some(&[#(#cond_tokens),*]) } + } + None => quote! { None }, + }; tokens.extend(quote! { LootPool { entries: &[#(#entries_tokens),*], rolls: #rolls, bonus_rolls: #bonus_rolls, + conditions: #conditions_tokens, + functions: #functions_tokens, } }); } diff --git a/pumpkin-protocol/Cargo.toml b/pumpkin-protocol/Cargo.toml index e86ab4bf9..e837384c0 100644 --- a/pumpkin-protocol/Cargo.toml +++ b/pumpkin-protocol/Cargo.toml @@ -27,7 +27,7 @@ aes = "0.8" cfb8 = "0.8" # compression -async-compression = { version = "0.4.28", features = ["tokio", "zlib"] } +async-compression = { version = "0.4.29", features = ["tokio", "zlib"] } take_mut = "0.2.2" bitflags = "2.9.3" diff --git a/pumpkin-util/src/loot_table.rs b/pumpkin-util/src/loot_table.rs index f7e1104ba..54a56c877 100644 --- a/pumpkin-util/src/loot_table.rs +++ b/pumpkin-util/src/loot_table.rs @@ -16,6 +16,8 @@ pub struct LootPool { pub entries: &'static [LootPoolEntry], pub rolls: LootNumberProviderTypes, pub bonus_rolls: f32, + pub conditions: Option<&'static [LootCondition]>, + pub functions: Option<&'static [LootFunction]>, } #[derive(Clone, PartialEq, Debug)] diff --git a/pumpkin/src/world/loot.rs b/pumpkin/src/world/loot.rs index 797109300..95b2825cd 100644 --- a/pumpkin/src/world/loot.rs +++ b/pumpkin/src/world/loot.rs @@ -26,6 +26,12 @@ impl LootTableExt for LootTable { if let Some(pools) = self.pools { for pool in pools { + if let Some(conditions) = pool.conditions + && !conditions.iter().all(|cond| cond.is_fulfilled(¶ms)) + { + return stacks; + } + // TODO let rolls = pool .rolls