التوثيق

توثيق Clothing store

متجر ملابس بأطقم محفوظة، وخزائن للشركات، ومحرر يسعّر الكتالوج من داخل اللعبة. كل مكوّنات الملابس وإكسسواراتها، تشتريها قطعة قطعة أو طقمًا كاملًا، مع سجل على السيرفر يمنع أحدًا من ارتداء ما لم يدفع ثمنه.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

التثبيت

  1. ضع السكربت

    حمّل السكربت من حسابك على Tebex، وانسخ مجلد avenida_clotheshops/ إلى مجلد resources، وأضف ensure avenida_clotheshops إلى إعداد السيرفر بعد ensure oxmysql.

  2. نفّذ ملف SQL

    نفّذ القسم [A] من INSTALL.sql على قاعدة بياناتك. القسم [B] مشروط، ورأس الملف يقول متى تحتاجه.

  3. امنح صلاحيات الإدارة

    أضف add_ace group.admin avenida_clotheshops.admin allow وadd_ace group.admin avenida_clotheshops.vip allow إلى إعداد السيرفر. الأولى تفتح محرر الكتالوج، والثانية تفتح ما تضعه خلف قائمة الـ VIP.

  4. سعّر الكتالوج من داخل اللعبة

    اضبط Config.DevMode.Enabled = true، وادخل متجرًا وافتح المحرر. حدّد الأسعار، وأخفِ ما لا تبيعه، واحجز ما يخص وظيفة بعينها. وكل ذلك يستقر في config/clothes_overrides.lua. وأطفئ DevMode عند الانتهاء، مع أن كل حفظ يُتحقَّق منه مجددًا على السيرفر.

  5. تحقق من التكاملات

    اضبط Config.Debug = true، وأعد التشغيل، واقرأ الكونسول: سطر لكل فئة bridge يسمّي الهدف الذي اختير. وConfig.Debug لا يتحكم إلا بالسجلات، وللمحرر مفتاحه الخاص.

02

الإعداد

تسعير قسم بثلاث طرق

كل متجر يعلن أقسامه، وكل قسم يعلن نمط تسعيره. سعر موحّد لقسم بأكمله، أو مُعامِل يجعل الـ drawables اللاحقة أغلى، أو جدول حين لا تستحق سعرًا خاصًا إلا بضع قطع.

lua
-- config/clothes_shops.lua
categories = {
    tops = {
        enabled = true,
        price   = { mode = 'fixed', base = 300 },
    },
    pants = {
        enabled = true,
        -- price = base + index * mult
        price   = { mode = 'multiplier', base = 100, mult = 2 },
    },
    mask = {
        enabled = true,
        price   = { mode = 'table', map = { [12] = 900, [45] = 1500 } },
        -- only these drawables are offered
        whitelist = { 12, 45, 51 },
    },
}
03

Exports

Client

  • GetSkinData
    exports['avenida_clotheshops']:GetSkinData()

    الزيّ الذي يرتديه اللاعب، مكوّنًا بمكوّن، بما في ذلك الـ props. وهذا ما يكتبه المتجر عند الشراء، فيبقى دائمًا متوافقًا مع ما تعرضه خزانة الملابس.

  • ApplySkin
    exports['avenida_clotheshops']:ApplySkin(data, ped)

    يطبّق مظهرًا كاملًا على ped. وتطبيق طقم يفرّغ خانة الزينة، فيعيد هذا الاستدعاء بعده عمل الحلاق ورسّام الوشم بدل أن يترك الجلد عاريًا.

  • ApplyClothing
    exports['avenida_clotheshops']:ApplyClothing(data, ped, temporary)

    يغيّر الملابس ولا يمسّ شيئًا غيرها. ومع ضبط temporary على true يبقى الطقم للجلسة الحالية فقط، وهو السلوك المطلوب من زيّ توزّعه وظيفة.

Server

  • GetBagStorage
    exports['avenida_clotheshops']:GetBagStorage(sex, drawable) --> { weight, slots } | nil

    السعة التي يمنحها drawable الحقيبة، وزنًا وخانات، أو nil إذا كان هذا الـ drawable لا يحمل شيئًا. استدعِها من ريسورس المخزون لديك كي تحمل الحقيبة المشتراة شيئًا فعلًا.

04

وصفات

افتح متجرًا بضريبته وخصمه

المتجر مدخل واحد يحمل اسمه المعروض، وطريقة الدفع، ورمز العملة، وضريبة وخصمًا اختياريين على مجموع السلة، والأقسام التي يقدّمها. وثبّت المفتاح: فهو معرّف المتجر المحفوظ داخل الأطقم، وتغييره بعدما تسوّق فيه لاعبون يفسد بياناتهم.

lua
-- config/clothes_shops.lua
Config.Clothes.Shops[22] = {
    name       = 'Ponsonbys - Rockford Hills',
    payment    = 'bank',
    currency   = '$',
    tax        = 0.20,        -- +20% on the cart
    discount   = 0.00,
    outfitMode = true,
    blip = { sprite = 73, color = 4, scale = 0.7, coords = vec3(-708.2, -152.2, 37.4) },
    categories = {
        tops  = { enabled = true, price = { mode = 'fixed', base = 900 } },
        shoes = { enabled = true, price = { mode = 'fixed', base = 450 } },
    },
}

احجز الزيّ لوظيفة واحدة

القطعة المقيَّدة مخفية عمّن لا يجتاز الشرط، فلا يرى المدني سترة الشرطة في الشبكة أصلًا. وخزائن الشركات تذهب أبعد من ذلك: المدير يحرّر قائمة مشتركة ويرتديها كل عضو دون دفع، وهو ما تحتاج إليه لمجنَّد في أول مناوبة.

