نظام الزعماء العالم ماتين2 (System World Boss Daily) يخلي سيرفرك يطلّع زعيمًا عالميًا كل يوم في الأوقات اللي تحددها أنت، ويعلن للاعبين لما يظهر ولما ينقتل، وفيه أمر يعرف منه اللاعب هل الزعيم حي أو متى يظهر مرة ثانية. فحصنا ملفات النظام ملفًا ملفًا، وفي هذا الموضوع نشرح لك وش يسوي بالضبط، وش فيه، كيف تركّبه خطوة بخطوة، وأشياء لازم تنتبه لها قبل ما ترفعه على سيرفرك، مع رابط التحميل ورابط الفحص على VirusTotal.

وش هو نظام الزعماء العالم في ماتين2؟
زعيم العالم (World Boss) حدث يجمع اللاعبين: زعيم قوي يظهر في خريطة معيّنة بمواعيد ثابتة، وكل السيرفر يعرف إنه ظهر ويتجمعون عليه. الشغلة اللي تميّز هذا النظام إنه يشتغل بالجدولة: تكتب في ملف نصي موقع الزعيم ورقمه (vnum) وساعات ظهوره في اليوم، والسيرفر يتكفل بالباقي، من الظهور إلى الإعلان إلى حساب الموعد اللي بعده.
مميزات نظام الزعماء العالم ماتين2
- ظهور تلقائي يومي: تحدد الساعات من 0 إلى 23، والنظام يحسب موعد الظهور القادم لوحده حسب وقت جهاز السيرفر.
- أكثر من زعيم وأكثر من خريطة: كل خريطة لها ملف
worldboss.txt، وكل سطر فيه يمثل زعيمًا مستقلًا بأوقاته الخاصة. - إعلان للجميع: رسالة تظهر لكل اللاعبين لما يظهر الزعيم ولما ينقتل، وتنتقل بين الكورز عن طريق حزمة P2P.
- أمر
/worldboss: متاح لكل اللاعبين حتى لو كان اللاعب ميت، ويعرض حالة الزعيم: حي الآن، أو بعد كم ساعة ودقيقة يظهر. - لافتة إشعار في الكلاينت: تنزلق من الجانب وتبقى 5 ثواني، وتدعم 5 إشعارات متتالية بدون ما تغطي بعضها.
- كويست إعلان عند القتل: ملف
bossi.luaجاهز تعدله على زعمائك. - تفعيل وتعطيل بسطر واحد: كل الكود محاط بتعريف
__WORLD_BOSS_YUMA__في ملف service.h.
كيف يشتغل النظام من الداخل؟
- عند تحميل الخرائط يبحث السيرفر عن
worldboss.txtداخل مجلد كل خريطة (بجانب dungeon.txt) ويقرأه. - كل سطر يتحول إلى زعيم داخل
CWorldBossManagerمع موعد ظهور قادم محسوب. - كل ثانية تشتغل دالة
Idleمن حلقة السيرفر الرئيسية: لو الزعيم غير موجود ووصل وقته يظهر ويُعلن عنه، وفي نفس اللحظة يُحسب الموعد اللي بعده. - لما يموت الزعيم يتعرف عليه الكود في
char_battle.cppويرسل إعلان الهزيمة. - لما يكتب اللاعب
/worldbossيرسل السيرفر أمرSendWorldbossNotificationللكلاينت، فيستقبلهgame.pyوتعرضه واجهةinterfacemodule.pyكلافتة.
محتويات ملفات النظام بعد الفحص
الأرشيف فيه 27 ملفًا موزعة على أربعة مجلدات:
- sursa server (مصدر السيرفر): ملفان جديدان
worldboss.cppوworldboss.h، وتعديلات في packet.h وpacket_info.cpp وinput.h وinput_p2p.cpp وcmd.h وcmd.cpp وcmd_gm.cpp وcmd_general.cpp وchar_battle.cpp وmain.cpp وsectree_manager.cpp وregen.cpp وmakefile، مع سطر التفعيل الخاص بـ service.h. - sursa bin (مصدر الكلاينت):
locale_inc.hوpythonapplicationmodule.cppلتفعيل الماكروWORLD_BOSS_YUMAوتمريره لبايثون. - root (واجهة اللاعب): constinfo.py وgame.py وinterfacemodule.py، وملفان جديدان
uiworldbosstext.pyوuiSCRIPT/worldbosswindow.py، وثلاث صور داخلymir work/ui/game/worldboss/: main بحجم 455×197 وshaman_w بحجم 148×93 وmonster بحجم 91×107 (الأخيرة غير مستخدمة في السكربتات). - quest serverside: الكويست
bossi.lua.

