Agency Docs
QBESXStandalone

Agency-Phone कस्टम ऐप

अब AgencyOS27 के साथ: जिनके पास पहले से फ़ोन है उनके लिए मुफ़्त अपडेट। FiveM के लिए एक आधुनिक फ़ोन जो QBCore, ESX या.

v27.1.2सशुल्क8 पेज

🧩 Agency-Phone के लिए अपना ऐप बनाएँ

फ़ोन पर ऐप जोड़ने के दो तरीके हैं। जो आपके काम का हो, वह चुनें:

तरीकाकिसके लिए सहीआप क्या बदलते हैं
A. SDK (बाहरी रिसोर्स)अपने आइकन के साथ ऐप जोड़ने वाले डेवलपर और स्क्रिप्टसिर्फ़ आपका अपना रिसोर्स। agency-phone में कोई बदलाव नहीं।
B. Drop-in (agency-phone के अंदर)फ़ोन के इंटरफ़ेस में नेटिव स्क्रीन जोड़ने वाले सर्वर मालिकconfig.lua + apps/ (+ स्क्रीन के लिए html/js)

अगर आप ऐप दूसरे सर्वरों को देते हैं, तो तरीका A इस्तेमाल करें। इसमें हमारे सोर्स कोड की ज़रूरत नहीं होती और यह अपडेट के बाद भी चलता रहता है।

A SDK: अपने रिसोर्स से ऐप रजिस्टर करें

agency-phone ऐसे एक्सपोर्ट देता है जिनसे कोई भी रिसोर्स रनटाइम पर अपने आइकन वाला ऐप फ़ोन की होम स्क्रीन पर रख सकता है। आपके ऐप का इंटरफ़ेस आपके अपने रिसोर्स में रहता है; फ़ोन आइकन दिखाता है और खिलाड़ी के टैप करते ही कंट्रोल आपको दे देता है। agency-phone में कोई बदलाव नहीं, कोई अनलॉक्ड बिल्ड नहीं।

छोटा उदाहरण

-- client side of YOUR resource
CreateThread(function()
    Wait(1500) -- let agency-phone boot
    exports['agency-phone']:RegisterApp({
        id        = 'myshop',
        label     = 'My Shop',
        icon      = 'fa-solid fa-cart-shopping', -- FontAwesome 6 class
        -- image  = 'https://cfx-nui-myresource/icon.png', -- or your own image instead
        color     = '#ff9500',
        colorDark = '#e08600',
    })
end)

-- fired when the player taps your icon on the phone
AddEventHandler('agency-phone:client:openApp', function(appId)
    if appId ~= 'myshop' then return end
    exports['agency-phone']:ClosePhone()
    -- open your own NUI here
end)

RegisterApp कॉन्फ़िग

फ़ील्डप्रकारज़रूरीविवरण
idstringहाँअनोखी id, छोटे अक्षरों में, बिना स्पेस।
labelstringहाँआइकन के नीचे दिखने वाला नाम।
iconstringनहींFontAwesome 6 क्लास। image सेट हो तो नज़रअंदाज़।
imagestringनहींअपनी आइकन इमेज, जैसे https://cfx-nui-<resource>/icon.png।
color / colorDarkstringनहींआइकन के पीछे का ग्रेडिएंट (hex)।
slotnumberनहींहोम स्क्रीन पर जगह। न दें तो अपने आप तय होती है।
storeDescstringनहींStore में आपके ऐप के पेज पर छोटा विवरण। न दें तो label इस्तेमाल होता है।

SDK एक्सपोर्ट (क्लाइंट)

एक्सपोर्टविवरण
RegisterApp(config)अपना ऐप जोड़ें या अपडेट करें। true लौटाता है, या false, err।
UnregisterApp(id)अपना ऐप हटाएँ। आपका रिसोर्स रुकने पर यह अपने आप भी होता है।
GetRegisteredApps()सभी रजिस्टर्ड बाहरी ऐप्स की टेबल।
ClosePhone()फ़ोन बंद करें, जैसे अपना NUI खोलने से पहले।

टैप इवेंट

खिलाड़ी आपके आइकन पर टैप करे तो agency-phone क्लाइंट पर ये दोनों इवेंट चलाता है। जो पसंद हो, इस्तेमाल करें:

इवेंटआर्ग्युमेंट
agency-phone:client:openAppappId (अपनी id से फ़िल्टर करें)
agency-phone:client:openApp:<yourId>कोई नहीं (पहले से सिर्फ़ आपके ऐप के लिए)

अपनी fxmanifest.lua में dependency 'agency-phone' जोड़ें ताकि शुरू होने का क्रम सही रहे।

B Drop-in, फ़ोन के अंदर नेटिव स्क्रीन

ऐसी स्क्रीन के लिए जिसे फ़ोन खुद बनाता है (आपका रिसोर्स नहीं)। इसमें agency-phone की अपनी फ़ाइलें बदलती हैं।