lua
-- config/clothes_overrides.lua, or write it from the in-game editor
Overrides['tops'] = {
    [56] = { job = 'police', label = 'LSPD jacket' },
    [12] = { hidden = true },
    [31] = { restricted = true },   -- ACE permission
}

أطفئ سجل الملكية

السجل مفعّل افتراضيًا، وهو ما يمنع عميلًا معدَّلًا من ارتداء الكتالوج مجانًا. ولا تطفئه إلا إذا كان لديك ريسورس آخر يغيّر ملابس اللاعبين ويمنحهم قطعًا لم يشتروها، وتفضّل ألا تبني لهم سجلًا. والشخصيات القائمة يُبنى سجلها مما ترتديه، فتفعيله لاحقًا لا يسحب شيئًا.

lua
-- config/clothes.lua
Config.Clothes.RequireOwnership = false

-- how far from a store the server still accepts a purchase
Config.Clothes.PurchaseRange = 30.0

-- saved outfits per character, enforced server side
Config.Clothes.MaxOutfits = 30
Config.Clothes.MaxOutfitsRestricted = 50

أعد رسم الزينة من سكربتك أنت

تطبيق طقم كامل يمسح خانة الزينة في الـ ped، وهي مشتركة على مستوى السيرفر كله. فإذا كان سكربتك يغيّر ملابس لاعب، اقرأ أولًا ما يملكه هذا السكربت وأعِده بعد ذلك، وإلا ذهبت الوشوم وقاعدة الشعر مع التغيير.

lua
local hairbase = exports['avenida_clotheshops']:GetHairbase()
local tattoos  = exports['avenida_clotheshops']:GetTattoos()

-- your own clothing work here

if hairbase then
    AddPedDecorationFromHashes(PlayerPedId(), hairbase.c, hairbase.t)
end
for _, dec in ipairs(tattoos) do
    AddPedDecorationFromHashes(PlayerPedId(), dec.c, dec.t)
end
05

أسئلة

لاعب يقول إنه فقد ملابس كان يملكها

راجع Config.Clothes.RequireOwnership. السجل يبني بيانات الشخصية مما ترتديه أصلًا أول مرة يراها، فتفعيله لا يسحب خزانة أحد. أما ما يرفضه فهو كتابة لقطعة بلا شراء خلفها، وهذا تحديدًا ما يرسله عميل معدَّل. وإذا كان لديك ريسورس يمنح اللاعبين قطعًا لم تُشترَ، فسجّل تلك المشتريات أو اضبط الخيار على false.

محرر الكتالوج لا يفتح

يحتاج إلى أمرين معًا: صلاحية ACE باسم avenida_clotheshops.admin، وConfig.DevMode.Enabled = true. أما Config.Debug فمفتاح آخر لا يتحكم إلا بالسجلات. وكل حفظ يُتحقَّق منه مجددًا على السيرفر، فمنح نفسك الصلاحية داخل اللعبة لا يكفي وحده.

السترة نفسها تظهر عدة مرات

هذه GTA. اللعبة تكرر الـ drawable على عدة أرقام، ومعظم المتاجر تعرضها كلها. وهنا تُصفّى الـ drawables الوهمية، فإن بقي لديك تكرار فهو غالبًا حزمة ملابس تحمل الأصل نفسه مرتين. أخفِ الزائد من المحرر داخل اللعبة، فيستقر في config/clothes_overrides.lua.

الشعر يخترق الخوذة

سلوك الشعر مُعلَن لكل قطعة، فالخوذة أو القناع الذي أضفته أنت لا قاعدة له بعد. اضبط سلوكه من محرر الكتالوج، وتذكّر أن للاعب رأيًا هنا: من يريد الاحتفاظ بتسريحته يستطيع قول ذلك، واختياره يتقدّم على القصّ التلقائي.

هل تحتاج صور الأطقم إلى شيء؟

تحتاج إلى screenshot-basic، ولهذا الغرض فقط. وهو التكامل الاختياري الوحيد الذي يلاحظ اللاعب غيابه في جدول المتطلبات: من دونه تعمل الأطقم المحفوظة كما هي تمامًا، لكن القائمة تعرض أسماء بدل صور.

ما الفريموركات المدعومة فعلًا؟

QBCore وESX وvRP، إضافة إلى وضع standalone لا يحتاج إلى أي فريمورك، وفرع custom في bridges/framework.lua لأي شيء آخر. الكشف يعمل عند الإقلاع ويجسّ الـ export الحقيقي. أما Qbox وox_core فلا فرع مخصص لهما: يمران عبر مسار standalone أو custom، لا عبر هدف مُختبَر.

هل أشغّله مع avenida_barber وavenida_tattoo؟

نعم، لهذا بُنيت. وهذا السكربت أكثرها تدخلًا، لأن تطبيق طقم يمسح خانة الزينة، فهو يعيد ما يملكه الآخران بعد كل تغيير. والممنوع هو تشغيل السكربتات المنفصلة وحزمة avenida_skin معًا. والسكربت يكتشف التداخل ويقوله في الكونسول عند الإقلاع.

كم يكلّف حين لا يتسوق أحد؟

0.00ms. نقاط التفاعل تتقاسم خيطًا واحدًا يهبط إلى ثانية حين لا يكون أحد قريبًا، والعلامات تُنشأ مرة واحدة، وكل خيط جلسة يُقتَل عند الخروج. أما مهلة المعاينة فلا توجد إلا والقائمة مفتوحة، ويمكن ضبطها للأجهزة الأضعف.

السلة
Spirit RP
Discord