متطلبات التركيب
- سورس السيرفر (C++) بحيث تقدر تعدّله وتعيد بناءه.
- مكتبة Boost، لأن
worldboss.cppيستخدمboost/algorithm/string.hpp، ومترجم يدعم C++11. - سورس الكلاينت (UserInterface) لإعادة بناء الـ exe، لأن النظام يضيف ثابتًا جديدًا اسمه
app.WORLD_BOSS_YUMA. - رقم (vnum) الزعيم من mob_proto. النظام ما يضيف جداول ولا يحتاج SQL.
- نسخة احتياطية كاملة قبل أي تعديل. وإذا ما عندك سيرفر شغال أصلًا ابدأ من .
طريقة تركيب نظام الزعماء العالم ماتين2
أولًا: جهة السيرفر
- في
common/service.hأضف سطر التفعيل:#define __WORLD_BOSS_YUMA__ - انسخ
worldboss.cppوworldboss.hإلى مجلدgame/وأضفworldboss.cppإلى قائمة الملفات فيgame/makefile. - في
packet.hأضفHEADER_GG_NEW_NOTICE = 34تحتHEADER_GG_CHECK_AWAKENESS(تأكد أن الرقم 34 غير مستخدم في سورسك)، وأضف بنيةTPacketGGNewNoticeبعدTPacketGGNotice. - في
packet_info.cppأضف سطرSet(HEADER_GG_NEW_NOTICE, ...)تحت CheckAwakeness. - في
input.hوinput_p2p.cppأضف الدالةNewNotice. انتبه: الحزمة ما تتضمن ربط الهيدر الجديد داخل دالةAnalyzeفي input_p2p.cpp، فأضفه بنفس طريقةHEADER_GG_NOTICEالموجودة في سورسك، على الشكل التالي:case HEADER_GG_NEW_NOTICE: if ((iExtraLen = NewNotice(d, c_pData, m_iBufferLeft)) < 0) return -1; break; - في
cmd.hوcmd_gm.cppأضف تعريفات ودوال الإشعارSendNewNoticeوBroadcastNewNotice. - في
cmd_general.cppأضفdo_boss_debug، وفيcmd.cppسجّل الأمرworldboss. - في
char_battle.cppأضف كشف موت الزعيم بعدCloseSafebox()في دالة الموت. - في
main.cppأضف: تعريفCWorldBossManager WorldBoss_manager;، ثمInitialize()بعدOXEvent_manager.Initialize()، ثمIdle(thecore_heart->pulse)بعد تحديثCHARACTER_MANAGER، ثمDestroy()عند الإغلاق. - في
sectree_manager.cppأضف تحميلworldboss.txtمباشرة بعد تحميلdungeon.txt. وفيregen.cppأضف#include "worldboss.h". - انسخ
bossi.luaإلى مجلد الكويستات وأعد ترجمته. - أعد بناء الـ game core (وكل الكورز) وجرّب.
ثانيًا: جهة الكلاينت
- في
locale_inc.hأضف:#define WORLD_BOSS_YUMA - في
pythonapplicationmodule.cppأضف كتلةPyModule_AddIntConstant(poModule, "WORLD_BOSS_YUMA", ...)الموجودة في الحزمة، ثم أعد بناء الـ exe. - في ملفات
root: عدّلconstinfo.py(مصفوفةWORLD_BOSS_TEXT_POSITION = [0, 0, 0, 0, 0])، وgame.py(تسجيل الأمرSendWorldbossNotificationمع دالته)، وinterfacemodule.py(الاستيراد والتهيئة والتدمير ودالةWorldbossNotification). - أضف
uiworldbosstext.pyوuiSCRIPT/worldbosswindow.py، وضع الصور فيymir work/ui/game/worldboss/، ثم احزم الملفات. - الحزمة ما تعرّف الثابت
WORLDBOSS_GUARD_NAMEالذي تستخدمه اللافتة، فأضفه فيlocaleInfo.py:WORLDBOSS_GUARD_NAME = "حارس العالم"
إعداد ملف worldboss.txt
يوضع الملف داخل مجلد الخريطة، وكل سطر يمثل زعيمًا، والفواصل بين الحقول مسافة Tab وليست مسافات عادية. الصيغة: الحرف b، ثم x، ثم y، ثم z، ثم رقم الزعيم، ثم الساعات. الإحداثيات نسبية لبداية الخريطة مثل ملف regen. وكل ساعة تكتبها يجب أن يلحقها حرف t. مثال توضيحي (غيّر الأرقام على خريطتك وزعيمك):
b 350 420 0 6091 14t21t
هذا السطر يعني: زعيم برقم 6091 يظهر عند الإحداثيات (350، 420) في الساعة 2 ظهرًا و9 مساءً كل يوم. الأوقات حسب وقت جهاز السيرفر، والملف يُقرأ عند تحميل الخريطة، فأعد تشغيل الكور بعد أي تعديل.
تخصيص النصوص والترجمة
- إعلانات الظهور والهزيمة: مكتوبة في
worldboss.cppبالإنجليزية وبها اسم «Queen Nethis» ثابت لأي زعيم. غيّرها لنص عام أو لاسم زعيمك. - ملف الترجمة: النصوص تمر عبر
LC_TEXT، فأضف ترجماتها فيlocale_string.txt، وإلا يظهر النص الأصلي كما هو. وانتبه أن أمر/worldbossيمرر الاسم ثم الساعات ثم الدقائق (أرقام عشرية تُكتب%.0f) ثم كلمة الوحدة، وهذه الكلمة ألمانية (Stunden/Minuten) في أمر/worldbossوإنجليزية (hours/minutes) في إعلانات ما قبل الظهور، فغيّرها أو لا تضع%sالأخيرة. - كويست bossi.lua: رسائله بالرومانية وتعني «تم قتله! سيظهر بعد ساعة»، وفيه ثلاثة أرقام زعماء (6192 و2403 و6091). عدّل الأرقام والنصوص، وانتبه أن عبارة «بعد ساعة» ثابتة بينما موعد الظهور الفعلي يتبع جدولك.
أشياء لازم تنتبه لها قبل الرفع
- الفاصل بين المواعيد: الموعد التالي يُحسب لحظة ظهور الزعيم. لو عاش أطول من الفاصل بين موعدين، أول ما ينقتل يظهر مباشرة مرة ثانية. خلّ الفاصل أطول من المدة اللي يحتاجها اللاعبون لقتله.
- نسخة واحدة فقط: ما يظهر زعيم جديد لنفس السطر طالما القديم حي.
- التنبيهات المسبقة معطلة: الكود يجهز قائمة (5 دقائق، 10، 20، 30، ساعة، ساعتين، 3 ساعات) لكن سطر الإرسال داخل
Idleمعلّق. فعّله بعد ما تجهز نصه إذا تبي تنبيهًا قبل الظهور. - بايثون:
uiworldbosstext.pyيستخدمtime.clock()، وهي تعمل على بايثون 2.7 (الكلاينت الكلاسيكي). لو كلاينتك على بايثون 3 استبدلها بـtime.perf_counter(). - دالة غير موجودة: الملف يستدعي
constInfo.getLogTextعند حدوث خطأ وهي غير موجودة في الحزمة. استبدلها بـstr(e)أو عرّفها. - الصور: ملفا main وmonster امتدادهما tga لكنهما بصيغة PNG من الداخل بحسب ترويستيهما. لو ظهرتا سوداوين في اللعبة حوّلهما إلى TGA حقيقي.
وإذا طلع لك خطأ أثناء البناء أو التشغيل راجع لتعرف سببه بسرعة.
تحميل نظام الزعماء العالم ماتين2
جرّب النظام على سيرفر تجريبي قبل ما تضيفه لسيرفرك الأساسي، وخذ نسخة احتياطية من السورس والكلاينت.
أسئلة شائعة عن النظام
كم زعيم أقدر أضيف؟
أي عدد. كل سطر في worldboss.txt زعيم مستقل، وكل خريطة تقدر يكون لها ملفها.
كيف أغيّر أوقات الظهور؟
عدّل الساعات في آخر السطر (مثل 14t21t) ثم أعد تشغيل الكور اللي يحمّل الخريطة.
هل النظام يحتاج تعديل في قاعدة البيانات أو البروتو؟
لا. ما فيه ملفات SQL ولا جداول جديدة. تحتاج فقط رقم زعيم موجود أصلًا في mob_proto.
كيف أخلي أمر /worldboss للمشرفين فقط؟
في cmd.cpp الأمر مسجّل بصلاحية GM_PLAYER أي لكل اللاعبين. غيّرها لرتبة أعلى.
هل في النظام ترتيب للضرر وزر انتقال؟
لا، حسب فحصنا للحزمة. الموجود لافتة إشعار فقط، ونقدر نبرمج لك النافذة الكاملة عبر .
هل ملفات النظام آمنة؟
ملفات المصدر نصية (cpp وpy وlua) مع ثلاث صور، وفيه رابط فحص على VirusTotal أعلاه. ومع ذلك جرّبه دائمًا على نسخة تجريبية.
مواضيع تهمك
- و
تبي أحد يركّب لك النظام أو يطوّره على مقاسك؟ فريق AZO ONE يسوي لك ذلك ضمن على ديسكورد، وعندنا لو تبي تبدأ من الصفر.