CXG-GTFAT'ı diğer kaynaklarla entegre etme
bridge/*.lua dosyaları izinleri, kalıcılığı, bildirimleri, istasyonları ve görünüm biçimlerini uyarlamak için düzenlenebilir noktalardır. Menü yamaları belirli sürümlere yönelik elle yapılan değişikliklerdir; kaynak kurulum sırasında başka kaynakları değiştirmez.
Görünüm menüleri
Aşağıdaki depolar ve sürümler için yamalar hazırlanmıştır:
| Menü | Kaynak sürümü | Ek işlem |
|---|---|---|
| illenium-appearance | 1b003ec169b15f145d519438ba7c6454bf746f27 | Bileşen kayıt Lua yamasını uygulayın. |
| fivem-appearance | b06da32881ed49042909b38a778c10dd9bd9eaed | Yamayı uygulayın ve oyunun TypeScript bundle'ını build:game akışıyla yeniden oluşturun. |
| qb-clothing | 8cca4009dd473ab30c30e443ecad50830b816ed7 | Skin ve kombin kayıt sınırlarına yamayı uygulayın. |
| esx_skin / skinchanger | fe59ca0bd6da59e2ec6eb4a8d06ece312e96ae7a | Yama, esx_core deposunun kök dizinine göredir. |
Paketteki integrations klasöründe illenium-appearance.patch, fivem-appearance.patch, qb-clothing.patch ve skinchanger.patch dosyaları bulunur. Otomatik uygulanmazlar. Menünün geliştirme checkout'unda uygulamadan önce uygun yamayı kontrol edin:
git apply --check /ruta/al/parche-correcto.patch
git apply /ruta/al/parche-correcto.patch
Kontrol başarısız olursa durun ve değişikliği kurulu sürüme uyarlayın; yamayı zorla uygulamayın. Fork'lar ve daha yeni sürümler farklı olabilir. fivem-appearance yaması, menünün yönergelerine göre build:game akışıyla bundle'ın yeniden oluşturulmasını gerektirir. Bu yamalar tüm sürümleri onaylamaz ve sunucuda test etmenin yerini tutmaz.
Kayıt sırasında teknik decal temizlenir, böylece menü bunu oyuncunun normal seçimi olarak kaydetmez. Kendi görünüm tablosu olan menüler temizleme işlevini kayıt noktasında çağırmalıdır. Ağırlık kombinlerden ayrı saklanır.
Özel görünüm kaydetme
İstemci export'u SanitizeAppearance, görünümün bir kopyasını döndürür. Dahil edilen biçimler components, qb ve esx'tir:
local appearanceCopy = exports['CXG_GTFAT']:SanitizeAppearance(
ped,
appearance,
'components'
)
GuardarApariencia(appearanceCopy)
GuardarApariencia örnek bir çağrıdır; menünüzün kayıt işleviyle değiştirin. components, bileşen dizisini veya components özelliği bulunan bir nesneyi kabul eder; her bileşen component_id, drawable, texture ve isteğe bağlı palette kullanır. qb biçiminde decals alanı item ve texture içerir; esx decals_1 ve decals_2 kullanır. Export derin bir kopya döndürür, diğer alanları korur ve ped'i geçici olarak değiştirmez. Biçim adaptörü başarısız olursa veya biçim tanınmazsa değiştirilmemiş kopyayı döndürüp tanılama kaydı oluşturur.
Önizleme ped'i kaydetme
Menü karakterden ayrı bir önizleme ped'i kullanıyorsa etkin karakterin önizlemesini kaydedin. Varlığı silmeden önce kaydı kaldırın:
local previewPed = ObtenerPreviewActual()
if previewPed and DoesEntityExist(previewPed) then
exports['CXG_GTFAT']:RegisterPreviewPed(previewPed)
end
-- Al cerrar o cancelar el menú, antes de eliminar el ped:
exports['CXG_GTFAT']:UnregisterPreviewPed(previewPed)
EliminarPreview(previewPed)
ObtenerPreviewActual ve EliminarPreview örnek çağrılardır; menünüzün işlevleriyle değiştirin. Yalnızca etkin karakterin önizlemesini kaydedin; dünya ped'lerini veya başka karakterlerin önizlemelerini kaydetmeyin. Alternatif olarak Config.GetPreviewPed değerini mevcut ped'i veya nil döndürecek biçimde ayarlayın. RefreshAppearance(previewPed) zaten yönetilen bir ped'in yeniden değerlendirilmesini ister; tek başına Fat'ı etkinleştirmez.
Sunucu kaynakları için export'lar
Sunucu export'ları diğer sunucu kaynakları için ayrıcalıklı API'lerdir. İstemcinin çağırabileceği bir event üzerinden doğrudan aktarmayın.
local playerSource = source -- ID del jugador en el servidor
local kg, err = exports['CXG_GTFAT']:GetWeight(playerSource)
if kg == nil then
print('No hay un peso confirmado:', err)
end
local appliedKg, setError = exports['CXG_GTFAT']:SetWeight(playerSource, 92.5)
if appliedKg == nil then
print('No se pudo fijar el peso:', setError)
end
local addedKg, addError = exports['CXG_GTFAT']:AddWeight(playerSource, -2.0)
if addedKg == nil then
print('No se pudo sumar peso:', addError)
end
local resetKg, resetError = exports['CXG_GTFAT']:ResetWeight(playerSource)
if resetKg == nil then
print('No se pudo restablecer el peso:', resetError)
end
source argümanı istemciden gelen bir değer değil, sunucudaki oyuncu ID'sidir. Tüm değerler kg cinsindendir. GetWeight ağırlığı ya da nil, error döndürür. SetWeight ve AddWeight, uygulanan normalleştirilmiş ağırlığı kg cinsinden ya da nil, error döndürür; SetWeight aralık dışı değerleri reddeder ve en yakın adıma yuvarlar, eşitlikte yukarı yuvarlar. AddWeight negatif artış kabul eder. ResetWeight, defaultKg değerini yazar ve uygulanan ağırlığı kg olarak döndürür; saklanan kaydı silmez.
Başka bir sunucu kaynağından oyuncunun arayüzünü açmak için:
local playerSource = source -- ID del jugador en el servidor
local opened, err = exports['CXG_GTFAT']:OpenWeightUI(playerSource)
if not opened then
print('No se pudo abrir la báscula:', err)
end
İkinci argüman olarak isteğe bağlı istasyon ID'si verilebilir: OpenWeightUI(source, 'gimnasio'). İstasyon belirtilmezse, komut kaydı kapalı olsa bile komutların erişim politikası uygulanır. true sonucu yetkinin ve açma isteğinin gönderildiğini doğrular; istemcinin arayüzü çizdiğini doğrulamaz.
Sunucu export'ları
| Export | Kullanım |
|---|---|
GetWeight(source) | kg veya nil, error döndürür. |
SetWeight(source, kg) | Doğrulanmış ağırlığı ayarlar; uygulanan kg değerini veya nil, error döndürür. |
AddWeight(source, deltaKg) | Fark ekler; uygulanan kg değerini veya nil, error döndürür. |
ResetWeight(source) | Yapılandırılmış başlangıç ağırlığını kaydeder ve kg veya nil, error döndürür. |
GetWeightSettings() | Etkin sınırların kopyasını döndürür. |
OpenWeightUI(source, stationId?) | Geçerli politikaya göre terazinin açılmasını ister. |
RefreshCharacter(source) | Framework istenen karaktere geçtikten sonra kimlik ve ağırlığı yeniden yükler. |
ReconcileStorage(source) | Adaptör önceki yazmaları doğrulayabiliyorsa belirsiz depolama durumunu uzlaştırır. |
RefreshCharacter, çoklu karakter entegrasyonlarında isteğe bağlıdır; framework doğru kimliği kullanılabilir hale getirdikten sonra çağırın. Kaynak Qbox'a otomatik bağlanmaz.
Hatalar not_ready, invalid_source, player_unavailable, character_unavailable, invalid_weight, out_of_range, permission_denied, context_denied, busy, storage_failed, storage_timeout, storage_unknown veya not_synced olabilir. Depolama hatasını onaylanmış ağırlık olarak kabul etmeyin; storage_timeout veya storage_unknown sonucundan sonra yazmayı otomatik tekrarlamayın.
İstemci export'ları
local kg, err = exports['CXG_GTFAT']:GetWeight()
local settings = exports['CXG_GTFAT']:GetWeightSettings()
local isOpen = exports['CXG_GTFAT']:IsWeightUIOpen()
local closed = exports['CXG_GTFAT']:CloseWeightUI()
local status, statusError = exports['CXG_GTFAT']:GetFatStatus()
local reserved, reservedError = exports['CXG_GTFAT']:GetReservedDecals(PlayerPedId())
GetWeight, sunucudan doğrulanmış değer gelene kadar nil, 'not_synced' döndürür. GetFatStatus(ped?) ve GetReservedDecals(ped) salt okunur bilgi verir; geometrinin çizildiğini kanıtlamaz. GetReservedDecals, menülerde ayrılmış decal'leri gizlemek için kullanılabilir. RefreshAppearance(previewPed?) yalnızca yönetilen oyuncu görünümünü veya kaydedilmiş önizlemeyi yeniler.
RegisterPreviewPed(ped) ve UnregisterPreviewPed(ped), menünün önizleme varlığını seçiciye aktarmasını sağlar. Kaydı yalnızca ped'i kaydeden kaynak kaldırabilir. Kaydeden kaynak durduğunda önizlemeler temizlenir.
SanitizeAppearance(ped, appearance, format) görünümün kopyasını döndürür; nil, error başarısızlık göstergesi değildir. RegisterPreviewPed ve UnregisterPreviewPed, işlem tamamlandığında true, ped kaydedilemediğinde veya kaldırılamadığında false döndürür.
Düzenlenebilir bridge dosyaları
| Dosya | Uyarlama |
|---|---|
bridge/server.lua | CanAccess, kimlik, ağırlık yükleme/kaydetme ve sunucu hook'ları. |
bridge/client.lua | Önizleme ped'i, bildirimler ve ağırlık/arayüz değişikliği hook'ları. |
bridge/interaction.lua | İstasyonları target'a kaydetme veya TextUI'ı değiştirme. |
bridge/appearance.lua | Özel görünüm biçiminde decal okuma/yazma. |
Varsayılan olarak CanAccess yalnızca ace ve everyone'ı tanır. jobs, groups veya custom için gerçek sunucu API'siyle denetim uygulayın ve erişim verildiğinde tam olarak true döndürün. İstisnalar ve diğer değerler erişimi reddeder. job, group ve custom politika alanlarını adaptörünüz yorumlar.
Özel bir depolama sağlayıcısı LoadWeight(characterId, context, done), SaveWeight(characterId, kg, context, done) imzalarını ve belirsiz yazmaları uzlaştırması gerekiyorsa ReconcileWeight(characterId, context, done) imzasını uygular. Yükleme done(true, kg) (veri yoksa kg = nil kullanın) veya done(false, 'storage_failed') çağırır. Kaydetme yalnızca doğrulandıktan sonra done(true), aksi halde done(false, 'storage_failed') çağırır. Uzlaştırma, önceki yazma sonradan tamamlanamayacaksa done(true, true), bunu garanti edemiyorsa done(false, 'storage_unknown') çağırır. Gerçekten asenkron kayıtlar için AsyncStorage = true ayarlayın; callback beklemeyi destekleyen bir FiveM bağlamında tamamlanmalıdır. API zaman aşımından önce 10 saniyeye kadar bekler. storage_timeout sonrasında otomatik tekrar denemeyin; önce önceki yazmanın daha sonra uygulanmayacağını garanti eden bir sağlayıcıyla uzlaştırın. Yazmayı başlatmadan veya sıraya koymadan dönen bir sağlayıcıyı asenkron olarak işaretlemeyin.
OnWeightChanged, OnCharacterChanged, OnUIOpened, OnUIClosed ve Log hook'ları değişiklikleri gözlemlemek veya kaydetmek içindir. Hook'lar erişim vermez ve onaylanmış işlemleri geri almaz.
Etkinleştirmeden önce kontroller
Yamalar ve adaptörler sunucudaki gerçek kaynak ve sürümlerle doğrulanmalıdır. Entegrasyonu oyuncular için açmadan önce:
- Erkek ve kadın freemode karakterleriyle Normal/Fat geçişini tekrar deneyin.
- Fat etkin durumdayken görünüm ve kombini kaydedip yeniden yükleyin. Teknik decal'in normal seçim olarak kaydedilmediğini ve ağırlığın kombinle ayrı kaldığını doğrulayın.
- Karakter başına kalıcılık etkinken kaynağı yeniden başlatıp tekrar bağlanın. Aynı karakterin ağırlığını geri aldığını, başka karakterin bu ağırlığı devralmadığını doğrulayın.
- Kaydedilmiş önizlemeyle görünüm menüsünü açıp etkin karakteri gösterdiğini doğrulayın. Menü iptal edilir veya kapatılırken varlığı silmeden önce kaydı kaldırın.
Menü, framework ve kıyafet kombinasyonunuzu doğrulamak için bu adımlar sunucunuzda tamamlanmalıdır. Bir yamanın mevcut olması tek başına sonucu doğrulamaz.