装备改名的底层逻辑涉及两个层面:数据库层面的Name字段存储装备的原始名称,脚本层面的ChangeItemName命令在运行时动态覆盖该名称。玩家在NPC处输入的字符通过变量传递到ChangeItemName命令的第二个参数,即可将穿戴在身上的装备显示名称替换为自定义文本,原始数据库记录不受影响,卸下装备后名称自动恢复。
##StdItems.DB中的装备名称字段
装备的名称存储在服务端StdItems.DB数据库的Name字段中。该数据库为DBase格式,使用DBC2000或引擎自带的DB编辑器打开后,每一行对应一件装备,Name字段即为装备的显示名称。Idx字段是装备的唯一编号,修改名称时不要动Idx,只替换Name字段的内容即可。部分引擎使用ItemName作为字段名,编写批量修改工具前需确认目标服务端的实际字段名称。
ChangeItemName命令修改的是运行时内存中的装备显示名称,不回写数据库。服务器重启后所有改名效果消失,装备恢复为Name字段中的原始名称。如果需要永久改名,必须直接编辑StdItems.DB中对应装备的Name字段。
##ChangeItemName命令参数详解
ChangeItemName是装备改名的核心命令,完整格式为:ChangeItemName物品位置(0-16)名字(不写就是恢复原始名字)。第一个参数指定装备穿戴位置,0为盔甲,1为武器,2为勋章,3为项链,4为头盔,5为左手镯,6为右手镯,7为左戒指,8为右戒指,9为护身符,10为腰带,11为靴子,12为宝石。
位置参数填写-1时,命令作用于当前关联的物品。该参数在拾取触发和OK框脚本中使用频率最高。例如在捡取触发中,ChangeItemName-1屠龙改名表示将刚捡起的物品显示名称改为“屠龙改名”。
第二个参数留空时,命令将装备名称恢复为数据库中的原始名称。这一特性常用于临时改名后的还原操作。参数中可以使用变量拼接,例如ChangeItemName4<$HELMET>Ⅰ级鉴定(普通)将头盔名称改为“原头盔名+Ⅰ级鉴定(普通)”的拼接结果。
ChangeItemName修改的是名称文本,不改变装备的外观、属性、ID和数据库记录。检查改名后的装备时,CHECKITEM命令的第四个参数需设置为1才能检测到改名后的装备名称,参数为空或0时只匹配数据库中的原始名称。
##@@useitemname触发标签机制
@@useitemname是装备改名NPC脚本的入口标签。该标签由引擎内核解析,格式为@@useitemnameX,其中X为装备位置的预设编号。引擎定义了一套硬编码的装备位编号体系,0对应盔甲,1对应武器,2对应勋章,依次类推到12对应宝石。
NPC对话中通过菜单项触发对应的@@useitemname标签。脚本写法如下:
[@main]
请选择要改名的装备:(将要改名的装备戴身上)
◇◇◇『<盔甲/@@useitemname0>』◇◇◇『<武器/@@useitemname1>』◇◇◇
◇◇◇『<勋章/@@useitemname2>』◇◇◇『<项链/@@useitemname3>』◇◇◇
◇◇◇『<头盔/@@useitemname4>』◇◇◇『<左手镯/@@useitemname5>』◇◇◇
◇◇◇『<右手镯/@@useitemname6>』◇◇◇『<左戒指/@@useitemname7>』◇◇◇
◇◇◇『<右戒指/@@useitemname8>』◇◇◇『<护身符/@@useitemname9>』◇◇◇
<离开/@exit>
[@ChangeName]
#ACT
ChangeItemName0<$STR(S0)>
SendMsg7改名成功!!!
break
玩家点击“盔甲”后进入@@useitemname0标签,该标签自动检测盔甲位置的装备并弹出文本输入框。玩家输入新名称后,输入内容存入变量S0,脚本通过ChangeItemName0<$STR(S0)>将盔甲的名称替换为输入内容。
##完整NPC改名脚本与条件检测
以下是一个带条件检测的完整NPC脚本,放置在Envir\Market_def目录下的RenameEquip.txt文件中:
[@main]
SAY我可以为你手中的装备赋予新名字,每次改名消耗一个魔龙通宝。
请选择要改名的装备:(将要改名的装备戴身上)
<盔甲/@@useitemname0><武器/@@useitemname1><勋章/@@useitemname2>
<项链/@@useitemname3><头盔/@@useitemname4><左手镯/@@useitemname5>
<右手镯/@@useitemname6><左戒指/@@useitemname7><右戒指/@@useitemname8>
<离开/@exit>
[@@useitemname0]
#IF
CHECKITEM魔龙通宝1
#ACT
take魔龙通宝1
goto@ChangeName
#ELSEACT
SendMsg6你没有魔龙通宝,无法进行改名操作。
break
[@ChangeName]
#ACT
ChangeItemName0<$STR(S0)>
SETSCRIPTFLAG11
SendMsg7改名成功!!!
break
这段脚本的逻辑是:点击盔甲选项后首先检测玩家包裹中是否有魔龙通宝,有则扣除一个道具并跳转到改名标签,没有则弹出提示并终止操作。SETSCRIPTFLAG11命令用于刷新脚本标记,确保改名后的名称能及时在客户端显示。
##多引擎命令差异与适配
GOM引擎的ChangeItemName命令参数与通用格式一致,位置参数支持0到16。GOM引擎的ESP插件扩展了ESPCHANGEITEMNAME命令,专用于时装首饰装备改名,参数一为时装首饰装备位置,参数二为新名字,留空即还原名字。
GEE引擎的装备改名后的名字变量体系与GOM不同,使用<$G_DRESS>获取衣服的改名名称,<$G_WEAPON>获取武器的改名名称,<$G_RIGHTHAND>获取蜡烛位置的改名名称,<$G_HELMET>获取头盔的改名名称。在检测改名后的装备时需要切换到对应的引擎专用变量。
HERO引擎的@@useitemname标签机制与其他引擎基本一致,但ChangeItemName命令的参数格式存在差异,部分HERO版本中第二个参数需要使用$STR()包裹变量,直接使用<$STR(S0)>以外的格式可能导致改名失败。
HX引擎的@@useitemname触发标签支持完整的装备位编号体系,但ChangeItemName命令的位置参数在某些版本中仅支持0到12,超出范围的位置参数会被忽略。
##捡取触发中的自动改名脚本
在QFunction-0.txt的捡取触发段落中,可以实现捡起装备后自动添加鉴定前缀的改名效果。触发标签为[@PickUpItemEX],该标签在玩家捡起地面物品时自动执行。
[@PickUpItemEX]
#IF
CHECKITEMADDVALUE-1>0
#ACT
LINKPICKUPITEM
ChangeItemName-1<$CurItemName>{(极品)}
UpdateItem-1
break
这段脚本的逻辑是:捡起物品后通过CHECKITEMADDVALUE检测该物品是否有附加属性,有则通过LINKPICKUPITEM关联该物品,然后使用ChangeItemName-1将物品名称改为“原名称+(极品)”的格式,最后通过UpdateItem刷新物品显示。
GEE引擎中捡取触发的改名脚本需要注意刷新问题。改名后如果背包中的物品名称没有及时更新,需要在ChangeItemName命令后追加clearLinkItem命令。身上装备和OK框中的物品不需要此命令,但背包中的物品因为没有被关联到任何位置,必须手动清除关联才能刷新显示。
##改名名称长度限制与特殊字符处理
玩家输入的装备名称长度需要限制在客户端能够正确渲染的范围内。建议在脚本中加入长度检测,名称超过14个汉字或28个英文字符时拒绝改名操作。检测方式为在ChangeItemName命令之前先通过StrLen命令计算输入字符串的长度。
[@ChangeName]
#IF
StrLen<$STR(S0)><29
#ACT
ChangeItemName0<$STR(S0)>
SETSCRIPTFLAG11
SendMsg7改名成功!!!
#ELSEACT
SendMsg6名称过长,请控制在14个汉字以内。
break
特殊字符的处理同样需要在脚本层面进行拦截。管道符“|”和反斜杠“\”在客户端渲染时会与排版代码冲突,导致装备名称显示错乱或界面异常。检测方式为使用CheckContainsString命令扫描输入字符串中是否包含这些字符:
#IF
CheckContainsString<$STR(S0)>|
#ACT
SendMsg6名称中不允许使用特殊符号。
break
引擎层面也有限制机制。部分引擎的客户端设置中提供名称长度上限参数,在M2的客户端设置面板中找到装备名称显示长度选项,将最大值设置为14个汉字对应的字节数。超过该长度的名称会被客户端自动截断,但服务端脚本中的变量仍然保存完整内容,可能导致检测逻辑与实际显示不一致。
##改名后属性检测与变量获取
装备改名后,CHECKITEM命令的第四个参数控制是否匹配改名后的名称。参数设置为1时检测改名后的装备,设置为0或留空时只检测数据库中的原始名称。例如将木剑改名为“大木剑”后,CHECKITEM大木剑11可以检测到该物品,但CHECKITEM木剑1仍然返回真值,因为数据库中的原始名称未被修改。
GOM引擎提供GetUserItemName命令获取改名后的装备字符串。该命令格式为GetUserItemName位置存入变量,位置参数-1表示关联物品,0到12表示穿戴位置。在捡取触发中使用该命令获取刚捡起物品的改名名称时,需要确保LINKPICKUPITEM命令已正确执行,否则命令会报错“脚本错误”并返回空值。
部分引擎的GetItemNameByMakeIndex命令只能获取物品的初始数据库名称,无法读取ChangeItemName设置的改名名称。需要在脚本中使用<$CurItemName>变量来获取当前物品的显示名称,该变量在关联物品后会自动更新为改名后的文本。
##脚本编码与常见报错排查
改名脚本编写完成后,首先确认文件编码为ANSI格式。用UTF-8保存的脚本文件在部分引擎中无法被正确解析,@@useitemname标签不会被识别,点击菜单项后没有任何反应。
ChangeItemName命令执行后装备名称没有变化,排查顺序为:确认位置参数是否正确对应穿戴栏位,检查变量S0是否被正确赋值(在ChangeItemName命令前插入SendMsg6输入值为<$STR(S0)>进行调试输出),确认目标装备确实穿戴在指定位置上。位置参数对应的栏位没有装备时,ChangeItemName命令会被静默忽略,不产生任何效果也不报错。
改名后装备名称显示为空白或乱码,检查StdItems.DB中装备的原始Name字段是否包含特殊字符,以及ChangeItemName命令中的变量拼接是否存在语法错误。变量拼接时需要在变量名前后加上正确的分隔符,格式为ChangeItemName0<$STR(S0)>而非ChangeItemName0<$STR(S0)>,后者缺少空格会导致引擎将S0后面的内容一并解析为变量名。
##StdItems.DB中的装备名称字段
装备的名称存储在服务端StdItems.DB数据库的Name字段中。该数据库为DBase格式,使用DBC2000或引擎自带的DB编辑器打开后,每一行对应一件装备,Name字段即为装备的显示名称。Idx字段是装备的唯一编号,修改名称时不要动Idx,只替换Name字段的内容即可。部分引擎使用ItemName作为字段名,编写批量修改工具前需确认目标服务端的实际字段名称。
ChangeItemName命令修改的是运行时内存中的装备显示名称,不回写数据库。服务器重启后所有改名效果消失,装备恢复为Name字段中的原始名称。如果需要永久改名,必须直接编辑StdItems.DB中对应装备的Name字段。
##ChangeItemName命令参数详解
ChangeItemName是装备改名的核心命令,完整格式为:ChangeItemName物品位置(0-16)名字(不写就是恢复原始名字)。第一个参数指定装备穿戴位置,0为盔甲,1为武器,2为勋章,3为项链,4为头盔,5为左手镯,6为右手镯,7为左戒指,8为右戒指,9为护身符,10为腰带,11为靴子,12为宝石。
位置参数填写-1时,命令作用于当前关联的物品。该参数在拾取触发和OK框脚本中使用频率最高。例如在捡取触发中,ChangeItemName-1屠龙改名表示将刚捡起的物品显示名称改为“屠龙改名”。
第二个参数留空时,命令将装备名称恢复为数据库中的原始名称。这一特性常用于临时改名后的还原操作。参数中可以使用变量拼接,例如ChangeItemName4<$HELMET>Ⅰ级鉴定(普通)将头盔名称改为“原头盔名+Ⅰ级鉴定(普通)”的拼接结果。
ChangeItemName修改的是名称文本,不改变装备的外观、属性、ID和数据库记录。检查改名后的装备时,CHECKITEM命令的第四个参数需设置为1才能检测到改名后的装备名称,参数为空或0时只匹配数据库中的原始名称。
##@@useitemname触发标签机制
@@useitemname是装备改名NPC脚本的入口标签。该标签由引擎内核解析,格式为@@useitemnameX,其中X为装备位置的预设编号。引擎定义了一套硬编码的装备位编号体系,0对应盔甲,1对应武器,2对应勋章,依次类推到12对应宝石。
NPC对话中通过菜单项触发对应的@@useitemname标签。脚本写法如下:
[@main]
请选择要改名的装备:(将要改名的装备戴身上)
◇◇◇『<盔甲/@@useitemname0>』◇◇◇『<武器/@@useitemname1>』◇◇◇
◇◇◇『<勋章/@@useitemname2>』◇◇◇『<项链/@@useitemname3>』◇◇◇
◇◇◇『<头盔/@@useitemname4>』◇◇◇『<左手镯/@@useitemname5>』◇◇◇
◇◇◇『<右手镯/@@useitemname6>』◇◇◇『<左戒指/@@useitemname7>』◇◇◇
◇◇◇『<右戒指/@@useitemname8>』◇◇◇『<护身符/@@useitemname9>』◇◇◇
<离开/@exit>
[@ChangeName]
#ACT
ChangeItemName0<$STR(S0)>
SendMsg7改名成功!!!
break
玩家点击“盔甲”后进入@@useitemname0标签,该标签自动检测盔甲位置的装备并弹出文本输入框。玩家输入新名称后,输入内容存入变量S0,脚本通过ChangeItemName0<$STR(S0)>将盔甲的名称替换为输入内容。
##完整NPC改名脚本与条件检测
以下是一个带条件检测的完整NPC脚本,放置在Envir\Market_def目录下的RenameEquip.txt文件中:
[@main]
SAY我可以为你手中的装备赋予新名字,每次改名消耗一个魔龙通宝。
请选择要改名的装备:(将要改名的装备戴身上)
<盔甲/@@useitemname0><武器/@@useitemname1><勋章/@@useitemname2>
<项链/@@useitemname3><头盔/@@useitemname4><左手镯/@@useitemname5>
<右手镯/@@useitemname6><左戒指/@@useitemname7><右戒指/@@useitemname8>
<离开/@exit>
[@@useitemname0]
#IF
CHECKITEM魔龙通宝1
#ACT
take魔龙通宝1
goto@ChangeName
#ELSEACT
SendMsg6你没有魔龙通宝,无法进行改名操作。
break
[@ChangeName]
#ACT
ChangeItemName0<$STR(S0)>
SETSCRIPTFLAG11
SendMsg7改名成功!!!
break
这段脚本的逻辑是:点击盔甲选项后首先检测玩家包裹中是否有魔龙通宝,有则扣除一个道具并跳转到改名标签,没有则弹出提示并终止操作。SETSCRIPTFLAG11命令用于刷新脚本标记,确保改名后的名称能及时在客户端显示。
##多引擎命令差异与适配
GOM引擎的ChangeItemName命令参数与通用格式一致,位置参数支持0到16。GOM引擎的ESP插件扩展了ESPCHANGEITEMNAME命令,专用于时装首饰装备改名,参数一为时装首饰装备位置,参数二为新名字,留空即还原名字。
GEE引擎的装备改名后的名字变量体系与GOM不同,使用<$G_DRESS>获取衣服的改名名称,<$G_WEAPON>获取武器的改名名称,<$G_RIGHTHAND>获取蜡烛位置的改名名称,<$G_HELMET>获取头盔的改名名称。在检测改名后的装备时需要切换到对应的引擎专用变量。
HERO引擎的@@useitemname标签机制与其他引擎基本一致,但ChangeItemName命令的参数格式存在差异,部分HERO版本中第二个参数需要使用$STR()包裹变量,直接使用<$STR(S0)>以外的格式可能导致改名失败。
HX引擎的@@useitemname触发标签支持完整的装备位编号体系,但ChangeItemName命令的位置参数在某些版本中仅支持0到12,超出范围的位置参数会被忽略。
##捡取触发中的自动改名脚本
在QFunction-0.txt的捡取触发段落中,可以实现捡起装备后自动添加鉴定前缀的改名效果。触发标签为[@PickUpItemEX],该标签在玩家捡起地面物品时自动执行。
[@PickUpItemEX]
#IF
CHECKITEMADDVALUE-1>0
#ACT
LINKPICKUPITEM
ChangeItemName-1<$CurItemName>{(极品)}
UpdateItem-1
break
这段脚本的逻辑是:捡起物品后通过CHECKITEMADDVALUE检测该物品是否有附加属性,有则通过LINKPICKUPITEM关联该物品,然后使用ChangeItemName-1将物品名称改为“原名称+(极品)”的格式,最后通过UpdateItem刷新物品显示。
GEE引擎中捡取触发的改名脚本需要注意刷新问题。改名后如果背包中的物品名称没有及时更新,需要在ChangeItemName命令后追加clearLinkItem命令。身上装备和OK框中的物品不需要此命令,但背包中的物品因为没有被关联到任何位置,必须手动清除关联才能刷新显示。
##改名名称长度限制与特殊字符处理
玩家输入的装备名称长度需要限制在客户端能够正确渲染的范围内。建议在脚本中加入长度检测,名称超过14个汉字或28个英文字符时拒绝改名操作。检测方式为在ChangeItemName命令之前先通过StrLen命令计算输入字符串的长度。
[@ChangeName]
#IF
StrLen<$STR(S0)><29
#ACT
ChangeItemName0<$STR(S0)>
SETSCRIPTFLAG11
SendMsg7改名成功!!!
#ELSEACT
SendMsg6名称过长,请控制在14个汉字以内。
break
特殊字符的处理同样需要在脚本层面进行拦截。管道符“|”和反斜杠“\”在客户端渲染时会与排版代码冲突,导致装备名称显示错乱或界面异常。检测方式为使用CheckContainsString命令扫描输入字符串中是否包含这些字符:
#IF
CheckContainsString<$STR(S0)>|
#ACT
SendMsg6名称中不允许使用特殊符号。
break
引擎层面也有限制机制。部分引擎的客户端设置中提供名称长度上限参数,在M2的客户端设置面板中找到装备名称显示长度选项,将最大值设置为14个汉字对应的字节数。超过该长度的名称会被客户端自动截断,但服务端脚本中的变量仍然保存完整内容,可能导致检测逻辑与实际显示不一致。
##改名后属性检测与变量获取
装备改名后,CHECKITEM命令的第四个参数控制是否匹配改名后的名称。参数设置为1时检测改名后的装备,设置为0或留空时只检测数据库中的原始名称。例如将木剑改名为“大木剑”后,CHECKITEM大木剑11可以检测到该物品,但CHECKITEM木剑1仍然返回真值,因为数据库中的原始名称未被修改。
GOM引擎提供GetUserItemName命令获取改名后的装备字符串。该命令格式为GetUserItemName位置存入变量,位置参数-1表示关联物品,0到12表示穿戴位置。在捡取触发中使用该命令获取刚捡起物品的改名名称时,需要确保LINKPICKUPITEM命令已正确执行,否则命令会报错“脚本错误”并返回空值。
部分引擎的GetItemNameByMakeIndex命令只能获取物品的初始数据库名称,无法读取ChangeItemName设置的改名名称。需要在脚本中使用<$CurItemName>变量来获取当前物品的显示名称,该变量在关联物品后会自动更新为改名后的文本。
##脚本编码与常见报错排查
改名脚本编写完成后,首先确认文件编码为ANSI格式。用UTF-8保存的脚本文件在部分引擎中无法被正确解析,@@useitemname标签不会被识别,点击菜单项后没有任何反应。
ChangeItemName命令执行后装备名称没有变化,排查顺序为:确认位置参数是否正确对应穿戴栏位,检查变量S0是否被正确赋值(在ChangeItemName命令前插入SendMsg6输入值为<$STR(S0)>进行调试输出),确认目标装备确实穿戴在指定位置上。位置参数对应的栏位没有装备时,ChangeItemName命令会被静默忽略,不产生任何效果也不报错。
改名后装备名称显示为空白或乱码,检查StdItems.DB中装备的原始Name字段是否包含特殊字符,以及ChangeItemName命令中的变量拼接是否存在语法错误。变量拼接时需要在变量名前后加上正确的分隔符,格式为ChangeItemName0<$STR(S0)>而非ChangeItemName0<$STR(S0)>,后者缺少空格会导致引擎将S0后面的内容一并解析为变量名。

