版本号 | Commit: <commit哈希链接>
2026/9/16 21:10:53 网站建设 项目流程

版本号 | Commit: <commit哈希链接>

【免费下载链接】azerothcore-wotlkComplete Open Source and Modular solution for MMO项目地址: https://gitcode.com/GitHub_Trending/az/azerothcore-wotlk

Added / Changed / Removed / How to upgrade

### 2.1 最新条目示例:Motd 迁移(7.0.0-dev.1) 以 master.md 中最新一条为例,它记录了一次典型的**配置项迁移**: - `Motd`(服务器公告)从配置文件(`worldserver.conf`)中移除; - `Motd` 改存到 **auth 数据库**的 `motd` 表; - 表字段语义:`realmid` = 服务器(Realm)ID,`-1` 表示所有服务器;`text` = 公告文本; - **优先级规则**:指定了具体 `realmid` 的条目优先于 `-1`(所有服务器)的条目。 文档给出的示例场景:

你拥有 realm 1、2、3 (-1, "This Motd will show for 2, 3") -- 兜底公告,显示给 2、3 (1, "This Motd will show for 1") -- 专属公告,只显示给 1

这类"配置项从配置文件迁往数据库"的变更,正是 `master.md` 中 `How to upgrade` 小节要解决的典型场景——管理员只需读取该节,即可完成升级动作,无需排查核心源码。 ### 2.2 典型分类:master.md 到底记录什么 通读 master.md 可归纳出它覆盖的几大类变更,每一类都附带面向使用者/开发者的升级指引: **(1)数据库与配置变更** - `6.0.0-dev.2`:移除 `Rate.XP.BattlegroundKill` 配置,改为按战场逐一设置:

Rate.XP.BattlegroundKillAV = 1 Rate.XP.BattlegroundKillWSG = 1 Rate.XP.BattlegroundKillAB = 1 Rate.XP.BattlegroundKillEOTS = 1 Rate.XP.BattlegroundKillSOTA = 1 Rate.XP.BattlegroundKillIC = 1

- `4.0.0-dev.9`:新增 `PlayerStart.AllSpells` 配置(默认 `OFF`,可在 `worldserver.conf.dist` 中查看默认值),并移除旧的 `PlayerStart.CustomSpells`;同时引入 `playercreateinfo_spell_custom` 表,玩家建号时可通过该表获得全部职业技能(不含天赋)。 - `4.0.0-dev.8`:新增 `playercreateinfo_skills` 表,移除 `playercreateinfo_spells` 表,改用 `SkillLineAbility.dbc` 决定玩家初始技能,并将 DBC 结构体字段统一改为 UpperCamelCase(如 `forward_spellid` → `SupercededBySpell`)。 **(2)C++ API 破坏性重构** - `6.0.0-dev.1`:`PreparedStatement` 的全部 `setXxx()` 方法统一收敛为 `SetData(...)`,`Fields` 的 `GetXxx()` 全部收敛为模板方法 `Get<T>()`(例如 `GetString()` → `Get<std::string>()`)。这是对数据库层 API 的一次大规模统一。 - `4.0.0-dev.13`:删除 `Object.cpp` 中的 `MonsterSay / MonsterYell / MonsterTextEmote / MonsterWhisper / SendPlaySound` 系列方法,改为 `Unit` 上的 `Say / Yell / TextEmote / Whisper / Talk`(同时支持 `std::string_view` 文本与 `uint32 textId` 两种重载),`SendPlaySound` 则被 `PlayDirectSound` 取代。 - `4.0.0-dev.3`:`Collision`(碰撞检测)模块约 10 个方法由小驼峰重命名为大驼峰(`getPosition` → `GetPosition`、`getAreaInfo` → `GetAreaInfo` 等)。 - `5.0.0-dev.1`:废弃 `time(nullptr)`、`sWorld->GetGameTime()`、`World::GetGameTimeMS()`,统一改为 `GameTime::GetGameTime().count()` 与 `GameTime::GetGameTimeMS().count()`。 **(3)脚本(Scripts)与模块 API** - `4.0.0-dev.7`:移除旧 Gossip API,全部宏改为函数式调用,并强制 `#include "ScriptedGossip.h"`:

ADD_GOSSIP_ITEM(whatever) → AddGossipItemFor(player, whatever) CLOSE_GOSSIP_MENU() → CloseGossipMenuFor(player) SEND_GOSSIP_MENU(textid, guid) → SendGossipMenuFor(player, textid, guid)

