forked from openrs2/openrs2
parent
f099972bee
commit
b3b46bee1a
@ -0,0 +1,111 @@ |
|||||||
|
# Coordinate system |
||||||
|
|
||||||
|
## Summary |
||||||
|
|
||||||
|
| Name | Levels | Width (tiles) | Height (tiles) | |
||||||
|
|------------------------|-------:|--------------:|---------------:| |
||||||
|
| World | 4 | 16384 | 16384 | |
||||||
|
| Area | 1 or 4 | 104 | 104 | |
||||||
|
| MapSquare | 4 | 64 | 64 | |
||||||
|
| MapSquare (underwater) | 1 | 64 | 64 | |
||||||
|
| Viewport (?) | 1 | 32 | 32 | |
||||||
|
| Zone | 1 | 8 | 8 | |
||||||
|
|
||||||
|
## Introduction |
||||||
|
|
||||||
|
RuneScape is a three-dimensional tile-based world. The entire world is made up |
||||||
|
of 16384x16384 tiles on 4 levels of elevation (ranging from `0` to `3` |
||||||
|
inclusive), including the ground level. The X and Z axes range from `0` to |
||||||
|
`16383` inclusive. |
||||||
|
|
||||||
|
The Y axis represents the level of elevation, with `0` representing ground |
||||||
|
level. The X and Z axes represent coordinates on the plane - when the world map |
||||||
|
or mini map is plotted in two dimensions, the X axis is the horizontal axis |
||||||
|
(with X increasing from left to right), and the Z axis is the vertical axis |
||||||
|
(with Z increasing from bottom to top). |
||||||
|
|
||||||
|
## Map squares |
||||||
|
|
||||||
|
The world is split into map squares, each of which contains 64x64 tiles across |
||||||
|
4 levels. Map squares are the granularity of the maps stored in the client's |
||||||
|
cache. |
||||||
|
|
||||||
|
Each map square has up to five files in the client's cache: |
||||||
|
|
||||||
|
| File name | Name | Description | |
||||||
|
|-----------|-----------------|-----------------------------------------------------------------------| |
||||||
|
| `mX_Z` | Map | Contains floor underlays, overlays, tile heights and flags | |
||||||
|
| `lX_Z` | Locs | Contains locs (walls, wall decoration, scenery and ground decoration) | |
||||||
|
| `umX_Z` | Underwater map | Contains underwater equivalent of the map file | |
||||||
|
| `ulX_Z` | Underwater locs | Contains underwater equivalent of the locs file | |
||||||
|
| `nX_Z` | NPC spawns | Contains NPC spawns for the animated login screen | |
||||||
|
|
||||||
|
The underwater files contain a single virtual `-1` level used to represent the |
||||||
|
tiles and locs that can be seen beneath translucent water tiles in HD mode. The |
||||||
|
server does not interact with this level, it purely exists for decorative |
||||||
|
purposes. |
||||||
|
|
||||||
|
The X and Z coordinates of a map are the coordinates of the origin tile divided |
||||||
|
by 64. Internally, the client combines these two values into a single ID by |
||||||
|
calculating `(X << 8) | Z`. |
||||||
|
|
||||||
|
## Zones |
||||||
|
|
||||||
|
Each map square is split into zones, each of which contains 8x8 tiles across a |
||||||
|
single level. Zones are the granularity used for most packets that interact with |
||||||
|
the world - for example, spawning locs and obj stacks. An entire zone may be |
||||||
|
reset and populated with dynamic locs and obj stacks in one packet. |
||||||
|
|
||||||
|
Zones are also the granularity used to build instances, such as player-owned |
||||||
|
houses. |
||||||
|
|
||||||
|
The left-hand side of the world (for tiles ranging from X=0 to X=6399 inclusive) |
||||||
|
is used for the static map squares stored in the cache. The right-hand side of |
||||||
|
the world (for tiles from X=6400 above) is used for instances, which are |
||||||
|
dynamically constructed by copying zones from the left side of the world and |
||||||
|
moving/rotating them. |
||||||
|
|
||||||
|
## Dungeons |
||||||
|
|
||||||
|
Dungeons are typically, but not always, 6400 Z units above the equivalent |
||||||
|
ground-level areas. 6400 was likely chosen as this corresponds to 100 map |
||||||
|
squares, meaning a single `1` digit needs to be added to or removed from the |
||||||
|
map's file name to switch between ground level and the corresponding dungeon. |
||||||
|
|
||||||
|
## Area |
||||||
|
|
||||||
|
The area represents the 104x104 group of tiles (or 13x13 group of zones) held in |
||||||
|
the client's memory. Depending on its settings, the client only retains the |
||||||
|
player's current level or retains all four levels. |
||||||
|
|
||||||
|
The area is always zone-aligned. When the area is initially built, it is centred |
||||||
|
around the player's current zone. |
||||||
|
|
||||||
|
When the player is within 16 tiles of the edge of the current area, it is |
||||||
|
rebuilt. |
||||||
|
|
||||||
|
## Viewport |
||||||
|
|
||||||
|
The viewport (note: unlike the other names in this document, we do not know the |
||||||
|
official Jagex name) is the 32x32 group of tiles, always centred around the |
||||||
|
current player, within which other players and NPCs are visible. Players can |
||||||
|
only see other players and NPCs on the same level as them. |
||||||
|
|
||||||
|
## Coordinates |
||||||
|
|
||||||
|
When used in a script, the coordinates of a tile are packed into a 32-bit |
||||||
|
integer as follows: |
||||||
|
|
||||||
|
| **Field** | (unused) | Level | X | Z | |
||||||
|
|-----------|----------|------:|---:|---:| |
||||||
|
| **Bits** | 2 | 2 | 14 | 14 | |
||||||
|
|
||||||
|
The two unused bits are set to zero. |
||||||
|
|
||||||
|
Literals in scripts are represented with the X and Z coordinates split into the |
||||||
|
map coordinates and the local coordinates within each map: |
||||||
|
`<level>_<map_x>_<map_z>_<x>_<z>`. For example, (0, 3094, 3107) is written as |
||||||
|
`0_48_48_22_35` in a script. |
||||||
|
|
||||||
|
The teleport command uses a similar syntax: |
||||||
|
`::tele <level>,<map_x>,<map_z>,<x>,<z>`. |
Loading…
Reference in new issue