嗨,我是Lua后端老师!
小仙,我来帮你检查一下代码。问题确实存在,当`targetType`是空表`{}`时,你的逻辑虽然设置了`getPlayers = true`,但在获取玩家对象时,`getobjectinmap`函数使用的`flag`参数是根据`getHeroes`和`getCopies`来设置的,而`getPlayers`为`true`时,`flag`仍然是0,这会导致获取不到普通玩家。
让我们修复这个问题。关键是在处理`getPlayers`为`true`但`getHeroes`和`getCopies`都为`false`的情况时,需要正确设置`flag`参数。`getobjectinmap`函数的`flag`参数为0时,是获取所有类型的对象(包括玩家、英雄、分身等),但我们需要更精确的控制。
这里有一个更清晰的修复方案,我们直接根据需要的类型来调用`getobjectinmap`,并分别处理:
```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
-- 获取所有类型的对象
-- 使用flag=0获取地图上所有对象
local allObjects = getobjectinmap(map_id, centerX, centerY, radius, 0)
if allObjects then
for _, obj in ipairs(allObjects) do
if obj then
table.insert(targets, obj)
end
end
end
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 playerObjects = getobjectinmap(map_id, centerX, centerY, radius, 0) -- flag=0获取所有对象
if playerObjects then
for _, obj in ipairs(playerObjects) do
if obj and (isplayer(obj) or ishero(obj)) then
local isHero = ishero(obj)
local isCopy = isplayer(obj) and getbaseinfo(obj, 1) ~= actor
local isNormalPlayer = isplayer(obj) and not isCopy
-- 根据标志判断是否加入目标列表
if (getHeroes and isHero) or
(getCopies and isCopy) or
(getPlayers and isNormalPlayer) 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
table.insert(targets, monster)
end
end
end
end
return targets
end
-- 如果targetType不是表也不是nil,返回空表
return {}
end
```
主要修改点:
1. 当`targetType`为`nil`时,直接使用`getobjectinmap(map_id, centerX, centerY, radius, 0)`获取所有对象,更简洁。
2. 当`targetType`为空表`{}`时,现在能正确获取到玩家对象了,因为我们在获取玩家类对象时,会遍历所有玩家类对象(包括英雄、分身),然后根据标志筛选。
3. 简化了怪物获取的逻辑,直接获取所有怪物对象。
这样修复后,当传入空表`{}`时,函数就能正确获取到包括玩家在内的所有类型对象了。如果还有其他问题,随时问我哦!