logo
ja
日本語

Libreria di indirizzi per plugin SKSE

クリエイター: meh321
更新済み:2024-02-14 09:19:54
2.3MB
mcafee
認証
200,000,000+ ユーザーに信頼されています

このモッドについて

Contiene un file di intestazione e un database per rendere i plugin DLL SKSE facilmente indipendenti dalla versione.
E' importante! Questo è ora diviso in due versioni: edizione speciale (1.5.x) ed edizione anniversaria (1.6.x). Gli ID che puntano agli indirizzi non corrisponderanno tra queste due versioni (il gioco eseguibile è troppo diverso per corrispondere, e anche se corrispondono al codice all'interno di queste funzioni è comunque diverso).

La descrizione

Per gli utenti mod regolari: Scaricare e installare il pacchetto"all-in-one "dalla sezione file. è possibile utilizzare il gestore mod o farlo manualmente. I file. bin dovrebbero andare qui:
Dati/SKSE/Plug-in/
Non c'è bisogno di leggere il resto di tutto questo.

Per gli autori del plugin skse dll:
Questa è una risorsa 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 richiedere di essere ricompilato. Il file di intestazione può essere scaricato dalla sezione opzionale dei file. Per l'edizione anniversario il file di intestazione è chiamato versionlibdb.h invece di versiondb.h! Se stai usando commonlib allora tutto questo è già incorporato e non hai bisogno di nulla da qui.


Come usare

Il modo più veloce:
Spoiler:  
La mostra


# include "versiondb.h"

void * MyAddress = NULL;
Non firmato lungo lungo myoffset = 0;

