التوثيق

توثيق Yoga minigame

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

  • ESX
  • QBCore
  • Qbox
  • vRP
  • Standalone
01

التثبيت

  1. ضع السكربت

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

  2. اضبط اللغة والسلاسل

    تقبل Config.Locale أيًا من الأكواد الخمسة عشر في locales/. وتحدّد Config.EnabledMoves السلاسل التي يمكن للاعبين تشغيلها، وConfig.DefaultMove هي السلسلة التي تُستخدم حين لا تُذكر واحدة.

  3. ضع أماكنك

    الإحداثيتان في Config.Spots مثالان، استبدلهما بإحداثياتك. لكل مدخل اتجاه وسلسلة وblip يمكنك إطفاؤه. وتعطّل القائمة الفارغة الميزة كاملة ومعها الخيط.

  4. وجّه الإشعارات إلى نظامك

    القيمة Config.Notif على auto وتكتشف ox_lib وokokNotify وQBCore وESX بهذا الترتيب. افرض هدفًا إن كنت تشغّل أكثر من واحد، أو استخدم فرع custom في bridges/notif.lua لنظامك الخاص.

  5. اربط المكافأة، أو لا تفعل

    يعمل النشاط من دون ضبط ومن دون سطر واحد من كودك. وحين تريده أن يدفع شيئًا، استمع إلى avenida_yoga:server:sessionCompleted واقرأ النتيجة. هذه هي نقطة التكامل الوحيدة.

02

الإعداد

حوّل الجلسة إلى مكافأة

event واحد، يُطلق مرة واحدة عند النهاية. والنتيجة محسوبة سلفًا: 1 لسلسلة مكتملة، وسقف 0.4 للمهجورة، ناقص 8 بالمئة عن كل وضعية فاشلة. وما يدفعه أنت من يقرّره.

lua
AddEventHandler('avenida_yoga:server:sessionCompleted', function(src, data)
    -- data.move       'warrior' | 'triangle' | 'sunsalutation'
    -- data.completed  true when the routine went to the end
    -- data.posesBest  poses held
    -- data.poses      poses in the routine
    -- data.fails      poses dropped
    -- data.score      0.0 to 1.0

    if not data.completed then return end

    -- your own reward: stress, stamina, a skill, a payout
    local reward = math.floor(250 * data.score)
end)
03

Exports

Server

  • StartYoga
    exports['avenida_yoga']:StartYoga(src, moveKey?) --> boolean

    يبدأ جلسة للاعب من كود السيرفر عندك، على السلسلة التي تسمّيها أو على الافتراضية. ويعيد false حين تكون السلسلة مجهولة أو اللاعب داخل جلسة أصلًا، فيستطيع job أو prop أن يتصرّف بدل أن يطلقها على العمياء.

  • IsDoingYoga
    exports['avenida_yoga']:IsDoingYoga(src) --> boolean

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

Client

  • StartYoga
    exports['avenida_yoga']:StartYoga(moveKey?) --> boolean

    يطلب جلسة من السيرفر انطلاقًا من كود العميل. ويمرّ الطلب رغم ذلك عبر سجل السيرفر، فهذه ليست طريقة للالتفاف على حارس الجلسة.

  • IsDoingYoga
    exports['avenida_yoga']:IsDoingYoga() --> boolean

    يعيد true ما دام اللاعب المحلي داخل جلسة. وهو توأم export السيرفر على جهة العميل، لكل ما يجب أن يتفاعل في الفريم نفسه.

04

وصفات

أضف مكان يوغا إلى خريطتك

يحتاج المكان إلى إحداثيات واتجاه. وما عدا ذلك اختياري: السلسلة التي يبدأها، والـ blip، وحتى ظهور السجادة من عدمه. ضع move على random للتنويع، أو على menu ليختار اللاعب بنفسه.

lua
-- config/config.lua
Config.Spots = {
    {
        coords  = vector3(-1204.02, -1566.28, 3.63),
        heading = 125.0,
        move    = 'menu',
        blip    = { sprite = 311, colour = 2, scale = 0.7 },
    },
}

ابدأ اليوغا من وظيفة أو من prop

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

lua
local started = exports['avenida_yoga']:StartYoga(src, 'sunsalutation')

if not started then
    -- unknown routine, or the player is already in a session
    return
end

اجعل الجلسة أسهل، أو بلا رحمة

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

lua
-- config/config.lua
Config.BreathingAttempts = 3      -- missed cycles before a pose fails
Config.MaxFails          = 5      -- failed poses before the session stops
Config.HoldBreathFailMs  = 15000  -- holding the breath longer fails the pose
Config.MouseGain         = 3.0    -- marker sensitivity on mouse and keyboard

أطلق سلسلة الآن والباقي لاحقًا

لا يمكن تشغيل غير السلاسل المذكورة في الكونفيغ، سواء بالأمر أو بالـ export أو بمكان. ويستطيع سيرفر أن يبدأ بالمحارب وحده ثم يفتح الأطول منها في فعالية، دون المساس بأي شيء آخر.

lua
-- config/config.lua
Config.EnabledMoves = { 'warrior' }
Config.DefaultMove  = 'warrior'
05

أسئلة

هل يحتاج إلى framework؟

لا. لا يقرأ النشاط المال ولا الأغراض ولا الوظائف ولا الهوية، فليس هناك ما يمكن لـ framework أن يوفّره. ويعمل الملف نفسه على ESX وQBCore وQbox وvRP وox_core أو على سيرفر مجرّد دون ضبط أي bridge. والجزء الوحيد الذي يعرف الـ framework عندك هو سطر الإشعارات، وهو ملف مفتوح بستة فروع.

هل أحتاج إلى ox_lib؟

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

هل هناك قاعدة بيانات؟

لا شيء، ولا ملف SQL أيضًا. يحتفظ السيرفر بالجلسات الحيّة في الذاكرة، واحدة لكل لاعب، مع مهلة تنظّف المهجورة. ولا يُكتب شيء في أي مكان. وإن أردت سجلًا لكل لاعب، فلهذا وُجد event النهاية: تخزّن ما يهمّك أنت، في مخططك أنت.

هل يستطيع عميل معدَّل تزوير جلسة مثالية؟

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

ماذا يحدث حين يترك اللاعب وضعية؟

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

هل يمكن ممارسة اليوغا في أي مكان أم في مكان محدد فقط؟

الاثنان معًا. يعمل الأمر في أي مكان سيرًا على الأقدام، والأماكن طبقة اختيارية فوقه، للمواضع التي تريد الإشارة إليها بسجادة وblip. اترك Config.Spots فارغة فلا يبقى غير الأمر والـ exports، دون أن يبدأ خيط الأماكن أصلًا.

هل يعمل على يد التحكّم؟

نعم، بل صُمّم لها أولًا كما في اللعبة الأصلية. ستيكان يوجّهان المؤشرين، والزنادان العلويان يحملان التنفّس، مع اهتزاز ما دام المؤشران على هدفيهما. وعلى الفأرة ولوحة المفاتيح تعمل الجلسة نفسها بـ WASD والفأرة، وتتبدّل التلميحات وحدها حسب آخر ما استخدمه اللاعب.

كم يكلّف السكربت حين لا يمارس أحد اليوغا؟

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

السلة
Spirit RP
Discord