public void op_creatureedit(final String input, final Client client) {
		final Player player = getPlayer(client);

		String ccmd = "";
		String carg = "";

		final EditorData data = player.getEditorData();

		if (input.indexOf(" ") != -1) {
			ccmd = input.substring(0, input.indexOf(" ")).toLowerCase();
			carg = input.substring(input.indexOf(" ") + 1, input.length());
		} else {
			ccmd = input.substring(0, input.length()).toLowerCase();
		}

		debug("CEDIT CMD");
		debug("ccmd: \"" + ccmd + "\"");
		debug("carg: \"" + carg + "\"");

		if (ccmd.equals("abort")) {
			// clear edit flag
			((Creature) data.getObject("creature")).Edit_Ok = true;

			// exit
			send("< Exiting... >", client);

			// reset editor and player status
			player.setStatus((String) data.getObject("pstatus"));
			player.setEditor(Editors.NONE);
		}
		else if (ccmd.equals("desc")) {
			String[] cargs = carg.split(" ");

			if (cargs.length > 1) {
				if (cargs[0].equalsIgnoreCase("-f")) {
					// ?
					data.setObject("desc", carg);
				}
				else data.setObject("desc", carg);
			}
			else data.setObject("desc", carg);

			send("Ok.", client);
		}
		else if (ccmd.equals("done")) {
			// save changes
			op_creatureedit("save", client);

			// clear edit flag
			((Creature) data.getObject("creature")).Edit_Ok = true;

			// exit
			send("< Exiting... >", client);

			// reset editor and player status
			player.setStatus((String) data.getObject("pstatus"));
			player.setEditor(Editors.NONE);
		}
		else if (ccmd.equals("help")) {
			if (carg.equals("")) {
				// output help information
				final List<String> output = (List<String>) Utils.mkList(
						"Creature Editor -- Help",
						Utils.padRight("", '-', 74),
						"abort                           abort the editor (no changes will be kept)",
						"desc <new description>          change/set the creature description",
						//"desc <param> <new description>  change/set the room description",
						"done                            finish editing (save & exit)",
						"help                            shows this help information",
						// "items                           list available item prototypes",
						"name <new name>                 change/set the creature name",
						"save                            save changes to the creature",
						"setlocation                     change the location (deprecated?)",
						"setrace                         set the creature's race",
						"setzone                         set the zone that this room belongs to",
						"show                            show basic information about the room",
						"zones                           list the zones that exist",
						Utils.padRight("", '-', 74)
						);
				client.write(output);
			}
			else {
				// output help information specific to the command name given
			}
		}
		else if (ccmd.equals("name")) {
			data.setObject("name", carg);
			send("Ok.", client);
		}
		else if (ccmd.equals("races")) {
			final List<String> raceList = new LinkedList<String>();

			for (final Race race : races) {
				raceList.add(race.getName());
			}

			send(raceList, client);
		}
		else if (ccmd.equals("save")) {
			// TODO consider using a bitset/flags or something to set only
			// changed data (REDIT)
			final Creature creature = (Creature) data.getObject("creature");

			// save room data
			creature.setName((String) data.getObject("name"));
			creature.setFlags((EnumSet<ObjectFlag>) data.getObject("flags"));
			creature.setDesc((String) data.getObject("desc"));
			creature.setLocation((Integer) data.getObject("location"));

			// room.getZone().removeRoom(room);
			// room.setZone((Zone) data.getObject("zone"));
			// room.getZone().addRoom(room);

			send("Creature saved.", client);
		}
		else if (ccmd.equals("setflag")) {
			final EnumSet<ObjectFlag> flags = (EnumSet<ObjectFlag>) data.getObject("flags");

			if (carg.startsWith("!")) {
				flags.remove(ObjectFlag.fromLetter(carg.charAt(1)));
				send(ObjectFlag.fromLetter(carg.charAt(1)).name() + " flag removed.", client);
			}
			else {
				try {
					final ObjectFlag flag = ObjectFlag.fromLetter(carg.charAt(0));

					flags.add(flag);
					send(flag.name() + " flag set.", client);
				}
				catch (final IllegalArgumentException iae) {
					// TODO is this debug message adequate?
					send("No such flag.", client);
					System.out.println("--- Stack Trace ---");
					iae.printStackTrace();
				}
			}

			data.setObject("flags", flags);
			send("Ok.", client);
		}
		else if (ccmd.equals("setlocation")) {
			data.setObject("location", Utils.toInt(carg, -1));
			send("Ok.", client);
		}
		else if (ccmd.equals("setrace")) {
			data.setObject("race", getRace(carg));
			send("Ok.", client);
		}
		/*
		 * else if ( ccmd.equals("setzone") ) { //data.setObject("zone",
		 * getZone(Utils.toInt(rarg, -1))); data.setObject("zone",
		 * getZone(carg)); send("Ok.", client); }
		 */
		else if (ccmd.equals("show")) {
			final Creature creature = (Creature) data.getObject("creature");

			final String editor = "-- Creature Editor";

			// will be a little like examine, just here to show changes
			send(editor + Utils.padRight("", '-', 80 - editor.length()), client);

			// send(Utils.padRight("", '-', 80), client);

			send("DB Reference #: " + creature.getDBRef(), client);
			send("Name: " + data.getObject("name"), client);
			send("Flags: " + ((EnumSet<ObjectFlag>) data.getObject("flags")).toString(), client);
			send("Description:", client);
			showDesc((String) data.getObject("desc"), 80, client);
			send("Location: " + (Integer) data.getObject("location"), client);
			
			// send("Zone: " + colors(((Zone) data.getObject("zone")).getName(),
			// "purple2"), client);

			send("Race: " + (Race) data.getObject("race"), client);

			send(Utils.padRight("", '-', 80), client);
		}
		else if (ccmd.equals("zones")) {
			send("Zones", client);
			send(Utils.padRight("", '-', 40), client);

			if ("".equals(carg)) {
				for (Zone zone : zones.keySet()) {
					send("" + zone.getName() + " ( " + zone.getRooms().size()
							+ " Rooms )", client);
				}
			}
			else {
				for (Zone zone : zones.keySet()) {
					if (zone.getName().toLowerCase()
							.startsWith(carg.toLowerCase())) {
						send("" + zone.getName() + " ( "
								+ zone.getRooms().size() + " Rooms )", client);
					}
				}
			}
		} else {
			send("No such command.");
		}
	}