logo
id
Bahasa Indonesia

Perpustakaan Alamat untuk SKSE Plugins

Pembuat: meh321
Diperbarui:2020-02-24 19:31:54
2.8MB
mcafee
Otentikasi
Dipercaya oleh 200,000,000+ Pengguna

Tentang Mod ini

Berisi file header dan database untuk membuat versi plugin SKSE DLL independen dengan mudah.
PENTING!Ini sekarang terbagi menjadi 2 versi: Edisi Khusus (1.5.x) dan Edisi Ulang Tahun (1.6.x). ID yang mengarah ke alamat tidak akan cocok di antara kedua versi tersebut (eksekusi gim terlalu berbeda untuk dicocokkan, dan meskipun cocok, kode dalam fungsi tersebut tetap berbeda).

Keterangan

Untuk pengguna mod reguler:Unduh dan instal paket "all-in-one" dari bagian file. Anda dapat menggunakan pengelola mod atau melakukannya secara manual. File .bin harus ada di sini:
Data/SKSE/Plugin/
Anda tidak perlu membaca sisanya.

Untuk penulis plugin SKSE DLL:
Ini adalah sumber daya modder (berkas header). Anda dapat memuat basis data yang menyimpan offset sehingga plugin DLL Anda dapat bersifat independen versi tanpa perlu dikompilasi ulang. Berkas header dapat diunduh dari bagian opsional berkas. Untuk Edisi Ulang Tahun, berkas header disebut versionlibdb.h, bukan versiondb.h! Jika Anda menggunakan CommonLib, semua ini sudah ada di dalamnya dan Anda tidak memerlukan apa pun dari sini.


Cara penggunaan

Cara tercepat:
Bocoran:
Menunjukkan


#include "versiondb.h"

void * AlamatSaya = NULL;
unsigned long long MyOffset = 0;

bool InisialisasiOffset()
{
// Alokasikan pada tumpukan sehingga akan dibongkar saat kita keluar dari fungsi ini.
// Tidak perlu memuat seluruh basis data dan menggunakan memori tanpa alasan.
VersionDb db;

// Muat basis data dengan versi yang dapat dieksekusi saat ini.
jika (!db.Load())
{
_FATALERROR("Gagal memuat basis data versi untuk eksekusi saat ini!");
kembalikan salah;
}
kalau tidak
{
// "SkyrimSE.exe", "1.5.97.0"
_MESSAGE("Basis data dimuat untuk %s versi %s.", db.GetModuleName().c_str(), db.GetLoadedVersionString().c_str());
}

// Alamat ini sudah menyertakan alamat dasar modul sehingga kita dapat menggunakan alamat tersebut secara langsung.
AlamatSaya = db.TemukanAlamatDenganId(123);
jika (AlamatSaya == NULL)
{
_FATALERROR("Gagal menemukan alamat!");
kembalikan salah;
}

// Offset ini tidak menyertakan alamat dasar. Alamat sebenarnya adalah ModuleBase + MyOffset.
jika (!db.FindOffsetById(123, MyOffset))
{
_FATALERROR("Gagal menemukan offset untuk benda saya!");
kembalikan salah;
}

// Semuanya berhasil.
kembalikan benar;
}



Sekarang Anda mungkin bertanya-tanya apa nilai "123" itu. Ini adalah ID sebuah alamat. Basis data versi yang berbeda akan memiliki ID yang sama untuk sebuah alamat, tetapi mungkin mengarah ke nilai yang berbeda. Untuk mendapatkan daftar semua pasangan ID dan nilai untuk versi tertentu, lakukan hal berikut:

Bocoran:
Menunjukkan


#include "versiondb.h"

bool DumpSpecificVersion()
{
VersionDb db;

// Cobalah memuat basis data versi 1.5.62.0 tanpa memperhatikan versi yang dapat dieksekusi yang sedang berjalan.
jika (!db.Load(1, 5, 62, 0))
{
_FATALERROR("Gagal memuat basis data untuk 1.5.62.0!");
kembalikan salah;
}

// Tuliskan sebuah file bernama offsets-1.5.62.0.txt di mana setiap barisnya adalah ID dan offset.
db.Dump("offset-1.5.62.0.txt");
_MESSAGE("Offset dibuang untuk 1.5.62.0");
kembalikan benar;
}



Alih-alih 1, 5, 62, 0, masukkan versi yang ingin Anda balikkan dan pahami. Anda harus memiliki berkas basis data yang sesuai di direktori /Data/SKSE/Plugins terlebih dahulu.

