Daftar Isi
Oke, mari selami lebih dalam dunia framework FiveM. Memilih fondasi yang tepat untuk server roleplay Anda sangat penting, dan bisa jadi terasa membingungkan dengan beberapa opsi matang yang tersedia. Artikel ini bertujuan untuk menguraikan pilihan yang paling populer: ESX (dan versi lamanya), qbCore, QBOX yang lebih baru, dan Framework ND yang berfokus pada kinerja.
Kami akan melihat filosofi, fitur, pengalaman pengembangan, performa, dan dukungan komunitas mereka untuk membantu Anda membuat keputusan yang tepat. Ingat, jarang ada satu kerangka kerja "terbaik" – ini tentang menemukan yang paling cocok untuk milikmu kebutuhan proyek dan keahlian tim Anda.
Lanskap Kerangka Kerja FiveM yang Terus Berkembang
FiveM, kerangka modifikasi multipemain untuk Grand Theft Auto V, menyediakan kanvas, tetapi kerangka server menyediakan kuas dan cat. Mereka menawarkan fungsionalitas inti yang dibutuhkan untuk server permainan peran: manajemen identitas, sistem inventaris, pekerjaan, ekonomi, perumahan, kendaraan, dan logika mendasar yang menghubungkan semuanya.
Selama bertahun-tahun, berbagai kerangka kerja telah muncul, masing-masing dibangun berdasarkan pelajaran yang dipelajari dari pendahulunya atau mengambil pendekatan yang sama sekali baru. Mari kita bahas pesaing utamanya.
1. ESX (EssentialMode Diperpanjang) – Sang Veteran
- Link: Warisan ESX GitHub (Catatan: ESX Original sebagian besar sudah ditinggalkan dan digantikan dengan Legacy)
Sejarah dan Filsafat:
ESX, khususnya ESX Legacy saat ini, merupakan salah satu framework tertua dan paling banyak diadopsi. Terlahir dari EssentialMode asli, framework ini bertujuan untuk menyediakan serangkaian fitur RP yang komprehensif. Filosofinya sebagian besar adalah tentang menyediakan semuanya diperlukan untuk memulai server RP, yang mengarah ke ekosistem skrip yang luas. ESX Legacy adalah upaya yang digerakkan oleh komunitas untuk memodernisasi dan memelihara basis kode ESX, mengatasi banyak masalah dari versi lama (seperti v1 final, 1.2, dll.).
Fitur Inti & Kekuatan:
- Ekosistem Skrip Besar-besaran: Karena sejarah dan popularitasnya yang panjang, Anda dapat menemukan skrip siap pakai untuk hampir semua hal yang dapat dibayangkan yang kompatibel dengan ESX (meskipun kualitasnya sangat bervariasi). Ini adalah keuntungan terbesarnya bagi pemilik server yang lebih menyukai solusi siap pakai.
- Keakraban: Banyak pengembang FiveM yang menguasai ESX. Menemukan pengembang yang familier dengan strukturnya akan lebih mudah.
- Kaya Fitur (Siap Pakai): Legacy mencakup banyak fitur RP standar seperti pekerjaan, inventaris (esx_inventoryhud atau lainnya), penagihan, manajemen masyarakat, kebutuhan dasar (lapar/haus), dll.
- Pengembangan Warisan Aktif: Tim ESX Legacy secara aktif berupaya meningkatkan kinerja, memperbaiki bug, dan menambahkan fitur ke inti.
Pengalaman Pengembangan & Struktur Kode:
ESX secara tradisional sangat bergantung pada panggilan balik sisi server dan pemicu peristiwa klien/server. Manajemen data sering kali melibatkan kueri basis data langsung dalam logika sumber daya, meskipun Legacy telah membuat langkah maju dalam memusatkan beberapa fungsi.
- Objek Global: The
Bahasa Inggris ESX
objek global (sisi klien dan server) adalah cara utama untuk berinteraksi dengan fungsi kerangka kerja (misalnya,ESX.DapatkanDataPemain()
,ESX.TampilkanPemberitahuan()
). - Panggilan balik:
Panggilan Balik ESX.RegisterServer
danPanggilan Balik Server Pemicu
penting untuk permintaan data klien-server. - Gaya Prosedural: Ketika kamu Bisa menulis kode OOP, sebagian besar ekosistem ESX dan fungsi inti yang ada mengikuti gaya Lua yang lebih prosedural.
Contoh: Memberikan Uang kepada Pemain (ESX Legacy sisi server)
-- Dengan asumsi Anda memiliki sumber atau pengenal pemain (misalnya, objek xPlayer) -- Metode 1: Menggunakan objek xPlayer secara langsung (lebih disukai dalam versi ESX yang lebih baru) RegisterCommand('givemoneyesx', function(source, args, rawCommand) local targetPlayerId = tonumber(args[1]) local amount = tonumber(args[2]) if targetPlayerId and amount and amount > 0 then local xPlayer = ESX.GetPlayerFromId(targetPlayerId) if xPlayer then xPlayer.addMoney(amount) -- Menambahkan ke akun 'uang' default -- Atau tentukan akun: xPlayer.addAccountMoney('bank', amount) TriggerClientEvent('esx:showNotification', source, 'Gave $' .. amount .. ' to player ' .. targetPlayerId) TriggerClientEvent('esx:showNotification', targetPlayerId, 'Anda menerima $' .. amount) else TriggerClientEvent('esx:showNotification', source, 'Pemain tidak ditemukan.') end else TriggerClientEvent('esx:showNotification', source, 'Penggunaan: /givemoneyesx [player_id] [jumlah]') end end, true) -- true menjadikannya hanya admin (memerlukan pengaturan izin ESX) -- Metode 2: Memicu suatu peristiwa (lebih umum dalam skrip lama, masih berfungsi) -- Ini kurang umum sekarang untuk tindakan inti seperti uang, tetapi menggambarkan pola peristiwa -- TriggerServerEvent('esx:addInventoryItem', targetPlayerId, 'money', amount) -- Contoh jika uang adalah suatu item
Pertunjukan:
Versi ESX yang lebih lama (sebelum Legacy) terkenal karena masalah kinerja, yang sering kali berasal dari panggilan basis data yang tidak efisien, loop yang tidak dioptimalkan dengan baik, dan banyaknya skrip yang terakumulasi. ESX Legacy telah meningkatkan hal ini secara signifikan, mengoptimalkan fungsi inti dan interaksi basis data. Namun, kinerja masih sangat bergantung pada kualitas skrip pihak ketiga yang Anda instal. Skrip yang dikodekan dengan buruk dapat melumpuhkan kerangka kerja apa pun.
Potensi Kekurangan:
- Bagasi Warisan: Meskipun ditingkatkan, beberapa pola desain lama masih dapat membuat pengembangan terasa kurang modern dibandingkan dengan kerangka kerja yang lebih baru.
- Varians Kualitas Naskah: Banyaknya skrip berarti banyak yang sudah ketinggalan zaman, tidak aman, atau kurang optimal. Diperlukan pemeriksaan yang cermat.
- Kendala Basis Data: Jika tidak hati-hati, panggilan basis data sinkron yang sering (meskipun berkurang di Legacy) masih dapat menjadi hambatan saat beban berat.
Sasaran Pemirsa:
Pemilik server yang menginginkan pilihan skrip siap pakai terluas, komunitas dengan pengetahuan pengembangan ESX yang ada, atau mereka yang bermigrasi dari versi ESX lama.
2. Kerangka qbCore – Pendekatan Terstruktur

