3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 9076|回复: 425
打印 上一主题 下一主题

[功能模组] SKSE 插件的地址库(2026-02-13更新)

  [复制链接]

4085

主题

1万

帖子

11万

积分

3DM创意工坊

Rank: 11Rank: 11Rank: 11Rank: 11

贡献度
19757
金元
361692
积分
115197
精华
0
注册时间
2017-8-17
跳转到指定楼层
主题
发表于 2024-11-14 09:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 鼓掌之间 于 2026-2-13 18:19 编辑

转自:https://www.nexusmods.com/skyrimspecialedition/mods/32444

包含头文件和数据库,便于 SKSE DLL 插件的版本独立性。

重要!现在已分为两个版本:特别版 (1.5.x) 和周年纪念版 (1.6.x)。这两个版本之间的地址 ID 不匹配(游戏的可执行文件差别太大,即使地址相同,函数中的代码也不同)。

描述

对于普通 mod 用户:请从文件部分下载并安装“all-in-one”包。您可以使用 mod 管理器或手动安装。.bin 文件应放在以下位置: Data/SKSE/Plugins/ 无需阅读其他内容。

对于 SKSE DLL 插件作者: 这是一个 mod 资源文件(头文件)。您可以加载一个存储偏移的数据库,以便您的 DLL 插件可以独立于版本而无需重新编译。头文件可从文件的可选部分下载。对于周年纪念版,头文件称为 versionlibdb.h,而不是 versiondb.h!如果您使用 CommonLib,则所有内容已集成,无需在此处下载任何内容。

如何使用

最快的方法:

#include "versiondb.h"

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

bool InitializeOffsets()
{
    // 在栈上分配,这样在退出此函数时它会被卸载。
    // 无需加载整个数据库以节省内存。
    VersionDb db;

    // 加载当前可执行文件版本的数据库。
    if (!db.Load())
    {
        _FATALERROR("无法加载当前可执行文件的版本数据库!");
        return false;
    }
    else
    {
        _MESSAGE("已加载 %s 版本的数据库 %s。", db.GetModuleName().c_str(), db.GetLoadedVersionString().c_str());
    }

    // 该地址已经包含模块的基地址,因此可以直接使用。
    MyAddress = db.FindAddressById(123);
    if (MyAddress == NULL)
    {
        _FATALERROR("找不到地址!");
        return false;
    }

    // 此偏移量不包含基地址,实际地址应为 ModuleBase + MyOffset。
    if (!db.FindOffsetById(123, MyOffset))
    {
        _FATALERROR("无法找到项目的偏移量!");
        return false;
    }

    // 成功。
    return true;
}


你可能会问那个“123”是什么值。它是地址的 ID。不同版本数据库会为同一地址使用相同的 ID,但指向不同的值。要获取特定版本的所有 ID 和值的列表,可以执行以下操作:

#include "versiondb.h"

bool DumpSpecificVersion()
{
    VersionDb db;

    // 尝试加载版本 1.5.62.0 的数据库,不论当前运行的可执行版本。
    if (!db.Load(1, 5, 62, 0))
    {
        _FATALERROR("无法加载版本 1.5.62.0 的数据库!");
        return false;
    }

    // 输出名为 offsets-1.5.62.0.txt 的文件,每行是 ID 和偏移量。
    db.Dump("offsets-1.5.62.0.txt");
    _MESSAGE("已导出版本 1.5.62.0 的偏移量");
    return true;
}

将 1, 5, 62, 0 替换为你要调试的版本。确保在 /Data/SKSE/Plugins 目录中有相应的数据库文件。
执行后,Skyrim 目录下应生成一个文件,如“offsets-1.5.62.0.txt”,其中每行为:十进制 ID <tab> 十六进制偏移量 <换行>。
例如,在 1.5.62.0 版本中有一个地址 142F4DEF8(玩家角色静态指针)要使其独立于版本,可以这样操作:
  • 在偏移文件中查找 2F4DEF8,因为它是去掉基地址 140000000 的偏移。
  • 确认 ID 是 517014(十进制!)
  • 如果想在运行时在 DLL 中使用此地址,执行以下操作:


