add more loot table conditions

fix https://github.com/Pumpkin-MC/Pumpkin/issues/1155
This commit is contained in:
Alexander Medvedev
2025-08-30 11:58:43 +02:00
parent 0bc7405f12
commit 91e77c33a0
5 changed files with 38 additions and 12 deletions

22
Cargo.lock generated
View File

@@ -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]]

View File

@@ -44,6 +44,8 @@ pub struct LootPoolStruct {
entries: Vec<LootPoolEntryStruct>,
rolls: LootNumberProviderTypes, // TODO
bonus_rolls: f32,
conditions: Option<Vec<LootConditionStruct>>,
functions: Option<Vec<LootFunctionStruct>>,
}
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,
}
});
}

View File

@@ -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"

View File

@@ -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)]

View File

@@ -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(&params))
{
return stacks;
}
// TODO
let rolls = pool
.rolls