- Link: Kerangka qbCore
Sejarah dan Filsafat:
qbCore (atau QBCore) muncul sebagai alternatif populer untuk ESX, dengan fokus pada pendekatan pengembangan yang lebih terstruktur, terorganisasi, dan (bisa dibilang) modern. QbCore diciptakan oleh KASHARKO dan sekarang dikelola oleh komunitas qbCore dan pengembang utama seperti AJ. Filosofinya berpusat pada penyediaan inti yang solid dan memperhatikan kinerja dengan fungsi yang terdefinisi dengan baik dan mendorong cara yang lebih terstandarisasi dalam mengembangkan sumber daya. QbCore bertujuan untuk mengoptimalkan dan memudahkan penggunaan bagi pengembang yang familier dengan strukturnya.
Fitur Inti & Kekuatan:
- Struktur Terorganisasi: qbCore mempromosikan struktur folder dan konvensi penamaan yang jelas, membuat proyek lebih mudah dinavigasi.
- Fokus Kinerja: Sejak awal, qbCore bertujuan untuk menjadi lebih ringan dan lebih cepat daripada versi ESX yang lebih lama, sering menggunakan loop yang dioptimalkan, kantong status, dan lebih sedikit panggilan basis data sinkron.
- Fitur Inti Terintegrasi: Dilengkapi dengan seperangkat fitur inti tangguh yang sering dianggap penting untuk RP (inventaris, multi-karakter, pekerjaan, geng, cangkang perumahan, kendaraan, bukti, dsb.), yang sering dirancang untuk bekerja secara kohesif.
- Objek dan Fungsi Pemain: Memberikan gambaran yang komprehensif
Pemain
objek sisi server danQBCore.Fungsi.DapatkanDataPemain()
sisi klien, merangkum data pemain dan tindakan umum. - Pengembangan Aktif & Komunitas: Memiliki tim pengembangan yang sangat aktif dan komunitas yang besar dan membantu (terutama di Discord).
Pengalaman Pengembangan & Struktur Kode:
qbCore menekankan penggunaan fungsi dan peristiwa yang disediakannya. Ia lebih condong ke arah mengakses data pemain melalui objek Pemain daripada pencarian basis data langsung dalam skrip. Ia memanfaatkan kantong status secara ekstensif untuk menyinkronkan data.
- Objek Global:
QBCore
(klien dan server) danPemain
objek (sisi server) adalah pusat. - Fungsi:
Fungsi QBCore
menyediakan banyak fungsi utilitas (notifikasi, panggilan balik, akses data pemain, dll.).Fungsi Pemain
tabel berisi metode untuk mengubah objek pemain tertentu (misalnya,Pemain.Fungsi.TambahUang
,Pemain.Fungsi.AddItem
). - Acara: Peristiwa klien/server standar digunakan, sering kali mengikuti konvensi penamaan seperti
QBCore:Klien:Pemberitahuan
atauQBCore:Server:PerbaruiPemain
. - Panggilan balik: Menggunakan sistem panggilan balik yang mirip dengan ESX (
QBCore.Fungsi.BuatPanggilanBalik
,QBCore.Fungsi.PemicuPanggilanBalik
).
Contoh: Memberikan Uang kepada Pemain (qbCore sisi Server)
-- Metode 1: Menggunakan Fungsi Pemain (Disarankan) QBCore.Commands.Add("givemoneyqb", "Berikan uang kepada pemain (Hanya Admin)", {{name="id", help="ID Server Pemain"}, {name="moneytype", help="Jenis uang (tunai, bank)"}, {name="amount", help="Jumlah yang akan diberikan"}}, true, function(source, args) local targetPlayer = QBCore.Functions.GetPlayer(tonumber(args[1])) local moneyType = string.lower(args[2]) local amount = tonumber(args[3]) if not targetPlayer then TriggerClientEvent('QBCore:Notify', source, "Pemain tidak online.", "error") return end if not amount or amount <= 0 then TriggerClientEvent('QBCore:Notify', source, "Jumlah tidak valid.", "error") return end if moneyType ~= "cash" dan moneyType ~= "bank" lalu TriggerClientEvent('QBCore:Notify', source, "Jenis uang tidak valid (gunakan 'cash' atau 'bank').", "error") return end -- Gunakan Fungsi Pemain untuk menambahkan uang targetPlayer.Functions.AddMoney(moneyType, amount, "admin-gave-money") -- Argumen terakhir adalah alasan opsional untuk log TriggerClientEvent('QBCore:Notify', source, "Memberikan $" .. amount .. " (" .. moneyType .. ") kepada pemain " .. targetPlayer.PlayerData.charinfo.firstname .. " " .. targetPlayer.PlayerData.charinfo.lastname .. " (ID: " .. targetPlayer.PlayerData.citizenid .. ")", "success") TriggerClientEvent('QBCore:Notify', targetPlayer.PlayerData.source, "Anda menerima $" .. amount .. " (" .. moneyType .. ").", "success") end, "admin") -- Batasi perintah ke grup ACE 'admin' -- Metode 2: Alternatif (kurang umum untuk uang langsung, mungkin lebih umum untuk item) -- Dapat melibatkan pemicuan peristiwa yang didengarkan oleh sistem inventaris, -- tetapi untuk hal-hal inti seperti uang, Fungsi Pemain adalah standar. -- Contoh: TriggerServerEvent('QBCore:Server:AddItem', targetPlayer.PlayerData.source, "money_bag", amount) -- Jika uang adalah item
Pertunjukan:
Secara umum dianggap berkinerja baik, terutama jika dibandingkan dengan ESX yang lebih lama. Fokusnya pada fungsi inti yang dioptimalkan dan memanfaatkan fitur FiveM seperti tas status membantu mengurangi beban server. Seperti halnya kerangka kerja lainnya, kinerja sangat bergantung pada kualitas dan kuantitas skrip yang ditambahkan. NUI yang ditulis dengan buruk atau pemicu peristiwa yang sering dan berat dalam skrip khusus masih dapat menyebabkan masalah.
Potensi Kekurangan:
- Kurva Pembelajaran: Pengembang yang berasal dari ESX mungkin memerlukan waktu untuk menyesuaikan diri dengan cara qbCore dalam melakukan sesuatu (Objek pemain, fungsi spesifik, struktur).
- Ekosistem Skrip: Meskipun berkembang dengan cepat, jumlah tersedia untuk umum, skrip qbCore berkualitas tinggi masih lebih kecil daripada pustaka ESX yang luas. Banyak skrip populer sering dikonversi atau memerlukan konversi dari ESX.
- Desain Berpendapat: qbCore memiliki cara-cara tertentu yang diharapkannya untuk melakukan sesuatu. Meskipun hal ini meningkatkan konsistensi, hal ini dapat terasa membatasi bagi pengembang yang lebih menyukai kebebasan atau pola yang berbeda.
Sasaran Pemirsa:
Pemilik server yang mencari kerangka kerja yang terstruktur dan berorientasi pada kinerja dengan serangkaian fitur inti yang bagus. Tim yang menghargai organisasi dan bersedia beradaptasi dengan pola pengembangan qbCore. Sering kali disukai oleh server yang menargetkan jumlah pemain lebih banyak di mana kinerja sangat penting.
3. QBOX – Evolusi Modern

