内置变量

变量用法

一、% 变量:可以在条件判断、ACT 参数和对话文本中使用

1. 玩家信息

 
变量 含义
%USERNAME 角色名
%USERID 账号(邮箱/登录账号)
%USERMAP 当前地图文件名(如 3)
%USERMAPNAME 当前地图中文名
%USERX / %USERY 当前坐标 X / Y
%USERJF 元宝 = 积分(账号级 GameGold)
%USERREBORNCOUNT 转生次数
%在线时长分钟 玩家在线多少分钟

2. 开服时间(来自 Server.ini ServiceOpeningTime)

 
变量 含义
%CURWEEK 开服至今第几周
%CURDAY 开服至今第几天
%CURHOUR 开服至今第几小时
%服务器启动时间 服务器启动时间
%服务器当前时间 服务器当前时间

未配置开服时间时全部返回 0。

3. 按钮参数 / 输入框

 
变量 含义
%ARG(1) ~ %ARG(n) 按钮 @标签(a,b,c) 括号里的第 n 个实参,从 1 开始;越界返回 0
%INPUTSTR @@按钮 弹出输入框后玩家输入的内容

4. 自定义变量(数量最多、最常用)

 
写法 说明
%D4``%P1``%S2``%N3 D/P/S/N 加一位数字,写入时自动规范化成整数(非数字归 0)
%任意中文名 变量名支持字母/数字/下划线/中文,任意命名

⚠️ 重要:这些自定义变量存在 MapObject.NPCVar(内存 List)里,源码中没有任何落库逻辑 —— 玩家下线就全部丢失。要存持久数据,得用:

 
持久方案 说明
%USERZDY1 ~ %USERZDY9 角色级持久变量,存 CharacterInfo.UserZdy1~9
CHECK 索引 0/1 角色级持久标志位(位图,索引 0~1023)

二、<$ 变量>:只能写在 #SAY 的对话文本里

1. 基础信息(42 个里最常用的)

 
写法 输出
<$NPCNAME> 当前 NPC 的名字
<$USERNAME> 角色名
<$LEVEL> 等级
<$CLASS> 职业(枚举名,如 Warrior)
<$MAP> 地图文件名
<$X_COORD> / <$Y_COORD> 坐标
<$HP> / <$MAXHP> 当前血 / 最大血
<$MP> / <$MAXMP> 当前蓝 / 最大蓝
<$GAMEGOLD> 金币(见下方注意事项)
<$USERJF> 元宝 / 积分(账号级 GameGold)
<$PKPOINT> PK 值
<$DATE> 当天日期(短格式)
<$USERCOUNT> 当前在线人数
<$GUILDNAME> 行会名,无行会输出“没有...”
<$OUTPUT(A1)> 输出自定义变量的值;D/P/S/N+数字 未定义时显示 0

2. 装备显示(没穿会输出“没有装备XX”)

<$ARMOUR> 衣服 · <$WEAPON> 武器 · <$HELMET> 头盔 · <$NECKLACE> 项链
<$BRACELET_L>``<$BRACELET_R> 手镯 · <$RING_L>``<$RING_R> 戒指
<$BOOTS> 鞋 · <$AMULET> 护身符 · <$STONE> 宝石 · <$TORCH> 火把

3. 攻城专用(参数是变量名,用得少)

<$CONQUESTOWNER(C1)> 城主 · <$CONQUESTGOLD(C1)> 资金
<$CONQUESTRATE(C1)> 比率 · <$CONQUESTSCHEDULE(C1)> 日程
<$CONQUESTGUARD(C1,G1)> 守卫 · <$CONQUESTGATE(C1,G1)> 城门 · <$CONQUESTWALL(C1,G1)> 城墙 · <$CONQUESTSIEGE(C1,G1)> 攻城车

括号里是存放索引的变量名,例如先用 SETVAR 把城堡序号写进 C1。


三、5 个需要注意的问题(建议重点标记)

  1. <$GAMEGOLD> 输出的是金币,不是元宝。​ 源码里是 player.Gold;要显示元宝必须用 <$USERJF>。
  2. <$PARCELAMOUNT> 也是金币(player.Gold),名字叫“包裹数量”但完全不对应,不要相信名字。
  3. <$GUILDWARTIME> / <$GUILDWARFEE> 已经失效:switch 里对应分支被注释掉了,newValue 一直是空串,写了会显示空白。
  4. %D4 这类自定义变量不会持久保存,下线就丢失。需要跨登录保留的数据,必须用 %USERZDY1~9 或 CHECK 标志位。
  5. 变量名大小写不敏感(内部统一 ToUpper 匹配),但 % 和 <$ 两种写法不能混用:%USERNAME 在 SAY 文本里能用(会被替换),<$USERNAME> 在 #IF 条件里不能用。

另外提醒一句:% 变量在 #IF 的检测参数里同样生效,所以可以写 CHECKLEVEL > %D1、CHECKGAMEGOLD >= %NEEDGOLD 这种动态阈值,比写死数字灵活很多。