void* addressOf142F4DEF8 = db.FindAddressById(517014);


VersionDb 结构体具有以下功能:显示内容:
要注意的事项:



    1、可以将数据库文件与插件一起包含,但可能会显著增加文件大小(约 2.5 MB)。通常建议将此 mod 标记为依赖项。
    2、在启动时只加载数据库一次,初始化或缓存所需地址并卸载它即可。卸载只是将 VersionDb 结构体删除或丢弃(如果在栈上分配)。这确保在游戏运行期间不会使用不必要的内存。使用 CommonLib 时,这种情况只会发生一次,而不是每个 DLL 都要加载一次。
    3、数据库包含函数、全局变量、RTTI、虚表等的地址,但不包含函数或全局变量中间的地址。如果需要函数中间的地址,应查找函数基地址并自行添加偏移量。它也不包含无用信息,如对齐数据或 rdata 中的编译器生成的 SEH 信息。
    4、确保数据库成功加载(Load 返回 true)且查询到的地址有效(非 NULL)。如果加载失败,可能是文件丢失或版本不匹配(例如 SE 头文件用于 AE)。如果查询失败,可能是该版本的地址无效或数据库未能检测到正确地址。若发生这些情况,插件初始化应失败,让 SKSE 知道未正确加载,或手动显示错误信息。
    5、在发布 DLL 插件前,确保所有游戏版本中该地址都存在。为此,加载每个版本的数据库文件并在各版本中查询相同的地址 ID。


bool LoadAll(std::vector<VersionDb*>& all)
{
    static int versions[] = { 3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1 };
    for (int i = 0; versions >= 0; i++)
    {
        VersionDb * db = new VersionDb();
        if (!db->Load(1, 5, versions, 0))
        {
            delete db;
            return false;
        }
        all.push_back(db);
    }
    return true;
}

bool ExistsInAll(std::vector<VersionDb*>& all, unsigned long long id)
{
    unsigned long long result = 0;
    for (auto db : all)
    {
        if (!db->FindOffsetById(id, result))
            return false;
    }
    return true;
}

void FreeAll(std::vector<VersionDb*>& all)
{
    for (auto db : all)
        delete db;
    all.clear();
}

bool IsOk()
{
    std::vector<VersionDb*> all;
    if (!LoadAll(all))
    {
        _FATALERROR("无法加载一个或多个版本的数据库!");
        FreeAll(all);
        return false;
    }

    if (!ExistsInAll(all, 517014))
    {
        _FATALERROR("517014 在所有版本的数据库中都不存在!");
        FreeAll(all);
        return false;
    }

    FreeAll(all);
    return true;
}


这样可以确保你的 DLL mod 在所有版本中都能正常工作,或者在某些版本中不工作时可以在 mod 页中说明。



    6、有时需要根据运行的游戏版本做不同的操作,可使用以下代码:


int major = 0, minor = 0, revision = 0, build = 0;
if (!db.GetExecutableVersion(major, minor, revision, build))
{
    _FATALERROR("出现问题!");
    return false;
}

// 运行的游戏版本为 1.5.x,且至少是 1.5.39.0 版本
if (major == 1 && minor == 5 && revision >= 39)
{
    // 执行操作
}





    7、请注意:若在调试模式下编译 SKSE DLL,加载数据库的时间可能长达 14 秒!在发布模式下大约为 0.2 秒,这是由于标准库容器在调试模式下速度较慢(如 std::map)。


下载地址:

游客,如果您要查看本帖隐藏内容请回复


评分

1

查看全部评分

回复

使用道具 举报

3

主题

596

帖子

1177

积分

游戏狂人

Rank: 6Rank: 6

