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

注册 登录

QQ登录

只需一步,快速开始

查看: 3093|回复: 83
打印 上一主题 下一主题

[功能模组] SKSE 插件的地址库

  [复制链接]

1281

主题

2212

帖子

3万

积分

3DM创意工坊

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

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

转自: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)。


下载地址:

主文件

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

1

查看全部评分

回复

使用道具 举报

3

主题

569

帖子

1127

积分

游戏狂人

Rank: 6Rank: 6

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

使用道具 举报

0

主题

32

帖子

99

积分

初级玩家

Rank: 2

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

使用道具 举报

0

主题

99

帖子

374

积分

高级玩家

Rank: 4

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

回复 支持 反对

使用道具 举报

0

主题

27

帖子

93

积分

初级玩家

Rank: 2

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

使用道具 举报

0

主题

523

帖子

528

积分

高级玩家

Rank: 4

贡献度
0
金元
5283
积分
528
精华
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

主题

194

帖子

226

积分

中级玩家

Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

0

主题

44

帖子

109

积分

中级玩家

Rank: 3Rank: 3

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

使用道具 举报

0

主题

224

帖子

323

积分

高级玩家

Rank: 4

贡献度
0
金元
3233
积分
323
精华
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

主题

47

帖子

54

积分

初级玩家

Rank: 2

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

使用道具 举报

0

主题

8

帖子

96

积分

初级玩家

Rank: 2

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

使用道具 举报

0

主题

291

帖子

272

积分

高级玩家

Rank: 4

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

使用道具 举报

0

主题

50

帖子

60

积分

初级玩家

Rank: 2

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

使用道具 举报

0

主题

287

帖子

383

积分

高级玩家

Rank: 4

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

使用道具 举报

0

主题

23

帖子

89

积分

初级玩家

Rank: 2

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

使用道具 举报

0

主题

38

帖子

57

积分

初级玩家

Rank: 2

贡献度
0
金元
570
积分
57
精华
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

主题

340

帖子

440

积分

高级玩家

Rank: 4

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

使用道具 举报

0

主题

42

帖子

47

积分

初级玩家

Rank: 2

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

使用道具 举报

0

主题

5

帖子

7

积分

新手玩家

Rank: 1

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

使用道具 举报

16

主题

477

帖子

749

积分

超级玩家

Rank: 5Rank: 5

贡献度
14
金元
6931
积分
749
精华
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

帖子

161

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1606
积分
161
精华
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

主题

56

帖子

67

积分

初级玩家

Rank: 2

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-14 20:16 , Processed in 0.149273 second(s), 17 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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