• محصولات
  • ویژگی ها
  • Mod Master
  • دانلود
  • بازی‌ها
  • وبلاگ
  • قیمت گذاری

کتابخانه آدرس برای افزونه‌های SKSE

نویسنده:meh321آخرین به‌روزرسانی:2024-02-14 09:19:5421.1M2.3MB

The Elder Scrolls V: Skyrim Special Edition کتابخانه آدرس برای افزونه‌های SKSE-1-لاگوفست مدمستر

مقدمه وزارت دفاع

شامل فایل هدر و یک پایگاه داده است تا به راحتی بتوان افزونه‌های SKSE DLL را از نسخه مستقل کرد.
مهم است! این اکنون به 2 نسخه تقسیم می شود: نسخه ویژه (1.5.x) و نسخه سالگرد (1.6.x). شناسههایی که به آدرسها اشاره میکنند، بین آن 2 نسخه مطابقت نمیکنند (قابل اجرایی بازی برای مطابقت بسیار متفاوت است، و حتی اگر با کد در آن توابع مطابقت داشته باشند، به هر حال متفاوت است).

توضیحات

برای کاربران معمولی مود: بسته "همه در یک" را از بخش پرونده ها بارگیری و نصب کنید. می توانید از مدیر مود استفاده کنید یا آن را به صورت دستی انجام دهید. پرونده های. bin باید به اینجا بروند:
اطلاعات/SKSE/افزونه/
نیازی به خواندن بقیه اینها نیست.

برای نویسندگان افزونه skse dll:
این یک منبع مودر (یک فایل هدر) است. می توانید یک پایگاه داده بارگیری کنید که افست ها را ذخیره می کند تا افزونه dll شما بدون نیاز به کامپایل مجدد مستقل از نسخه باشد. فایل هدر را می توان از بخش اختیاری پرونده ها دانلود کرد. برای نسخه سالگرد، فایل هدر به جای versiondb.h versionlibdb.h نامیده می شود! اگر از commonlib استفاده می کنید، همه اینها در حال حاضر داخلی شده است و از اینجا به چیزی نیازی ندارید.


نحوه استفاده از آن

سریعترین راه:
اسپویلر:  
نمایش دادن


# شامل "versiondb.h" است

void*myadress = NULL;
Myoffset طولانی بدون امضا = 0;

bool InitializeOffsets ()
{
//روی پشته تخصیص دهید تا هنگام خروج از این عملکرد بارگیری شود.
//نیازی به بارگیری کل پایگاه داده و استفاده از حافظه بدون دلیلی نیست.
نسخه db db;

//بانک اطلاعاتی را با نسخه اجرایی فعلی بارگیری کنید.
if (! db.Load ())
{
_FATALERROR ("بارگیری بانک اطلاعاتی نسخه برای اجرایی فعلی شکست خورد!");

}
در غیر این صورت
{
//"SkyrimSE.exe", "1.5.97.0"
_MESSAGE("بانک اطلاعاتی بارگذاری شده برای %s نسخه %s. ", db.GetModuleName (). c_str (), db.GetLoadedVersionString (). c_str ());
}

//این آدرس قبلاً شامل آدرس پایه ماژول است تا بتوانیم مستقیماً از آدرس استفاده کنیم.
MyAddress=db.FindAddressById(123);
if (myadress == NULL)
{
_FATALERROR ("یافتن آدرس ناکام!");
کاذب را برگردانید؛
}

//این جبران شامل آدرس پایه نیست. آدرس واقعی modulebase MyOffset خواهد بود.
if(!db.FindOffsetById(123، MyOffset))
{
_FATALERROR ("نتوانست جبران چیز من را پیدا کند!")؛

}

//همه چیز موفق بود.
واقعی برگردانید؛
}



اکنون شما تعجب می کنید که آن مقدار "123" در آنجا چیست. این شناسه یک آدرس است. بانکهای اطلاعاتی نسخه های مختلف شناسه یکسانی برای یک آدرس خواهند داشت، اما ممکن است به مقادیر متفاوتی اشاره کند. برای دریافت لیستی از تمام جفت شناسه و مقدار برای یک نسخه خاص، این کار را انجام دهید:

اسپویلر:  
نمایش دادن


# شامل "versiondb.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*addressOf142F4DEF8 = db.FindAddressById(517014);


و شما آن را دارید

ساختار نسخه دارای عملکردهای زیر است:
اسپویلر:  
نمایش دادن


