From c3c0ef91c1efc3cfd45d3d4a40ed75e94ef86612 Mon Sep 17 00:00:00 2001 From: Fortifier42 Date: Sun, 7 Feb 2016 16:38:50 +1100 Subject: [PATCH] Convert PlayerEditsBook to ScriptEvent. --- .../java/net/aufdemrand/denizen/Denizen.java | 1 + .../player/PlayerEditsBookScriptEvent.java | 143 ++++++++++++++++++ .../core/BukkitWorldScriptHelper.java | 66 -------- 3 files changed, 144 insertions(+), 66 deletions(-) create mode 100644 src/main/java/net/aufdemrand/denizen/events/player/PlayerEditsBookScriptEvent.java diff --git a/src/main/java/net/aufdemrand/denizen/Denizen.java b/src/main/java/net/aufdemrand/denizen/Denizen.java index bb8e2430f7..e6442d5de5 100644 --- a/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -651,6 +651,7 @@ public void onEnable() { ScriptEvent.registerScriptEvent(new PlayerDamagesBlockScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerDragsInInvScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerDropsItemScriptEvent()); + ScriptEvent.registerScriptEvent(new PlayerEditsBookScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerEmptiesBucketScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerEntersBedScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerFillsBucketScriptEvent()); diff --git a/src/main/java/net/aufdemrand/denizen/events/player/PlayerEditsBookScriptEvent.java b/src/main/java/net/aufdemrand/denizen/events/player/PlayerEditsBookScriptEvent.java new file mode 100644 index 0000000000..1866168065 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/events/player/PlayerEditsBookScriptEvent.java @@ -0,0 +1,143 @@ +package net.aufdemrand.denizen.events.player; + +import net.aufdemrand.denizen.BukkitScriptEntryData; +import net.aufdemrand.denizen.events.BukkitScriptEvent; +import net.aufdemrand.denizen.objects.dItem; +import net.aufdemrand.denizen.objects.dPlayer; +import net.aufdemrand.denizen.scripts.containers.core.BookScriptContainer; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizen.utilities.debugging.dB; +import net.aufdemrand.denizencore.objects.Element; +import net.aufdemrand.denizencore.objects.dObject; +import net.aufdemrand.denizencore.objects.dScript; +import net.aufdemrand.denizencore.scripts.ScriptEntryData; +import net.aufdemrand.denizencore.scripts.containers.ScriptContainer; +import net.aufdemrand.denizencore.utilities.CoreUtilities; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerEditBookEvent; +import org.bukkit.inventory.meta.BookMeta; + +// <--[event] +// @Events +// player edits book +// player signs book +// +// @Regex ^on player (edits|signs) book$ +// +// @Triggers when a player edits or signs a book. +// @Context +// returns the name of the book, if any. +// returns the number of pages in the book. +// returns the book item being edited. +// returns whether the book is about to be signed. +// +// @Determine +// "NOT_SIGNING" to prevent the book from being signed. +// dScript to set the book information to set it to instead. +// +// --> + +public class PlayerEditsBookScriptEvent extends BukkitScriptEvent implements Listener { + + PlayerEditsBookScriptEvent instance; + PlayerEditBookEvent event; + Element signing; + Element title; + Element pages; + dItem book; + dPlayer player; + BookMeta bookMeta; + + @Override + public boolean couldMatch(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + return lower.startsWith("player edits book") || lower.startsWith("player signs book"); + } + + @Override + public boolean matches(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + String action = CoreUtilities.getXthArg(1, lower); + if (action.equals("edits")) { + return true; + } + if (action.equals("signs") && signing.asBoolean()) { + return true; + } + return false; + } + + @Override + public String getName() { + return "PlayerEditsBook"; + } + + @Override + public void init() { + Bukkit.getServer().getPluginManager().registerEvents(this, DenizenAPI.getCurrentInstance()); + } + + @Override + public void destroy() { + PlayerEditBookEvent.getHandlerList().unregister(this); + } + + @Override + public boolean applyDetermination(ScriptContainer container, String determination) { + if (determination.toUpperCase().equals("NOT_SIGNING")) { + signing = Element.FALSE; + } + else if (dScript.matches(determination)) { + dScript script = dScript.valueOf(determination); + if (script.getContainer() instanceof BookScriptContainer) { + dItem dBook = ((BookScriptContainer) script.getContainer()).getBookFrom(player, null); + bookMeta = (BookMeta) dBook.getItemStack().getItemMeta(); + if (dBook.getMaterial().getMaterial() == Material.BOOK_AND_QUILL) { + signing = Element.FALSE; + } + } + else { + dB.echoError("Script '" + determination + "' is valid, but not of type 'book'!"); + } + } + return super.applyDetermination(container, determination); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(player, null); + } + + @Override + public dObject getContext(String name) { + if (name.equals("signing")) { + return signing; + } + if (name.equals("title")) { + return title; + } + else if (name.equals("book")) { + return book; + } + return super.getContext(name); + } + + @EventHandler + public void onPlayerEditsBook(PlayerEditBookEvent event){ + player = dPlayer.mirrorBukkitPlayer(event.getPlayer()); + signing = new Element(event.isSigning()); + bookMeta = event.getNewBookMeta(); + pages = new Element(bookMeta.getPageCount()); + title = event.isSigning() ? new Element(bookMeta.getTitle()) : null; + book = new dItem(event.getPlayer().getInventory().getItem(event.getSlot())); + cancelled = event.isCancelled(); + this.event = event; + fire(); + event.setCancelled(cancelled); + event.setNewBookMeta(bookMeta); + event.setSigning(signing.asBoolean()); + } +} diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java index 148ac5fed2..d938e734aa 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/BukkitWorldScriptHelper.java @@ -379,72 +379,6 @@ public void run() { }, 1); } - // <--[event] - // @Events - // player edits book - // player signs book - // - // @Regex ^on player (edits|signs) book$ - // - // @Triggers when a player edits or signs a book. - // @Context - // returns the name of the book, if any. - // returns the number of pages in the book. - // returns the book item being edited. - // returns whether the book is about to be signed. - // - // @Determine - // "CANCELLED" to prevent the book from being edited. - // "NOT_SIGNING" to prevent the book from being signed. - // dScript to set the book information to set it to instead. - // - // --> - @EventHandler - public void playerEditBook(PlayerEditBookEvent event) { - - if (dEntity.isNPC(event.getPlayer())) { - return; - } - - Map context = new HashMap(); - if (event.isSigning()) { - context.put("title", new Element(event.getNewBookMeta().getTitle())); - } - context.put("pages", new Element(event.getNewBookMeta().getPageCount())); - context.put("book", new dItem(event.getPlayer().getInventory().getItem(event.getSlot()))); - context.put("signing", new Element(event.isSigning())); - - ArrayList events = new ArrayList(); - - events.add("player edits book"); - if (event.isSigning()) { - events.add("player signs book"); - } - - String determination = doEvents(events, - null, dEntity.getPlayerFrom(event.getPlayer()), context); - - if (determination.toUpperCase().startsWith("CANCELLED")) { - event.setCancelled(true); - } - else if (determination.toUpperCase().startsWith("NOT_SIGNING")) { - event.setSigning(false); - } - else if (dScript.matches(determination)) { - dScript script = dScript.valueOf(determination); - if (script.getContainer() instanceof BookScriptContainer) { - dItem book = ((BookScriptContainer) script.getContainer()).getBookFrom(dPlayer.mirrorBukkitPlayer(event.getPlayer()), null); - event.setNewBookMeta((BookMeta) book.getItemStack().getItemMeta()); - if (book.getItemStack().getType() == Material.BOOK_AND_QUILL) { - event.setSigning(false); - } - } - else { - dB.echoError("Script '" + determination + "' is valid, but not of type 'book'!"); - } - } - } - // <--[event] // @Events // player clicks block