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, coroutines, and closures. 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, Render Targets, 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
EventsOnPlayerConnect
OnVehicleDeath
(and other callbacks)
util.event.on
util.event.off
util.event.emit
util.event.emit_callback
TimersSetTimer
SetTimerEx
KillTimer
util.timer.create
util.timer.next_tick
HTTP• Via pluginutil.http.get
util.http.post
Database• MySQL/SQLite via plugincore.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 ModelsCreateObject
MoveObject
DestroyObject
core.model.load
core.model.unload
core.model.create
VehiclesCreateVehicle
(and callbacks)
physics.vehicle_body.create
physics.vehicle_wheel.create
UI• TextDraw onlycore.webview.create
core.svg.create
core.svg.create_from_raw
Audio• None built-incore.audio_2d.create
core.audio_3d.create
Images• None built-incore.image.create
File I/O• None built-inutil.file.read
util.file.write
util.file.exists
util.file.delete
util.file.hash
util.file.size
util.file.contents
Networking• SA-MP sync layercore.engine.get_entity_by_net_id
Async scripting• Callback-based onlyutil.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