GO传奇服务端时装系统全链路:StdMode位置映射与ShowFashion外显控制实战

来源: 作者: 点击:
GO(Golang)系传奇服务端(GOM/3K/Hero/翎风等共用一套约定)的时装系统不是独立子系统,而是“物品DB标识 + 装备槽位 + 客户端补丁 + NPC脚本命令 + QF事件钩子”五段拼起来的外观层。属性走普通装备字段(AC/DC/MAC/MC/SC/DuraMax),外观走 Shape/Looks → 客户端 wzl/pak 索引,外显开关走 ShowFashion / ESPSHOWFASHION 命令,穿戴事件走 [@TakeOn17] / [@TakeOff18] 这类位置回调。任一段断开,结果就是“有属性没模型”或“有模型全服强制显示”。

一、物品DB层:StdMode 与位置代码对照(StdItems.DB / Items.DB)
时装不单建表,沿用 StdItems.DB,靠 StdMode + Shape(位置代码)区分:
位置代码(装备槽):17 时装衣、18 时装武器、19 时装项链、20 时装头盔、21 时装左镯、22 时装右镯、23 时装左戒、24 时装右戒、25 时装勋章、26 时装腰带、27 时装鞋、28 时装宝石
StdMode 分类:
• 66 男时装衣 / 67 女时装衣

• 68 男时装武器 / 69 女时装武器

• 75/76/77 时装项链、78 时装头盔、79/80 时装手镯、81/82 时装戒指、83 时装勋章、84/85 腰带、86/87 鞋、88/89 宝石

其余字段(Name、DC、MC、SC、AC、MAC、Weight、DuraMax、Shape、Looks、Reserved)与普通装备一致;Shape 填客户端时装模型索引,Looks 填特效编号;名称前加 [时装] 前缀需在 !Setup.txt 声明 FashionPreFix=[时装]

二、客户端补丁与界面资源(表现层)
• 人物/武器外观:wzl/pak 内 mon/hero 系列索引,Shape 直接映射

• 界面背景图:NewopUI.pak 内 1590~1591 主角时装界面、1592~1593 英雄时装界面、1594~1595 连击界面、1596~1597 归来界面,UI编辑器改不了,只能 PAK 工具替换

- M2 开关:M2 → 选项 → 客户端设置 → 内控制(二) → “隐藏时装”切勿勾选,勾了整个时装界面不渲染

三、穿戴/卸下事件钩子(QF / QuestDiary)
佩戴时装衣(槽17)触发 [@TakeOn17],卸下触发 [@TakeOff17];时装武器(槽18)对应 [@TakeOn18] / [@TakeOff18]。可在此挂属性追加、特效、公告、限时时装倒计时:
[@TakeOn17]
#IF
CHECKITEMTYPE 17 66
#ACT
SENDMSG 6 你穿上了时装[<$STR(S0)>],属性已生效!
SET [HUMAN 时装状态] 1

[@TakeOff17]
#ACT
SENDMSG 6 时装已脱下,外观恢复默认。
SET [HUMAN 时装状态] 0

CHECKITEMTYPE 17 66 表示“当前17槽物品 StdMode=66(男时装衣)”,用于多槽位分支判断。

四、外显总开关:ShowFashion / ESPSHOWFASHION
核心命令(NPC #ACT 段执行):
- ShowFashion 1 开人物时装外显 / ShowFashion 0 关
• HeroShowFashion 1|0 英雄(英雄版)外显开关

- ESPSHOWFASHION 1|0 部分 ESP 插件扩展命令,效果同 ShowFashion,仅切显示不脱装备不丢属性
切换即时生效,周围玩家客户端重发 SM_CHARSTATUSCHANGED / 外观包刷新。
QF 联动钩子(M2 内控制勾选“外显时装生效触发QF”后激活):
• 开显:人物 @ShowFashion、英雄 @HeroShowFashion

- 关显:人物 @NotShowFashion、英雄 @HeroNotShowFashion

五、完整NPC实战:时装领取+试穿+外显切换
文件:Envir\Market_Def\时装管理员-0.txt,Merchant.txt 注册到土城安全区
[@Main]
时装管理员\ \
<领取[烈焰凤羽]时装衣/@GetFashionCoat>\
<领取[苍穹斩月]时装武器/@GetFashionWeapon>\
<试穿当前时装/@TryShow>\
<隐藏时装外观/@HideFashion>\
<恢复时装外观/@ShowFashionBack>\
<离开/@Exit>\

[@GetFashionCoat]
#IF
CHECKVAR HUMAN 已领时装衣 1
#ACT
SENDMSG 6 你已领取过时装衣!
CLOSE
#ELSE
#ACT
GIVE 烈焰凤羽 1
SET [HUMAN 已领时装衣] 1
SENDMSG 6 已获得时装衣[烈焰凤羽],双击穿戴!
CLOSE

[@GetFashionWeapon]
#IF
CHECKVAR HUMAN 已领时装武 1
#ACT
SENDMSG 6 你已领取过时装武器!
CLOSE
#ELSE
#ACT
GIVE 苍穹斩月 1
SET [HUMAN 已领时装武] 1
SENDMSG 6 已获得时装武器[苍穹斩月],双击穿戴!
CLOSE

[@TryShow]
#ACT
ShowFashion 1
SENDMSG 6 时装外显已开启,周围玩家可见!
CLOSE

[@HideFashion]
#ACT
ShowFashion 0
SENDMSG 6 时装外显已隐藏,仅自己可见属性!
CLOSE

[@ShowFashionBack]
#ACT
ShowFashion 1
CLOSE

QF(QFunction-0.txt)追加:
[@ShowFashion]
#ACT
SENDMSG 6 外显状态:开

[@NotShowFashion]
#ACT
SENDMSG 6 外显状态:关


六、限时时装与商业化扩展
DB 加字段或借 Human 变量存到期时间戳,登录钩子(QManage.txt [@Login])判定:
#IF
CHECKTIME < $DATETIME > < $STR(HUMAN 时装到期)]
#ACT
TAKE 烈焰凤羽 1
ShowFashion 0
SENDMSG 6 限时时装已过期自动回收。

染色、套装光效、英雄独立时装同理挂变量+QF。

七、排错硬点
• 穿上有属性但别人看不见:M2 内控制(二)“隐藏时装”被勾、或 ShowFashion 0、或 NewopUI.pak 缺 1590+ 资源

- 槽位错乱:位置代码必须 17~28 连续,跳号客户端渲染异常
• StdMode 写反:男角色穿 StdMode=67(女衣)不进 [@TakeOn17] 或模型错位

• Shape 指向空图:客户端缺 wzl/pak 索引,显示透明或默认布衣

- 英雄不显:忘了发 HeroShowFashion 1,人物 ShowFashion 不影响英雄
• 前缀不显示:[!Setup.txt] 漏写 FashionPreFix=[时装]

时装系统的本质是把“装备属性”和“渲染模型”拆成两条线——DB 的 StdMode/Shape 决定它是什么、穿在哪,ShowFashion 决定别人看不看得到,[@TakeOn17] 决定穿脱时跑什么逻辑;三线对齐,外显、属性、事件才同步。