脚本示例

在线改名脚本

人物与英雄在线改名的完整脚本:改名卡消耗、行会/英雄/婚姻前置检查与全部失败回退分支。

用途

在线改人物名与英雄名:消耗改名卡,改名前后检查行会、英雄在线、婚姻状态,成功后做文本变量与 HASH key 的替换,失败则退回改名卡并解锁角色。

注意事项

改名会改动角色数据,强烈建议权限和地图条件必须收紧,不建议做成随处可用的公开 NPC。
  • 改名权限建议单独给 GM 操作,或者放在独立的房间地图里让玩家自助改名,不建议放在人流密集、可自由交易的公共地图。
  • 自助改名时,该地图必须做好地图参数限制:禁止交易、禁止摆摊,并在改名期间锁定角色;有条件时再叠加禁止丢弃、禁止存仓等限制。目的是防止改名脚本写得不合理被人刷宝,例如借改名绕过物品绑定或归属判定。
  • 脚本自身要把安全动作做全:改名前校验消耗(CheckItem 改名卡);成功后用 ReplaceKey 原Key 新Key 同步 HASH 数据与文本变量;任何失败分支都要 Give 退回改名卡并解除角色锁定。
  • 改名期间用 SetAbility 20~31、SetAbility 46~49(数值写 99999999)配合 Lockdown 1 锁定角色,成功或失败都要成对解除(数值写 0),避免玩家在改名成功的空档继续操作角色。
  • 改名前后要给玩家明确提示(输入框须知、成功与失败都用 SENDMSG),减少误操作和后续纠纷。

参考脚本

(@@InPutInteger @@InPutString)

;注意:改名脚本不可以使用自定义输入框。 只可以使用默认的变量输入框。。
;改名如果新名字的角色在线,也会触发QF
[@chgname_fail_name_used]
;ReplaceKey 原Key 新Key // 替换key,保持内容不变,用于角色改名后的支持,key严格按此两种格式定义:角色名.XX 或 角色名_XX,才支持替换!
[@MAIN]
<COLOR=$00848C8C ------------------------------------------------------------->\
<COLOR=$0000FF 人物改名须知:>\
1.行会成员需要先退出行会\
2.更改名字前需要收回英雄\ \
<COLOR=$0000FF 英雄改名须知:>\
1.需召唤英雄在线才可进行\
<COLOR=$00848C8C ------------------------------------------------------------->\
<更改人物名字/@@InputString35>        <更改英雄名字/@@InputString36>    <COLOR=$00FF00 Ps:变更姓名需要改名卡一张>\

[@@InPutString35]

#if
;检测输入的名字是不是自己现有的角色名字
Compval <$username> = <$str(S35)>
#Act
Messagebox 请不要输入自己之前的名字
break

#IF
;检测是否有行会,如果有行会需要退出行会
HAVEGUILD
#say
改名失败,行会成员不能使用此功能!\ \
<关闭/@exit>
#ACT
SENDMSG 5 提示:行会成员不能变更角色名!
BREAK

#if
;检测是否有英雄,英雄是否在线。
haveHero
checkHeroOnline
#say
改名失败,英雄需下线才能改名!\ \
<关闭/@exit>
#act
SENDMSG 5 提示:英雄需下线才能改名!
break

#if
;检测是否结婚
checkposemarry
#say
失败,请离婚之后再来!\ \
<返回/@main>
#act
sendmsg 7 失败,请离婚之后再来!
break

#IF
;检测要扣掉的物品 也可以检测元宝或其他物品
CheckItem 改名卡 1
#ACT
;扣掉物品。
TAKE 改名卡 1
;给予玩家临时变量,以便改名失败返回所扣物品.比如SetAbility 99。如果占用可以更改为其他的
SetAbility 99 1 2

;开始锁定角色.防止玩家利用改名成功1秒内操作角色
SetAbility 20 1 99999999
SetAbility 21 1 99999999
SetAbility 22 1 99999999
SetAbility 23 1 99999999
SetAbility 24 1 99999999
SetAbility 25 1 99999999
SetAbility 26 1 99999999
SetAbility 27 1 99999999
SetAbility 29 1 99999999
SetAbility 30 1 99999999
SetAbility 31 1 99999999
SetAbility 46 1 99999999
SetAbility 47 1 99999999
SetAbility 48 1 99999999
SetAbility 49 1 99999999
Lockdown 1
#Elseact
MESSAGEBOX 你没有改名卡
break

#if
True
#Act
;人物开始操作改名
changeCharName <$STR(S35)>

[@@InPutString36]
#if
!haveHero
;检测是否有英雄
#act
sendmsg 7 你还没有英雄!
break

#if
!checkHeroOnline
;检测英雄是否在线
#act
sendmsg 7 失败,英雄在线才能更名!
break

#if
Compval <$h.username> = <$str(S36)>
;检测输入的名字是不是自己英雄现有的角色名字
#Act
Messagebox 请不要输入自己英雄之前的名字
break

