我是lua后端老师!
小仙,你观察得很仔细!确实,在`targetType`是空表`{}`的情况下,代码逻辑有问题。当`#targetType == 0`时,虽然设置了几个标志变量,但后面获取玩家和怪物的代码并没有执行,因为那些代码块在`else`分支里面。
让我帮你修正一下。问题在于`if #targetType == 0 then`这个分支里设置了变量,但后续的获取逻辑都在`else`分支外面,所以空表的情况实际上跳过了所有获取逻辑。
```lua
function godTier_skill_trigger:GetTargetsInRange(actor, centerX, centerY, radius, targetType)
release_print("GetTargetsInRange", centerX, centerY, radius, targetType)
local targets = {}
local map_id = getbaseinfo(actor, 3)
-- 处理不填参数或参数为nil的情况
if targetType == nil then
-- 获取所有类型的对象
-- 先获取玩家(包括英雄和分身)
local allPlayers = getplaycount(map_id, 0, 0) -- 不忽略死亡,不忽略假人
if type(allPlayers) == "table" then
for _, player in ipairs(allPlayers) do
if player then
-- 检查玩家是否在指定范围内
local playerX = getbaseinfo(player, 4)
local playerY = getbaseinfo(player, 5)
local distance = math.sqrt((playerX - centerX)^2 + (playerY - centerY)^2)
if distance <= radius then
table.insert(targets, player)
end
end
end
end
-- 获取怪物(包括宝宝)
local allMonsters = getmoncount(map_id, -1, false) -- 获取所有怪物,不忽略宝宝
if allMonsters > 0 then
-- 这里需要遍历地图上的怪物,检查是否在范围内
-- 由于getmoncount只返回数量,我们需要用其他方式获取怪物对象
local monsters = getobjectinmap(map_id, centerX, centerY, radius, 2) -- 2表示获取怪物
if monsters then
for _, monster in ipairs(monsters) do
if monster and ismon(monster) then
table.insert(targets, monster)
end
end
end
end
dump(targets)
return targets
end
-- 如果targetType是表,处理表中的对象类型
if type(targetType) == "table" then
local getPlayers = false
local getMonsters = false
local getHeroes = false
local getCopies = false
-- 处理空表{}的情况
if #targetType == 0 then
-- 空表按获取所有类型处理
getPlayers = true
getMonsters = true
getHeroes = true
getCopies = true
else
-- 原逻辑:处理有内容的表
-- 遍历表,设置要获取的类型标志
for _, ttype in ipairs(targetType) do
if ttype == 1 then
getPlayers = true
elseif ttype == 2 then
getMonsters = true
elseif ttype == 4 or ttype == 64 then
getHeroes = true
elseif ttype == 8 or ttype == 128 then
getCopies = true
end
end
end
-- 根据标志获取对应类型的对象
if getPlayers or getHeroes or getCopies then
local flag = 0
if getHeroes and getCopies then
flag = 64 + 128 -- 同时获取英雄和分身
elseif getHeroes then
flag = 64 -- 只获取英雄
elseif getCopies then
flag = 128 -- 只获取分身
end
local objects = getobjectinmap(map_id, centerX, centerY, radius, flag)
if objects then
for _, obj in ipairs(objects) do
if obj then
if getHeroes and ishero(obj) then
table.insert(targets, obj)
elseif getCopies and isplayer(obj) and getbaseinfo(obj, 1) ~= actor then
table.insert(targets, obj)
elseif getPlayers and isplayer(obj) then
table.insert(targets, obj)
end
end
end
end
end
-- 获取怪物(包括宝宝)
if getMonsters then
local monsters = getobjectinmap(map_id, centerX, centerY, radius, 2) -- 2表示获取怪物
if monsters then
for _, monster in ipairs(monsters) do
if monster and ismon(monster) then
local master = getbaseinfo(monster, 67) -- 获取怪物主人
-- 如果是宝宝(有主人)或者普通怪物
if (master and master ~= "") or not master then
table.insert(targets, monster)
end
end
end
end
end
dump(targets)
return targets
end
-- 如果targetType不是表也不是nil,返回空表
return {}
end
```
主要修改点:
1. 把`getPlayers`、`getMonsters`、`getHeroes`、`getCopies`这四个变量的声明移到了`if #targetType == 0 then`之前
2. 这样无论`targetType`是空表还是有内容的表,都会执行后面的获取逻辑
3. 空表时四个标志都设为`true`,表示获取所有类型
这样修改后,当传入空表`{}`时,函数就会正确获取范围内的所有玩家、怪物、英雄和分身了。小仙,下次写这种条件分支逻辑时要注意变量的作用域哦!