سكريبتات نظام الوقود في FiveM: إعادة تزويد الوقود الواقعية للمركبات
إضافة وقود يعمل إلى خادم FiveM الخاص بك. محطات الوقود، علب الجيري، المركبات الكهربائية وأفضل سكربتات الوقود لإعدادات QBCore وESX والمستقلة.
Agency Scripts
المؤسس والمطور الرئيسي في Agency Scripts
آليات استهلاك الوقود
يضيف نظام الوقود الواقعي طبقة أساسية من الانغماس ويخلق مصدراً طبيعياً لنزيف المال يساعد في موازنة اقتصاد خادمك. تتضمن الآلية الأساسية تتبع مستوى وقود كل مركبة كقيمة عائمة بين 0 و100، مع تقليله بناءً على نشاط المحرك وسلوك القيادة. خزّن مستوى الوقود باستخدام حقائب حالة الكيان مع Entity(vehicle).state.fuel حتى تبقى القيمة عبر جميع العملاء وتنجو من تغييرات ملكية الشبكة. حساب معدل الاستهلاك لكل نبضة بناءً على RPM الحالي للمركبة التي تم الحصول عليها من خلال GetVehicleCurrentRpm، موضع دواسة الوقود من GetControlNormal، ومعامل استهلاك خاص بفئة المركبة. يجب أن تستهلك السيارات الرياضية والفائقة الوقود بشكل أسرع بكثير من المركبات الاقتصادية، بينما تقع الشاحنات وسيارات الدفع الرباعي في مكان ما بينهما. طبق معدلات استهلاك إضافية لسلوكيات القيادة العدوانية مثل التسارع السريع، والسرعات العالية المستمرة، وكبح المحرك. عندما يصل الوقود إلى الصفر، قلل تدريجياً من السرعة القصوى للمركبة باستخدام SetVehicleMaxSpeed لمحاكاة التقطع بدلاً من إيقاف المحرك فورًا، مما يمنح اللاعب بضع ثوانٍ حرجة للتوقف بأمان.
-- Client-side fuel consumption thread
local fuelConsumptionRate = 0.0
CreateThread(function()
while true do
local ped = PlayerPedId()
local vehicle = GetVehiclePedIsIn(ped, false)
if vehicle ~= 0 and GetPedInVehicleSeat(vehicle, -1) == ped then
local engineOn = GetIsVehicleEngineRunning(vehicle)
if engineOn then
local rpm = GetVehicleCurrentRpm(vehicle)
local speed = GetEntitySpeed(vehicle) * 3.6 -- km/h
local classMultiplier = Config.ClassConsumption[GetVehicleClass(vehicle)] or 1.0
-- Base consumption + RPM factor + speed factor
fuelConsumptionRate = (Config.BaseConsumption
+ (rpm * Config.RpmFactor)
+ (speed * Config.SpeedFactor)
) * classMultiplier
local currentFuel = Entity(vehicle).state.fuel or 100.0
local newFuel = math.max(0.0, currentFuel - fuelConsumptionRate)
Entity(vehicle).state:set('fuel', newFuel, true)
-- Engine stall when empty
if newFuel <= 0 then
SetVehicleUndriveable(vehicle, true)
SetVehicleEngineOn(vehicle, false, true, true)
elseif newFuel <= 5.0 then
-- Sputtering effect
SetVehicleMaxSpeed(vehicle, 30.0 * (newFuel / 5.0))
end
end
end
Wait(1000) -- Update every second
end
end)
واجهة محطة الوقود وإعادة التزود بالوقود
تجربة محطة الوقود يجب أن تكون مصقولة وبديهية من خلال واجهة NUI مصممة جيدًا. عندما يركن اللاعب بالقرب من مضخة وقود ضمن نصف قطر محدد، عرض مطالبة تفاعل. عند التفاعل، افتح واجهة إعادة التزود بالوقود التي تعرض مستوى الوقود الحالي كمقياس أو شريط تقدم، سعة خزان المركبة، السعر لكل لتر بناءً على نوع الوقود الحالي، وخيارات التعبئة الكاملة أو ضخ مبلغ محدد بالدولار. يجب أن تلعب رسوم إعادة التزود بالوقود على شخصية اللاعب التي تقف بجانب المركبة ممسكة بمقبض مضخة الوقود باستخدام TaskPlayAnim، ومضخة الوقود نفسها إذا كنت تستخدم إعداد دعامة مخصصة. يجب أن يمتلئ الوقود تدريجياً في الوقت الحقيقي بدلاً من القفز الفوري إلى الامتلاء الكامل، مما يخلق انتظاراً قصيراً يضيف واقعية ويمنع اللاعبين من إعادة التزود بالوقود بسرعة أثناء المطاردات. عرض إجمالي التكلفة الجاري تحديثه مباشرة أثناء ضخ الوقود، وخصم الدفع فقط عندما يتوقف اللاعب عن الضخ أو يمتلئ الخزان. دعم أنواع وقود متعددة في محطات الوقود المميزة: البنزين العادي بالسعر القياسي، والوقود المميز الذي يوفر دفعة أداء صغيرة ويكلف أكثر، والديزل للشاحنات والمركبات الصناعية التي تستخدم مضخات منفصلة.
Jerry Can والتزود بالوقود الطارئ
نفاد الوقود على الطريق السريع سيناريو واقعي يجب أن يتعامل معه نظامك بسلاسة دون إجبار اللاعب على التخلي عن مركبته. نفذ عنصر جيري كان يمكن شراؤه من محطات الوقود أو متاجر الأدوات وملؤه بالوقود عند أي مضخة. يجب أن يعمل الجيري كان كعنصر مخزون قابل للاستخدام مع بيانات وصفية تتبع مستوى التعبئة الحالي، عادة يحمل 10-20 لتر. عند استخدام اللاعب للجيري كان بالقرب من مركبة فارغة، تشغيل رسوم متحركة للصب ونقل الوقود من العلبة إلى خزان المركبة. يجب أن يكون للجيري كان وزن في نظام المخزون يتناسب مع كمية الوقود التي يحتويها، مما يجعل العلبة الممتلئة أثقل من الفارغة. أضف ميكانيكية يمكن من خلالها طلب المساعدة على الطريق عبر الهاتف داخل اللعبة، مع إرسال NPC أو شاحنة سحب يديرها لاعب لخدمة توصيل الوقود مقابل رسوم. للاندماج، يجب أن يتمكن اللاعبون من شفط الوقود من مركبات أخرى باستخدام خرطوم، مع نقل الوقود بين المركبات مقابل تكلفة وقت وخطر القبض عليهم أثناء الفعل.
-- Jerry can usage handler
RegisterNetEvent('fuel:useJerryCan')
AddEventHandler('fuel:useJerryCan', function(slot)
local src = source
local ped = GetPlayerPed(src)
local coords = GetEntityCoords(ped)
-- Find nearest vehicle
local nearbyVehicle = GetClosestVehicle(coords, 3.0)
if not nearbyVehicle or nearbyVehicle == 0 then
return notify(src, 'No vehicle nearby.', 'error')
end
-- Get jerry can metadata
local canData = exports.ox_inventory:GetSlot(src, slot)
if not canData or not canData.metadata or not canData.metadata.fuel then
return notify(src, 'Jerry can is empty.', 'error')
end
local canFuel = canData.metadata.fuel
local vehicleFuel = Entity(nearbyVehicle).state.fuel or 0.0
local maxTransfer = math.min(canFuel, 100.0 - vehicleFuel)
if maxTransfer <= 0 then
return notify(src, 'Vehicle tank is already full.', 'error')
end
-- Transfer fuel
Entity(nearbyVehicle).state:set('fuel', vehicleFuel + maxTransfer, true)
-- Update jerry can metadata
local remainingFuel = canFuel - maxTransfer
if remainingFuel <= 0 then
exports.ox_inventory:SetMetadata(src, slot, { fuel = 0, label = 'Empty Jerry Can' })
else
exports.ox_inventory:SetMetadata(src, slot, { fuel = remainingFuel })
end
notify(src, ('Transferred %.1f liters to the vehicle.'):format(maxTransfer), 'success')
end)
دعم المركبات الكهربائية
تتميز خوادم اللعب التمثيلي الحديثة بشكل متزايد بسيارات كهربائية تحتاج إلى بنية تحتية موازية للشحن. يجب ألا تستهلك السيارات الكهربائية البنزين وبدلاً من ذلك تستنزف مستوى شحن البطارية الذي يعمل بشكل مماثل لمقياس الوقود لكنه ينفد بمعدل مختلف. يجب أن يكون استهلاك السيارات الكهربائية أقل لكل كيلومتر من السيارات التي تعمل بالبنزين، مما يعكس ميزة الكفاءة في العالم الحقيقي، لكن الشحن يجب أن يستغرق وقتاً أطول من ضخ البنزين، مما يخلق إيقاع لعب مختلف. ضع محطات شحن في مواقع مختارة حول الخريطة، وليس بالضرورة في محطات الوقود التقليدية، لإنشاء أنماط سفر مميزة لمالكي السيارات الكهربائية. نفذ واجهة شحن تعرض نسبة الشحن الحالية، الوقت المقدر للشحن الكامل، والتكلفة لكل كيلوواط ساعة. أضف خيار الشحن السريع في المحطات المميزة الذي يملأ البطارية في نصف الوقت بتكلفة مضاعفة لكل وحدة. لتكوين السيارة، صنف السيارات الكهربائية حسب هاش النموذج وخزن نوع السيارة في التكوين الخاص بك حتى يكتشف النظام تلقائياً ما إذا كانت السيارة تحتاج إلى بنزين أو كهرباء. دعم السيارات الهجينة التي يمكنها استخدام كلا نوعي الوقود، بالتبديل بين الوضع الكهربائي عند السرعات المنخفضة والبنزين عند سرعات الطرق السريعة، مع استهلاك كلا الموردين بمعدلات فردية مخفضة.
اقتصاد تسعير الوقود الديناميكي
نظام تسعير ديناميكي يجعل اقتصاد الوقود يشعر بالحيوية ويخلق قرارات اقتصادية مثيرة للاهتمام للاعبين. استند أسعار الوقود إلى معدل قابل للتكوين يتقلب بناءً على آليات العرض والطلب. تتبع إجمالي الوقود المشتراة عبر جميع المحطات خلال نوافذ زمنية متدا rolling، وعندما يكون الاستهلاك مرتفعًا، ترتفع الأسعار تدريجيًا. عندما ينخفض الاستهلاك، تنخفض الأسعار لجذب المزيد من العملاء. نفذ تسعيرًا خاصًا بالمحطات حيث تفرض المحطات النائية في Blaine County أسعارًا أعلى بسبب تكاليف النقل بينما تتنافس محطات المدينة بهوامش أقل. اسمح لمحطات الوقود المملوكة للاعبين حيث يمكن للمالك تحديد أسعار الوقود الخاصة به ضمن نطاق أدنى وأقصى محدد بواسطة تكوين الخادم، مما يخلق منافسة سعرية حقيقية بين مشغلي المحطات. يشتري مالك المحطة الوقود بالجملة من NPC المورد بسعر جملة ويضع عليه هامش ربح لسعر التجزئة، مع كون هامش الربح هو دخله. أضف زيادات سعرية موسمية أو مرتبطة بالأحداث حيث ترتفع تكاليف الوقود خلال أحداث الخادم التي تشمل نشاط مركبات مرتفع مثل السباقات أو السطو، مما يخلق تأثيرات اقتصادية تؤثر على جميع اللاعبين وتشجع على الترشيد أو الشراء الاستراتيجي للوقود قبل الزيادات المتوقعة.
محطة الوقود كعمل تجاري
تحويل محطات الوقود إلى أعمال يديرها اللاعب يضيف حلقة اقتصادية كاملة إلى نظام الوقود. يدير مالك المحطة المخزون من خلال طلب شحنات وقود من مورد الجملة، يحافظ على المعدات بدفع تكاليف إصلاح وترقية المضخات، ويتعامل مع التوظيف بتعيين لاعبين آخرين كموظفي مضخات يكسبون أجورًا بالساعة. طبق لوحة إدارة المحطة التي يمكن الوصول إليها فقط من قبل المالك والتي تعرض حجم المبيعات اليومية، الإيرادات، هوامش الربح، مخزون الوقود الحالي في الخزانات تحت الأرض، وسجلات حضور الموظفين. يجب أن تحتوي المحطة على خزان تحت الأرض بسعة محدودة ينفد مع إعادة التزود بالوقود من العملاء، مما يتطلب من المالك جدولة زيارات شاحنات التوصيل التي تستغرق وقتًا للوصول وتكلف مالًا مقدمًا. أضف مكون متجر داخل المحطة حيث يمكن للمالك تخزين مواد الراحة مثل الوجبات الخفيفة، المشروبات، والإمدادات الأساسية التي يمكن للعملاء شراؤها مع الوقود، مما يخلق مصدر دخل إضافي. سمح بترقيات للمحطة نفسها مثل إضافة المزيد من أماكن المضخات لخدمة المزيد من العملاء في نفس الوقت، تركيب معدات غسيل السيارات مقابل رسوم خدمة إضافية، أو إضافة محطات شحن EV لاقتناص سوق المركبات الكهربائية. تتبع سمعة المحطة بناءً على عدالة التسعير، وقت توفر الخدمة، ورضا العملاء بحيث تظهر المحطات ذات السمعة الأفضل مميزة على الخريطة وتجذب المزيد من الحركة.
تكامل HUD ومقياس الوقود
مقياس الوقود هو عنصر HUD دائم يراه اللاعبون باستمرار، لذلك يجب أن يكون نظيفًا بصريًا وغير مزعج مع نقل المعلومات الأساسية بنظرة سريعة. صمم مؤشر وقود بسيط يجلس بالقرب من عداد السرعة أو في زاوية الشاشة، يعرض مستوى الوقود الحالي كمقياس نصف دائري، شريط عمودي، أو قراءة نسبة مئوية بسيطة. استخدم ترميز الألوان حيث يشير الأخضر إلى مستوى وقود صحي فوق 50%، الأصفر يشير إلى وقود معتدل بين 20-50%، والأحمر يحذر من وقود منخفض جدًا تحت 20%. عندما ينخفض الوقود إلى أقل من 15%، قم بتشغيل صوت تحذير دوري للوقود المنخفض ووميض المقياس لضمان عدم نفاد الوقود عن طريق الخطأ. عرض المسافة المتبقية المقدرة بناءً على معدل الاستهلاك الحالي، محسوبة بقسمة الوقود المتبقي على متوسط الاستهلاك لكل كيلومتر خلال الدقائق القليلة الماضية من القيادة. أخفِ مقياس الوقود تمامًا عندما يكون اللاعب على الأقدام لتقليل ازدحام HUD، واظهره بسلاسة عند دخولهم مركبة. للاعبين الذين يفضلون HUD بسيط، قدم إعدادًا لإخفاء مقياس الوقود تمامًا وعرضه فقط كإشعار مؤقت عندما ينخفض الوقود تحت حد قابل للتكوين. دمج المقياس مع عناصر HUD الأخرى للمركبة مثل عداد السرعة وصحة المحرك لإنشاء تجربة لوحة قيادة متماسكة للمركبة.
الأداء والمزامنة
يعمل نظام الوقود باستمرار على كل عميل يقود مركبة، لذا تحسين الأداء أمر حاسم. استخدم فترة تحديث استهلاك 1000 مللي ثانية بدلاً من التشغيل في كل إطار، لأن تغييرات الوقود تدريجية بما يكفي بحيث تكون التحديثات كل ثانية غير قابلة للتمييز بصريًا عن التحديثات في كل إطار مع استخدام طاقة معالجة أقل بحوالي 60 مرة. خزّن قيم الوقود في حقائب حالة الكيان بدلاً من أحداث الشبكة المخصصة، لأن حقائب الحالة محسنة للقيم التي تتغير بشكل متكرر وتزامن فقط عند تغير القيمة فعليًا. عند حفظ الوقود في قاعدة البيانات للحفاظ عليه عبر إعادة تشغيل السيرفر، اجمع كل تحديثات وقود المركبات في استعلام واحد ينفذ كل 60 ثانية بدلاً من الكتابة بشكل فردي في كل مرة يتغير فيها وقود مركبة. استخدم معرف الشبكة للمركبة كمفتاح لتتبع الوقود، ونظف بيانات الوقود المخزنة للمركبات التي لم تعد موجودة لمنع تضخم قاعدة البيانات. تعامل مع الحالة الحدية حيث تغير المركبة ملكية الشبكة أثناء إعادة التزود بالوقود بالتحقق من الملكية قبل تطبيق تغييرات الوقود واستخدام التحقق من صحة على جانب السيرفر لجميع معاملات الدفع. لمحطات الوقود التي لديها العديد من العملاء في نفس الوقت، نفذ نظام طابور يمنع لاعبين من استخدام نفس المضخة في نفس الوقت مع عرض مؤشر بصري أن المضخة قيد الاستخدام.