From 038449fbcc3387dadce85411a86e5bcc470e8a92 Mon Sep 17 00:00:00 2001 From: Morphan1 Date: Wed, 18 Feb 2015 00:12:36 -0500 Subject: [PATCH] Add range option to Also fix dEntity errors on shutdown --- .../java/net/aufdemrand/denizen/Denizen.java | 5 +++ .../aufdemrand/denizen/objects/dLocation.java | 11 ++++-- .../containers/core/EntityScriptHelper.java | 35 ++++++++++++++++++- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/Denizen.java b/src/main/java/net/aufdemrand/denizen/Denizen.java index df196a8244..9443d5f85c 100644 --- a/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -785,6 +785,11 @@ public void onDisable() { getLogger().log(Level.INFO, " v" + getDescription().getVersion() + " disabled."); Bukkit.getServer().getScheduler().cancelTasks(this); HandlerList.unregisterAll(this); + + for (World world : getServer().getWorlds()) { + EntityScriptHelper.unlinkWorld(world); + } + saveSaves(); } diff --git a/src/main/java/net/aufdemrand/denizen/objects/dLocation.java b/src/main/java/net/aufdemrand/denizen/objects/dLocation.java index 3ab0bc649b..bae692fa4f 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dLocation.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dLocation.java @@ -572,17 +572,24 @@ public String getAttribute(Attribute attribute) { ///////////////// // <--[tag] - // @attribute + // @attribute ]> // @returns dLocation // @description // Returns the exact location this location is pointing at. + // Optionally, specify a maximum range to find the location from. // --> if (attribute.startsWith("precise_cursor_on")) { + int range = attribute.getIntContext(1); + if (range < 1) range = 200; double xzLen = Math.cos((getPitch() % 360) * (Math.PI/180)); double nx = xzLen * Math.sin(-getYaw() * (Math.PI/180)); double ny = Math.sin(getPitch() * (Math.PI/180)); double nz = xzLen * Math.cos(getYaw() * (Math.PI/180)); - return new dLocation(Rotation.rayTrace(this, new org.bukkit.util.Vector(nx, -ny, nz), 200)).getAttribute(attribute.fulfill(1)); + Location location = Rotation.rayTrace(this, new org.bukkit.util.Vector(nx, -ny, nz), range); + if (location != null) + return new dLocation(location).getAttribute(attribute.fulfill(1)); + else + return null; } // <--[tag] diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/EntityScriptHelper.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/EntityScriptHelper.java index f217eb52b6..454e5959ed 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/EntityScriptHelper.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/EntityScriptHelper.java @@ -6,6 +6,7 @@ import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.world.DenizenWorldAccess; import net.aufdemrand.denizencore.objects.Element; +import net.aufdemrand.denizencore.utilities.debugging.dB; import org.bukkit.World; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; @@ -18,8 +19,11 @@ import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.world.ChunkUnloadEvent; import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; +import java.lang.reflect.Field; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.UUID; @@ -27,6 +31,19 @@ public class EntityScriptHelper implements Listener { static HashMap entities = new HashMap(); + private static final Field iWorldAccessList; + private static final Map worlds = new HashMap(); + + static { + Field field = null; + try { + field = net.minecraft.server.v1_8_R1.World.class.getDeclaredField("u"); + field.setAccessible(true); + } catch (Exception e) { + dB.echoError(e); + } + iWorldAccessList = field; + } public EntityScriptHelper() { DenizenAPI.getCurrentInstance().getServer().getPluginManager() @@ -43,7 +60,18 @@ public void onEntityDeath(EntityDeathEvent event) { } public static void linkWorld(World world) { - ((CraftWorld)world).getHandle().addIWorldAccess(new DenizenWorldAccess()); + DenizenWorldAccess denizenWorldAccess = new DenizenWorldAccess(); + worlds.put(world, denizenWorldAccess); + ((CraftWorld) world).getHandle().addIWorldAccess(denizenWorldAccess); + } + + public static void unlinkWorld(World world) { + try { + ((List) iWorldAccessList.get(((CraftWorld) world).getHandle())).remove(worlds.get(world)); + worlds.remove(world); + } catch (Exception e) { + dB.echoError(e); + } } @EventHandler(priority = EventPriority.MONITOR) @@ -51,6 +79,11 @@ public void onWorldLoad(WorldLoadEvent event) { linkWorld(event.getWorld()); } + @EventHandler(priority = EventPriority.MONITOR) + public void onWorldUnload(WorldUnloadEvent event) { + unlinkWorld(event.getWorld()); + } + @EventHandler public void onChunkUnload(ChunkUnloadEvent event) { // TODO: This doesn't work. Awaiting Entity Despawn Event PR's for Bukkit: