你原脚本的问题很清楚:所有 @@useitemname0~12 都直接 goto @ChangeName,而 @ChangeName 里只检测了 checkgamegold>0,没有检测“对应穿戴位有没有东西”。引擎在没装备时执行 SETSCRIPTFLAG 1 1 并不会报错,所以会出现扣虚拟币还弹“改名成功”的假象。解决思路是把检测提前到每个位置标签里,没戴就拦截,不进扣费段。
一、先改:每个位置单独检测,没戴装备直接提示失败
把原来那一串统一跳转改成下面这种写法(以盔甲0、武器1、项链3为例,其余照抄改编号):
[@main]
请选择要改名的装备:(将要改名的装备戴身上)\
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\
◇◇◇『<盔 甲/@@useitemname0>』◇◇◇『<武 器/@@useitemname1>』◇◇◇\
◇◇◇『<项 链/@@useitemname3>』◇◇◇『<头 盔/@@useitemname4>』◇◇◇\
◇◇◇『<左手镯/@@useitemname5>』◇◇◇『<右手镯/@@useitemname6>』◇◇◇\
◇◇◇『<左戒指/@@useitemname8>』◇◇◇『<右戒指/@@useitemname7>』◇◇◇\
◇◇◇『<勋 章/@@useitemname2>』\
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\
〖<返回/@main>〗 〖<关闭/@exit>〗
[@@useitemname0]
IF
CHECKITEMW 0
ACT
GOTO @DoChange0
ELSEACT
SENDMSG 7 你没有佩戴盔甲,无法改名!
CLOSE
[@@useitemname1]
IF
CHECKITEMW 1
ACT
GOTO @DoChange1
ELSEACT
SENDMSG 7 你没有佩戴武器,无法改名!
CLOSE
[@@useitemname2]
IF
CHECKITEMW 2
ACT
GOTO @DoChange2
ELSEACT
SENDMSG 7 你没有佩戴勋章,无法改名!
CLOSE
[@@useitemname3]
IF
CHECKITEMW 3
ACT
GOTO @DoChange3
ELSEACT
SENDMSG 7 你没有佩戴项链,无法改名!
CLOSE
[@@useitemname4]
IF
CHECKITEMW 4
ACT
GOTO @DoChange4
ELSEACT
SENDMSG 7 你没有佩戴头盔,无法改名!
CLOSE
[@@useitemname5]
IF
CHECKITEMW 5
ACT
GOTO @DoChange5
ELSEACT
SENDMSG 7 你没有佩戴左手镯,无法改名!
CLOSE
[@@useitemname6]
IF
CHECKITEMW 6
ACT
GOTO @DoChange6
ELSEACT
SENDMSG 7 你没有佩戴右手镯,无法改名!
CLOSE
[@@useitemname7]
IF
CHECKITEMW 7
ACT
GOTO @DoChange7
ELSEACT
SENDMSG 7 你没有佩戴右戒指,无法改名!
CLOSE
[@@useitemname8]
IF
CHECKITEMW 8
ACT
GOTO @DoChange8
ELSEACT
SENDMSG 7 你没有佩戴左戒指,无法改名!
CLOSE
说明:
• CHECKITEMW 0 表示检测盔甲位,1武器、2勋章/灯、3项链、4头盔、5左手镯、6右手镯、7右戒指、8左戒指,按你引擎支持的编号来。
- 如果引擎不支持 CHECKITEMW 数字,改用 CHECKITEMW 物品名 1 或 CHECKPOSITEM 位置 物品名。
• 检测不通过走 #ELSEACT 直接发消息并 CLOSE,根本进不到 @ChangeName,就不会扣钱。
二、扣费改名段改成带双重拦截
[@DoChange0]
IF
CHECKITEMW 0
CHECKGAMEGOLD >= 1
ACT
GAMEGOLD - 1
SETSCRIPTFLAG 1 1
SENDMSG 7 盔甲改名成功!!!
CLOSE
ELSEACT
SENDMSG 7 条件不足,操作失败!(没戴装备或金币不够)
把 @ChangeName 拆成 @DoChange0~12,每个段里先检位置再检钱,顺序不能反。原来那种“先扣钱再猜有没有装备”的逻辑必须废掉。
三、取消装备改名脚本怎么写
取消改名不是删文件,而是把该位置名称还原成数据库默认名。不同引擎命令不同,给你两套通用方案。
方案A:标准 SETSCRIPTFLAG 还原(多数 GOM/GEE/MirNG 适用)
在主菜单加一个“取消改名”入口:
[@main]
(原有改名按钮后加一行)
◇◇◇『<取消改名/@@restorename>』\
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\
〖<返回/@main>〗 〖<关闭/@exit>〗
[@@restorename]
IF
CHECKITEMW 0
CHECKITEMW 1
CHECKITEMW 2
CHECKITEMW 3
CHECKITEMW 4
CHECKITEMW 5
CHECKITEMW 6
CHECKITEMW 7
CHECKITEMW 8
ACT
SETSCRIPTFLAG 1 0
SENDMSG 7 已取消所有装备自定义名称,恢复默认。
CLOSE
ELSEACT
SENDMSG 7 请至少佩戴一件装备后再取消。
CLOSE
SETSCRIPTFLAG 1 0 表示关闭自定义名称功能,客户端会回退到物品原始 StdMode 名称。
方案B:逐位还原(推荐,避免误清全部)
[@@restorename0]
IF CHECKITEMW 0
ACT SETSCRIPTFLAG 1 0 SENDMSG 7 盔甲名称已还原 CLOSE
ELSEACT SENDMSG 7 未佩戴盔甲 CLOSE
[@@restorename1]
IF CHECKITEMW 1
ACT SETSCRIPTFLAG 1 0 SENDMSG 7 武器名称已还原 CLOSE
ELSEACT SENDMSG 7 未佩戴武器 CLOSE
菜单里对应写成 『<还原盔甲/@@restorename0>』 这样,玩家点哪个还原哪个。
方案C:扩展引擎(ESPCHANGEITEMNAME 留空还原)
如果你用的是支持时装扩展位的引擎:
ESPCHANGEITEMNAME 0 "" ;位置0留空即还原默认名
ESPCHANGEITEMNAME 1 ""
直接把第二参数留空就能恢复原始名称。
四、彻底停用整个改名系统的办法
不想让玩家用了,三选一:
1. NPC 对话里删掉所有 @@useitemnameX 按钮,只留“维护中”。
2. M2 里把对应 NPC 脚本文件名改名或移走,重启网关。
3. 全局加权限:在 @ChangeName 开头加 #IF ISADMIN #ACT ... #ELSEACT SENDMSG 7 该功能已关闭 CLOSE,普通号直接被拦。
五、顺手补几个防坑点
- 改名前用 ASK 让玩家输新名字,限制长度(LENA0>8 就拒绝),避免乱码撑爆客户端。
• 改名前用 GETITEMNAME 存原名叫变量,方便以后做“撤销上一步”。
• 检测命令别用 CHECKITEM(只查背包),穿身上必须用 CHECKITEMW 或 CHECKPOSITEM。
- 改完让玩家小退一次,部分客户端不刷新新名字。
按上面把“位置检测”塞进每个 @@useitemname 标签里,没戴装备会直接弹“无法改名”并结束对话,不会再出现扣虚拟币却提示成功的问题;取消改名用 SETSCRIPTFLAG 1 0 或 ESPCHANGEITEMNAME 位置 "" 即可还原默认名。
传奇装备改名脚本未佩戴装备仍提示成功与取消改名写法
来源:
作者:
点击:

