التوثيق

توثيق Core Skin (3 in 1)

صالون حلاقة واستوديو وشم ومتجر ملابس في سكربت FiveM واحد. 1615 وشمًا، وكل مكوّنات الملابس وإكسسواراتها، ومجموعة الرأس والبشرة كاملة، موزّعة على 36 متجرًا. واجهة واحدة، وكاميرا واحدة، ومسار شراء واحد، وشيء واحد تثبّته على ESX أو QBCore أو vRP أو من دون فريمورك.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

التثبيت

  1. ضع السكربت

    حمّل السكربت من حسابك على Tebex، وانسخ المجلد إلى مجلد resources، وأضف ensure avenida_core_skin إلى إعداد السيرفر بعد ensure oxmysql. وأبقِ اسم المجلد كما يصلك، فهو الاسم المعلَن في الـ manifest.

  2. نفّذ ملف SQL، القسم [A] كاملًا

    القسم [A] يحوي كل جداول السكربت، ومنها سجل الملابس المدفوعة. أما الأقسام [B] و[C] و[D] فمشروطة، والملف يقول متى يلزم كل منها. و[D] هو أغراض المخزون، ولا يلزم إلا إذا فعّلت Config.Clothes.GiveAsItems، وهو الذي يُنسى عادة.

  3. اختر وحداتك

    افتح config/config.lua واضبط Config.Modules. والوحدة المضبوطة على false لا تكلف شيئًا إطلاقًا: لا علامة، ولا نقطة تفاعل، ولا خيط، وإعدادها لا يُقرأ أصلًا. وما دمت هناك، فراجع Config.Locale.

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

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

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

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

02

الإعداد

شغّل المتاجر التي تحتاج إليها فقط

الوحدات الثلاث مستقلة. والسيرفر الذي لديه متجر ملابس يرضيه يحتفظ بالحلاقة والوشم، ولا يعمل شيء من الوحدة المطفأة.

lua
-- config/config.lua
Config.Modules = {
    Barber  = true,
    Tattoo  = true,
    Clothes = false,   -- no blip, no point, no thread
}

Config.Locale = 'en'

Config.Framework = 'auto'   -- 'qbcore' | 'esx' | 'vrp' | 'standalone' | 'custom'
Config.Notif     = 'auto'
Config.Interact  = 'auto'
Config.Clothing  = 'auto'
03

Exports

Client

  • GetHairbase
    exports['avenida_skin']:GetHairbase() --> { c = collection, t = nameHash } | nil

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

  • GetTattoos
    exports['avenida_skin']:GetTattoos() --> { { c, t }, ... }

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

Server

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

    وزن الحقيبة وعدد خاناتها بحسب قيمة drawable، مقروءة من إعدادات خزانة الملابس. ويعيد nil لأي drawable غير معرَّف بوصفه حقيبة.

04

وصفات

سعّر قسم ملابس بثلاث طرق

كل متجر يعلن أقسامه، وكل قسم يعلن نمط تسعيره. سعر موحّد لقسم بأكمله، أو مُعامِل يجعل الـ 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 } },
    },
}

اجعل مجموعات الوشم القديمة رخيصة والنادرة غالية

سعر موحّد يغطي 1615 تصميمًا، ومُعامِل لكل مجموعة DLC يتكفّل بالباقي، فلا تسعّر الكتالوج يدويًا أبدًا. والإزالة بالليزر تحتفظ بسعرها ولا تُضرَب بأي مُعامِل.

lua
-- config/tattoo.lua
Config.Tattoo.Prices = {
    flat  = 1000,
    reset = 3000,   -- laser removal, per tattoo removed
}

Config.Tattoo.CollectionMultipliers = {
    multiplayer_overlays = 0.80,   -- base game, cheaper
    mpHipster_overlays   = 0.85,
    -- anything not listed stays at 1.0
}

أطّر مشهدَي الحلاقة والوشم

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

lua
-- config/config.lua
Config.Camera = {
    Sensitivity = 1.0,      -- rotation, zoom and height, clamped to 0.1 - 5.0
    InvertY     = false,
}

Config.UI = {
    Tutorial          = true,
    Timecycle         = 'casino_brightroom',
    TimecycleFadeMs   = 400,
    DofStrength       = 0.1,
}

أخفِ الـ HUD ما دام المتجر مفتوحًا

السكربت يطلق حدث client عند فتح القائمة وإغلاقها، للوحدات الثلاث. استمع إليه بدل أن تفحص الحالة في حلقة، فهو الإشارة نفسها التي تستعملها معالجة الـ HUD المدمجة.

lua
AddEventHandler('avenida_skin:client:uiStateChanged', function(hidden)
    if hidden then
        exports['myhud']:hide()
    else
        exports['myhud']:show()
    end
end)
05

أسئلة

هل آخذ الحزمة أم السكربتات الثلاثة منفصلة؟

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

أريد الحلاقة والوشم فقط

اضبط Config.Clothes = false في Config.Modules. الوحدة المطفأة لا تسجّل شيئًا: لا علامة، ولا نقطة تفاعل، ولا خيط، وإعدادها لا يُقرأ أصلًا. وتستطيع أيضًا شراء السكربتين المنفصلين، فالفارق في السعر لا في ما يعمل.

هل تحافظ الحزمة على مظهر لاعبيّ الحالي؟

نعم. تقرأ وتكتب شكل الشخصية نفسه الذي تستعمله السكربتات المنفصلة، وتمر عبر جسر المظهر نفسه، فتبقى qb-clothing وillenium-appearance وfivem-appearance وesx_skin تعمل كما هي، وكذلك الجدول الخاص بالسكربت. والشخصيات القائمة يُبنى سجلها مما ترتديه، بما في ذلك سجل ملكية الملابس.

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

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

هل يعمل مع حزمة ox؟

نعم، حيثما يهم الأمر: ox_lib للإشعارات، وox_target لنافذة التفاعل، وox_inventory لتحويل الملابس إلى أغراض ولحاويات الحقائب، وoxmysql بوصفه الاعتمادية الوحيدة التي لا غنى عنها. ولا شيء منها إلزامي عدا oxmysql.

ماذا يكلفني vRP؟

vRP يخزّن مكونات الملابس والإكسسوارات، ولا شيء غير ذلك. ولا حقل فيه لطبقات الرأس، ولا لملامح الوجه، ولا للون الشعر، ولا للون العينين، ولا لزينة الـ ped، لذلك تُحفَظ الشخصية كاملة على vRP في جدول هذا السكربت. ومع ذلك يبقى vRP يحصل على الشق الخاص بالملابس، ويُحدَّث بعد أي تغيير. أما vRP 2 وvRP 0.5 فغير مدعومين، والسكربت يقول ذلك في الكونسول بدل أن يسيء التصرف بصمت.

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

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

كم يكلّف حين لا يكون أحد في المتجر؟

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

السلة
Spirit RP
Discord