
CoreProtect — Minecraft Java Edition 1.16 - 1.21.11+
التبعيات: · المُحمِّل: Bukkit, Spigot, Paper, Purpur, Folia · إصدار Minecraft: 1.16 - 1.21.11+ · إصدار المود: 23.2 تحتاج خوادم Minecraft…
التبعيات: · المُحمِّل: Bukkit, Spigot, Paper, Purpur, Folia · إصدار Minecraft: 1.16 - 1.21.11+ · إصدار المود: 23.2 تحتاج خوادم Minecraft متعددة اللاعبين إلى تدقيق مفصّل لأفعال اللاعبين لمنع التعديلات غير المصرّح بها للخ
التبعيات:
· المُحمِّل: Bukkit, Spigot, Paper, Purpur, Folia
· إصدار Minecraft: 1.16 - 1.21.11+
· إصدار المود: 23.2
تحتاج خوادم Minecraft متعددة اللاعبين إلى تدقيق مفصّل لأفعال اللاعبين لمنع التعديلات غير المصرّح بها للخريطة وسرقة الممتلكات القيّمة داخل اللعبة. لا تسجّل النواة الأصلية (vanilla) للخادم سجلّ تعديل التضاريس ولا حركة العناصر داخل الحاويات، ولذلك لا يملك المسؤولون أي وسيلة لتحديد المخالفين أو التراجع عن عمليات التدمير دون استعادة ملفات الخريطة بالكامل من النسخ الاحتياطية. يسجّل المكوِّن الإضافي للخادم CoreProtect جميع أحداث تغيير العالم، وينشئ فهارس مفصّلة لأفعال المستخدمين، وينفّذ عمليات تراجع (rollbacks) نقطية للمساحة بناءً على استعلامات بارامترية معقدة. تعمل الأداة في وضع غير متزامن، فتكتب المعاملات في طابور لحماية الخيط الرئيسي للخادم من التأخيرات.
1. قواعد البيانات والبنية غير المتزامنة للتسجيل
يعترض المكوِّن الإضافي CoreProtect أحداث الخادم باستخدام معالِجات الأحداث في واجهة Bukkit/Paper API. ولمنع حجب الخيط الرئيسي للخادم (Server Thread) أثناء معالجة آلاف السجلات في الثانية، يستخدم المكوِّن الإضافي نموذج تسجيل غير متزامن. توضع الأحداث (تدمير كتلة، تغيير محتوى صندوق، استخدام أمر) أولاً في مخزن مؤقت ديناميكي داخلي هو DataQueue. ويقرأ خيط مستهلك في الخلفية (Consumer Thread) المعاملات من المخزن المؤقت ويكتبها في قاعدة البيانات عبر معاملات مجمّعة (Batch processing)، مما يقلّل العبء على وحدة التخزين.
يدعم المكوِّن الإضافي العمل مع نظامَي إدارة قواعد بيانات (DBMS):
1. SQLite (محلي افتراضيًا): تُكتب جميع المعلومات في الملف database.db في دليل المكوِّن الإضافي. لا يتطلّب SQLite تثبيت خدمات خارجية، مما يجعله مناسبًا للخوادم المحلية الصغيرة ذات مستوى المعاملات المنخفض.
2. MySQL / MariaDB (خادم خارجي): يستخدم اتصالاً شبكيًا بخادم قاعدة بيانات منفصل. هذا الحل هو المعيار الصناعي للخوادم الكبيرة وشبكات الخوادم ذات الأعداد العالية من المتصلين (ابتداءً من 50 لاعبًا). يضمن MySQL سرعة عالية في تنفيذ الاستعلامات المفهرسة ويلغي تجزئة التخزين المحلي.
مخطّط جداول قاعدة البيانات
ينشئ CoreProtect مجموعة من الجداول العلائقية لتحسين تخزين البيانات. وبدلاً من حفظ سلاسل نصية كاملة لكل سجل، يستخدم المكوِّن الإضافي جداول قاموسية للأسماء الفريدة للاعبين والعوالم وأنواع الكتل والكيانات.
الجدول | الغرض | الحقول الرئيسية |
|---|---|---|
| قاموس أسماء المستخدمين |
|
| قاموس عوالم اللعبة |
|
| سجل تغييرات الكتل في العالم |
|
| معاملات العناصر في الحاويات |
|
| سجل جلسات تسجيل الدخول (دخول/خروج) |
|
| محتوى اللافتات النصية |
|
| سجلات موت المخلوقات وظهورها |
|
تُفهرس جميع الإحداثيات x، y، z مع مُعرّف العالم wid لضمان بحث فوري عن المعاملات ضمن نصف قطر محدد.
2. صياغة الأوامر ومعاملات التصفية
يتم التفاعل مع قاعدة بيانات CoreProtect عبر أوامر نصية. العمليات الرئيسية هي: الفحص والبحث والتراجع وإلغاء التراجع.
وضع المفتّش /co inspect أو /co i)
يُحوّل الأمر العميل إلى وضع التدقيق المحلي. بعد التفعيل، يمكن للاعب التفاعل مع العالم للحصول على السجلات:
· النقر بالزر الأيسر على كتلة موجودة يعرض في الدردشة اسم اللاعب الذي وضعها، والتاريخ، والوقت، والإحداثيات.
· النقر بالزر الأيمن على سطح فارغ (أو كتلة) يعرض سجلّ الكتل التي كانت تشغل هذه المساحة سابقًا أو التي أُزيلت.
· النقر بالزر الأيمن على حاوية (صندوق، فرن، برميل، شالكر) يعرض سجلّ حركة العناصر.
معاملات تصفية الاستعلامات /co rollback، /co restore، /co lookup)
لاختيار البيانات، يستخدم المكوِّن الإضافي معاملات مركّبة بالصيغة المعامل:القيمة. وتُفصل المعاملات بمسافات:
1. المستخدم u:<الاسم>): يحدّد اللاعب المراد فحصه. يمكن تحديد عدة أسماء مفصولة بفواصل (على سبيل المثال، u:Stevie,Alex). للتراجع عن الأحداث الطبيعية، تُستخدم مُعرّفات تقنية:
· u:#fire – انتشار النار.
· u:#lava – تدفق الحمم.
· u:#water – تدفق الماء.
· u:#creeper – انفجار كريبر.
· u:#tnt – انفجار TNT.
· u:#enderman – نقل الكتل بواسطة إندرمان.
2. الوقت t:<القيمة>): فترة زمنية للتحليل. يدعم وحدات القياس: s (ثوانٍ)، m (دقائق)، h (ساعات)، d (أيام)، w (أسابيع)، y (سنوات). يُسمح بدمج الوحدات، على سبيل المثال: t:2w4d6h (أسبوعان و4 أيام و6 ساعات).
3. نصف القطر r:<الرقم>): نصف قطر منطقة البحث بالكتل حول مُنفِّذ الأمر. كما يدعم قيمًا خاصة:
· r:#global – البحث في قاعدة البيانات بأكملها (ضمن جميع القطع المحمّلة).
· r:#world – البحث ضمن عالم اللعبة الحالي.
· r:#chunk – البحث في القطعة الحالية للاعب.
· r:#selection (أو r:#we) – يحصر البحث ضمن حدود شبكة التحديد الحالية في WorldEdit.
4. الإجراء a:<النوع>): يصفّي السجلات حسب نوع العملية:
· a:block – وضع الكتل وتدميرها.
· a:+block – وضع الكتل فقط.
· a:-block – تدمير الكتل فقط.
· a:container – معاملات المخزون.
· a:+container – إضافة عناصر إلى حاوية.
· a:-container – إخراج عناصر من حاوية.
· a:kill – موت الحيوانات والوحوش.
· a:spawn – ظهور الكيانات.
· a:chat – رسائل الدردشة.
· a:command – الأوامر المُدخَلة.
· a:session – تسجيل دخول اللاعبين.
5. الكتل b:<المادة>): يحصر البحث في المواد المحددة (على سبيل المثال، b:stone,oak_planks).
6. الاستثناء e:<المادة>): يستبعد المواد من المعالجة (على سبيل المثال، e:tnt).
المعاينة المسبقة للتراجع وإلغاء العمليات
لتقليل الأخطاء أثناء عمليات التراجع واسعة النطاق، يدعم CoreProtect نظام محاكاة بصرية:
1. تنفيذ أمر التراجع مع العلامة #preview (على سبيل المثال، /co rollback u:Griefer t:2h r:20 #preview) لا يغيّر ملفات الخريطة. وبدلاً من ذلك يتلقّى العميل حِزم تغيير الكتل في جلسة العرض الحالية. يرى المسؤول العالم في حالة "ما بعد التراجع"، بينما تبقى الكتل دون تغيير بالنسبة للاعبين الآخرين.
#preview
/co apply
2. لتطبيق النتيجة، يُستخدم الأمر /co apply.
3. لإلغاء المعاينة المسبقة، يُستخدم الأمر /co cancel.
4. لإلغاء تراجع فعلي تم تنفيذه بالفعل، يُطبَّق الأمر /co undo، الذي يُعيد الإحداثيات إلى حالتها قبل تنفيذ /co rollback.
3. الوصف الكامل لملف الإعدادات config.yml
يتحكّم ملف الإعدادات في الحدود ومعاملات التسجيل والاتصال بقواعد البيانات.
كتلة المعاملات العامة (General Settings)
· verbose: true – يطبع تقريرًا مفصّلاً في وحدة التحكم عن كل إحداثي معدَّل أثناء تنفيذ عمليات التراجع. وفي حال ضبطه على false يُطبع العدد الإجمالي للكتل المعدَّلة فقط.
· check-updates: true – يتحقّق عند التشغيل من وجود إصدارات جديدة من المكوِّن الإضافي على خوادم المطوِّر.
· api-enabled: true – يسمح للمكوِّنات الإضافية الخارجية بالتفاعل مع بيانات CoreProtect.
· default-radius: 10 – نصف قطر التراجع الافتراضي إذا لم يُحدَّد هذا المعامل في الأمر.
· max-radius: 250 – يحدّ من نصف القطر الأقصى لأمر واحد. القيمة 0 تُلغي القيد.
كتلة معاملات التسجيل (Logging Settings)
تحدّد هذه المعاملات الأحداث التي تُكتب بالضبط في قاعدة البيانات. ويساعد تعطيل السجلات غير الضرورية على تقليل حجم قاعدة البيانات:
· block-place: true / block-break: true – تسجيل وضع الكتل وتدميرها الاعتيادي من قِبل اللاعبين.
· natural-break: true – تسجيل سقوط الكتل نتيجة الانزياحات أو تدمير كتل الدعم (على سبيل المثال، كسر الكتلة التي كانت تستند إليها شعلة).
· block-movement: true – تسجيل السقوط الجاذبي للرمل أو الحصى أو الخرسانة.
· pistons: true – تسجيل نقل الكتل بواسطة المكابس.
· block-burn: true – تسجيل تدمير الكتل بالنار.
· block-ignite: true – تسجيل إشعال اللاعبين للكتل بواسطة قدّاحة أو كرات نارية.
· explosions: true – تسجيل انفجارات TNT والكريبر والأسرّة في النذر أو بلورات الإند.
· entity-kills: true – تسجيل موت القرويين والحيوانات والوحوش وحوامل الدروع.
· player-chat: true / player-command: true – تسجيل رسائل الدردشة وأوامر وحدة التحكم.
· player-session: true – تسجيل وقت دخول اللاعبين وخروجهم من الخادم.
· container-transactions: true – تسجيل عمليات نقل العناصر في الصناديق والأفران والقمعات والشالكر.
كتلة قاعدة البيانات (Database Settings)
· use-mysql: false – مفتاح تبديل نوع قاعدة البيانات. وفي حال ضبطه على true يتصل المكوِّن الإضافي بنظام إدارة قواعد بيانات MySQL خارجي.
· table-prefix: co_ – بادئة لأسماء جداول SQL.
· mysql-host: localhost – عنوان IP أو اسم النطاق لخادم قواعد بيانات MySQL.
· mysql-port: 3306 – منفذ الشبكة للاتصال.
· mysql-database: minecraft – اسم قاعدة البيانات الهدف.
· mysql-username: root – اسم مستخدم قاعدة البيانات.
· mysql-password: password – كلمة مرور المستخدم.
· mysql-ssl: false – يُفعّل تشفير SSL للاتصال بخادم قواعد البيانات.
4. واجهة برمجة التطبيقات (API) لمطوّري المكوّنات الإضافية
يوفّر CoreProtect للمطوّرين وصولاً إلى قاعدة بياناته عبر الصنف CoreProtectAPI. وهذا يتيح للمكوّنات الإضافية الأخرى (على سبيل المثال WorldEdit أو أنظمة الحماية) تسجيل تغييراتها الخاصة أو إجراء بحث تلقائي في السجل.
تهيئة الواجهة API
للاتصال بالواجهة API، تُستخدم طريقة التهيئة:
import net.coreprotect.CoreProtect; |
الطرق الرئيسية لواجهة API
· boolean logPlacement(String user, Location location, Material type, BlockData blockData) – يسجّل وضع كتلة في قاعدة البيانات نيابةً عن المستخدم المحدد.
· boolean logRemoval(String user, Location location, Material type, BlockData blockData) – يسجّل تدمير كتلة.
· boolean logContainerTransaction(String user, Location location, Material type, ItemStack itemStack, boolean isAdded) – يسجّل عملية إضافة (true) أو إخراج (false) عناصر من حاوية.
· List<String[]> performLookup(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – ينفّذ بحثًا وفق المرشّحات المحددة ويُرجع مصفوفة من النتائج.
· List<String[]> performRollback(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – يبدأ تراجعًا غير متزامن للتغييرات في العالم.
· List<String[]> performRestore(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – يبدأ استعادة غير متزامنة للتغييرات.
· boolean hasPlaced(String user, Block block, int time, int offset) – يتحقّق مما إذا كان اللاعب المحدد قد وضع هذه الكتلة خلال وقت معيّن.
· boolean hasRemoved(String user, Block block, int time, int offset) – يتحقّق مما إذا كان اللاعب المحدد قد دمّر هذه الكتلة.
5. الأداء والتوافق والصيانة
عند العمل مع CoreProtect على الخوادم ذات الأعداد العالية من المتصلين، يراعي المسؤولون خصائص التفاعل مع بُنى الخوادم الحديثة:
· دعم Folia: تستخدم نواة الخادم Folia جدولة متعددة الخيوط حسب المناطق (Regionized multithreading)، وهو ما يتطلّب من المكوّنات الإضافية أمانًا صارمًا للخيوط أثناء العمل مع العالم. وقد جرى تكييف CoreProtect للعمل في Folia: يتم تنفيذ عمليتَي /co rollback و/co restore عبر مُجدوِل المناطق (Region Scheduler)، مما يمنع تعارضات الوصول إلى القطع والأخطاء الحرجة من نوع ConcurrentModificationException.
· تجميع MultiPaper: على الخوادم من نوع MultiPaper يُهيَّأ CoreProtect لاستخدام قاعدة بيانات MySQL خارجية واحدة. وهذا يساعد على مزامنة سجل أفعال اللاعبين على عُقد الكتلة المختلفة.
· تنظيف قاعدة البيانات (Purge): تتجزّأ قاعدة بيانات SQLite المحلية وتتضخّم مع مرور الوقت، مما يبطئ تنفيذ الأوامر. يحذف الأمر /co purge t:30d السجلات الأقدم من 30 يومًا. وبعد تنظيف قاعدة بيانات SQLite لا يقلّ حجم الملف database.db تلقائيًا، لأن نظام SQLite يحتفظ بالصفحات الحرة للسجلات المستقبلية. ولتقليص الملف فعليًا على القرص يجب تنفيذ الأمر VACUUM عبر وحدة تحكم قاعدة البيانات أو إيقاف الخادم وإجراء الضغط بواسطة أدوات خارجية. يلغي استخدام MySQL هذه المشكلة، لأن نظام MySQL يحرّر المساحة القرصية غير المستخدمة بكفاءة أكبر.
الخلاصة
يُعدّ CoreProtect المعيار لأنظمة التسجيل والاستعادة على خوادم Minecraft Java Edition. وعلى عكس البدائل مثل LogBlock (الذي يدعم العمل مع MySQL فقط ويقتصر على تسجيل الكتل) أو Prism (الذي يتميّز ببنية إعداد أكثر تعقيدًا)، يقدّم CoreProtect تشغيلاً مستقلاً تمامًا مع SQLite، وتتبّعًا مفصّلاً لمحتوى الحاويات، إضافةً إلى نظام فريد للمعاينة المسبقة لعمليات التراجع #preview. والقيد التقني الوحيد للمكوِّن الإضافي هو العبء الكبير على وحدة التخزين أثناء تنظيف قواعد بيانات SQLite المحلية الكبيرة، ولذلك يُنصح المشاريع الكبيرة باستخدام أنظمة MySQL مخصّصة على أقراص NVMe سريعة. يناسب المكوِّن الإضافي كلًّا من الخوادم الخاصة الصغيرة بين الأصدقاء والمشاريع واسعة النطاق التي تضم مئات اللاعبين النشطين.
التثبيت
التثبيت النموذجي يستغرق حوالي 5 دقائق. الخطوات نفسها؛ يختلف فقط المُحمّل والبناء المطابق.
- 1Stop your Minecraft server.
- 2Drop the plugin .jar into the server /plugins folder.
- 3Start the server once so the plugin generates its config files.
- 4Edit /plugins/<name>/config.yml as needed, then run /reload confirm or restart.








