public void saveData() {
		log.debug("Saving ControllerBlock data");
		String dump = "# v4";
		for (Iterator<CBlock> i = blocks.iterator(); i.hasNext(); ) {
			CBlock cblock = i.next();
			dump += "\n" + cblock.serialize();
		}
		try {
			Writer out = new OutputStreamWriter(new FileOutputStream(this.getDataFolder() + "/" + saveDataFile + ".tmp"), "UTF-8");
			out.write(dump);
			out.close();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			log.severe("ERROR: Couldn't open the file to write ControllerBlock data to!");
			log.severe("       Check your server installation has write access to " + this.getDataFolder());
			e.printStackTrace();
		} catch (IOException e) {
			log.severe("ERROR: Couldn't save ControllerBlock data! Possibly corrupted/incomplete data");
			log.severe("       Check if the disk is full, then edit/finish editing a ControllerBlock");
			log.severe("       in game to try to save again.");
			e.printStackTrace();
		}
	
		File newData = new File(this.getDataFolder() + "/" + saveDataFile + ".tmp");
		File curData = new File(this.getDataFolder() + "/" + saveDataFile);
		if (!newData.renameTo(curData)) {
			// Failed the first time, fallback onto delete/replace method
			if (!curData.delete()) {
				log.warning("Couldn't delete old save data during fallback, will probably error next");
			}
			if (!newData.renameTo(curData)) {
				log.severe("ERROR: Couldn't move temporary save file over current save file");
				log.severe("       Check that your server installation has write access to " + this.getDataFolder() + "/" + saveDataFile);	
			}
		}
	}