logo
ar
اللغة العربية

مكتبة العناوين لـ SKSE Plugins

المنشئ: meh321
تم التحديث:24/02/2020 19:31:54
2.8MB
mcafee
المصادقة
موثوق من قبل 200,000,000+ مستخدمًا

حول هذا التعديل

يحتوي على ملف رأس وقاعدة بيانات لجعل نسخة SKSE DLL الإضافية مستقلة بسهولة.
مهم!تم تقسيم هذا الإصدار الآن إلى إصدارين: إصدار خاص (1.5.x) وإصدار الذكرى السنوية (1.6.x). لن تتطابق المعرفات التي تشير إلى العناوين بين الإصدارين (ملف اللعبة التنفيذي مختلف جدًا بحيث يصعب مطابقته، وحتى لو تطابق، فإن الكود داخل هذه الوظائف سيكون مختلفًا على أي حال).

وصف

لمستخدمي التعديل العاديين:نزّل وثبّت حزمة "الكل في واحد" من قسم الملفات. يمكنك استخدام مدير التعديلات أو القيام بذلك يدويًا. ستجد ملفات .bin هنا:
البيانات/SKSE/المكونات الإضافية/
ليس هناك حاجة لقراءة بقية أي من هذا.

لمؤلفي مكونات SKSE DLL الإضافية:
هذا مورد تعديل (ملف رأس). يمكنك تحميل قاعدة بيانات تخزن الإزاحات، مما يجعل ملحق DLL الخاص بك مستقلاً عن الإصدارات دون الحاجة إلى إعادة تجميعه. يمكن تنزيل ملف الرأس من القسم الاختياري في الملفات. بالنسبة لإصدار الذكرى السنوية، يُسمى ملف الرأس versionlibdb.h بدلاً من versiondb.h! إذا كنت تستخدم CommonLib، فكل هذا مُدمج بالفعل، ولن تحتاج إلى أي شيء من هنا.


كيفية الاستخدام

الطريقة الأسرع:
كابح:
يعرض


#تضمين "versiondb.h"

void * عنواني = NULL؛
غير موقّع طويل طويل MyOffset = 0؛

bool InitializeOffsets()
{
// قم بتخصيصها على المكدس حتى يتم تفريغها عند الخروج من هذه الوظيفة.
// ليست هناك حاجة لتحميل قاعدة البيانات بأكملها واستخدام الذاكرة بدون سبب.
قاعدة بيانات الإصدار؛

// تحميل قاعدة البيانات بإصدار الملف القابل للتنفيذ الحالي.
إذا لم يتم تحميل db.
{
_FATALERROR("فشل تحميل قاعدة بيانات الإصدار للملف القابل للتنفيذ الحالي!");
العودة خطأ؛
}
آخر
{
// "SkyrimSE.exe"، "1.5.97.0"
_MESSAGE("تم تحميل قاعدة البيانات لإصدار %s %s."، db.GetModuleName().c_str()، db.GetLoadedVersionString().c_str());
}

// يتضمن هذا العنوان بالفعل عنوان القاعدة للوحدة، لذا يمكننا استخدام العنوان مباشرةً.
عنواني = db.FindAddressById(123)؛
إذا (عنواني == NULL)
{
_FATALERROR("فشل في العثور على العنوان!");
العودة خطأ؛
}

// هذا الإزاحة لا يتضمن عنوان القاعدة. العنوان الفعلي هو ModuleBase + MyOffset.
إذا لم يكن (db.FindOffsetById(123، MyOffset))
{
_FATALERROR("فشل في العثور على الإزاحة لشيء ما!");
العودة خطأ؛
}

//كل شيء كان ناجحا.
العودة صحيح؛
}



الآن تتساءل ما هي قيمة "123" هنا؟ هذا هو مُعرِّف عنوان. تحتوي قواعد البيانات المختلفة على مُعرِّف العنوان نفسه، ولكنه قد يُشير إلى قيم مختلفة. للحصول على قائمة بجميع أزواج المُعرِّفات والقيم لإصدار مُحدد، اتبع ما يلي:

