传奇服务端检测指定地图指定怪物数量的脚本,核心依赖Envir目录下的脚本函数,通过指定地图编号、怪物名称获取数量数据,适配各类场景需求(如活动开启条件、刷怪阈值控制等)。以下是具体实现思路、完整脚本示例及关键参数说明。
一、核心实现思路与依赖函数
脚本核心通过服务端内置函数GetMapMonsterCount实现功能,该函数可精准获取指定地图内指定怪物的实时数量,无需额外调用数据库,直接读取游戏运行时的内存数据,响应高效。
1. 核心函数格式:GetMapMonsterCount 地图编号 怪物名称
2. 函数返回值:整数类型,代表目标地图内目标怪物的当前存活数量(不包含已死亡未刷新的怪物)。
3. 依赖目录与文件:脚本需编写在Envir/MapQuest_def目录下(触发类脚本)或Envir/QuestDiary目录下(自定义功能脚本),通过游戏内触发事件(如NPC对话、定时触发、区域进入触发)执行。
4. 关键参数说明:
(1)地图编号:传奇服务端中每个地图对应唯一数字编号,可在Envir/MapInfo.txt文件中查询(格式为“地图编号 地图名称”),例如比奇省为3、盟重省为4、沙巴克为600。
(2)怪物名称:需与服务端MonItems文件夹内爆率文件中的怪物名称完全一致(区分大小写),例如“稻草人”“牛魔王”“暗之触龙神”,名称错误会导致计数失败。
二、基础检测脚本示例(NPC触发型)
适用场景:玩家与指定NPC对话时,检测目标地图内目标怪物数量并反馈结果,脚本编写在Envir/MapQuest_def/文件夹下,命名为“CheckMonsterCount.txt”,通过NPC脚本关联调用。
1. 完整脚本代码:
; 检测指定地图指定怪物数量脚本 - NPC触发
; 脚本入口:与NPC对话触发
Sub CheckMonsterNum
; 定义变量存储地图编号、怪物名称、怪物数量
Dim MapID, MonsterName, MonsterCount
; 赋值目标地图编号(此处以盟重省为例,编号4)
MapID = 4
; 赋值目标怪物名称(此处以牛魔王为例)
MonsterName = "牛魔王"
; 调用核心函数获取怪物数量
MonsterCount = GetMapMonsterCount(MapID, MonsterName)
; 向玩家反馈检测结果
If MonsterCount >= 0 Then
SendMsg 6, "当前【" & GetMapName(MapID) & "】内【" & MonsterName & "】数量:" & MonsterCount & "只"
Else
; 计数失败反馈(多为地图编号或怪物名称错误)
SendMsg 6, "检测失败,请确认地图编号或怪物名称是否正确"
End If
End Sub
; 辅助函数:通过地图编号获取地图名称(可选,提升反馈可读性)
Function GetMapName(MapID)
Dim MapName
Select Case MapID
Case 3 : MapName = "比奇省"
Case 4 : MapName = "盟重省"
Case 5 : MapName = "毒蛇山谷"
Case 45 : MapName = "石墓七层"
Case 600 : MapName = "沙巴克"
Case Else : MapName = "未知地图"
End Select
GetMapName = MapName
End Function
2. NPC关联配置:在Envir/MerChant.TXT文件中添加NPC配置,关联上述脚本,示例如下:
; NPC名称 地图编号 X坐标 Y坐标 外观编号 脚本名称 对话内容
检测员 3 320 280 120 CheckMonsterCount.txt 点击我检测指定地图怪物数量
3. 脚本执行逻辑:玩家进入比奇省(地图3)找到“检测员”NPC并点击,脚本自动执行CheckMonsterNum子程序,获取盟重省(地图4)内牛魔王数量,通过系统消息(6号频道)反馈给玩家。
三、进阶检测脚本示例(定时触发+阈值控制)
适用场景:定时检测目标地图怪物数量,当数量低于设定阈值时自动触发刷怪,脚本编写在Envir/QuestDiary/文件夹下,命名为“AutoCheckAndSpawnMonster.txt”,通过定时触发函数启动。
1. 完整脚本代码:
; 定时检测怪物数量并自动刷怪脚本
; 脚本入口:服务端启动后自动加载,定时执行
Sub AutoCheckMonster
; 定义核心参数
Dim TargetMapID, TargetMonster, MinCount, SpawnNum, SpawnX1, SpawnX2, SpawnY1, SpawnY2
; 目标地图编号(石墓七层,编号45)
TargetMapID = 45
; 目标怪物名称(白野猪)
TargetMonster = "白野猪"
; 最低阈值:怪物数量低于此值则刷怪
MinCount = 10
; 每次刷怪数量
SpawnNum = 5
; 刷怪坐标范围(石墓七层核心区域)
SpawnX1 = 60 : SpawnX2 = 80
SpawnY1 = 50 : SpawnY2 = 70
; 1. 获取当前怪物数量
Dim CurrentCount
CurrentCount = GetMapMonsterCount(TargetMapID, TargetMonster)
; 2. 判断是否需要刷怪
If CurrentCount < MinCount And CurrentCount >= 0 Then
; 执行刷怪操作
Dim i, SpawnX, SpawnY
For i = 1 To SpawnNum
; 随机生成刷怪坐标(在设定范围内)
SpawnX = Int(Rnd() * (SpawnX2 - SpawnX1 + 1)) + SpawnX1
SpawnY = Int(Rnd() * (SpawnY2 - SpawnY1 + 1)) + SpawnY1
; 调用刷怪函数:SpawnMonster 地图编号 X坐标 Y坐标 怪物名称 数量 是否主动攻击
SpawnMonster TargetMapID, SpawnX, SpawnY, TargetMonster, 1, 1
Next
; 记录日志(可选,便于排查)
WriteLog "AutoSpawnLog.txt", GetMapName(TargetMapID) & "-" & TargetMonster & "数量不足" & MinCount & ",已补充" & SpawnNum & "只"
; 向全服发送通知(可选)
SendBroadMsg 6, "【系统通知】" & GetMapName(TargetMapID) & "内" & TargetMonster & "数量不足,已自动补充!"
ElseIf CurrentCount < 0 Then
; 检测失败记录日志
WriteLog "AutoSpawnLog.txt", "检测" & GetMapName(TargetMapID) & "-" & TargetMonster & "失败,参数错误"
End If
; 3. 设定定时执行:每隔300秒(5分钟)执行一次
SetTimer "AutoCheckMonster", 300, "AutoCheckMonster"
End Sub
; 辅助函数:获取地图名称
Function GetMapName(MapID)
Dim MapName
Select Case MapID
Case 45 : MapName = "石墓七层"
Case 46 : MapName = "祖玛寺庙七层"
Case 70 : MapName = "赤月峡谷"
Case Else : MapName = "未知地图"
End Select
GetMapName = MapName
End Function
; 脚本初始化:服务端启动后执行一次,启动定时检测
AutoCheckMonster
2. 脚本加载配置:无需额外关联NPC,服务端启动时会自动加载Envir/QuestDiary目录下的脚本,通过脚本末尾的“AutoCheckMonster”调用初始化,启动300秒定时检测。
3. 核心功能说明:脚本每5分钟检测一次石墓七层(地图45)内白野猪数量,当数量低于10只时,在指定坐标范围内随机刷出5只主动攻击型白野猪,同时记录操作日志并发送全服通知;检测失败时会记录错误日志,便于后续排查参数问题。
四、脚本编写关键注意事项
1. 参数准确性校验:编写脚本前需通过Envir/MapInfo.txt确认目标地图编号,通过Envir/MonItems文件夹下的爆率文件确认怪物名称(例如Mon1.txt对应低等级怪物),名称或编号错误会导致函数返回-1,检测失败。
2. 坐标范围合理性:刷怪脚本中需根据目标地图实际地形设定坐标范围,避免将怪物刷在障碍物内(如墙壁、岩浆)或地图边界外,可通过游戏内GM命令“@查看坐标”获取合理坐标范围。
3. 定时频率控制:定时检测脚本的执行间隔需合理设定,间隔过短(如10秒内)会增加服务端运行压力,建议根据怪物刷新周期设定(普通怪物5-10分钟,BOSS类1-2小时)。
4. 日志记录建议:添加日志记录函数(WriteLog)可便于后续排查问题,日志文件会生成在Envir目录下,格式为“日志文件名 日志内容”,建议包含检测时间、地图名称、怪物名称、操作结果等信息。
5. 函数兼容性:GetMapMonsterCount函数适用于多数传奇服务端版本(含1.75、1.76等经典版本),若服务端版本特殊导致函数无效,可替换为GetMonsterCount函数(格式一致,部分版本命名差异)。
五、常见问题排查
1. 检测结果始终为-1:优先检查地图编号和怪物名称是否正确,确认无大小写错误;若参数正确仍异常,可能是服务端未加载对应怪物数据,需检查Envir/MonGen.txt文件中是否配置了该怪物的刷怪规则。
2. 定时脚本不执行:检查脚本是否放置在Envir/QuestDiary目录下,文件名是否以.txt结尾;服务端启动后需确认脚本已加载,可通过GM命令“@脚本列表”查看已加载的脚本名称。
3. 刷怪后怪物不显示:检查刷怪坐标是否在地图合理范围内,避免坐标超出地图边界;同时确认怪物名称对应的外观资源文件(Mon系列WIL文件)存在于客户端Data目录,客户端资源缺失会导致怪物无法显示。
4. 服务端卡顿:若存在多个定时检测脚本,需优化执行间隔,避免多个脚本同时执行;减少单次刷怪数量,避免短时间内大量生成怪物导致服务端内存占用过高。
六、扩展应用场景脚本片段
1. 区域进入触发检测:玩家进入指定区域时检测怪物数量,不满足条件则禁止进入,脚本片段如下:
; 区域进入触发检测
Sub EnterAreaCheck
Dim PlayerMapID, TargetMonster, NeedCount
PlayerMapID = GetPlayerMapID() ; 获取玩家当前地图编号
TargetMonster = "暗之牛魔王"
NeedCount = 5 ; 进入条件:目标怪物数量≥5只
Dim CurrentCount
CurrentCount = GetMapMonsterCount(PlayerMapID, TargetMonster)
If CurrentCount < NeedCount And CurrentCount >= 0 Then
SendMsg 6, "当前地图" & TargetMonster & "数量不足" & NeedCount & "只,无法进入该区域!"
MovePlayer PlayerMapID, 300, 300 ; 将玩家传送回地图安全区
End If
End Sub
2. 任务完成条件检测:玩家提交任务时,检测指定地图怪物数量是否达标,脚本片段如下:
; 任务完成条件检测
Sub TaskCompleteCheck
Dim TaskMapID, TaskMonster, TaskCount
TaskMapID = 70 ; 赤月峡谷
TaskMonster = "赤月恶魔"
TaskCount = 1 ; 任务要求:怪物数量≤1只(即击杀至少1只)
Dim CurrentCount
CurrentCount = GetMapMonsterCount(TaskMapID, TaskMonster)
If CurrentCount <= TaskCount And CurrentCount >= 0 Then
SendMsg 6, "任务完成!已确认" & GetMapName(TaskMapID) & TaskMonster & "数量达标"
GiveItem "金币", 10000 ; 发放任务奖励
Else
SendMsg 6, "任务未完成,请先击杀至少1只" & TaskMonster
End If
End Sub

