• المنتجات
  • الميزات
  • Mod Master
  • تحميل
  • ألعاب
  • مدونة
  • التسعير

مكتبة العناوين لمكونات SKSE الإضافية

المؤلف:meh321آخر تحديث:14/02/2024 09:19:5421.1M2.3MB

The Elder Scrolls V: Skyrim Special Edition مكتبة العناوين لمكونات SKSE الإضافية-1-لاغو فاست مودماستر

مقدمة التعديل

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

وصف

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

لمؤلفي المكون الإضافي skse dll:
هذا مورد تعديل (ملف رأس). يمكنك تحميل قاعدة بيانات تخزن التعويضات بحيث يمكن أن يكون المكون الإضافي لـ dll الخاص بك مستقلاً عن الإصدار دون الحاجة إلى إعادة ترجمة. يمكن تنزيل ملف الرأس من القسم الاختياري من الملفات. بالنسبة لإصدار الذكرى السنوية يسمى ملف الرأس versionlibdb.h بدلاً من versiondb.h! إذا كنت تستخدم commonlib فكل هذا مدمج بالفعل ولا تحتاج إلى أي شيء من هنا.


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

أسرع طريقة:
المفسد:  
عرض


# تشمل "versionb.h"

باطل * MyAddress = فارغ;
غير موقعة طويلة طويلة myoffset = 0؛

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

//قم بتحميل قاعدة البيانات بالإصدار القابل للتنفيذ الحالي.
إذا (! db.Load ())
{
_FATALERROR ("فشل في تحميل قاعدة بيانات الإصدار للملف التنفيذي الحالي!");

}
غير ذلك
{
//"SkyrimSE.exe", "1.5.97.0"
_MESSAGE("قاعدة بيانات محملة ل %s الإصدار %s. ", db.GetModuleName (). c_str (), db.GetLoadedVersionString (). c_str ());
}

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

//هذا الإزاحة لا يتضمن العنوان الأساسي. سيكون العنوان الفعلي هو modulebase MyOffset.
إذا (! db.FindOffsetById(123، MyOffset))
{
_FATALERROR ("فشل في العثور على تعويض لشيئي!");

}

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



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

مفسد:  
عرض


# تشمل "versionb.h"