bool Dump (const std::string //بانک اطلاعاتی بارگذاری شده در حال حاضر را به پرونده ریختن
بار bool (int major، int minor، int review، int build)؛ //اگر db-major-minor-revition-build.bin در فهرست data/SKSE/plugins وجود داشته باشد ، نسخه خاصی را بارگیری کنید
بار bool (); //نسخه را برای برنامه فعلی بارگیری کنید
void Clear (); //پایگاه داده بارگذاری شده را پاک کنید
void GetLoadedVersion (int & major، int & minor، int & review، int & build) const; //نسخه پرونده پایگاه داده را که اکنون بارگذاری کرده ایم دریافت کنید
bool GetExecutableVersion(int & major، int & minor، int & revion، int & build) const; //نسخه برنامه در حال اجرا را دریافت کنید
const std::string & GetModuleName () const; //نام ماژول بانک اطلاعاتی بارگذاری شده را دریافت کنید، این باید "SkyrimSE.exe" را نشان دهد
const std::string & GetLoadedVersionString () const; //نسخه بارگذاری شده در حال حاضر را به عنوان رشته دریافت کنید، مثلاً. "1.5.62.0"
const std::map<unsigned long long, unsigned long long>& GetOffsetMap () const; //اگر نیاز به تکرار دستی دارید، نقشه شناسه را برای جبران دریافت کنید
void*FindAddressById (شناسه طولانی بدون امضا) const; //آدرس را بر اساس شناسه پیدا کنید، این در حال حاضر شامل آدرس پایه و صحیح خواهد بود. اگر پیدا نشود باهی برمی گردد!
bool FindOffsetById (شناسه طولانی بدون امضا، بدون امضا طولانی طولانی //جبران را بر اساس شناسه پیدا کنید، این فقط بدون شامل پایه جبران می شود.
Bool findbyaddress (void*ptr, بدون امضای طولانی //شناسه را بر اساس آدرس پیدا کنید، این امر تلاش می کند جستجوی معکوس را برای تبدیل آدرس به شناسه انجام دهد
Bool findbyoffset (جبران طولانی بدون امضا، جبران طولانی بدون امضا //شناسه را با افست پیدا کنید، این امر تلاش می کند تا جستجوی معکوس را برای تبدیل افست به شناسه انجام دهد



چیزهایی که باید بدانید و در نظر داشته باشید:

1. می توانید هر یک (یا همه) فایلهای پایگاه داده را با افزونه خود درج کنید، اما ممکن است اندازه فایل را به میزان قابل توجهی افزایش دهد (حدود 2.5 مگابایت). تاکنون علامت گذاری این مود به عنوان یک وابستگی رایج بوده است.

2 همیشه باید بانک اطلاعاتی را فقط یک بار در هنگام راه اندازی بارگیری کنید، آدرس های مورد نیاز خود را اولیه کنید/ذخیره کنید و اجازه دهید آن را تخلیه کنید. تخلیه فقط به این معنی است که ساختار versiondb حذف یا گم می شود (اگر روی پشته اختصاص داده شده اید). این مطمئن می شود که از حافظه غیرضروری در زمان اجرای بازی استفاده نمی کنید. نیازی به بارگذاری بانک اطلاعاتی در طول بازی نیست. اگر از 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; version[i] > = 0; i ++)
{
VersionDb * db = نسخه جدید ();
if (! db-> Load(1،5، نسخه های [i]، 0))
{
حذف db؛
کاذب را برگردانید؛
}
all.push_back (db);
}
واقعی برگردانید؛
}

Bool existensinall (std):: بردار<VersionDb*>& همه ، شناسه طولانی بدون امضا)
{
نتیجه طولانی بدون امضا = 0;

{
if (! db-> FindOffsetById(id، نتیجه))

}
واقعی برگردانید؛
}

void FreeAll (std:: بردار<VersionDb*>& همه)
{
برای (db خودکار: همه)
حذف db؛
all.clear ();
}

بولی IsOk ()
{
std:: بردار<VersionDb*>همه;
اگر (! LoadAll(all))
{
_FATALERROR ("بارگیری یک یا چند بانک اطلاعاتی نسخه برای اجرایی فعلی شکست خورد!");
آزاد همه (همه).
کاذب را برگردانید؛
}

if (! Existensinall(all، 517014))
{
_FATALERROR ("517014 در همه نسخه های پایگاه داده وجود ندارد!");


}

آزاد همه (همه).
//باشه!
واقعی برگردانید؛
}



به این ترتیب می توانید مطمئن شوید که mod dll شما در همه نسخه ها کار می کند، یا اگر در برخی نسخه ها کار نمی کند، می توانید آن را در صفحه mod خود بنویسید.

6. گاهی اوقات باید بر اساس اجرای نسخه بازی کاری متفاوت انجام دهید. می توانید این کار را با این قطعه کد انجام دهید:
اسپویلر:  
نمایش دادن


int major = 0، minor = 0، review = 0، build = 0;
if (! db.GetExecutableVersion(major، minor، review، build))
{
_FATALERROR ("چیزی اشتباه پیش رفت!");
کاذب را برگردانید؛
}

//بازی در حال اجرا 1.5.x و حداقل نسخه 1.5.39.0 است
اگر (اصلی = = 1 & & کوچک = = 5 & & تجدید نظر > = 39)
{
//چیزها...؟
}



7. لطفاً به خاطر داشته باشید: اگر skse dll خود را در حالت اشکال زدایی کامپایل کنید ، زمان بارگیری پایگاه داده می تواند حدود 14 ثانیه باشد! در حالت انتشار حدود 0.2 ثانیه است. این به این دلیل است که ظروف کتابخانه استاندارد در آن حالت بسیار کند هستند (نقشه std).


مجوزها

هر کاری که می خواهید انجام دهید.
این ابزار توسط یک شخص ثالث ارائه شده است [bufftool]نماد توجه

همین حالا مدها را دانلود کنید

LagoFast را نصب کنید، The Elder Scrolls V: Skyrim Special Edition را اجرا کنید و با مدهایی که دوست دارید بازی کنید.