ब्लॉग पर वापस
Tutorial9 मिनट पढ़ें

FiveM कस्टम क्लोदिंग एडऑन: अपने खुद के ड्रॉप स्ट्रीम करें

FiveM में अपनी कस्टम कपड़े स्ट्रीम करें। एडऑन सेट करें, स्लॉट संभालें, संघर्ष ठीक करें और एक्सक्लूसिव सर्वर ड्रॉप्स बनाने के वर्कफ़्लो को सीखें।

Agency Scripts

Agency Scripts के संस्थापक और प्रमुख डेवलपर

GTA V के कपड़ों के सिस्टम को समझना

GTA V एक कंपोनेंट-आधारित कपड़ों की प्रणाली का उपयोग करता है जहाँ प्रत्येक कपड़े का टुकड़ा एक "drawable" होता है जो एक विशिष्ट कंपोनेंट स्लॉट में होता है। एक ped पर 12 कंपोनेंट स्लॉट होते हैं, जो सिर (कंपोनेंट 0) से लेकर जूते (कंपोनेंट 6) और बैग्स व एक्सेसरीज़ तक होते हैं। प्रत्येक कंपोनेंट स्लॉट में कई ड्रॉएबल हो सकते हैं, और प्रत्येक ड्रॉएबल के कई टेक्सचर वेरिएशंस हो सकते हैं। उदाहरण के लिए, कंपोनेंट 11 (टॉप्स) में ड्रॉएबल 15 (एक लेदर जैकेट) हो सकता है जिसमें टेक्सचर 0 से 3 तक काले, भूरे, लाल और सफेद रंग के वेरिएंट होते हैं। कंपोनेंट्स, ड्रॉएबल्स और टेक्सचर्स की इस संरचना को समझना आवश्यक है क्योंकि आप जो भी कस्टम कपड़े जोड़ेंगे, उसे इस मौजूदा संरचना में फिट होना होगा। मल्टीप्लेयर (MP) ped मॉडल में एक अतिरिक्त लेयर होती है जिसमें इसका अपना ड्रॉएबल मैपिंग होता है जो सिंगल-प्लेयर कैरेक्टर्स से अलग होता है, और FiveM सर्वर केवल MP फ्रीमोड मॉडल्स का उपयोग करते हैं।

संसाधन संरचना और स्ट्रीमिंग

FiveM में कस्टम कपड़े स्ट्रीमिंग सिस्टम के माध्यम से काम करते हैं। आप एक रिसोर्स बनाते हैं जो गेम को बेस गेम एसेट्स के साथ अतिरिक्त ड्रॉएबल और टेक्सचर फाइलें लोड करने के लिए बताता है। रिसोर्स संरचना कड़ी नामकरण कन्वेंशंस का पालन करती है जिसका उपयोग गेम इंजन यह पहचानने के लिए करता है कि प्रत्येक फाइल किस पेड मॉडल, कंपोनेंट, और ड्रॉएबल इंडेक्स से संबंधित है। फोल्डर संरचना गलत होना कपड़े के गेम में न दिखने का सबसे आम कारण है। आपके रिसोर्स को एक fxmanifest.lua जो स्ट्रीमिंग फाइलों को घोषित करता है, और वास्तविक कपड़ों का डेटा एक stream directory with the correct subfolder hierarchy.

-- 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

स्ट्रीम फ़ोल्डर एक सटीक पदानुक्रम का पालन करता है। MP फ्रीमोड पुरुष कपड़ों के लिए, फ़ाइलें जाती हैं stream/mp_m_freemode_01_mp_m_[dlcname]/। महिला के लिए, बदलें mp_m के साथ mp_f। उस फ़ोल्डर के अंदर, आप YDD (drawable dictionary), YTD (texture dictionary), और YMT (metadata) फ़ाइलें रखते हैं। नामकरण कन्वेंशन यह दर्शाता है कि प्रत्येक फ़ाइल किस घटक और drawable इंडेक्स का प्रतिनिधित्व करती है। एक फ़ाइल जिसका नाम है mp_m_freemode_01_mp_m_mypack_jbib_000_u.ydd पुरुष freemode ped के लिए DLC पैक "mypack" से कंपोनेंट 11 (jbib = जैकेट/टॉप्स) पर drawable 0 है।

-- 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

कंपोनेंट आईडी और नामकरण कन्वेंशंस

