Implement WanderingTraderSpawnListener and WanderingTraderTrades for custom trades
This commit is contained in:
1 parent
d18ddc7b07
commit
a319d5810b
2 files changed
+66
No files matched your search
+19
@@ -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<WanderingTraderTrades> {
|
||||
@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));
|
||||
}
|
||||
}
|
||||
+47
@@ -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<Supplier<MerchantRecipe>> 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<MerchantRecipe> 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<Listener> listeners() {
|
||||
return List.of(new WanderingTraderSpawnListener());
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user