Support delaying dynmap start to allow Spout blocks to be registered

This commit is contained in:
Mike Primm 2012-10-05 00:10:32 -05:00
parent 1603015631
commit 827f18b8e0
2 changed files with 68 additions and 15 deletions

View File

@ -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;
}

View File

@ -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<String> plugins_pending = new HashSet<String>();
public SpoutPluginBlocks(Plugin plugin) {
/* First, see if any spout plugins that need to be enabled */
for(Plugin p : plugin.getServer().getPluginManager().getPlugins()) {
List<String> 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<String> 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)