diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/wanderingTrader/WanderingTraderSpawnListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/wanderingTrader/WanderingTraderSpawnListener.java new file mode 100644 index 0000000..71702a6 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/wanderingTrader/WanderingTraderSpawnListener.java @@ -0,0 +1,19 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.wanderingTrader; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.Bukkit; +import org.bukkit.entity.WanderingTrader; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; + +class WanderingTraderSpawnListener extends ApplianceListener { + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onSpawn(CreatureSpawnEvent event) { + if(!(event.getEntity() instanceof WanderingTrader trader)) return; + + // Initialize vanilla offers only after the spawn has finished. + Bukkit.getScheduler().runTask(Main.instance(), () -> this.getAppliance().addTrades(trader)); + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/wanderingTrader/WanderingTraderTrades.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/wanderingTrader/WanderingTraderTrades.java new file mode 100644 index 0000000..ca46b0e --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/wanderingTrader/WanderingTraderTrades.java @@ -0,0 +1,47 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.wanderingTrader; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.WanderingTrader; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.MerchantRecipe; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class WanderingTraderTrades extends Appliance { + private static final int HEART_OF_THE_SEA_PRICE = 32; + private static final int HEART_OF_THE_SEA_MAX_USES = 1; + + private final NamespacedKey appliedKey = new NamespacedKey(Main.instance(), "wandering_trader_trades_applied"); + private final List> additionalTrades = List.of(WanderingTraderTrades::heartOfTheSeaTrade); + + private static MerchantRecipe heartOfTheSeaTrade() { + MerchantRecipe recipe = new MerchantRecipe( + new ItemStack(Material.HEART_OF_THE_SEA), 0, HEART_OF_THE_SEA_MAX_USES, false, 0, 0f + ); + recipe.addIngredient(new ItemStack(Material.EMERALD, HEART_OF_THE_SEA_PRICE)); + return recipe; + } + + void addTrades(WanderingTrader trader) { + if(!trader.isValid() || trader.isDead()) return; + if(trader.getPersistentDataContainer().has(this.appliedKey, PersistentDataType.BYTE)) return; + + List recipes = new ArrayList<>(trader.getRecipes()); + this.additionalTrades.forEach(factory -> recipes.add(factory.get())); + trader.setRecipes(recipes); + trader.getPersistentDataContainer().set(this.appliedKey, PersistentDataType.BYTE, (byte) 1); + } + + @Override + protected @NotNull List listeners() { + return List.of(new WanderingTraderSpawnListener()); + } +}