From 3944ad90f8480ad47c988946200881637bb5223a Mon Sep 17 00:00:00 2001 From: mcmonkey4eva Date: Wed, 24 Sep 2014 17:37:53 -0700 Subject: [PATCH] Add a redstone smart event A way to control redstone-powered creations --- .../denizen/events/EventManager.java | 1 + .../events/core/RedstoneSmartEvent.java | 94 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/main/java/net/aufdemrand/denizen/events/core/RedstoneSmartEvent.java diff --git a/src/main/java/net/aufdemrand/denizen/events/EventManager.java b/src/main/java/net/aufdemrand/denizen/events/EventManager.java index 89f00ce07f..b1a5104c60 100644 --- a/src/main/java/net/aufdemrand/denizen/events/EventManager.java +++ b/src/main/java/net/aufdemrand/denizen/events/EventManager.java @@ -361,6 +361,7 @@ public void registerCoreMembers() { registerSmartEvent(new PlayerEquipsArmorSmartEvent()); registerSmartEvent(new PlayerJumpSmartEvent()); registerSmartEvent(new PlayerStepsOnSmartEvent()); + registerSmartEvent(new RedstoneSmartEvent()); registerSmartEvent(new SyncChatSmartEvent()); registerSmartEvent(new VehicleCollisionSmartEvent()); } diff --git a/src/main/java/net/aufdemrand/denizen/events/core/RedstoneSmartEvent.java b/src/main/java/net/aufdemrand/denizen/events/core/RedstoneSmartEvent.java new file mode 100644 index 0000000000..c8da3703f3 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/events/core/RedstoneSmartEvent.java @@ -0,0 +1,94 @@ +package net.aufdemrand.denizen.events.core; + +import net.aufdemrand.denizen.events.EventManager; +import net.aufdemrand.denizen.events.SmartEvent; +import net.aufdemrand.denizen.objects.Element; +import net.aufdemrand.denizen.objects.dLocation; +import net.aufdemrand.denizen.objects.dMaterial; +import net.aufdemrand.denizen.objects.dObject; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizen.utilities.debugging.dB; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockRedstoneEvent; +import org.bukkit.event.entity.EntityChangeBlockEvent; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class RedstoneSmartEvent implements SmartEvent, Listener { + + + /////////////////// + // SMARTEVENT METHODS + /////////////// + + + @Override + public boolean shouldInitialize(Set events) { + + for (String event : events) { + + Matcher m = Pattern.compile("on redstone recalculated", Pattern.CASE_INSENSITIVE) + .matcher(event); + + if (m.matches()) { + // Straight-forward enough, just pass from any match. + return true; + } + } + return false; + } + + + @Override + public void _initialize() { + DenizenAPI.getCurrentInstance().getServer().getPluginManager() + .registerEvents(this, DenizenAPI.getCurrentInstance()); + dB.log("Loaded Redstone SmartEvent."); + } + + + @Override + public void breakDown() { + BlockRedstoneEvent.getHandlerList().unregister(this); + } + + ////////////// + // MECHANICS + /////////// + + // <--[event] + // @Events + // redstone recalculated + // + // @Warning This event fires very very rapidly! + // + // @Triggers when a redstone wire is recalculated. + // @Context + // returns the location of the block. + // returns what the redstone power level was. + // returns what the redstone power level is becoming. + // + // @Determine + // "CANCELLED" to stop the block from falling. + // + // --> + @EventHandler + public void onBlockRedstone(BlockRedstoneEvent event) { + Map context = new HashMap(); + context.put("location", new dLocation(event.getBlock().getLocation())); + context.put("old_current", new Element(event.getOldCurrent())); + context.put("new_current", new Element(event.getNewCurrent())); + String determination = EventManager.doEvents(Arrays.asList("redstone recalculated"), null, null, context, true); + Element det = new Element(determination); + if (det.isInt()) + event.setNewCurrent(det.asInt()); + } +}