双倍勋章限时功能通过数据库字段扩展与脚本逻辑实现,核心原理为佩戴触发计时、变量存储剩余时间、离线数据保存、到期自动删除。以下为完整实现方案。
数据库配置添加计时字段。打开DBC2000,进入HeroDB找到StdItems.DB(物品数据库)。添加新物品或编辑现有双倍勋章,设置基础属性:名称“双倍勋章”,StdMode值根据装备类型设定(勋章通常为19),Shape值定义外观,AniCount字段填写触发脚本编号(如888)。新增三个自定义字段:WearTime(整数型,存储佩戴时间戳)、RemainTime(整数型,存储剩余秒数)、IsTiming(整数型,计时状态标识,0未计时/1计时中)。字段添加后保存数据库,重启服务端使修改生效。
物品基础属性设置双倍效果。在物品数据库的AC、MAC、DC等字段设置基础属性,Special字段添加“DoubleExp=1;DoubleDrop=1”实现双倍经验与爆率。Source字段设为0表示计时物品,DuraMax字段可设置初始持久。物品描述注明“佩戴后获得30分钟双倍效果,时间结束自动消失”。
佩戴触发计时脚本编写。打开Mir200\Envir\Market_Def\QFunction-0.txt文件,添加以下脚本:
[@穿戴装备]
#IF
CHECKITEMW 双倍勋章 1
CHECKVAR HUMAN IsTiming = 0
#ACT
;记录佩戴时间戳
SETVAR HUMAN WearTime = <$DATETIME>
;设置剩余时间1800秒(30分钟)
SETVAR HUMAN RemainTime = 1800
;设置计时状态
SETVAR HUMAN IsTiming = 1
;发送佩戴提示
SENDMSG 6 双倍勋章已激活!剩余时间:30分钟,小退可查看剩余时间。
;启动计时循环
GOTO @计时循环
计时循环脚本实现实时倒计时。在QFunction-0.txt继续添加:
[@计时循环]
#IF
CHECKVAR HUMAN IsTiming = 1
CHECKITEMW 双倍勋章 1
#ACT
;等待1秒
DELAY 1000
;剩余时间减1
CALCVAR HUMAN RemainTime = <$HUMAN(RemainTime)> - 1
;更新变量
SAVEVAR HUMAN RemainTime
;检查是否到期
#IF
SMALL <$HUMAN(RemainTime)> 1
#ACT
;删除装备
TAKE 双倍勋章 1
;重置状态
SETVAR HUMAN IsTiming = 0
CLEARVAR HUMAN WearTime
CLEARVAR HUMAN RemainTime
SENDMSG 6 双倍勋章时间已到,自动消失!
#ELSEACT
;显示剩余时间(每分钟提示)
#IF
EQUAL <$HUMAN(RemainTime)> 1800
#ACT
SENDMSG 6 双倍勋章剩余时间:30分钟
#IF
EQUAL <$HUMAN(RemainTime)> 900
#ACT
SENDMSG 6 双倍勋章剩余时间:15分钟
#IF
EQUAL <$HUMAN(RemainTime)> 300
#ACT
SENDMSG 6 双倍勋章剩余时间:5分钟
#IF
EQUAL <$HUMAN(RemainTime)> 60
#ACT
SENDMSG 6 双倍勋章剩余时间:1分钟
;继续循环
GOTO @计时循环
小退上线提示剩余时间。在登录触发脚本中设置提示,打开QManage.txt文件添加:
[@Login]
#IF
CHECKVAR HUMAN IsTiming = 1
CHECKVAR HUMAN RemainTime > 0
#ACT
;计算剩余分钟
DIV N1 <$HUMAN(RemainTime)> 60
;显示提示
SENDMSG 6 双倍勋章剩余时间:<$STR(N1)>分钟
大退离线时间计算。需要记录离线时间,在QFunction-0.txt添加下线触发:
[@PlayOffline]
#IF
CHECKVAR HUMAN IsTiming = 1
#ACT
;记录下线时间戳
SETVAR HUMAN OfflineTime = <$DATETIME>
SAVEVAR HUMAN OfflineTime
上线时计算离线期间消耗时间。修改QManage.txt的[@Login]段:
[@Login]
#IF
CHECKVAR HUMAN IsTiming = 1
CHECKVAR HUMAN OfflineTime > 0
#ACT
;计算离线时长(秒)
CALCVAR HUMAN OfflineDuration = <$DATETIME> - <$HUMAN(OfflineTime)>
;扣除离线时间
CALCVAR HUMAN RemainTime = <$HUMAN(RemainTime)> - <$HUMAN(OfflineDuration)>
;清除离线时间变量
CLEARVAR HUMAN OfflineTime
SAVEVAR HUMAN RemainTime
;检查是否过期
#IF
SMALL <$HUMAN(RemainTime)> 1
#ACT
TAKE 双倍勋章 1
SETVAR HUMAN IsTiming = 0
CLEARVAR HUMAN WearTime
CLEARVAR HUMAN RemainTime
SENDMSG 6 双倍勋章已在离线期间到期!
#ELSEACT
;显示剩余时间
DIV N1 <$HUMAN(RemainTime)> 60
SENDMSG 6 双倍勋章剩余时间:<$STR(N1)>分钟(已扣除离线时间)
变量保存确保数据持久。人物变量需使用HUMAN类型,此类变量自动保存至数据库,小退大退后仍可读取。变量名称前缀避免与系统冲突,建议使用“ZX_”开头,如“ZX_WearTime”、“ZX_RemainTime”。
装备取下处理计时暂停。在QFunction-0.txt添加卸下装备触发:
[@TakeOff装备]
#IF
CHECKITEM 双倍勋章 1
CHECKVAR HUMAN IsTiming = 1
#ACT
;暂停计时
SETVAR HUMAN IsTiming = 0
SENDMSG 6 已取下双倍勋章,计时暂停。
再次佩戴恢复计时。修改穿戴触发脚本,增加恢复计时逻辑:
[@穿戴装备]
#IF
CHECKITEMW 双倍勋章 1
#ACT
;检查是否已有计时变量
#IF
CHECKVAR HUMAN RemainTime > 0
#ACT
;恢复计时
SETVAR HUMAN IsTiming = 1
SENDMSG 6 双倍勋章计时恢复!剩余时间:<$HUMAN(RemainTime)>秒
GOTO @计时循环
#ELSEACT
;全新开始计时
SETVAR HUMAN WearTime = <$DATETIME>
SETVAR HUMAN RemainTime = 1800
SETVAR HUMAN IsTiming = 1
SENDMSG 6 双倍勋章已激活!剩余时间:30分钟。
GOTO @计时循环
多角色同时佩戴处理。使用个人变量确保每个角色独立计时,变量作用域为当前角色,不同角色变量互不干扰。脚本中所有变量操作均针对当前登录角色。
时间显示格式优化。将秒数转换为分钟和秒显示,在提示脚本中添加:
#ACT
;计算分钟和秒
DIV N1 <$HUMAN(RemainTime)> 60
MOD N2 <$HUMAN(RemainTime)> 60
SENDMSG 6 双倍勋章剩余时间:<$STR(N1)>分<$STR(N2)>秒
引擎兼容性调整。不同引擎变量语法略有差异,GOM引擎使用“HUMAN”变量,GEE引擎使用“P”变量,BLUE引擎使用“U”变量。根据实际引擎调整变量前缀,GEE引擎示例:SET [P]RemainTime = 1800。
计时精度控制。DELAY 1000存在微小误差,累计30分钟可能偏差数秒。如需精确计时,可使用引擎自带定时器功能,部分引擎支持“SETTIMER”命令设置毫秒级定时器。
物品唯一性保证。通过检测装备位置确保仅对佩戴的勋章计时,使用“CHECKITEMW”检测穿戴中物品,“CHECKITEM”检测背包物品。取下时立即暂停计时,避免背包中物品继续消耗时间。
数据库字段扩展方案。若引擎不支持自定义字段,可使用现有字段存储时间数据。如使用DuraMax字段存储剩余秒数,每次计时减少持久值,持久为0时物品消失。但此方法无法记录精确时间戳。
脚本性能优化。计时循环每秒执行可能增加服务器负担,可调整为每10秒检测一次,每次扣除10秒。修改DELAY值为10000,CALCVAR扣除值改为10。提示频率相应调整,每60秒提示一次。
错误处理与容错。脚本中添加充分的条件判断,避免变量未定义导致的错误。每个变量操作前检查是否存在,使用“CHECKVAR”命令验证变量状态。
测试验证流程。创建测试角色,佩戴双倍勋章,观察计时开始提示。小退后重新登录,检查剩余时间提示是否正确。等待30分钟,验证物品是否自动删除。大退测试离线时间计算准确性。
备选方案使用Need字段。部分引擎支持Need字段设置限时物品,在物品数据库设置Need=101,NeedLevel=30(分钟)。此方法简单但功能有限,无法实现小退提示和离线计时,仅适合基础需求。
扩展功能建议。可添加时间暂停道具,使用特定物品暂停勋章计时。添加时间增加道具,击杀怪物或完成任务增加剩余时间。添加时间显示界面,在角色信息栏显示勋章剩余时间。
通过上述脚本组合,实现双倍勋章30分钟限时功能,支持小退大退计时继续,小退上线显示剩余时间。关键点在于变量存储与计算、离线时间处理、引擎兼容调整。实际部署前需在测试环境充分验证,确保各环节衔接无误。

