logo
it
Italiano

Libreria di indirizzi per SKSE Plugins

Creatore: meh321
Aggiornato:2020-02-24 19:31:54
2.8MB
mcafee
Verifica
fiducioso da 200,000,000+ utenti

Su questo mod

Contiene un file di intestazione e un database per rendere facilmente indipendente la versione dei plugin SKSE DLL.
IMPORTANTE!Ora è diviso in 2 versioni: Special Edition (1.5.x) e Anniversary Edition (1.6.x). Gli ID che puntano agli indirizzi non corrisponderanno tra queste 2 versioni (l'eseguibile del gioco è troppo diverso per essere abbinato, e anche se corrispondesse, il codice all'interno di quelle funzioni sarebbe comunque diverso).

Descrizione

Per gli utenti mod abituali:Scarica e installa il pacchetto "all-in-one" dalla sezione file. Puoi usare il gestore mod o farlo manualmente. I file .bin dovrebbero essere inseriti qui:
Dati/SKSE/Plugin/
Non c'è bisogno che tu legga il resto di questo articolo.

Per gli autori del plugin DLL SKSE:
Questa è una risorsa per i modder (un file di intestazione). È possibile caricare un database che memorizza gli offset in modo che il plugin DLL possa essere indipendente dalla versione senza dover essere ricompilato. Il file di intestazione può essere scaricato dalla sezione opzionale dei file. Per Anniversary Edition, il file di intestazione si chiama versionlibdb.h invece di versiondb.h! Se si utilizza CommonLib, tutto questo è già integrato e non è necessario alcun componente aggiuntivo.


Come usare

Il modo più veloce:
Anticipazione:
Spettacolo


#include "versiondb.h"

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

bool InizializzaOffset()
{
// Alloca sullo stack in modo che venga scaricato quando usciamo da questa funzione.
// Non c'è bisogno di caricare l'intero database e di utilizzare memoria senza motivo.
VersioneDb db;

// Carica il database con la versione corrente dell'eseguibile.
se (!db.Load())
{
_FATALERROR("Impossibile caricare il database delle versioni per l'eseguibile corrente!");
restituisci falso;
}
altro
{
// "SkyrimSE.exe", "1.5.97.0"
_MESSAGE("Database caricato per %s versione %s.", db.GetModuleName().c_str(), db.GetLoadedVersionString().c_str());
}

// Questo indirizzo include già l'indirizzo base del modulo, quindi possiamo utilizzare l'indirizzo direttamente.
Il mio indirizzo = db.FindAddressById(123);
se (IlMioIndirizzo == NULL)
{
_FATALERROR("Impossibile trovare l'indirizzo!");
restituisci falso;
}

// Questo offset non include l'indirizzo base. L'indirizzo effettivo sarebbe ModuleBase + MyOffset.
se (!db.FindOffsetById(123, MyOffset))
{
_FATALERROR("Impossibile trovare l'offset per la mia cosa!");
restituisci falso;
}

// Tutto è andato a buon fine.
restituisci vero;
}



Ora ti starai chiedendo cos'è quel valore "123" lì. Questo è l'ID di un indirizzo. Versioni diverse del database avranno lo stesso ID per un indirizzo, ma potrebbe puntare a valori diversi. Per ottenere un elenco di tutte le coppie ID-valore per una versione specifica, procedi come segue:

Spoiler:
Spettacolo


#include "versiondb.h"

bool DumpSpecificVersion()
{
VersioneDb db;

// Prova a caricare il database della versione 1.5.62.0 indipendentemente dalla versione eseguibile in esecuzione.
se (!db.Load(1, 5, 62, 0))
{
_FATALERROR("Impossibile caricare il database per 1.5.62.0!");
restituisci falso;
}

// Scrivere un file denominato offsets-1.5.62.0.txt in cui ogni riga rappresenta l'ID e l'offset.
db.Dump("offset-1.5.62.0.txt");
_MESSAGE("Offset scaricati per 1.5.62.0");
restituisci vero;
}



Invece di 1, 5, 62, 0, inserisci la versione che stai invertendo e con cui hai familiarità. Devi prima avere il file di database corrispondente nella directory /Data/SKSE/Plugins.