贡献度
3
金元
11647
积分
1177
精华
0
注册时间
2015-3-22
舒服的沙发
发表于 2024-11-15 16:00 | 只看该作者
给楼主点赞,希望继续分享!这么好的东西!感谢楼主分享!感谢论坛!
回复 支持 0 反对 1

使用道具 举报

0

主题

34

帖子

103

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1025
积分
103
精华
0
注册时间
2014-2-22
硬硬的板凳
发表于 2024-11-28 19:34 | 只看该作者
6666666666
回复 支持 反对

使用道具 举报

0

主题

103

帖子

389

积分

高级玩家

Rank: 4

贡献度
1
金元
3851
积分
389
精华
0
注册时间
2015-11-19
冰凉的地板
发表于 2024-11-28 20:00 | 只看该作者
感谢分享

回复 支持 0 反对 1

使用道具 举报

0

主题

27

帖子

94

积分

初级玩家

Rank: 2

贡献度
0
金元
935
积分
94
精华
0
注册时间
2015-9-30
5#
发表于 2024-12-2 01:40 | 只看该作者
66666666666666666
回复 支持 反对

使用道具 举报

0

主题

596

帖子

613

积分

超级玩家

Rank: 5Rank: 5

贡献度
0
金元
6128
积分
613
精华
0
注册时间
2007-12-7
6#
发表于 2024-12-2 21:49 | 只看该作者
先谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

3

帖子

5

积分

新手玩家

Rank: 1

贡献度
0
金元
50
积分
5
精华
0
注册时间
2021-1-7
7#
发表于 2024-12-5 11:39 | 只看该作者
感觉你发给火箭能否给v就发给火箭股份
回复 支持 反对

使用道具 举报

0

主题

310

帖子

366

积分

高级玩家

Rank: 4

贡献度
0
金元
3660
积分
366
精华
0
注册时间
2024-4-15
8#
发表于 2024-12-6 06:09 | 只看该作者
xiexiefenx

回复 支持 反对

使用道具 举报

0

主题

54

帖子

123

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1233
积分
123
精华
0
注册时间
2012-4-7
9#
发表于 2024-12-8 02:09 | 只看该作者
好好好
回复 支持 反对

使用道具 举报

0

主题

235

帖子

341

积分

高级玩家

Rank: 4

贡献度
0
金元
3413
积分
341
精华
0
注册时间
2013-6-18
10#
发表于 2024-12-8 14:01 | 只看该作者
让我看看吧
回复 支持 反对

使用道具 举报

0

主题

36

帖子

101

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1005
积分
101
精华
0
注册时间
2014-4-5
11#
发表于 2024-12-18 18:13 | 只看该作者
好人一生平安

回复 支持 反对

使用道具 举报

0

主题

117

帖子

97

积分

初级玩家

Rank: 2

贡献度
0
金元
969
积分
97
精华
0
注册时间
2020-2-18
12#
发表于 2024-12-18 20:40 | 只看该作者
111111111111111
回复 支持 反对

使用道具 举报

0

主题

51

帖子

64

积分

初级玩家

Rank: 2

贡献度
0
金元
635
积分
64
精华
0
注册时间
2018-1-7
13#
发表于 2024-12-21 00:42 | 只看该作者
666666666666666
回复 支持 反对

使用道具 举报

0

主题

9

帖子

99

积分

初级玩家

Rank: 2

贡献度
0
金元
987
积分
99
精华
0
注册时间
2023-4-1
14#
发表于 2024-12-22 17:15 | 只看该作者
绿色安装的怎么看地址呀
回复 支持 反对

使用道具 举报

0

主题

289

帖子

272

积分

高级玩家

Rank: 4

贡献度
0
金元
2719
积分
272
精华
0
注册时间
2012-1-6
15#
发表于 2024-12-23 10:41 | 只看该作者
~~~~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

0

主题

52

帖子

64

积分

初级玩家

Rank: 2

