cache: add map and location definition, convert Region loading to use it
This commit is contained in:
38
cache/src/main/java/net/runelite/cache/definitions/LocationsDefinition.java
vendored
Normal file
38
cache/src/main/java/net/runelite/cache/definitions/LocationsDefinition.java
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Adam <Adam@sigterm.info>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.cache.definitions;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
import net.runelite.cache.region.Location;
|
||||
|
||||
@Data
|
||||
public class LocationsDefinition
|
||||
{
|
||||
private int regionX;
|
||||
private int regionY;
|
||||
private List<Location> locations = new ArrayList<>();
|
||||
}
|
||||
51
cache/src/main/java/net/runelite/cache/definitions/MapDefinition.java
vendored
Normal file
51
cache/src/main/java/net/runelite/cache/definitions/MapDefinition.java
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Adam <Adam@sigterm.info>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.cache.definitions;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class MapDefinition
|
||||
{
|
||||
public static final int X = 64;
|
||||
public static final int Y = 64;
|
||||
public static final int Z = 4;
|
||||
|
||||
@Data
|
||||
public static class Tile
|
||||
{
|
||||
public Integer height;
|
||||
public int attrOpcode;
|
||||
public byte settings;
|
||||
public byte overlayId;
|
||||
public byte overlayPath;
|
||||
public byte overlayRotation;
|
||||
public byte underlayId;
|
||||
}
|
||||
|
||||
private int regionX;
|
||||
private int regionY;
|
||||
private Tile[][][] tiles = new Tile[Z][X][Y];
|
||||
}
|
||||
73
cache/src/main/java/net/runelite/cache/definitions/loaders/LocationsLoader.java
vendored
Normal file
73
cache/src/main/java/net/runelite/cache/definitions/loaders/LocationsLoader.java
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Adam <Adam@sigterm.info>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.cache.definitions.loaders;
|
||||
|
||||
import net.runelite.cache.definitions.LocationsDefinition;
|
||||
import net.runelite.cache.io.InputStream;
|
||||
import net.runelite.cache.region.Location;
|
||||
import net.runelite.cache.region.Position;
|
||||
|
||||
public class LocationsLoader
|
||||
{
|
||||
public LocationsDefinition load(int regionX, int regionY, byte[] b)
|
||||
{
|
||||
LocationsDefinition loc = new LocationsDefinition();
|
||||
loc.setRegionX(regionX);
|
||||
loc.setRegionY(regionY);
|
||||
loadLocations(loc, b);
|
||||
return loc;
|
||||
}
|
||||
|
||||
private void loadLocations(LocationsDefinition loc, byte[] b)
|
||||
{
|
||||
InputStream buf = new InputStream(b);
|
||||
|
||||
int id = -1;
|
||||
int idOffset;
|
||||
|
||||
while ((idOffset = buf.readUnsignedShortSmart()) != 0)
|
||||
{
|
||||
id += idOffset;
|
||||
|
||||
int position = 0;
|
||||
int positionOffset;
|
||||
|
||||
while ((positionOffset = buf.readUnsignedShortSmart()) != 0)
|
||||
{
|
||||
position += positionOffset - 1;
|
||||
|
||||
int localY = position & 0x3F;
|
||||
int localX = position >> 6 & 0x3F;
|
||||
int height = position >> 12 & 0x3;
|
||||
|
||||
int attributes = buf.readUnsignedByte();
|
||||
int type = attributes >> 2;
|
||||
int orientation = attributes & 0x3;
|
||||
|
||||
loc.getLocations().add(new Location(id, type, orientation, new Position(localX, localY, height)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
91
cache/src/main/java/net/runelite/cache/definitions/loaders/MapLoader.java
vendored
Normal file
91
cache/src/main/java/net/runelite/cache/definitions/loaders/MapLoader.java
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Adam <Adam@sigterm.info>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.cache.definitions.loaders;
|
||||
|
||||
import net.runelite.cache.definitions.MapDefinition;
|
||||
import net.runelite.cache.definitions.MapDefinition.Tile;
|
||||
import net.runelite.cache.io.InputStream;
|
||||
import static net.runelite.cache.region.Region.X;
|
||||
import static net.runelite.cache.region.Region.Y;
|
||||
import static net.runelite.cache.region.Region.Z;
|
||||
|
||||
public class MapLoader
|
||||
{
|
||||
public MapDefinition load(int regionX, int regionY, byte[] b)
|
||||
{
|
||||
MapDefinition map = new MapDefinition();
|
||||
map.setRegionX(regionX);
|
||||
map.setRegionY(regionY);
|
||||
loadTerrain(map, b);
|
||||
return map;
|
||||
}
|
||||
|
||||
private void loadTerrain(MapDefinition map, byte[] buf)
|
||||
{
|
||||
Tile[][][] tiles = map.getTiles();
|
||||
|
||||
InputStream in = new InputStream(buf);
|
||||
|
||||
for (int z = 0; z < Z; z++)
|
||||
{
|
||||
for (int x = 0; x < X; x++)
|
||||
{
|
||||
for (int y = 0; y < Y; y++)
|
||||
{
|
||||
Tile tile = tiles[z][x][y] = new Tile();
|
||||
while (true)
|
||||
{
|
||||
int attribute = in.readUnsignedByte();
|
||||
if (attribute == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if (attribute == 1)
|
||||
{
|
||||
int height = in.readUnsignedByte();
|
||||
tile.height = height;
|
||||
break;
|
||||
}
|
||||
else if (attribute <= 49)
|
||||
{
|
||||
tile.attrOpcode = attribute;
|
||||
tile.overlayId = in.readByte();
|
||||
tile.overlayPath = (byte) ((attribute - 2) / 4);
|
||||
tile.overlayRotation = (byte) (attribute - 2 & 3);
|
||||
}
|
||||
else if (attribute <= 81)
|
||||
{
|
||||
tile.settings = (byte) (attribute - 49);
|
||||
}
|
||||
else
|
||||
{
|
||||
tile.underlayId = (byte) (attribute - 81);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
74
cache/src/main/java/net/runelite/cache/definitions/savers/MapSaver.java
vendored
Normal file
74
cache/src/main/java/net/runelite/cache/definitions/savers/MapSaver.java
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Adam <Adam@sigterm.info>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.cache.definitions.savers;
|
||||
|
||||
import net.runelite.cache.definitions.MapDefinition;
|
||||
import net.runelite.cache.definitions.MapDefinition.Tile;
|
||||
import net.runelite.cache.io.OutputStream;
|
||||
import static net.runelite.cache.region.Region.X;
|
||||
import static net.runelite.cache.region.Region.Y;
|
||||
import static net.runelite.cache.region.Region.Z;
|
||||
|
||||
public class MapSaver
|
||||
{
|
||||
public byte[] save(MapDefinition map)
|
||||
{
|
||||
Tile[][][] tiles = map.getTiles();
|
||||
OutputStream out = new OutputStream();
|
||||
for (int z = 0; z < Z; z++)
|
||||
{
|
||||
for (int x = 0; x < X; x++)
|
||||
{
|
||||
for (int y = 0; y < Y; y++)
|
||||
{
|
||||
Tile tile = tiles[z][x][y];
|
||||
if (tile.attrOpcode != 0)
|
||||
{
|
||||
out.writeByte(tile.attrOpcode);
|
||||
out.writeByte(tile.overlayId);
|
||||
}
|
||||
if (tile.settings != 0)
|
||||
{
|
||||
out.writeByte(tile.settings + 49);
|
||||
}
|
||||
if (tile.underlayId != 0)
|
||||
{
|
||||
out.writeByte(tile.underlayId + 81);
|
||||
}
|
||||
if (tile.height == null)
|
||||
{
|
||||
out.writeByte(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
out.writeByte(1);
|
||||
out.writeByte(tile.height);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return out.flip();
|
||||
}
|
||||
}
|
||||
@@ -25,92 +25,13 @@
|
||||
|
||||
package net.runelite.cache.region;
|
||||
|
||||
import java.util.Objects;
|
||||
import lombok.Value;
|
||||
|
||||
@Value
|
||||
public class Location
|
||||
{
|
||||
private final int id;
|
||||
private final int type;
|
||||
private final int orientation;
|
||||
private final Position position;
|
||||
|
||||
public Location(int id, int type, int orientation, Position position)
|
||||
{
|
||||
this.id = id;
|
||||
this.type = type;
|
||||
this.orientation = orientation;
|
||||
this.position = position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "GamwObject{" + "id=" + id + ", type=" + type + ", orientation=" + orientation + ", position=" + position + '}';
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
int hash = 5;
|
||||
hash = 83 * hash + this.id;
|
||||
hash = 83 * hash + this.type;
|
||||
hash = 83 * hash + this.orientation;
|
||||
hash = 83 * hash + Objects.hashCode(this.position);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
if (this == obj)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (obj == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (getClass() != obj.getClass())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
final Location other = (Location) obj;
|
||||
if (this.id != other.id)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (this.type != other.type)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (this.orientation != other.orientation)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(this.position, other.position))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getType()
|
||||
{
|
||||
return type;
|
||||
}
|
||||
|
||||
public int getOrientation()
|
||||
{
|
||||
return orientation;
|
||||
}
|
||||
|
||||
public Position getPosition()
|
||||
{
|
||||
return position;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
/**
|
||||
* Copyright (c) 2015 Kyle Friz
|
||||
/*
|
||||
* Copyright (c) 2016-2017, Adam <Adam@sigterm.info>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.cache.region;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import net.runelite.cache.io.InputStream;
|
||||
import net.runelite.cache.definitions.LocationsDefinition;
|
||||
import net.runelite.cache.definitions.MapDefinition;
|
||||
import net.runelite.cache.definitions.MapDefinition.Tile;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Kyle Friz
|
||||
* @since Jun 30, 2015
|
||||
*/
|
||||
public class Region
|
||||
{
|
||||
|
||||
@@ -42,7 +42,7 @@ public class Region
|
||||
private final int baseY;
|
||||
|
||||
private final int[][][] tileHeights = new int[Z][X][Y];
|
||||
private final byte[][][] renderRules = new byte[Z][X][Y];
|
||||
private final byte[][][] tileSettings = new byte[Z][X][Y];
|
||||
private final byte[][][] overlayIds = new byte[Z][X][Y];
|
||||
private final byte[][][] overlayPaths = new byte[Z][X][Y];
|
||||
private final byte[][][] overlayRotations = new byte[Z][X][Y];
|
||||
@@ -64,99 +64,66 @@ public class Region
|
||||
this.baseY = y << 6;
|
||||
}
|
||||
|
||||
public void loadTerrain(byte[] buf)
|
||||
public void loadTerrain(MapDefinition map)
|
||||
{
|
||||
InputStream in = new InputStream(buf);
|
||||
|
||||
Tile[][][] tiles = map.getTiles();
|
||||
for (int z = 0; z < Z; z++)
|
||||
{
|
||||
for (int x = 0; x < X; x++)
|
||||
{
|
||||
for (int y = 0; y < Y; y++)
|
||||
{
|
||||
while (true)
|
||||
Tile tile = tiles[z][x][y];
|
||||
|
||||
if (tile.height == null)
|
||||
{
|
||||
int attribute = in.readUnsignedByte();
|
||||
if (attribute == 0)
|
||||
if (z == 0)
|
||||
{
|
||||
if (z == 0)
|
||||
{
|
||||
tileHeights[0][x][y] = -HeightCalc.calculate(baseX + x + 0xe3b7b, baseY + y + 0x87cce) * 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
tileHeights[z][x][y] = tileHeights[z - 1][x][y] - 240;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
else if (attribute == 1)
|
||||
{
|
||||
int height = in.readUnsignedByte();
|
||||
if (height == 1)
|
||||
{
|
||||
height = 0;
|
||||
}
|
||||
|
||||
if (z == 0)
|
||||
{
|
||||
tileHeights[0][x][y] = -height * 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
tileHeights[z][x][y] = tileHeights[z - 1][x][y] - height * 8;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
else if (attribute <= 49)
|
||||
{
|
||||
overlayIds[z][x][y] = in.readByte();
|
||||
overlayPaths[z][x][y] = (byte) ((attribute - 2) / 4);
|
||||
overlayRotations[z][x][y] = (byte) (attribute - 2 & 3);
|
||||
}
|
||||
else if (attribute <= 81)
|
||||
{
|
||||
renderRules[z][x][y] = (byte) (attribute - 49);
|
||||
tileHeights[0][x][y] = -HeightCalc.calculate(baseX + x + 0xe3b7b, baseY + y + 0x87cce) * 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
underlayIds[z][x][y] = (byte) (attribute - 81);
|
||||
tileHeights[z][x][y] = tileHeights[z - 1][x][y] - 240;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int height = tile.getHeight();
|
||||
if (height == 1)
|
||||
{
|
||||
height = 0;
|
||||
}
|
||||
|
||||
if (z == 0)
|
||||
{
|
||||
tileHeights[0][x][y] = -height * 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
tileHeights[z][x][y] = tileHeights[z - 1][x][y] - height * 8;
|
||||
}
|
||||
}
|
||||
|
||||
overlayIds[z][x][y] = tile.getOverlayId();
|
||||
overlayPaths[z][x][y] = tile.getOverlayPath();
|
||||
overlayRotations[z][x][y] = tile.getOverlayRotation();
|
||||
|
||||
tileSettings[z][x][y] = tile.getSettings();
|
||||
underlayIds[z][x][y] = tile.getUnderlayId();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void loadLocations(byte[] b)
|
||||
public void loadLocations(LocationsDefinition locs)
|
||||
{
|
||||
InputStream buf = new InputStream(b);
|
||||
|
||||
int id = -1;
|
||||
int idOffset;
|
||||
|
||||
while ((idOffset = buf.readUnsignedShortSmart()) != 0)
|
||||
for (Location loc : locs.getLocations())
|
||||
{
|
||||
id += idOffset;
|
||||
|
||||
int position = 0;
|
||||
int positionOffset;
|
||||
|
||||
while ((positionOffset = buf.readUnsignedShortSmart()) != 0)
|
||||
{
|
||||
position += positionOffset - 1;
|
||||
|
||||
int localY = position & 0x3F;
|
||||
int localX = position >> 6 & 0x3F;
|
||||
int height = position >> 12 & 0x3;
|
||||
|
||||
int attributes = buf.readUnsignedByte();
|
||||
int type = attributes >> 2;
|
||||
int orientation = attributes & 0x3;
|
||||
|
||||
locations.add(new Location(id, type, orientation, new Position(getBaseX() + localX, getBaseY() + localY, height)));
|
||||
}
|
||||
Location newLoc = new Location(loc.getId(), loc.getType(), loc.getOrientation(),
|
||||
new Position(getBaseX() + loc.getPosition().getX(),
|
||||
getBaseY() + loc.getPosition().getY(),
|
||||
loc.getPosition().getZ()));
|
||||
locations.add(newLoc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,9 +147,9 @@ public class Region
|
||||
return tileHeights[z][x][y];
|
||||
}
|
||||
|
||||
public byte getRenderRule(int z, int x, int y)
|
||||
public byte getTileSetting(int z, int x, int y)
|
||||
{
|
||||
return renderRules[z][x][y];
|
||||
return tileSettings[z][x][y];
|
||||
}
|
||||
|
||||
public int getOverlayId(int z, int x, int y)
|
||||
|
||||
@@ -28,6 +28,10 @@ import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import net.runelite.cache.IndexType;
|
||||
import net.runelite.cache.definitions.LocationsDefinition;
|
||||
import net.runelite.cache.definitions.MapDefinition;
|
||||
import net.runelite.cache.definitions.loaders.LocationsLoader;
|
||||
import net.runelite.cache.definitions.loaders.MapLoader;
|
||||
import net.runelite.cache.fs.Archive;
|
||||
import net.runelite.cache.fs.Index;
|
||||
import net.runelite.cache.fs.Storage;
|
||||
@@ -64,7 +68,9 @@ public class RegionLoader
|
||||
{
|
||||
Region region = this.loadRegionFromArchive(i);
|
||||
if (region != null)
|
||||
{
|
||||
regions.add(region);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,8 +92,10 @@ public class RegionLoader
|
||||
|
||||
byte[] data = map.decompress(storage.loadArchive(map));
|
||||
|
||||
MapDefinition mapDef = new MapLoader().load(x, y, data);
|
||||
|
||||
Region region = new Region(i);
|
||||
region.loadTerrain(data);
|
||||
region.loadTerrain(mapDef);
|
||||
|
||||
int[] keys = keyManager.getKeys(i);
|
||||
if (keys != null)
|
||||
@@ -95,7 +103,8 @@ public class RegionLoader
|
||||
try
|
||||
{
|
||||
data = land.decompress(storage.loadArchive(land), keys);
|
||||
region.loadLocations(data);
|
||||
LocationsDefinition locDef = new LocationsLoader().load(x, y, data);
|
||||
region.loadLocations(locDef);
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
|
||||
@@ -29,14 +29,19 @@ import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import net.runelite.cache.definitions.LocationsDefinition;
|
||||
import net.runelite.cache.definitions.MapDefinition;
|
||||
import net.runelite.cache.definitions.loaders.LocationsLoader;
|
||||
import net.runelite.cache.definitions.loaders.MapLoader;
|
||||
import net.runelite.cache.fs.Archive;
|
||||
import net.runelite.cache.fs.Index;
|
||||
import net.runelite.cache.fs.Storage;
|
||||
import net.runelite.cache.fs.Store;
|
||||
import net.runelite.cache.region.Region;
|
||||
import net.runelite.cache.util.XteaKeyManager;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.TemporaryFolder;
|
||||
@@ -53,9 +58,8 @@ public class MapDumperTest
|
||||
@Rule
|
||||
public TemporaryFolder folder = StoreLocation.getTemporaryFolder();
|
||||
|
||||
private final List<Region> regions = new ArrayList<>();
|
||||
|
||||
//@Test
|
||||
@Test
|
||||
@Ignore
|
||||
public void dumpRaw() throws IOException
|
||||
{
|
||||
File base = StoreLocation.LOCATION,
|
||||
@@ -111,8 +115,9 @@ public class MapDumperTest
|
||||
}
|
||||
}
|
||||
|
||||
private void loadRegions(Store store) throws IOException
|
||||
private Map<MapDefinition, LocationsDefinition> loadRegions(Store store) throws IOException
|
||||
{
|
||||
Map<MapDefinition, LocationsDefinition> mapMap = new HashMap<>();
|
||||
Storage storage = store.getStorage();
|
||||
Index index = store.getIndex(IndexType.MAPS);
|
||||
XteaKeyManager keyManager = new XteaKeyManager();
|
||||
@@ -134,9 +139,8 @@ public class MapDumperTest
|
||||
}
|
||||
|
||||
byte[] data = map.decompress(storage.loadArchive(map));
|
||||
|
||||
Region region = new Region(i);
|
||||
region.loadTerrain(data);
|
||||
MapDefinition mapDef = new MapLoader().load(x, y, data);
|
||||
LocationsDefinition locDef = null;
|
||||
|
||||
int[] keys = keyManager.getKeys(i);
|
||||
if (keys != null)
|
||||
@@ -150,11 +154,13 @@ public class MapDumperTest
|
||||
continue;
|
||||
}
|
||||
|
||||
region.loadLocations(data);
|
||||
locDef = new LocationsLoader().load(x, y, data);
|
||||
}
|
||||
|
||||
regions.add(region);
|
||||
mapMap.put(mapDef, locDef);
|
||||
}
|
||||
|
||||
return mapMap;
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -167,16 +173,20 @@ public class MapDumperTest
|
||||
{
|
||||
store.load();
|
||||
|
||||
loadRegions(store);
|
||||
Map<MapDefinition, LocationsDefinition> regions = loadRegions(store);
|
||||
|
||||
for (Region region : regions)
|
||||
for (Entry<MapDefinition, LocationsDefinition> entry : regions.entrySet())
|
||||
{
|
||||
if (region.getLocations().isEmpty())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
MapDefinition key = entry.getKey();
|
||||
LocationsDefinition value = entry.getValue();
|
||||
|
||||
Files.write(gson.toJson(region).getBytes(), new File(outDir, region.getBaseX() + "_" + region.getBaseY() + ".json"));
|
||||
int x = key.getRegionX();
|
||||
int y = key.getRegionY();
|
||||
Files.write(gson.toJson(key).getBytes(), new File(outDir, "m" + x + "_" + y + ".json"));
|
||||
if (value != null)
|
||||
{
|
||||
Files.write(gson.toJson(value).getBytes(), new File(outDir, "l" + x + "_" + y + ".json"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user