From 827f18b8e02ee396f6fd01a6ceaba29ff181fba9 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Fri, 5 Oct 2012 00:10:32 -0500 Subject: [PATCH] Support delaying dynmap start to allow Spout blocks to be registered --- .../java/org/dynmap/bukkit/DynmapPlugin.java | 47 +++++++++++++++++-- .../org/dynmap/bukkit/SpoutPluginBlocks.java | 36 +++++++++----- 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/src/main/java/org/dynmap/bukkit/DynmapPlugin.java index fde5ff59..91267361 100644 --- a/src/main/java/org/dynmap/bukkit/DynmapPlugin.java +++ b/src/main/java/org/dynmap/bukkit/DynmapPlugin.java @@ -49,6 +49,7 @@ import org.bukkit.event.player.PlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.server.PluginEnableEvent; import org.bukkit.event.world.ChunkPopulateEvent; import org.bukkit.event.world.SpawnChangeEvent; import org.bukkit.event.world.StructureGrowEvent; @@ -100,6 +101,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { public SpoutPluginBlocks spb; public PluginManager pm; private Metrics metrics; + private BukkitEnableCoreCallback enabCoreCB = new BukkitEnableCoreCallback(); private class BukkitEnableCoreCallback extends DynmapCore.EnableCoreCallbacks { @Override @@ -109,8 +111,9 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { if(core.configuration.getBoolean("spout/enabled", true)) { has_spout = true; Log.info("Detected Spout"); - spb = new SpoutPluginBlocks(); - spb.processSpoutBlocks(DynmapPlugin.this, core); + if(spb == null) { + spb = new SpoutPluginBlocks(DynmapPlugin.this); + } } else { Log.info("Detected Spout - Support Disabled"); @@ -618,8 +621,46 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { core.setDataFolder(dataDirectory); core.setServer(new BukkitServer()); + /* Load configuration */ + if(!core.initConfiguration(enabCoreCB)) { + this.setEnabled(false); + return; + } + /* See if we need to wait before enabling core */ + if(!readyToEnable()) { + Listener pl = new Listener() { + @EventHandler(priority=EventPriority.MONITOR) + public void onPluginEnabled(PluginEnableEvent evt) { + if (!readyToEnable()) { + spb.markPluginEnabled(evt.getPlugin()); + if (readyToEnable()) { /* If we;re ready now, finish enable */ + doEnable(); /* Finish enable */ + } + } + } + }; + pm.registerEvents(pl, this); + } + else { + doEnable(); + } + } + + private boolean readyToEnable() { + if (spb != null) { + return spb.isReady(); + } + return true; + } + + private void doEnable() { + /* Prep spout support, if needed */ + if(spb != null) { + spb.processSpoutBlocks(this, core); + } + /* Enable core */ - if(!core.enableCore(new BukkitEnableCoreCallback())) { + if(!core.enableCore(enabCoreCB)) { this.setEnabled(false); return; } diff --git a/src/main/java/org/dynmap/bukkit/SpoutPluginBlocks.java b/src/main/java/org/dynmap/bukkit/SpoutPluginBlocks.java index 4cd9cf41..18dd14a4 100644 --- a/src/main/java/org/dynmap/bukkit/SpoutPluginBlocks.java +++ b/src/main/java/org/dynmap/bukkit/SpoutPluginBlocks.java @@ -9,6 +9,7 @@ import java.lang.reflect.Field; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import javax.imageio.ImageIO; @@ -33,7 +34,29 @@ import org.getspout.spoutapi.material.MaterialData; public class SpoutPluginBlocks { private Field textXPosField; /* float[][] textXPos */ private Field textYPosField; /* float[][] textYPos */ - + private HashSet plugins_pending = new HashSet(); + + public SpoutPluginBlocks(Plugin plugin) { + /* First, see if any spout plugins that need to be enabled */ + for(Plugin p : plugin.getServer().getPluginManager().getPlugins()) { + List dep = p.getDescription().getDepend(); + if((dep != null) && (dep.contains("Spout"))) { + Log.info("Found Spout plugin: " + p.getName()); + if(p.isEnabled() == false) { + plugins_pending.add(p.getName()); + } + } + } + } + + public boolean isReady() { + return plugins_pending.isEmpty(); + } + + public void markPluginEnabled(Plugin p) { + plugins_pending.remove(p.getName()); + } + private boolean initSpoutAccess() { boolean success = false; try { @@ -73,17 +96,6 @@ public class SpoutPluginBlocks { /* Process spout blocks - return true if something changed */ public boolean processSpoutBlocks(DynmapPlugin plugin, DynmapCore core) { - /* First, see if any spout plugins that need to be enabled */ - for(Plugin p : plugin.getServer().getPluginManager().getPlugins()) { - List dep = p.getDescription().getDepend(); - if((dep != null) && (dep.contains("Spout"))) { - Log.info("Found Spout plugin: " + p.getName()); - if(p.isEnabled() == false) { - plugin.getPluginLoader().enablePlugin(p); - } - } - } - File datadir = core.getDataFolder(); if(textYPosField == null) { if(initSpoutAccess() == false)