-- 霸王印 疾火印 野蛮对路径留下远古烈焰,并对范围内的目标造成灼烧效果。
[60470] = function(actor, target, hiter, skillid)
if not hasbuff(actor,60470) then return end
if skillid ~= 27 then return end
-- release_print("===|||",getbaseinfo(actor,1),getbasein
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-05-07 13:13:44 |
👁️ 阅读: 11
哈喽,修仙者!我是Lua后端老师!
看了你的代码,你的想法很对,通过一个表来记录已经触发过伤害的坐标,避免重复伤害,这是一个很常见的优化思路。
根据你的需求,我来帮你修改一下代码。我们需要在全局(或者至少是玩家会话期间)维护一个记录已处理坐标的表。这里我建议使用一个以玩家为键的嵌套表结构,这样每个玩家的坐标记录是独立的。
```lua
-- 全局表,用于记录每个玩家已触发伤害的坐标
-- 结构: processed_coords[玩家ID] = { ["map_id,x,y"] = true, ... }
local processed_coords = {}
-- 霸王印 疾火印 野蛮对路径留下远古烈焰,并对范围内的目标造成灼烧效果。
[60470] = function(actor, target, hiter, skillid)
if not hasbuff(actor, 60470) then
return
end
if skillid ~= 27 then
return
end
local map_id = getbaseinfo(target, 3)
local map_x = getbaseinfo(target, 4)
local map_y = getbaseinfo(target, 5)
local num = math.floor(getbaseinfo(actor, 51, 4) * 0.3)
-- 在地图上播放特效
mapeffect(105, map_id, map_x, map_y, 36, 5, 0, nil, 0)
release_print(map_id, map_x, map_y, num)
-- 初始化该玩家的坐标记录表(如果不存在)
if processed_coords[actor] == nil then
processed_coords[actor] = {}
end
-- 生成坐标的唯一键
local coord_key = map_id .. "," .. map_x .. "," .. map_y
-- 如果这个坐标还没处理过,则安排延迟触发
if not processed_coords[actor][coord_key] then
-- 标记这个坐标为已处理(避免后续重复)
processed_coords[actor][coord_key] = true
-- 安排5次延迟触发
delaymsggoto(actor, 1000, "@buff_60470," .. map_id .. "," .. map_x .. "," .. map_y .. "," .. num .. ",")
delaymsggoto(actor, 2000, "@buff_60470," .. map_id .. "," .. map_x .. "," .. map_y .. "," .. num .. ",")
delaymsggoto(actor, 3000, "@buff_60470," .. map_id .. "," .. map_x .. "," .. map_y .. "," .. num .. ",")
delaymsggoto(actor, 4000, "@buff_60470," .. map_id .. "," .. map_x .. "," .. map_y .. "," .. num .. ",")
delaymsggoto(actor, 5000, "@buff_60470," .. map_id .. "," .. map_x .. "," .. map_y .. "," .. num .. ",")
else
-- 如果坐标已存在,可以选择记录日志或直接跳过
release_print("坐标已存在,跳过重复触发:", coord_key)
end
return 1
end,
-- 霸王印 疾火印 伤害触发函数
function buff_60470(actor, map_id, map_x, map_y, num)
if not hasbuff(actor, 60470) then
return
end
-- 生成坐标的唯一键
local coord_key = map_id .. "," .. map_x .. "," .. map_y
-- 检查这个坐标是否已经处理过(理论上不应该进入这里,但做双重检查)
if processed_coords[actor] and processed_coords[actor][coord_key] then
-- 执行范围伤害
rangeharm(actor, map_x, map_y, 0, 0, 6, num, 0, 0, 0)
-- 注意:这里我们不删除记录,因为同一个坐标可能需要在5次延迟中都触发伤害
-- 如果你希望每个坐标只触发一次伤害,可以在这里删除记录:
-- processed_coords[actor][coord_key] = nil
end
end
```
**代码说明:**
1. **`processed_coords` 全局表**:用于记录每个玩家已触发过的坐标,键是玩家对象,值是一个表,其中的键是`"map_id,x,y"`格式的字符串。
2. **坐标唯一性检查**:在触发技能时,先检查这个坐标是否已经记录过,如果没记录过才安排延迟触发。
3. **延迟触发逻辑**:保持你原来的5次延迟触发不变,但只在第一次遇到新坐标时设置。
4. **清理考虑**:如果你希望长时间运行后清理内存,可以考虑在玩家下线时清理对应的记录,或者在`buff_60470`函数最后一次触发后清理坐标记录。
**可选优化**:如果你希望每个坐标只触发一次伤害(而不是5次),可以在`buff_60470`函数中执行伤害后立即删除坐标记录。
这样修改后,同一个坐标就不会重复触发多次`rangeharm`了。如果还有问题,随时问我,或者去请教浮生梦尊师!
哈喽,修仙者!我是Lua后端老师!
看了你的代码,你的想法很对,通过一个表来记录已经触发过伤害的坐标,避免重复伤害,这是一个很常见的优化思路。
根据你的需求,我来帮你修改一下代码。我们需要在全局(或者至少是玩家会话期间)维护一个记录已处理坐标的表。这里我建议使用一个以玩家为键的嵌套表结构,这样每个玩家的坐标记录是独立的。
```lua
-- 全局表,用于记录每个玩家已触发伤害的坐标
-- 结构: processed_coords[玩家ID] = { ["map_id,x,y"] = true, ... }
local processed_coords = {}
-- 霸王印 疾火印 野蛮对路径留下远古烈焰,并对范围内的目标造成灼烧效果。
[60470] = function(actor, target, hiter, skillid)
if not hasbuff(actor, 60470) then
return
end
if skillid ~= 27 then
return
end
local map_id = getbaseinfo(target, 3)
local map_x = getbaseinfo(target, 4)
local map_y = getbaseinfo(target, 5)
local num = math.floor(getbaseinfo(actor, 51, 4) * 0.3)
-- 在地图上播放特效
mapeffect(105, map_id, map_x, map_y, 36, 5, 0, nil, 0)
release_print(map_id, map_x, map_y, num)
-- 初始化该玩家的坐标记录表(如果不存在)
if processed_coords[actor] == nil then
processed_coords[actor] = {}
end
-- 生成坐标的唯一键
local coord_key = map_id .. "," .. map_x .. "," .. map_y
-- 如果这个坐标还没处理过,则安排延迟触发
if not processed_coords[actor][coord_key] then
-- 标记这个坐标为已处理(避免后续重复)
processed_coords[actor][coord_key] = true
-- 安排5次延迟触发
delaymsggoto(actor, 1000, "@buff_60470," .. map_id .. "," .. map_x .. "," .. map_y .. "," .. num .. ",")
delaymsggoto(actor, 2000, "@buff_60470," .. map_id .. "," .. map_x .. "," .. map_y .. "," .. num .. ",")
delaymsggoto(actor, 3000, "@buff_60470," .. map_id .. "," .. map_x .. "," .. map_y .. "," .. num .. ",")
delaymsggoto(actor, 4000, "@buff_60470," .. map_id .. "," .. map_x .. "," .. map_y .. "," .. num .. ",")
delaymsggoto(actor, 5000, "@buff_60470," .. map_id .. "," .. map_x .. "," .. map_y .. "," .. num .. ",")
else
-- 如果坐标已存在,可以选择记录日志或直接跳过
release_print("坐标已存在,跳过重复触发:", coord_key)
end
return 1
end,
-- 霸王印 疾火印 伤害触发函数
function buff_60470(actor, map_id, map_x, map_y, num)
if not hasbuff(actor, 60470) then
return
end
-- 生成坐标的唯一键
local coord_key = map_id .. "," .. map_x .. "," .. map_y
-- 检查这个坐标是否已经处理过(理论上不应该进入这里,但做双重检查)
if processed_coords[actor] and processed_coords[actor][coord_key] then
-- 执行范围伤害
rangeharm(actor, map_x, map_y, 0, 0, 6, num, 0, 0, 0)
-- 注意:这里我们不删除记录,因为同一个坐标可能需要在5次延迟中都触发伤害
-- 如果你希望每个坐标只触发一次伤害,可以在这里删除记录:
-- processed_coords[actor][coord_key] = nil
end
end
```
**代码说明:**
1. **`processed_coords` 全局表**:用于记录每个玩家已触发过的坐标,键是玩家对象,值是一个表,其中的键是`"map_id,x,y"`格式的字符串。
2. **坐标唯一性检查**:在触发技能时,先检查这个坐标是否已经记录过,如果没记录过才安排延迟触发。
3. **延迟触发逻辑**:保持你原来的5次延迟触发不变,但只在第一次遇到新坐标时设置。
4. **清理考虑**:如果你希望长时间运行后清理内存,可以考虑在玩家下线时清理对应的记录,或者在`buff_60470`函数最后一次触发后清理坐标记录。
**可选优化**:如果你希望每个坐标只触发一次伤害(而不是5次),可以在`buff_60470`函数中执行伤害后立即删除坐标记录。
这样修改后,同一个坐标就不会重复触发多次`rangeharm`了。如果还有问题,随时问我,或者去请教浮生梦尊师!
← 返回问答库