Skip to main content

Collision System

Hyperscape implements a unified collision system for OSRS-accurate tile blocking. The system handles static objects (trees, rocks, stations), entities (players, NPCs), and terrain (water, slopes) using efficient zone-based storage.

Architecture

CollisionMatrix

The core collision storage uses zone-based chunking for optimal memory and cache performance:
Zone-Based Storage:
  • World divided into 8×8 tile zones
  • Each zone = Int32Array[64] = 256 bytes
  • Lazy allocation (zones created on first write)
  • 1000×1000 tile world = ~4MB memory
Performance:
  • O(1) tile lookups via array indexing
  • Zero allocations in hot paths
  • Bitwise operations for flag queries
  • Delta-based entity moves (only update changed tiles)

Collision Flags

Tiles use bitmask flags for efficient collision queries:

Individual Flags

Combined Masks


Usage Examples

Basic Collision Checks

Adding/Removing Collision

Multi-Tile Footprints

Stations and large resources can occupy multiple tiles:
Footprints are centered on the entity position, not corner-based. This ensures consistent interaction from all sides.

Interaction Range Checks

Players can interact with multi-tile objects from any adjacent tile:

Entity Occupancy

The EntityOccupancyMap tracks entity positions and delegates to CollisionMatrix:
Boss Collision: Bosses can ignore entity collision while still being tracked:

Pathfinding Integration

The pathfinding system checks collision when finding paths:
Pathfinding uses BLOCKS_WALK mask (excludes OCCUPIED flags) so entities can path through other entities. Collision is checked at movement execution time.

Network Synchronization

Collision data is synchronized from server to client using zone serialization:
Serialization Format:
  • Zone data = Int32Array[64] = 256 bytes
  • Base64 encoded for network transport (~344 chars)
  • Only allocated zones are sent (sparse data)

Automatic Footprint Detection

Station and resource footprints are automatically calculated from 3D model bounds:

Build-Time Extraction

Process:
  1. Scans world/assets/models/**/*.glb files
  2. Parses glTF position accessor min/max values
  3. Calculates bounding boxes at scale 1.0
  4. Writes to world/assets/manifests/model-bounds.json
Example Output:

Runtime Calculation

StationDataProvider combines model bounds with modelScale from stations.json:
Benefits:
  • No manual footprint configuration
  • Footprints stay in sync with 3D models
  • Turbo caching avoids rebuilding when models unchanged
  • Override available via footprint field in stations.json

OSRS Accuracy

Depleted Resources

Resources remain solid even when depleted (OSRS behavior):

Safespotting

Players can use trees and rocks as obstacles to avoid melee combat:

Multi-Tile Interaction

Players can interact with multi-tile objects from any adjacent tile:

Performance Characteristics

Memory Footprint

Hot Path Performance


API Reference

CollisionMatrix

EntityOccupancyMap

Utility Functions


Implementation Details

Zone Coordinate Calculation

Negative coordinates are handled correctly using Math.floor for zone calculation and corrected modulo for tile index.

Atomic Entity Moves

Entity moves update collision atomically with delta optimization:

Testing

The collision system includes comprehensive unit tests:
Test Coverage:
  • Zone allocation and storage
  • Flag operations (add, remove, query)
  • Negative coordinate handling
  • Directional wall blocking
  • Diagonal movement clipping
  • Network serialization
  • Multi-tile footprints

Tile Movement

Tile-based movement, pathfinding, and distance calculations.

Manifests

Model bounds extraction and station configuration.

Combat System

Combat range checks and line of sight.

NPC AI

Mob pathfinding and aggro behavior.