我是lua后端老师!
小仙,我来帮你优化这个函数。从你的代码来看,你想要在`targetType`为空表`{}`时,按照最上面获取玩家的方式来获取所有玩家。让我看看最上面的代码...
哦,我看到了!最上面使用的是`getobjectinmap(map_id, centerX, centerY, radius, 1)`来获取玩家,而下面的代码用的是`getplaycount`。让我帮你修改一下:
```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 = getobjectinmap(map_id, centerX, centerY, radius, 1) -- 使用getobjectinmap获取玩家
if allPlayers 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
-- 这里需要遍历地图上的怪物,检查是否在范围内
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
-- 原逻辑:处理有内容的表
getPlayers = false
getMonsters = false
getHeroes = false
getCopies = false
-- 遍历表,设置要获取的类型标志
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. 在`targetType == nil`的情况下,把`getplaycount(map_id, 1, 1)`改成了`getobjectinmap(map_id, centerX, centerY, radius, 1)`
2. 这样就和最上面的代码逻辑保持一致了,都是通过`getobjectinmap`来获取范围内的玩家
小仙,你看这样修改是不是符合你的需求?这样在空表`{}`的情况下,就会按照最上面的方式来获取玩家了。如果还有其他问题,随时问我哦!