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

