传奇沙巴克成员奖励脚本编写思路与实现

来源: 作者: 点击:
脚本功能设计 实现沙巴克成员专属奖励系统,包含两个独立功能。第一,沙巴克成员等级大于60级可领取会员证明,每个角色限领一次。第二,沙巴克成员每日可领取10元宝,每日刷新领取资格。需使用变量记录领取状态,通过NPC交互完成奖励发放。

脚本文件位置 传奇脚本文件位于Mir200\Envir目录下。NPC对话脚本存放在Market_Def文件夹,每个NPC对应一个TXT文件。系统触发脚本存放在MapQuest_Def文件夹,其中QManage.txt处理玩家登录触发,QFunction-0.txt处理功能触发。变量声明无需单独文件,在脚本中直接使用即可。

变量系统说明 传奇脚本使用字母+数字标识变量,类似编程中的变量名。个人变量以P、D、M、S、I等字母开头,跟随数字编号,如P0、P1、D10。个人变量随角色数据保存,角色下线后仍然存在。全局变量以G、A开头,全服角色共享。时间变量以G开头记录日期,如G0。数组变量以N开头,如N0。字符串变量以S开头,如S10。VB中的变量需声明类型,传奇脚本变量直接使用,通过前缀字母区分类型。

NPC脚本创建步骤 在Mir200\Envir\Market_Def目录新建TXT文件,命名为沙城奖励-3.txt。在Mir200\Envir\Merchant.txt中添加NPC配置行:沙城奖励 3 330 320 沙城奖励-3 0 8 0 0 0。其中3为盟重土城地图编号,330 320为坐标,沙城奖励-3为脚本文件名,0为国王NPC外观,8为显示距离。

会员证明领取脚本 一次性领取需使用个人永久变量记录状态。选择P0作为标记变量,0表示未领取,1表示已领取。脚本逻辑:检测角色是否沙巴克成员,检测等级大于60,检测P0等于0。条件满足则给予会员证明,设置P0为1。代码示例:

[@main]
#SAY
沙巴克专属奖励使者。\ \
<领取会员证明/@getvip> <领取每日元宝/@getdaily> \ \
<离开/@exit>

[@getvip]
#IF
CHECKGUILD
CHECKOFGUILD
CHECKLEVELEX > 60
EQUAL P0 0
#ACT
GIVE 会员证明 1
MOV P0 1
SENDMSG 0 玩家[<$USERNAME>]成功领取沙巴克会员证明!
#SAY
领取成功,荣誉归于沙巴克!
#ELSEACT
#SAY
领取条件不符:\ \
1.需沙巴克成员\ \
2.等级大于60级\ \
3.未领取过该证明\ \
<返回/@main>

CHECKGUILD检测是否有行会,CHECKOFGUILD检测是否沙巴克行会成员,CHECKLEVELEX > 60检测等级,EQUAL P0 0检测未领取标记。条件全部满足执行#ACT部分,MOV P0 1设置已领取标记。

每日元宝领取脚本 每日领取需检测日期变化。使用个人变量G0记录上次领取日期。脚本逻辑:检测是否沙巴克成员,检测G0不等于当前系统日期<$DATE>。条件满足则给予10元宝,更新G0为当前日期。代码示例:

[@getdaily]
#IF
CHECKGUILD
CHECKOFGUILD
#ACT
#IF
EQUAL G0 <$DATE>
#ACT
#SAY
今日已领取过每日元宝,请明日再来。\ \
<返回/@main>
#ELSEACT
GAMEGOLD + 10
MOV G0 <$DATE>
SENDMSG 0 玩家[<$USERNAME>]领取沙巴克每日元宝10个!
#SAY
成功领取10元宝,沙巴克荣耀!
#ELSEACT
#SAY
仅沙巴克成员可领取每日元宝。\ \
<返回/@main>

EQUAL G0 <DATE>检测上次领取日期是否为今天,是则提示已领取,否则执行发放。<DATE>为系统日期变量,格式示例20240217。GAMEGOLD + 10增加元宝。

变量初始化处理 个人变量P0默认值为0,首次使用无需初始化。但为确保可靠性,可在登录脚本中初始化。打开Mir200\Envir\MapQuest_def\QManage.txt,在[@Login]段添加检测:

[@Login]
#IF
EQUAL P0
#ACT
MOV P0 0

EQUAL P0检测变量是否为空,空则初始化为0。类似VB中的变量初始化,但传奇脚本变量未赋值时访问不会报错,返回空值。

物品数据库配置 会员证明需在数据库StdItems表中存在。使用数据库工具添加记录,设置StdMode=2(任务物品),Shape=0,Weight=1,AniCount=0,Source=0,Reserved=0。Name字段设为“会员证明”,其他字段参考同类物品设置。元宝为系统货币,无需物品定义,直接使用GAMEGOLD命令增加。

