XMODhub Home
Switch language
日本語
SKSEプラグイン用アドレスライブラリ Mod Menu

SKSEプラグイン用アドレスライブラリ

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

事前に必要なモッド

SKSEプラグイン用アドレスライブラリ を使用すると自動的にインストールされます

このモッドについて

SKSE DLL プラグインをバージョンに依存しないようにするためのヘッダー ファイルとデータベースが含まれています。
重要! これは現在、特別版(1.5.x)と記念版(1.6.x)の2つのバージョンに分割されています。アドレスを指すIDは、これら2つのバージョンの間で一致しません(ゲーム実行ファイルはあまりにも異なり、一致することができません。たとえそれらの関数内のコードと一致したとしても、とにかく異なります)。

説明

通常のmodユーザーの場合: ファイルセクションから「オールインワン」パッケージをダウンロードしてインストールします。modマネージャーを使用するか、手動で行うこともできます。.binファイルはここに移動する必要があります。
データ/SKSE/プラグイン/
これの残りの部分を読む必要はありません。

SKSE DLLプラグインの著者向け:
これはモッダーリソース(ヘッダーファイル)です。オフセットを保存するデータベースをロードすることで、DLLプラグインを再コンパイルすることなくバージョンに依存しないようにできます。ヘッダーファイルは、ファイルのオプションのセクションからダウンロードできます。記念日版の場合、ヘッダーファイルはversiondb.hではなくversionlibdb.hと呼ばれます。CommonLibを使用している場合は、これらすべてがすでに組み込まれており、ここから何も必要ありません。


~の使い方

最も迅速な方法:
ネタバレ:  
表示する


#「versiondb.h」を含みます

void*MyAddress=NULL;
符号なしの長い長いMyOffset=0;

bool InitializeOffsets()
{
//スタック上で割り当てるので、この関数を終了するとアンロードされます。
//データベース全体をロードして、理由もなくメモリを使用する必要はありません。
バージョンdb db;

//現在の実行可能バージョンでデータベースをロードします。
if(!db.Load())
{
_FATALERROR("現在の実行ファイルのバージョンデータベースをロードできませんでした!");

}
それ以外の
{
//"SkyrimSE.exe","1.5.97.0"
_MESSAGE("%s version%s for loaded database.", db.GetModuleName().c_str(), db.GetLoadedVersionString().c_str());
}

//このアドレスにはすでにモジュールのベースアドレスが含まれているため、アドレスを直接使用できます。
MyAddress=db.FindAddressById(123);
if(MyAddress==NULL)
{
_FATALERROR("アドレスが見つかりませんでした!");
falseを返します。
}

//このオフセットにはベースアドレスは含まれていません。実際のアドレスはmodulebase myoffsetになります。
if(!db.FindOffsetById(123, MyOffset))
{
_FATALERROR("私のもののオフセットが見つかりませんでした!");

}

//すべてが成功しました。
真を返します。
}



今、あなたはそこにある「123」の値が何であるか疑問に思っています。これはアドレスのIDです。さまざまなバージョンのデータベースは、アドレスに同じIDを持ちますが、異なる値を指す可能性があります。特定のバージョンのすべてのIDと値ペアのリストを取得するには、次の手順を実行します。

ネタバレ:  
表示する


#「versiondb.h」を含みます

