diff --git a/crates/pumpkin/src/entity/player/advancement/trigger.rs b/crates/pumpkin/src/entity/player/advancement/trigger.rs index a5633be02..bbbff44e6 100644 --- a/crates/pumpkin/src/entity/player/advancement/trigger.rs +++ b/crates/pumpkin/src/entity/player/advancement/trigger.rs @@ -8,6 +8,7 @@ pub enum AdvancementTrigger { PlacedBlock { block_id: String }, ConsumeItem { item_id: String }, SleptInBed, + FishedItem { item_id: String }, EnterDimension { dimension: String }, PlayerKilled, DeflectedDamage, @@ -230,27 +231,6 @@ impl Player { } } - if !self - .has_advancement(Advancement::HUSBANDRY_FISHY_BUSINESS) - .await - { - let fishes = [ - (&Item::COD, "cod"), - (&Item::SALMON, "salmon"), - (&Item::PUFFERFISH, "pufferfish"), - (&Item::TROPICAL_FISH, "tropical_fish"), - ]; - for (item, criterion) in fishes { - if self.has_item_in_inventory(item).await { - self.trigger_advancement_criterion( - Advancement::HUSBANDRY_FISHY_BUSINESS, - criterion, - ) - .await; - } - } - } - if !self .has_advancement(Advancement::HUSBANDRY_TACTICAL_FISHING) .await @@ -538,6 +518,29 @@ impl Player { .await; } } + AdvancementTrigger::FishedItem { item_id } => { + if !self + .has_advancement(Advancement::HUSBANDRY_FISHY_BUSINESS) + .await + { + let fishes = [ + ("minecraft:cod", "cod"), + ("minecraft:salmon", "salmon"), + ("minecraft:pufferfish", "pufferfish"), + ("minecraft:tropical_fish", "tropical_fish"), + ]; + for (fish, criterion) in fishes { + if item_id == fish { + self.trigger_advancement_criterion( + Advancement::HUSBANDRY_FISHY_BUSINESS, + criterion, + ) + .await; + break; + } + } + } + } AdvancementTrigger::PlacedBlock { block_id } => { if !self .has_advancement(Advancement::HUSBANDRY_PLANT_SEED) diff --git a/crates/pumpkin/src/entity/projectile/fishing_bobber.rs b/crates/pumpkin/src/entity/projectile/fishing_bobber.rs index dae55b7bc..2d44eb91f 100644 --- a/crates/pumpkin/src/entity/projectile/fishing_bobber.rs +++ b/crates/pumpkin/src/entity/projectile/fishing_bobber.rs @@ -77,9 +77,17 @@ impl FishingBobberEntity { .await; // TODO: Use actual loot tables. For now, just give a raw cod. - let _item_stack = ItemStack::new(1, &Item::COD); + let item_stack = ItemStack::new(1, &Item::COD); // player.inventory().add_item(item_stack).await; // Need public add_item + player + .trigger_advancement( + crate::entity::player::advancement::trigger::AdvancementTrigger::FishedItem { + item_id: format!("minecraft:{}", item_stack.item.registry_key), + }, + ) + .await; + world.play_sound( Sound::EntityExperienceOrbPickup, SoundCategory::Neutral,