كابح:
يعرض


#تضمين "versiondb.h"

bool DumpSpecificVersion()
{
قاعدة بيانات الإصدار؛

// حاول تحميل قاعدة بيانات الإصدار 1.5.62.0 بغض النظر عن إصدار الملف القابل للتنفيذ قيد التشغيل.
إذا لم يتم تحميل db.Load(1, 5, 62, 0))
{
_FATALERROR("فشل تحميل قاعدة البيانات لإصدار 1.5.62.0!");
العودة خطأ؛
}

// اكتب ملفًا يسمى offsets-1.5.62.0.txt حيث يكون كل سطر هو المعرف والإزاحة.
db.Dump("offsets-1.5.62.0.txt");
_MESSAGE("تم إلغاء الإزاحات لـ 1.5.62.0");
العودة صحيح؛
}



بدلاً من 1، 5، 62، 0، ضع الإصدار الذي ترغب في عكسه والذي تعرفه. يجب أن يكون لديك ملف قاعدة البيانات المقابل في مجلد /Data/SKSE/Plugins أولاً.

بعد استدعاء هذا الأمر، سيظهر ملف جديد في مجلد Skyrim الرئيسي باسم "offsets-1.5.62.0.txt" أو أي اسم تختاره. سيكون بالتنسيق الذي يكون فيه كل سطر:
معرف عشريإزاحة سداسية

على سبيل المثال، إذا كان لديك عنوان 142F4DEF8 (مؤشر ثابت لشخصية اللاعب) في 1.5.62.0 وتريد جعله مستقلاً عن الإصدار، فستفعل ما يلي:
١. ابحث عن 2F4DEF8 في ملف الإزاحات. لأن هذا هو الإزاحة بدون القاعدة ١٤٠٠٠٠٠٠.
2. تأكد من أن المعرف هو 517014 (عشري!)
3. إذا كنت تريد هذا العنوان في ملف DLL الخاص بك أثناء وقت التشغيل، فقم بما يلي:


void* addressOf142F4DEF8 = db.FindAddressById(517014);


وهناك لديك ذلك.

يحتوي هيكل VersionDb على الوظائف التالية:
كابح:
يعرض


bool Dump(const std::string& path); // تفريغ قاعدة البيانات المحملة حاليًا إلى ملف
bool Load(int major, int minor, int revision, int build); // قم بتحميل إصدار محدد إذا كان ملف db-major-minor-revision-build.bin موجودًا في دليل Data/SKSE/Plugins
bool Load(); // تحميل الإصدار للتطبيق الحالي
void Clear(); // مسح قاعدة البيانات المحملة حاليًا
void GetLoadedVersion(int& major, int& minor, int& revision, int& build) const; // الحصول على إصدار ملف قاعدة البيانات الذي قمنا بتحميله الآن
bool GetExecutableVersion(int& major, int& minor, int& revision, int& build) const; // الحصول على إصدار التطبيق الذي يتم تنفيذه حاليًا
const std::string& GetModuleName() const; // الحصول على اسم وحدة قاعدة البيانات المحملة حاليًا، يجب أن يُظهر هذا "SkyrimSE.exe"
const std::string& GetLoadedVersionString() const; // احصل على الإصدار المحمّل حاليًا كسلسلة، على سبيل المثال "1.5.62.0"
ثابت std::خريطة& GetOffsetMap() const; // احصل على خريطة المعرف للإزاحة إذا كنت بحاجة إلى تكرارها يدويًا
void* FindAddressById(unsigned long long id) const; // ابحث عن العنوان باستخدام المعرف، سيتضمن هذا العنوان الأساسي وسيكون العنوان الصحيح. إذا لم يتم العثور عليه، فسيتم إرجاع القيمة NULL.
bool FindOffsetById(unsigned long long id, unsigned long long& result) const; // ابحث عن الإزاحة حسب المعرف، سيتم فقط إزاحة هذا بدون تضمين القاعدة.
bool FindIdByAddress(void* ptr, unsigned long long& result) const; // البحث عن معرف حسب العنوان، سيحاول هذا إجراء بحث عكسي لتحويل العنوان إلى معرف
bool FindIdByOffset(unsigned long long offset, unsigned long long& result) const; // ابحث عن معرف حسب الإزاحة، سيحاول هذا إجراء بحث عكسي لتحويل الإزاحة إلى معرف



