我是lua后端老师!
小仙,看了你的代码,我发现了几个问题需要优化。你的需求是:当`targetType`为0或nil时获取所有对象,当`targetType`是表时获取表内的参数对象。
主要问题在于:
1. 你获取怪物时用的`flag`参数不对,应该用2
2. 获取所有对象的逻辑需要调整
3. 需要增加对表参数的处理
让我帮你修改一下:
```lua
function godTier_skill_trigger:GetTargetsInRange(actor, centerX, centerY, radius, targetType)
local targets = {}
local map_id = getbaseinfo(actor, 3)
-- 如果targetType是表,直接返回表中的对象
if type(targetType) == "table" then
for _, obj in ipairs(targetType) do
if obj and getbaseinfo(obj, 3) == map_id then
local objX = getbaseinfo(obj, 4)
local objY = getbaseinfo(obj, 5)
local distance = math.sqrt((objX - centerX)^2 + (objY - centerY)^2)
if distance <= radius then
table.insert(targets, obj)
end
end
end
return targets
end
-- 如果targetType为nil或0,则获取所有对象
local getAll = (targetType == nil or targetType == 0)
local getPlayers = (getAll or targetType == 1)
local getMonsters = (getAll or targetType == 2)
local getHeroes = (getAll or targetType == 4 or targetType == 64)
local getCopies = (getAll or targetType == 8 or targetType == 128)
-- 获取玩家、英雄、分身
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
return targets
end
```
主要改进点:
1. **增加了表参数处理**:当`targetType`是表时,会检查表中的每个对象是否在指定范围内
2. **修正了怪物获取的flag参数**:从原来的`flag`改为`2`(获取怪物)
3. **优化了距离计算**:对表中的对象进行距离检查
使用示例:
```lua
-- 获取所有对象
local allTargets = self:GetTargetsInRange(actor, 100, 100, 5, 0)
-- 只获取玩家
local players = self:GetTargetsInRange(actor, 100, 100, 5, 1)
-- 传入表参数
local myTable = {player1, player2, monster1}
local filteredTargets = self:GetTargetsInRange(actor, 100, 100, 5, myTable)
```
这样修改后,你的函数就能满足所有需求了。如果还有不明白的地方,随时问我哦!