

#รวม "versiondb.h"
void * MyAddress = NULL;
unsigned long long 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());
}
// ที่อยู่นี้รวมที่อยู่ฐานของโมดูลไว้แล้ว ดังนั้นเราจึงสามารถใช้ที่อยู่นี้โดยตรงได้
ที่อยู่ของฉัน = db.FindAddressById(123);
ถ้า (ที่อยู่ของฉัน == NULL)
{
_FATALERROR("ไม่สามารถค้นหาที่อยู่ได้!");
กลับเป็นเท็จ;
}
// ออฟเซ็ตนี้ไม่รวมที่อยู่ฐาน ที่อยู่จริงจะเป็น ModuleBase + MyOffset
หาก (!db.FindOffsetById(123, MyOffset))
{
_FATALERROR("ไม่สามารถค้นหาออฟเซ็ตสำหรับสิ่งของของฉันได้!");
กลับเป็นเท็จ;
}
// ทุกอย่างก็สำเร็จไปได้ด้วยดี
กลับเป็นจริง;
}
#รวม "versiondb.h"
บูลีน DumpSpecificVersion()
{
เวอร์ชันDb db;
// พยายามโหลดฐานข้อมูลเวอร์ชัน 1.5.62.0 โดยไม่คำนึงถึงเวอร์ชันที่รันอยู่
ถ้า (!db.Load(1, 5, 62, 0))
{
_FATALERROR("ไม่สามารถโหลดฐานข้อมูลสำหรับ 1.5.62.0 ได้!");
กลับเป็นเท็จ;
}
// เขียนไฟล์ชื่อ offsets-1.5.62.0.txt โดยที่แต่ละบรรทัดคือ ID และ offset
db.Dump("offsets-1.5.62.0.txt");
_MESSAGE("ดัมพ์ออฟเซ็ตสำหรับ 1.5.62.0");
กลับเป็นจริง;
}
void* addressOf142F4DEF8 = db.FindAddressById(517014);
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"
const std::map& GetOffsetMap() const; // รับแผนที่ของ ID ที่จะชดเชยหากคุณจำเป็นต้องทำซ้ำด้วยตนเอง
void* FindAddressById(unsigned long long id) const; // ค้นหาที่อยู่ตาม ID ซึ่งจะรวมฐานไว้แล้วและเป็นที่อยู่ที่ถูกต้อง หากไม่พบจะคืนค่า NULL!
bool FindOffsetById(unsigned long long id, unsigned long long& result) const; // ค้นหาออฟเซ็ตด้วย ID ซึ่งจะเป็นการออฟเซ็ตโดยไม่รวมฐาน
bool FindIdByAddress(void* ptr, unsigned long long& result) const; // ค้นหา ID ตามที่อยู่ ซึ่งจะพยายามค้นหาแบบย้อนกลับเพื่อแปลงที่อยู่เป็น ID
bool FindIdByOffset(unsigned long long offset, unsigned long long& result) const; // ค้นหา ID ตามออฟเซ็ต ซึ่งจะพยายามค้นหาแบบย้อนกลับเพื่อแปลงออฟเซ็ตเป็น ID
บูลีน LoadAll(std::vector& ทั้งหมด)
{
เวอร์ชันคงที่ int[] = { 3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1 };
สำหรับ (int i = 0; versions[i] >= 0; i++)
{
VersionDb * db = new VersionDb();
ถ้า (!db->Load(1, 5, versions[i], 0))
{
ลบฐานข้อมูล;
กลับเป็นเท็จ;
}
all.push_back(db);
}
กลับเป็นจริง;
}
bool ExistsInAll(std::vector& ทั้งหมด, unsigned long long id)
{
ผลลัพธ์ unsigned long long = 0;
สำหรับ (ฐานข้อมูลอัตโนมัติ: ทั้งหมด)
{
ถ้า (!db->FindOffsetById(id, ผลลัพธ์))
กลับเป็นเท็จ;
}
กลับเป็นจริง;
}
ว่างเปล่า FreeAll(std::vector& ทั้งหมด)
{
สำหรับ (ฐานข้อมูลอัตโนมัติ: ทั้งหมด)
ลบฐานข้อมูล;
ทั้งหมด.ชัดเจน();
}
bool IsOk()
{
std::vectorทั้งหมด;
ถ้า (!LoadAll(ทั้งหมด))
{
_FATALERROR("ไม่สามารถโหลดฐานข้อมูลเวอร์ชันหนึ่งรายการหรือมากกว่าสำหรับไฟล์ปฏิบัติการปัจจุบันได้!");
ฟรีทั้งหมด(ทั้งหมด);
กลับเป็นเท็จ;
}
ถ้า (!ExistsInAll(ทั้งหมด, 517014))
{
_FATALERROR("517014 ไม่มีอยู่ในฐานข้อมูลทุกเวอร์ชัน!");
ฟรีทั้งหมด(ทั้งหมด);
กลับเป็นเท็จ;
}
ฟรีทั้งหมด(ทั้งหมด);
// ตกลง!
กลับเป็นจริง;
}
int major = 0, minor = 0, revision = 0, build = 0;
หาก (!db.GetExecutableVersion(หลัก, รอง, การแก้ไข, การสร้าง))
{
_FATALERROR("มีบางอย่างผิดพลาด!");
กลับเป็นเท็จ;
}
// เกมที่รันอยู่คือเวอร์ชัน 1.5.x และอย่างน้อยเวอร์ชัน 1.5.39.0
ถ้า (major == 1 && minor == 5 && revision >= 39)
{
// สิ่งของ ... ?
}
ต้องการความช่วยเหลือเกี่ยวกับการดาวน์โหลดหรือติดตั้งหรือไม่? เข้าร่วม ชุมชน Discord ของเราเพื่อรับการสนับสนุน!
Larvas Limited
Room 1201, 12/F Tai Sang Bank Building 130-132 Des Voeux Road Central HK