أشياء يجب أن تعرفها وتضعها في الاعتبار:

يمكنك تضمين أيٍّ من ملفات قاعدة البيانات (أو جميعها) مع الإضافة، ولكن قد يزيد ذلك حجم الملف بشكل ملحوظ (حوالي ٢.٥ ميجابايت). حتى الآن، كان من الشائع تصنيف هذا التعديل كاعتمادية.

٢. يجب عليك دائمًا تحميل قاعدة البيانات مرة واحدة فقط عند بدء التشغيل، وتهيئة/تخزين العناوين التي تحتاجها، ثم تركها تُفرّغ. يعني إلغاء التحميل حذف بنية VersionDb أو فقدها (إذا خصصتها على المكدس). سيضمن هذا عدم استخدام مساحة ذاكرة غير ضرورية أثناء تشغيل اللعبة. لا داعي لإبقاء قاعدة البيانات مُحمّلة أثناء اللعب. هذه نقطة خلافية إذا كنت تستخدم CommonLib، حيث إنها تُحمّلها مرة واحدة فقط بدلًا من تحميلها لكل ملف DLL.

٣. تحتوي قاعدة البيانات على عناوين الدوال، والمتغيرات العامة، وRTTI، وجداول vtables، وأي شيء آخر قد يشير إليها. لا تحتوي على عناوين تقع في منتصف الدوال أو في منتصف المتغيرات العامة. إذا كنت بحاجة إلى عنوان في منتصف الدالة، فينبغي عليك البحث عن عنوان الدالة الأساسي وإضافة الإزاحة الإضافية بنفسك. كما أنها لا تحتوي على عناصر غير مفيدة مثل المحاذاة حول الدوال (المشار إليها في rdata)، حيث يتم تجاهل قسم pdata، ويتم تجاهل بعض معلومات SEH التي يولدها المترجم من rdata.

٤. يجب عليك دائمًا التحقق من النتيجة للتأكد من تحميل قاعدة البيانات بنجاح (أعادت قيمة bool Load القيمة true) وأن العناوين التي تم الاستعلام عنها أعادت نتيجة صحيحة (وليس NULL). إذا فشل التحميل، فهذا يعني على الأرجح أن الملف مفقود أو إصدار خاطئ (مثل محاولة استخدام رأس SE في AE). إذا فشل الاستعلام، فهذا يعني أنه لم يتم العثور على العنوان في هذا الإصدار. قد يعني هذا إما أن رمز اللعبة قد تغير بشكل كافٍ بحيث لم يعد العنوان صالحًا لهذا الإصدار، أو أن قاعدة البيانات نفسها لم تتمكن من اكتشاف العنوان الصحيح. في حال حدوث أي من هاتين الحالتين، يجب عليك إيقاف تهيئة المكون الإضافي لإعلام SKSE بعدم التحميل بشكل صحيح، أو إظهار رسالة خطأ يدويًا.

٥. يُفضّل أيضًا التأكد من وجود العنوان في جميع إصدارات اللعبة قبل نشر ملحق DLL. للقيام بذلك، حمّل كل إصدار من ملف قاعدة البيانات واستعلم عن مُعرّف العنوان نفسه في كل إصدار للتأكد من وجوده:
كابح:
يعرض


