Hi,

Please correct me if I'm wrong, but I've found most 718 NPC drop editors released are generally only jar files that barely (if at all) work, or are for other formats of unpackedDrops. Sources generally only have a method to read the packed drops, but no way to pack them.
Please feel free to suggest constructive comments, I'm sure there's a million better ways to do this and I'm only just getting back into Java.

NOTE - This has a dependency on Apache Commons library.

This will work if your unpackedDrops look like this (it should be very easy to add capability to the isRare boolean if needed - I don't use it):
Spoiler for unpackedDrop Example:
Code:
<npc id=1>
	<drop>
		<item>526</item>
		<rate>100.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>555</item>
		<rate>74.0</rate>
		<minamount>7<minamount>
		<maxamount>7</maxamount>
		<item>557</item>
		<rate>56.0</rate>
		<minamount>4<minamount>
		<maxamount>4</maxamount>
		<item>554</item>
		<rate>69.0</rate>
		<minamount>6<minamount>
		<maxamount>6</maxamount>
		<item>558</item>
		<rate>72.0</rate>
		<minamount>9<minamount>
		<maxamount>9</maxamount>
		<item>562</item>
		<rate>43.0</rate>
		<minamount>2<minamount>
		<maxamount>2</maxamount>
		<item>559</item>
		<rate>3.0</rate>
		<minamount>7<minamount>
		<maxamount>7</maxamount>
		<item>199</item>
		<rate>75.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>201</item>
		<rate>57.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>203</item>
		<rate>64.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>205</item>
		<rate>58.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>207</item>
		<rate>57.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>213</item>
		<rate>74.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>209</item>
		<rate>59.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>211</item>
		<rate>48.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>215</item>
		<rate>44.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>217</item>
		<rate>42.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>2485</item>
		<rate>53.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>19830</item>
		<rate>83.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>877</item>
		<rate>83.0</rate>
		<minamount>1<minamount>
		<maxamount>2</maxamount>
		<item>882</item>
		<rate>64.0</rate>
		<minamount>7<minamount>
		<maxamount>7</maxamount>
		<item>1203</item>
		<rate>63.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>1139</item>
		<rate>66.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>1381</item>
		<rate>46.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>995</item>
		<rate>97.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>1438</item>
		<rate>72.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>1440</item>
		<rate>72.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>1965</item>
		<rate>69.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>313</item>
		<rate>71.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>436</item>
		<rate>59.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
		<item>438</item>
		<rate>55.0</rate>
		<minamount>1<minamount>
		<maxamount>1</maxamount>
	</drop>
</npc>


It's pretty good about informing the owner of the location of bad syntax in the unpackedDrops file, should you make a mistake. Server loads in the ~same time as reading the packed drops.

In NPCDrops.java:
Code:
	private static void readUnpackedNPCDrops() {
		try {
			//Read the unpacked drops.
			npcDrops = new HashMap<Integer, Drop[]>();
			File f = new File(UNPACKED_PATH);
			if (!f.exists())
				throw new IllegalStateException("Unpacked NPC drops (" + UNPACKED_PATH + ") does not exist.");
			@SuppressWarnings("resource")
			BufferedReader br = new BufferedReader(new FileReader(f));
			String line;
			int line_num = 0;
			while ((line = br.readLine()) != null) {
				if (line.startsWith("//"))
					continue;
				if (!line.startsWith("<npc id="))
					throw new IllegalStateException("Expecting NPC object at line: " + line_num);
				int itemId, npcId, min, max;
				double rate;
				ArrayList<Drop> drops = new ArrayList<Drop>();
				npcId = Integer.parseInt(StringUtils.substringBetween(line, "<npc id=", ">"));
				line = br.readLine();
				line_num++;
				if (!line.startsWith("\t<drop>"))
					throw new IllegalStateException("Expecting <drop> object at line: " + line_num);
				while (!(line = br.readLine()).startsWith("\t</drop>")) {
				    try {
					line_num++;
					if (!line.startsWith("\t\t<item>")) 
						throw new IllegalStateException("Expecting <item> line (tabs, no spaces!) : " + line_num);
					itemId = Integer.parseInt(StringUtils.substringBetween(line, "<item>", "</item>"));
					line = br.readLine();
					line_num++;
					if (!line.startsWith("\t\t<rate>")) 
						throw new IllegalStateException("Expecting <rate> line (tabs, no spaces!) : " + line_num);
					rate = Double.parseDouble(StringUtils.substringBetween(line, "<rate>", "</rate>"));
					line = br.readLine();
					line_num++;
				        if (!line.startsWith("\t\t<minamount>")) 
				    	    throw new IllegalStateException("Expecting <minamount> line (tabs, no spaces!) : " + line_num);
				    
					min = Integer.parseInt(StringUtils.substringBetween(line, "<minamount>", "<minamount>"));
					line = br.readLine();
					line_num++;
					if (!line.startsWith("\t\t<maxamount>")) 
						throw new IllegalStateException("Expecting <maxamount> line (tabs, no spaces!) : " + line_num);
					max = Integer.parseInt(StringUtils.substringBetween(line, "<maxamount>", "</maxamount>"));
					Drop drop = new Drop(itemId, rate, min, max, false);
					drops.add(drop);
				    } catch (Exception e) {
				    	e.printStackTrace();
				    	System.out.println("LINENUM: " + line_num);
				    	System.out.println("LINE CONTENT: " + line);
				    	return;
				    }
				}
				Drop[] dropsArray = new Drop[drops.size()];
				for (int z = 0; z < drops.size(); z++)
					dropsArray[z] = drops.get(z);
				npcDrops.put(npcId, dropsArray);
				br.readLine(); //skip close npc line
				line_num++;
			}
			br.close();
		} catch (Throwable e) {
			Logger.handle(e);
		}
	}
This allows you to parse the frankly very strange syntax of unpacked drops, and either just load drops from that or convert it to a more reasonable format like xml or json.
Hope someone finds this useful!