- Link: Kerangka Kerja QBOX GitHub (Catatan: Nama mungkin sedikit berbeda, periksa organisasi Qbox-Project)
Sejarah dan Filsafat:
QBOX adalah kerangka kerja yang relatif baru yang dibangun berdasarkan konsep qbCore tetapi bertujuan untuk mencapai modularitas, kinerja, dan praktik pengembangan modern yang lebih baik. Kerangka kerja ini sering dianggap sebagai penerus atau versi yang lebih disempurnakan dari ide-ide qbCore, yang dikembangkan oleh beberapa individu yang sebelumnya bekerja di qbCore dan pengembang berpengalaman lainnya. Filosofinya menekankan kode yang bersih, kemampuan pengujian, manajemen status yang lebih baik, dan memanfaatkan fitur Lua modern serta kemampuan FiveM.
Fitur Inti & Kekuatan:
- Modularitas: Dirancang dengan penekanan kuat pada pemisahan sumber daya. Fungsionalitas inti sering dipecah menjadi paket-paket yang lebih kecil dan independen.
- Pertunjukan: Melanjutkan fokus pada kinerja, sering kali menyempurnakan pendekatan qbCore dan berpotensi menggunakan manajemen status atau strategi penyelenggaraan acara yang berbeda.
- Praktik Modern: Mendorong OOP (Pemrograman Berorientasi Objek) jika sesuai, memanfaatkan fitur Lua yang lebih baru, dan dapat terintegrasi lebih baik dengan alat pembangunan atau TypeScript (tergantung pada sumber daya komunitas).
- Peningkatan Pengalaman Pengembang (Berpotensi): Bertujuan untuk menyediakan API yang lebih jelas, dokumentasi yang lebih baik (meskipun terkadang kerangka kerja yang lebih baru tertinggal di sini pada awalnya), dan kemungkinan siklus pengembangan yang lebih cepat setelah terbiasa.
- Pengembangan Aktif: Karena lebih baru, biasanya memiliki tim pengembangan inti yang sangat aktif mendorong pembaruan dan fitur.
Pengalaman Pengembangan & Struktur Kode:
QBOX sering kali memperkenalkan API dan pola yang sedikit berbeda dibandingkan dengan qbCore, meskipun konsep dasarnya serupa. QBOX mungkin lebih bergantung pada injeksi dependensi, pola berorientasi objek, atau pilihan pustaka tertentu.
- Struktur API: Harapkan konvensi penamaan dan tanda tangan fungsi yang berpotensi berbeda dibandingkan dengan qbCore. Mungkin memiliki lebih banyak struktur berbasis kelas.
- Manajemen Negara: Mungkin menggunakan strategi yang berbeda untuk sinkronisasi status daripada qbCore, berpotensi menawarkan kontrol yang lebih terperinci atau karakteristik kinerja yang berbeda.
- Acara: Meskipun masih menggunakan acara FiveM, konvensi atau pengendali acara inti mungkin berbeda.
Contoh: Memberikan Uang kepada Pemain (QBOX sisi Server – Contoh Hipotetis)
Penafian: Spesifikasi API QBOX dapat berubah. Ini adalah contoh yang masuk akal berdasarkan filosofinya, tetapi selalu lihat dokumentasi resmi QBOX.
-- QBOX mungkin menggunakan pencari layanan atau pola injeksi ketergantungan -- Atau mungkin masih memiliki objek global seperti QBX atau yang serupa. -- Dengan asumsi struktur perintah dan konsep objek pemain yang sama untuk singkatnya: QBX.Commands.Add("givemoneyqbx", "Berikan uang kepada pemain (Hanya Admin)", {{name="id", help="ID Server Pemain"}, {name="akun", help="Nama akun (misalnya, 'tunai', 'bank')"}, {name="jumlah", help="Jumlah yang akan diberikan"}}, true, function(source, args) local targetPlayerId = tonumber(args[1]) local accountName = string.lower(args[2]) local amount = tonumber(args[3]) -- QBOX mungkin memiliki Layanan Pemain atau Manajer khusus local PlayerService = exports.qbx_core:GetModule("PlayerService") -- Contoh akses modul local targetPlayer = PlayerService:GetPlayer(targetPlayerId) if not targetPlayer then -- Dengan asumsi sistem notifikasi ada, mungkin melalui NotificationService local Notify = exports.qbx_core:GetModule("Beritahu") Beri tahu.Kirim(sumber, "Pemain tidak online.", "kesalahan") kembalikan akhir jika bukan jumlah atau jumlah <= 0 maka lokal Beri tahu = exports.qbx_core:GetModule("Beritahu") Beri tahu.Kirim(sumber, "Jumlah tidak valid.", "kesalahan") kembalikan akhir -- Mengakses keuangan pemain mungkin melalui komponen atau layanan khusus lokal sukses, alasan = targetPlayer:AddMoney(namaakun, jumlah, "hibah_admin") -- Metode mungkin langsung berada di objek pemain lokal Beri tahu = exports.qbx_core:GetModule("Beritahu") jika berhasil maka Beri tahu.Kirim(sumber, string.format("Memberikan $%d (%s) ke %s", jumlah, namaakun, targetPlayer:GetName()), "berhasil") -- Dengan asumsi GetName() ada Beri tahu.Kirim(targetPlayer:GetSource(), string.format("Anda menerima $%d (%s)", amount, accountName), "success") -- Dengan asumsi GetSource() ada, jika tidak Notify.Send(source, string.format("Gagal memberikan uang: %s", alasan atau "Kesalahan tidak diketahui"), "error") end end, "admin")
Pertunjukan:
Bertujuan untuk memiliki kinerja tinggi, berpotensi melampaui qbCore dengan menyempurnakan metodenya, lebih mengoptimalkan pengelolaan status, dan mendorong praktik pengodean yang lebih baik melalui strukturnya. Klaim tolok ukur sering kali memposisikannya dengan baik, tetapi kinerja di dunia nyata bergantung pada pengaturan server secara keseluruhan.
Potensi Kekurangan:
- Kebaruan: Menjadi lebih baru berarti komunitasnya lebih kecil (meskipun berkembang) dan dokumentasinya mungkin kurang komprehensif atau lebih sedikit tutorial yang tersedia dibandingkan dengan ESX atau qbCore.
- Ekosistem Skrip: Pustaka skrip khusus QBOX yang tersedia untuk umum adalah yang terkecil dari tiga yang telah dibahas sejauh ini. Konversi dari ESX atau qbCore sering kali diperlukan.
- Stabilitas API: Sebagai kerangka kerja yang lebih baru, API inti mungkin berubah lebih sering dibandingkan kerangka kerja yang lebih mapan, sehingga mengharuskan pengembang untuk selalu memperbarui informasi.
- Kurva Pembelajaran: Memerlukan adaptasi terhadap pola-pola yang berpotensi baru, terutama jika menggunakan lebih banyak desain OOP atau modular.
Sasaran Pemirsa:
Pengembang dan pemilik server yang mencari desain kerangka kerja terbaru, yang memprioritaskan kinerja, modularitas, dan kode yang bersih. Tim yang merasa nyaman dengan ketersediaan skrip awal yang berpotensi lebih kecil dan bersedia meluangkan waktu untuk mempelajari sistem yang lebih baru. Sering kali menarik bagi mereka yang mencari "awal yang baru" dengan praktik modern.
4. Kerangka Kerja ND (Kerangka Kerja Generasi Berikutnya)

