diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java index dad8a8e72d..e824e7cc42 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/PaperModule.java @@ -39,6 +39,7 @@ public static void init() { ScriptEvent.registerScriptEvent(new PlayerJumpsScriptEventPaperImpl()); ScriptEvent.registerScriptEvent(new PlayerSpectatesEntityScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerStopsSpectatingScriptEvent()); + ScriptEvent.registerScriptEvent(new PlayerTradesWithMerchantScriptEvent()); ScriptEvent.registerScriptEvent(new PreEntitySpawnScriptEvent()); ScriptEvent.registerScriptEvent(new ProjectileCollideScriptEvent()); ScriptEvent.registerScriptEvent(new ServerListPingScriptEventPaperImpl()); diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerTradesWithMerchantScriptEvent.java b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerTradesWithMerchantScriptEvent.java new file mode 100644 index 0000000000..f1d48f1c77 --- /dev/null +++ b/paper/src/main/java/com/denizenscript/denizen/paper/events/PlayerTradesWithMerchantScriptEvent.java @@ -0,0 +1,94 @@ +package com.denizenscript.denizen.paper.events; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.EntityTag; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.objects.TradeTag; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import io.papermc.paper.event.player.PlayerTradeEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PlayerTradesWithMerchantScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // player trades with merchant + // + // @Regex ^on player trades with merchant$ + // + // @Switch result: to only process the event if the player received a specific result item. + // + // @Location true + // + // @Plugin Paper + // + // @Group Paper + // + // @Cancellable true + // + // @Triggers when a player trades with a merchant (villager). + // + // @Context + // returns the villager that was traded with. + // returns a TradeTag of the trade that was done. + // + // @Player Always. + // + // --> + + public PlayerTradesWithMerchantScriptEvent() { + instance = this; + } + + public static PlayerTradesWithMerchantScriptEvent instance; + public PlayerTradeEvent event; + + @Override + public boolean couldMatch(ScriptPath path) { + if (!path.eventLower.startsWith("player trades with merchant")) { + return false; + } + return true; + } + + @Override + public boolean matches(ScriptPath path) { + if (!runInCheck(path, event.getPlayer().getLocation())) { + return false; + } + if (path.switches.containsKey("result") && !tryItem(new ItemTag(event.getTrade().getResult()), path.switches.get("result"))) { + return false; + } + return super.matches(path); + } + + @Override + public String getName() { + return "PlayerTradesWithMerchant"; + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(event.getPlayer()); + } + + @Override + public ObjectTag getContext(String name) { + if (name.equals("merchant")) { + return new EntityTag(event.getVillager()); + } + else if (name.equals("trade")) { + return new TradeTag(event.getTrade()); + } + return super.getContext(name); + } + + @EventHandler + public void playerTradeEvent(PlayerTradeEvent event) { + this.event = event; + fire(event); + } +}