कदमफ़ाइलescrow बिल्ड में बदल सकते हैं?
1. AgencyConfig.Apps में ऐप की एंट्रीconfig.lua✓ हाँ
2. RegisterNUICallback लॉजिकapps/<id>_client.lua (+ _server.lua)✓ हाँ
3. स्क्रीन <div id="app-<id>">html/index.html✗ एन्क्रिप्टेड
4. openApp() में case '<id>': + लोडरhtml/js/phone.js✗ एन्क्रिप्टेड

कदम 3 और 4 escrow से एन्क्रिप्ट फ़ाइलों में हैं, इसलिए नेटिव स्क्रीन के लिए सोर्स वाला या अनलॉक्ड बिल्ड चाहिए। आपके पास सिर्फ़ escrow वर्ज़न है, तो तरीका A इस्तेमाल करें (आपकी स्क्रीन आपके अपने रिसोर्स में रहती है)। रिसोर्स के अंदर उदाहरण फ़ाइलें: apps/testapp_client.lua और apps/dispatch_client.lua।

📋 फ़ोन के दूसरे एक्सपोर्ट

क्लाइंट

एक्सपोर्टलौटाता हैविवरण
IsPhoneOpen()booleanफ़ोन अभी खुला है।
IsPhonePoweredOn()booleanडिवाइस चालू है।
HasPhone()booleanखिलाड़ी के पास फ़ोन आइटम है।
HasCarrierContract()booleanसक्रिय eSIM या कॉन्ट्रैक्ट।
GetPhoneData()tableफ़ोन की स्थिति का स्नैपशॉट।
PhoneNotification(title, text, icon, color, timeout, acceptIcon, denyIcon)voidफ़ोन पर सूचना।
StartCall(contact)void{ name, number } को कॉल।
StartAgencyPayCheckout(opts)voidAgencyPay चेकआउट (नीचे देखें)।

सर्वर

एक्सपोर्टविवरण
SendMail(identifier, mailData)खिलाड़ी को मेल पहुँचाएँ (ऑनलाइन या ऑफ़लाइन)।
AddChirp(data)Pulse सोशल फ़ीड में संदेश पोस्ट करें।
VerifyAgencyPayCharge(source, requestId, minAmount)सामान देने से पहले सर्वर पर AgencyPay भुगतान की पुष्टि करें (नीचे देखें)।

⇄ NUI ↔ Lua ब्रिज (तरीका B)

दिशाJS साइडLua साइड
JS → LuafetchNUI('callbackName', data)RegisterNUICallback('callbackName', fn)
Lua → JSwindow.onmessage में action सुनेंSendNUIMessage({ action = '...' })

💳 AgencyPay चेकआउट

किसी भी रिसोर्स से खिलाड़ी के वॉलेट से पैसे लें।

exports['agency-phone']:StartAgencyPayCheckout({
    merchant = 'My Shop', title = 'Agency Pay', subtitle = 'Checkout',
    label = 'Premium Coffee', amount = 24.50,
    icon = 'fa-solid fa-mug-hot', accent = '#ff9f0a',
    clientEvent = 'myshop:client:agencyPayResult',
    serverEvent = 'myshop:server:agencyPayResult',
    metadata = { orderId = 'order_2048' },
})

RegisterNetEvent('myshop:client:agencyPayResult', function(result)
    if result.status == 'paid' then
        -- deliver the goods
    end
end)

नतीजे में status (paid / cancelled / failed), amount, cardId, balance और आपका metadata होता है।

क्लाइंट से आपके रिसोर्स तक पहुँचा paid अकेले कुछ साबित नहीं करता। StartAgencyPayCheckout को अपनी id दें और कुछ भी देने से पहले सर्वर पर exports['agency-phone']:VerifyAgencyPayCharge(source, id, amount) कॉल करें। यह true और राशि तभी लौटाता है जब इस खिलाड़ी ने पिछले 60 सेकंड में यही चेकआउट चुकाया हो, और भुगतान को इस्तेमाल हुआ मान लेता है ताकि एक ही भुगतान दो बार न लिया जा सके।

🐛 समस्या समाधान

समस्यासमाधान
आइकन नहीं दिखता (SDK)agency-phone को नवीनतम Keymaster बिल्ड पर अपडेट करें, RegisterApp से पहले Wait(1500) रखें, और मैनिफ़ेस्ट में dependency 'agency-phone' जोड़ें।
टैप करने पर कुछ नहीं होता (SDK)आपका agency-phone:client:openApp हैंडलर आपकी id से बिल्कुल मेल खाना चाहिए (बड़े-छोटे अक्षर मायने रखते हैं)।
अपनी इमेज नहीं दिखतीपूरा NUI पता https://cfx-nui-<your-resource>/path/icon.png इस्तेमाल करें और फ़ाइल को मैनिफ़ेस्ट के files { } में लिखें।
आइकन नहीं दिखता (drop-in)कॉन्फ़िग एंट्री में enabled = true और installed = true।

सवाल हैं या मदद चाहिए? Agency Scripts के Discord से जुड़ें।

इस पेज के बाद भी अटके हैं? आगे हमारा सपोर्ट संभाल लेगा।