bool InitializeOffsets ()
{
//allocare sullo stack in modo che verrà scaricato quando usciamo da questa funzione.
//non c'è bisogno di caricare l'intero database e usare la memoria senza motivo.
VersionDb db;

//caricare database con la versione eseguibile corrente.
if (! db.Load ())
{
_FATALERROR("caricare il database delle versioni per l'eseguibile corrente! ");

}
Altrimenti.
{
//"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 in modo che possiamo usare l'indirizzo direttamente.
MyAddress=db.FindAddressById(123);
if (MyAddress == NULL)
{
_FATALERROR("non riesce a trovare l'indirizzo! ");
Restituire falso;
}

//questo offset non include l'indirizzo base. L'indirizzo effettivo sarebbe modulebase + MyOffset.
if (! db.FindOffsetById(123, MyOffset))
{
_FATALERROR("non riesce a trovare l'offset per la mia cosa! ");

}

//tutto ha avuto successo.
Restituisce vera;
}



Ora ti stai chiedendo qual è il valore"123 "lì. Questo è l'identificazione di un indirizzo. Database di versioni diverse avranno lo stesso ID per un indirizzo, ma può indicare valori diversi. Per ottenere un elenco di tutte le coppie di ID e valori per una versione specifica fai questo:

Spoiler:  
La mostra


# include "versiondb.h"

Dump booleano SpecificVersion ()
{
VersionDb db;

//prova a caricare il database della versione 1.5.62.0 indipendentemente dalla versione eseguibile in esecuzione.
if (! db.Load(1,5,62,0))
{
_FATALERROR("caricare database per 1.5.62.0 non riuscito! ");
Restituire falso;
}

//scrivere un file chiamato offsets-1.5.62.0.txt dove ogni riga è l'id e l'offset.
db.Dump ("offsets-1.5.62.0.txt");
_MESSAGE("offset dumped per 1.5.62.0 ");
Restituisce vera;
}



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

Dopo aver chiamato questo si dovrebbe avere un nuovo file nella directory principale skyrim chiamato"offsets-1.5.62.0.txt "o qualsiasi cosa si metta come il nome del file. Sarà nel formato in cui ogni riga è:
ID decimaleOffset esagerato

Per esempio se si dispone di un indirizzo 142f4def8(puntatore statico dei caratteri del giocatore) in 1.5.62.0 che si desidera rendere indipendente la versione si farebbe questo:
1. cercare 2f4def8 nel file di offset. Perché questo è l'offset senza la base 140000000
2. vedere che l'ID è 517014 (decimale!)
3. se si desidera questo indirizzo nella DLL in runtime fai questo:


void * addressOf142F4DEF8 = db.FindAddressById(517014);


Ed ecco che ce l'hai.

La struttura versiondb ha le seguenti funzioni:
Spoiler:  
La mostra


bool Dump (const std:: string & path); //scarica il database attualmente caricato nel file
Carico bool (int major, int minor, int revision, int build); //caricare una versione specifica se db-major-minor-revision-build.bin esiste nella directory data/SKSE/plugins
Carico bool (); //carica la versione per l'applicazione corrente
void Clear (); //cancellare il database attualmente caricato
void GetLoadedVersion(int & major, int & minor, int & revision, int & build) const; //ottenere la versione del file di database che abbiamo caricato ora
bool GetExecutableVersion(int & major, int & minor, int & revision, int & build) const; //ottenere la versione dell'applicazione attualmente in esecuzione
const std:: string & GetModuleName () const; //ottenere il nome del modulo di database attualmente caricato, questo dovrebbe mostrare "SkyrimSE.exe"
const std:: string & GetLoadedVersionString () const; //ottenere la versione attualmente caricata come stringa, ad esempio "1.5.62.0"
const std:: map& GetOffsetMap () const; //ottenere la mappa dell'ID da spostare se è necessario iterarla manualmente
void * FindAddressById (ID lungo lungo non firmato) const; //trovare indirizzo per ID, questo includerà già l'indirizzo base e l'indirizzo corretto. Ritornerà null se non trovato!
bool FindOffsetById(ID lungo non firmato, & risultato lungo non firmato) const; //trovare offset per id, questo verrà semplicemente offset senza base inclusa.
Bool finddbyaddress(void * ptr, unsigned long long & result) const; //trovare id per indirizzo, questo tenterà una ricerca inversa per convertire indirizzo in id
bool FindIdByOffset(offset lungo senza segno, & risultato lungo senza segno) const; //trovare id per offset, questo tenterà una ricerca inversa per convertire offset in id



Le cose che dovresti sapere e tenere a mente:

1. puoi includere qualsiasi (o tutti) dei file di database con il tuo plugin ma può aumentare la dimensione del file notevolmente (di circa 2.5 mb). Finora è stato comune contrassegnare questo mod come dipendenza invece.

2. dovresti sempre caricare il database solo una volta all'avvio, inizializzare/memorizzare gli indirizzi necessari e lasciarlo scaricare. Scaricare significa solo che la struttura versiondb viene eliminata o persa (se si è assegnato sullo stack). Questo assicurerà che non si utilizzi una quantità inutile di memoria durante l'esecuzione del gioco. Non c'è bisogno di mantenere il database caricato durante il gioco. Questo è un punto moot se si usa commonlib in quanto lo carica solo una volta invece di ogni dll.

3. il database contiene indirizzi di funzioni, variabili globali, RTTI, vtables e qualsiasi altra cosa che possa avere un riferimento a esso. Non contiene indirizzi che si trovano nel mezzo delle funzioni o nel mezzo dei globali. Se hai bisogno di un indirizzo nel mezzo della funzione dovresti cercare l'indirizzo base della funzione e aggiungere l'offset extra da solo. Non contiene inoltre cose inutili come l'allineamento attorno alle funzione(che sono riferimenti in rdata), la sezione pdata viene scartata e alcune informazioni generate dal compilatore da rdata vengono scartate.

4. si dovrebbe sempre controllare il risultato per assicurarsi che il database caricato correttamente (bool load restituisce true) e che gli indirizzi richiesti effettivamente restituiscano un risultato valido (non null). Se non riesce a caricare significa che il file mancava la versione più probabile o sbagliata (ad esempio cercando di usare l'intestazione se in ae). Se la query fallisce significa che l'indirizzo non è stato trovato in quella versione. Questo potrebbe significare che il codice del gioco è cambiato abbastanza da non essere più valido per quella versione o il database stesso non è riuscito a rilevare l'indirizzo corretto. Se una di queste cose accade si dovrebbe fallire l'inizializzazione del plugin per far sapere a skse che non si è caricato correttamente. O mostrare manualmente un messaggio di errore.

5. sarebbe anche meglio se avete controllato per assicurarsi che l'indirizzo esiste in tutte le versioni del gioco prima di pubblicare il vostro plugin dll. Per farlo caricare ogni versione del file di database e interrogare lo stesso ID indirizzo in ciascuna di esse per assicurarsi che esista:
Spoiler:  
La mostra


bool LoadAll (std:: vettore& Tutti)
{
Versioni int statiche [] = {3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1};
Per (int i=0; versione [i] > = 0; i++)
{
VersionDb * db = new VersionDb ();
if (! db-> Load(1, 5, versioni [i], 0))
{
Cancellare db;
Restituire falso;
}
all.push_back(db);
}
Restituisce vera;
}

Bool existensinall (std):: vettore& tutti, ID lungo non firmato)
{
Risultato lungo lungo non firmato = 0;

{
if (! db-> FindOffsetById(id, risultato))

}
Restituisce vera;
}

void FreeAll (std:: vettore& Tutti)
{
for(db automatico: tutti)
Cancellare db;
all.clear ();
}

Boolean IsOk ()
{
std:: vettoreTutti;
if (! LoadAll(all))
{
_FATALERROR("caricare uno o più database di versione per l'eseguibile corrente! ");
FreeAll (all);
Restituire falso;
}

if (! Existensinall(all, 517014))
{
_FATALERROR("517014 non esiste in tutte le versioni del database! ");


}

FreeAll (all);
//Ok!
Restituisce vera;
}



In questo modo puoi essere sicuro che il tuo mod dll funzionerà in tutte le versioni, o se non funziona in alcune versioni puoi scriverlo sulla pagina del mod.

6. a volte dovrai fare qualcosa di diverso in base alla versione del gioco in esecuzione. Puoi farlo con questo frammento di codice:
Spoiler:  
La mostra


int major = 0, minor = 0, revision = 0, build = 0;
if (! db.GetExecutableVersion(major, minor, revision, build))
{
_FATALERROR("qualcosa è andato storto! ");
Restituire falso;
}

//gioco in esecuzione è 1.5.x e almeno versione 1.5.39.0
if (maggiore == 1 & & minore == 5 & & revisione > = 39)
{
//roba...
}



7. ti preghiamo di tenere a mente: se compilate la vostra skse dll in modalità di debug il tempo di carico del database può essere circa 14 secondi! In modalità rilascio questo è circa 0,2 secondi. Questo è dovuto al fatto che i contenitori di libreria standard sono molto lenti in quella modalità(std map).


Le autorizzazioni

Fai quello che vuoi.

The Elder Scrolls V: Skyrim Special Edition向けトップモッド

The Elder Scrolls V: Skyrim Special Edition向けの最高のモッドを探検しよう。新しい機能、向上したグラフィック、そしてゲームプレイ体験を変える刺激的な方法を提供します。
SkyUI
schlangster2017-10-04 05:03:26
Mod con interfaccia elegante e adatta al PC, dotata di numerose funzionalità avanzate.
Patch non ufficiale per Skyrim Special Edition - USSEP
Arthmoor2025-09-01 07:56:09
Una mod completa per la correzione dei bug di The Elder Scrolls V: Skyrim - Special Edition. L'obiettivo della patch non ufficiale per Skyrim Special Edition (nota anche come USSEP) è quello di correggere tutti i bug di Skyrim Special Edition non ancora risolti ufficialmente da...
Mod Organizer 2
ModOrganizerTeam2024-08-04 16:31:44
Mod Organizer(MO) è uno strumento per gestire raccolte di mod di dimensioni arbitrarie. è appositamente progettato per le persone che amano sperimentare con mod e quindi hanno bisogno di un modo facile e affidabile per installarli e disinstallarli.
Mod di miglioramento della mesh statica - SMIM
Brumbek2018-07-05 02:28:26
Un progetto imponente per migliorare notevolmente l'aspetto di innumerevoli modelli 3D statici di Skyrim. In pratica, si tratta del mio tentativo di rendere l'architettura, il disordine, l'arredamento e il paesaggio di Skyrim molto più gradevoli.
Libreria di indirizzi per plugin SKSE
meh3212024-02-14 09:19:54
Contiene un file di intestazione e un database per rendere i plugin DLL SKSE facilmente indipendenti dalla versione.
Menu di gara
expired69782024-01-27 03:38:17
Revisione completa del menu di creazione del personaggio, con nuove funzionalità di personalizzazione come molteplici colori di guerra RGBA, colori per il corpo, colori per le mani e colori per i piedi. (Richiede SKSE)
Skyrim se-fnis se fores nuovi inattività
NexusModsCaretaker2020-02-19 01:47:03
Nessuna animazione personalizzata possibile per skyrim? Sbagliato. I comportamenti fnis permettono di aggiungere diversi tipi di animazioni al gioco: idles/pose, sequenziati, mobili, accoppiati, killmoves, creature e altri.
Una mappa del mondo di qualità
Chesko2016-12-11 16:48:33
Offre un nuovo set di texture di mappe del mondo 3D o cartacee altamente dettagliate, complete di strade! Aggiunge anche una mappa dettagliata di Solsteim.

XmodでThe Elder Scrolls V: Skyrim Special Editionの可能性を最大限に引き出そう — これらのトップモッドを今日チェック!

mcafee
認証
200,000,000+ ユーザーに信頼されています

ダウンロードやインストールでお困りですか?サポートのためにDiscord コミュニティに参加してください!

logo
言語

ゲームソリューション

リソース

パートナー

フォローしてください

discordfacebooktwitteryoutube
dc@xmodhub.com or cathy@business.xmodhub.com
Discord: catherine_79237
利用規約
プライバシーポリシー
サポート

Larvas Limited

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