这个脚本实现的是一个怪物间的连锁攻击效果。当玩家攻击一个怪物时,会触发对周围其他怪物的延迟攻击。
**核心逻辑流程:**
```lua
-- 1. 玩家攻击怪物时触发attack函数
function attack(actor, Target, Hiter, MagicId)
if ismon(Target) then -- 判断目标是否为怪物
-- 2. 获取当前怪物ID
local cfg_posM = {}
cfg_posM[1] = getbaseinfo(Target,2)
-- 3. 获取玩家当前位置和地图
local mapID = getbaseinfo(actor,3)
local x = getbaseinfo(actor,4)
local y = getbaseinfo(actor,5)
-- 4. 查找周围10格内的所有怪物
local mons = getobjectinmap(mapID,x,y,10,2)
if #mons < 1 then return end
-- 5. 对每个非目标怪物进行延迟攻击
for i, mon in ipairs(mons or {}) do
if Target ~= mon then
cfg_posM[#cfg_posM + 1] = getbaseinfo(mon,2)
-- 每300毫秒攻击一个怪物
delaygoto(actor,300 * i,"humanhpex,"..mon,0)
end
end
-- 6. 发送怪物位置数据到客户端
sendluamsg(actor, 999, 0, 0, 23, tbl2json(cfg_posM))
end
end
```
**前端处理逻辑:**
```lua
-- 1. 注册网络消息监听
SL:RegisterLuaNetMsg(999, function (msgID, p1, p2, p3, data)
SplitGodPro:ScenePlayEffectEx(data)
end)
-- 2. 解析怪物位置数据并安排动画播放
function SplitGodPro:ScenePlayEffectEx(data)
data = SL:JsonDecode(data)
for i, v in ipairs(data or {}) do
if v and data[i + 1] then
-- 3. 按顺序延迟播放动画(每对怪物间隔0.3秒)
SL:ScheduleOnce(function ()
self:Animation(v ,data[i + 1])
end,
0.3 * (i - 1))
end
end
end
-- 4. 执行两个怪物间的动画效果
function SplitGodPro:Animation(mon1 ,mon2)
-- 获取两个怪物的坐标信息
local mon1_cfg = {
posM_x = SL:GetMetaValue("ACTOR_POSITION_X", mon1),
posM_y = SL:GetMetaValue("ACTOR_POSITION_Y", mon1),
mapM_x = SL:GetMetaValue("ACTOR_MAP_X", mon1),
mapM_y = SL:GetMetaValue("ACTOR_MAP_Y", mon1),
}
local mon2_cfg = {
posM_x = SL:GetMetaValue("ACTOR_POSITION_X", mon2),
posM_y = SL:GetMetaValue("ACTOR_POSITION_Y", mon2),
mapM_x = SL:GetMetaValue("ACTOR_MAP_X", mon2),
mapM_y = SL:GetMetaValue("ACTOR_MAP_Y", mon2),
}
-- 5. 计算坐标差用于动画效果
local x,y = SL:ConvertMapPos2WorldPos(mon2_cfg.mapM_x - mon1_cfg.mapM_x, mon2_cfg.mapM_y - mon1_cfg.mapM_y, true)
end
```
**延时扣血函数:**
```lua
function humanhpex(actor,monobj)
sendattackeff(monobj,1,1,"*") -- 发送攻击效果
humanhp(monobj,"-", 1, 0,0,actor) -- 扣除1点血量
end
```
**运算原理总结:**
1. **触发机制**:玩家攻击触发服务端函数
2. **范围检测**:查找周围10格内的所有怪物
3. **延迟执行**:使用`delaygoto`实现300毫秒的间隔攻击
4. **数据传递**:通过`sendluamsg`将怪物位置传到客户端
5. **前端同步**:客户端接收数据后按顺序播放动画效果
6. **坐标计算**:计算怪物间的位置差用于动画路径
这个脚本实现了类似"连锁闪电"的效果,攻击一个怪物后会依次攻击周围的其他怪物,并伴有延迟动画效果。