أصلح “attempt to index a nil value” في سكربتات FiveM (ESX وQBCore وxPlayer)
يعني خطأ Lua هذا أن سكربتًا استخدم شيئًا غير موجود كما لو كان جدولًا. والجزء بين القوسين، مثل global 'ESX' أو local 'xPlayer'، يخبرك بما هو مفقود، ولكل واحد إصلاح مختلف.
اقرأ الخطأ أولًا
تعرض وحدة تحكم الخادم ووحدة تحكم F8 الخطأ هكذا:
SCRIPT ERROR: @my_script/server/main.lua:12: attempt to index a nil value (global 'ESX')
يأتي اسم المورد والملف ورقم السطر أولًا، فتعرف بالضبط أين تنظر. والكلمات بين القوسين تقول ما هو nil:
| بين القوسين | ما يعنيه عادةً |
|---|---|
| global 'ESX' | لم يحصل السكربت قط على كائن ESX، أو لم يكن ESX يعمل عندما بدأ السكربت. |
| global 'QBCore' | الأمر نفسه مع QBCore. |
| local 'xPlayer' أو 'Player' | ليس لدى الإطار كائن لاعب لذلك اللاعب. |
| field 'Jobs' أو اسم آخر | الجدول موجود لكن المفتاح مفقود، لأن بيانات أو ملف إعدادات لم يُحمَّل. |
أصلح global 'ESX'
- ابدأ ESX أولًا. في server.cfg، ضع
ensure es_extendedفوق كل سكربت يستخدمه، وافحص وحدة التحكم بحثًا عن أخطاء من es_extended نفسه، الذي يحتاج اتصال قاعدة بياناته ليبدأ. - استورد ESX في السكربت. أضف هذا السطر إلى fxmanifest.lua الخاص بالسكربت:
shared_script '@es_extended/imports.lua'
أو اضبط الكائن في Lua، قرب أعلى الملف:
ESX = exports["es_extended"]:getSharedObject()
تستخدم السكربتات القديمة TriggerEvent('esx:getSharedObject', ...). هذا الحدث لم يعد موجودًا في ESX الحالي، فاستبدله بالـ export أعلاه.
أصلح global 'QBCore'
عرّف الكائن في أعلى كل ملف Lua يستخدمه:
local QBCore = exports['qb-core']:GetCoreObject()
local في ملف لا يكون مرئيًا في ملف آخر، فقد يفشل سكربت يعمل في client/main.lua في client/events.lua. ابدأ qb-core قبل السكربت في server.cfg. يتضمن Qbox طبقة توافق لمعظم سكربتات QBCore، لكن تأكد أن السكربت يدعمها.
أصلح local 'xPlayer'
تعيد ESX.GetPlayerFromId(source) وQBCore.Functions.GetPlayer(source) القيمة nil حين لا يكون اللاعب قد حُمّل بعد، أو غادر، أو يكون المعرّف خاطئًا. افحص النتيجة دائمًا قبل استخدامها:
local xPlayer = ESX.GetPlayerFromId(source) if not xPlayer then return end
أسباب شائعة لغياب اللاعب:
- قيمة
sourceهي 0 حين يُشغَّل أمر من وحدة تحكم الخادم، فلا يوجد لاعب. - قد يتغير
sourceبعدWait. انسخه أولًا بـlocal src = sourceواستخدمsrcبعد ذلك. - عمل الحدث بينما كان اللاعب ما زال ينضم. انتظر حدث “تحميل اللاعب” الخاص بالإطار، وهو
esx:playerLoadedفي ESX وQBCore:Server:PlayerLoadedفي QBCore. - اللاعب غير متصل. ابحث عنه بالمعرّف في قاعدة البيانات بدلًا من ذلك.
أصلح حقلًا مفقودًا
إذا كان الجدول موجودًا لكن مفتاحًا فيه nil، فالبيانات خلفه لم تُحمَّل. تأكد أن ملف الإعدادات مدرج في fxmanifest.lua قبل الملفات التي تستخدمه، وأن الاسم مكتوب بالطريقة نفسها في كل مكان، وأن إصدار السكربت يطابق إصدار إطارك. تعيد الأطر تسمية الدوال بين الإصدارات، وتتعطل السكربتات المكتوبة لإصدار أقدم.
افحص الأساسيات
- اقرأ أول خطأ في وحدة التحكم. الأخطاء اللاحقة غالبًا نتيجة للأول.
- افحص إعداد الإطار الخاص بالسكربت نفسه، إن وُجد، في ملف إعداداته.
- بعد تعديل سكربت، شغّل
restart resource_nameفي وحدة التحكم وراقب الأخطاء الجديدة.
ما زلت عالقًا؟
اسأل كاتب السكربت مع نص الخطأ كاملًا والملف والسطر وإطارك وإصداره وترتيب البدء من server.cfg.
استضف خادم FiveM في سنغافورة
ping منخفض للاعبين في الهند وماليزيا وإندونيسيا، على AMD EPYC مع NVMe وحماية Gcore من DDoS على كل IP.
