传奇杀怪数量提醒:KillMon计数与SENDMSG写法

来源: 作者: 点击:
杀怪提醒不是 NPC 里写个“你杀了几个怪”就行,得靠引擎的杀怪触发标签把每次击杀接住,再给玩家变量加 1,最后用 SENDMSG 把变量打出来。不同引擎触发名不一样:BLUE/LEG 多在 QFunction-0.txt 用 [@KillMon],GOM/GEE/996 类也认 [@KillMon],老版有的走 MapQuest 的 [MonDie]。

BLUE/LEG 引擎最直白写法
文件:Mir200\Envir\MapQuest_def\QFunction-0.txt

[@KillMon]
IF

ACT

INC N$杀怪总数 1
SENDMSG 6 你又干掉一只怪,当前累计击杀:<STR(N杀怪总数)> 只
BREAK

N$ 开头是 BLUE 的玩家私有字符/数字变量,INC 就是加 1。玩家每次砍死怪,QF 的 [@KillMon] 自动跑一次,聊天框就弹“当前累计击杀:N 只”。想只统计某张图:

[@KillMon]
IF

CHECKMAPNAME 015
ACT

INC N$祖玛杀怪 1
SENDMSG 6 祖玛寺庙击杀:<STR(N祖玛杀怪)> 只
BREAK

CHECKMAPNAME 后面跟地图号或地图名,看引擎版本。BLUE 的 [@KillMon] 还能拿 PARAM(0) 怪物名、PARAM(1) 地图编号、PARAM(2) 地图名、PARAM(3) 怪物等级,要喊“你杀了白野猪”就写:
SENDMSG 6 你击杀了<PARAM(0)>,累计:<STR(N$杀怪总数)> 只

GOM/GEE/996 写法
文件放 QuestDiary\功能\杀怪计数.txt 或 QManage.txt 里:

[@KillMon]
IF

ACT

INC U1 1
SENDMSG 6 击杀数+1,当前杀怪值:<$STR(U1)>
IF

EQUAL U1 10
ACT

CHANGEEXP + 1000000
SENDMSG 0 玩家[%s]累计杀10怪,奖励100万经验
MOV U1 0
BREAK

U 系列是玩家私有可保存变量,INC U1 1 就是击杀加一,EQUAL U1 10 用来做阶段奖励。

只提醒“每杀 5 只说一次”
[@KillMon]
IF

ACT

INC N$杀怪总数 1
IF

CHECKLEVELEX > 0
PERCENTVAL <STR(N杀怪总数)> 5 = 0
ACT

SENDMSG 6 已击杀<STR(N杀怪总数)>只,继续冲!
BREAK

没 PERCENTVAL 命令的老引擎,就用取模思路或另开变量:
INC N$杀怪总数 1
INC N$杀怪临时 1
IF

LARGE N$杀怪临时 4
ACT

SENDMSG 6 每5只提醒:已杀<STR(N杀怪总数)>只
MOV N$杀怪临时 0
BREAK

按怪物种类统计
[@KillMon]
IF

CHECKMCNAME 沃玛卫士
ACT

CALCVAR HUMAN 沃玛击杀数 +1
SENDMSG 6 沃玛卫士击杀:<$.沃玛击杀数> 只
BREAK

部分引擎用 CalcVarHUMAN / SaveVarHUMAN:
[@KillMon]
IF

CHECKMCNAME 沃玛卫士
ACT

CalcVarHUMAN 沃玛击杀数 +1
SaveVarHUMAN 沃玛击杀数 ..\QuestDiary\数据\击杀记录.txt
IF

EQUAL 100
ACT

GIVE 沃玛号角 1
SENDMSG 0 [%s]累计杀100只沃玛卫士,掉号角!
MOVHUMAN 沃玛击杀数 0
BREAK

NPC 里查看当前杀了多少
Market_Def\杀怪统计.txt:

