想给自己的传奇私人服务器添加高大上的钻石会员和黄金会员体系?不仅要区分等级福利,还要限制专属地图进入权限,甚至支持限时会员(非终生)?没问题!这套脚本方案就是为你量身定制的,即使你对脚本“一知半解”也能看懂、复制、修改和使用!
🔑核心思路:用变量“标记”会员身份和期限
引擎自带的“游戏会员名单”(GM列表)功能比较单一,通常只支持一种状态(是/否管理员)且无有效期概念。我们要实现复杂的分类会员系统,需要借助引擎的自定义变量系统。
我们将使用两类变量来精确控制:
会员类型变量:
黄金会员标识:比如[VIP_GOLD]。0=不是,1=是(黄金)
钻石会员标识:比如[VIP_DIAMOND]。0=不是,1=是(钻石)
注意:通常一个玩家不能同时是两种有效会员,否则逻辑会混乱。需要设计充值逻辑避免同时激活。
会员有效期变量:
黄金会员到期时间戳:比如VIP_GOLD_TIME
钻石会员到期时间戳:比如VIP_DIAMOND_TIME
时间戳(UnixTimestamp):一个表示某个时间点的数字(如1717843200表示2024年6月8日16:00)。引擎通常有函数获取当前时间戳和时间戳转换功能。
📝脚本实现:五大关键部分
假设我们的引擎支持类似GOMGEEV8LF的常见命令(具体命令名需根据你的引擎微调)。
📍第一部分:会员状态检测(必须添加到登录脚本QManage.txt的[@Login]中!)
这个部分在玩家每次登陆游戏时执行,用于检测其会员是否到期。
添加到你的QManage.txt文件中的[@Login]标签下
[@Login]
;...(这里是你原有的登录触发内容,比如检测新人、送基础物品等)
-----------黄金会员到期检测-----------
#IF
LargeVIP_GOLD_TIME0;检查是否曾经是黄金会员(时间戳大于0)
#ACT
GetNowDateTime;获取当前时间戳到<$STR(S0)>(或者引擎对应的系统时间变量)
MOVS1<$STR(VIP_GOLD_TIME)>
#IF
SmallS1<$STR(S0)>;比较到期时间(S1)是否小于当前时间(S0)?(即到期了)
#ACT
MOVVIP_GOLD_TIME0;到期,清除到期时间
MOVVIP_GOLD0;到期,清除黄金会员身份标记
SENDMSG6[系统提示]您的黄金会员身份已到期!感谢您曾经的惠顾!
break;这里break是为了防止下面检测钻石会员时干扰,到期后跳过后续登陆检测
#ELSEACT
没到期,检查成功,保留标识,不用做特殊处理
SENDMSG6[系统提示]尊贵的黄金会员,您的特权剩余时间:<$STR(VIP_GOLD_TIME)>秒
-----------钻石会员到期检测(逻辑与黄金会员完全一致)-----------
#IF
LargeVIP_DIAMOND_TIME0
#ACT
GetNowDateTime;获取当前时间戳到<$STR(S0)>(或者引擎对应的系统时间变量)
MOVS1<$STR(VIP_DIAMOND_TIME)>
#IF
SmallS1<$STR(S0)>
#ACT
MOVVIP_DIAMOND_TIME0
MOVVIP_DIAMOND0
SENDMSG6[系统提示]您的钻石会员身份已到期!期待您的再次归来!
break
#ELSEACT
SENDMSG6[系统提示]至臻钻石会员,您的特权剩余时间:<$STR(VIP_DIAMOND_TIME)>秒
这里一般不用break,除非你后面还有脚本需要跳过
关键解释:
LargeVIP_GOLD_TIME0:检查VIP_GOLD_TIME这个变量是否大于0。大于0表示玩家曾经是或者现在是黄金会员。
GetNowDateTime:假设引擎命令,功能是获取当前的系统时间戳并存入一个变量(这里假设存到<S0>,请查阅你的引擎手册找到实际命令和变量)。
SmallS1<$STR(S0)>:比较到期时间(存在S1)是否小于当前时间(存在S0)。小于说明到期了。
到期处理:清除会员类型标识(VIP_GOLD=0)和到期时间戳(VIP_GOLD_TIME=0),并发送提示。
未到期处理:发送剩余时间提示(为了直观,最好把秒数转换成天数/小时/分钟显示,可以用引擎的时间计算函数做,为了脚本简洁这里用秒)。
🔥重要提示:再次确保去掉功能块内部不必要的BREAK,像上次学到的,整个[@Login]标签最后用一个BREAK就好!上面的例子需要根据你引擎实际情况调整。
📍第二部分:会员充值/激活NPC(关键)
这个NPC负责让玩家选择充值何种会员以及时长(或者直接用脚本设定固定时长)。我们创建一个新NPC脚本文件(如会员使者-3.txt),放在你的NPC脚本目录下。
;==
文件:会员使者-3.txt
NPC位置:土城(333333)会员使者
;==
[@main]
#IF
#ACT
OpenMerchantBigDialog;打开大对话框(引擎命令可能不同)
#SAY
<尊敬的勇士/{FCOLOR=250}>,欢迎光临会员中心!\\
您当前的身份状态:\\
{★黄金会员状态:/{FCOLOR=249}<$OUTPUT(VIP_GOLD=1?已激活:未激活)>>}/\
{★钻石会员状态:/{FCOLOR=253}<$OUTPUT(VIP_DIAMOND=1?已激活:未激活)>>}\\
{请选择您要办理的业务:/FCOLOR=254}\\
{<购买/激活黄金会员/@BuyGoldVIP>}{/FCOLOR=249}[<剩余时间:/FCOLOR=249>]<$STR(VIP_GOLD_TIME)>秒\\
{<购买/激活钻石会员/@BuyDiamondVIP>}{/FCOLOR=253}[<剩余时间:/FCOLOR=253>]<$STR(VIP_DIAMOND_TIME)>秒\\
{<查询我的会员特权/@QueryVIPBenefits>}\\
{<离开/@exit>}
[@BuyGoldVIP]
#IF
CheckGameGold>999;检查玩家元宝是否大于999(假设1000元宝=1天黄金会员)
#ACT
GameGold-1000;扣除1000元宝
---计算新的到期时间---
GetNowDateTime;获取当前时间戳到S0
MOVS1<$STR(S0)>
假设购买一天:86400秒=24小时60分60秒
INCS186400
如果已有会员时间,则是在原基础上叠加
#IF
LargeVIP_GOLD_TIME0
#ACT
MOVVIP_GOLD_TIME<$STR(S1)>
如果当前没有会员时间,则直接设置到期时间并激活身份
#ELSEACT
MOVVIP_GOLD_TIME<$STR(S1)>
MOVVIP_GOLD1
SENDMSG6[恭喜]您已成功开通或续费黄金会员1天!到期时间:<$STR(VIP_GOLD_TIME)>
清除可能的钻石会员冲突(如果设计不允许同时持有)
MOVVIP_DIAMOND0
MOVVIP_DIAMOND_TIME0
goto@main
#ELSESAY
您的元宝不足1000点!无法开通黄金会员。
goto@main
[@BuyDiamondVIP]
;逻辑与购买黄金会员完全相同,只是变量名、扣费、时间和提示不同
#IF
CheckGamePoint>4999;或者CheckGameGold>4999使用不同货币
#ACT
GameGold-5000;扣5000元宝
GetNowDateTime;当前时间戳->S0
MOVS1<$STR(S0)>
INCS186400;加一天(可按需修改)
#IF
LargeVIP_DIAMOND_TIME0
#ACT
MOVVIP_DIAMOND_TIME<$STR(S1)>
#ELSEACT
MOVVIP_DIAMOND_TIME<$STR(S1)>
MOVVIP_DIAMOND1
SENDMSG6[至尊荣耀]您已成功开通或续费钻石会员1天!享受顶级特权!
清除可能的黄金会员冲突(如果设计不允许同时持有)
MOVVIP_GOLD0
MOVVIP_GOLD_TIME0
goto@main
#ELSESAY
您的资源不足!无法开通钻石会员。
goto@main
[@QueryVIPBenefits]
#SAY
<黄金会员特权/FCOLOR=249>:\\
每日可领取<{100万金币/FCOLOR=250}>!\\
可进入<{远古遗迹/FCOLOR=250}>地图!\\
杀怪经验加成<{10%/FCOLOR=250}>!\\\
<钻石会员特权/FCOLOR=253>:\\
每日可领取<{500万金币+5元宝/FCOLOR=253}>!\\
可进入<{远古遗迹/FCOLOR=253}>和<{虚空神殿/FCOLOR=253}>专属地图!\\
杀怪经验加成<{20%/FCOLOR=253}>+爆率加成<{15%/FCOLOR=253}>!\\
免费使用<{全服传送服务/FCOLOR=253}>!\\
<注:会员特权以游戏内实际为准。/FCOLOR=151}>\\
<返回/@main>
关键解释:
变量检查与显示:在@main使用<STR(VIP_GOLD)>和<STR(VIP_DIAMOND)>显示会员状态(0/1),使用<$STR(VIP_GOLD_TIME/VIP_DIAMOND_TIME)>显示剩余秒数(最好转换一下成天/时/分)。
扣费逻辑:CheckGameGold>999检查玩家元宝是否足够。GameGold-1000扣除相应元宝。
时间叠加逻辑:
GetNowDateTime获取当前时间戳。
INCS186400在当前时间戳基础上增加86400秒(即1天)。你可以修改86400这个数值来代表不同的时长(如259200是3天)。
如果玩家已经有会员时间(LargeVIP_GOLD_TIME0),则只在原有到期时间的基础上增加购买时长(MOVVIP_GOLD_TIME<$STR(S1)>)。
如果玩家没有会员时间(LargeVIP_GOLD_TIME0不成立),则设置到期时间为购买时长后的时间戳并激活会员标识(MOVVIP_GOLD1)。
会员类型互斥(可选):代码中被注释掉的部分(MOVVIP_DIAMOND0...)是用于处理如果你设计为不允许玩家同时拥有两种会员的情况。开通钻石时强制清除黄金会员状态(或反之)。
特权查询:@QueryVIPBenefits简单列出不同会员的特权描述(如地图进入权限、奖励等)。
📍第三部分:会员专属地图进入权限控制
通常在地图传送NPC上或者地图入口点(使用MapEvent.txt或QManage.txt的[@OnMapEvent])添加权限验证。
方式一:在传送NPC脚本中添加条件(推荐)
假设NPC(如"地图传送员")负责传送到"远古遗迹(黄金、钻石可进)"和"虚空神殿(仅钻石可进)"。
在你的传送NPC脚本中修改传送到这些地图的选项:
[@传送到远古遗迹]
;(假设这是传送命令)
#IF
条件:是黄金会员"或"是钻石会员(VIP_GOLD=1或VIP_DIAMOND=1)
Check[VIP_GOLD]1
Check[VIP_DIAMOND]1
OR;满足上面两个条件中的一个即可(黄金或钻石)
#ACT
MapMove3333333;假设传送到地图3的(333333)
SENDMSG6已传送至远古遗迹!
#ELSESAY
抱歉,<远古遗迹/FCOLOR=249}>是会员专属地图!\\
请先开通<黄金会员/FCOLOR=249}>或<钻石会员/FCOLOR=253}>身份!
[@传送到虚空神殿]
#IF
条件:必须是钻石会员(VIP_DIAMOND=1)
Check[VIP_DIAMOND]1
#ACT
MapMove4333333;假设传送到地图4的(333333)
SENDMSG6已传送至虚空神殿!尽情探索吧!
#ELSESAY
抱歉,<虚空神殿/FCOLOR=253}>是<钻石会员/FCOLOR=253}>专属地图!\\
请先开通<至尊钻石会员/FCOLOR=253}>身份!
关键解释:
Check[VIP_GOLD]1:检查黄金会员标记是否为1(是)。
Check[VIP_DIAMOND]1:检查钻石会员标记是否为1(是)。
OR:引擎的逻辑命令,表示或关系。上面两个条件只要有一个满足即可。
对于"虚空神殿",只用Check[VIP_DIAMOND]1,因为它要求必须是钻石会员。
方式二:在地图进入点直接触发(使用MapEvent.txt或QFunction-0.txt/QManage.txt)
如果地图本身有入口点(比如地图边界的某个坐标或一个传送门NPC),可以在触发文件中配置。
例如,在MapEvent.txt(或引擎特定的地图触发配置文件)中添加:
MapEvent.txt格式可能如下(具体参考引擎手册)
地图号坐标X坐标Y触发的标签(标签写在QFunction-0.txt中)
例如:远古遗迹(地图3)的入口坐标(100100)触发检测
100100@Enter_AncientRuins
然后在QFunction-0.txt(处理功能脚本的文件)中添加标签@Enter_AncientRuins:
[@Enter_AncientRuins]
玩家从坐标点(100100)进入地图3时触发
#IF
检查是否在会员有效期内:黄金或钻石
Check[VIP_GOLD]1
Check[VIP_DIAMOND]1
OR
#ACT
条件满足,允许进入,不做任何处理(玩家直接进地图)
break
#ELSEACT
条件不满足
MapMove<MAP><X><$Y>;把玩家弹回原地(当前地图当前坐标)
或者MapMove0333333;弹回土城安全区
SENDMSG6[警告]禁止进入!<远古遗迹/FCOLOR=249}>为会员专属地图!
break
用同样的方法为"虚空神殿"添加检测点,标签@Enter_VoidTemple,条件改为只检测VIP_DIAMOND=1。
📍第四部分:每日会员奖励领取
可以在会员NPC(@main)或者另外创建一个“会员福利官”NPC中添加。
在会员使者脚本中添加选项
在[@main]的对话中加一个选项:
...之前的对话...
{<领取每日会员福利/@GetDailyReward>}\\
...
[@GetDailyReward]
#IF
如果是黄金会员或者钻石会员
Check[VIP_GOLD]1
Check[VIP_DIAMOND]1
OR
并且检查今天是否已经领取过(使用一个日期标记变量)
假设使用变量[VIP_REWARD_DATE]记录最后领取日期(格式YYYYMMDD)
GetNowDate;获取当前日期到<$STR(D0)>(格式YYYYMMDD)
NOTEqual<STR([VIP_REWARD_DATE])><STR(D0)>
#ACT
符合领取条件
---设置日期标记---
MOVS1<STR(D0)>;把日期存到一个临时变量S1(有些引擎支持直接MOV[VIP_REWARD_DATE]<STR(D0)>
MOV[VIP_REWARD_DATE]<$STR(S1)>
---检查并发放奖励---
#IF
Check[VIP_GOLD]1
#ACT
发放黄金会员奖励
GIVE金币1000000;100万金币
SENDMSG6[福利]黄金会员今日福利:100万金币已发放!
#IF
Check[VIP_DIAMOND]1
#ACT
发放钻石会员奖励(钻石会员额外奖励或只发钻石奖励)
GIVE金币5000000;500万金币
GIVE元宝5;5元宝
SENDMSG6[福利]钻石会员豪华福利:500万金币+5元宝已到账!
goto@main
#ELSESAY
#IF
NOTCheck[VIP_GOLD]1
NOTCheck[VIP_DIAMOND]1
#ACT
#SAY
您还不是任何有效会员,无法领取福利!
#ELSEACT
如果会员检查通过,那么就是日期标记相同(今天已领取过)
#SAY
您今天已经领取过会员福利了,请明天再来!
goto@main
📍第五部分:脚本保存与应用(必读)
检查与调整语法:脚本里的命令(如GetNowDateTimeGetNowDateS0D0MapEvent.txt格式等)务必参考你实际使用的引擎说明书。不同引擎的命令名称、参数和系统变量名可能有差异!
文件存放位置:
QManage.txt:通常是MirServer\Mir200\Envir\QuestDiary\或类似目录下的脚本文件,用于全局触发。
NPC脚本(如会员使者-3.txt):放到MirServer\Mir200\Envir\Market_Def\或MirServer\Mir200\Envir\Merchant.txt指定的NPC脚本目录下。
MapEvent.txt或触发配置:通常在MirServer\Mir200\Envir\根目录下。
QFunction-0.txt:通常在MirServer\Mir200\Envir\目录下,处理各种触发标签。
重新加载或重启:修改脚本文件后:
最简单:重启服务器。
部分引擎支持GM命令实时加载:
加载NPC脚本:@reloadmerchant或@reloadnpc(参数可能是NPC名称或文件名)。
加载全局脚本:@reloadmanage或@reloadqmanage。
加载功能脚本:@reloadqfunction。
加载地图触发:@reloadmapevent或可能需要重启地图(@reloadmon)甚至整个服务器。修改关键脚本后重启通常最稳妥。
测试!测试!测试!务必开GM号或者小号测试各个功能:
购买黄金/钻石会员后,变量是否设置正确?
登陆时到期检测是否正常?
专属地图进入权限是否限制有效?
每日奖励能否正常领取且防止重复?
元宝扣除是否正确?
会员同时存在时的处理是否符合预期?
🚀总结
这套脚本方案的核心在于:
使用[VIP_GOLD][VIP_DIAMOND]标记会员身份类型。
使用VIP_GOLD_TIMEVIP_DIAMOND_TIME记录会员到期时间戳。
在QManage.txt的[@Login]中加入有效期自动检测逻辑。
创建会员NPC处理充值、激活、续费、查询、领奖。
在地图传送点/入口点加入会员身份验证。
在会员NPC中加入每日奖励领取功能。
按照这个思路和提供的脚本示例,结合你的具体引擎调整命令,就能成功实现一套功能完善的钻石会员与黄金会员分类系统(支持时效性会员和专属地图)!遇到具体引擎命令问题,随时查阅手册或寻求对应引擎的技术支持。祝你架服顺利!🎉
🔑核心思路:用变量“标记”会员身份和期限
引擎自带的“游戏会员名单”(GM列表)功能比较单一,通常只支持一种状态(是/否管理员)且无有效期概念。我们要实现复杂的分类会员系统,需要借助引擎的自定义变量系统。
我们将使用两类变量来精确控制:
会员类型变量:
黄金会员标识:比如[VIP_GOLD]。0=不是,1=是(黄金)
钻石会员标识:比如[VIP_DIAMOND]。0=不是,1=是(钻石)
注意:通常一个玩家不能同时是两种有效会员,否则逻辑会混乱。需要设计充值逻辑避免同时激活。
会员有效期变量:
黄金会员到期时间戳:比如VIP_GOLD_TIME
钻石会员到期时间戳:比如VIP_DIAMOND_TIME
时间戳(UnixTimestamp):一个表示某个时间点的数字(如1717843200表示2024年6月8日16:00)。引擎通常有函数获取当前时间戳和时间戳转换功能。
📝脚本实现:五大关键部分
假设我们的引擎支持类似GOMGEEV8LF的常见命令(具体命令名需根据你的引擎微调)。
📍第一部分:会员状态检测(必须添加到登录脚本QManage.txt的[@Login]中!)
这个部分在玩家每次登陆游戏时执行,用于检测其会员是否到期。
添加到你的QManage.txt文件中的[@Login]标签下
[@Login]
;...(这里是你原有的登录触发内容,比如检测新人、送基础物品等)
-----------黄金会员到期检测-----------
#IF
LargeVIP_GOLD_TIME0;检查是否曾经是黄金会员(时间戳大于0)
#ACT
GetNowDateTime;获取当前时间戳到<$STR(S0)>(或者引擎对应的系统时间变量)
MOVS1<$STR(VIP_GOLD_TIME)>
#IF
SmallS1<$STR(S0)>;比较到期时间(S1)是否小于当前时间(S0)?(即到期了)
#ACT
MOVVIP_GOLD_TIME0;到期,清除到期时间
MOVVIP_GOLD0;到期,清除黄金会员身份标记
SENDMSG6[系统提示]您的黄金会员身份已到期!感谢您曾经的惠顾!
break;这里break是为了防止下面检测钻石会员时干扰,到期后跳过后续登陆检测
#ELSEACT
没到期,检查成功,保留标识,不用做特殊处理
SENDMSG6[系统提示]尊贵的黄金会员,您的特权剩余时间:<$STR(VIP_GOLD_TIME)>秒
-----------钻石会员到期检测(逻辑与黄金会员完全一致)-----------
#IF
LargeVIP_DIAMOND_TIME0
#ACT
GetNowDateTime;获取当前时间戳到<$STR(S0)>(或者引擎对应的系统时间变量)
MOVS1<$STR(VIP_DIAMOND_TIME)>
#IF
SmallS1<$STR(S0)>
#ACT
MOVVIP_DIAMOND_TIME0
MOVVIP_DIAMOND0
SENDMSG6[系统提示]您的钻石会员身份已到期!期待您的再次归来!
break
#ELSEACT
SENDMSG6[系统提示]至臻钻石会员,您的特权剩余时间:<$STR(VIP_DIAMOND_TIME)>秒
这里一般不用break,除非你后面还有脚本需要跳过
关键解释:
LargeVIP_GOLD_TIME0:检查VIP_GOLD_TIME这个变量是否大于0。大于0表示玩家曾经是或者现在是黄金会员。
GetNowDateTime:假设引擎命令,功能是获取当前的系统时间戳并存入一个变量(这里假设存到<S0>,请查阅你的引擎手册找到实际命令和变量)。
SmallS1<$STR(S0)>:比较到期时间(存在S1)是否小于当前时间(存在S0)。小于说明到期了。
到期处理:清除会员类型标识(VIP_GOLD=0)和到期时间戳(VIP_GOLD_TIME=0),并发送提示。
未到期处理:发送剩余时间提示(为了直观,最好把秒数转换成天数/小时/分钟显示,可以用引擎的时间计算函数做,为了脚本简洁这里用秒)。
🔥重要提示:再次确保去掉功能块内部不必要的BREAK,像上次学到的,整个[@Login]标签最后用一个BREAK就好!上面的例子需要根据你引擎实际情况调整。
📍第二部分:会员充值/激活NPC(关键)
这个NPC负责让玩家选择充值何种会员以及时长(或者直接用脚本设定固定时长)。我们创建一个新NPC脚本文件(如会员使者-3.txt),放在你的NPC脚本目录下。
;==
文件:会员使者-3.txt
NPC位置:土城(333333)会员使者
;==
[@main]
#IF
#ACT
OpenMerchantBigDialog;打开大对话框(引擎命令可能不同)
#SAY
<尊敬的勇士/{FCOLOR=250}>,欢迎光临会员中心!\\
您当前的身份状态:\\
{★黄金会员状态:/{FCOLOR=249}<$OUTPUT(VIP_GOLD=1?已激活:未激活)>>}/\
{★钻石会员状态:/{FCOLOR=253}<$OUTPUT(VIP_DIAMOND=1?已激活:未激活)>>}\\
{请选择您要办理的业务:/FCOLOR=254}\\
{<购买/激活黄金会员/@BuyGoldVIP>}{/FCOLOR=249}[<剩余时间:/FCOLOR=249>]<$STR(VIP_GOLD_TIME)>秒\\
{<购买/激活钻石会员/@BuyDiamondVIP>}{/FCOLOR=253}[<剩余时间:/FCOLOR=253>]<$STR(VIP_DIAMOND_TIME)>秒\\
{<查询我的会员特权/@QueryVIPBenefits>}\\
{<离开/@exit>}
[@BuyGoldVIP]
#IF
CheckGameGold>999;检查玩家元宝是否大于999(假设1000元宝=1天黄金会员)
#ACT
GameGold-1000;扣除1000元宝
---计算新的到期时间---
GetNowDateTime;获取当前时间戳到S0
MOVS1<$STR(S0)>
假设购买一天:86400秒=24小时60分60秒
INCS186400
如果已有会员时间,则是在原基础上叠加
#IF
LargeVIP_GOLD_TIME0
#ACT
MOVVIP_GOLD_TIME<$STR(S1)>
如果当前没有会员时间,则直接设置到期时间并激活身份
#ELSEACT
MOVVIP_GOLD_TIME<$STR(S1)>
MOVVIP_GOLD1
SENDMSG6[恭喜]您已成功开通或续费黄金会员1天!到期时间:<$STR(VIP_GOLD_TIME)>
清除可能的钻石会员冲突(如果设计不允许同时持有)
MOVVIP_DIAMOND0
MOVVIP_DIAMOND_TIME0
goto@main
#ELSESAY
您的元宝不足1000点!无法开通黄金会员。
goto@main
[@BuyDiamondVIP]
;逻辑与购买黄金会员完全相同,只是变量名、扣费、时间和提示不同
#IF
CheckGamePoint>4999;或者CheckGameGold>4999使用不同货币
#ACT
GameGold-5000;扣5000元宝
GetNowDateTime;当前时间戳->S0
MOVS1<$STR(S0)>
INCS186400;加一天(可按需修改)
#IF
LargeVIP_DIAMOND_TIME0
#ACT
MOVVIP_DIAMOND_TIME<$STR(S1)>
#ELSEACT
MOVVIP_DIAMOND_TIME<$STR(S1)>
MOVVIP_DIAMOND1
SENDMSG6[至尊荣耀]您已成功开通或续费钻石会员1天!享受顶级特权!
清除可能的黄金会员冲突(如果设计不允许同时持有)
MOVVIP_GOLD0
MOVVIP_GOLD_TIME0
goto@main
#ELSESAY
您的资源不足!无法开通钻石会员。
goto@main
[@QueryVIPBenefits]
#SAY
<黄金会员特权/FCOLOR=249>:\\
每日可领取<{100万金币/FCOLOR=250}>!\\
可进入<{远古遗迹/FCOLOR=250}>地图!\\
杀怪经验加成<{10%/FCOLOR=250}>!\\\
<钻石会员特权/FCOLOR=253>:\\
每日可领取<{500万金币+5元宝/FCOLOR=253}>!\\
可进入<{远古遗迹/FCOLOR=253}>和<{虚空神殿/FCOLOR=253}>专属地图!\\
杀怪经验加成<{20%/FCOLOR=253}>+爆率加成<{15%/FCOLOR=253}>!\\
免费使用<{全服传送服务/FCOLOR=253}>!\\
<注:会员特权以游戏内实际为准。/FCOLOR=151}>\\
<返回/@main>
关键解释:
变量检查与显示:在@main使用<STR(VIP_GOLD)>和<STR(VIP_DIAMOND)>显示会员状态(0/1),使用<$STR(VIP_GOLD_TIME/VIP_DIAMOND_TIME)>显示剩余秒数(最好转换一下成天/时/分)。
扣费逻辑:CheckGameGold>999检查玩家元宝是否足够。GameGold-1000扣除相应元宝。
时间叠加逻辑:
GetNowDateTime获取当前时间戳。
INCS186400在当前时间戳基础上增加86400秒(即1天)。你可以修改86400这个数值来代表不同的时长(如259200是3天)。
如果玩家已经有会员时间(LargeVIP_GOLD_TIME0),则只在原有到期时间的基础上增加购买时长(MOVVIP_GOLD_TIME<$STR(S1)>)。
如果玩家没有会员时间(LargeVIP_GOLD_TIME0不成立),则设置到期时间为购买时长后的时间戳并激活会员标识(MOVVIP_GOLD1)。
会员类型互斥(可选):代码中被注释掉的部分(MOVVIP_DIAMOND0...)是用于处理如果你设计为不允许玩家同时拥有两种会员的情况。开通钻石时强制清除黄金会员状态(或反之)。
特权查询:@QueryVIPBenefits简单列出不同会员的特权描述(如地图进入权限、奖励等)。
📍第三部分:会员专属地图进入权限控制
通常在地图传送NPC上或者地图入口点(使用MapEvent.txt或QManage.txt的[@OnMapEvent])添加权限验证。
方式一:在传送NPC脚本中添加条件(推荐)
假设NPC(如"地图传送员")负责传送到"远古遗迹(黄金、钻石可进)"和"虚空神殿(仅钻石可进)"。
在你的传送NPC脚本中修改传送到这些地图的选项:
[@传送到远古遗迹]
;(假设这是传送命令)
#IF
条件:是黄金会员"或"是钻石会员(VIP_GOLD=1或VIP_DIAMOND=1)
Check[VIP_GOLD]1
Check[VIP_DIAMOND]1
OR;满足上面两个条件中的一个即可(黄金或钻石)
#ACT
MapMove3333333;假设传送到地图3的(333333)
SENDMSG6已传送至远古遗迹!
#ELSESAY
抱歉,<远古遗迹/FCOLOR=249}>是会员专属地图!\\
请先开通<黄金会员/FCOLOR=249}>或<钻石会员/FCOLOR=253}>身份!
[@传送到虚空神殿]
#IF
条件:必须是钻石会员(VIP_DIAMOND=1)
Check[VIP_DIAMOND]1
#ACT
MapMove4333333;假设传送到地图4的(333333)
SENDMSG6已传送至虚空神殿!尽情探索吧!
#ELSESAY
抱歉,<虚空神殿/FCOLOR=253}>是<钻石会员/FCOLOR=253}>专属地图!\\
请先开通<至尊钻石会员/FCOLOR=253}>身份!
关键解释:
Check[VIP_GOLD]1:检查黄金会员标记是否为1(是)。
Check[VIP_DIAMOND]1:检查钻石会员标记是否为1(是)。
OR:引擎的逻辑命令,表示或关系。上面两个条件只要有一个满足即可。
对于"虚空神殿",只用Check[VIP_DIAMOND]1,因为它要求必须是钻石会员。
方式二:在地图进入点直接触发(使用MapEvent.txt或QFunction-0.txt/QManage.txt)
如果地图本身有入口点(比如地图边界的某个坐标或一个传送门NPC),可以在触发文件中配置。
例如,在MapEvent.txt(或引擎特定的地图触发配置文件)中添加:
MapEvent.txt格式可能如下(具体参考引擎手册)
地图号坐标X坐标Y触发的标签(标签写在QFunction-0.txt中)
例如:远古遗迹(地图3)的入口坐标(100100)触发检测
100100@Enter_AncientRuins
然后在QFunction-0.txt(处理功能脚本的文件)中添加标签@Enter_AncientRuins:
[@Enter_AncientRuins]
玩家从坐标点(100100)进入地图3时触发
#IF
检查是否在会员有效期内:黄金或钻石
Check[VIP_GOLD]1
Check[VIP_DIAMOND]1
OR
#ACT
条件满足,允许进入,不做任何处理(玩家直接进地图)
break
#ELSEACT
条件不满足
MapMove<MAP><X><$Y>;把玩家弹回原地(当前地图当前坐标)
或者MapMove0333333;弹回土城安全区
SENDMSG6[警告]禁止进入!<远古遗迹/FCOLOR=249}>为会员专属地图!
break
用同样的方法为"虚空神殿"添加检测点,标签@Enter_VoidTemple,条件改为只检测VIP_DIAMOND=1。
📍第四部分:每日会员奖励领取
可以在会员NPC(@main)或者另外创建一个“会员福利官”NPC中添加。
在会员使者脚本中添加选项
在[@main]的对话中加一个选项:
...之前的对话...
{<领取每日会员福利/@GetDailyReward>}\\
...
[@GetDailyReward]
#IF
如果是黄金会员或者钻石会员
Check[VIP_GOLD]1
Check[VIP_DIAMOND]1
OR
并且检查今天是否已经领取过(使用一个日期标记变量)
假设使用变量[VIP_REWARD_DATE]记录最后领取日期(格式YYYYMMDD)
GetNowDate;获取当前日期到<$STR(D0)>(格式YYYYMMDD)
NOTEqual<STR([VIP_REWARD_DATE])><STR(D0)>
#ACT
符合领取条件
---设置日期标记---
MOVS1<STR(D0)>;把日期存到一个临时变量S1(有些引擎支持直接MOV[VIP_REWARD_DATE]<STR(D0)>
MOV[VIP_REWARD_DATE]<$STR(S1)>
---检查并发放奖励---
#IF
Check[VIP_GOLD]1
#ACT
发放黄金会员奖励
GIVE金币1000000;100万金币
SENDMSG6[福利]黄金会员今日福利:100万金币已发放!
#IF
Check[VIP_DIAMOND]1
#ACT
发放钻石会员奖励(钻石会员额外奖励或只发钻石奖励)
GIVE金币5000000;500万金币
GIVE元宝5;5元宝
SENDMSG6[福利]钻石会员豪华福利:500万金币+5元宝已到账!
goto@main
#ELSESAY
#IF
NOTCheck[VIP_GOLD]1
NOTCheck[VIP_DIAMOND]1
#ACT
#SAY
您还不是任何有效会员,无法领取福利!
#ELSEACT
如果会员检查通过,那么就是日期标记相同(今天已领取过)
#SAY
您今天已经领取过会员福利了,请明天再来!
goto@main
📍第五部分:脚本保存与应用(必读)
检查与调整语法:脚本里的命令(如GetNowDateTimeGetNowDateS0D0MapEvent.txt格式等)务必参考你实际使用的引擎说明书。不同引擎的命令名称、参数和系统变量名可能有差异!
文件存放位置:
QManage.txt:通常是MirServer\Mir200\Envir\QuestDiary\或类似目录下的脚本文件,用于全局触发。
NPC脚本(如会员使者-3.txt):放到MirServer\Mir200\Envir\Market_Def\或MirServer\Mir200\Envir\Merchant.txt指定的NPC脚本目录下。
MapEvent.txt或触发配置:通常在MirServer\Mir200\Envir\根目录下。
QFunction-0.txt:通常在MirServer\Mir200\Envir\目录下,处理各种触发标签。
重新加载或重启:修改脚本文件后:
最简单:重启服务器。
部分引擎支持GM命令实时加载:
加载NPC脚本:@reloadmerchant或@reloadnpc(参数可能是NPC名称或文件名)。
加载全局脚本:@reloadmanage或@reloadqmanage。
加载功能脚本:@reloadqfunction。
加载地图触发:@reloadmapevent或可能需要重启地图(@reloadmon)甚至整个服务器。修改关键脚本后重启通常最稳妥。
测试!测试!测试!务必开GM号或者小号测试各个功能:
购买黄金/钻石会员后,变量是否设置正确?
登陆时到期检测是否正常?
专属地图进入权限是否限制有效?
每日奖励能否正常领取且防止重复?
元宝扣除是否正确?
会员同时存在时的处理是否符合预期?
🚀总结
这套脚本方案的核心在于:
使用[VIP_GOLD][VIP_DIAMOND]标记会员身份类型。
使用VIP_GOLD_TIMEVIP_DIAMOND_TIME记录会员到期时间戳。
在QManage.txt的[@Login]中加入有效期自动检测逻辑。
创建会员NPC处理充值、激活、续费、查询、领奖。
在地图传送点/入口点加入会员身份验证。
在会员NPC中加入每日奖励领取功能。
按照这个思路和提供的脚本示例,结合你的具体引擎调整命令,就能成功实现一套功能完善的钻石会员与黄金会员分类系统(支持时效性会员和专属地图)!遇到具体引擎命令问题,随时查阅手册或寻求对应引擎的技术支持。祝你架服顺利!🎉

