@Override
	public void onEnable() {
		if (!beenEnabled) {
			PluginManager pm = getServer().getPluginManager();
			
			log.debug("Registering events:");
			// The "UI", checks for hits against controller blocks
			log.debug(" - BLOCK_DAMAGE");
			pm.registerEvent(Event.Type.BLOCK_DAMAGE, blockListener, Event.Priority.Highest, this);
			// Block protection/controller cleanup/block editing
			log.debug(" - BLOCK_BREAK");
			pm.registerEvent(Event.Type.BLOCK_BREAK, blockListener, Event.Priority.Highest, this);
			// Block editing
			log.debug(" - BLOCK_PLACE");
			pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Event.Priority.Monitor, this);
			// Block protection/fallback anti-dupe while editing
			log.debug(" - BLOCK_PHYSICS");
			pm.registerEvent(Event.Type.BLOCK_PHYSICS, blockListener, Event.Priority.Highest, this);
			// Block protection
			log.debug(" - BLOCK_FROMTO"); // TODO: Change this to LIQUID_DESTROY
			pm.registerEvent(Event.Type.BLOCK_FROMTO, blockListener, Event.Priority.Highest, this);
			
			
			
			log.debug("Scheduling tasks:");
			
			// New hotness for anti-dupe while editing, more accurate than BLOCK_PHYSICS
			log.debug(" - Anti-dupe/changed-block edit check");
			if (getServer().getScheduler().scheduleSyncRepeatingTask(this, blockListener, 1, 1) == -1) {
				log.warning("Scheduling BlockListener anti-dupe check failed, falling back to old BLOCK_PHYSICS event");
				blockPhysicsEditCheck = true;
			}
			if (config.getBool(Option.DisableEditDupeProtection)) {
				log.warning("Edit dupe protection has been disabled, you're on your own from here");
			}
			
			// New redstone check, the more natural check
			if (!config.getBool(Option.QuickRedstoneCheck)) {
				log.debug(" - Redstone check");
				log.info("Enabling full redstone check");
				if (getServer().getScheduler().scheduleSyncRepeatingTask(this, checkRunner, 1, 1) == -1) {
					log.warning("Scheduling CBlockRedstoneCheck task failed, falling back to quick REDSTONE_CHANGE event");
					config.setOpt(Option.QuickRedstoneCheck, true);
				}
			}
			// Fallback/quick REDSTONE_CHANGE check
			if (config.getBool(Option.QuickRedstoneCheck)) {
				log.info("Enabling 'quick' redstone check - this mode of operation is depreciated and may be removed later");
				pm.registerEvent(Event.Type.REDSTONE_CHANGE, blockListener, Event.Priority.Monitor, this);
			}
			
			if (getServer().getScheduler().scheduleSyncDelayedTask(this, this, 1) == -1) {
				log.severe("Failed to schedule loadData, loading now, will probably not work with multiworld plugins");
				loadData();
			}
			
			log.info("Events registered");
			
			beenEnabled = true;
		}
	}