diff --git a/src/main/java/net/tfminecraft/activitytf/listeners/BreweryListener.java b/src/main/java/net/tfminecraft/activitytf/listeners/BreweryListener.java index c5df615..704340e 100644 --- a/src/main/java/net/tfminecraft/activitytf/listeners/BreweryListener.java +++ b/src/main/java/net/tfminecraft/activitytf/listeners/BreweryListener.java @@ -1,6 +1,10 @@ package net.tfminecraft.activitytf.listeners; +import com.dre.brewery.BIngredients; +import com.dre.brewery.Brew; import com.dre.brewery.api.events.IngedientAddEvent; +import com.dre.brewery.api.events.brew.BrewModifyEvent; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -22,4 +26,25 @@ public void onIngredientAdd(IngedientAddEvent event) { } manager.recordAction(event.getPlayer().getUniqueId(), "brew_ingredient", 1); } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBrewModify(BrewModifyEvent event) { + if (event.getType() == BrewModifyEvent.Type.FILL) { + recordBottle(event.getPlayer(), cookedMinutes(event.getBrew())); + } + } + + // FILL fires once per bottle scooped from a cauldron. A bottle taken before the + // ingredients have cooked for a minute is BreweryX's "thick brew" and earns nothing. + void recordBottle(Player player, int cookedMinutes) { + if (player == null || cookedMinutes < 1) { + return; + } + manager.recordAction(player.getUniqueId(), "brew_bottle", 1); + } + + private static int cookedMinutes(Brew brew) { + BIngredients ingredients = brew == null ? null : brew.getIngredients(); + return ingredients == null ? 0 : ingredients.getCookedTime(); + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 0e74481..10569cb 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -325,6 +325,18 @@ activities: every: 10 points: 1 daily-cap: 1 + # BreweryX: bottles filled from a brewing cauldron after at least a minute of cooking + brew_bottle: + display: "#e6ca40&lBottle Brews" + description: + - "&7Fill &a%every% &7bottles from a brewing cauldron" + - "&7after at least a minute of cooking." + - "&7Earn &a%points% &7activity points per completion." + - "&7" + material: GLASS_BOTTLE + every: 3 + points: 1 + daily-cap: 2 # RPCharacters: profession upgrades purchased profession_upgrade: display: "#e6ca40&lProfession Upgrade" diff --git a/src/test/java/net/tfminecraft/activitytf/listeners/BreweryListenerTest.java b/src/test/java/net/tfminecraft/activitytf/listeners/BreweryListenerTest.java index 0bc62e6..c7c213b 100644 --- a/src/test/java/net/tfminecraft/activitytf/listeners/BreweryListenerTest.java +++ b/src/test/java/net/tfminecraft/activitytf/listeners/BreweryListenerTest.java @@ -87,4 +87,24 @@ void eachIngredientAddedCreditsOne() { assertEquals(2, manager.tasks(uuid).count("brew_ingredient")); } + + @Test + void aBottleWithoutAPlayerIsIgnored() { + BreweryListener listener = new BreweryListener(null); + assertDoesNotThrow(() -> listener.recordBottle(null, 5)); + } + + @Test + void onlyCookedBottlesAreCredited() { + ActivityManager manager = managerWith("brew_bottle"); + UUID uuid = revealed(manager); + BreweryListener listener = new BreweryListener(manager); + + listener.recordBottle(stubPlayer(uuid), 0); + assertEquals(0, manager.tasks(uuid).count("brew_bottle")); + + listener.recordBottle(stubPlayer(uuid), 1); + listener.recordBottle(stubPlayer(uuid), 12); + assertEquals(2, manager.tasks(uuid).count("brew_bottle")); + } }