消息提示优化 添加更详细的条件提示,帮助玩家了解失败原因。改进脚本:

[@getvip]
#IF
CHECKGUILD
#ACT
#IF
CHECKOFGUILD
#ACT
#IF
CHECKLEVELEX > 60
#ACT
#IF
EQUAL P0 0
#ACT
GIVE 会员证明 1
MOV P0 1
SENDMSG 0 玩家[<$USERNAME>]成功领取沙巴克会员证明!
#SAY
领取成功!\ \
<返回/@main>
#ELSEACT
#SAY
您已领取过会员证明,不可重复领取。\ \
<返回/@main>
#ELSEACT
#SAY
需要等级大于60级。\ \
<返回/@main>
#ELSEACT
#SAY
您不是沙巴克成员。\ \
<返回/@main>
#ELSEACT
#SAY
您没有加入任何行会。\ \
<返回/@main>

嵌套条件判断提供精确提示,类似VB中的If-ElseIf结构,但传奇脚本使用标签跳转实现分支。

防作弊措施 添加多重验证防止脚本滥用。添加地图检测,仅限沙巴克皇宫内领取:

[@getvip]
#IF
EQUAL <$MAP> 3
#ACT
#IF
CHECKGUILD
CHECKOFGUILD
CHECKLEVELEX > 60
EQUAL P0 0
#ACT
GIVE 会员证明 1
MOV P0 1
SENDMSG 0 玩家[<$USERNAME>]成功领取沙巴克会员证明!
#SAY
领取成功!
#ELSEACT
#SAY
请在沙巴克皇宫内领取。\ \
<返回/@main>

<$MAP>获取当前地图编号,3为沙巴克皇宫地图。增加地图限制提高安全性。

领取记录查询 添加查询功能,便于玩家了解状态。扩展脚本:

[@main]
#SAY
沙巴克专属奖励使者。\ \
<领取会员证明/@getvip> <领取每日元宝/@getdaily>\ \
<查询状态/@checkstatus> <离开/@exit>

[@checkstatus]
#ACT
#IF
EQUAL P0 1
#ACT
MOV S10 已领取
#ELSEACT
MOV S10 未领取
#IF
EQUAL G0 <$DATE>
#ACT
MOV S11 今日已领
#ELSEACT
MOV S11 今日未领
#SAY
会员证明状态:<$STR(S10)>\ \
每日元宝状态:<$STR(S11)>\ \
<返回/@main>

使用S10、S11字符串变量存储状态描述,<$STR(S10)>显示变量值。类似VB中的字符串拼接显示。

多角色兼容处理 同一账号下多个角色变量独立。个人变量P0、G0绑定角色,不绑定账号。不同角色需分别满足条件领取。如需账号共享,可使用账号变量A系列,但本需求为角色独立奖励,使用个人变量即可。

脚本调试方法 测试脚本功能时使用GM命令辅助。@ViewP0查看变量P0值,@SetP0 1修改变量值。@Level调整等级测试等级条件。@AddGuild添加行会,@AddToCastle添加沙巴克权限。测试后使用@ClearP0清空变量重新测试。

时间变量细节 系统日期<DATE>格式为年月日八位数,如20260217。时间比较使用EQUAL完全匹配,跨天即变化。<DATETIME>包含时分秒,格式20260217143000。每日领取使用日期而非时间戳,避免时间点误差。

背包空间检测 发放物品前检测背包空间,避免背包满导致发放失败。修改脚本:

[@getvip]
#IF
CHECKGUILD
CHECKOFGUILD
CHECKLEVELEX > 60
EQUAL P0 0
CHECKBAGSPACE 1
#ACT
GIVE 会员证明 1
MOV P0 1
SENDMSG 0 玩家[<$USERNAME>]成功领取沙巴克会员证明!
#SAY
领取成功!
#ELSEACT
#SAY
背包空间不足,请清理至少1格空间。\ \
<返回/@main>

CHECKBAGSPACE 1检测至少1格背包空间,条件不满足提示玩家清理背包。

行会职务检测 如需仅限行会官员领取,添加职务检测。CHECKGUILDPOSITION检测行会职务,参数0会长,1副会长,2堂主。但本需求为所有成员可领取,无需添加职务限制。

脚本保存与加载 脚本修改后无需重启服务端。M2Server控制台使用@ReloadNpc重载NPC脚本,@ReloadManage重载管理脚本。或使用GM命令@ReloadGuild重载行会信息。测试时建议小退角色使变量生效。

最终脚本整合 将上述功能整合为完整NPC脚本。包含主菜单、领取功能、状态查询、条件提示。使用个人变量P0控制一次性领取,G0控制每日领取。添加防作弊检测与用户提示。测试各分支逻辑正常后部署使用。通过此脚本实现沙巴克成员专属奖励系统,激励玩家参与攻城战。