التوثيق

توثيق Tattoo shop

كتالوج وشوم اللعبة كاملًا، مع سلة شراء وكرسي تجلس عليه فعلًا. 1615 تصميمًا موزّعة على 26 مجموعة DLC، تراها مباشرة على شخصيتك وأنت تضيفها، وتدفع ثمنها دفعة واحدة. إزالة بالليزر مشمولة، ورسّام يدخل ويؤدي العمل.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

التثبيت

  1. ضع السكربت

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

  2. نفّذ ملف SQL

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

  3. اضبط أسعارك

    افتح config/tattoo.lua. السعر الموحّد، ومُعامِلات المجموعات، وسعر الليزر هي الأرقام الثلاثة التي تحسمها قبل فتح المتجر. أما اللغة والـ bridges ففي config/config.lua.

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

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

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

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

02

الإعداد

حدّد سعر الحبر

سعر موحّد يغطي الكتالوج كله، والمُعامِلات تجعل المجموعات القديمة رخيصة والنادرة غالية، دون تسعير 1615 تصميمًا يدويًا. وكل شيء يُعاد حسابه على السيرفر عند الدفع.

lua
-- config/tattoo.lua
Config.Tattoo.Prices = {
    flat  = 1000,   -- every tattoo, unless PricePerZone is on
    hair  = 500,
    reset = 3000,   -- laser removal, per tattoo removed
}

Config.Tattoo.PricePerZone = false

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

Exports

Client

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

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

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

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

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

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

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

    يدفع مظهرًا إلى الـ ped بما في ذلك الوشوم. ويُعاد بناء خانة الزينة دفعة واحدة، ما يمنع الوميض الذي يظهر عند تطبيق الوشم قطعة قطعة.

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

    يغيّر ملابس الـ ped دون المساس بالوشم. الوسيط الثالث يبقي التغيير خارج قاعدة البيانات، وهو ما تريده لمشهد ينتهي بمغادرة اللاعب.

04

وصفات

حاسِب حسب منطقة الجسم بدل السعر الموحّد

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

lua
-- config/tattoo.lua
Config.Tattoo.PricePerZone = true

Config.Tattoo.Prices = {
    [0] = 1250, -- torso / back
    [1] = 1000, -- head
    [2] = 600,  -- left arm
    [3] = 600,  -- right arm
    [4] = 750,  -- left leg
    [5] = 750,  -- right leg
    [6] = 750,  -- unknown
    reset = 3000,
}

انقل وشمًا إلى التبويب الصحيح

GTA تصنّف كثيرًا من تصاميم الـ DLC في المنطقة الخطأ. 368 مصحَّحة أصلًا، والقائمة مفتوحة لتضيف إليها. فعّل Config.Debug لقراءة الـ nameHash داخل اللعبة، ثم أضفه.

lua
-- config/tattoo.lua
Config.Tattoo.SubZoneOverrides = {
    ['FM_Hip_M_Tat_000'] = 'back',
    ['MP_Buis_M_Tat_021'] = 'neck',
    -- 'back' | 'chest' | 'neck' | 'head'
}

أطّر الجلسة على ذوقك

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

lua
-- config/tattoo.lua
Config.Tattoo.ApplyScene = true

Config.Tattoo.SceneCamera = {
    Enabled      = true,
    Distance     = 1.5,   -- metres in front of the player
    Height       = 0.75,  -- metres above their feet
    TargetHeight = 0.6,   -- aim at chest height
    Fov          = 42.0,
}

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

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

lua
local hairbase = exports['avenida_tattoo']:GetHairbase()
local tattoos  = exports['avenida_tattoo']: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
05

أسئلة

لماذا تغيب بعض الوشوم عن المتجر؟

لسببين، وكلاهما مقصود. مجموعات الـ DLC الأحدث تُدمَج بحسب نسخة اللعبة، فالتصميم الذي لا يستطيع عميل اللاعب عرضه لا يُدرَج أبدًا بدل أن يُدرَج ويظهر معطوبًا. ومع تفعيل PricePerZone لا تُباع إلا الوشوم التي تقع في منطقة مُعلَنة، وهذا مذكور صراحة في الإعداد: يختفي معظم الكتالوج حتى تملأ الـ overrides. ومع إطفاء PricePerZone، وهو الافتراضي، يكون الكتالوج كله معروضًا.

وشم يظهر في التبويب الخطأ

هذه GTA لا السكربت: اللعبة تدرج نسبة كبيرة من تصاميم الـ DLC تحت منطقة لا تطابق موضعها على الجسم. 368 منها مصحَّحة يدويًا، 310 إلى الظهر و58 إلى الرقبة. وللبقية، فعّل Config.Debug لقراءة الـ nameHash داخل اللعبة وأضف سطرًا إلى Config.Tattoo.SubZoneOverrides، وهو خارج الـ escrow.

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

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

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

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

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

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

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

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

هل أسماء الوشوم مترجمة؟

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

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

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

السلة
Spirit RP
Discord