Agency-Phone Özel Uygulamalar
Artık AgencyOS27 ile: telefonu zaten olan herkese ücretsiz güncelleme.

🧩 Agency-Phone için özel bir uygulama geliştirin
Telefona bir uygulama eklemenin iki yolu vardır. Size uygun olanı seçin:
| Yöntem | Şunun için en iyisi: | Dokunduğunuz her şey |
|---|---|---|
| A. SDK (harici kaynak) | Kendi simgeleriyle uygulama ekleyen satıcılar ve scriptler | Yalnızca kendi resource'unuz. agency-phone üzerinde sıfır düzenleme. |
| B. Drop-in (agency-phone içinde) | Telefon UI içine yerel bir ekran ekleyen sunucu sahipleri | config.lua + apps/ (ekran için + html/js) |
Bir uygulamayı başka sunuculara dağıtıyorsanız şunu kullanın: Yöntem A. Bizden herhangi bir kaynak kod gerektirmez ve güncellemeler boyunca çalışmaya devam eder.
A SDK: Kendi resource'unuzdan bir uygulama kaydedin
agency-phone, herhangi bir kaynağın çalışma zamanında telefonun ana ekranına kendi simgesiyle bir uygulama yerleştirmesine olanak tanıyan exportlar sunar. Uygulamanızın arayüzü kendi kaynağınızda yer alır; telefon simgeyi gösterir ve oyuncu dokunduğunda kontrolü size devreder. agency-phone üzerinde değişiklik yok, kilitsiz derleme yok.
Minimal örnek
-- 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 yapılandırması
| Alan | Tür | Gerekli | Açıklama |
|---|---|---|---|
id | string | evet | Benzersiz kimlik, küçük harf, boşluksuz. |
label | string | evet | Simgenin altında gösterilen ad. |
icon | string | hayır | FontAwesome 6 sınıfı. Şu durumda yok sayılır: image ayarlandı. |
image | string | hayır | Özel simge görseli, örn. https://cfx-nui-<resource>/icon.png. |
color / colorDark | string | hayır | Simgenin arkasındaki gradyan (hex). |
slot | sayı | hayır | Ana ekran konumu. Belirtilmezse otomatik olarak yerleştirilir. |
storeDesc | string | hayır | Uygulamanızın Mağaza sayfasındaki kısa açıklama. Tanımlanmadığında etikete geri döner. |
SDK export'ları (client)
| Dışa aktar | Açıklama |
|---|---|
RegisterApp(config) | Uygulamanızı ekleyin veya güncelleyin. Döndürür: true, veya false, err. |
UnregisterApp(id) | Uygulamanızı kaldırın. Resource'unuz durduğunda da otomatik olarak gerçekleşir. |
GetRegisteredApps() | Kayıtlı tüm harici uygulamaların tablosu. |
ClosePhone() | Telefonu kapatır, örn. kendi NUI'nizi açmadan önce. |
Dokunma olayı
Oyuncu simgenize dokunduğunda, agency-phone istemcide bunların her ikisini de tetikler. Hangisini tercih ederseniz onu kullanın:
| Event | Argümanlar |
|---|---|
agency-phone:client:openApp | appId (kimliğinize göre filtreleyin) |
agency-phone:client:openApp:<yourId> | yok (zaten uygulamanızla kapsamlandırılmış) |
Ekle dependency 'agency-phone' sizin fxmanifest.lua böylece başlatma sırası doğru olur.
B Doğrudan entegre, telefon içinde yerel bir ekran
Telefonun kendisi tarafından işlenen bir ekran için (sizin resource'unuz değil). Bu işlem agency-phone'un kendi dosyalarını düzenler.
| Adım | Dosya | Escrow sürümünde düzenlenebilir mi? |
|---|---|---|
1. Şurada uygulama girişi: AgencyConfig.Apps | config.lua | ✓ evet |
2. RegisterNUICallback mantık | apps/<id>_client.lua (+ _server.lua) | ✓ evet |
3. Ekran <div id="app-<id>"> | html/index.html | ✗ şifrelenmiş |
4. case '<id>': içinde openApp() + yükleyici | html/js/phone.js | ✗ şifrelenmiş |
Adım 3 ve 4 escrow ile şifrelenmiş dosyalarda yer alır, bu nedenle yerel bir ekran için kaynak / kilitli olmayan (unlocked) bir derleme gerekir. Yalnızca escrow sürümüne sahipseniz şunu kullanın: Yöntem A yerine (ekranınız kendi resource'unuz içinde yer alır). Resource içindeki dosyalara referans verin: apps/testapp_client.lua ve apps/dispatch_client.lua.
📋 Diğer telefon exportları
Client
| Dışa aktar | Dönen Değerler | Açıklama |
|---|---|---|
IsPhoneOpen() | boolean | Telefon şu anda açık. |
IsPhonePoweredOn() | boolean | Cihaz açıldı. |
HasPhone() | boolean | Oyuncu bir telefon eşyasına sahiptir. |
HasCarrierContract() | boolean | Aktif eSIM / sözleşme. |
GetPhoneData() | tablo | Telefon durumunun anlık görüntüsü. |
PhoneNotification(title, text, icon, color, timeout, acceptIcon, denyIcon) | geçersiz | Telefon içi bildirim. |
StartCall(contact) | geçersiz | Ara { name, number }. |
StartAgencyPayCheckout(opts) | geçersiz | AgencyPay ödeme (aşağıya bakın). |
Sunucu
| Dışa aktar | Açıklama |
|---|---|
SendMail(identifier, mailData) | Bir oyuncuya (çevrim içi veya çevrim dışı) posta teslim edin. |
AddChirp(data) | Pulse sosyal akışında bir mesaj paylaşın. |
VerifyAgencyPayCharge(source, requestId, minAmount) | Malları teslim etmeden önce sunucuda ödenmiş bir AgencyPay checkout işlemini onaylayın (aşağıya bakın). |
⇄ NUI ↔ Lua köprüsü (Yöntem B)
| Yön | JS tarafı | Lua tarafı |
|---|---|---|
| JS → Lua | fetchNUI('callbackName', data) | RegisterNUICallback('callbackName', fn) |
| Lua → JS | dinleyin action içinde window.onmessage | SendNUIMessage({ action = '...' }) |
💳 AgencyPay ödeme
Oyuncunun cüzdanından herhangi bir kaynaktan ücret tahsil edin.
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)
Sonuç payload'ı şunları içerir: status (paid / cancelled / failed), amount, cardId, balance ve sizin metadata.
A paid istemciden resource'unuza ulaşan sonuç tek başına hiçbir şeyi kanıtlamaz. Kendi id kime StartAgencyPayCheckout ve çağırın exports['agency-phone']:VerifyAgencyPayCharge(source, id, amount) herhangi bir şey vermeden önce server tarafında. Şunu döndürür: true ve tutarı yalnızca bu oyuncu ilgili ödemeyi son 60 saniye içinde yaptıysa uygular ve bakiyeyi kullanır, böylece aynı ödeme iki kez talep edilemez.
🐛 Sorun Giderme
| Belirti | Düzeltme |
|---|---|
| Simge görünmüyor (SDK) | agency-phone paketini en son Keymaster derlemesine güncelleyin, Wait(1500) önce RegisterApp, ve şunu ekleyin: dependency 'agency-phone' manifest dosyanıza. |
| Dokunmak hiçbir şey yapmaz (SDK) | Sizin agency-phone:client:openApp handler, şununla eşleşmelidir: id birebir aynı (büyük-küçük harfe duyarlı). |
| Özel görsel görünmüyor | Tam bir NUI URL'si kullanın https://cfx-nui-<your-resource>/path/icon.png ve dosyayı şurada listeleyin: files { } manifest dosyanızda. |
| Simge görünmüyor (drop-in) | enabled = true ve installed = true yapılandırma girdisinde. |
Sorularınız mı var veya yardıma mı ihtiyacınız var? Katılın: Agency Scripts Discord.