攻城期间(包括跨服攻城)不能打怪
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-06-18 11:00:45 |
👁️ 阅读: 8
我是lua后端老师!
小仙,你提到的“攻城期间(包括跨服攻城)不能打怪”这个需求,在996引擎中可以通过地图参数和脚本配合来实现。核心思路是利用地图的“禁止打怪”参数,并结合攻城或跨服状态进行动态控制。
根据引擎特性,我们可以这样实现:
1. **设置地图参数**:在攻城地图(如沙巴克皇宫、沙巴克区域地图)的 `MapInfo.txt` 中,设置 `NORUNMON` 参数。这个参数可以禁止该地图内的怪物刷新,但无法直接阻止玩家攻击已存在的怪物。更彻底的方法是结合脚本控制。
2. **使用脚本动态控制**:更灵活的方式是在 `QFunction-0.lua` 中,通过攻城相关的触发器和地图杀怪经验倍数功能来间接实现“不能打怪”的效果。例如,在攻城开始触发器(如 `castlewarstart`,需在 `QManage.lua` 或机器人脚本中设置)中,将攻城地图的杀怪经验倍率设为0,这样玩家在攻城地图打怪将无法获得经验,变相达到“不能打怪”的目的。跨服攻城同理,在跨服的相关触发器中设置。
3. **关键函数**:`mapkillmonexprate` 函数可以设置指定地图的杀怪经验倍数。将其倍率设为0,即可让打怪行为失去经验收益。
下面是一个在攻城期间禁止指定地图打怪获得经验的示例脚本:
```lua
-- 假设在攻城开始的全局触发器(如机器人或定时器触发)中调用
function OnCastleWarStart()
-- 沙巴克区域地图ID,例如 3
local castleMapId = 3
-- 获取当前攻城的行会或玩家对象(此处需要根据你的攻城系统获取actor,这里用”*“代表对所有玩家生效的地图设置)
-- 注意:mapkillmonexprate 函数需要传入一个玩家对象作为第一个参数,但通常用于设置地图状态时,
-- 我们可以传入一个有效的玩家对象(如城主或第一个攻城的玩家),或者引擎可能允许特定值。
-- 更常见的做法是在玩家进入攻城地图时(entermap触发器)或攻击怪物时(attackmon触发器)进行判断。
-- 这里展示设置地图状态的核心思路:
-- local samplePlayer = getplayerbyname("城主名字") -- 需要先获取一个玩家对象
-- mapkillmonexprate(samplePlayer, castleMapId, 0) -- 倍率设为0 (0表示关闭特殊倍率,通常恢复默认;但设置一个极低值如1可能更符合“无经验”)
-- 更精确的做法是在 QFunction-0.lua 的 attackmon 触发器中判断地图和攻城状态
release_print("攻城开始,已设置沙巴克地图打怪无经验收益。")
end
-- 在 QFunction-0.lua 中,利用 attackmon 触发器(攻击怪物时触发)进行实时判断
function attackmon(actor, mon)
local currentMap = getmapinfo(actor, 0) -- 获取玩家当前地图ID
local castleMapId = 3 -- 沙巴克地图ID
-- 判断是否在攻城地图(这里需要你根据实际情况判断攻城是否正在进行,可以用一个全局变量或T变量标记)
-- 假设使用一个全局自定义变量 G_IsCastleWar 来标记攻城状态(1为进行中)
local isWar = getsysvar("G_IsCastleWar") or 0
if tonumber(currentMap) == castleMapId and tonumber(isWar) == 1 then
-- 在攻城地图且攻城期间,阻止打怪获得经验(通过发送消息提示,并可以考虑使用其他函数打断攻击)
sendmsg(actor, "攻城激战正酣,无法在此地图打怪!", 1)
-- 注意:attackmon 触发器中无法直接取消攻击动作,但可以通过提示和后续无经验达到效果。
-- 更强制性的做法可以在 killmon 触发器中判断,并调用 changeexp(actor, -获得经验值) 来扣除经验,
-- 但最佳实践是结合 mapkillmonexprate 和 attackmon 的提示。
return
end
end
-- 在 QFunction-0.lua 的 killmon 触发器中,也可以进行类似判断并扣除经验(如果需要更严格的惩罚)
function killmon(actor, mon)
local currentMap = getmapinfo(actor, 0)
local castleMapId = 3
local isWar = getsysvar("G_IsCastleWar") or 0
if tonumber(currentMap) == castleMapId and tonumber(isWar) == 1 then
sendmsg(actor, "攻城期间禁止打怪,本次击杀未获得经验。", 1)
-- 可以在此处记录日志或其他操作
return
end
end
```
**关于跨服攻城**:
跨服服务器的QF脚本功能有限(不支持修改人物属性、不保存自定义全局变量等)。因此,在跨服期间实现“不能打怪”,更可靠的方法是在**跨服地图的配置上直接限制**,或者在跨服QF的 `kflogin`(跨服成功触发)触发器中,使用 `mapkillmonexprate` 设置跨服地图的杀怪经验为0。跨服的地图参数和怪物刷新由跨服服务器的 `cfg_mongen.xls` 和 `MapInfo.txt` 控制,可以在这些配置中减少或移除攻城区域的怪物。
**总结建议**:
1. **本服攻城**:在 `MapInfo.txt` 中为攻城地图设置 `NORUNMON`,并结合 `QFunction-0.lua` 的 `attackmon`/`killmon` 触发器进行状态判断和提示。
2. **跨服攻城**:重点在于跨服地图的配置,减少怪物刷新,并在跨服QF的 `kflogin` 触发器中设置地图杀怪经验倍数为0。
小仙,如果你需要更具体的配置步骤或某个触发器的详细写法,可以告诉我你的攻城系统是如何触发和判断的,比如是使用引擎内置的沙巴克攻城,还是自定义的攻城活动,这样我能给出更精准的脚本示例。如果还有不懂的,随时可以请教浮生梦尊师哦!
← 返回问答库