#IF
CheckItem 改名卡 1
#Act
TAKE 改名卡 1
;给予玩家临时变量,以便改名失败返回所扣物品。比如SetAbility 99。如果占用可以更改为其他的
SetAbility 99 1 2
#ELSEACT
MESSAGEBOX 你没有改名卡
BREAK

#IF
True
#ACT
;英雄开始改名
h.changeCharName <$STR(S36)>
BREAK

[@chgname_success]
#IF
COMPVAL <$PARAMSTR(0)> =
#act
;人物改名成功之后执行文本变量转换。如果没有可以删掉。

STRINGSREPLACE ..\QUESTDIARY\数据文件\变量数据.INI <$PARAMSTR(1)> <$PARAMSTR(2)> 0 HARDDISK
HASH H_角色 REPLACEKEY <$PARAM(1)>_灵符 <$PARAM(2)>_灵符
HASH H_角色 REPLACEKEY <$PARAM(1)>_金币 <$PARAM(2)>_金币
HASH H_角色 REPLACEKEY <$PARAM(1)>_元宝 <$PARAM(2)>_元宝
HASH H_角色 REPLACEKEY <$PARAM(1)>_灵符 <$PARAM(2)>_灵符
HASH H_角色 REPLACEKEY <$PARAM(1)>_泡点 <$PARAM(2)>_泡点
HASH H_角色 REPLACEKEY <$PARAM(1)>_金刚石 <$PARAM(2)>_金刚石
HASH H_角色 REPLACEKEY <$PARAM(1)>_声望 <$PARAM(2)>_声望
SENDMSG 0 恭喜【<$PARAMSTR(1)>】成功更改名字为【<$PARAMSTR(2)>】
BREAK
#ELSEACT
;英雄改名成功后 清理掉临时变量。以免玩家利用空隙进行其他操作
SetAbility 99 1 0
SENDMSG 0 恭喜【<$PARAMSTR(1)>】的英雄,成功更改名字为【<$PARAMSTR(2)>】
BREAK

[@chgname_fail_name_used_0]

;如果输入的角色名字与在线的人物或英雄同名则跳入此段

#if
Compval <$ABILITIES99> > 0
#Act
;清理临时变量
SetAbility 99 1 0
;返回改名需要的物品
Give 改名卡 1
;取消玩家锁定状态。方便玩家继续操作
SetAbility 20 0 0
SetAbility 21 0 0
SetAbility 22 0 0
SetAbility 23 0 0
SetAbility 24 0 0
SetAbility 25 0 0
SetAbility 26 0 0
SetAbility 27 0 0
SetAbility 29 0 0
SetAbility 30 0 0
SetAbility 31 0 0
SetAbility 46 0 0
SetAbility 47 0 0
SetAbility 48 0 0
SetAbility 49 0 0
Lockdown 0
;因为默认已经有弹窗 所以这里就不做弹窗了

[@chgname_fail_name_used]

;如果输入的角色名字在数据库中存在则跳入此段

#if
Compval <$ABILITIES99> > 0
#Act
;清理临时变量
SetAbility 99 1 0
;返回改名需要的物品
Give 改名卡 1
;取消玩家锁定状态。方便玩家继续操作
SetAbility 20 0 0
SetAbility 21 0 0
SetAbility 22 0 0
SetAbility 23 0 0
SetAbility 24 0 0
SetAbility 25 0 0
SetAbility 26 0 0
SetAbility 27 0 0
SetAbility 29 0 0
SetAbility 30 0 0
SetAbility 31 0 0
SetAbility 46 0 0
SetAbility 47 0 0
SetAbility 48 0 0
SetAbility 49 0 0
Lockdown 0
#if
True
#say
<$PARAMSTR(0)>失败,新角色名已被使用!\ \
<关闭/@exit>

[@chgname_fail_name_wrong_format]

;如果输入的角色名字存在屏蔽的字符则跳入此段

#if
Compval <$ABILITIES99> > 0
#Act
;清理临时变量
SetAbility 99 1 0
;返回改名需要的物品
Give 改名卡 1
;取消玩家锁定状态。方便玩家继续操作
SetAbility 20 0 0
SetAbility 21 0 0
SetAbility 22 0 0
SetAbility 23 0 0
SetAbility 24 0 0
SetAbility 25 0 0
SetAbility 26 0 0
SetAbility 27 0 0
SetAbility 29 0 0
SetAbility 30 0 0
SetAbility 31 0 0
SetAbility 46 0 0
SetAbility 47 0 0
SetAbility 48 0 0
SetAbility 49 0 0
Lockdown 0
#if
True
#say
<$PARAMSTR(0)>失败,新角色名包含了过滤字符!\ \
<关闭/@exit>

