الوثائق 9.6.24
مرجع الـ Exports
كل export عام في Tosun AC 9.6.15، مع المعاملات والقيم المُعادة والآثار الجانبية، وما إذا كان يجب أن يكون المورد المستدعي موثوقًا. لشرح عملي قائم على المهام، ابدأ بدليل التكامل.
استدعاء export#
استدعِ exports الخادم من سكربتات الخادم في موردك، و exports العميل من سكربتات العميل فيه. اسم المورد يحتوي شرطة (-)، لذا استخدم دائمًا صيغة الأقواس exports['tosun-ac']. الصيغة exports.tosun-ac ليست Lua صالحة.
- مرّر معرّفات الخادم كأرقام. عدة exports تستخدم المعرّف مباشرة كمفتاح في جدول.
- بعض الـ exports تنفّذ استعلام قاعدة بيانات متزامنًا وتتوقف مؤقتًا (yield). استدعِها من thread أو من معالج حدث: getBans و getBanInfo و GetDetections و isAdmin وفحوص الطاقم الأخرى و IsExemptFromPunish و ForensicLinksOf و refreshPanelWhitelist. كما أن scanAllResources و scanSingleResource تتوقف مؤقتًا (yield) أيضًا.
- الـ export المحمي الذي يرفض موردك يعيد false، حتى لو كان يعيد nil في العادة.
- بعض الـ exports موجودة فقط عندما تكون ميزتها مفعّلة (راجع Exports تعتمد على الميزات). استدعاء export غير مسجّل يُصدر خطأً، لذا ضع هذه الاستدعاءات داخل pcall.
- عدة exports غير موجودة في قوائم الـ exports في fxmanifest.lua (مثل MarkTeleport و punish و AllowWeapon). هذه القوائم للمعلومات فقط؛ والـ exports تعمل.
- تذكر الجداول أدناه "نعم" في العمود الأخير عندما يجب أن يكون المورد المستدعي موثوقًا. راجع الموارد الموثوقة.
-- سكربت خادم في موردك الخاص
local status = exports['tosun-ac']:GetIntegrationStatus()
if not status.trusted then
print(status.hint) -- سطر server.cfg الذي يجب إضافته
end
-- أبلغ الـ AC بالنقل، ثم انقل اللاعب
exports['tosun-ac']:MarkTeleport(src, 8000)
SetEntityCoords(GetPlayerPed(src), x, y, z)
-- سكربت عميل في موردك الخاص
exports['tosun-ac']:SetExempt(true, 60000, 'my_menu')الموارد الموثوقة#
الـ exports المعلَّمة بـ "نعم" في عمود الثقة تغيّر الإعفاءات أو صلاحيات الطاقم أو الحظر أو صحة اللاعب أو الأسلحة أو المخزون أو الحجر أو الموارد والتواقيع أو الخادم كله. تقبل الاستدعاءات فقط من مورد موثوق. الاستدعاء المرفوض لا يفعل شيئًا ويعيد false.
يكون المستدعي موثوقًا عندما يكون وحدة تحكم الخادم، أو tosun-ac نفسه، أو موردًا مدرجًا في ts.ExportCallerWhitelist في الإعدادات، أو موردًا مدرجًا في الـ convar tosun_ac_trusted_resources. قائمة الإعدادات الافتراضية هي qbx_core و qb-core و es_extended و ox_inventory و ox_lib.
فضّل الـ convar. فهو موجود في server.cfg ويبقى بعد تحديثات الـ AC، بينما قد تضيع تعديلات ملف الإعدادات عند تحديث الـ AC. افصل الأسماء بفواصل أو مسافات. قائمة الثقة تُخزَّن مؤقتًا لمدة 10 ثوانٍ، لذا يسري التغيير أثناء التشغيل خلال 10 ثوانٍ.
عند أول رفض لكل زوج من المورد والـ export، يطبع الـ AC تحذيرًا واحدًا في وحدة تحكم الخادم مع سطر server.cfg الدقيق الذي يجب إضافته، ويكتب سطرًا واحدًا في سجلات اللوحة. سطر سجل اللوحة يكون دائمًا بالتركية.
وضع التدقيق: مع ts.EnforceExportCallerWhitelist = false تعمل الاستدعاءات غير الموثوقة، ويُطبع كل زوج من المورد والـ export مرة واحدة في وحدة تحكم الخادم (دون سطر في سجل اللوحة). الافتراضي true. استخدم وضع التدقيق فقط أثناء الإعداد لترى أي السكربتات تستدعي ماذا.
شغّل tosunac_integration في وحدة تحكم الخادم لطباعة وضع الفرض، والموارد الموثوقة مع مصدرها (config أو convar)، وآخر 20 استدعاءً مرفوضًا. ومن سكربت، استدعِ GetIntegrationStatus().
الثقة تزيل أيضًا ميزانية MarkTeleport: يمكن للموارد الموثوقة تعليم عمليات النقل دون حد الوقت لكل لاعب.
يسجّل Tosun AC أيضًا exports وأحداث شبكة داخلية لآلياته الخاصة (جسر اللوحة، التوقيع، الفحص، الترخيص، التجميع). ليست جزءًا من هذا المرجع وليست API مدعومة. بعضها محمي بفحص الثقة أو بفحص داخلي للمستدعي. لا تستدعها.
# server.cfg
set tosun_ac_trusted_resources "my-housing,my-clothing"التكامل والإعفاءات#
exports على الخادم تُبلغ الـ AC بالإجراءات المشروعة في سكربتاتك، وتقرأ ما إذا كان اللاعب معفى.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
MarkTeleport | src؛ ms? (الافتراضي 8000، ومحصور بين 1000 و ts.Integration.markTeleportMaxMs، الافتراضي 15000)؛ reason? (وسم في السجل) | true إذا مُنح أو كان مغطى مسبقًا؛ false إذا كان اللاعب غير صالح أو غير متصل، أو لم تكفِ الميزانية | إعفاء جزئي (soft). استدعِه مباشرة قبل نقل اللاعب. يخفّف فحوص الحركة على الخادم، وفحوص godmode/invisible/noclip/focus، وفحوص العميل الخاصة باللاعب. عقوبات الأسلحة والمال والضرر وإساءة استخدام الأحداث والحقن والتعطيل ما زالت تُطبَّق. يُمسح عند قطع الاتصال. | لا. الموارد غير الموثوقة تتشارك ميزانية 180000 ms لكل لاعب كل 10 دقائق (ts.Integration.markTeleportBudgetMs). الطلب الذي لا يتسع لها يُرفض بالكامل. |
IsMovementExempt | src | boolean | true ما دامت نافذة إعفاء جزئي من MarkTeleport أو DetectionExempt.serverEvents نشطة. | لا |
GetIntegrationStatus | لا يوجد (يُكتشف المستدعي تلقائيًا) | { version, resource, trusted, trustedVia ('config' أو 'convar' أو 'self' أو nil), enforcing, hint } | يُخبر موردك ما إذا كان موثوقًا وكيف. hint هو سطر server.cfg الذي يجب إضافته عندما لا يكون موثوقًا. enforcing = false يعني وضع التدقيق. | لا |
SetPlayerExempt | src؛ state (true يمنح، false يزيل)؛ durationMs? (الافتراضي 30000، الحد الأقصى 300000)؛ reason? | true؛ و false إذا كان غير موثوق أو لم يكن src رقمًا | إعفاء كامل: حصانة من عقوبات الخادم مع علامة إعفاء العميل. تُتخطّى معظم فحوص العميل؛ والاكتشافات التي ما زالت تصل إلى مسار الحظر في العميل تُخفَّض إلى إدخالات LOG موسومة بـ [exempt]. يتشارك مؤقتًا واحدًا مع whitelistPlayer و PausePlayerDetections و BypassDetection، لذا قد يقصّر منحٌ جديد منحًا أقدم، و state = false يلغيها. يُمسح عند قطع الاتصال. | نعم |
SetExempt (server) | src؛ durationMs? (الافتراضي 30000، الحد الأقصى 300000)؛ reason? | مثل SetPlayerExempt | اسم بديل لـ SetPlayerExempt(src, true, durationMs, reason). الـ export الخاص بالعميل الذي يحمل الاسم نفسه يأخذ وسائط مختلفة. | نعم |
BypassDetection | src؛ detectionKey (إلزامي، لكن قيمته تُتجاهل)؛ durationMs? (الافتراضي 5000، من 500 إلى 60000) | true؛ و false إذا كان غير موثوق، أو كان src مفقودًا أو 0، أو كان المفتاح nil | اسم قديم. يمنح الإعفاء الكامل نفسه الذي يمنحه SetPlayerExempt؛ ولا يقتصر على اكتشاف واحد. الجدول الفارغ كمفتاح يعيد true لكنه لا يمنح شيئًا. | نعم |
PausePlayerDetections | src؛ durationMs? (الافتراضي 15000، الحد الأقصى 300000) | true؛ و false إذا كان غير موثوق أو لم يكن src رقمًا | حصانة من عقوبات الخادم مع علامة إيقاف مؤقت في العميل للاعب واحد. | نعم |
PauseAllDetections | durationMs? (الافتراضي 10000، الحد الأقصى 300000) | true؛ و false إذا كان غير موثوق | يوقف اكتشافات العميل مؤقتًا لكل لاعب متصل الآن. لا يوجد إعفاء على جانب الخادم. اللاعبون الذين ينضمون لاحقًا لا يُوقفون. لا يوجد تقييد لعدد الاستدعاءات. | نعم |
AllowWeapon | src؛ weapon? (اسم مثل 'WEAPON_PISTOL'، أو hash، أو '*' أو nil لكل الأسلحة)؛ ms? (الافتراضي 600000، من 1000 إلى 3600000) | true؛ و false إذا كان غير موثوق، أو كان اللاعب غير صالح أو غير متصل، أو كان رقم ما NaN/inf | يسمح للاعب بحمل واستخدام سلاح غير موجود في مخزونه. يخفّف فقط فحص السلاح مقابل المخزون (السلاح المحمول والضرر). يُمسح عند قطع الاتصال. | نعم |
IsExemptFromPunish | src | boolean (true = لا تعاقب) | القاعدة المركزية التي تستخدمها وحدات الفرض. true للطاقم (عندما لا يكون ts.AdminBypassDetections هو false)، والإعفاءات النشطة، والقائمة البيضاء لوقت التشغيل وللوحة، واللاعبين المحميين. بسبب القاعدة الأخيرة يبقى الطاقم معفى هنا حتى مع AdminBypassDetections = false. دائمًا false مع ts.Debug. قد يستعلم من قاعدة البيانات. | لا |
IsPlayerProtected | src | boolean | true للطاقم، أو حالة الإدارة، أو الإعفاء النشط. يتجاهل ts.AdminBypassDetections و ts.Debug. لا يشمل القائمة البيضاء لوقت التشغيل أو للوحة؛ استخدم IsExemptFromPunish للقاعدة الكاملة. قد يستعلم من قاعدة البيانات. | لا |
اختيار الإعفاء#
استخدم أضيق إعفاء يغطي سكربتك. عدة إعفاءات تتشارك علامة إعفاء العميل نفسها، لذا قد ينهي أحدها الآخر: ClearArea مع اسم منطقة يعيد ضبط العلامة التي يضبطها أيضًا SetPlayerExempt و MarkTeleport و BypassDetection.
| Export | الحصانة من عقوبات الخادم | فحوص العميل | المدة | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
MarkTeleport | فحوص الحركة والظهور فقط | معفاة (النافذة تُمدَّد فقط ولا تُقصَّر) | 8 ثوانٍ افتراضيًا، وثانية واحدة (1 s) حد أدنى؛ والحد الأقصى لكل استدعاء ts.Integration.markTeleportMaxMs (15 ثانية افتراضيًا) | لا (ضمن ميزانية) |
SetPlayerExempt, SetExempt (server) | نعم | معفاة | 30 ثانية افتراضيًا، والحد الأقصى 300 ثانية | نعم |
BypassDetection | نعم | معفاة | 5 ثوانٍ افتراضيًا، من 0.5 إلى 60 ثانية | نعم |
PausePlayerDetections | نعم | موقوفة مؤقتًا | 15 ثانية افتراضيًا، والحد الأقصى 300 ثانية | نعم |
PauseAllDetections | لا | موقوفة مؤقتًا للاعبين المتصلين الآن | 10 ثوانٍ افتراضيًا، والحد الأقصى 300 ثانية | نعم |
whitelistPlayer | نعم | لا توجد علامة للعميل | 3600 ثانية افتراضيًا، و -1 = حتى قطع الاتصال | نعم |
AddWhitelist | نعم، حسب المعرّف | لا توجد علامة للعميل | حتى إعادة التشغيل، أو durationSec | نعم |
WhitelistArea | لا | معفاة | 30 ثانية افتراضيًا | نعم |
AllowWeapon | فحص السلاح مقابل المخزون فقط | بلا تغيير | 600 ثانية افتراضيًا، والحد الأقصى 3600 ثانية | نعم |
Client SetExempt, PauseDetections | لا | معفاة أو موقوفة مؤقتًا على ذلك العميل | 30 ثانية أو 10 ثوانٍ افتراضيًا، والحد الأقصى 300 ثانية | لا (أي مورد على العميل) |
الطاقم والصلاحيات#
اقرأ وغيّر من يعتبره الـ AC من الطاقم. قد تستعلم فحوص الطاقم من قاعدة البيانات، لذا استدعِها من thread أو من معالج حدث.
يعيد isAdmin القيمة true في الحالات التالية: منح يدوي عبر addAdmin؛ أو صلاحيات ACE txadmin و tx.admin و txadmin.menu و txadmin.advanced و command.txadmin و command.ts و command.ban و command.kick و tosun.admin و ts.admin وأي صلاحية في ts.AdminBypassAces؛ أو الـ principals group.admin و group.superadmin و group.moderator و group.god؛ أو command.kick/ban/resources/restart عندما يكون ts.txAdminAuth مفعّلًا؛ أو معرّفات في admins.lua و ts.AdminMenu.allowedIds و ts.AdminBypassIdentifiers؛ أو منح من اللوحة في قاعدة البيانات. صلاحية ACE الممنوحة أيضًا لـ builtin.everyone لا تُحتسب.
isAdmin و addAdmin مسجّلان مرتين في الكود المصدري. النسختان الموجودتان في anticheat_server.lua تُحمَّلان أخيرًا وهما اللتان تعملان؛ وهذا المرجع يصفهما.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
isAdmin | src (مرّر رقمًا) | boolean | حالة الإدارة من المصادر المذكورة أعلاه. نتائج قاعدة البيانات تُخزَّن مؤقتًا 5 ثوانٍ عندما تكون إيجابية و 30 ثانية عندما تكون سلبية. لا ينظر إلى ts.AdminBypassDetections. | لا |
isStaffPlayer | src | boolean | فحص الطاقم الذي تستخدمه مسارات الحظر. المصادر نفسها كما في isAdmin، إضافة إلى صلاحيات ACE لأوامر txAdmin (command.kick/ban/resources/restart/screenshot/unban) ما لم يكن ts.txAdminAuth = false. | لا |
isAdminMenuAllowed | src | boolean | ما إذا كان يمكن للاعب فتح قائمة الإدارة. false عندما تكون القائمة معطّلة. صلاحيات ACE الخاصة بـ txAdmin وحده (txadmin و tx.admin) و ts.AdminBypassAces و ts.AdminBypassIdentifiers لا تُحتسب. بلا تخزين مؤقت: استعلام واحد في قاعدة البيانات لكل استدعاء. | لا |
getAdminType | src | 'tx' أو 'config' أو false | تسمية مضللة: كل مسار إدارة إيجابي يضبط العلامة نفسها، لذا يحصل الطاقم دائمًا تقريبًا على 'tx'، و 'tx' لا تعني txAdmin. استخدم isAdmin بدلًا منه. | لا |
addAdmin | src (مرّر رقمًا) | nil؛ و false عند الرفض | منح طاقم أثناء التشغيل: حصانة من العقوبة ووصول إلى قائمة الإدارة. لا يُحفظ في قاعدة البيانات. لا يُمسح عند قطع الاتصال: يبقى مرتبطًا بمعرّف الخادم ذاك حتى removeAdmin أو إعادة التشغيل. | نعم |
removeAdmin | src | nil؛ و false عند الرفض | يزيل المنح اليدوي والحالة المخزّنة مؤقتًا. منح ACE و txAdmin و admins.lua واللوحة لا تُلغى وتُحتسب مجددًا في الفحص التالي. | نعم |
القائمة البيضاء للاعبين والمناطق#
قائمة بيضاء بمعرّف الخادم، وقائمة بيضاء بالمعرّفات، ومناطق مسمّاة. قوائم وقت التشغيل موجودة في الذاكرة فقط وتضيع عند إعادة التشغيل؛ أما القائمة البيضاء للوحة فمنفصلة.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
whitelistPlayer | src (مرّر رقمًا)؛ durationSec? (الافتراضي 3600؛ و -1 = حتى قطع الاتصال) | nil؛ و false عند الرفض | حصانة من عقوبات الخادم حسب معرّف الخادم. لا توجد علامة للعميل. تُمسح عند قطع الاتصال. SetPlayerExempt و PausePlayerDetections و BypassDetection تكتب فوقها. | نعم |
removeWhitelist | src | nil؛ و false عند الرفض | ينهي whitelistPlayer. وينهي أيضًا أي حصانة خادم من SetPlayerExempt أو PausePlayerDetections أو BypassDetection. | نعم |
AddWhitelist | target (معرّف خادم، أو string معرّف)؛ durationSec? (nil أو 0 = حتى إعادة التشغيل) | true؛ و false إذا كان فارغًا أو مرفوضًا | يضيف معرّفات إلى القائمة البيضاء في الذاكرة (لا تُحفظ في قاعدة البيانات). معرّف الخادم يضيف كل معرّفات ذلك اللاعب. تُحوَّل المعرّفات إلى أحرف صغيرة وتُزال البادئة license: أو license2: أو discord: أو steam: أو fivem:. القيمة المكوّنة من أرقام فقط تُقرأ كمعرّف خادم، لذا مرّر معرّفات Discord مع البادئة discord:. | نعم |
RemoveWhitelist | target (معرّف خادم أو معرّف) | true؛ و false إذا كان فارغًا أو مرفوضًا | يزيل إدخالات القائمة البيضاء لوقت التشغيل. جدول القائمة البيضاء للوحة لا يُمس. | نعم |
IsWhitelisted | src | boolean | true إذا كان أي معرّف في القائمة البيضاء لوقت التشغيل أو في القائمة البيضاء المخزّنة مؤقتًا للوحة. لا يشمل whitelistPlayer أو SetPlayerExempt. دائمًا false مع ts.Debug. | لا |
refreshPanelWhitelist | لا يوجد | nil | يعيد تحميل القائمة البيضاء للوحة الآن (استعلام متزامن). كما يعيد تحميلها بعد 12 ثانية من البدء وكل 60 ثانية. | لا |
WhitelistArea | src؛ areaName (غير فارغ)؛ durationSec? (الافتراضي 30) | true؛ و false إذا كان غير صالح أو مرفوضًا | يسجّل منطقة مسمّاة ويضبط علامة إعفاء العميل. تخفيف على جانب العميل فقط: لا توجد وحدة على الخادم تقرأ المنطقة، لذا لا توجد حصانة من عقوبات الخادم. | نعم |
ClearArea | src؛ areaName? ('' أو nil = كل المناطق) | true؛ و false إذا كان src هو 0 أو عند الرفض | يزيل المنطقة. مع اسم يعيد أيضًا ضبط علامة إعفاء العميل، مما ينهي إعفاءات العميل الأخرى أيضًا. مع اسم فارغ تُترك العلامة كما هي. | نعم |
IsInArea | src؛ areaName? (فارغ = أي منطقة) | boolean | مع اسم يتحقق من انتهاء الصلاحية. مع اسم فارغ يعيد true لأي إدخال، بما في ذلك المنتهية. | لا |
العقوبات والحظر#
عاقب اللاعبين عبر مسار عقوبات الـ AC، واحظر اللاعبين غير المتصلين، واقرأ سجلات الحظر. كل exports الكتابة هنا تتطلب الثقة.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
punish | src (متصل)؛ reason؛ image? (رابط لقطة الشاشة أو بياناتها)؛ configKey?؛ punishment? ('BAN' أو 'KICK' أو 'LOG') | nil؛ و false عند الرفض | يشغّل مسار عقوبات الـ AC الكامل. اللاعبون المعفيون يُتخطَّون. راجع كيف يختار punish() العقوبة. | نعم |
ban | src (متصل)؛ reason | nil؛ و false عند الرفض | المسار نفسه مع مفتاح الإعداد 'Banned via Export' والعقوبة ts.punishType. ليس دائمًا حظرًا دائمًا: المدة هي ts.BanDurations['default'] (0 = دائم)، وإذا ضبط المالك ts.punishType على KICK أو LOG فإنه يطرد أو يسجّل بدلًا من ذلك. اللاعبون المعفيون يُتخطَّون بصمت. | نعم |
BanPlayerExt | src (متصل)؛ reason? (الافتراضي 'Banned by script') | true إذا أُرسل؛ و false إذا كان غير موثوق أو غير متصل | مثل ban(). | نعم |
KickPlayer | src (متصل)؛ reason? (الافتراضي 'Kicked by script') | true؛ و false إذا كان غير موثوق أو غير متصل | طرد بسيط بالرسالة '[Tosun AC] ' متبوعة بالسبب. لا يوجد فحص للإعفاء: الطاقم واللاعبون في القائمة البيضاء يُطردون أيضًا. لا يُسجَّل شيء. | نعم |
offlineBan | data { playername, license, steam, discord, ip, HWID, HWID2 إلى HWID5 } (معرّفات مجردة)؛ reason | nil؛ و false عند الرفض | سجل حظر دائم للاعب غير متصل. المعرّفات المفقودة تُحفظ كقيم بديلة لا تتطابق أبدًا عند الاتصال. اضبط دائمًا data.playername و reason: بدونهما يفشل الإدراج تحت STRICT sql_mode ولا يُبلَّغ المستدعي. يطبع سطرًا في وحدة التحكم. data = nil يُصدر خطأ Lua. | نعم |
offlineBanByLicense | license (hex مجرد أو 'license:...')؛ reason? (الافتراضي 'Sebep yok'، بالتركية)؛ actor? (الافتراضي 'panel')؛ name?؛ citizenid? | true, banID ('O' + 8 hex)؛ أو false, 'license required'؛ و false عند الرفض | حظر license دائم مع سجل تاريخي في ac_offline_bans. يعود قبل انتهاء الكتابة في قاعدة البيانات، لذا لا يُبلَّغ عن أخطاء قاعدة البيانات. لا يطرد لاعبًا متصلًا. الـ license غير النصية (ليست string) تُصدر خطأ Lua. | نعم |
unban | banID | دائمًا nil | غير متزامن: إذا كان الحظر موجودًا يحذفه، ويرسل سجل Discord إلى webhook قائمة الإدارة، ويطلق حدث الخادم ts_anticheat:playerUnbanned. السجلات التاريخية في ac_offline_bans تبقى. | نعم |
getBans | limit? (الافتراضي 100، بلا حد أقصى)؛ offset? (الافتراضي 0) | سجلات الحظر، الأحدث أولًا | سجلات كاملة، بما فيها أعمدة IP و license و Steam و Discord و HWID. استعلام متزامن. | لا |
getBanInfo | banID | سجل الحظر الكامل أو nil | استعلام متزامن. | لا |
كيف يختار punish() العقوبة#
تتشارك punish() و ban() و BanPlayerExt() مسارًا واحدًا. هذا هو الترتيب الذي يتبعه.
- يُتخطّى الطاقم عندما لا يكون ts.AdminBypassDetections هو false. يُتخطّى اللاعبون الذين لديهم إعفاء نشط أو الموجودون في القائمة البيضاء لوقت التشغيل أو للوحة. ts.Debug يوقف هذا التخطي. الاستدعاءات المتخطّاة لا تفعل شيئًا ولا تسجّل شيئًا.
- يجب أن يكون اللاعب متصلًا. وإلا يُطبع خطأ في وحدة تحكم الخادم ولا يحدث شيء.
- العقوبة: وسيط punishment الصالح له الأولوية. وإلا ts.DetectionPunishments[configKey]، ثم اسمه البديل، ثم مفتاح الاكتشاف، ثم ts.punishType، ثم BAN.
- كل نتيجة تطلق حدث الخادم ts_anticheat:playerBanned، وتنشر رسالة في الدردشة عندما يكون ts.chatMessages مفعّلًا، وتضيف مخالفة سحابية، وتكتب سجل الـ AC والسجل المباشر.
- LOG: يرسل سجل لقطة الشاشة إلى Discord.
- KICK: يتحقق من الطاقم مجددًا بغض النظر عن ts.AdminBypassDetections، لذا لا يُطرد الطاقم أبدًا. ثم يرسل سجل لقطة الشاشة ويطرد اللاعب.
- BAN: يُدرج الحظر بمدة من ts.BanDurations بالساعات (configKey، ثم الاسم البديل، ثم مفتاح الاكتشاف، ثم البادئة، ثم default؛ و 0 = دائم) مع bannedBy بقيمة 'anticheat:' متبوعة بالمفتاح. يطلق ts_anticheat:banCommitted، ويُبلغ اللوحة، ويطرد اللاعب (مع إعادة المحاولة بعد 3 ثوانٍ).
exports['tosun-ac']:punish(src, 'Money exploit', nil, 'my_shop_exploit', 'BAN')الإشراف على لاعب واحد#
نفّذ إجراءات على لاعب واحد. اقرأ عمود الثقة بعناية: عدة exports هنا بلا فحص ثقة.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
freezePlayer | src (متصل)؛ freeze (boolean) | true؛ و false إذا كان غير متصل | يجمّد اللاعب أو يفك تجميده وينشر إشعارًا في الدردشة بلغته. علامة التجميد لا تُمسح عند قطع الاتصال. | لا |
isPlayerFrozen | src | boolean | يعكس freezePlayer فقط، وليس massFreeze. | لا |
slayPlayer | src (متصل) | true؛ و false إذا كان غير متصل | يقتل اللاعب على عميله ويعرض إشعارًا. | لا |
warnPlayer | src (متصل)؛ reason?؛ actor? (الافتراضي 'console') | true؛ و false إذا كان غير متصل | تحذير في الدردشة للاعب وسجل في ac_player_warnings. | لا |
mutePlayer | src (متصل)؛ durationSec? (number؛ nil أو 0 = دائم)؛ reason?؛ actor? (الافتراضي 'system') | true؛ و false إذا كان غير متصل | يمنع أحداث chatMessage القديمة الخاصة باللاعب ويحفظ سجلًا في ac_player_mutes. الكتم المؤقت ينتهي خلال 15 ثانية بعد انقضاء مدته. الكتم الدائم لا يُمسح عند قطع الاتصال وينتقل إلى اللاعب التالي الذي يحصل على معرّف الخادم نفسه، حتى unmutePlayer أو إعادة التشغيل. إشعارات الدردشة للاعب مكتوبة بالتركية بشكل ثابت في الكود. | لا |
unmutePlayer | src | true؛ و false إذا كان src هو nil | يزيل الكتم ويُبلغ اللاعب إن كان متصلًا (إشعار دردشة بالتركية الثابتة في الكود). | لا |
isPlayerMuted | src | boolean | للقراءة فقط. | لا |
setPlayerHealth | src (متصل)؛ hp? (الافتراضي 100، من 0 إلى 200) | true؛ و false إذا كان غير متصل أو عند الرفض | يضبط الصحة على العميل ويضبط الحد الأقصى للصحة على 200. | نعم |
setPlayerArmor | src (متصل)؛ armor? (الافتراضي 0، من 0 إلى 100) | true؛ و false إذا كان غير متصل أو عند الرفض | يضبط الدرع على العميل. | نعم |
giveWeapon | src (متصل)؛ weapon? (الافتراضي 'WEAPON_PISTOL')؛ ammo? (الافتراضي 60) | true؛ و false إذا كان غير متصل أو عند الرفض | يستخدم ox_inventory إذا كان قيد التشغيل؛ وإلا مخزون QB (إطار العمل 'qb' أو 'qbox' فقط، وليس 'qbcore')؛ وإلا addWeapon في ESX؛ وإلا إعطاء native. يعيد true حتى عندما يرفض المخزون العنصر. لا يستدعي AllowWeapon، لذا قد يُرصد السلاح المعطى عبر native بفحص السلاح مقابل المخزون (الإجراء الافتراضي log). | نعم |
stripWeapons | src (متصل) | true؛ و false إذا كان غير متصل أو عند الرفض | يزيل كل الأسلحة من الـ ped. عناصر المخزون لا تُمس. | نعم |
clearInventory | src (متصل) | true؛ و false إذا كان غير متصل أو عند الرفض | يمسح المخزون عبر ox_inventory. بدون ox_inventory يعرض إشعارًا فقط ولا يمسح شيئًا، لكنه يعيد true مع ذلك. | نعم |
spectatePlayer | adminSrc؛ targetSrc | true؛ و false إذا كان أحد الوسائط nil أو لم يكن للهدف ped | ليس مراقبة حقيقية: ينقل adminSrc إلى الهدف. كل استدعاء يمنح adminSrc أيضًا إعفاء حركة لمدة 15 ثانية خارج الميزانية. | لا |
إجراءات على مستوى الخادم#
إجراءات تؤثر في كل لاعب أو في كل اتصال جديد.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
lockdownStatus | لا يوجد | active (boolean)، reason (string) | للقراءة فقط. | لا |
setLockdown | state (boolean)؛ reason (مرّر string عند التفعيل) | nil؛ و false عند الرفض | أثناء نشاطه يُرفض كل اتصال جديد برسالة LOCKDOWN والسبب. لا يوجد تجاوز للطاقم. أثناء التشغيل فقط. يبث سطرًا في الدردشة. استدعاؤه مع state بقيمة true وبدون سبب يفعّل الإغلاق ثم يُصدر خطأ Lua. | نعم |
emergencyLockdown | reason? (سبب الإغلاق الافتراضي 'Acil durum'، بالتركية) | عدد اللاعبين المطرودين؛ و false عند الرفض | يفعّل الإغلاق (lockdown) ويطرد كل لاعب ليس من الطاقم برسالة بلغته. | نعم |
massFreeze | state (boolean) | عدد اللاعبين؛ و false عند الرفض | يجمّد كل اللاعبين أو يفك تجميدهم، بما في ذلك الطاقم، ويبث سطرًا في الدردشة. سطر الدردشة مكتوب بالتركية بشكل ثابت في الكود. | نعم |
healAll | لا يوجد | عدد اللاعبين الذين أُرسل إليهم العلاج؛ و false عند الرفض | يضبط الصحة على الحد الأقصى والدرع على 100 لكل لاعب لديه ped. | نعم |
setSpeedLimit | kmh (القيمة 0 تعطّله) | الحد المطبَّق؛ و false عند الرفض | يحدّ سرعة المركبات للاعبين المتصلين الآن. اللاعبون الذين ينضمون لاحقًا لا يحصلون على الحد. | نعم |
applyWeatherWithFramework | weather (بلا تحقق من الصحة) | true، وقائمة الطرق التي جُرّبت | يجرّب qb-weather و Renewed-Weathersync و cd_easytime، ثم wd_weather و weathersync و vSync و qb-weathersync، وإلا يبث إلى كل عميل. موجود فقط عندما تكون قائمة الإدارة مفعّلة. | لا |
applyTimeWithFramework | hour؛ minute (بلا حصر للقيم) | true، وقائمة الطرق التي جُرّبت | سلسلة البدائل نفسها للساعة. موجود فقط عندما تكون قائمة الإدارة مفعّلة. | لا |
الحجر وحماية البيانات المرسلة (payload)#
اعزل لاعبًا مشبوهًا، واحمِ أحداث الشبكة الخاصة بك من بيانات التعطيل (crash payloads) والإغراق (spam).
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
quarantine | src (متصل)؛ reason? (الافتراضي 'supheli davranis'، بالتركية)؛ seconds? (الافتراضي 300، من 30 إلى 1800) | true (حتى لو كان محجورًا مسبقًا)؛ و false للاعبين المعفيين أو غير الصالحين، أو فشل الـ bucket، أو مستدعٍ غير موثوق | ينقل اللاعب إلى routing bucket معزول (الافتراضي من 9001 إلى 9500، مع قفل صارم للكيانات وبلا تعداد سكاني). يسجّل اكتشافًا من نوع QUARANTINE وينشر إشعارًا في الدردشة للاعب ما لم يكن notifyPlayer = false. الإشعار مكتوب بالتركية بشكل ثابت في الكود. يُفرج عنه تلقائيًا عند انتهاء المدة. | نعم |
releaseQuarantine | src | true إذا أُفرج عنه؛ و false إذا لم يكن محجورًا أو عند الرفض | يعيد الـ routing bucket الأصلي، ويسجّل، ويُبلغ اللاعب (إشعار دردشة بالتركية الثابتة في الكود، ما لم يكن notifyPlayer = false). | نعم |
isQuarantined | src | boolean | للقراءة فقط. | لا |
quarantineList | لا يوجد | { id, name, reason, remaining }[] (قيمة remaining بالثواني) | للقراءة فقط. | لا |
crashGuardInspect | value (أي بيانات) | nil إذا كانت آمنة؛ وإلا وصف للمشكلة بالتركية | يتحقق من أرقام NaN/Inf، والمتجهات غير الصالحة، والنصوص التي تتجاوز 32768 حرفًا، والتداخل الأعمق من 8، وأكثر من 2000 عنصر، ونحو 64 KB إجمالًا، والمفاتيح التي تتجاوز 512 حرفًا، والأنواع غير المدعومة، والتكرار الذاتي (recursion). بلا آثار جانبية. | لا |
crashGuardReject | src (متصل)؛ payload | true إذا كانت البيانات سيئة (أسقطها)؛ و false إذا كانت سليمة أو كان src غير صالح | الفحص نفسه مع إضافة مخالفة (strike) للاعب. 3 مخالفات خلال 60 ثانية تطبّق ts.crashGuard.action: 'kick' (الافتراضي) أو 'ban'، وأي قيمة أخرى = وحدة التحكم والسجل فقط. اللاعبون المعفيون يُتخطَّون. | لا |
RateLimit | src؛ key? (الافتراضي 'default')؛ max? (الافتراضي 10، الحد الأدنى 1)؛ windowMs? (الافتراضي 10000، الحد الأدنى 100) | true = مسموح؛ false = فوق الحد | عدّاد بنافذة ثابتة لكل لاعب ومفتاح. المفاتيح مشتركة بين كل الموارد، لذا أضف إليها اسم موردك كبادئة. src بقيمة 0 أو غير صالح يعيد true دائمًا. يُمسح عند قطع الاتصال. | لا |
RegisterNetEvent('myres:buy', function(data)
local src = source
if not exports['tosun-ac']:RateLimit(src, 'myres:buy', 5, 10000) then return end
if exports['tosun-ac']:crashGuardReject(src, data) then return end
-- عالج عملية الشراء
end)اللاعبون والاكتشافات#
ابحث عن اللاعبين والمعرّفات وسجلات الحظر حسب اللاعب ودرجات التهديد والحسابات المرتبطة. بعض النتائج تحتوي بيانات شخصية مثل عناوين IP.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
GetPlayerInfo | src (متصل) | { id, name, ping, license, discord, steam, citizenid, isAdmin, coords, endpoint } أو nil | معرّفات بلا بادئة (license يرجع إلى license2 عند غيابه). endpoint هو عنوان IP للاعب. citizenid يُملأ فقط مع إطار العمل 'qb' أو 'qbcore' أو 'esx'؛ ويكون فارغًا مع 'qbox'. قد يستعلم isAdmin من قاعدة البيانات. | لا |
GetNearbyPlayers | src؛ radius? (الافتراضي 30.0) | { id, name, distance }[] | اللاعبون القريبون من src حسب موقع الـ ped على جانب الخادم (OneSync)، باستثناء src. | لا |
getOnlinePlayers | لا يوجد | { id, name, ping, license, discord, steam, isAdmin }[] | المعرّفات هنا تحتفظ ببادئتها (license:... و discord:... و steam:...). قد يستعلم isAdmin من قاعدة البيانات لكل لاعب. | لا |
GetDetections | src (متصل)؛ limit? (الافتراضي 25) | { banID, reason, banDate, banUntil }[] أو {} | اسم تاريخي: يعيد سجلات BAN الخاصة باللاعب المطابقة حسب license، وليس الاكتشافات. | لا |
GetCloudThreatScore | src | من 0 إلى 100 | درجة للعرض: 8 لكل مخالفة في الجلسة (بحد أقصى 40، وفقط ما دامت آخرها أحدث من 10 دقائق)، و 10 لكل تسجيل حضور فائت لـ shield (بحد أقصى 30)، و 12 لكل نقطة تهديد من native-guard (بحد أقصى 30). القيمة 0 عندما يكون ts.cloudBridge.enabled = false. | لا |
NoteCloudViolation | src؛ reason?؛ punishment? ('LOG' أو 'KICK' أو 'BAN') | nil | يضيف مخالفة إلى درجة اللاعب؛ ولا يفعل شيئًا عندما يكون ts.cloudBridge.enabled = false. كل ملاحظة KICK أو BAN تضيف 25 إلى درجة الاستخبارات (بحد أقصى 100، ما دامت آخرها أحدث من 10 دقائق)؛ وعند 50 أو أكثر يُبلَّغ عن الـ license إلى قاعدة بيانات التهديدات المشتركة بين الخوادم في اللوحة (يتطلب رابط اللوحة والرمز). الانضمامات اللاحقة تُمنع فقط عندما يكون ts.cloudBridge.threatIntelAction = 'kick' (الافتراضي 'log'). الـ AC يستدعيه بالفعل مع كل عقوبة. | لا |
ForensicLinksOf | license (hex مجرد، بلا البادئة license:) | الـ licenses المرتبطة (قائمة strings)؛ و {} إذا كان غير معروف | يجد الحسابات البديلة التي تتشارك قيم Steam أو Discord أو HWID (و IP فقط مع ts.forensics.linkByIp = true)، حتى ts.forensics.maxHops (الافتراضي 3، الحد الأقصى 5). استعلامات حاجبة (blocking). يعمل مع تعطيل forensics، لكن عندها لا تُسجَّل روابط جديدة. | لا |
checkIpReputation | ip | { vpn, proxy, hosting, country, org, expiresAt } أو nil | قراءة من الذاكرة المؤقتة فقط. يعيد بيانات فقط لعناوين IP التي فُحصت عند الاتصال خلال ts.v12.ipCheckCacheHours (24). لا يوجد بحث مباشر. | لا |
webBridgeFindByLicense | license (string، مع license: أو بدونها) | معرّف خادم لاعب متصل أو nil | يجد لاعبًا متصلًا. عمليًا يطابق أي معرّف تطابقًا تامًا، مثل license2:... أو discord:.... | لا |
webBridgeFindByCitizen | cid (citizenid في QB أو identifier في ESX) | معرّف خادم لاعب متصل أو nil | يعمل مع إطار العمل 'qb' و 'qbcore' و 'esx' فقط؛ ويعيد nil مع 'qbox'. | لا |
الإشعارات واللغة#
أرسل إشعارات الهاتف واستخدم جداول الترجمة في الـ AC. phoneNotify و phoneNotifyAdmins موجودان فقط عندما يكون ts.AdminMenu.enable مفعّلًا.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
phoneNotify | src (متصل)؛ title؛ body؛ opts? { icon, color, app } | true؛ و false إذا كان غير متصل | يرسل إلى أول هاتف قيد التشغيل: qb-phone أو qs-smartphone أو lb-phone أو yseries أو gks_phone أو npwd أو roadphone، وإلا إلى الدردشة. يُكتشف الهاتف مرة واحدة، لذا يُتجاهل الهاتف الذي يبدأ لاحقًا حتى إعادة التشغيل. | لا |
phoneNotifyAdmins | title؛ body؛ opts? | nil | phoneNotify إلى كل عضو متصل من الطاقم. قد يستعلم من قاعدة البيانات لكل لاعب. | لا |
getPlayerLocale | src | رمز اللغة؛ والافتراضي ts.Locale ('tr') | للقراءة فقط. على جانب الخادم فقط. | لا |
setPlayerLocale | src؛ lang (حرفان أو 3 أحرف صغيرة مع وجود ملف locales) | true إذا ضُبطت؛ و false في غير ذلك | يضبط لغة اللاعب على جانب الخادم. بخلاف الأمر ts_setlang، لا يزامن اللغة مع العميل. يُمسح عند قطع الاتصال. | لا |
translate | key؛ ... (قيم لـ {0} و {1}، أو جدول واحد لـ {name}) | النص المترجم؛ أو البديل الإنجليزي؛ أو المفتاح نفسه إذا كان مفقودًا | يستخدم ts.Locale. رمز من حرفين أو 3 أحرف في النهاية مع وجود ملف لغة يختار اللغة. القوالب التي تستخدم %s تعود دون تنسيق؛ نسّقها بنفسك. | لا |
translateForPlayer | src؛ key؛ ... | نص بلغة اللاعب | مثل translate، لكن باستخدام لغة اللاعب. بلا رمز لغة في النهاية. | لا |
لقطات الشاشة#
اطلب لقطات شاشة للاعبين من أجل اللوحة. exports كتابة السجلات في الـ AC داخلية وغير مدرجة هنا.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
v6ScreenWatchRequest | serverId (متصل)؛ mode? (الافتراضي 'once')؛ requestedBy? (الافتراضي 'panel')؛ panelUrl?؛ forceBase64? | معرّف الطلب؛ أو nil, 'invalid_id'؛ أو nil, 'offline' | يضع لقطة شاشة في الطابور ويطلب من العميل رفعها إلى اللوحة برمز خاص بكل عملية رفع. يجب أن يكون panelUrl بـ https وأن يطابق ts_public_panel_url أو ts.webPanelURL، وإلا لا يُطلب من العميل شيء. الطلبات المعلّقة تنتهي بعد 30 ثانية وتُزال بعد 90 ثانية. | لا |
v6ScreenWatchPoll | rid | { pending = true } ما دام معلّقًا؛ وإلا الإدخال مع status ('done' أو 'failed' أو 'expired') و url؛ أو nil, 'not_found' | للقراءة فقط. | لا |
v6ScreenWatchLatest | serverId | آخر إدخال طلب أو nil | للقراءة فقط. | لا |
RequestShieldScreenshot | src (متصل) | true؛ و false إذا كان غير متصل | يطلب لقطة شاشة من shield العميل (الطلب صالح 60 ثانية). يُرسل رد موقَّع إلى اللوحة ويطلق حدث الخادم ts_anticheat:shield:screenshot_saved(src, b64). | لا |
screenCapture | src (متصل)؛ requestedBy? (الافتراضي 'panel') | true؛ و false إذا كان غير متصل | قديم. يتطلب المورد screenshot-basic والـ convar ts_screen_upload مضبوطًا بـ setr (الافتراضي http://localhost/api/screen_upload.php). الـ AC لا يحفظ النتيجة. استخدم v6ScreenWatchRequest أو RequestShieldScreenshot بدلًا منه. | لا |
الحالة والتشخيص#
اقرأ حالة الـ AC للوحات المتابعة وفحوص السلامة.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
GetStatus | لا يوجد | { version, online, detections, debug, framework } | version هو إصدار المورد من fxmanifest. detections يعدّ فقط التقارير من قناة عميل قديمة غير موقَّعة ويبقى قريبًا من 0 مع تفعيل التوقيع (الافتراضي)؛ وليس عدد الاكتشافات أو الحظر. لا يوجد حقل لمدة التشغيل (uptime). | لا |
getConfig (server) | configType? ('webhooks' أو أي شيء آخر) | نسخة منقّحة من الإعدادات؛ ومع 'webhooks' يُعاد جدول Webhooks للمستدعين الموثوقين و {} لغيرهم | تُسقط النسخة الدوال، والمفاتيح التي تحتوي secret أو password أو token أو webhook، والمفاتيح التي تنتهي بـ key (باستثناء الأسماء المنتهية بـ hotkey والاسم المجرد key)، وأي شيء متداخل لأعمق من 6 مستويات. تُخزَّن مؤقتًا 5 ثوانٍ. | فقط مع 'webhooks' |
licenseStatus | لا يوجد | { checked, ok, reason, serverId, licenseSet } | حالة قفل الترخيص. reason تكون 'disabled' عندما لا يكون ts.licenseLock.enabled هو true، و 'not_checked' قبل أول فحص بعد 1.5 ثانية من البدء. | لا |
GetServerAuthorityStatus | لا يوجد | { enabled, checks = { [id] = { available, enabled, action } } } | يعرض فحوص سلطة الخادم التي يدعمها إصدار هذا الخادم وكيف هي مضبوطة. المعرّفات: superJump و damageMod و meleeMod و defenseMod و weapon و godmode و invisible و noclip و focus. | لا |
getRuntimeStats | لا يوجد | { uptime_sec, connect_buckets, subnet_buckets, license_tracking } | عدّادات تقوية الاتصالات. | لا |
getBatchStats | لا يوجد | { log_pending, detection_pending, webhook_pending } | أحجام الطوابير في كاتب الدفعات الذي يعمل كل 5 ثوانٍ. | لا |
getCleanupStats | لا يوجد | { runs, last_run_at, last_summary, cleaned } | للقراءة فقط. | لا |
runCleanup | لا يوجد | جدول الإحصاءات؛ و false عند الرفض | يشغّل تنظيف الاحتفاظ الآن: سجلات اللاعبين المتصلين القديمة، والاكتشافات القديمة، وسجلات الإدارة، وتدقيق اللوحة، وسمعة IP، وطوابير الأوامر ولقطات الشاشة، ومحاولات تسجيل الدخول، والجلسات المنتهية (الحدود من إعدادات keep في ts.v12). عمليات الحذف غير متزامنة، لذا لا تشمل الإحصاءات المُعادة هذا التشغيل بعد. | نعم |
حارس الموارد (Resource guard)#
اقرأ وغيّر خط الأساس للموارد المعتمدة. كل هذه الـ exports تُسجَّل حتى عندما يكون resource guard معطّلًا.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
getBaseline | لا يوجد | { [resource] = { manifest_hash, deep_hash } } | خط الأساس المعتمد. | لا |
getResources | لا يوجد | { [resource] = true } | الموارد المعروفة. | لا |
getSuspicious | لا يوجد | { [resource] = { reason, state, hash, manifest, at } } | الموارد المرصودة على أنها متغيّرة أو مشبوهة. | لا |
getStats | لا يوجد | { lastScan, violations, driftedResources } | عدّادات الحارس. | لا |
rescanResources | لا يوجد | حالة الحارس الكاملة (ready و resources و hashes و suspicious و drift_count و violation_count و last_scan وغيرها) | يعيد بناء لقطة الموارد بشكل متزامن. | لا |
approveResource | resourceName؛ approvedBy? (الافتراضي 'web_panel') | true؛ أو false, 'resource_missing'؛ و false عند الرفض | يضيف hash الـ manifest الحالي إلى خط الأساس، ويمسح علامتي الاشتباه والحظر، ويحفظ في قاعدة البيانات، ويحدّث كل العملاء. | نعم |
blockResource | resourceName؛ reason? (الافتراضي 'Manuel blok'، بالتركية) | true؛ و false عند الرفض | يعلّم المورد كمحظور، ويزيله من خط الأساس، ويحفظ في قاعدة البيانات، ويوقفه إذا كان قيد التشغيل. | نعم |
tsAutoSetup | لا يوجد | true (حتى لو كان هناك إعداد قيد التشغيل)؛ و false عند الرفض | مثل أمر وحدة التحكم tosunac_setup: يكتشف إطار العمل، ويشغّل فحص الأبواب الخلفية (مهلة 120 ثانية) وفحص التواقيع، ويعتمد فقط الموارد قيد التشغيل التي نتائج فحص الأبواب الخلفية والتواقيع لها مكتملة ونظيفة وبلا تغيير، ثم يشغّل فحص الأحداث. يتوقف دون اعتماد أي شيء إذا كان backdoor guard معطّلًا أو مشغولًا. | نعم |
فحوص التواقيع والأبواب الخلفية والأحداث#
شغّل الفحوص وأدِر التواقيع واستثناءات الإيجابيات الكاذبة وتخطّيات escrow. قد تستغرق الفحوص وقتًا؛ شغّلها من thread.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
scanAllResources | لا يوجد | { total, scanned, infected, clean, errors, cached, skipped }؛ أو nil, 'already_scanning' | فحص التواقيع لكل مورد. يتوقف مؤقتًا (yield). يعيد ضبط قائمة الموارد المصابة. يحظر الموارد المصابة عندما يكون ts.ResourceGuard.autoBlockInfected مفعّلًا. | لا |
scanSingleResource | name | infected (boolean)، reason | reason تكون إحدى القيم: self و escrow_signature_skip و whitelisted و snapshot_unavailable و incomplete و clean و cached_clean و infected و cached_infected و blocked. قد يتوقف مؤقتًا (yield). | لا |
getInfectedFiles | لا يوجد | خريطة الملفات المصابة | نتيجة آخر فحص. | لا |
addCheatSignature | pattern (نمط لاسم المورد)؛ signatureName?؛ severity? (الافتراضي 'critical') | true؛ و false إذا كان فارغًا أو مرفوضًا | يضيف النمط في الذاكرة وفي قاعدة البيانات. قيم severity: info (منخفض)، warning (متوسط)، low، medium، high أو critical؛ والقيم غير المعروفة تصبح high. | نعم |
invalidateSignatureCache | لا يوجد | true | يمسح ذاكرة الأنماط المؤقتة ونتائج الفحص المحفوظة، لذا يعيد الفحص التالي قراءة كل مورد. | لا |
reloadSignatureExceptions | لا يوجد | true | يُبطل ذاكرتي الاستثناءات وتخطّي escrow المؤقتتين ونتائج الفحص المحفوظة. يُعاد تحميلها عند الاستخدام التالي. | لا |
reloadSignatureScanCaches | لا يوجد | true | يعيد تحميل الأنماط والقائمة البيضاء والاستثناءات وتخطّيات escrow من قاعدة البيانات الآن. | لا |
addSignatureEscrowSkip | resourceName؛ note? | true؛ و false إذا كان فارغًا، أو بلا MySQL، أو عند الرفض | يتخطى فحص التواقيع بالكامل لذلك المورد (للكود المحمي بـ escrow). | نعم |
removeSignatureEscrowSkip | idOrName (معرّف السجل أو اسم المورد) | true؛ و false إذا كان غير صالح، أو بلا MySQL، أو عند الرفض | يزيل تخطّي escrow. | نعم |
addSignatureException | resourceName؛ filePath? ('' = كل الملفات)؛ signatureName؛ note? | true؛ و false إذا كانت حقول مفقودة، أو بلا MySQL، أو عند الرفض | يعلّم إصابة توقيع في ذلك المورد على أنها إيجابية كاذبة. | نعم |
removeSignatureException | id (number) | true؛ و false إذا لم يكن رقميًا، أو بلا MySQL، أو عند الرفض | يحذف الاستثناء. | نعم |
tsScanBackdoors | callback?(report) حيث report = { complete, resources, finished_at, trigger } | true إذا بدأ؛ و false إذا كان هناك فحص قيد التشغيل | يشغّل فحص الأبواب الخلفية في thread. تذهب النتائج إلى قاعدة البيانات واللوحة. مع تفعيل ts.BackdoorGuard.autoQuarantine، الإصابات الحرجة توقف المورد. | لا |
tsScanEvents | لا يوجد | true إذا بدأ؛ و false إذا كان هناك فحص قيد التشغيل | يبني جردًا ثابتًا للأحداث والمشغّلات (triggers) في كل الموارد ويرسله إلى اللوحة. | لا |
أحداث المصائد (honeypot)#
حوّل أسماء الأحداث إلى مصائد أو حرّرها. كلاهما يكتب في ac_protected_events ويعيد التحميل من قاعدة البيانات.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
fakeTriggerTrap | eventName؛ type ('client' أو 'server') | true إذا أُرسل؛ و false إذا كان غير موثوق أو كان type غير صالح | يجعل الحدث مصيدة (active = 1). أعد تشغيل الـ AC (ensure tosun-ac) للحصول على التأثير الكامل. | نعم |
fakeTriggerWhitelist | eventName | true إذا أُرسل (حتى مع اسم فارغ، وهو لا يفعل شيئًا)؛ و false إذا كان غير موثوق | يعطّل المصيدة لذلك الحدث (active = 0). المعالجات المسجّلة مسبقًا قد تحتاج إلى إعادة تشغيل الـ AC؛ ووحدة التحكم تذكر ذلك. | نعم |
Exports تعتمد على الميزات#
تُسجَّل هذه الـ exports فقط عندما تكون ميزتها مفعّلة. إذا كانت الميزة معطّلة، فإن استدعاءها يُصدر خطأً.
| Exports | تُسجَّل فقط عندما |
|---|---|
quarantine, releaseQuarantine, isQuarantined, quarantineList | ts.quarantine.enabled ليس false |
crashGuardInspect, crashGuardReject | ts.crashGuard.enabled ليس false |
runCleanup, getCleanupStats | ts.v12.enableAutoCleanup ليس false |
tsScanBackdoors | ts.BackdoorGuard.enabled ليس false |
tsScanEvents | ts.EventScanner.enabled ليس false |
applyWeatherWithFramework, applyTimeWithFramework | قائمة الإدارة مفعّلة (ts.AdminMenu موجود ولا يكون enable ولا enabled بقيمة false) |
phoneNotify, phoneNotifyAdmins | ts.AdminMenu.enable مفعّل |
Exports على جانب العميل#
استدعِ هذه الـ exports من سكربتات العميل. يمكن لأي مورد على العميل استدعاؤها؛ لا يوجد فحص ثقة. تؤثر فقط في الفحوص على ذلك العميل ولا تغيّر أبدًا الفرض على الخادم.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
SetExempt (client) | state (boolean)؛ durationMs? (الافتراضي 30000، الحد الأقصى 300000)؛ reason? (مفتاح، الافتراضي 'unknown') | nil | يضيف أو يزيل إعفاءً محليًا تحت ذلك السبب. المنح الجديد يستبدل وقت الانتهاء للسبب نفسه. تُتخطّى معظم فحوص العميل أثناء نشاطه؛ والاكتشافات التي ما زالت تصل إلى مسار الحظر في العميل تُخفَّض إلى إدخالات LOG موسومة بـ [exempt]. state = false يزيل ذلك السبب فقط. | لا |
PauseDetections | durationMs? (الافتراضي 10000، الحد الأقصى 300000) | nil | يوقف فحوص العميل المحلية مؤقتًا. كل استدعاء يستبدل وقت الانتهاء، لذا PauseDetections(0) ينهي الإيقاف المؤقت والقيمة الأقصر تقصّره. | لا |
IsPlayerAdmin | لا يوجد | boolean | علامة طاقم محلية، تُحدَّث كل ثانيتين من حالة الإدارة التي يتحقق منها الخادم، وليس من state bag يستطيع العميل الكتابة فيه. | لا |
IsExempt | لا يوجد | boolean | true إذا كان اللاعب من الطاقم، أو كان إعفاء أو إيقاف مؤقت من الخادم نشطًا، أو كان PauseDetections نشطًا، أو كان أي سبب من SetExempt نشطًا. | لا |
GetExemptions | لا يوجد | { [reason] = remainingMs } | يعرض فقط أسباب SetExempt و state bag tsAcExempt. لا يعرض PauseDetections ولا إعفاءات الخادم ولا حالة الطاقم؛ استخدم IsExempt للإجابة الكاملة. | لا |
SetSpawned | state (boolean) | nil | true يعلّم اللاعب بأنه ظهر (spawned). false يوقف مؤقتًا فحوص الحركة والفحوص البصرية، مثلًا عند اختيار الشخصية؛ ويُطبَّق مرة واحدة على الأكثر كل 5 دقائق، وتُستأنف الفحوص بعد نحو 30 ثانية من الحركة المرئية العادية. | لا |
getConfig (client) | لا يوجد | جدول إعدادات العميل | تُزامَن مع العملاء فقط الإعدادات الآمنة لجانب العميل. | لا |
-- اختيار الشخصية
exports['tosun-ac']:SetSpawned(false)
-- ... اللاعب يختار شخصية ...
exports['tosun-ac']:SetSpawned(true)Exports بلغة JavaScript#
يسجّل Tosun AC بعض exports بلغة JavaScript على الخادم لفحص الموارد والتحقق من الترخيص. هي داخلية، وغير مشمولة بفحص الموارد الموثوقة، وليست API مدعومة. لا تستدعها. لا توجد exports عامة بلغة JavaScript.
ملفات الجسر: الإعداد#
ملفات الجسر الاختيارية في tosun-ac/bridge تمنح موردك جدولًا عامًا TosunAC مع دوال مساعدة قصيرة. تستدعي الـ exports داخل pcall، لذا يستمر سكربتك في العمل عندما يكون الـ AC متوقفًا. يرى الـ AC موردك على أنه المستدعي.
- أضف الجسر إلى ملف fxmanifest.lua في موردك: server_script '@tosun-ac/bridge/tosun_ac_server.lua'، وعند الحاجة client_script '@tosun-ac/bridge/tosun_ac_client.lua'.
- إذا كان لمجلد الـ AC اسم آخر، فأضف setr tosun_ac_resource "folder-name" إلى server.cfg. استخدم setr: لأن جسر العميل يقرأ هذا الـ convar على العميل.
- اختياري: set tosun_ac_bridge_server_ms (الافتراضي 60000)، و set tosun_ac_bridge_cooldown_ms (الافتراضي 750، و 0 يعطّله)، و setr tosun_ac_bridge_client_ms (الافتراضي 60000).
- للحصول على إعفاءات خادم كاملة، أضف موردك إلى tosun_ac_trusted_resources. بدون الثقة يرجع TosunAC.PlayerExempt إلى إعفاء جزئي (soft) ويطبع تلميحًا لمرة واحدة في وحدة تحكم الخادم (نص التلميح بالتركية).
-- ملف fxmanifest.lua الخاص بموردك
server_script '@tosun-ac/bridge/tosun_ac_server.lua'
client_script '@tosun-ac/bridge/tosun_ac_client.lua'
# server.cfg
setr tosun_ac_resource "tosun-ac"
set tosun_ac_trusted_resources "my-resource"
-- سكربت الخادم
local ok, mode = TosunAC.PlayerExempt(src, 'long', 'clothing')
-- قيمة mode هي 'full' (موثوق) أو 'soft' (الحركة فقط، بحد أقصى 15 ثانية)الجسر: الدوال المساعدة على الخادم#
معرّفة في bridge/tosun_ac_server.lua داخل موردك. الإعدادات المسبقة: SHORT 30000 و MEDIUM 60000 و LONG 120000 و XL 180000 ms (TosunAC.Presets). قيمة TosunAC.Version هي '1.2'.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
TosunAC.MarkTeleport | playerId (1 أو أكثر)؛ durationMs? (الافتراضي 8000) | true فقط إذا أعاد الـ export القيمة true | يستدعي MarkTeleport مع السبب 'bridge:teleport'. | لا (إذا كان موردك غير موثوق، تُطبَّق ميزانية MarkTeleport لكل لاعب) |
TosunAC.PlayerExempt | playerId؛ durationMs (من 500 إلى 300000)، أو اسم إعداد مسبق، أو nil (= tosun_ac_bridge_server_ms)؛ tag? (الافتراضي اسم موردك) | true, 'full'؛ أو true, 'soft'؛ أو false | يجرّب SetPlayerExempt. إذا رُفض، يرجع إلى MarkTeleport لمدة تصل إلى 15 ثانية. فترة تهدئة لكل لاعب (الافتراضي 750 ms، مشتركة مع PlayerExemptPreset) تعيد false واحدًا. في وضع التدقيق تكون النتيجة 'full' حتى للموارد غير المدرجة. | فقط مع 'full' |
TosunAC.PlayerExemptPreset | playerId؛ presetName? (الافتراضي 'MEDIUM'، دون التأثر بحالة الأحرف)؛ tag? | مثل PlayerExempt | PlayerExempt بمدة إعداد مسبق. الأسماء غير المعروفة تستخدم MEDIUM. يتجاهل tosun_ac_bridge_server_ms. | فقط مع 'full' |
TosunAC.PlayerExemptOff | playerId؛ tag? (لا يستخدمه الـ AC) | true إذا قُبل | يستدعي SetPlayerExempt(playerId, false). الموارد غير الموثوقة تحصل على false، ولا تُنهى نافذة الإعفاء الجزئي. | نعم |
TosunAC.IsTrusted | لا يوجد | boolean | GetIntegrationStatus().trusted. يعيد false للموارد غير المدرجة حتى في وضع التدقيق، حيث تمر الاستدعاءات المحمية مع ذلك. | لا |
TosunAC.IsAvailable | لا يوجد | boolean | true عندما يكون مورد الـ AC قيد التشغيل. | لا |
الجسر: الدوال المساعدة على العميل#
معرّفة في bridge/tosun_ac_client.lua داخل موردك. تغلّف export العميل SetExempt، لذا تمنح تخفيفًا على جانب العميل فقط.
| Export | المعاملات | القيمة المُعادة | ما يفعله | هل يلزم مورد موثوق؟ |
|---|---|---|---|---|
TosunAC.Exempt | durationMs (من 500 إلى 300000)، أو اسم إعداد مسبق، أو nil (= tosun_ac_bridge_client_ms)؛ tag? (الافتراضي اسم موردك) | nil | يستدعي SetExempt في العميل بالمفتاح 'bridge:' متبوعًا بـ tag. | لا |
TosunAC.ExemptOff | tag? (يجب أن يطابق tag المستخدم في Exempt) | nil | يزيل ذلك الإعفاء. | لا |
TosunAC.ExemptPreset | name? (الافتراضي 'MEDIUM') | nil | Exempt بمدة إعداد مسبق و tag الافتراضي. بلا معامل tag. | لا |
TosunAC.RunWithExempt | durationMs؛ tag؛ fn | true مع نتائج fn؛ أو false, err؛ أو false إذا لم تكن fn دالة | يُعفي، ثم يشغّل fn داخل pcall، ثم يستدعي ExemptOff(tag). | لا |
TosunAC.RunWithExemptPreset | presetName؛ fn | مثل RunWithExempt | RunWithExempt بمدة إعداد مسبق و tag الافتراضي. | لا |
TosunAC.IsAvailable | لا يوجد | boolean | true عندما يكون مورد الـ AC قيد التشغيل. | لا |
tosun-ac:bridge:clientExempt (net event) | durationMs?؛ tag? | لا شيء | مسجّل داخل كل مورد يتضمن جسر العميل. يمكن لسكربت الخادم إرساله عبر TriggerClientEvent لتشغيل TosunAC.Exempt على ذلك العميل. إذا كانت عدة موارد تتضمن الجسر، يطبّق كل منها إعفاءه الخاص. لا شيء في tosun-ac يرسله. | لا (سكربتات الخادم، أو سكربتات العميل المحلية عبر TriggerEvent) |
Exports يمكن لأي مورد استدعاؤها#
هذه الـ exports بلا فحص ثقة ولها آثار جانبية. يمكن لكل مورد على الخادم استدعاؤها. شغّل فقط الموارد التي تثق بها؛ ولاحظ أن أي مورد على الخادم يستطيع أصلًا طرد اللاعبين أو إطلاق أحداث العميل عبر natives في FiveM.
- MarkTeleport: إعفاء حركة، محدود بميزانية لكل لاعب.
- spectatePlayer: ينقل لاعبًا ويمنح إعفاء حركة لمدة 15 ثانية خارج الميزانية مع كل استدعاء.
- NoteCloudViolation: يرفع درجة التهديد للاعب وقد يُبلغ عن الـ license إلى قاعدة بيانات التهديدات المشتركة بين الخوادم.
- warnPlayer و mutePlayer: يكتبان سجلات التحذير والكتم.
- freezePlayer و slayPlayer: ينفّذان إجراءً على لاعب مباشرة.
- crashGuardReject: يضيف مخالفات قد تؤدي إلى الطرد أو الحظر.
- screenCapture و v6ScreenWatchRequest و RequestShieldScreenshot: تطلب لقطات شاشة.
- rescanResources و scanAllResources و scanSingleResource و tsScanBackdoors و tsScanEvents: تبدأ الفحوص. قد يحظر scanAllResources موارد، وقد يوقف tsScanBackdoors موارد، عندما يكون الحظر التلقائي أو الحجر التلقائي مفعّلًا.
- applyWeatherWithFramework و applyTimeWithFramework: يغيّران الطقس والوقت للجميع.
- invalidateSignatureCache و reloadSignatureExceptions و reloadSignatureScanCaches و refreshPanelWhitelist: تعيد تحميل الذاكرة المؤقتة.
- setPlayerLocale و unmutePlayer: يغيّران حالة اللاعب.
- phoneNotify و phoneNotifyAdmins: يرسلان رسائل هاتف أو دردشة إلى اللاعبين.
أسماء قديمة ومضللة#
هذه الـ exports ما زالت تعمل، لكن أسماءها أو وثائقها القديمة توحي بشيء لا تفعله.
- الأدلة القديمة (INTEGRATION.md للإصدار 9.6.6، و CONFIG-EXPORTS-MULTILANG.md للإصدار 8.6.1، وملف إعادة التوجيه المختصر TOSUN-AC-EXPORTS.md) قديمة. حيث تختلف، يطابق هذا المرجع كود الإصدار 9.6.15.
- SetPlayerExempt و PausePlayerDetections و PauseAllDetections و BypassDetection و AddWhitelist و RemoveWhitelist و WhitelistArea و ClearArea و addAdmin و fakeTriggerTrap و fakeTriggerWhitelist تتطلب موردًا موثوقًا، مع أن CONFIG-EXPORTS-MULTILANG.md يدرجها دون هذا الشرط.
- القائمة الموثوقة الافتراضية هي qbx_core و qb-core و es_extended و ox_inventory و ox_lib. يُغفل INSTALLER-READY.md كلًا من qb-core و es_extended.
- GetIntegrationStatus() يعيد أيضًا حقل version.
- punish و ban و BanPlayerExt و KickPlayer و offlineBan و offlineBanByLicense تتطلب موردًا موثوقًا.
- ban() و BanPlayerExt() يتبعان ts.punishType و ts.BanDurations['default']، لذا ليسا دائمًا حظرًا دائمًا.
- KickPlayer لا يتحقق من الإعفاءات. في مسار punish، يستثني KICK الطاقم دائمًا، بينما يتبع BAN و LOG الإعداد ts.AdminBypassDetections.
- أثناء إعفاء العميل تُتخطّى معظم فحوص العميل بالكامل. فقط الاكتشافات التي ما زالت تصل إلى مسار الحظر تصبح إدخالات LOG موسومة بـ [exempt].
- NoteCloudViolation يمنع الانضمامات اللاحقة فقط مع ts.cloudBridge.threatIntelAction = 'kick'.
- مع جسر العميل، يجب ضبط الـ convars tosun_ac_resource و tosun_ac_bridge_client_ms عبر setr، وليس set.
- الحد الأقصى لكل استدعاء في MarkTeleport (ts.Integration.markTeleportMaxMs) يُطبَّق على المستدعين الموثوقين أيضًا. ميزانية 180 ثانية كل 10 دقائق وحدها خاصة بالمستدعين غير الموثوقين.
| Export | ما يجب معرفته | استخدم بدلًا منه |
|---|---|---|
BypassDetection | مفتاح الاكتشاف يُتجاهل. يمنح إعفاءً كاملًا لمدة من 0.5 إلى 60 ثانية. | SetPlayerExempt بمدة قصيرة، أو MarkTeleport لعمليات النقل |
GetDetections | يعيد سجلات حظر اللاعب، وليس الاكتشافات. | getBans أو getBanInfo |
getAdminType | 'tx' لا تعني txAdmin؛ والطاقم يحصل دائمًا تقريبًا على 'tx'. | isAdmin أو isStaffPlayer |
SetExempt (server) | اسم بديل لـ SetPlayerExempt(src, true, ...). الوسائط تختلف عن SetExempt الخاص بالعميل. | SetPlayerExempt |
WhitelistArea | تخفيف على جانب العميل فقط؛ بلا حصانة من عقوبات الخادم. | SetPlayerExempt للحصانة على الخادم |
screenCapture | الـ AC لا يحفظ النتيجة. | v6ScreenWatchRequest أو RequestShieldScreenshot |
GetStatus().detections | ليس عددًا للاكتشافات أو للحظر. | لا تستخدمه كعدّاد |
isAdmin, addAdmin | مسجّل مرتين في الكود المصدري. نسختا anticheat_server.lua هما اللتان تعملان. | استدعِهما بشكل عادي |