From 98c3727a2c25a7c136cf80f16f7f5b875e9b7266 Mon Sep 17 00:00:00 2001 From: Talamar1 Date: Sat, 13 Jun 2015 20:29:26 -0400 Subject: [PATCH] Rewrote "on player changes sign" event in new ScriptEvent format. Removed from BukkitWorldScriptHelper. --- .../java/net/aufdemrand/denizen/Denizen.java | 1 + .../PlayerChangesSignScriptEvent.java | 160 ++++++++++++++++++ .../core/BukkitWorldScriptHelper.java | 89 ---------- 3 files changed, 161 insertions(+), 89 deletions(-) create mode 100644 src/main/java/net/aufdemrand/denizen/events/scriptevents/PlayerChangesSignScriptEvent.java diff --git a/src/main/java/net/aufdemrand/denizen/Denizen.java b/src/main/java/net/aufdemrand/denizen/Denizen.java index 37ed5980fc..81a214f4ac 100644 --- a/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -612,6 +612,7 @@ public void onEnable() { ScriptEvent.registerScriptEvent(new PistonExtendsScriptEvent()); ScriptEvent.registerScriptEvent(new PistonRetractsScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerBreaksBlockScriptEvent()); + ScriptEvent.registerScriptEvent(new PlayerChangesSignScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerDamagesBlockScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerJumpScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerPlacesBlockScriptEvent()); diff --git a/src/main/java/net/aufdemrand/denizen/events/scriptevents/PlayerChangesSignScriptEvent.java b/src/main/java/net/aufdemrand/denizen/events/scriptevents/PlayerChangesSignScriptEvent.java new file mode 100644 index 0000000000..50a722ec65 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/events/scriptevents/PlayerChangesSignScriptEvent.java @@ -0,0 +1,160 @@ +package net.aufdemrand.denizen.events.scriptevents; + +import net.aufdemrand.denizen.objects.dCuboid; +import net.aufdemrand.denizen.objects.dEllipsoid; +import net.aufdemrand.denizen.objects.dLocation; +import net.aufdemrand.denizen.objects.dMaterial; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizen.utilities.debugging.dB; +import net.aufdemrand.denizencore.events.ScriptEvent; +import net.aufdemrand.denizencore.objects.dList; +import net.aufdemrand.denizencore.objects.dObject; +import net.aufdemrand.denizencore.scripts.containers.ScriptContainer; +import net.aufdemrand.denizencore.tags.core.EscapeTags; +import net.aufdemrand.denizencore.utilities.CoreUtilities; + +import org.bukkit.Bukkit; +import org.bukkit.block.Sign; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.SignChangeEvent; + +import java.util.Arrays; +import java.util.HashMap; + +public class PlayerChangesSignScriptEvent extends ScriptEvent implements Listener { + + // <--[event] + // @Events + // player changes sign + // player changes sign in + // player changes + // player changes in + // + // @Cancellable true + // + // @Triggers when a player changes a sign. + // + // @Context + // returns the dLocation of the sign. + // returns the new sign text as a dList. + // returns the old sign text as a dList. + // returns the dMaterial of the sign. + // returns a dList of notable cuboids surrounding the sign. + // + // @Determine + // dList to change the lines (Uses escaping, see <@link language Property Escaping>) + // + // --> + + public PlayerChangesSignScriptEvent() { + instance = this; + } + public static PlayerChangesSignScriptEvent instance; + public dLocation location; + public dList new_sign; + public dList old_sign; + public dMaterial material; + public dList cuboids; + private dList new_text; + public SignChangeEvent event; + + @Override + public boolean couldMatch(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + String sign = CoreUtilities.getXthArg(2, lower); + return lower.startsWith("player changes") + && (sign.equals("sign") || dMaterial.matches(sign)); + } + + @Override + public boolean matches(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + + String mat = CoreUtilities.getXthArg(2, lower); + if (!mat.equals("sign") + && (!mat.equals(material.identifyNoIdentifier()) && !(event.getBlock().getState() instanceof Sign))) { + return false; + } + + if (CoreUtilities.xthArgEquals(3, lower, "in")) { + String it = CoreUtilities.getXthArg(4, lower); + if (dCuboid.matches(it)) { + dCuboid cuboid = dCuboid.valueOf(it); + if (!cuboid.isInsideCuboid(location)) { + return false; + } + } + else if (dEllipsoid.matches(it)) { + dEllipsoid ellipsoid = dEllipsoid.valueOf(it); + if (!ellipsoid.contains(location)) { + return false; + } + } + else { + dB.echoError("Invalid event 'IN ...' check [" + getName() + "]: '" + s + "' for " + scriptContainer.getName()); + return false; + } + } + + return true; + } + + @Override + public String getName() { + return "PlayerChangesSign"; + } + + @Override + public void init() { + Bukkit.getServer().getPluginManager().registerEvents(this, DenizenAPI.getCurrentInstance()); + } + + @Override + public void destroy() { + SignChangeEvent.getHandlerList().unregister(this); + } + + @Override + public boolean applyDetermination(ScriptContainer container, String determination) { + if (determination.length() > 0 && !determination.equalsIgnoreCase("none")) { + new_text = dList.valueOf(determination); + return true; + } + return super.applyDetermination(container, determination); + } + + @Override + public HashMap getContext() { + HashMap context = super.getContext(); + context.put("location", location); + context.put("material", material); + context.put("new_sign", new_sign); + context.put("old_sign", old_sign); + context.put("cuboids", cuboids); + return context; + } + + @EventHandler + public void onPlayerChangesSign(SignChangeEvent event) { + Sign sign = (Sign) event.getBlock().getState(); + material = dMaterial.getMaterialFrom(event.getBlock().getType(), event.getBlock().getData()); + location = new dLocation(event.getBlock().getLocation()); + cuboids = new dList(); + for (dCuboid cuboid: dCuboid.getNotableCuboidsContaining(location)) { + cuboids.add(cuboid.identifySimple()); + } + old_sign = new dList(Arrays.asList(sign.getLines())); + new_sign = new dList(Arrays.asList(event.getLines())); + cancelled = event.isCancelled(); + this.event = event; + fire(); + event.setCancelled(cancelled); + if (new_text != null) { + for (int i = 0; i < 4 && i < new_text.size(); i++) { + event.setLine(i, EscapeTags.unEscape(new_text.get(i))); + } + } + } + +} 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 5977a116d3..656d676316 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 @@ -68,95 +68,6 @@ public static String doEvents(List events, dNPC npc, dPlayer player, Map // BLOCK EVENTS ///////////////// - // <--[event] - // @Events - // player changes sign - // player changes sign in - // player changes - // player changes in - // - // @Triggers when a player changes a sign. - // @Context - // returns the dLocation of the sign. - // returns the new sign text as a dList. - // returns the old sign text as a dList. - // returns the dMaterial of the sign. - // returns a dList of notable cuboids surrounding the sign. - // - // @Determine - // "CANCELLED" to stop the sign from being changed. - // dList to change the lines (Uses escaping, see <@link language Property Escaping>) - // - // --> - @EventHandler - public void signChange(final SignChangeEvent event) { - - if (dEntity.isNPC(event.getPlayer())) - return; - - Block block = event.getBlock(); - if (block == null || !(block.getState() instanceof Sign)) { - return; // Fix error induced by dark magic. - } - - List events = new ArrayList(); - Map context = new HashMap(); - - dPlayer player = dEntity.getPlayerFrom(event.getPlayer()); - Sign sign = (Sign) block.getState(); - dLocation location = new dLocation(block.getLocation()); - dMaterial material = dMaterial.getMaterialFrom(block.getType(), block.getData()); - - context.put("old", new dList(Arrays.asList(sign.getLines()))); - context.put("new", new dList(Arrays.asList(event.getLines()))); - - dList old_escaped = new dList(); - for (String str: sign.getLines()) { - old_escaped.add(EscapeTags.Escape(str)); - } - context.put("old_escaped", old_escaped); // Deprecated - - dList new_escaped = new dList(); - for (String str: event.getLines()) { - new_escaped.add(EscapeTags.Escape(str)); // Deprecated - } - context.put("new_escaped", new_escaped); - - context.put("location", location); - context.put("material", material); - - // Look for cuboids that contain the block's location - List cuboids = dCuboid.getNotableCuboidsContaining(location); - - if (cuboids.size() > 0) { - events.add("player changes sign in notable cuboid"); - events.add("player changes " + material.identifySimple() + " in notable cuboid"); - } - - dList cuboid_context = new dList(); - for (dCuboid cuboid : cuboids) { - events.add("player changes sign in " + cuboid.identifySimple()); - events.add("player changes " + material.identifySimple() + " in " + cuboid.identifySimple()); - cuboid_context.add(cuboid.identify()); - } - // Add in cuboids context, with either the cuboids or an empty list - context.put("cuboids", cuboid_context); - - events.add("player changes sign"); - events.add("player changes " + material.identifySimple()); - - String determination = doEvents(events, null, player, context, true); - - if (determination.toUpperCase().startsWith("CANCELLED")) - event.setCancelled(true); - - else if (determination.length() > 0 && !determination.equalsIgnoreCase("none")) { - dList lines = dList.valueOf(determination); - for (int i = 0; i < 4 && i < lines.size(); i++) { - event.setLine(i, EscapeTags.unEscape(lines.get(i))); - } - } - } /////////////////////