Setelah Anda memanggil perintah ini, Anda akan memiliki berkas baru di direktori utama Skyrim bernama "offsets-1.5.62.0.txt" atau apa pun nama berkas yang Anda masukkan. Formatnya akan seperti ini:
ID DesimalOffset Heksagonal

Misalnya jika Anda memiliki alamat 142F4DEF8 (penunjuk statis karakter pemain) di 1.5.62.0 yang ingin Anda buat tidak bergantung pada versi, lakukan hal berikut:
1. Cari 2F4DEF8 di berkas offset. Karena ini adalah offset tanpa basis 140000000
2. Pastikan ID-nya adalah 517014 (desimal!)
3. Jika Anda ingin alamat ini di DLL Anda saat runtime, lakukan ini:


void* addressOf142F4DEF8 = db.FindAddressById(517014);


Dan itu dia.

Struktur VersionDb memiliki fungsi berikut:
Bocoran:
Menunjukkan


bool Dump(const std::string& path); // Buang database yang sedang dimuat ke file
bool Load(int major, int minor, int revision, int build); // Muat versi tertentu jika db-major-minor-revision-build.bin ada di direktori Data/SKSE/Plugins
bool Load(); // Muat versi untuk aplikasi saat ini
void Clear(); // Bersihkan database yang sedang dimuat
void GetLoadedVersion(int& major, int& minor, int& revision, int& build) const; // Dapatkan versi file database yang telah kita muat sekarang
bool GetExecutableVersion(int& major, int& minor, int& revision, int& build) const; // Dapatkan versi aplikasi yang sedang dijalankan
const std::string& GetModuleName() const; // Dapatkan nama modul basis data yang sedang dimuat, ini akan menampilkan "SkyrimSE.exe"
const std::string& GetLoadedVersionString() const; // Dapatkan versi yang sedang dimuat sebagai string, misalnya "1.5.62.0"
const std::peta& GetOffsetMap() const; // Dapatkan peta ID untuk diimbangi jika Anda perlu mengulanginya secara manual
void* FindAddressById(unsigned long long id) const; // Temukan alamat berdasarkan ID, ini sudah termasuk alamat dasar dan alamat yang benar. NULL akan dikembalikan jika tidak ditemukan!
bool FindOffsetById(unsigned long long id, unsigned long long& result) const; // Temukan offset berdasarkan ID, ini hanya akan menjadi offset tanpa basis yang disertakan.
bool FindIdByAddress(void* ptr, unsigned long long& result) const; // Temukan ID berdasarkan alamat, ini akan mencoba pencarian terbalik untuk mengubah alamat menjadi ID
bool FindIdByOffset(unsigned long long offset, unsigned long long& result) const; // Temukan ID berdasarkan offset, ini akan mencoba pencarian terbalik untuk mengonversi offset ke ID



Hal-hal yang perlu Anda ketahui dan ingat:

1. Anda dapat menyertakan sebagian (atau semua) berkas basis data dengan plugin Anda, tetapi ukurannya mungkin akan meningkat secara signifikan (sekitar 2,5 MB). Sejauh ini, mod ini umumnya ditandai sebagai dependensi.

2. Anda HARUS SELALU memuat basis data hanya sekali saat startup, menginisialisasi/men-cache alamat yang Anda butuhkan, dan membiarkannya terunload. Unload hanya berarti struct VersionDb akan terhapus atau hilang (jika Anda mengalokasikannya di stack). Ini akan memastikan Anda tidak menggunakan memori yang tidak perlu selama runtime game. Basis data tidak perlu terus-menerus dimuat selama bermain. Hal ini tidak relevan jika Anda menggunakan CommonLib karena hanya memuatnya sekali, bukan untuk setiap DLL.

3. Basis data berisi alamat fungsi, variabel global, RTTI, vtable, dan apa pun yang mungkin memiliki referensi ke sana. Basis data tidak berisi alamat yang berada di tengah fungsi atau di tengah variabel global. Jika Anda membutuhkan alamat di tengah fungsi, Anda harus mencari alamat basis fungsi dan menambahkan offset tambahan sendiri. Basis data juga tidak berisi hal-hal yang tidak berguna seperti penyelarasan di sekitar fungsi (yang direferensikan dalam rdata), bagian pdata dibuang, dan beberapa informasi SEH yang dihasilkan kompiler dari rdata dibuang.