प्रत्येक कपड़ों के घटक का एक विशिष्ट संक्षिप्त नाम होता है जो फ़ाइल नामकरण में उपयोग होता है। इन्हें याद रखना महत्वपूर्ण है क्योंकि एक टाइपो का मतलब है कि गेम आपकी संपत्ति नहीं ढूंढ पाएगा। घटक मानचित्र है: head (component 0, no clothing), berd (1, मास्क), hair (2), uppr (3, हाथ/दस्ताने), लोवर (4, पैंट/टांगें), hand (5, बैग/पैराशूट), फीट (6, जूते), teef (7, चेन जैसी एक्सेसरीज़), accs (8, अंडरशर्ट/शरीर की एक्सेसरीज़), कार्य (9, बॉडी आर्मर), decl (10, डिकाल/बैज), और jbib (11, टॉप्स/जैकेट)। प्रॉप्स एक अलग सिस्टम का उपयोग करते हैं: p_head (टोपी), p_eyes (चश्मे), p_ears (earrings), और p_lwrist/p_rwrist (घड़ियाँ/कंगन)।

-- 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 फाइल्स को समझना

YMT (Ped Metadata) फ़ाइल वह गोंद है जो एक कपड़ों के पैक को एक साथ रखता है। यह एक XML-आधारित फ़ाइल है जो गेम इंजन को बताती है कि प्रत्येक घटक में कितने ड्रॉएबल्स हैं, प्रत्येक ड्रॉएबल में कितनी टेक्सचर हैं, कपड़े हिलने पर कौन सा ऑडियो चलाना है, और विभिन्न रेंडरिंग गुण। सही तरीके से कॉन्फ़िगर किए बिना YMT, गेम आपके ड्रॉएबल्स को पहचान नहीं पाएगा भले ही YDD और YTD फ़ाइलें पूरी तरह से तैयार हों। YMT को आपके पैक में हर एक ड्रॉएबल और टेक्सचर संयोजन को सूचीबद्ध करना चाहिए। एक भी गायब प्रविष्टि उस आइटम को अदृश्य बना देगी। YMT फ़ाइलों को हाथ से संपादित करना त्रुटिपूर्ण होता है, इसलिए अधिकांश निर्माता CodeWalker या समर्पित YMT जनरेटर जैसे टूल्स का उपयोग करते हैं जो आपकी एसेट फ़ोल्डर सामग्री से फ़ाइल को स्वचालित रूप से बनाते हैं।

<!-- 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>

टेक्सचर विविधताएँ और गुणवत्ता

प्रत्येक ड्रॉएबल के कई टेक्सचर वेरिएशन हो सकते हैं, जो एक ही कपड़ों के मॉडल के विभिन्न रंगों या पैटर्न का प्रतिनिधित्व करते हैं। बेस टेक्सचर फ़ाइल नामकरण पैटर्न का उपयोग करती है [pack]_[component]_diff_[drawableIndex]_[textureIndex]_uni.ytd. टेक्सचर को दो की शक्तियों (512x512, 1024x1024, 2048x2048) में बनाया जाना चाहिए ताकि GPU संगतता बेहतर हो। उच्च रिज़ॉल्यूशन टेक्सचर बेहतर दिखते हैं लेकिन अधिक VRAM उपयोग करते हैं, जो सीमित संसाधन है खासकर उन सर्वरों पर जहाँ खिलाड़ी एक साथ दर्जनों कस्टम कपड़ों के पैक लोड कर रहे होते हैं। एक व्यावहारिक मार्गदर्शिका यह है कि अधिकांश कपड़ों के आइटम के लिए 1024x1024 का उपयोग करें और 2048x2048 उन आइटम के लिए आरक्षित रखें जिनमें सूक्ष्म विवरण जैसे कढ़ाई वाले लोगो या जटिल पैटर्न होते हैं। प्रत्येक YTD फाइल में कई टेक्सचर लेयर हो सकते हैं जिनमें diffuse (रंग), normal (सतह विवरण), और specular (चमक) मैप शामिल हैं, हालांकि अधिकांश FiveM कपड़ों के पैक केवल diffuse लेयर का उपयोग करते हैं ताकि फाइल साइज़ प्रबंधनीय रहे।

क्लोथिंग मेनू स्क्रिप्ट बनाना

