cache: rewrite map image dumper with logic from client

This commit is contained in:
Adam
2018-03-30 12:35:20 -04:00
parent 769ce714e4
commit 9f943832ea
5 changed files with 765 additions and 297 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -27,9 +27,10 @@ package net.runelite.cache;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.HashMap;
import java.util.Map;
import net.runelite.cache.definitions.ObjectDefinition; import net.runelite.cache.definitions.ObjectDefinition;
import net.runelite.cache.definitions.exporters.ObjectExporter; import net.runelite.cache.definitions.exporters.ObjectExporter;
import net.runelite.cache.definitions.loaders.ObjectLoader; import net.runelite.cache.definitions.loaders.ObjectLoader;
@@ -44,7 +45,7 @@ import net.runelite.cache.util.Namer;
public class ObjectManager public class ObjectManager
{ {
private final Store store; private final Store store;
private final List<ObjectDefinition> objects = new ArrayList<>(); private final Map<Integer, ObjectDefinition> objects = new HashMap<>();
private final Namer namer = new Namer(); private final Namer namer = new Namer();
public ObjectManager(Store store) public ObjectManager(Store store)
@@ -66,20 +67,25 @@ public class ObjectManager
for (FSFile f : files.getFiles()) for (FSFile f : files.getFiles())
{ {
ObjectDefinition def = loader.load(f.getFileId(), f.getContents()); ObjectDefinition def = loader.load(f.getFileId(), f.getContents());
objects.add(def); objects.put(f.getFileId(), def);
} }
} }
public List<ObjectDefinition> getObjects() public Collection<ObjectDefinition> getObjects()
{ {
return Collections.unmodifiableList(objects); return Collections.unmodifiableCollection(objects.values());
}
public ObjectDefinition getObject(int id)
{
return objects.get(id);
} }
public void dump(File out) throws IOException public void dump(File out) throws IOException
{ {
out.mkdirs(); out.mkdirs();
for (ObjectDefinition def : objects) for (ObjectDefinition def : objects.values())
{ {
ObjectExporter exporter = new ObjectExporter(def); ObjectExporter exporter = new ObjectExporter(def);
@@ -100,7 +106,7 @@ public class ObjectManager
fw.println(""); fw.println("");
fw.println("public final class ObjectID"); fw.println("public final class ObjectID");
fw.println("{"); fw.println("{");
for (ObjectDefinition def : objects) for (ObjectDefinition def : objects.values())
{ {
String name; String name;
if (def.getName().equalsIgnoreCase("NULL")) if (def.getName().equalsIgnoreCase("NULL"))

View File

@@ -28,7 +28,7 @@ import net.runelite.cache.definitions.TextureDefinition;
import net.runelite.cache.definitions.providers.SpriteProvider; import net.runelite.cache.definitions.providers.SpriteProvider;
import net.runelite.cache.definitions.providers.TextureProvider; import net.runelite.cache.definitions.providers.TextureProvider;
class RSTextureProvider public class RSTextureProvider
{ {
private final SpriteProvider spriteProvider; private final SpriteProvider spriteProvider;
TextureDefinition[] textures; TextureDefinition[] textures;

View File

@@ -25,8 +25,9 @@
package net.runelite.cache.region; package net.runelite.cache.region;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.Collection;
import java.util.List; import java.util.HashMap;
import java.util.Map;
import net.runelite.cache.IndexType; import net.runelite.cache.IndexType;
import net.runelite.cache.definitions.LocationsDefinition; import net.runelite.cache.definitions.LocationsDefinition;
import net.runelite.cache.definitions.MapDefinition; import net.runelite.cache.definitions.MapDefinition;
@@ -50,7 +51,7 @@ public class RegionLoader
private final Index index; private final Index index;
private final XteaKeyManager keyManager; private final XteaKeyManager keyManager;
private final List<Region> regions = new ArrayList<>(); private final Map<Integer, Region> regions = new HashMap<>();
private Region lowestX = null, lowestY = null; private Region lowestX = null, lowestY = null;
private Region highestX = null, highestY = null; private Region highestX = null, highestY = null;
@@ -69,7 +70,7 @@ public class RegionLoader
Region region = this.loadRegionFromArchive(i); Region region = this.loadRegionFromArchive(i);
if (region != null) if (region != null)
{ {
regions.add(region); regions.put(i, region);
} }
} }
} }
@@ -117,7 +118,7 @@ public class RegionLoader
public void calculateBounds() public void calculateBounds()
{ {
for (Region region : regions) for (Region region : regions.values())
{ {
if (lowestX == null || region.getBaseX() < lowestX.getBaseX()) if (lowestX == null || region.getBaseX() < lowestX.getBaseX())
{ {
@@ -141,9 +142,16 @@ public class RegionLoader
} }
} }
public List<Region> getRegions() public Collection<Region> getRegions()
{ {
return regions; return regions.values();
}
public Region findRegionForWorldCoordinates(int x, int y)
{
x >>>= 6;
y >>>= 6;
return regions.get((x << 8) | y);
} }
public Region getLowestX() public Region getLowestX()

View File

@@ -30,6 +30,7 @@ import java.io.IOException;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import net.runelite.cache.fs.Store; import net.runelite.cache.fs.Store;
import net.runelite.cache.region.Region; import net.runelite.cache.region.Region;
import net.runelite.cache.region.RegionLoader;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
@@ -46,7 +47,7 @@ public class MapImageDumperTest
@Test @Test
@Ignore @Ignore
public void extract() throws IOException public void dumpMap() throws IOException
{ {
File base = StoreLocation.LOCATION, File base = StoreLocation.LOCATION,
outDir = folder.newFolder(); outDir = folder.newFolder();
@@ -69,4 +70,31 @@ public class MapImageDumperTest
} }
} }
} }
@Test
@Ignore
public void dumpRegions() throws Exception
{
File base = StoreLocation.LOCATION,
outDir = folder.newFolder();
try (Store store = new Store(base))
{
store.load();
RegionLoader regionLoader = new RegionLoader(store);
regionLoader.loadRegions();
MapImageDumper dumper = new MapImageDumper(store);
dumper.load();
int z = 0;
for (Region region : regionLoader.getRegions())
{
File imageFile = new File(outDir, "img-" + z + "-" + region.getRegionID() + ".png");
BufferedImage image = dumper.drawRegion(region, z);
ImageIO.write(image, "png", imageFile);
}
}
}
} }