صناعة مود ليست نسخ كود من فيديو ثم انتظار أن يعمل. المود الجيد يبدأ بفكرة صغيرة، ثم يتحول إلى مشروع يمكن تشغيله واختباره وتحديثه من غير أن يفسد عوالم اللاعبين. في هذا الدليل سنبني تصورًا كاملًا للطريق: ماذا تتعلم أولًا، أي أدوات تختار، كيف تكتب أول ميزة، وكيف تنشرها بمسؤولية.
1. افهم الفرق بين Java وBedrock قبل كتابة أي سطر
اسم “مود” يُستخدم أحيانًا لوصف أشياء مختلفة. في Java Edition تعمل عادة داخل مشروع Java مع محمّل مثل Fabric، بينما تعتمد Bedrock Edition على Resource Packs وBehavior Packs وملفات JSON وقد تدخل JavaScript عبر Script API. توثيق Microsoft يشرح أن حزم السلوك تتحكم في سلوك الكيانات وجداول الإسقاط والوصفات وقواعد الظهور، بينما تظل حزم الموارد مسؤولة عن الصور والأصوات والمظهر [1]. اختيار المسار مبكرًا يمنع خلط ملفات لا تنتمي إلى المنصة نفسها.
| السؤال | Java + Fabric | Bedrock Add-On |
|---|---|---|
| لغة العمل الأساسية | Java وملفات موارد JSON | JSON، ومع Script API عند الحاجة |
| شكل المشروع | Gradle وLoom وملف fabric.mod.json | مجلدات packs وmanifest.json |
| أفضل بداية | عنصر أو وصفة أو حدث بسيط | تعديل كيان أو Resource Pack صغير |
| الخطر الشائع | عدم توافق إصدار اللعبة أو Loader | خطأ في UUID أو min_engine_version |
2. المرحلة الأولى: حوّل الفكرة إلى مواصفة صغيرة
اكتب صفحة واحدة قبل فتح محرر الأكواد. ضع اسم المود، الإصدار المستهدف، المنصة، الميزة الأساسية، وما الذي سيعتبر نجاحًا. مثال جيد: “إضافة عنصر مصباح يعطي ضوءًا عند وضعه، يعمل في عالم جديد، وله وصفة، ولا يسبب خطأ عند إزالة المود”. مثال سيئ: “مود يضيف كل شيء”. المواصفة الصغيرة تساعدك على معرفة ما إذا كان العطل في الكود أم في توقع غير واضح.
قائمة مواصفة من خمس خانات
- الميزة التي يراها اللاعب خلال أول دقيقة.
- البيانات التي يحتاجها المود: عنصر، وصفة، صوت، نموذج، أو حدث.
- حالات الفشل: نسخة غير مدعومة، مورد ناقص، أو إدخال غير صالح.
- طريقة الاختبار اليدوي التي تعطي نتيجة واضحة.
- ما لن يفعله الإصدار الأول حتى لا يتضخم النطاق.
3. جهّز بيئة Java + Fabric بشكل صحيح
توثيق Fabric الرسمي يذكر أن منظومته تتكون من Fabric Loader وFabric API وFabric Loom، وأن Loom يربط Gradle ببيئة تطوير المودات [2]. استخدم مولّد المشروع الرسمي، واكتب package name بحروف صغيرة وفواصل نقطية واسم مود فريد. توصي الوثائق أيضًا بتجنب المسارات التي تحتوي مسافات أو أحرف غير ASCII، لأن بعض أدوات البناء تتعامل معها بشكل مزعج [3].
بعد فك المشروع افتحه في IntelliJ IDEA أو بيئة تدعم Gradle. لا تغيّر إصدار Minecraft في ملف واحد وتترك بقية الإصدارات قديمة؛ راجع Minecraft وMappings وLoader وLoom وFabric API معًا. عندما ترى `example-mod` في القوالب، استبدله بمعرّفك أنت في المسارات والـJSON والـJava.
4. أول مشروع: من التسجيل إلى ظهور الميزة
ابدأ بـ initializer بسيط، ثم سجّل عنصرًا أو وصفة. الفكرة المهمة هنا ليست حفظ أسماء الدوال، بل فهم دورة العمل: تعريف ثابت، تسجيله في Registry، إضافة ملفات الموارد، ثم اختبار داخل عميل التطوير. أي عنصر بلا اسم ترجمة أو نموذج سيظهر بشكل ناقص حتى لو كان التسجيل صحيحًا.
public static final Item IGNIS_LAMP = register(
"ignis_lamp",
new Item(new Item.Properties())
);قسّم الكود إلى أصناف واضحة: صنف التسجيل، صنف المود الرئيسي، وحزمة للـclient عند الحاجة. لا تضع كل شيء في ملف واحد؛ الفصل المبكر يجعل تعديل الوصفة أو اللغة أسهل ويقلل أخطاء الاستيراد.
5. الاختبار ليس خطوة أخيرة
اختبر كل ميزة في عالم اختبار منفصل. جرّب إنشاء العالم، إعادة فتحه، إزالة المود من نسخة تجريبية، وتثبيت المود في عميل نظيف. اختبر أيضًا الحالة التي لا يمتلك فيها اللاعب المادة المطلوبة، وماذا يحدث عند استخدام العنصر في مكان غير صالح. احتفظ بسجل مختصر: الإصدار، الخطوة، النتيجة، ورسالة الخطأ. هذا السجل يوفر ساعات عندما تتغير نسخة اللعبة.
6. الأداء والتوافق من أول يوم
لا تنشئ كيانات أو مؤقتات كل tick من غير حاجة. إذا كانت الميزة يمكن تنفيذها بحدث مناسب فاستخدم الحدث بدل فحص العالم باستمرار. Fabric يوضح أن Events توفر hooks لحالات شائعة وتحسن التعاون بين المودات، وغالبًا تكون أنسب من Mixin مباشر [4]. تجنب تعديل ملفات Vanilla كاملة عندما تستطيع إضافة سجل أو حدث؛ الاستبدال الكامل يزيد احتمال تعارضك مع مود آخر.
7. متى تستخدم Mixin؟
استخدم Mixin عندما لا يوجد hook مناسب وتحتاج نقطة دخول دقيقة داخل كود اللعبة. هذا مسار متقدم: يجب أن تعرف الهدف، توقيت الحقن، وهل الدالة تعمل على العميل أو الخادم. ابدأ بحدث أو API، ثم انتقل إلى Mixin مع اختبار واضح ورسالة خطأ قابلة للتشخيص. لا تستخدمه لتغيير عشرات السلوكيات دفعة واحدة.
8. جهّز الإصدار للنشر
قبل رفع ملف JAR، اكتب README يوضح الإصدار، المتطلبات، ما الذي يضيفه المود، طريقة التثبيت، المشاكل المعروفة، والترخيص. غيّر رقم الإصدار عند تغيير السلوك، ولا ترفع ملفات build أو أسرارًا أو مفاتيح. جرّب ملف الإصدار خارج مجلد التطوير، لأن نجاح بيئة IDE لا يضمن أن حزمة النشر تحتوي الموارد المطلوبة.
خطة 30 يومًا للمبتدئ
| الفترة | الهدف | الناتج |
|---|---|---|
| الأيام 1–5 | أساسيات Java وOOP وGradle | برنامج صغير وقراءة ملف مشروع |
| 6–10 | توليد مشروع Fabric وفهم الملفات | مود يعمل ويطبع رسالة اختبار |
| 11–18 | عنصر أو وصفة مع ترجمة ونموذج | ميزة قابلة للعب |
| 19–24 | اختبارات وتسجيل أخطاء وأداء | نسخة تجريبية مستقرة |
| 25–30 | README وترخيص وإصدار | ملف قابل للمشاركة |
لو التزمت بميزة واحدة في كل مرة، ستتعلم أسرع من جمع عشرات الأنظمة غير المكتملة. راجع دليل Fabric عند اختلاف الإصدار، واستخدم توثيق Microsoft إذا كنت تعمل على Bedrock؛ فالمساران متقاربان في التفكير لكنهما ليسا نفس نظام الملفات أو نفس API.
9. كيف تختار أول ميزة قابلة للإنجاز؟
اختر ميزة يمكن وصف مدخلاتها ومخرجاتها في جملة. “عند استخدام هذا العنصر على بلوك معين يحدث كذا” أفضل من “أضيف نظام سحر”. قسّم الفكرة الكبيرة إلى vertical slice: عنصر واحد، وصفة واحدة، تفاعل واحد، ورسالة خطأ مفهومة. عندما يعمل هذا المسار كاملًا، يصبح لديك أساس تضيف عليه بدل مجموعة classes لا يمكن اختبارها.
أسئلة التصميم التي تسبق الكود
- هل الميزة للعميل أم للخادم أم لكليهما؟
- ما الذي يحدث إذا لم توجد المادة أو لم يكن اللاعب في الحالة الصحيحة؟
- هل يمكن للاعب التراجع أو إزالة المود دون فقدان العالم؟
- ما الملفات التي يحتاجها اللاعب إلى جانب JAR؟
- كيف ستعرف أن الإصدار الجديد لم يكسر الميزة القديمة؟
10. جدول اختبار قابل للتكرار
اكتب test matrix بدل الاعتماد على الذاكرة. سجّل نسخة اللعبة، Loader، Fabric API، Java، نظام التشغيل، ونتيجة كل سيناريو. عندما تصدر نسخة جديدة، أعد السيناريوهات نفسها وقارن النتائج. بهذه الطريقة تتحول عبارة “يبدو شغالًا” إلى دليل يمكن لفريقك مراجعته.
| السيناريو | النتيجة المتوقعة | هل يحتاج عالمًا جديدًا؟ |
|---|---|---|
| تشغيل عميل نظيف | القائمة تفتح بلا crash | لا |
| إنشاء عالم جديد | الميزة متاحة | نعم |
| إعادة فتح العالم | البيانات محفوظة | لا |
| وجود مود آخر | لا تعارض معروف | حسب المود |
| إزالة النسخة التجريبية | تحذير موثق ولا تلف متعمد | نسخة احتياطية |
لا تعد المستخدم بتوافق مع كل مود أو كل إصدار. اكتب ما اختبرته فقط، ووجّه اللاعب إلى فتح issue يتضمن log منقحًا وخطوات إعادة المشكلة. هذه الصراحة تبني ثقة أطول من عبارة تسويقية مبالغ فيها.
مراجع موثوقة
راجِع هذه الصفحات الرسمية عند اختلاف الإصدار أو تغيّر أسماء الملفات؛ توثيق اللعبة والمنصة يتغير مع الزمن.