<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.waylee.net/index.php?action=history&amp;feed=atom&amp;title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83%2F%E8%A7%92%E8%89%B2%E5%A4%96%E8%A7%82%E9%85%8D%E7%BD%AE</id>
	<title>工程参考/角色外观配置 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.waylee.net/index.php?action=history&amp;feed=atom&amp;title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83%2F%E8%A7%92%E8%89%B2%E5%A4%96%E8%A7%82%E9%85%8D%E7%BD%AE"/>
	<link rel="alternate" type="text/html" href="https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E8%A7%92%E8%89%B2%E5%A4%96%E8%A7%82%E9%85%8D%E7%BD%AE&amp;action=history"/>
	<updated>2026-10-26T16:42:43Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E8%A7%92%E8%89%B2%E5%A4%96%E8%A7%82%E9%85%8D%E7%BD%AE&amp;diff=14875&amp;oldid=prev</id>
		<title>Waylee：​新增角色外观配置（服务端 6 表 + 客户端 5 表的结构与启动校验）</title>
		<link rel="alternate" type="text/html" href="https://www.waylee.net/index.php?title=%E5%B7%A5%E7%A8%8B%E5%8F%82%E8%80%83/%E8%A7%92%E8%89%B2%E5%A4%96%E8%A7%82%E9%85%8D%E7%BD%AE&amp;diff=14875&amp;oldid=prev"/>
		<updated>2026-10-26T13:36:28Z</updated>

		<summary type="html">&lt;p&gt;新增角色外观配置（服务端 6 表 + 客户端 5 表的结构与启动校验）&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;lua-reference&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;lua-lead&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div role=&amp;quot;heading&amp;quot; aria-level=&amp;quot;2&amp;quot; class=&amp;quot;lua-h1&amp;quot;&amp;gt;角色外观配置&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;lua-sub&amp;quot;&amp;gt;服务端 6 表 + 客户端 5 表 · 脸型、发型、头像、时装、编号时装、时装特效&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