贡献度
0
金元
640
积分
64
精华
0
注册时间
2024-12-22
16#
发表于 2024-12-23 22:01 | 只看该作者
66666666666666666
回复 支持 反对

使用道具 举报

0

主题

474

帖子

652

积分

超级玩家

Rank: 5Rank: 5

贡献度
0
金元
6520
积分
652
精华
0
注册时间
2016-2-8
17#
发表于 2024-12-26 23:25 | 只看该作者
66666666666666666
回复 支持 反对

使用道具 举报

0

主题

28

帖子

96

积分

初级玩家

Rank: 2

贡献度
0
金元
955
积分
96
精华
0
注册时间
2013-11-3
18#
发表于 2024-12-27 09:12 | 只看该作者
6666666666666
回复 支持 反对

使用道具 举报

0

主题

76

帖子

108

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1075
积分
108
精华
0
注册时间
2024-10-6
19#
发表于 2024-12-27 19:08 | 只看该作者
666666666666666666666666666
回复 支持 反对

使用道具 举报

0

主题

38

帖子

101

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1005
积分
101
精华
0
注册时间
2016-12-25
20#
发表于 2024-12-30 13:51 | 只看该作者
6666666666666
回复 支持 反对

使用道具 举报

0

主题

344

帖子

448

积分

高级玩家

Rank: 4

贡献度
0
金元
4480
积分
448
精华
0
注册时间
2014-4-3
21#
发表于 2024-12-30 14:31 | 只看该作者
2023202320232023202320232023
回复 支持 反对

使用道具 举报

0

主题

45

帖子

51

积分

初级玩家

Rank: 2

贡献度
0
金元
510
积分
51
精华
0
注册时间
2022-12-11
22#
发表于 2024-12-31 20:56 | 只看该作者
666666666666
回复 支持 反对

使用道具 举报

0

主题

7

帖子

10

积分

新手玩家

Rank: 1

贡献度
0
金元
96
积分
10
精华
0
注册时间
2021-7-31
23#
发表于 2025-1-2 15:51 | 只看该作者
感谢分享
回复 支持 反对

使用道具 举报

17

主题

732

帖子

1037

积分

游戏狂人

Rank: 6Rank: 6

贡献度
14
金元
9811
积分
1037
精华
0
注册时间
2014-8-13
24#
发表于 2025-1-4 10:23 | 只看该作者
自行车v支持v自行车v自行车
回复 支持 反对

使用道具 举报

0

主题

223

帖子

218

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
2181
积分
218
精华
0
注册时间
2009-7-9
25#
发表于 2025-1-4 17:50 | 只看该作者
666666666666666666666666666666666666666666
回复 支持 反对

使用道具 举报

0

主题

10

帖子

14

积分

新手玩家

Rank: 1

贡献度
0
金元
135
积分
14
精华
0
注册时间
2019-4-2
26#
发表于 2025-1-4 20:02 | 只看该作者
感谢分享
回复 支持 反对

使用道具 举报

0

主题

95

帖子

162

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1621
积分
162
精华
0
注册时间
2012-2-8
27#
发表于 2025-1-5 15:58 | 只看该作者
试试看
回复 支持 反对

使用道具 举报

0

主题

3

帖子

6

积分

新手玩家

Rank: 1

贡献度
0
金元
55
积分
6
精华
0
注册时间
2024-12-24
28#
发表于 2025-1-5 17:53 | 只看该作者
666666666
回复 支持 反对

使用道具 举报

0

主题

2

帖子

63

积分

初级玩家

Rank: 2

贡献度
0
金元
625
积分
63
精华
0
注册时间
2015-11-26
29#
发表于 2025-1-5 20:36 | 只看该作者
谢谢大佬的文件

回复 支持 反对

使用道具 举报

0

主题

83

帖子

106

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1055
积分
106
精华
0
注册时间
2021-8-24
30#
发表于 2025-1-12 23:20 | 只看该作者
22222222222222
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-3-28 23:39 , Processed in 0.040249 second(s), 19 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表