تفريغ المنطقي SpecificVersion ()
{
الإصدار db db؛

//حاول تحميل قاعدة بيانات الإصدار 1.5.62.0 بغض النظر عن تشغيل الإصدار القابل للتنفيذ.
if (! 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" أو أي شيء تضعه كاسم الملف. سيكون في الشكل حيث كل سطر هو:
المعرف العشري<tab>الإزاحة السداسية<newline>

على سبيل المثال إذا كان لديك عنوان 142f4def8 (مؤشر ثابت لحرف اللاعب) في 1.5.62.0 تريد جعل الإصدار مستقلاً فستفعل ذلك:
1. ابحث عن 2f4def8 في ملف الإزاحة. لأن هذا هو الإزاحة دون القاعدة 140000000
2. انظر أن المعرف هو 517014 (العشرية!)
3. إذا كنت تريد هذا العنوان في dll الخاص بك في وقت التشغيل القيام بذلك:


عنوان void*of 142 f 4 def 8 = db.FindAddressById(517014);


وها هو لديك.

يحتوي بنية versiondb على الوظائف التالية:
المفسد:  
عرض


تفريغ bool (const std::string //تفريغ قاعدة البيانات المحملة حاليًا إلى الملف
تحميل bool (int major، int minor، int revision، int build)؛ //قم بتحميل إصدار محدد إذا كان db-major-minor-revition-build.bin موجودًا في دليل data/SKSE/plugins
تحميل بول (); //قم بتحميل الإصدار للتطبيق الحالي
باطل واضح (); //مسح قاعدة البيانات المحملة حاليًا
void GetLoadedVersion (int & major, int & minor, int & revision, int & build) const; //احصل على إصدار ملف قاعدة البيانات الذي قمنا بتحميله الآن
bool GetExecutableVersion (int //احصل على إصدار التطبيق المنفذة حاليًا
const std::string & GetModuleName () const; //احصل على اسم وحدة قاعدة البيانات المحملة حاليًا، ويجب أن يظهر هذا "SkyrimSE.exe"
const std::string //احصل على الإصدار المحمل حاليًا كسلسلة، على سبيل المثال. "1.5.62.0"
const std:: خريطة<unsigned long long, unsigned long long>& GetOffsetMap () const; //احصل على خريطة المعرف لتعويضها إذا كنت بحاجة إلى تكرارها يدويًا
void * FindAddressById (معرف طويل غير موقع) const؛ //ابحث عن العنوان حسب المعرف، وسيتضمن هذا بالفعل العنوان الأساسي والصحيح. سوف تعود لاغية إذا لم يتم العثور عليها!
bool FindOffsetById (معرف طويل غير موقع، طويل غير موقع //ابحث عن الإزاحة حسب المعرف، سيتم إزاحة هذا فقط دون تضمين القاعدة.
تم العثور على bool byaddress(voil*ptr، غير موقعة طويلة طويلة //ابحث عن معرف حسب العنوان، سيحاول هذا البحث العكسي لتحويل العنوان إلى معرف
Bool findbyoffset (إزاحة طويلة غير موقعة، إزاحة طويلة غير موقعة //ابحث عن معرف حسب الإزاحة، سيحاول هذا البحث العكسي لتحويل الإزاحة إلى معرف



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

1. يمكنك تضمين أي (أو كل) من ملفات قاعدة البيانات مع المكون الإضافي الخاص بك ولكن قد يزيد حجم الملف بشكل كبير (بحوالي 2.5 ميغابايت). حتى الآن ، كان من الشائع وضع علامة على هذا التعديل باعتباره تبعية بدلاً من ذلك.

2. يجب عليك دائمًا تحميل قاعدة البيانات مرة واحدة فقط عند بدء التشغيل ، وتهيئة/تخزين العناوين المؤقتة التي تحتاجها والسماح لها بتفريغها. يعني التفريغ فقط أن بنية الإصدار يتم حذفها أو فقدانها (إذا تم تخصيصها على المكدس). سيتأكد هذا من عدم استخدام كمية غير ضرورية من الذاكرة أثناء وقت تشغيل اللعبة. ليست هناك حاجة للحفاظ على قاعدة البيانات محملة أثناء اللعب. هذه نقطة مثيرة للجدل إذا كنت تستخدم commonlib لأنه يقوم بتحميله مرة واحدة فقط بدلاً من كل dll.

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

4. يجب عليك دائمًا التحقق من النتيجة للتأكد من أن قاعدة البيانات التي تم تحميلها بنجاح (تم إرجاع تحميل bool صحيحًا) وأن العناوين التي تم استعلامها قد أعادت بالفعل نتيجة صالحة (وليس فارغة). إذا فشل في التحميل، فهذا يعني أن الملف كان مفقودًا على الأرجح أو الإصدار الخطأ (على سبيل المثال محاولة استخدام رأس se في ae). إذا فشل الاستعلام، فهذا يعني أنه لا يمكن العثور على العنوان في هذا الإصدار. قد يعني هذا إما أن رمز اللعبة قد تغير بما يكفي بحيث لم يعد العنوان صالحًا على الإطلاق لهذا الإصدار أو أن قاعدة البيانات نفسها فشلت في اكتشاف العنوان الصحيح. إذا حدث أي من هذه الأشياء، فيجب أن تفشل في تهيئة المكون الإضافي لإعلام skse أنك لم تحمل بشكل صحيح. أو إظهار رسالة خطأ يدويًا.

5. سيكون من الأفضل أيضًا إذا قمت بالتحقق من وجود العنوان في جميع إصدارات اللعبة قبل نشر المكون الإضافي dll الخاص بك. للقيام بذلك تحميل كل إصدار من ملف قاعدة البيانات والاستعلام عن نفس معرف العنوان في كل منها للتأكد من وجوده:
مفسد:  
عرض


bool LoadAll (std:: متجه<VersionDb*>& كلّ)
{
إصدارات int ثابتة [] = {3، 16، 23، 39، 50، 53، 62، 73، 80، 97، -1}؛
لـ (int i = 0 ؛ الإصدار [i] > = 0 ؛ i ++)
{
الإصدار * db = الإصدار الجديد ();
if (! db-> Load(1، 5، الإصدارات[i]، 0))
{
حذف ديسيبل ؛
إرجاع كاذب؛
}
all.push_back (ديسيبل);
}
العودة صحيحة؛
}

Bool existensinall (std:: vector<VersionDb*>& الكل ، معرف طويل غير موقع)
{
نتيجة طويلة غير موقعة = 0؛

{
if (! db-> FindOffsetById(id، نتيجة))

}
العودة صحيحة؛
}

void FreeAll(std::vector<VersionDb*>& كلّ)
{
لـ (ديسيبل التلقائي: الكل)
حذف ديسيبل ؛
all.clear ();
}

BooleIsOk ()
{
std::vector<VersionDb*>جميع؛
إذا (! LoadAll(all))
{
_FATALERROR ("فشل في تحميل قواعد بيانات واحدة أو أكثر من الإصدارات للملف التنفيذي الحالي!");
حرية الكل (كل)؛
إرجاع كاذب؛
}

إذا (! Existenall(all، 517014))
{
_FATALERROR ("517014 غير موجود في جميع إصدارات قاعدة البيانات!");


}

حرية الكل (الكل);
//حسنا!
العودة صحيحة؛
}



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

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


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

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



7. يرجى أن نضع في اعتبارك: إذا قمت بتجميع dll skse الخاص بك في وضع تصحيح الأخطاء يمكن أن يكون وقت تحميل قاعدة البيانات حوالي 14 ثانية! في وضع الإصدار، يبلغ هذا حوالي 0.2 ثانية. ويرجع ذلك إلى أن حاويات المكتبة القياسية بطيئة جدًا في هذا الوضع (خريطة std).


الأذونات

افعل ما تريد.
هذه الأداة مقدمة من طرف ثالث [bufftool]أيقونة التنبيه

تنزيل التعديلات الآن

قم بتثبيت LagoFast، ثم قم بتشغيل The Elder Scrolls V: Skyrim Special Edition والعب بالتعديلات التي تحبها.