4. Anda harus selalu memeriksa hasilnya untuk memastikan database berhasil dimuat (bool Load mengembalikan true) dan alamat yang ditanyakan benar-benar mengembalikan hasil yang valid (bukan NULL). Jika gagal dimuat, kemungkinan besar berkas tersebut hilang atau versinya salah (misalnya, mencoba menggunakan header SE di AE). Jika kueri gagal, artinya alamat tidak dapat ditemukan di versi tersebut. Ini bisa berarti kode game telah berubah sedemikian rupa sehingga alamat tersebut tidak lagi valid untuk versi tersebut ATAU database itu sendiri gagal mendeteksi alamat yang benar. Jika salah satu hal tersebut terjadi, Anda harus menggagalkan inisialisasi plugin agar SKSE tahu bahwa Anda tidak memuat dengan benar. Atau, tampilkan pesan kesalahan secara manual.

5. Sebaiknya Anda juga memeriksa untuk memastikan alamat tersebut ada di semua versi game sebelum menerbitkan plugin DLL Anda. Untuk melakukannya, muat setiap versi berkas basis data dan tanyakan ID alamat yang sama di setiap versi untuk memastikannya ada:
Bocoran:
Menunjukkan


bool LoadAll(std::vektor& semua)
{
statis int versi[] = { 3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1 };
untuk (int i = 0; versi[i] >= 0; i++)
{
VersionDb * db = new VersionDb();
jika (!db->Load(1, 5, versi[i], 0))
{
hapus db;
kembalikan salah;
}
semua.push_back(db);
}
kembalikan benar;
}

bool AdaDalamSemua(std::vektor& semua, unsigned long long id)
{
unsigned long long hasil = 0;
untuk (auto db : semua)
{
jika (!db->FindOffsetById(id, hasil))
kembalikan salah;
}
kembalikan benar;
}

void FreeAll(std::vektor& semua)
{
untuk (auto db : semua)
hapus db;
semua.bersih();
}

bool IsOk()
{
std::vektorsemua;
jika (!LoadAll(semua))
{
_FATALERROR("Gagal memuat satu atau lebih basis data versi untuk eksekusi saat ini!");
FreeAll(semua);
kembalikan salah;
}

jika (!AdaDalamSemua(semua, 517014))
{
_FATALERROR("517014 tidak ada di semua versi basis data!");
FreeAll(semua);
kembalikan salah;
}

FreeAll(semua);
// Oke!
kembalikan benar;
}



Dengan cara ini Anda dapat yakin bahwa mod DLL Anda akan berfungsi di semua versi, atau jika tidak berfungsi di beberapa versi, Anda dapat menuliskannya di halaman mod Anda.

6. Terkadang Anda perlu melakukan sesuatu yang berbeda berdasarkan versi game yang sedang berjalan. Anda dapat melakukannya dengan cuplikan kode ini:
Bocoran:
Menunjukkan


int mayor = 0, minor = 0, revisi = 0, build = 0;
jika (!db.GetExecutableVersion(utama, minor, revisi, versi))
{
_FATALERROR("Ada yang salah!");
kembalikan salah;
}

// Game yang berjalan adalah 1.5.x dan setidaknya versi 1.5.39.0
jika (mayor == 1 dan minor == 5 dan revisi >= 39)
{
// Hal-hal ... ?
}



7. Harap diingat: jika Anda mengompilasi SKSE DLL dalam mode debug, waktu muat basis data bisa sekitar 14 detik! Dalam mode rilis, waktu muatnya sekitar 0,2 detik. Hal ini disebabkan kontainer pustaka standar sangat lambat dalam mode tersebut (std map).


Izin

Lakukan apa pun yang kamu inginkan.

Mod hàng đầu cho Multiverse Loot Hunter

Jelajahi mod terbaik untuk Multiverse Loot Hunter yang menghadirkan fitur baru, visual yang ditingkatkan, dan cara menarik untuk mengubah pengalaman bermain Anda.

Buka potensi penuh Multiverse Loot Hunter dengan Xmod — jelajahi mod teratas ini hari ini!

mcafee
Otentikasi
Dipercaya oleh 200,000,000+ Pengguna

Butuh bantuan dengan unduhan atau instalasi? Bergabunglah dengan komunitas Discord kami untuk dukungan!

logo
Bahasa

Solusi Gaming

Sumber Daya

Mitra

Ikuti kami di

discordfacebooktwitteryoutube
dc@xmodhub.com or cathy@business.xmodhub.com
Discord: catherine_79237
Syarat dan Ketentuan
Kebijakan Privasi
Dukungan

Larvas Limited

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