From 0cef0e0b3d6c12620abb1466ed820073aa73a88a Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 22 Apr 2016 23:00:38 -0400 Subject: [PATCH] Add item dumper/ItemID generator --- .../java/net/runelite/cache/ItemDumper.java | 127 ++++++++++++++++++ .../net/runelite/cache/ItemDumperTest.java | 22 +++ .../cache/loaders/ItemLoaderTest.java | 2 + 3 files changed, 151 insertions(+) create mode 100644 src/main/java/net/runelite/cache/ItemDumper.java create mode 100644 src/test/java/net/runelite/cache/ItemDumperTest.java diff --git a/src/main/java/net/runelite/cache/ItemDumper.java b/src/main/java/net/runelite/cache/ItemDumper.java new file mode 100644 index 0000000000..eaa303ddc9 --- /dev/null +++ b/src/main/java/net/runelite/cache/ItemDumper.java @@ -0,0 +1,127 @@ +package net.runelite.cache; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashSet; +import java.util.Set; +import net.runelite.cache.definitions.ItemDefinition; +import net.runelite.cache.definitions.loaders.ItemLoader; +import net.runelite.cache.fs.Archive; +import net.runelite.cache.fs.Index; +import net.runelite.cache.fs.Store; +import net.runelite.cache.io.InputStream; + +public class ItemDumper +{ + private final File cache, out, java; + private final Gson gson; + private ItemLoader loader; + + public ItemDumper(File cache, File out, File java) + { + this.cache = cache; + this.out = out; + this.java = java; + + GsonBuilder builder = new GsonBuilder() + .setPrettyPrinting(); + gson = builder.create(); + } + + public static void main(String[] args) throws IOException + { + if (args.length < 3) + System.exit(1); + + File cache = new File(args[0]); + File out = new File(args[1]); + File java = new File(args[2]); + + ItemDumper dumper = new ItemDumper(cache, out, java); + dumper.load(); + dumper.dump(); + dumper.java(); + } + + public void load() throws IOException + { + loader = new ItemLoader(); + + try (Store store = new Store(cache)) + { + store.load(); + + Index index = store.getIndex(ItemLoader.INDEX_TYPE); + Archive archive = index.getArchive(ItemLoader.ARCHIVE_ID); + + for (net.runelite.cache.fs.File f : archive.getFiles()) + { + loader.load(f.getFileId(), new InputStream(f.getContents())); + } + } + } + + public void dump() throws IOException + { + for (ItemDefinition def : loader.getItems()) + { + out.mkdirs(); + java.io.File targ = new java.io.File(out, def.id + ".json"); + try (FileWriter fw = new FileWriter(targ)) + { + fw.write(gson.toJson(def)); + } + } + } + + public void java() throws IOException + { + java.mkdirs(); + java.io.File targ = new java.io.File(java, "ItemID.java"); + try (PrintWriter fw = new PrintWriter(targ)) + { + Set used = new HashSet<>(); + + fw.println("/* This file is automatically generated. Do not edit. */"); + fw.println("package net.runelite.api;"); + fw.println(""); + fw.println("public final class ItemID {"); + for (ItemDefinition def : loader.getItems()) + { + if (def.name.equalsIgnoreCase("NULL")) + continue; + + String name = name(def.name); + String suffix = ""; + while (used.contains(name + suffix)) + { + if (suffix.isEmpty()) + suffix = "_2"; + else + suffix = "_" + (Integer.parseInt(suffix.substring(1)) + 1); + } + name += suffix; + + used.add(name); + + fw.println(" public static final int " + name + " = " + def.id + ";"); + } + fw.println("}"); + } + } + + private static String name(String in) + { + String s = in.toUpperCase() + .replace(' ', '_') + .replaceAll("[^a-zA-Z0-9_]", ""); + if (Character.isDigit(s.charAt(0))) + return "_" + s; + else + return s; + } +} diff --git a/src/test/java/net/runelite/cache/ItemDumperTest.java b/src/test/java/net/runelite/cache/ItemDumperTest.java new file mode 100644 index 0000000000..f081a86be2 --- /dev/null +++ b/src/test/java/net/runelite/cache/ItemDumperTest.java @@ -0,0 +1,22 @@ +package net.runelite.cache; + +import java.io.File; +import java.io.IOException; +import org.junit.Test; + +public class ItemDumperTest +{ + @Test + public void test() throws IOException + { + ItemDumper dumper = new ItemDumper( + new File("d:/rs/07/cache"), + new File("d:/rs/07/cache/items"), + new File("d:/rs/07/cache") + ); + dumper.load(); + dumper.dump(); + dumper.java(); + } + +} diff --git a/src/test/java/net/runelite/cache/loaders/ItemLoaderTest.java b/src/test/java/net/runelite/cache/loaders/ItemLoaderTest.java index 568ce161a2..9ae6406052 100644 --- a/src/test/java/net/runelite/cache/loaders/ItemLoaderTest.java +++ b/src/test/java/net/runelite/cache/loaders/ItemLoaderTest.java @@ -19,6 +19,8 @@ public class ItemLoaderTest //@Test public void extract() throws IOException { + // XXX this can all use ItemDumper + ItemLoader loader = new ItemLoader(); java.io.File base = StoreLocation.LOCATION;