既然你有VB基础,理解传奇脚本会非常快。传奇脚本本质上也是一种事件驱动编程,但没有传统编程语言那样明确的“变量声明区”。在GOM或GEE引擎中,变量是“即用即存”的全局变量,不需要预先定义,直接通过变量名(如A0、S0)即可调用。针对你的需求,我们需要利用沙巴克行会检测命令、等级判断、物品检测以及时间变量来实现。以下直接切入代码逻辑与变量管理思路。
变量管理与声明机制
在传奇脚本中,你不需要像VB那样写Dim A As Integer。引擎内存中已经划分好了固定的变量区域,你只需要知道每个变量的用途即可。
整数变量
A0-A99:临时变量。仅在脚本执行期间有效,脚本结束或跳转后数据可能丢失或重置,适合用于中间计算(如计算等级差)。
A100-A499:自定义变量。数据保存在人物数据库中,下线不丢失。适合用来记录“是否领取过会员证明”这种永久状态。
D0-D99:时间/系统变量。部分引擎用D变量存储时间戳,或者用于更复杂的运算。
字符变量
S0-S99:临时文本变量。
S100-S499:永久文本变量。
针对你的需求,我们将使用A100作为“会员证明领取标记”,使用D变量或系统时间函数来处理“每日领取”的时间判定。
核心逻辑一:沙巴克成员60级领取会员证明
这个功能需要三个判断条件:是否为沙巴克成员、等级是否大于60、是否已经领取过。
脚本思路
检测玩家所属行会是否为沙巴克行会。
检测玩家等级是否大于59。
检测变量A100的值(若为1则代表已领,若为0则未领)。
若通过,给予物品,并将A100赋值为1。
代码实现
[@沙巴克福利]
; 第一步:检测是否为沙巴克成员
IF
ISCASTLEMEMBER
ACT
; 是沙巴克成员,继续往下判断
GOTO [@CheckLevel]
BREAK
ELSEACT
SENDMSG 6 你不是沙巴克成员,无法领取!
CLOSE
BREAK
[@CheckLevel]
; 第二步:检测等级
IF
CHECKLEVEL > 59
ACT
GOTO [@CheckReceived]
BREAK
ELSEACT
SENDMSG 6 你的等级未达到60级!
CLOSE
BREAK
[@CheckReceived]
; 第三步:检测是否领取过 (A100=1为已领)
IF
EQUAL A100 1
ACT
SENDMSG 6 你已经领取过会员证明了,每人限领一次!
CLOSE
BREAK
ELSEACT
; 第四步:执行发放
GIVE 会员证明 1
MOV A100 1
SENDMSG 6 恭喜!领取会员证明成功!
; 这里可以加一个保存变量的命令,视引擎版本而定,通常MOV后自动保存
CLOSE
BREAK
核心逻辑二:每日领取10元宝
“每日领取”的核心在于记录“上一次领取的时间”。我们需要对比“当前时间”和“上次领取时间”。如果两者不在同一天,则允许领取。
变量选择
D10:用来存储上次领取元宝的日期(例如存储为20231025)。
脚本思路
获取当前系统日期(格式通常为YYYYMMDD)。
读取变量D10(上次领取日期)。
对比当前日期与D10。如果不相等,说明已经过了一天,可以领取。
领取后,将当前日期写入D10。
代码实现
[@每日元宝]
IF
; 获取当前日期存入S0变量,具体命令视引擎而定,此处假设GETDATE获取日期
; 或者直接使用引擎内置的时间比较命令
; 这里使用通用的逻辑:检查 D10 是否等于今天
; 假设我们用一个自定义命令 GETTODAY 将今天日期(如20231025)存入变量D20
GETTODAY D20
EQUAL D10 0
; 或者 D10 不等于 D20
NOT EQUAL D10 D20
ACT
; 满足条件:今天还没领,或者上次领取不是今天
GIVE 元宝 10
MOV D10 D20
SENDMSG 6 领取10元宝成功!请明天再来。
CLOSE
BREAK
ELSEACT
; 不满足条件:D10等于今天,说明今天领过了
SENDMSG 6 你今天的元宝已经领取过了!
CLOSE
BREAK
关键命令解析与调试技巧
在编写过程中,你需要熟练掌握以下几个核心命令,它们是实现上述逻辑的基石。
ISCASTLEMEMBER
这是检测沙巴克成员的核心命令。如果不加这个判断,普通行会成员也能领取。
CHECKLEVEL
用于等级判断。注意符号的使用,>、<、=两边通常建议加空格,虽然部分引擎不强制,但这是良好的编程习惯。
MOV
赋值命令。例如MOV A100 1,意思就是将数值1存入变量A100中。对于VB程序员来说,这就相当于A100 = 1。
GIVE / TAKE
物品操作命令。GIVE 会员证明 1表示给1个物品,GIVE 元宝 10表示给10个元宝(前提是引擎开启了元宝功能,或者元宝是作为一种特殊物品存在的)。
调试建议
在测试脚本时,不要直接去判断“是否等于今天”,因为很难模拟跨天。建议先写一个GM命令脚本,用来“重置D10为0”或者“设置D10为昨天”,方便你反复测试逻辑是否通顺。
总结
传奇脚本没有复杂的声明,全靠变量名约定。对于你的需求,A100是你的“开关”,控制一次性奖励;D10是你的“日历”,控制每日奖励。将上述两段代码分别写入NPC脚本的不同标签(如@沙巴克福利和@每日元宝),并在M2Server中重载脚本即可生效。

