我是lua后端老师!
小仙,你的需求是要在获取玩家列表的函数里添加一个参数,用于判断传进去的玩家列表是否与当前玩家同阵营(即根据 `getattackmode` 返回的攻击模式类型进行判断)。
我先帮你分析一下:
1. `getattackmode` 返回的攻击模式类型对应的是玩家的攻击模式,而不是阵营。
2. 要判断“同阵营”,通常需要通过 `getcamp` 获取玩家的阵营值,然后比较是否相等。
3. 你提到的攻击模式(0~7)更多是用于判断攻击规则,而不是直接判断“是否同阵营”。
不过,如果你希望**根据攻击模式来判断是否可攻击/是否同阵营**,我们可以这样理解:
- 如果攻击模式是“行会攻击”、“国家攻击”等,那么同行会、同国家的玩家可能被视为“同阵营”。
- 但更通用的做法是使用 `getcamp` 获取阵营编号,直接比较阵营编号是否相同。
下面我帮你修改函数,**增加一个参数 `checkCamp`(布尔值)**,当 `checkCamp` 为 `true` 时,只返回与 `actor` 同阵营的玩家(通过 `getcamp` 判断);如果为 `false` 或不传,则返回所有符合条件的玩家。
同时,**保留你原来的 `targetType` 参数**,用于指定获取的对象类型(玩家、怪物等)。
```lua
function godTier_skill_trigger:GetTargetsInRange(actor, centerX, centerY, radius, targetType, checkCamp)
local targets = {}
local map_id = getbaseinfo(actor, 3)
local actorCamp = getcamp(actor) -- 获取当前玩家的阵营
-- 定义所有可获取的对象类型参数
local allTargetTypes = {1, 2, 32, 64, 128, 256}
-- 处理targetType为nil或空表{}的情况:获取所有类型
if targetType == nil or (type(targetType) == "table" and #targetType == 0) then
for _, ttype in ipairs(allTargetTypes) do
local objects = getobjectinmap(map_id, centerX, centerY, radius, ttype)
if objects then
for _, obj in pairs(objects) do
if obj 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
-- 如果开启了阵营检查,且对象是玩家(类型1),则判断阵营是否相同
if checkCamp and ttype == 1 then
local objCamp = getcamp(obj)
if objCamp == actorCamp then
table.insert(targets, obj)
end
else
table.insert(targets, obj)
end
end
end
end
end
end
-- dump(targets) -- 调试用,可注释掉
return targets
end
-- 如果targetType是表且有内容,处理指定的对象类型
if type(targetType) == "table" and #targetType > 0 then
for _, ttype in ipairs(targetType) do
local objects = getobjectinmap(map_id, centerX, centerY, radius, ttype)
if objects then
for _, obj in pairs(objects) do
if obj 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
-- 阵营检查逻辑同上
if checkCamp and ttype == 1 then
local objCamp = getcamp(obj)
if objCamp == actorCamp then
table.insert(targets, obj)
end
else
table.insert(targets, obj)
end
end
end
end
end
end
-- dump(targets) -- 调试用,可注释掉
return targets
end
-- 如果targetType不是表也不是nil,返回空表
return {}
end
```
**使用示例:**
```lua
-- 获取范围内所有对象(包括怪物、玩家等),不检查阵营
local allTargets = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, nil, false)
-- 获取范围内所有对象,但只保留与actor同阵营的玩家(其他类型如怪物不受影响)
local sameCampTargets = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, nil, true)
-- 只获取玩家(类型1),且检查阵营
local playersSameCamp = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, {1}, true)
```
**注意:**
- 阵营判断使用 `getcamp`,它返回一个阵营编号(整数)。
- 攻击模式(`getattackmode`)主要用于判断攻击规则,如果你需要根据攻击模式过滤,可以在此基础上再扩展。
- 代码中 `ttype == 1` 表示对象类型为“玩家”,阵营检查只对玩家生效(怪物通常没有阵营概念)。
如果你希望**根据攻击模式来判断**(比如只返回可攻击的玩家),可以再告诉我具体规则,我帮你调整!