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
| Area | SA-MP | Vital.sandbox |
|---|---|---|
| Open source | No | Yes |
| Base game required | Yes — GTA SA client | No — standalone |
| Licensing | No restrictions | No restrictions |
| Hosting | Self-hosted | Self-hosted |
| Discovery | External master list | External master list |
| Monetization | Your own implementation | Your own implementation |
| Revenue cut | None | None |
| Language | Pawn — compiled, statically typed | Lua — dynamic, first-class functions, closures |
| Maintenance | No updates since 2019 | Actively developed |
| Rendering | GTA SA renderer | Godot 4 — PBR, SDFGI, SSR, SSAO, volumetric fog, glow, full GFX API |
| Physics | GTA SA physics | Godot physics — rigid body, character, vehicle, area, collision shapes, raycast |
| Networking | SA-MP net layer | Built-in sync — net IDs, ISyncable, server-authoritative replication |
| UI | TextDraw only | Native WebView, Canvas 2D, SVG, Render Targets, custom fonts and textures |
| Audio | None built-in | Audio 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 | .COL | Built into GLB |
| Audio formats | None built-in | OGG, WAV, MP3 |
| Database | MySQL/SQLite via plugin | MySQL — core.database with async query API |
| HTTP | Via plugin | util.http — GET/POST, custom headers, timeout |
| File I/O | None built-in | util.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:
| System | SA-MP | Vital.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.yamlper 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.