- Link: Kerangka Kerja ND GitHub
Sejarah dan Filsafat:
ND Framework adalah pesaing lain di bidang ini, yang sering kali menonjolkan performa dan pendekatan berbeda terhadap mekanika inti. Dikembangkan oleh tim terpisah (terutama Anders), ia memposisikan dirinya sebagai framework generasi berikutnya. Filosofinya tampaknya berpusat pada pengoptimalan ekstrem, yang berpotensi memikirkan kembali cara sistem inti seperti inventaris atau data pemain ditangani untuk meminimalkan overhead. Ia sering kali menekankan meminimalkan eksekusi sisi klien dan memanfaatkan otoritas sisi server.
Fitur Inti & Kekuatan:
- Pertunjukan: Inilah nilai jual utama ND. Ia sering mengklaim peningkatan kinerja yang signifikan atas kerangka kerja lain melalui kode yang dioptimalkan, pendekatan unik terhadap manajemen status, dan kemungkinan struktur loop inti yang berbeda.
- Sistem Inti Unik: Mungkin memiliki fitur yang secara mendasar berbeda dalam hal inventaris (misalnya, berbasis metadata), penanganan data pemain, atau sistem pekerjaan, yang dirancang untuk efisiensi.
- Fokus Keamanan: Sering menekankan penanganan peristiwa yang aman dan desain yang berwenang pada server.
- Perkembangan Modern: Mungkin mendorong praktik Lua modern dan berpotensi menawarkan alat atau struktur untuk manajemen proyek yang lebih baik.
Pengalaman Pengembangan & Struktur Kode:
Pengembangan untuk ND Framework mungkin memerlukan perubahan pola pikir yang signifikan dibandingkan dengan ESX atau bahkan qbCore/QBOX. Sistemnya yang unik berarti API dan cara berinteraksi dengan inti yang unik.
- API milik sendiri: Harapkan fungsi dan objek spesifik ND untuk sebagian besar interaksi inti (data pemain, inventaris, notifikasi, dll.).
- Desain Berbasis Optimasi: Struktur dan pola kode kemungkinan besar akan sangat dipengaruhi oleh sasaran kinerja kerangka kerja. Ini mungkin berarti lebih sedikit abstraksi di beberapa area jika hal itu menghambat kinerja, atau pola yang lebih kompleks di area lain jika hal itu memberikan keuntungan efisiensi.
- Manajemen Negara: Mungkin menggunakan sistem manajemen status yang sangat optimal, mungkin berbeda dari tas status standar atau metode yang digunakan dalam qbCore/QBOX.
Contoh: Memberikan Uang kepada Pemain (Server-side ND Framework – Contoh yang Sangat Hipotetis)
Penafian: API khusus ND Framework kurang didokumentasikan secara publik dibandingkan ESX/qbCore. Ini adalah contoh yang sangat spekulatif berdasarkan prinsip desainnya. Selalu periksa dokumentasi resmi ND.
-- ND mungkin menggunakan objek ND global atau modul/ekspor tertentu -- Mengakses data pemain mungkin berbeda, mungkin melalui pengenal atau objek unik RegisterCommand('givemoneynd', function(source, args, rawCommand) local targetNetId = tonumber(args[1]) -- ND mungkin lebih suka NetID atau pengenal pemainnya sendiri local amount = tonumber(args[2]) local accountType = args[3] atau 'cash' -- Mengasumsikan tipe akun ada if not targetNetId atau not amount atau amount <= 0 then -- Mengasumsikan sistem notifikasi ND exports.ND_Core:Notify(source, "Invalid arguments.", "error") return end -- Mendapatkan objek Pemain ND (metode akan khusus untuk ND) local NDPlayer = exports.ND_Core:GetPlayerByNetId(targetNetId) -- Fungsi hipotetis murni if NDPlayer then -- Berinteraksi dengan ekonomi pemain mungkin melalui modul Ekonomi khusus atau metode pemain langsung local success = NDPlayer:AddBalance(accountType, amount) -- Metode hipotetis jika berhasil maka exports.ND_Core:Notify(source, string.format("Memberikan $%d (%s) kepada pemain %d", amount, accountType, targetNetId), "success") exports.ND_Core:Notify(targetNetId, string.format("Anda menerima $%d (%s)", amount, accountType), "success") else exports.ND_Core:Notify(source, "Gagal memberikan uang (periksa jenis akun atau status pemain).", "error") end else exports.ND_Core:Notify(source, "Pemain tidak ditemukan.", "error") end end, true) -- Dengan asumsi mekanisme pembatasan admin ada
Pertunjukan:
Klaim menunjukkan bahwa ND Framework menawarkan kinerja terbaik, berpotensi mengungguli yang lain dalam tolok ukur tertentu karena fokusnya pada pengoptimalan. Hasil di dunia nyata masih bergantung pada konfigurasi server dan skrip khusus, tetapi intinya dirancang agar ringan.
Potensi Kekurangan:
- Kurva Pembelajaran yang Curam: Pendekatannya yang unik kemungkinan berarti pengembang memerlukan waktu yang signifikan untuk mempelajari API dan pola desain spesifiknya, terutama jika berasal dari ESX/qbCore.
- Ekosistem Terkecil: Dibandingkan dengan ESX dan qbCore, jumlah skrip yang kompatibel dengan ND yang tersedia untuk umum kemungkinan paling sedikit. Upaya pengembangan atau konversi kustom yang signifikan hampir terjamin.
- Dokumentasi/Komunitas: Karena kerangka kerja ini kurang banyak diadopsi (dibandingkan dengan ESX/qbCore), menemukan dokumentasi, tutorial, dan dukungan komunitas yang luas mungkin lebih sulit. Dukungan mungkin terkonsentrasi di Discord atau forum tertentu.
- Kesesuaian: Skrip yang dirancang untuk kerangka kerja lain hampir pasti bukan bekerja tanpa modifikasi substansial.
Sasaran Pemirsa:
Pengembang dan pemilik server berpengalaman yang mengutamakan kinerja mentah di atas segalanya dan bersedia berinvestasi besar dalam pengembangan kustom atau konversi skrip. Tim yang merasa nyaman bekerja dalam ekosistem yang kurang terdokumentasi dan lebih kecil, dengan fokus membangun server unik yang sangat optimal.
Tabel Perbandingan
Fitur | ESX (Warisan) | qbCore | Kotak Q | Kerangka ND |
---|---|---|---|---|
Tujuan Utama | Ekosistem yang Kaya Fitur dan Besar | Terstruktur, Berkinerja, Terorganisir | Modular, Modern, Berkinerja | Performa Maksimal, Inti Dioptimalkan |
Kemudahan Pengaturan | Sedang (Banyak ketergantungan) | Sedang (Struktur jelas) | Sedang (Lebih baru, berkembang) | Sedang hingga Keras (Pengaturan unik) |
Kemudahan Pengembangan | Sedang (Familiar), Pola lama | Sedang (Terstruktur), API Spesifik | Moderat (Modern), API berpotensi baru | Keras (API/Pola Unik) |
Gaya Kode | Sebagian besar Prosedural, Objek ESX Global | Prosedur Terstruktur/OOP, objek QBCore | OOP didorong, Modular, API Spesifik | API/Pola Spesifik yang Sangat Dioptimalkan |
Kinerja | Baik (Warisan), Bervariasi dengan skrip | Sangat Baik, Inti yang Dioptimalkan | Sangat Baik (Diklaim), Fokus pada kinerja | Sangat baik (Diklaim), Fokus desain inti |
Ekosistem Skrip | Besar-besaran (Publik/Berbayar) | Besar & Berkembang (Publik/Berbayar) | Lebih Kecil, Tumbuh | Terkecil (Mungkin memerlukan pengembangan khusus) |
Modularitas | Sedang (Meningkat dalam Warisan) | Baik (Berbasis sumber daya) | Sangat Baik (Dirancang untuk modularitas) | Sedang hingga Baik (Tergantung pada desain) |
Dukungan Komunitas | Sangat Besar (Forum, Discord) | Sangat Besar (Discord Aktif) | Berkembang (fokus pada Discord) | Lebih kecil (Komunitas tertentu/Discord) |
Dokumentasi | Luas (Tersebar), Fokus Warisan | Bagus (Dokumen Resmi/Discord) | Meningkatkan (Kerangka kerja yang lebih baru) | Kurang Publik / Lebih Bergantung pada Masyarakat |
Target Pemirsa | Mulai dengan mudah dengan skrip, ESX vets | RP Terstruktur, Sadar Kinerja | Pengembang modern, fokus pada Kinerja/Modularitas | Pencari Performa Maksimal, Pengembangan Kustom yang Berat |
Tautan GitHub | Warisan ESX | qbCore | Proyek QBOX | Kerangka ND |
Contoh Kode Berdampingan: Mendaftarkan Perintah Sederhana
Mari kita lihat perintah dasar “hello world” untuk melihat perbedaan strukturalnya.
ESX Legacy (Sisi server):
ESX = nil TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) RegisterCommand('hellome_esx', function(source, args, rawCommand) local xPlayer = ESX.GetPlayerFromId(source) local playerName = xPlayer.getName() -- Atau xPlayer.name tergantung pada versi/konfigurasi yang tepat TriggerClientEvent('esx:showNotification', source, 'Hello, ' .. playerName .. '!') print('Player ' .. source .. ' (' .. playerName .. ') used /hellome_esx') end, false) -- false = perintah tersedia untuk semua orang
qbCore (Sisi server):
QBCore = exports['qb-core']:GetCoreObject() QBCore.Commands.Add('hellome_qb', 'Mengucapkan halo kepada pemain.', {}, false, function(source, args) -- Objek pemain tersedia secara otomatis melalui source dalam banyak panggilan balik/peristiwa qbCore local Player = QBCore.Functions.GetPlayer(source) if Player then local playerName = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname TriggerClientEvent('QBCore:Notify', source, 'Hello, ' .. playerName .. '!', 'primary') -- Menggunakan sistem notifikasi QBCore print('Player ' .. source .. ' (' .. playerName .. ') used /hellome_qb') end end) -- Tidak ada izin ACE yang ditentukan = tersedia untuk semua orang
QBOX (Sisi server – Contoh yang masuk akal):
-- Dengan asumsi QBX adalah objek inti atau diperoleh melalui ekspor QBX = exports.qbx_core:GetCoreObject() -- Contoh, periksa nama ekspor aktual QBX.Commands.Add('hellome_qbx', 'Mengucapkan halo kepada pemain.', {}, false, function(source, args, user) -- Mungkin meneruskan objek pengguna secara langsung -- Mengakses data pemain melalui objek 'pengguna' yang disediakan atau dengan mendapatkannya melalui sumber pemain lokal = pengguna atau QBX.Players.Get(source) -- Contoh: Struktur jamak 'Pemain' atau yang serupa jika pemain maka -- Mengakses nama pemain mungkin melalui metode atau properti langsung namapemain lokal = pemain:GetData('namadepan') .. " " .. pemain:GetData('namabelakang') -- Contoh: Menggunakan metode GetData -- Atau: namapemain lokal = pemain.charinfo.namadepan .. " " .. pemain.charinfo.namabelakang -- Memicu pemberitahuan, mungkin melalui modul lokal Notify = QBX.Modules.Notify -- Contoh akses modul Notify.Send(source, 'Hello, ' .. playerName .. '!', 'inform') -- Contoh panggilan pemberitahuan print('Player ' .. source .. ' (' .. playerName .. ') used /hellome_qbx') end end)
Kerangka ND (Sisi server – Contoh yang Sangat Hipotetis):
-- Dengan asumsi ND adalah objek inti atau diperoleh melalui ekspor ND = exports.ND_Core:GetCoreObject() -- Contoh -- Registrasi perintah mungkin berbeda ND.Commands.Register('hellome_nd', { description = 'Mengucapkan halo kepada pemain.', restricted = false, -- Contoh pembatasan flag execute = function(source, args) -- Mendapatkan data pemain mungkin melalui fungsi ND tertentu local NDPlayer = ND.GetPlayer(source) -- Hipotetis if NDPlayer then -- Mengakses data mungkin berbeda, mungkin aksesor yang dioptimalkan local playerName = NDPlayer:GetName() -- Metode hipotetis -- Memicu notifikasi melalui sistem ND ND.Notify(source, 'Hello, ' .. playerName .. '!', 'info') -- Hipotetis print('Player ' .. source .. ' (' .. playerName .. ') used /hellome_nd') end end })
Contoh-contoh ini menyoroti berbagai cara kerangka kerja memaparkan fungsi intinya (objek global vs. modul), menangani akses data pemain, dan terintegrasi dengan subsistem seperti notifikasi dan perintah.
Penyelaman Mendalam Performa
Performa sering kali menjadi faktor penentu utama. Berikut ini adalah gambaran yang lebih rinci:
- Warisan ESX: Jauh lebih baik dibandingkan ESX lama. Inti dioptimalkan secara wajar. Variabel kinerja terbesar adalah kualitas dan kuantitas skrip pihak ketiga. Server yang dipenuhi skrip ESX yang dikodekan dengan buruk akan berkinerja buruk.
- inti qb: Umumnya inti lebih cepat daripada ESX Legacy karena pilihan desain yang dibuat sejak awal (misalnya, loop yang dioptimalkan, penggunaan state bag, ketergantungan yang lebih sedikit pada panggilan DB sinkron dalam add-on). Performa masih menurun jika Anda menambahkan banyak skrip kustom yang kompleks atau kurang dioptimalkan.
- KOTAK Q: Bertujuan untuk menyempurnakan kinerja qbCore lebih jauh. Modularitasnya Bisa membantu, karena Anda hanya memuat apa yang Anda butuhkan. Optimalisasi dalam manajemen status dan loop inti merupakan nilai jual utama. Mungkin sangat berkinerja, tetapi masih rentan terhadap skrip add-on yang buruk.
- Kerangka ND: Dibangun dengan kinerja seperti yang bisa dibilang paling tinggi prioritas. Diharapkan memiliki operasi inti yang paling ramping. Sistemnya yang unik (inventaris, dll.) kemungkinan dirancang khusus untuk meminimalkan komunikasi server/klien dan waktu pemrosesan. Komprominya adalah kompleksitas dan ukuran ekosistem.
Faktor Kinerja Utama:
- Interaksi Basis Data: Seberapa sering dan seberapa efisien kerangka kerja (dan skripnya) berkomunikasi dengan basis data? Panggilan sinkron menghalangi eksekusi dan dapat menjadi hambatan besar. Kerangka kerja yang mendorong operasi asinkron atau menyimpan data dalam cache (seperti objek pemain) umumnya berkinerja lebih baik.
- Penanganan Acara: Berapa banyak peristiwa klien/server yang dipicu? Apakah peristiwa tersebut mengirimkan data dalam jumlah besar? Penggunaan peristiwa yang berlebihan, terutama yang memicu logika kompleks atau pembaruan NUI secara berkala, memengaruhi kinerja.
- Optimasi Kode: Apakah loop efisien? Apakah data diproses secara tidak perlu? Apakah kode sisi klien diminimalkan jika memungkinkan? Hal ini berlaku untuk kerangka kerja inti dan skrip tambahan.
- Manajemen Negara: Bagaimana data pemain dan dunia disinkronkan antara server dan klien? Manajemen status yang efisien (seperti tas status FiveM, yang banyak digunakan oleh qbCore/QBOX/kemungkinan ND) biasanya lebih baik daripada spam acara yang konstan.
- Kinerja NUI (UI): Antarmuka pengguna yang kompleks menggunakan JavaScript dapat menghabiskan banyak sumber daya di sisi klien, yang memengaruhi FPS. Kerangka kerja itu sendiri tidak menentukan kualitas NUI, tetapi HUD/inventaris inti terkait berperan.
Intinya: Sementara QBOX dan ND mengeklaim (dan kemungkinan memberikan) batas kinerja inti yang lebih tinggi, server qbCore atau bahkan ESX Legacy yang dikelola dengan baik dengan skrip yang dipilih dan dioptimalkan dengan cermat tetap dapat bekerja dengan sangat baik. Sebaliknya, menggunakan lusinan skrip yang tidak dioptimalkan ke QBOX atau ND akan meniadakan keunggulan inti mereka.
Komunitas dan Ekosistem
- Bahasa Inggris: Warisan terbesar, banyak forum, server Discord, dan skrip yang dirilis secara publik (gunakan dengan hati-hati terkait kualitas/keamanan). Menemukan bantuan itu mudah, tetapi menemukan Bagus bantuan atau skrip yang terawat dengan baik memerlukan usaha.
- inti qb: Discord resmi yang sangat besar dan aktif. Dukungan komunitas yang kuat. Sejumlah skrip publik dan berbayar berkualitas tinggi tersedia, dan banyak skrip ESX yang dikonversi. Dokumentasinya secara umum bagus dan terpusat.
- KOTAK Q: Komunitas yang lebih kecil tetapi berkembang pesat, terutama berpusat di sekitar Discord resminya. Dukungan aktif tetapi mungkin kurang meluas dibandingkan qbCore. Ekosistem skrip sedang berkembang; perkirakan lebih banyak konversi atau pengembangan khusus yang dibutuhkan pada awalnya.
- Kerangka ND: Komunitas terkecil dari keempatnya, kemungkinan terkonsentrasi di Discord tertentu. Dukungan akan lebih spesifik. Memerlukan kemandirian yang signifikan atau interaksi langsung dengan pengembang/komunitas dekat. Ketersediaan skrip adalah yang paling terbatas.
Menentukan Pilihan: Kerangka Kerja Mana yang Tepat untuk Anda?
Tidak ada satu pun jawaban yang benar. Pertimbangkan faktor-faktor berikut:
- Keterampilan Teknis Anda:
- Pemula/Kurang Berfokus pada Kode: ESX (karena ketersediaan skrip) atau qbCore (struktur bagus, banyak tutorial) mungkin merupakan titik awal yang lebih mudah.
- Pengembang yang Nyaman: qbCore atau QBOX menawarkan struktur dan kinerja yang baik.
- Pengembang Berpengalaman yang Berfokus pada Performa Maksimal/Sistem Unik: QBOX atau ND Framework mungkin menarik, asalkan Anda siap untuk pengembangan khusus/mempelajari API baru.
- Tujuan Proyek:
- Pengaturan Cepat dengan Banyak Fitur: Pustaka skrip ESX yang luas sungguh menggoda.
- Performa dan Fitur Seimbang: qbCore adalah jalan tengah yang sangat populer.
- Performa & Modularitas Tercanggih: QBOX dirancang untuk ini.
- Kinerja Puncak Absolut (dengan mengorbankan ekosistem/kompleksitas): Kerangka ND menargetkan hal ini.
- Waktu dan Sumber Daya:
- Waktu/Anggaran Terbatas: ESX (temukan skrip gratis/murah) atau qbCore (fitur inti yang bagus, basis skrip yang layak) mungkin bisa digunakan. Waspadalah terhadap kualitas skrip dengan ESX.
- Bersedia Berinvestasi dalam Pembangunan: qbCore, QBOX, atau ND menjadi layak. QBOX/ND kemungkinan akan membutuhkan lagi pengembangan khusus pada awalnya.
- Pengetahuan yang Ada: Jika tim Anda sudah mengenal ESX atau qbCore dengan baik, tetap menggunakannya atau melakukan migrasi (misalnya, ESX -> qbCore, qbCore -> QBOX) mungkin lebih lancar daripada beralih sepenuhnya ke sesuatu yang kurang dikenal seperti ND.
- Visi Server: Apakah Anda memerlukan fitur khusus yang sangat spesifik? Kerangka kerja tidak sepenting kemampuan Anda untuk membangunnya. Namun, kerangka kerja yang terstruktur dengan baik (qbCore, QBOX, ND) dapat membuat pengembangan khusus yang rumit menjadi lebih mudah dan lebih mudah dikelola dalam jangka panjang.
Kesimpulan
Bentang alam kerangka FiveM menawarkan opsi yang matang dan kuat untuk memenuhi berbagai kebutuhan:
- Warisan ESX: Veteran dengan ekosistem skrip yang tak tertandingi, dimodernisasi untuk performa yang lebih baik tetapi tetap mempertahankan beberapa pola lama. Ideal jika skrip yang sudah dibuat sebelumnya menjadi prioritas Anda.
- inti qb: Penantang populer, yang menawarkan keseimbangan hebat antara struktur, kinerja, fitur inti, dan komunitas yang besar dan aktif. Pilihan yang solid untuk banyak server.
- KOTAK Q: Evolusi, mendorong lebih banyak modularitas, praktik modern, dan kinerja, yang dibangun di atas fondasi qbCore. Sangat cocok bagi pengembang yang menginginkan basis yang bersih, berkinerja, dan berwawasan ke depan, dengan asumsi mereka menerima ekosistem awal yang lebih kecil.
- Kerangka ND: Spesialis kinerja, berpotensi menawarkan pengoptimalan tertinggi tetapi menuntut keahlian teknis dan pengembangan khusus paling banyak karena sistemnya unik dan komunitas/ekosistemnya lebih kecil.
Bias kami di qbCore.net jelas, tetapi keadilan adalah kuncinya. Kami yakin qbCore menawarkan perpaduan yang sangat baik antara kegunaan, kinerja, fitur, dan dukungan komunitas yang menjadikannya pilihan yang fantastis untuk berbagai server RP. Namun, ESX tetap memiliki nilai untuk pustaka skripnya, dan QBOX/ND menghadirkan opsi yang menarik bagi mereka yang memprioritaskan kinerja puncak absolut atau pilihan arsitektur tertentu.
Lakukan riset, mungkin siapkan server uji dengan kerangka kerja yang berbeda, baca dokumentasinya, bergabunglah dengan komunitas mereka, dan pilih fondasi yang paling sesuai dengan visi, keterampilan, dan sumber daya Anda. Semoga berhasil membangun dunia Anda!