bool LoadAll(std::vector& الجميع)
{
إصدارات int ثابتة[] = { 3، 16، 23، 39، 50، 53، 62، 73، 80، 97، -1 }؛
لـ (int i = 0؛ الإصدارات[i] >= 0؛ i++)
{
VersionDb * db = new VersionDb();
إذا لم يكن (db->Load(1, 5, versions[i], 0))
{
حذف قاعدة البيانات؛
العودة خطأ؛
}
الكل.push_back(قاعدة البيانات)؛
}
العودة صحيح؛
}

bool موجود في الكل(std::vector& الكل، غير موقّع طويل طويل معرف)
{
نتيجة طويلة غير موقعة = 0؛
لـ (قاعدة البيانات التلقائية: الكل)
{
إذا (! db->FindOffsetById(المعرف، النتيجة))
العودة خطأ؛
}
العودة صحيح؛
}

void FreeAll(std::vector& الجميع)
{
لـ (قاعدة البيانات التلقائية: الكل)
حذف قاعدة البيانات؛
الكل واضح();
}

bool IsOk()
{
std::vectorالجميع؛
إذا لم يتم تحميل الكل
{
_FATALERROR("فشل في تحميل قاعدة بيانات إصدار واحدة أو أكثر للملف القابل للتنفيذ الحالي!");
مجانيالكل(الكل)؛
العودة خطأ؛
}

إذا (!ExistsInAll(الكل، 517014))
{
_FATALERROR("517014 غير موجود في جميع إصدارات قاعدة البيانات!");
مجانيالكل(الكل)؛
العودة خطأ؛
}

مجانيالكل(الكل)؛
// نعم!
العودة صحيح؛
}



بهذه الطريقة يمكنك التأكد من أن تعديل DLL الخاص بك سيعمل في جميع الإصدارات، أو إذا لم يعمل في بعض الإصدارات فيمكنك كتابة ذلك على صفحة التعديل الخاصة بك.

٦. أحيانًا ستحتاج إلى تغيير إصدار اللعبة بناءً على إصدارها. يمكنك القيام بذلك باستخدام هذا الكود:
كابح:
يعرض


int major = 0, minor = 0, revision = 0, build = 0؛
إذا لم يكن (db.GetExecutableVersion(رئيسي، ثانوي، مراجعة، بناء))
{
_FATALERROR("حدث خطأ ما!");
العودة خطأ؛
}

// تشغيل اللعبة هو 1.5.x وإصدار 1.5.39.0 على الأقل
إذا (الرئيسي == 1 و الثانوي == 5 و المراجعة >= 39)
{
// أشياء ... ؟
}



٧. يُرجى مراعاة ما يلي: إذا جُمعت مكتبة SKSE DLL في وضع التصحيح، فقد يستغرق تحميل قاعدة البيانات حوالي ١٤ ثانية! في وضع الإصدار، يستغرق حوالي ٠.٢ ثانية. ويرجع ذلك إلى بطء حاويات المكتبات القياسية في هذا الوضع (الخريطة القياسية).


الأذونات

افعل ما تريد.

أفضل التعديلات لـ Multiverse Loot Hunter

استكشف أفضل التعديلات لـ Multiverse Loot Hunter التي تقدم ميزات جديدة، رسومات محسّنة، وطرق مثيرة لتحويل تجربة لعبك.

افتح الإمكانات الكاملة لـ Multiverse Loot Hunter مع Xmod — استكشف أفضل هذه التعديلات اليوم!

mcafee
المصادقة
موثوق من قبل 200,000,000+ مستخدمًا

هل تحتاج مساعدة في التحميل أو التثبيت؟ انضم إلى مجتمع ديسكورد للحصول على الدعم.

logo
اللغة

حلول الألعاب

الموارد

الشركاء

تابعنا على

discordfacebooktwitteryoutube
dc@xmodhub.com or cathy@business.xmodhub.com
Discord: catherine_79237
الشروط والأحكام
سياسة الخصوصية
الدعم

Larvas Limited

Room 1201, 12/F Tai Sang Bank Building 130-132 Des Voeux Road Central HK