Dopo aver eseguito questa chiamata, dovresti avere un nuovo file nella directory principale di Skyrim chiamato "offsets-1.5.62.0.txt" o qualsiasi nome tu scelga. Sarà nel formato in cui ogni riga è:
ID decimaleOffset esadecimale

Ad esempio, se hai un indirizzo 142F4DEF8 (puntatore statico del personaggio del giocatore) in 1.5.62.0 che vuoi rendere indipendente dalla versione, dovresti fare così:
1. Cercare 2F4DEF8 nel file offset. Perché questo è l'offset senza la base 140000000
2. Verifica che l'ID sia 517014 (decimale!)
3. Se desideri che questo indirizzo sia presente nella DLL in fase di esecuzione, procedi come segue:


void* addressOf142F4DEF8 = db.FindAddressById(517014);


Ed ecco fatto.

La struttura VersionDb ha le seguenti funzioni:
Spoiler:
Spettacolo


bool Dump(const std::string& path); // Scarica il database attualmente caricato nel file
bool Load(int major, int minor, int revision, int build); // Carica una versione specifica se db-major-minor-revision-build.bin esiste nella directory Data/SKSE/Plugins
bool Load(); // Carica la versione per l'applicazione corrente
void Clear(); // Cancella il database attualmente caricato
void GetLoadedVersion(int& major, int& minor, int& revision, int& build) const; // Ottieni la versione del file di database che abbiamo caricato in questo momento
bool GetExecutableVersion(int& major, int& minor, int& revision, int& build) const; // Ottieni la versione dell'applicazione attualmente in esecuzione
const std::string& GetModuleName() const; // Ottieni il nome del modulo del database attualmente caricato, questo dovrebbe mostrare "SkyrimSE.exe"
const std::string& GetLoadedVersionString() const; // Ottieni la versione attualmente caricata come stringa, ad esempio "1.5.62.0"
const std::map& GetOffsetMap() const; // Ottieni la mappa dell'ID da compensare se devi iterarla manualmente
void* FindAddressById(unsigned long long id) const; // Trova l'indirizzo tramite ID, che includerà già la base e sarà l'indirizzo corretto. Restituirà NULL se non trovato!
bool FindOffsetById(unsigned long long id, unsigned long long& result) const; // Trova l'offset tramite ID, questo sarà semplicemente l'offset senza base inclusa.
bool FindIdByAddress(void* ptr, unsigned long long& result) const; // Trova l'ID tramite indirizzo, questo tenterà una ricerca inversa per convertire l'indirizzo in ID
bool FindIdByOffset(unsigned long long offset, unsigned long long& result) const; // Trova l'ID tramite offset, questo tenterà una ricerca inversa per convertire l'offset in ID



Cose che dovresti sapere e tenere a mente:

1. Puoi includere uno qualsiasi (o tutti) i file del database nel tuo plugin, ma ciò potrebbe aumentare considerevolmente le dimensioni del file (di circa 2,5 MB). Finora, è stato comune contrassegnare questa mod come dipendenza.

2. Dovresti SEMPRE caricare il database una sola volta all'avvio, inizializzare/memorizzare nella cache gli indirizzi necessari e lasciarlo scaricare. Scaricare significa semplicemente che la struttura VersionDb viene eliminata o persa (se allocata nello stack). Questo ti assicurerà di non utilizzare una quantità di memoria inutile durante l'esecuzione del gioco. Non è necessario mantenere il database caricato durante il gioco. Questo è un punto controverso se usi CommonLib, poiché lo carica una sola volta anziché per ogni DLL.

3. Il database contiene indirizzi di funzioni, variabili globali, RTTI, vtable e qualsiasi altra cosa possa farvi riferimento. Non contiene indirizzi che si trovano al centro di funzioni o di variabili globali. Se serve un indirizzo al centro di una funzione, è necessario cercare l'indirizzo base della funzione e aggiungere manualmente l'offset aggiuntivo. Inoltre, non contiene elementi inutili come l'allineamento attorno alle funzioni (a cui si fa riferimento in rdata); la sezione pdata viene eliminata e alcune informazioni SEH generate dal compilatore da rdata vengono eliminate.

