التوثيق

توثيق Barber shop

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

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

التثبيت

  1. ضع السكربت

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

  2. نفّذ ملف SQL

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

  3. راجع الإعدادات

    افتح config/config.lua. القيم الافتراضية تناسب أغلب السيرفرات، والسطر الوحيد الجدير بالمراجعة هو Config.Locale. والأسعار والمتاجر وسلوك الكرسي في الملف المجاور config/barber.lua.

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

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

  5. امنح نفسك صلاحيات الإدارة

    أضف add_ace group.admin avenida_barber.admin allow إلى إعداد السيرفر، ثم نفّذ /avenida_barber_check داخل اللعبة للحصول على التقرير الكامل.

02

الإعداد

افرض تكاملًا بدل أن تكشفه

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

lua
-- config/config.lua
Config.Locale    = 'en'
Config.UseOxLib  = true

Config.Framework = 'auto'   -- 'qbcore' | 'esx' | 'vrp' | 'standalone' | 'custom'
Config.Notif     = 'ox_lib' -- 'qbcore' | 'esx' | 'ox_lib' | 'okok' | 'vrp' | 'chat' | 'custom'
Config.Interact  = 'auto'   -- 'avenida' | 'ox_target' | 'qb-target' | 'standalone' | 'custom'
Config.Clothing  = 'auto'   -- 'qb' | 'illenium' | 'fivem-appearance' | 'esx_skin' | 'vrp' | 'table' | 'custom'

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

Exports

Client

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

    قاعدة الشعر التي يرتديها الـ ped الآن، أو nil إذا كانت قصّة الشعر لا تحتاج إليها. اقرأها قبل استدعاء ClearPedDecorations وأعدها بعده، فيحتفظ الشعر بتظليله بدل أن يصبح قبعة مسطّحة.

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

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

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

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

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

    يكتب مظهرًا كاملًا على ped. مرّر الـ ped الذي تريد تلبيسه، ويمكن أن يكون نسخة معاينة بدل اللاعب، فتستطيع المرآة أو شاشة اختيار الشخصية أن تعرض الوجه نفسه.

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

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

04

وصفات

اضبط الكاميرا ومظهر المشهد

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

lua
-- config/config.lua
Config.Camera = {
    Sensitivity = 1.4,          -- faster drag
    InvertY     = true,
}

Config.UI = {
    Tutorial          = true,   -- first-run tour, replayable from the toolbar
    Sounds            = true,
    Blips             = true,

    Timecycle         = 'casino_brightroom',
    TimecycleStrength = 1.0,
    TimecycleFadeMs   = 400,    -- 0 makes it snap like a light switch

    DofStrength       = 0.1,    -- false drops the per-frame SetUseHiDof call
    DofPlanes         = { 0.4, 0.7, 2.2, 4.5 },
}

أضف متجرًا، أو ألغِ الإخراج

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

lua
-- config/barber.lua
Config.Barber.ChairScene = false   -- menu opens on the spot

Config.Barber.Shops[9] = {
    BarberPedModel = 's_m_m_hairdress_01',
    Welcome        = vec3(-1282.60, -1116.60, 6.99),
    Blip           = { sprite = 71, color = 4, scale = 0.7 },
}

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

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

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

ClearPedDecorations(PlayerPedId())
-- your own decoration 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

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

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

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

أسئلة

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

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

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

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

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

نعم، حيثما يهم الأمر: ox_lib للإشعارات عبر Config.UseOxLib، وox_target لنافذة التفاعل، وox_inventory لأغراض الملابس، وoxmysql بوصفه الاعتمادية الوحيدة التي لا غنى عنها. ولا شيء منها إلزامي عدا oxmysql، وbridges/compat.lua يوفّر البدائل بالـ natives حين يكون ox_lib مطفأ. أما ما لا فرع مخصص له فهو ox_core باعتباره فريموركًا: على سيرفر ox_core يعمل السكربت من دون فريمورك، أو عبر فرع custom في bridges/framework.lua إن أردت له أن يقرأ بيانات لاعبك.

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

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

تسريحة ناقصة من القائمة

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

الرأس لا يتابع مؤشري

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

هل أضيف لغة أخرى؟

خمس عشرة لغة تصلك مملوءة، في مجلد locales/ المفتوح. انسخ ملفًا، وترجم القيم، ووجّه Config.Locale إلى رمزك الجديد. وen.lua هو البديل لأي مفتاح تتركه، فالملف الناقص لا يُظهر عنوانًا فارغًا أبدًا.

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

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

السلة
Spirit RP
Discord