- `4.0.0-dev.6`:脚本加载方式新增 `static / dynamic / minimal-static / minimal-dynamic` 四种选项;模块的 `CMakeLists.txt` 大多不再需要,改为遵循新的脚本加载器规范——将加载文件重命名为 `.cpp`,加载函数改名为 `Add<module_name>Scripts()`(模块名中的空白替换为下划线),并删除 `AC_ADD_SCRIPT_LOADER` 宏。若模块仍使用旧 API,构建时会报 `Module (mod-xxx) using deprecated loader api` 错误。 - `4.0.0-dev.5`:数据库访问层引入类型化包装器,`PreparedStatement*` → `LoginDatabasePreparedStatement*`、`SQLTransaction` → `CharacterDatabaseTransaction` 等,从编译期杜绝跨库混用。 **(4)新增 Hook(钩子)** - `6.0.0-dev.3`:新增 `OnQuestComputeXP()` 钩子,在任务 XP 计算之后、发放 XP/金币之前触发,可用于程序化调整特定任务的 XP 值,且不影响既有钩子逻辑。 - `4.0.0-dev.12`:新增 `OnPlayerPVPFlagChange`,在玩家 PvP 标志改变后执行。 - `4.0.0-dev.11`:新增 `OnBeforeFinalizePlayerWorldSession`,模块可在会话收尾前修改发送给客户端的缓存版本。 - `4.0.0-dev.4`:新增 `OnBeforeSendJoinMessageArenaQueue` 与 `OnBeforeSendExitMessageArenaQueue`,并重命名了旧钩子(`CanSendJoinMessageArenaQueue` → `OnBeforeSendJoinMessageArenaQueue`)。 **(5)依赖与环境要求** - `4.0.0-dev.10`:要求升级 Boost 到 1.74 或更高。 - `5.0.0-dev.0`:移除 `creature` 表的 `modelId` 列,改为双 entry 刷怪系统;若自定义刷怪受影响,可用文档提供的 SAI 语句在刷怪时改回模型。 从上述条目可以看出,`master.md` 不仅是一份"发生了什么"的流水账,更是一份**可操作的升级手册**——几乎每一条都附带 `How to upgrade` 小节,用 diff 或代码示例告诉开发者如何把旧代码迁移到新 API。 ## 三、如何创建一条新的变更日志:pendings/create.sh 当一次 PR 引入 breaking/notable change 时,开发者需要在 [doc/changelog/pendings/](https://link.gitcode.com/i/894e96069a4e6d162ed9bb0ebf522425) 目录下新建一个 Markdown 文件。仓库提供了生成脚本 [doc/changelog/pendings/create.sh](https://link.gitcode.com/i/5f4948cd9f57af262f1d6d744c497273),用法为: ```bash bash doc/changelog/pendings/create.sh

脚本逻辑非常简单直接:

  1. 通过uname判断操作系统(Darwin/macOS 使用gdate,其他系统使用date),取纳秒级时间戳作为唯一文件名;
  2. 以脚本自身所在目录为基准($( cd "$( dirname "${BASH_SOURCE[0]}" )/" && pwd )),保证无论从仓库哪个目录执行都能写入正确的pendings/目录;
  3. 生成文件changes_<纳秒时间戳>.md,内置模板:
Insert your changelog here ### How to upgrade Add instructions on how to adapt the code to the new changes

也就是说,每一条待合并的变更日志只需要两段内容:变更说明+升级指引。用时间戳命名文件,可以天然避免多人并发提交时文件名冲突——这正是它不采用递增序号、而采用纳秒时间戳的原因。

四、CI 自动化:从 pendings 到 master.md 的合并流水线

手动把pendings/里的文件合并进master.md既繁琐又易错,因此仓库在 apps/ci/ci-pending-changelogs.ts 中实现了一套完整的 CI 脚本(使用 Deno 运行时编写),整个流程可以拆解为以下几步:

步骤 1:读取版本与 Git 提交信息

  • 从 acore.json 读取当前项目版本号(JSON.parse后取acoreInfo.version);
  • 调用git rev-parse HEAD获取当前最新提交哈希,作为变更日志条目的 Commit 标识。

步骤 2:遍历 pendings 目录

  • 遍历doc/changelog/pendings/,只处理以.md结尾的文件;
  • 每发现一个待合并文件,就用 semver 库将版本号做一次prerelease 递增:例如1.0.0-dev.11.0.0-dev.2(见脚本中的semver.inc(acoreInfo.version, "prerelease", { includePrerelease: true }))。

步骤 3:合并到 master.md 顶部

  • 将待合并文件内容与新版本号、当前 commit 哈希拼装成标准条目:
    ## <新版本号> | Commit: <gitVersion> <待合并的变更内容>

【免费下载链接】azerothcore-wotlkComplete Open Source and Modular solution for MMO项目地址: https://gitcode.com/GitHub_Trending/az/azerothcore-wotlk

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询