4. Dovresti sempre controllare il risultato per assicurarti che il database sia stato caricato correttamente (bool Load ha restituito true) e che gli indirizzi interrogati abbiano effettivamente restituito un risultato valido (non NULL). Se il caricamento non riesce, significa che il file mancava molto probabilmente o che la versione era errata (ad esempio, si è tentato di utilizzare l'intestazione SE in AE). Se la query fallisce, significa che l'indirizzo non è stato trovato in quella versione. Ciò potrebbe significare che il codice del gioco è cambiato abbastanza da rendere l'indirizzo non più valido per quella versione OPPURE che il database stesso non è riuscito a rilevare l'indirizzo corretto. Se si verifica una di queste situazioni, dovresti interrompere l'inizializzazione del plugin per far sapere a SKSE che il caricamento non è stato eseguito correttamente. In alternativa, dovresti visualizzare manualmente un messaggio di errore.

5. Sarebbe inoltre opportuno verificare che l'indirizzo esista in tutte le versioni del gioco prima di pubblicare il plugin DLL. Per farlo, carica ogni versione del file di database e interroga lo stesso ID indirizzo in ciascuna di esse per assicurarti che esista:
Spoiler:
Spettacolo


bool LoadAll(std::vettore& Tutto)
{
static int versions[] = { 3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1 };
per (int i = 0; versioni[i] >= 0; i++)
{
VersioneDb * db = nuovo VersioneDb();
se (!db->Carica(1, 5, versioni[i], 0))
{
elimina db;
restituisci falso;
}
all.push_back(db);
}
restituisci vero;
}

bool Esiste in tutto (std::vettore& tutti, unsigned long long id)
{
unsigned long long risultato = 0;
per (auto db : tutto)
{
se (!db->FindOffsetById(id, risultato))
restituisci falso;
}
restituisci vero;
}

void FreeAll(std::vettore& Tutto)
{
per (auto db : tutto)
elimina db;
tutto.chiaro();
}

bool IsOk()
{
std::vettoreTutto;
se (!LoadAll(tutto))
{
_FATALERROR("Impossibile caricare uno o più database di versione per l'eseguibile corrente!");
FreeAll(tutto);
restituisci falso;
}

se (!ExistsInAll(tutto, 517014))
{
_FATALERROR("517014 non esiste in tutte le versioni del database!");
FreeAll(tutto);
restituisci falso;
}

FreeAll(tutto);
// OK!
restituisci vero;
}



In questo modo puoi essere certo che la tua mod DLL funzionerà in tutte le versioni, oppure se non funziona in alcune versioni puoi scriverlo sulla tua pagina mod.

6. A volte potrebbe essere necessario fare qualcosa di diverso in base alla versione del gioco in esecuzione. Puoi farlo con questo frammento di codice:
Spoiler:
Spettacolo


int maggiore = 0, minore = 0, revisione = 0, build = 0;
se (!db.GetExecutableVersion(principale, minore, revisione, build))
{
_FATALERROR("Qualcosa è andato storto!");
restituisci falso;
}

// Il gioco in esecuzione è 1.5.x e almeno la versione 1.5.39.0
se (maggiore == 1 e minore == 5 e revisione >= 39)
{
// Cose ... ?
}



7. Tieni presente che se compili la DLL SKSE in modalità debug, il tempo di caricamento del database può essere di circa 14 secondi! In modalità release, questo tempo è di circa 0,2 secondi. Ciò è dovuto alla notevole lentezza dei contenitori della libreria standard in tale modalità (std map).


Permessi

Fai quello che vuoi.

Top Mod per Multiverse Loot Hunter

esplorare i migliori mod per Multiverse Loot Hunter che portano nuove funzionalità, visuali aggiornati e modi emozionanti per trasformare la tua esperienza di gameplay.

sblocca il pieno potenziale di Multiverse Loot Hunter con xmod- esplora questi mod top oggi!

mcafee
Verifica
fiducioso da 200,000,000+ utenti

Hai bisogno di aiuto per il download o l'installazione? Unisciti al nostroComunità DiscordCerca supporto.

logo
lingua

soluzioni di giochi

risorse

richieste di partenariato e supporto

Seguici

discordfacebooktwitteryoutube
Email: cathy@business.xmodhub.com
Discord: catherine_79237
termini e condizioni
Politica sulla privacy
sostegno

Larvas Limited

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