एक बार जब आपका स्ट्रीमिंग रिसोर्स काम कर रहा हो, तो खिलाड़ियों के लिए कपड़े ब्राउज़ करने और लागू करने का तरीका चाहिए। एक कपड़े मेनू स्क्रिप्ट प्रत्येक कंपोनेंट के सभी उपलब्ध ड्रॉएबल्स के माध्यम से पुनरावृत्ति करती है और खिलाड़ियों को वास्तविक समय में अपने चरित्र पर उनका पूर्वावलोकन करने देती है। कोर लॉजिक उपयोग करता है GetNumberOfPedDrawableVariations प्रत्येक घटक के लिए कितने ड्रॉएबल्स मौजूद हैं यह निर्धारित करने के लिए, फिर SetPedComponentVariation चयनित को लागू करने के लिए। एक ox_lib या NUI मेनू में इसे लपेटें ताकि उपयोगकर्ता अनुभव परिष्कृत हो। मुश्किल हिस्सा है फर्स्ट-पर्सन प्रीव्यू और कैमरा कोणों को संभालना ताकि खिलाड़ी जो ट्राय कर रहे हैं उसे बिना अजीब क्लिपिंग या ज़ूम समस्याओं के देख सकें।

-- 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

सामान्य समस्याएँ और समस्या निवारण

सबसे सामान्य समस्या कपड़े अदृश्य या गलत आइटम के रूप में दिखाई देना है। यह लगभग हमेशा एक गलत YMT फ़ाइल से जुड़ा होता है जो उचित रूप से drawable count या texture count घोषित नहीं करती। सुनिश्चित करें कि आपकी YMT में आपके स्ट्रीम फ़ोल्डर में मौजूद ड्रॉएबल और टेक्सचर की सही संख्या सूचीबद्ध हो। एक अन्य सामान्य समस्या संसाधन लोडिंग क्रम है: यदि आपका कपड़ों का पैक बेस गेम एसेट्स से पहले लोड होता है, तो ड्रॉएबल इंडेक्स टकरा सकते हैं और वेनिला कपड़ों को अधिलेखित कर सकते हैं। अपने संसाधन नाम के साथ प्रीफिक्स करें zzz_ यह सुनिश्चित करने के लिए कि यह अंतिम लोड हो। टेक्सचर ब्लरनेस आमतौर पर संकेत देता है कि YTD बहुत कम रिज़ॉल्यूशन का उपयोग कर रहा है या मिपमैप सही ढंग से उत्पन्न नहीं हुए हैं। CodeWalker में अपने YTD फ़ाइलों को निर्यात करते समय हमेशा मिपमैप उत्पन्न करें। अंत में, यदि कपड़े पुरुष मॉडलों पर दिखते हैं लेकिन महिला पर नहीं या इसके विपरीत, तो दोबारा जांचें कि आपके पास अलग-अलग फ़ोल्डर हैं mp_m_freemode_01 और mp_f_freemode_01 सही लिंग वाले मेष फ़ाइलों के साथ, क्योंकि पुरुष और महिला पेड मॉडल के अलग कंकाल रिग होते हैं और उन्हें अलग ज्यामिति की आवश्यकता होती है।

सर्वर प्रदर्शन के लिए ऑप्टिमाइज़ करना

कस्टम कपड़े पैक सर्वर डाउनलोड आकार और क्लाइंट VRAM उपयोग में सबसे बड़े योगदानकर्ताओं में से एक हैं। 100 उच्च-रिज़ॉल्यूशन आइटम वाले एक खराब अनुकूलित पैक से आपके सर्वर के डाउनलोड आवश्यकता में गीगाबाइट्स जुड़ सकते हैं। चीजों को प्रबंधनीय रखने के लिए, अपने YTD टेक्सचर को DXT5 या BC7 फॉर्मेट में संपीड़ित करें, जो कच्ची फाइल आकार के एक अंश पर अच्छी दृश्य गुणवत्ता प्रदान करता है। प्रत्येक पैक को एक उचित संख्या में आइटम तक सीमित करें, आमतौर पर 20 से 50 टुकड़े, और बड़े संग्रहों को कई रिसोर्सेज में विभाजित करें जिन्हें स्वतंत्र रूप से लोड किया जा सकता है। लोकप्रिय पैक के लिए "लाइट" संस्करण प्रदान करने पर विचार करें जिसमें 512x512 टेक्सचर हों, जो कम-शक्ति वाले हार्डवेयर वाले खिलाड़ियों के लिए उपयुक्त हो। स्क्रिप्टिंग पक्ष पर, बार-बार कॉल करने से बचें SetPedComponentVariation एक लूप में क्योंकि प्रत्येक कॉल एक मॉडल अपडेट ट्रिगर करता है। सभी घटक अपडेट एकत्र करके और उन्हें एक ही फ्रेम में क्रम से लागू करके कपड़ों में बदलाव करें ताकि दृश्य पॉपिंग और रेंडरिंग ओवरहेड कम हो।

शुरू करने के लिए तैयार?

हमारी शॉप से स्क्रिप्ट लें, या सपोर्ट, अपडेट और आगे आने वाली चीज़ों की झलक के लिए Discord से जुड़ें।