[@main]
你的击杀数据\
总击杀:<STR(N杀怪总数)> 只\
祖玛击杀:<STR(N祖玛杀怪)> 只\
沃玛击杀:<$.沃玛击杀数> 只\
<清统计/@clear>\
<离开/@exit>\

[@clear]
IF

ACT

MOV N$杀怪总数 0
MOV N$祖玛杀怪 0
MOVHUMAN 沃玛击杀数 0
SENDMSG 6 击杀统计已清零
GOTO @main

每天零点重置
[@Login] 或定时器里:

[@DayReset]
IF

ACT

MOV N$杀怪总数 0
MOV N$祖玛杀怪 0
MOVHUMAN 沃玛击杀数 0
SENDMSG 6 新的一天,击杀计数已重置
BREAK

更稳的是登录时比日期:

[@Login]
IF

NOTEQUAL S昨天日期 <DATE>
ACT

MOV N$今日杀怪 0
MOV S昨天日期 <DATE>
BREAK

常见不生效原因
• 脚本写进 NPC 的 [@main] 里了,NPC 不会自动知道你杀怪,必须放 QFunction / QuestDiary 的杀怪触发段。

• 用了 D0/P0 这种临时变量,小退、掉线、切地图被冲掉,看起来“杀怪数不涨”,换 N/U/HUMAN 变量。

• 宝宝杀怪没算:QF 里要用 KILLERTYPE 判断,1=人物 2=英雄 3=宝宝,想连英雄宝宝一起算就别卡 KILLERTYPE。

• 地图参数没开杀怪触发:部分地图要在 MapInfo 里加 KillFUNC 或相关参数才会跑 [@KillMon]。

• 变量名带中文有的引擎吃,有的不吃,BLUE 支持 N$中文,GOM 老版本更稳的是 U1/U2、N1/N2。

• SENDMSG 频道号乱填:6 是玩家私聊式提示,0 是全服,5 是系统黄字,写错不是没杀,是发到别的频道你看不到。

最通用能抄的版本
QFunction-0.txt:

[@KillMon]
IF

ACT

INC N1 1
SENDMSG 6 击杀怪物+1,当前已杀:<$STR(N1)> 只
IF

EQUAL N1 50
ACT

CHANGEEXP + 500000
SENDMSG 6 杀满50只,经验+50万
BREAK
IF

EQUAL N1 100
ACT

GIVE 金币 100000
SENDMSG 0 [%s]杀满100只怪物,全服广播发钱!
MOV N1 0
BREAK

N1 是数字变量,<$STR(N1)> 把数字转成文本显示;杀满 50 给经验,杀满 100 发全服公告并清零。想按地图、按怪名、按天数、按行会统计,都是在这个骨架上加 #IF 判断,不是换引擎命令。

怪物死的时候想喊“XXX 被 XXX 杀了”
BLUE 里:
[@KillMon]
ACT

SENDMSG 5 玩家[%s]在<%m>(<%x>:<%y>)击杀了<$PARAM(0)>
BREAK

%m 当前地图,%x/%y 坐标,%s 玩家名,$PARAM(0) 怪名。这样玩家边打边看聊天栏就知道“我又杀了几只、杀的啥”。

杀怪数存数据库别丢
BLUE:N$变量本身按玩家存。
GOM/GEE:U 变量通常按账号/角色存,别用 D/P。
要跨服/跨天保留就用 SaveVarHUMAN / setplayvar 存库,别用 D0 当长期计数。

副本“清完怪提醒”
配合地图怪物数:
[@KillMon]
IF

ACT

INC N$副本杀怪 1
IF

CheckMapMonCount 088 0
ACT

SENDMSG 6 副本怪物已清空,可以找传送员出门
BREAK

CheckMapMonCount 地图号 0 就是“该图怪数为0”,和杀怪计数一起用,玩家每杀一只看进度,清完弹提示,比纯 NPC 点一下真实得多。

一句话落点:杀怪提醒 = 杀怪触发标签 + INC 变量 + SENDMSG 打变量。NPC 只负责“查数”,QF/QuestDiary 才负责“记数”。