角色外观分两层：&amp;#039;&amp;#039;&amp;#039;定义表&amp;#039;&amp;#039;&amp;#039;说「有哪些脸型/发型/头像、给哪个门派、要什么物品、多少钱」；&amp;#039;&amp;#039;&amp;#039;模型表&amp;#039;&amp;#039;&amp;#039;说「这个编号对应哪个 mesh、什么材质、男女各是哪一版」。服务端六张表由 &amp;lt;code&amp;gt;TLBBExterior&amp;lt;/code&amp;gt;（实现位于 &amp;lt;code&amp;gt;Common/ExteriorTables.h&amp;lt;/code&amp;gt;）在 GameServer 启动时加载，客户端另有五张自己读的同主题表。&lt;br /&gt;
&lt;br /&gt;
== 加载与启动校验 ==&lt;br /&gt;
服务端循环加载六张表后调用 &amp;lt;code&amp;gt;Valid()&amp;lt;/code&amp;gt;，任一不符 GameServer 拒绝启动：&lt;br /&gt;
&lt;br /&gt;
* 列数硬约束：脸型定义 8、发型定义 9、头像定义 7、脸型模型 11、发型模型 13、头像模型 11；行数必须非空。&lt;br /&gt;
* 首列 ID 必须为正且不重复。&lt;br /&gt;
* 六类（脸型/发型/头像各含定义与模型）都必须非空。&lt;br /&gt;
* 每条定义对&amp;#039;&amp;#039;&amp;#039;两个性别&amp;#039;&amp;#039;&amp;#039;都要能找到对应模型，且模型的性别列与之一致；&amp;lt;code&amp;gt;visible=1&amp;lt;/code&amp;gt; 的定义还必须满足 物品&amp;gt;0、数量&amp;gt;0、费用≥0。&lt;br /&gt;
&lt;br /&gt;
== 定义表：Exterior_Face / Exterior_Hair / Exterior_Head ==&lt;br /&gt;
三张表同构，样本分别 102、151、40 行。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:10%&amp;quot; | 列&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:22%&amp;quot; | 内容&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 说明&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 外观 ID || 主键，正数不重复。&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 女性模型编号 || 指向同主题模型表的行（CharFaceGeo / CharHairGeo / CharHead）。&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 男性模型编号 || 同上，男女分开两列，不靠性别列切换。&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 分类 || 界面分组用。&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 是否上架 || 只能 0 或 1。0 表示存在但不许选用。&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 排序权重 || 列表排序按权重大的在前。&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 门派限制 || 负数表示全门派可用；否则必须等于角色门派编号才显示。&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 描述文本 || 脸型与发型有；头像表只有 7 列，没有这一列。&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 物品名 || 只有发型表有（第 9 列），脸型表到第 8 列为止。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 模型表：CharFaceGeo / CharHairGeo / CharHead ==&lt;br /&gt;
三张表同构，样本分别 216、316、80 行。&amp;#039;&amp;#039;&amp;#039;同一张模型表里男女条目混放&amp;#039;&amp;#039;&amp;#039;，靠第 2 列性别区分。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:10%&amp;quot; | 列&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:22%&amp;quot; | 内容&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 说明&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 模型 ID || 主键，可负（加载器允许 id&amp;lt;0，只查重）。&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 性别 || 0 女 1 男。定义表按性别取对应模型，取错性别 Valid 直接失败。&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 名称 || 脸型在第 3 列、发型在第 4 列、其余主题在第 2 列——&amp;#039;&amp;#039;&amp;#039;列位不统一&amp;#039;&amp;#039;&amp;#039;，按 &amp;lt;code&amp;gt;ExteriorTables.h&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; 取法核对。&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 网格 mesh || 脸型/发型有；头像没有。&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 材质 || 脸型在第 4 列，发型与头像在第 5 列。&lt;br /&gt;
|-&lt;br /&gt;
| 6–8 || 兑换三件套 || 物品编号、数量、选择类型（脸型从第 5 列起、发型从第 7 列起、其余从第 3 列起——同样不统一）。&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 图标 || 紧跟兑换三件套之后。&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 费用 || 图标后一列，≥0。&lt;br /&gt;
|-&lt;br /&gt;
| 末列 || 对立性别模型 || 指向另一性别的对应模型；脸型表是第 11 列、发型表第 13 列、头像表第 11 列。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
发型表额外两列（第 4 列第二网格、第 7 列第二材质）用于双网格发型；修改时注意它比脸型表宽 2 列。&lt;br /&gt;
&lt;br /&gt;
== 客户端五张表 ==&lt;br /&gt;
这些表 Game.exe 自己读，服务端不读；改玩家看到的外观要同步客户端资源（按 &amp;lt;code&amp;gt;Client/Bin/FairyResources.cfg&amp;lt;/code&amp;gt; 的 [General] 定位）。&lt;br /&gt;
&lt;br /&gt;
=== CharacterFace.txt（头像，6 列 80 行）===&lt;br /&gt;
客户端 &amp;lt;code&amp;gt;DBC_CHARACTER_FACE&amp;lt;/code&amp;gt; 注册（实现位于 &amp;lt;code&amp;gt;Client/Game/DBC/GMDataBase.cpp&amp;lt;/code&amp;gt;），解码函数 &amp;lt;code&amp;gt;DecodeCharacterFaceGeometry&amp;lt;/code&amp;gt;（实现位于 &amp;lt;code&amp;gt;Client/Common/TDCharacterFaceGeometry.h&amp;lt;/code&amp;gt;）。样本列为 编号、性别、&amp;lt;code&amp;gt;set:GirlProtagonist image:GirlProtagonist_1&amp;lt;/code&amp;gt; 形式的资源串、两个整数、尾部资源串。列数与类型由 &amp;lt;code&amp;gt;IsCharacterFaceGeometryLayout&amp;lt;/code&amp;gt; 校验，不符直接抛异常。&lt;br /&gt;
&lt;br /&gt;
=== EquipDress.txt（时装外观，7 或 8 列，样本 8 列 173 行）===&lt;br /&gt;
客户端 &amp;lt;code&amp;gt;DBC_EQUIP_DRESS&amp;lt;/code&amp;gt;（编号 121）。七列是官服布局，八列是本项目扩展：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:10%&amp;quot; | 列&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; style=&amp;quot;width:22%&amp;quot; | 内容&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | 说明&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 时装 ID || 主键。&lt;br /&gt;
|-&lt;br /&gt;
| 2–5 || 四槽视觉 || 帽子、身体、手臂、鞋各一列，-1 表示该槽不覆盖。&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 披风 || 仅八列布局读取；无披风置 INVALID_ID。&lt;br /&gt;
|-&lt;br /&gt;
| 倒数第 2 || 材质序号 || 每种性别 1..10。&lt;br /&gt;
|-&lt;br /&gt;
| 末列 || 基础时装 ID || 样本末列与首列相同。&lt;br /&gt;
|}&lt;br /&gt;
列数不是 7 或 8 时客户端 &amp;lt;code&amp;gt;TDThrow&amp;lt;/code&amp;gt; 拒绝加载（实现位于 &amp;lt;code&amp;gt;GMDataBase.cpp&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;IsEquipDressLayout&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
=== SpecialDressEffect.txt（时装特效，5 列 12 行）===&lt;br /&gt;
客户端 &amp;lt;code&amp;gt;Obj_PlayerOther.cpp&amp;lt;/code&amp;gt; 用 &amp;lt;code&amp;gt;Util_OpenDBCFromTxt&amp;lt;/code&amp;gt; 打开，&amp;#039;&amp;#039;&amp;#039;必须正好 5 列&amp;#039;&amp;#039;&amp;#039;否则抛异常。列为 特效 ID、女性绑点串、男性绑点串、颜色（FFFFFFFF）、名称。样本形如 &amp;lt;code&amp;gt;256 时装_宝石白蛇传_女腰:身体中心点, 时装_宝石白蛇传_男腰:身体中心点, FFFFFFFF 七夕时装&amp;lt;/code&amp;gt;；同一行可挂多个绑点，用逗号分隔。&lt;br /&gt;
&lt;br /&gt;
=== NumberingFashion.txt（编号时装，4 列 300 行）===&lt;br /&gt;
300 行分三个连续物品区间：10125382–10125481（编号 1–100）、10126034–10126133（101–200）、10126751–10126850（201–300）。列为 编号、物品号、组内序号、提示文本键（如 &amp;lt;code&amp;gt;#{SZBH_231103_01}&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;注意&amp;#039;&amp;#039;&amp;#039;：服务端 Lua 接口 &amp;lt;code&amp;gt;LuaFnGetNumberingFashionCode&amp;lt;/code&amp;gt;（实现位于 &amp;lt;code&amp;gt;Server/Script/LuaFnTbl_Exterior.h&amp;lt;/code&amp;gt;）把这三段区间&amp;#039;&amp;#039;&amp;#039;硬编码在代码里&amp;#039;&amp;#039;&amp;#039;，并不读这个文件；客户端 &amp;lt;code&amp;gt;ExteriorLua.cpp&amp;lt;/code&amp;gt; 另有编号时装的视觉与动作查询函数。改区间要同时改代码和表，只改表不生效。&lt;br /&gt;
&lt;br /&gt;
=== DressColorSpecial.txt（空样本）===&lt;br /&gt;
只有两行表头（INT、STRING），没有数据行；当前检索未发现读取它的代码。属于预留样本。&lt;br /&gt;
&lt;br /&gt;
== 修改清单 ==&lt;br /&gt;
* 加一种新脸型：模型表加男女各一行（性别列 0/1 各一），定义表加一行指向两个模型编号，&amp;lt;code&amp;gt;visible&amp;lt;/code&amp;gt;、物品、数量、费用填全，否则 Valid 失败。&lt;br /&gt;
* 让某脸型只对一个门派可见：定义表第 7 列填门派编号（负数=全门派）。&lt;br /&gt;
* 男女模型不要混用：定义表按性别取模型，模型表性别列必须匹配。&lt;br /&gt;
* 客户端外观不同步时，玩家看到的还是旧资源；改完服务端表还要按客户端资源更新流程替换 &amp;lt;code&amp;gt;Client/Data/Config&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;Config.axp&amp;lt;/code&amp;gt; 内同名文件并重启 Game.exe。&lt;br /&gt;
&lt;br /&gt;
[[Category:工程参考]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Waylee</name></author>
	</entry>
</feed>