FiveM Özel Kıyafet Eklentileri: Kendi Drop'larınızı Stream Edin
FiveM üzerinde kendi özel kıyafetlerinizi stream edin. Eklentileri yapılandırın, slotları yönetin, çakışmaları giderin ve özel sunucu dropları oluşturmanın arkasındaki iş akışını öğrenin.
Agency Scripts
Agency Scripts Kurucusu ve Baş Geliştiricisi
GTA V Kıyafet Sistemini Anlamak
GTA V, her bir kıyafet parçasının belirli bir bileşen yuvası içindeki bir "drawable" olduğu bileşen tabanlı bir kıyafet sistemi kullanır. Bir ped üzerinde kafa (bileşen 0), ayakkabılar (bileşen 6), çantalar ve aksesuarlara kadar uzanan 12 bileşen yuvası bulunur. Her bileşen yuvası birden fazla drawable barındırabilir ve her drawable birden fazla doku varyasyonuna sahip olabilir. Örneğin, bileşen 11 (üst giyim), siyah, kahverengi, kırmızı ve beyaz renk varyantlarını temsil eden 0 ila 3 arasındaki dokulara sahip drawable 15'e (deri ceket) sahip olabilir. Özel kıyafetler oluşturmadan önce bileşenlerin, drawable'ların ve dokuların bu hiyerarşisini anlamak şarttır; çünkü eklediğiniz her parça bu mevcut yapıya oturmalıdır. Çok oyunculu (MP) ped modeli, tek oyunculu karakterlerden farklı olan kendi drawable eşlemesiyle başka bir katman ekler ve FiveM sunucuları yalnızca MP freemode modellerini kullanır.
Resource Yapısı ve Streaming
FiveM platformunda özel kıyafetler streaming sistemi üzerinden çalışır. Temel oyun dosyalarının yanı sıra ek drawable ve kaplama dosyalarını yüklemesi için oyuna talimat veren bir resource oluşturursunuz. Resource yapısı, oyun motorunun her dosyanın hangi ped modeline, bileşenine ve drawable dizinine ait olduğunu belirlemek için kullandığı katı adlandırma kurallarını takip eder. Klasör yapısının yanlış olması, kıyafetlerin oyun içinde görünmemesinin en yaygın nedenidir. Resource'unuz için bir fxmanifest.lua streaming dosyalarını tanımlayan, asıl kıyafet verileri ise bir stream doğru alt klasör hiyerarşisine sahip dizin.
-- fxmanifest.lua for a clothing addon
fx_version 'cerulean'
game 'gta5'
-- The resource name matters: it determines load priority
-- Prefix with zzz_ to ensure it loads after base game assets
this_is_a_map 'yes'
lua54 'yes'
-- All streaming assets inside /stream/ are auto-detected
-- No need to list individual files
stream klasörü kesin bir hiyerarşiyi takip eder. MP freemode erkek kıyafetleri için dosyalar şuraya gider: stream/mp_m_freemode_01_mp_m_[dlcname]/. Kadın karakter için şunu değiştirin: mp_m ile mp_f. Bu klasörün içine YDD (drawable dictionary), YTD (texture dictionary) ve YMT (metadata) dosyalarını yerleştirirsiniz. Adlandırma kuralı, her dosyanın hangi component ve drawable index'ini temsil ettiğini kodlar. Şu ada sahip bir dosya: mp_m_freemode_01_mp_m_mypack_jbib_000_u.ydd "mypack" DLC paketindeki erkek freemode ped üzerinde bileşen 11 (jbib = ceket/üstler) için çizilebilir öğe (drawable) 0'dır.
-- Folder structure example
stream/
mp_m_freemode_01_mp_m_mypack/
mp_m_freemode_01_mp_m_mypack.ymt -- metadata file
mp_m_freemode_01_mp_m_mypack_jbib_000_u.ydd -- tops drawable 0
mp_m_freemode_01_mp_m_mypack_jbib_diff_000_a_uni.ytd -- texture for tops 0
mp_m_freemode_01_mp_m_mypack_jbib_001_u.ydd -- tops drawable 1
mp_m_freemode_01_mp_m_mypack_jbib_diff_001_a_uni.ytd -- texture for tops 1
mp_m_freemode_01_mp_m_mypack_lowr_000_u.ydd -- pants drawable 0
mp_m_freemode_01_mp_m_mypack_lowr_diff_000_a_uni.ytd -- texture for pants 0
Component ID'leri ve Adlandırma Kuralları
Her kıyafet parçasının dosya adlandırmasında kullanılan belirli bir kısaltması vardır. Bunları ezberlemek kritik önem taşır, çünkü tek bir yazım hatası oyunun öğenizi bulamaması anlamına gelir. Parça haritası şöyledir: baş (component 0, kıyafet yok), berd (1, maskeler), saç (2), uppr (3, kollar/eldivenler), lowr (4, pantolonlar/bacaklar), el (5, çantalar/paraşütler), fit (6, ayakkabılar), teef (7, zincir gibi aksesuarlar), aksesuarlar (8, iç giyim/vücut aksesuarları), görev (9, çelik yelek), decl (10, çıkartmalar/rozetler) ve jbib (11, üst giyim/ceketler). Prop ögeleri farklı bir sistem kullanır: p_head (şapkalar), p_eyes (gözlükler), p_ears (küpeler) ve p_lwrist/p_rwrist (saatler/bilezikler).
-- Component ID reference for scripting
local ComponentNames = {
[0] = 'head', -- Face (not clothing)
[1] = 'berd', -- Masks
[2] = 'hair', -- Hair styles
[3] = 'uppr', -- Arms / Gloves
[4] = 'lowr', -- Pants / Legs
[5] = 'hand', -- Bags / Parachutes
[6] = 'feet', -- Shoes
[7] = 'teef', -- Accessories (chains, ties)
[8] = 'accs', -- Undershirts
[9] = 'task', -- Body Armor
[10] = 'decl', -- Decals / Badges
[11] = 'jbib', -- Tops / Jackets
}
-- Get total drawables for a component (useful for clothing menus)
local function GetMaxDrawables(ped, componentId)
return GetNumberOfPedDrawableVariations(ped, componentId)
end
-- Get texture count for a specific drawable
local function GetMaxTextures(ped, componentId, drawableId)
return GetNumberOfPedTextureVariations(ped, componentId, drawableId)
end
-- Apply clothing to ped
local function SetClothing(ped, componentId, drawableId, textureId)
SetPedComponentVariation(ped, componentId, drawableId, textureId, 0)
end
YMT Dosyalarını Anlama
YMT (Ped Metadata) dosyası, bir kıyafet paketini bir arada tutan yapıştırıcıdır. Oyun motoruna her bileşende kaç drawable bulunduğunu, her drawable'ın kaç dokuya sahip olduğunu, kıyafet hareket ettiğinde hangi sesin çalınacağını ve çeşitli render özelliklerini bildiren XML tabanlı bir dosyadır. Doğru yapılandırılmış bir YMT olmadan, YDD ve YTD dosyaları kusursuz hazırlanmış olsa bile oyun drawable'larınızı tanımaz. YMT, paketinizdeki her bir drawable ve doku kombinasyonunu listelemelidir. Tek bir eksik girdi, o öğenin görünmez olacağı anlamına gelir. YMT dosyalarını elle düzenlemek hataya açıktır, bu nedenle çoğu içerik üreticisi CodeWalker gibi araçları veya asset klasörü içeriğinizden dosyayı otomatik olarak oluşturan özel YMT oluşturucularını kullanır.
<!-- Simplified YMT structure (XML representation) -->
<CPedVariationInfo>
<availComp>
<!-- Bitfield indicating which components have data -->
<Item value="2048" /> <!-- Only jbib (component 11) -->
</availComp>
<compInfos>
<Item> <!-- Component 11 (jbib / tops) -->
<drawblDict>
<Item> <!-- Drawable 0 -->
<numAlternatives value="0" />
<numTexVariations value="3" /> <!-- 3 color variants -->
<clothData>
<ownsCloth value="false" />
</clothData>
</Item>
<Item> <!-- Drawable 1 -->
<numAlternatives value="0" />
<numTexVariations value="2" /> <!-- 2 color variants -->
<clothData>
<ownsCloth value="false" />
</clothData>
</Item>
</drawblDict>
</Item>
</compInfos>
</CPedVariationInfo>
Doku Çeşitleri ve Kalite
Her drawable, aynı kıyafet modelinin farklı renklerini veya desenlerini temsil eden birden fazla doku varyasyonuna sahip olabilir. Temel doku dosyası şu adlandırma modelini kullanır: [pack]_[component]_diff_[drawableIndex]_[textureIndex]_uni.ytd. Dokular, en uygun GPU uyumluluğu için ikinin kuvvetleri şeklinde (512x512, 1024x1024, 2048x2048) oluşturulmalıdır. Daha yüksek çözünürlüklü dokular daha iyi görünür ancak özellikle oyuncuların aynı anda onlarca özel kıyafet paketini yüklediği sunucularda sınırlı bir kaynak olan VRAM'den daha fazla tüketir. Pratik bir kural, çoğu kıyafet ögesi için 1024x1024 kullanmak ve işlemeli logolar veya karmaşık desenler gibi ince ayrıntılara sahip ögeler için 2048x2048 ayırmaktır. Dosya boyutlarını yönetilebilir tutmak için çoğu FiveM kıyafet paketi yalnızca diffuse katmanını kullansa da her YTD dosyası; diffuse (renk), normal (yüzey detayı) ve specular (parlaklık) haritaları dahil olmak üzere birden fazla doku katmanı içerebilir.
Kıyafet Menüsü Scripti Geliştirme
Streaming resource'unuz çalıştıktan sonra, oyuncuların kıyafetlere göz atması ve bunları uygulaması için bir yönteme ihtiyacınız olur. Bir kıyafet menüsü script'i, bileşen başına mevcut tüm drawable'ları yineler ve oyuncuların bunları karakterleri üzerinde gerçek zamanlı olarak önizlemelerine olanak tanır. Temel mantık şunu kullanır: GetNumberOfPedDrawableVariations her bileşen için kaç drawable bulunduğunu belirlemek, ardından SetPedComponentVariation seçilen olanı uygulamak için. Kusursuz bir kullanıcı deneyimi için bunu bir ox_lib veya NUI menüsüne sarın. İşin püf noktası, oyuncuların denedikleri şeyleri garip kırpılma veya yakınlaştırma sorunları olmadan görebilmeleri adına birinci şahıs önizlemelerini ve kamera açılarını doğru yönetmektir.
-- client/clothing_menu.lua
local function OpenClothingMenu()
local ped = PlayerPedId()
local components = {}
for compId = 0, 11 do
local maxDrawables = GetNumberOfPedDrawableVariations(ped, compId)
if maxDrawables > 0 then
local currentDrawable = GetPedDrawableVariation(ped, compId)
local currentTexture = GetPedTextureVariation(ped, compId)
local maxTextures = GetNumberOfPedTextureVariations(ped, compId, currentDrawable)
table.insert(components, {
id = compId,
label = ComponentNames[compId] or ('Component ' .. compId),
drawable = currentDrawable,
texture = currentTexture,
maxDrawable = maxDrawables - 1,
maxTexture = maxTextures - 1,
})
end
end
-- Build menu options
local options = {}
for _, comp in ipairs(components) do
options[#options + 1] = {
title = comp.label,
description = ('Drawable: %d/%d | Texture: %d/%d'):format(
comp.drawable, comp.maxDrawable, comp.texture, comp.maxTexture),
onSelect = function()
OpenComponentEditor(comp.id)
end
}
end
lib.registerContext({ id = 'clothing_menu', title = 'Wardrobe', options = options })
lib.showContext('clothing_menu')
end
local function OpenComponentEditor(componentId)
local ped = PlayerPedId()
local maxDraw = GetNumberOfPedDrawableVariations(ped, componentId) - 1
-- Interactive drawable browser with live preview
local input = lib.inputDialog('Select Clothing', {
{ type = 'slider', label = 'Style', min = 0, max = maxDraw, default = GetPedDrawableVariation(ped, componentId) },
})
if input then
local drawableId = input[1]
local maxTex = GetNumberOfPedTextureVariations(ped, componentId, drawableId) - 1
SetPedComponentVariation(ped, componentId, drawableId, 0, 0)
if maxTex > 0 then
local texInput = lib.inputDialog('Select Color', {
{ type = 'slider', label = 'Variant', min = 0, max = maxTex, default = 0 },
})
if texInput then
SetPedComponentVariation(ped, componentId, drawableId, texInput[1], 0)
end
end
end
end
Sık Karşılaşılan Sorunlar ve Sorun Giderme
En sık karşılaşılan sorun, kıyafetlerin görünmez olması veya yanlış eşya olarak görünmesidir. Bu durum neredeyse her zaman drawable veya doku sayısını düzgün bildirmeyen hatalı bir YMT dosyasına dayanır. YMT dosyanızın, stream klasörünüzde bulunan tam drawable ve doku sayısını listelediğini doğrulayın. Bir diğer yaygın sorun ise resource yükleme sırasıdır: kıyafet paketiniz temel oyun varlıklarından önce yüklenirse, drawable dizinleri çakışabilir ve vanilla kıyafetlerin üzerine yazabilir. Resource adınızın başına şunu ekleyin: zzz_ en son yüklenmesini sağlamak için. Doku bulanıklığı genellikle YTD dosyasının çok düşük bir çözünürlük kullandığını veya mipmap'lerin doğru şekilde oluşturulmadığını gösterir. CodeWalker üzerinden YTD dosyalarınızı dışa aktarırken her zaman mipmap oluşturun. Son olarak, kıyafetler erkek modellerde görünüp kadın modellerde görünmüyorsa veya tam tersi durumdaysa, şunlar için ayrı klasörleriniz olduğunu iki kez kontrol edin: mp_m_freemode_01 ve mp_f_freemode_01 erkek ve kadın ped modelleri farklı iskelet yapılarına sahip olduğu ve ayrı geometri gerektirdiği için doğru cinsiyete göre düzenlenmiş mesh dosyalarıyla.
Sunucu Performansı İçin Optimizasyon
Özel kıyafet paketleri, sunucu indirme boyutunun ve istemci VRAM kullanımının en büyük etkenlerindendir. 100 adet yüksek çözünürlüklü parça içeren, yetersiz optimize edilmiş tek bir paket, sunucunuzun indirme gereksinimine gigabaytlar ekleyebilir. İşleri yönetilebilir kılmak adına, ham dosya boyutunun çok daha azıyla iyi bir görsel kalite sunan DXT5 veya BC7 formatını kullanarak YTD kaplamalarınızı sıkıştırın. Her paketi makul sayıda parçayla, genellikle 20 ila 50 adet, sınırlayın ve daha büyük koleksiyonları bağımsız yüklenebilen birden fazla resource'a bölün. Düşük sistemli oyuncular için popüler paketlerin 512x512 kaplamalı "lite" bir sürümünü sunmayı değerlendirin. Script tarafında ise şunları art arda çağırmaktan kaçının: SetPedComponentVariation döngü içinde, çünkü her çağrı bir model güncellemesini tetikler. Görsel sıçramaları ve render yükünü en aza indirmek için tüm bileşen güncellemelerini toplayıp tek bir kare içinde sırayla uygulayarak kıyafet değişikliklerini toplu olarak yapın.