--飞地图
function XueZhanShaCheng:FlyMap(actor,data)
checkTimers(actor)
--检查时间是否在攻杀时间
if not checkTime(actor) then
return
end
--判断条件是否满足
local level = getbaseinfo(actor, 6) -- 获取玩家等级
local zsLevel = GetStr(0,actor,
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-05-20 17:47:33 |
👁️ 阅读: 0
我是lua后端老师!
小仙,看了你的代码,我来帮你直接在 `FlyMap` 函数里加上攻城期间传送回城和攻击检测的逻辑。这个思路是:在玩家每次尝试飞地图时,先检查当前是否处于攻城时间,如果是,就把他送回土城,并且给他附加一个攻击检测的定时器,一旦攻击就立刻回城。
下面是修改后的代码,我加了详细的注释:
```lua
function XueZhanShaCheng:FlyMap(actor, data)
checkTimers(actor)
-- 首先,检查当前是否是攻城时间
if self:IsGongShaTime() then
-- 攻城期间,无论什么条件,直接传送回土城(这里假设土城地图ID是"3")
mapmove(actor, "3", 330, 330) -- 传送到土城安全区坐标
Msg.richMsg(actor, "沙巴克攻城战已开始,您已被传送回土城!")
-- 为玩家设置一个攻击检测的定时器(比如每秒检查一次)
-- 这个定时器会检查玩家在攻城地图里是否攻击了怪物,攻击了就回城
setontimer(actor, "CheckAttackInGongSha", 1000) -- 1秒触发一次
-- 我们需要在QF中写一个 `@CheckAttackInGongSha` 的接口来执行检测和回城
-- 但根据你的要求,我们尽量把逻辑写在这里。
-- 由于攻击检测是持续性行为,最好还是在QF里用 `@attack` 或 `@rangeharm` 触发。
-- 不过,我们可以在这里给玩家设置一个标记,然后在其他攻击触发函数里判断这个标记。
setplayvar(actor, "攻城攻击检测", "开启") -- 设置一个玩家变量作为标记
return -- 直接返回,不再执行后面的飞地图逻辑
end
-- 以下是原来的检查时间和条件的逻辑(非攻城时间执行)
if not checkTime(actor) then
return
end
local level = getbaseinfo(actor, 6)
local zsLevel = GetStr(0, actor, ZhuanSheng)
local t = string.split(zsLevel, ",")
local zs = tonumber(string.match(t[2], "%d+"))
local kuangbao = GetStr(0, actor, KuangBao)
local y = string.split(kuangbao, ",")
local kb = tonumber(string.match(y[1], "%d+"))
local wangzhezanzu = GetStr(0, actor, WangZheZanZu)
local cfg = self._cfg
local lev = cfg[2].condition
local zhuans = cfg[3].condition
local kuangb = cfg[4].condition
release_print(lev, zhuans, kuangb) -- 使用 release_print 替换 print
local d = cfg[data].map
local nx, ny = string.match(d, "(%d+),(%d+)")
GMLib:checkItems(actor, cfg[data].cost, 0, 1)
if kb ~= 1 then
Msg.richMsg(actor, "狂暴未开启,无法传送!")
elseif level < lev then
Msg.richMsg(actor, "等级不足" .. lev .. "级,无法传送!")
elseif zs < 10 then
Msg.richMsg(actor, "转生等级不足10转,无法传送!")
else
mapmove(actor, "0150", nx, ny)
end
end
-- 新增一个函数,用于判断当前是否在攻城时间
-- 你需要根据自己服务器的攻城时间配置来修改这个函数
function XueZhanShaCheng:IsGongShaTime()
-- 这里只是一个示例,你需要替换成实际的判断逻辑
-- 例如:攻城时间是每天20:00-21:00
local currentHour = tonumber(os.date("%H"))
local currentMin = tonumber(os.date("%M"))
-- 假设攻城时间是20点整到21点整
if currentHour == 20 then
return true
end
return false
end
```
**但是小仙,这里有个关键问题:**
1. **攻击立即回城的检测**:在 `FlyMap` 函数里设置一个玩家变量标记是可行的,但真正的攻击检测(比如攻击了怪物)需要引擎在攻击发生时触发。这通常需要在 `QF` 脚本里,使用 `@attack`、`@rangeharm` 或 `@killmon` 等触发接口来实现。你可以在那些触发里检查玩家变量 `攻城攻击检测` 是否为 `"开启"`,并且判断玩家是否在攻城地图(比如地图ID是"0150"),如果是,就立刻用 `mapmove` 把他传回土城。
2. **攻城时间判断**:我写了一个简单的 `IsGongShaTime` 函数示例,你需要根据你服务器的实际攻城规则(比如每周几、具体时间段)来完善它。
**给你的建议:**
* **攻击检测部分**:虽然你想避免改QF,但攻击检测是游戏行为触发,最规范的做法还是在QF里处理。你可以在QF中增加类似下面的脚本:
```lua
[@attack] -- 或者 @rangeharm, @killmon
#if
#act
-- 检查攻击者是否开启了攻城攻击检测,并且在地图0150
local mapId = getmapinfo(actor, 0)
if getplayvar(actor, "攻城攻击检测") == "开启" and mapId == "0150" then
mapmove(actor, "3", 330, 330)
Msg.richMsg(actor, "攻城期间禁止打怪,您已被传送回土城!")
endif
```
* **清理标记**:别忘了在攻城结束后,或者在玩家离开攻城地图时,用 `setplayvar(actor, "攻城攻击检测", "")` 清除这个标记,并关闭定时器 `setofftimer(actor, "CheckAttackInGongSha")`。
这样修改后,就能实现“攻沙开始后,所有人飞地图会回土城,并且在攻城期间攻击怪物会立刻回城”的效果了。如果还有不清楚的,随时问我,或者请教浮生梦尊师!
我是lua后端老师!
小仙,看了你的代码,我来帮你直接在 `FlyMap` 函数里加上攻城期间传送回城和攻击检测的逻辑。这个思路是:在玩家每次尝试飞地图时,先检查当前是否处于攻城时间,如果是,就把他送回土城,并且给他附加一个攻击检测的定时器,一旦攻击就立刻回城。
下面是修改后的代码,我加了详细的注释:
```lua
function XueZhanShaCheng:FlyMap(actor, data)
checkTimers(actor)
-- 首先,检查当前是否是攻城时间
if self:IsGongShaTime() then
-- 攻城期间,无论什么条件,直接传送回土城(这里假设土城地图ID是"3")
mapmove(actor, "3", 330, 330) -- 传送到土城安全区坐标
Msg.richMsg(actor, "沙巴克攻城战已开始,您已被传送回土城!")
-- 为玩家设置一个攻击检测的定时器(比如每秒检查一次)
-- 这个定时器会检查玩家在攻城地图里是否攻击了怪物,攻击了就回城
setontimer(actor, "CheckAttackInGongSha", 1000) -- 1秒触发一次
-- 我们需要在QF中写一个 `@CheckAttackInGongSha` 的接口来执行检测和回城
-- 但根据你的要求,我们尽量把逻辑写在这里。
-- 由于攻击检测是持续性行为,最好还是在QF里用 `@attack` 或 `@rangeharm` 触发。
-- 不过,我们可以在这里给玩家设置一个标记,然后在其他攻击触发函数里判断这个标记。
setplayvar(actor, "攻城攻击检测", "开启") -- 设置一个玩家变量作为标记
return -- 直接返回,不再执行后面的飞地图逻辑
end
-- 以下是原来的检查时间和条件的逻辑(非攻城时间执行)
if not checkTime(actor) then
return
end
local level = getbaseinfo(actor, 6)
local zsLevel = GetStr(0, actor, ZhuanSheng)
local t = string.split(zsLevel, ",")
local zs = tonumber(string.match(t[2], "%d+"))
local kuangbao = GetStr(0, actor, KuangBao)
local y = string.split(kuangbao, ",")
local kb = tonumber(string.match(y[1], "%d+"))
local wangzhezanzu = GetStr(0, actor, WangZheZanZu)
local cfg = self._cfg
local lev = cfg[2].condition
local zhuans = cfg[3].condition
local kuangb = cfg[4].condition
release_print(lev, zhuans, kuangb) -- 使用 release_print 替换 print
local d = cfg[data].map
local nx, ny = string.match(d, "(%d+),(%d+)")
GMLib:checkItems(actor, cfg[data].cost, 0, 1)
if kb ~= 1 then
Msg.richMsg(actor, "狂暴未开启,无法传送!")
elseif level < lev then
Msg.richMsg(actor, "等级不足" .. lev .. "级,无法传送!")
elseif zs < 10 then
Msg.richMsg(actor, "转生等级不足10转,无法传送!")
else
mapmove(actor, "0150", nx, ny)
end
end
-- 新增一个函数,用于判断当前是否在攻城时间
-- 你需要根据自己服务器的攻城时间配置来修改这个函数
function XueZhanShaCheng:IsGongShaTime()
-- 这里只是一个示例,你需要替换成实际的判断逻辑
-- 例如:攻城时间是每天20:00-21:00
local currentHour = tonumber(os.date("%H"))
local currentMin = tonumber(os.date("%M"))
-- 假设攻城时间是20点整到21点整
if currentHour == 20 then
return true
end
return false
end
```
**但是小仙,这里有个关键问题:**
1. **攻击立即回城的检测**:在 `FlyMap` 函数里设置一个玩家变量标记是可行的,但真正的攻击检测(比如攻击了怪物)需要引擎在攻击发生时触发。这通常需要在 `QF` 脚本里,使用 `@attack`、`@rangeharm` 或 `@killmon` 等触发接口来实现。你可以在那些触发里检查玩家变量 `攻城攻击检测` 是否为 `"开启"`,并且判断玩家是否在攻城地图(比如地图ID是"0150"),如果是,就立刻用 `mapmove` 把他传回土城。
2. **攻城时间判断**:我写了一个简单的 `IsGongShaTime` 函数示例,你需要根据你服务器的实际攻城规则(比如每周几、具体时间段)来完善它。
**给你的建议:**
* **攻击检测部分**:虽然你想避免改QF,但攻击检测是游戏行为触发,最规范的做法还是在QF里处理。你可以在QF中增加类似下面的脚本:
```lua
[@attack] -- 或者 @rangeharm, @killmon
#if
#act
-- 检查攻击者是否开启了攻城攻击检测,并且在地图0150
local mapId = getmapinfo(actor, 0)
if getplayvar(actor, "攻城攻击检测") == "开启" and mapId == "0150" then
mapmove(actor, "3", 330, 330)
Msg.richMsg(actor, "攻城期间禁止打怪,您已被传送回土城!")
endif
```
* **清理标记**:别忘了在攻城结束后,或者在玩家离开攻城地图时,用 `setplayvar(actor, "攻城攻击检测", "")` 清除这个标记,并关闭定时器 `setofftimer(actor, "CheckAttackInGongSha")`。
这样修改后,就能实现“攻沙开始后,所有人飞地图会回土城,并且在攻城期间攻击怪物会立刻回城”的效果了。如果还有不清楚的,随时问我,或者请教浮生梦尊师!
← 返回问答库