[@chgname_fail_no_character]
#if
Compval <$ABILITIES99> > 0
#Act
SetAbility 99 1 0
Give 改名卡 1
SetAbility 20 0 0
SetAbility 21 0 0
SetAbility 22 0 0
SetAbility 23 0 0
SetAbility 24 0 0
SetAbility 25 0 0
SetAbility 26 0 0
SetAbility 27 0 0
SetAbility 29 0 0
SetAbility 30 0 0
SetAbility 31 0 0
SetAbility 46 0 0
SetAbility 47 0 0
SetAbility 48 0 0
SetAbility 49 0 0
Lockdown 0
#if
True
#say
<$PARAMSTR(0)>失败,查询不到角色!\ \
<关闭/@exit>

[@chgname_fail_incomplete_data]
#if
Compval <$ABILITIES99> > 0
#Act
SetAbility 99 1 0
Give 改名卡 1
SetAbility 20 0 0
SetAbility 21 0 0
SetAbility 22 0 0
SetAbility 23 0 0
SetAbility 24 0 0
SetAbility 25 0 0
SetAbility 26 0 0
SetAbility 27 0 0
SetAbility 29 0 0
SetAbility 30 0 0
SetAbility 31 0 0
SetAbility 46 0 0
SetAbility 47 0 0
SetAbility 48 0 0
SetAbility 49 0 0
Lockdown 0
#if
True
#say
<$PARAMSTR(0)>失败,数据错误!\ \
<关闭/@exit>

[@chgname_fail_unknow]
#if
Compval <$ABILITIES99> > 0
#Act
SetAbility 99 1 0
Give 改名卡 1
SetAbility 20 0 0
SetAbility 21 0 0
SetAbility 22 0 0
SetAbility 23 0 0
SetAbility 24 0 0
SetAbility 25 0 0
SetAbility 26 0 0
SetAbility 27 0 0
SetAbility 29 0 0
SetAbility 30 0 0
SetAbility 31 0 0
SetAbility 46 0 0
SetAbility 47 0 0
SetAbility 48 0 0
SetAbility 49 0 0
Lockdown 0
#if
True
#say
<$PARAMSTR(0)>失败,未知错误!\ \
<关闭/@exit>

[@IsInFilterList]
;如果输入的角色名字存在屏蔽的字符则跳入此段

#if
Compval <$ABILITIES99> > 0
#Act
;清理临时变量
SetAbility 99 1 0
;返回改名需要的物品
Give 改名卡 1
;取消玩家锁定状态。方便玩家继续操作
SetAbility 20 0 0
SetAbility 21 0 0
SetAbility 22 0 0
SetAbility 23 0 0
SetAbility 24 0 0
SetAbility 25 0 0
SetAbility 26 0 0
SetAbility 27 0 0
SetAbility 29 0 0
SetAbility 30 0 0
SetAbility 31 0 0
SetAbility 46 0 0
SetAbility 47 0 0
SetAbility 48 0 0
SetAbility 49 0 0
Lockdown 0
#if
True
#say
失败,输入文字中包含了过滤字符!\ \
<关闭/@exit>

[@chgname_fail_wrong_format]
;如果输入的角色名字存在屏蔽的字符则跳入此段

#if
Compval <$ABILITIES99> > 0
#Act
;清理临时变量
SetAbility 99 1 0
;返回改名需要的物品
Give 改名卡 1
;取消玩家锁定状态。方便玩家继续操作
SetAbility 20 0 0
SetAbility 21 0 0
SetAbility 22 0 0
SetAbility 23 0 0
SetAbility 24 0 0
SetAbility 25 0 0
SetAbility 26 0 0
SetAbility 27 0 0
SetAbility 29 0 0
SetAbility 30 0 0
SetAbility 31 0 0
SetAbility 46 0 0
SetAbility 47 0 0
SetAbility 48 0 0
SetAbility 49 0 0
Lockdown 0
#if
True
#say
失败,输入文字中包含了过滤字符!\ \
<关闭/@exit>

关键点

  • NPC 顶部声明 (@@InPutInteger @@InPutString);源文件注释强调:改名脚本不可以使用自定义输入框,只可以用默认的变量输入框。
  • 人物改名走 [@@InPutString35]、英雄改名走 [@@InPutString36];前置检查依次是行会(HAVEGUILD)、英雄在线(HAVEHERO + CHECKHEROONLINE)、婚姻(CHECKPOSEMARRY)、改名卡(CHECKITEM 改名卡 1)。
  • 改名期间用 SetAbility 99 1 2、SetAbility 20 1 99999999、SetAbility 21 1 99999999 锁角色,防止改名成功瞬间继续操作。
  • 失败回退分支:[@chgname_fail_name_used_0](与在线人物/英雄同名)、[@chgname_fail_name_used](数据库中已存在)、[@chgname_fail_name_wrong_format]、[@chgname_fail_wrong_format]、[@chgname_fail_no_character]、[@chgname_fail_incomplete_data]、[@chgname_fail_unknow],以及 [@IsInFilterList](屏蔽字符)。
  • 改名后需要同步的数据用 ReplaceKey 原Key 新Key(key 必须是 角色名.XX 或 角色名_XX 格式)与文本变量转换处理,脚本中给出示例。

相关阅读