ブールダンプSpecificVersion()
{
バージョンdb db;

//実行可能バージョンの実行に関係なく、バージョン1.5.62.0のデータベースをロードしてみてください。
if(!db.Load(1, 5, 62, 0))
{
_FATALERROR("1.5.62.0のデータベースをロードできませんでした!");
falseを返します。
}

//各行がIDとoffsetである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」という新しいファイル、またはファイル名として置くものが必要です。各行が次の形式になります。
10進数ID六角オフセット

たとえば、1.5.62.0にバージョンに依存しないようにするアドレス142F4DEF8(プレイヤーキャラクター静的ポインタ)がある場合は、次のようにします。
1.オフセットファイルで2F4DEF8を検索します。これはベースなしのオフセットであるため140000000
2.IDが517014(小数!)であることを参照してください。
3.実行時にこのアドレスをDLLに入れたい場合は、次のようにします。


void*addressOf142F4DEF8=db.FindAddressById(517014);


そしてそこにそれがあります。

VersionDb構造体には次の機能があります。
ネタバレ:  
表示する


boolダンプ(const std::string//現在ロードされているデータベースをファイルにダンプします
bool負荷(int major、int minor、int revision、int build);//db-major-minor-revision-build.binがData/SKSE/Pluginsディレクトリに存在する場合は、特定のバージョンをロードします
bool負荷();//現在のアプリケーションのバージョンをロードします
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(符号なしの長い長いid)const;//IDでアドレスを見つけると、これにはすでにベースが含まれ、正しいアドレスが含まれます。見つからない場合はNULLに戻ります。
bool FindOffsetById(署名されていない長い長いid、署名されていない長い長い&結果)const;//IDでオフセットを見つけます。これは、ベースを含まずにオフセットされます。
bool FindIdByAddress(void*ptr、署名されていない長い長い//アドレスごとにIDを見つけると、逆ルックアップを試みてアドレスをIDに変換します。
bool FindIdByOffset(署名されていない長い長いオフセット、署名されていない長い長い&結果)const;//オフセットごとにIDを見つけると、逆ルックアップを試みてオフセットをIDに変換します



あなたが知っておくべきことと覚えておくべきこと:

1.データベースファイルのいずれか(またはすべて)をプラグインに含めることができますが、ファイルサイズが大幅に増加する可能性があります(約2.5mb)。これまでのところ、代わりにこのmodを依存関係としてマークすることが一般的でした。

2.起動時に常に一度だけデータベースをロードし、必要なアドレスを初期化/キャッシュしてアンロードする必要があります。Unloadingは、VersionDb構造体が削除または失われることを意味します(スタックに割り当てられた場合)。これにより、ゲームの実行中に不要な量のメモリが使用されないようになります。ゲームプレイ中にデータベースをロードしたままにする必要はありません。これは、DLLごとに読み込まれるのではなく、1回だけ読み込まれるため、CommonLibを使用する場合は議論の余地があります。

3.データベースには、関数、グローバル変数、RTTI、vtables、およびそれへの参照を持つ可能性のある他のもののアドレスが含まれています。関数の真ん中やグローバルの真ん中にあるアドレスは含まれていません。関数の真ん中にアドレスが必要な場合は、関数のベースアドレスを検索し、追加のオフセットを自分で追加する必要があります。また、関数周辺のアライメント(rdataで参照されています)などの役に立たないものも含まれていません。pdataセクションは破棄され、rdataからコンパイラで生成されたSEH情報が破棄されます。

4.データベースが正常にロードされたことを確認するために、常に結果を確認する必要があります(boolロードがtrueを返しました)、クエリされたアドレスが実際に有効な結果を返しました(NULLではありません)。読み込みが失敗した場合、ファイルが最も可能性の高いバージョンが欠落していたか、バージョンが間違っていたことを意味します(例:AEでSEヘッダーを使用しようとします)。クエリが失敗した場合、そのバージョンでアドレスが見つかりませんでした。これは、ゲームコードがそのバージョンに対してアドレスがまったく有効でなくなるほど変更されたか、データベース自体が正しいアドレスを検出できなかったことを意味する可能性があります。これらのことのいずれかが発生した場合は、正しくロードされていないことをSKSEに知らせるためにプラグインの初期化に失敗する必要があります。または手動でエラーメッセージを表示します。

5.また、DLLプラグインを公開する前に、ゲームのすべてのバージョンにアドレスが存在することを確認することをチェックした場合も最善です。データベースファイルの各バージョンをロードし、それぞれに同じアドレスIDをクエリして存在することを確認するには、次の手順に従います。
ネタバレ:  
表示する


bool LoadAll(std::ベクトル(&すべて)
{
静的intバージョン[]={3, 16, 23, 39, 50, 53, 62, 73, 80, 97,-1};
for(int i=0;version[i]>=0;i++)
{
VersionDb*db=新しいVersionDb();
if(!db->Load(1, 5,バージョン[i], 0))
{
dbを削除;
falseを返します。
}
all.push_back(db);
}
真を返します。
}

bool existensinall(std::ベクトル&all、署名されていない長い長いid)
{
署名されていない長い長い結果=0;

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

}
trueを返す。
}

void FreeAll(std::vector(&すべて)
{
for(auto db:all)
dbを削除;
all.clear();
}

ブールIsOk()
{
std::ベクトルすべて;
if(!LoadAll(all))
{
_FATALERROR(「現在の実行ファイルの1つ以上のバージョンデータベースをロードできませんでした!」);
フリーオール(すべて);
falseを返します。
}

if(!existensinall(all, 517014))
{
_FATALERROR("517014はデータベースのすべてのバージョンに存在するわけではありません!");


}

フリーオール(すべて);
//わかりました!
trueを返す。
}



このようにして、DLL modがすべてのバージョンで動作することを確認することができます。または、一部のバージョンで動作しない場合は、それをmodページに書くことができます。

6.ゲームバージョンの実行に基づいて何か異なることをする必要がある場合があります。このコードスニペットを使用してそれを行うことができます。
ネタバレ:  
表示する


int major=0、minor=0、revision=0、build=0;
if(!db.GetExecutableVersion(major, minor, revision, build))
{
_FATALERROR("何か問題が発生しました!");
falseを返します。
}

//実行中のゲームは1.5.xで、少なくともバージョン1.5.39.0です
if(メジャー==1
{
//もの...?
}



7.覚えておいてください:デバッグモードでSKSE DLLをコンパイルすると、データベースのロード時間は約14秒になる可能性があります!リリースモードでは約0.2秒です。これは、標準ライブラリコンテナがそのモード(std map)で非常に遅いためです。


権限

好きなことは何でもしてください。

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

The Elder Scrolls V: Skyrim Special Edition向けの最高のモッドを探検しよう。新しい機能、向上したグラフィック、そしてゲームプレイ体験を変える刺激的な方法を提供します。
2025-12-16 11:53:50
前置き必須Mod
Modオーガナイザー2
ModOrganizerTeam2024-08-04 16:31:44
Mod Organizer(MO)は、任意のサイズのmodコレクションを管理するためのツールです。MODを実験するのが好きなため、簡単で信頼性の高いインストールとアンインストール方法が必要な人向けに特別に設計されています。
SkyUI
schlangster2017-10-04 05:03:26
多くの高度な機能を備えた、エレガントで PC に適したインターフェース MOD。
非公式 Skyrim スペシャル エディション パッチ - USSEP
Arthmoor2025-09-01 07:56:09
The Elder Scrolls V: Skyrim - Special Edition の包括的なバグ修正MODです。Unofficial Skyrim Special Edition Patch (USSEP) の目標は、公式に解決されていない Skyrim Special Edition のあらゆるバグを最終的に修正することです。
スタティックメッシュ改善MOD - SMIM
Brumbek2018-07-05 02:28:26
Skyrimの無数の静的3Dモデルの見た目を大幅に改善する大規模プロジェクトです。基本的には、Skyrimの建築物、雑然とした空間、家具、そして景観をより美しくするための試みです。
SKSEプラグイン用アドレスライブラリ
meh3212024-02-14 09:19:54
SKSE DLL プラグインをバージョンに依存しないようにするためのヘッダー ファイルとデータベースが含まれています。
レースメニュー
expired69782024-01-27 03:38:17
キャラクター作成メニューが全面的に刷新され、複数の RGBA ウォーペイント、ボディペイント、ハンドペイント、フットペイントなどの新しいカスタマイズ機能が追加されました。(SKSE が必要です)
スカイリムse-fnis seで新しいアイドルを予定している
NexusModsCaretaker2020-02-19 01:47:03
Skyrim用のカスタムアニメーションは不可能ですか?間違っています。FNISの動作を使用すると、アイドル/ポーズ、シーケンス、家具、ペアリング、キルムーブ、クリーチャーなど、さまざまなタイプのアニメーションをゲームに追加できます。

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

Verified by McAfee SECURE
認証
200,000,000+ ユーザーに信頼されています

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

XMODhub Home
言語
Chinese Traditionalに言語を切り替える
Englishに言語を切り替える
Germanに言語を切り替える
Koreanに言語を切り替える
Thaiに言語を切り替える
Indonesianに言語を切り替える
Vietnameseに言語を切り替える
Turkishに言語を切り替える
Portugueseに言語を切り替える
Japaneseに言語を切り替える
Polishに言語を切り替える
Frenchに言語を切り替える
Spanishに言語を切り替える
Italianに言語を切り替える

ゲームソリューション

リソース

パートナー

フォローしてください

XMODhub DiscordにアクセスXMODhub FacebookにアクセスXMODhub XにアクセスXMODhub YouTubeにアクセス
サポート:
support@xmodhub.com
Xmod_Lily
業務:
dc@xmodhub.com or lynn@business.xmodhub.com
catherine_79237

Larvas Limited

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