From 83af488bf1695afedb901ac6b3fa29328b339145 Mon Sep 17 00:00:00 2001 From: JustinasLa Date: Wed, 30 Sep 2026 19:13:14 +0200 Subject: [PATCH] feat: credit drinking BreweryX brews Add a brew_drink activity fed by BrewDrinkEvent. Brews that match no recipe (quality 0) earn nothing. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../activitytf/listeners/BreweryListener.java | 14 +++++++++++++ src/main/resources/config.yml | 11 ++++++++++ .../listeners/BreweryListenerTest.java | 20 +++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/src/main/java/net/tfminecraft/activitytf/listeners/BreweryListener.java b/src/main/java/net/tfminecraft/activitytf/listeners/BreweryListener.java index 18330be..c291b45 100644 --- a/src/main/java/net/tfminecraft/activitytf/listeners/BreweryListener.java +++ b/src/main/java/net/tfminecraft/activitytf/listeners/BreweryListener.java @@ -4,6 +4,7 @@ import com.dre.brewery.Barrel; import com.dre.brewery.Brew; import com.dre.brewery.api.events.IngedientAddEvent; +import com.dre.brewery.api.events.brew.BrewDrinkEvent; import com.dre.brewery.api.events.brew.BrewModifyEvent; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -112,6 +113,19 @@ public void onContainerTake(InventoryClickEvent event) { } } + // Brews that match no recipe (failed or unfinished ones) have quality 0. + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onDrink(BrewDrinkEvent event) { + recordDrink(event.getPlayer(), event.getQuality()); + } + + void recordDrink(Player player, int quality) { + if (player == null || quality < 1) { + return; + } + manager.recordAction(player.getUniqueId(), "brew_drink", 1); + } + private void creditOnce(Player player, Inventory inventory, int slot, ItemStack item, NamespacedKey key, String activityId) { ItemMeta meta = item.getItemMeta(); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 7b63450..b871208 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -363,6 +363,17 @@ activities: every: 3 points: 1 daily-cap: 1 + # BreweryX: brews drunk that match a recipe (quality above zero) + brew_drink: + display: "#e6ca40&lDrink Brews" + description: + - "&7Drink &a%every% &7finished brews." + - "&7Earn &a%points% &7activity points per completion." + - "&7" + material: POTION + every: 3 + points: 1 + daily-cap: 1 # 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 18b18b7..aeb7d5e 100644 --- a/src/test/java/net/tfminecraft/activitytf/listeners/BreweryListenerTest.java +++ b/src/test/java/net/tfminecraft/activitytf/listeners/BreweryListenerTest.java @@ -114,6 +114,26 @@ void onlyCookedBottlesAreCredited() { assertEquals(2, manager.tasks(uuid).count("brew_bottle")); } + @Test + void aDrinkWithoutAPlayerIsIgnored() { + BreweryListener listener = new BreweryListener(null); + assertDoesNotThrow(() -> listener.recordDrink(null, 10)); + } + + @Test + void onlyDrinksOfARealBrewAreCredited() { + ActivityManager manager = managerWith("brew_drink"); + UUID uuid = revealed(manager); + BreweryListener listener = new BreweryListener(manager); + + listener.recordDrink(stubPlayer(uuid), 0); + assertEquals(0, manager.tasks(uuid).count("brew_drink")); + + listener.recordDrink(stubPlayer(uuid), 1); + listener.recordDrink(stubPlayer(uuid), 10); + assertEquals(2, manager.tasks(uuid).count("brew_drink")); + } + private static PersistentDataContainer stubData() { Map values = new HashMap<>(); InvocationHandler handler = (proxy, method, args) -> switch (method.getName()) {