Migrating from SA-MP

Moving a San Andreas Multiplayer server to Vital.sandbox

Overview

SA-MP is a multiplayer modification for GTA San Andreas. Its scripting language is Pawn — a compiled, statically typed language designed for embedded use. SA-MP has not received updates since 2019.

Vital.sandbox is a standalone platform with no dependency on GTA SA or its assets. Vital.sandbox uses Lua — dynamically typed, first-class functions, closures, and threads. Asset formats, the resource system, and scripting patterns differ from SA-MP.


Platform comparison

AreaSA-MPVital.sandbox
Open sourceNoYes
Base game requiredYes — GTA SA clientNo — standalone
LicensingNo restrictionsNo restrictions
HostingSelf-hostedSelf-hosted
DiscoveryExternal master listExternal master list
MonetizationYour own implementationYour own implementation
Revenue cutNoneNone
LanguagePawn — compiled, statically typedLua — dynamic, first-class functions, closures
MaintenanceNo updates since 2019Actively developed
RenderingGTA SA rendererGodot 4 — PBR, SDFGI, SSR, SSAO, volumetric fog, glow, full GFX API
PhysicsGTA SA physicsGodot physics — rigid body, character, vehicle, area, collision shapes, raycast
NetworkingSA-MP net layerBuilt-in sync — net IDs, ISyncable, server-authoritative replication
UITextDraw onlyNative WebView, Canvas 2D, SVG, Rendertargets, custom fonts and textures
AudioNone built-inAudio 2D + Audio 3D — spatial attenuation, pitch, FX chain
Model formats.DFF (RenderWare)GLB
Texture formats.TXD (RenderWare)JPG, PNG, WEBP, BMP, DDS, KTX, EXR
Collision formats.COLBuilt into GLB
Audio formatsNone built-inOGG, WAV, MP3
DatabaseMySQL/SQLite via pluginMySQL — core.database with async query API
HTTPVia pluginutil.http — GET/POST, custom headers, timeout
File I/ONone built-inutil.file — read, write, hash, delete

What carries over

Pawn must be fully rewritten in Lua. There is no transpiler. The logic and systems you have built translate once you understand the equivalent APIs:

SystemSA-MPVital.sandbox
Events• OnPlayerConnect
• OnVehicleDeath
• (and other callbacks)
• util.event.on
• util.event.off
• util.event.emit
• util.event.emit_callback
Timers• SetTimer
• SetTimerEx
• KillTimer
• util.timer.create
• util.timer.next_tick
HTTP• Via plugin• util.http.get
• util.http.post
Database• MySQL/SQLite via plugin• core.database.create
• core.database_query.select
• core.database_query.insert
• core.database_query.update
• core.database_query.delete
• core.database_query.fetch
• core.database_query.execute
3D Models• CreateObject
• MoveObject
• DestroyObject
• core.model.load
• core.model.unload
• core.model.create
Vehicles• CreateVehicle
• (and callbacks)
• physics.vehicle_body.create
• physics.vehicle_wheel.create
UI• TextDraw only• core.webview.create
• core.svg.create
• core.svg.create_from_raw
Audio• None built-in• core.audio_2d.create
• core.audio_3d.create
Images• None built-in• core.image.create
File I/O• None built-in• util.file.read
• util.file.write
• util.file.exists
• util.file.delete
• util.file.hash
• util.file.size
• util.file.contents
Networking• SA-MP sync layer• core.engine.get_entity_by_net_id
Async scripting• Callback-based only• util.thread.create
• util.thread.current
• util.promise.create

What does not carry over

  • GTA San Andreas assets — map, vehicles, weapons, peds, interiors. You need your own assets in supported formats.
  • Pawn code — must be fully rewritten in Lua. There is no automated migration path.
  • SA-MP filterscripts and gamemodes — Vital.sandbox uses manifest.yaml per resource with a different structure.
  • GTA-SA specific APIs — ped animation sets, weapon pickups, wanted level, and anything that addresses the GTA binary directly. These have no equivalent.
  • Built-in game world — there is no world loaded by default. Map, terrain, and environment are your own assets.

On this page