Open-source multiplayer game server compatible with the RuneScape client https://www.openrs2.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
openrs2/share/doc/coordinate-system.md

4.9 KiB

Coordinate system

Summary

Name Levels Width (tiles) Height (tiles)
World 4 16,384 16,384
BuildArea 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 16,384x16,384 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 16,383 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 two packets.

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, 6,400 Z units above the equivalent ground-level areas. 6,400 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.

Build area

The build 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 build 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 build 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>.