你好,修仙者!我是Lua后端老师!
看到你写的这个范围获取函数,确实很专业,不过目前引擎的接口在获取特定类型对象时,需要分开处理。让我根据你提供的代码和需求,帮你完善一下。
```lua
-- 获取指定范围内的目标对象
-- @param actor: 玩家对象
-- @param centerX: 中心X坐标
-- @param centerY: 中心Y坐标
-- @param radius: 范围半径
-- @param targetType: 目标类型(可选) 0=所有对象 1=玩家 2=怪物 4=英雄 8=分身 64=英雄 128=分身
-- @return: 目标对象列表
function godTier_skill_trigger:GetTargetsInRangeWithType(actor, centerX, centerY, radius, targetType)
local targets = {}
local map_id = getbaseinfo(actor, 3)
-- 如果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 = getmapmon(actor, map_id, centerX, centerY, radius)
if monsters then
for _, monster in ipairs(monsters) do
if monster then
-- 判断是否是宝宝
if ismon(monster) then
-- 可以通过getbaseinfo获取怪物信息来判断是否是宝宝
local master = getbaseinfo(monster, 67) -- 获取怪物主人
if master and master ~= "" then
-- 这是有主人的怪物,即宝宝
table.insert(targets, monster)
else
-- 普通怪物
table.insert(targets, monster)
end
end
end
end
end
end
return targets
end
-- 专门获取宝宝对象的函数
-- @param actor: 玩家对象
-- @param centerX: 中心X坐标
-- @param centerY: 中心Y坐标
-- @param radius: 范围半径
-- @return: 宝宝对象列表
function godTier_skill_trigger:GetSlavesInRange(actor, centerX, centerY, radius)
local slaves = {}
local map_id = getbaseinfo(actor, 3)
local monsters = getmapmon(actor, map_id, centerX, centerY, radius)
if monsters then
for _, monster in ipairs(monsters) do
if monster and ismon(monster) then
local master = getbaseinfo(monster, 67) -- 获取怪物主人
if master and master ~= "" then
-- 这是有主人的怪物,即宝宝
table.insert(slaves, monster)
end
end
end
end
return slaves
end
-- 专门获取英雄对象的函数
-- @param actor: 玩家对象
-- @param centerX: 中心X坐标
-- @param centerY: 中心Y坐标
-- @param radius: 范围半径
-- @return: 英雄对象列表
function godTier_skill_trigger:GetHeroesInRange(actor, centerX, centerY, radius)
local heroes = {}
local map_id = getbaseinfo(actor, 3)
-- 使用标记值64获取英雄
local objects = getobjectinmap(map_id, centerX, centerY, radius, 64)
if objects then
for _, obj in ipairs(objects) do
if obj and ishero(obj) then
table.insert(heroes, obj)
end
end
end
return heroes
end
```
主要修改和说明:
1. **扩展了targetType参数**:现在支持英雄(4或64)和分身(8或128)的标记值
2. **使用getobjectinmap的标记值功能**:通过flag参数可以筛选特定类型的对象
3. **添加了专门的获取函数**:`GetSlavesInRange`专门获取宝宝,`GetHeroesInRange`专门获取英雄
4. **宝宝判断逻辑**:通过`getbaseinfo(monster, 67)`获取怪物主人来判断是否是宝宝
这样你就可以灵活地获取各种类型的对象了。如果还有不明白的地方,随时问我,或者请教我师傅浮生梦尊师!