Arsitektur
Bagaimana engine berlapis dan kenapa gameplay tetap di gamemode.
Prinsip desain
- Core bebas transport — core engine mengekspos API deterministik
HandlePacket/Tick, sehingga bisa diuji tanpa socket. - Satu socket UDP — satu
net.ListenPacketmemisahkan peer berdasarkan alamat. - Lapisan reliability terisolasi — tiap peer punya koneksi RakNet sendiri: nomor urut, kanal ordering, dedup, antrean resend, dan fragmentasi.
- Tanpa kebijakan gameplay di core — core melaporkan fakta; gamemode memutuskan.
Lapisan
text
Klien (SA-MP 0.3.7 / 0.3.DL)
│ UDP
▼
raknet transport, cookie, ACK/ordering, fragmentasi
│
▼
samp/protocol encode/decode RPC, struct sync, InitGame
│
▼
server peer, pool dunia, streaming, dispatch event
│
▼
runtime evaluator AST Knight + tabel native
│
▼
gamemode (.sa) callback + native = gameplay
Alur event chat
text
klien → RPC_Chat (101)
→ protocol.ParseChat
→ runtime.OnPlayerText(playerid, text)
jika handler ada dan return false → berhenti
→ selain itu broadcast ke semua klien
Streaming
Pemain, kendaraan, objek, label, dan pickup di-stream berdasarkan jarak. Radius stream berasal dari streamdistance di server.cfg dan dapat diubah saat runtime.
Konkurensi
Pemrosesan paket single-threaded per tick, jadi state dunia tidak butuh lock. Pekerjaan database berjalan di goroutine worker dan mengirim hasil kembali ke tick loop, tempat callback gamemode dipanggil.
Note
Itulah sebabnya callback database dan timer berjalan di loop utama: kode gamemode tidak pernah dieksekusi bersamaan.