function godTier_skill_trigger:GetTargetsInRange(actor, centerX, centerY, radius, targetType)
local targets = {}
local map_id = getbaseinfo(actor, 3)
-- 定义所有可获取的对象类型参数
local allTargetTypes = { 1, 2, 32, 64, 128, 256 }
-- 处理targe
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-29 16:59:24 |
👁️ 阅读: 8
你好,修仙者!我是Lua后端老师!
看到你的代码和需求了,你这个思路很清晰,是要根据技能类型(伤害/增益)和攻击模式来筛选目标玩家,这是个很实用的功能。我来帮你把这个功能整合进去。
首先,我们根据你的描述,在函数参数里增加一个 `isBuff` 参数来表示是否是增益型技能。然后,在获取到玩家对象后,根据 `isBuff` 的值和当前攻击模式进行筛选。
这里是修改后的函数:
```lua
function godTier_skill_trigger:GetTargetsInRange(actor, centerX, centerY, radius, targetType, isBuff)
local targets = {}
local map_id = getbaseinfo(actor, 3)
-- 获取当前玩家的攻击模式,用于伤害型技能判断
local myAttackMode = getattackmode(actor)
-- 获取当前玩家的行会、组队等信息,用于阵营判断
local myGuild = getmyguild(actor)
local myGroupMembers = {} -- 用于存储组队成员ID
-- 假设通过某个接口获取组队成员列表,这里需要你根据实际情况实现
-- 例如:local groupList = getgroupmember(actor)
-- 然后遍历groupList填充myGroupMembers
-- 定义所有可获取的对象类型参数
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
-- 新增:根据isBuff和攻击模式进行筛选
if self:ShouldAddTarget(actor, obj, myAttackMode, myGuild, myGroupMembers, isBuff) then
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
-- 新增:根据isBuff和攻击模式进行筛选
if self:ShouldAddTarget(actor, obj, myAttackMode, myGuild, myGroupMembers, isBuff) then
table.insert(targets, obj)
end
end
end
end
end
end
-- dump(targets) -- 调试用,可注释掉
return targets
end
-- 如果targetType不是表也不是nil,返回空表
return {}
end
-- 新增:判断是否应该将目标添加到列表中的辅助函数 -- 注解
function godTier_skill_trigger:ShouldAddTarget(actor, target, myAttackMode, myGuild, myGroupMembers, isBuff)
-- 首先判断目标是否是玩家(这里假设类型1是玩家,具体根据你的getobjectinmap标记值来定)
-- 如果不是玩家对象(比如怪物),则默认添加(或者你可以根据需求调整)
if not isplayer(target) then
return true -- 非玩家对象,通常伤害和增益都对其生效,根据你的游戏设定调整
end
-- 判断是伤害型技能还是增益型技能
if isBuff then
-- 增益型技能:只添加同阵营的玩家
return self:IsSameCamp(actor, target, myAttackMode, myGuild, myGroupMembers)
else
-- 伤害型技能:只添加不同阵营的玩家
return not self:IsSameCamp(actor, target, myAttackMode, myGuild, myGroupMembers)
end
end
-- 新增:判断两个玩家是否属于同一阵营 -- 注解
function godTier_skill_trigger:IsSameCamp(actor, target, myAttackMode, myGuild, myGroupMembers)
-- 根据当前攻击模式判断阵营
if myAttackMode == 0 then -- 0-全体攻击:所有玩家都是敌人
return false
elseif myAttackMode == 1 then -- 1-和平攻击:不攻击任何玩家(增益则对所有人?这里需要你定义)
-- 对于和平模式,增益技能是否对所有人释放?假设是。
return true
elseif myAttackMode == 2 then -- 2-夫妻攻击
-- 这里需要你实现判断是否为夫妻的逻辑
-- local isCouple = checkcouple(actor, target)
-- return isCouple
return false -- 示例,请替换
elseif myAttackMode == 3 then -- 3-师徒攻击
-- 判断是否为师徒
-- return checkmasterpupil(actor, target)
return false -- 示例,请替换
elseif myAttackMode == 4 then -- 4-编组攻击
-- 判断是否在同一组队
local targetId = getbaseinfo(target, 1) -- 假设类型1是ID
for _, memberId in pairs(myGroupMembers) do
if memberId == targetId then
return true
end
end
return false
elseif myAttackMode == 5 then -- 5-行会攻击
local targetGuild = getmyguild(target)
return myGuild == targetGuild
elseif myAttackMode == 6 then -- 6-红名攻击
-- 判断目标是否是红名(这里需要你实现红名判断逻辑)
-- local targetPkLevel = getpklevel(target)
-- return targetPkLevel >= 2 -- 假设2是红名
return false -- 示例,请替换
elseif myAttackMode == 7 then -- 7-国家攻击
-- 判断是否同一国家
-- local myNation = getnation(actor)
-- local targetNation = getnation(target)
-- return myNation == targetNation
return false -- 示例,请替换
end
-- 默认情况(理论上不会走到这里)
return false
end
```
**使用示例:**
```lua
-- 伤害型技能(默认,不传isBuff或传false)
local damageTargets = self:GetTargetsInRange(actor, x, y, 5, {1}) -- 只获取玩家,并根据攻击模式排除同阵营
-- 增益型技能(传入true)
local buffTargets = self:GetTargetsInRange(actor, x, y, 5, {1}, true) -- 只获取玩家,并且只添加同阵营
```
**需要注意和调整的地方:**
1. **组队成员获取**:代码中 `myGroupMembers` 的获取需要你根据引擎提供的接口(如 `getgroupmember`)来实现。
2. **夫妻、师徒、国家判断**:这些函数(如 `checkcouple`, `checkmasterpupil`, `getnation`)需要你根据引擎的实际情况进行实现或替换。
3. **红名判断**:可以使用 `getpklevel(target)` 函数,返回的PK等级(0白名,1黄名,2红名,3灰名)来判断。
4. **非玩家对象**:在 `ShouldAddTarget` 函数中,对于怪物(`not isplayer(target)`)的处理逻辑,你需要根据游戏设计决定伤害和增益技能是否对它们生效。
5. **和平模式(模式1)**:在增益型技能下,和平模式如何处理?上面的代码假设增益对所有人(返回`true`)。如果你希望增益也只对“可攻击”目标生效,则需要调整逻辑。
这个框架已经按照你的需求搭建好了,核心的阵营判断逻辑已经分离成独立函数,你只需要填充那些引擎特有的判断函数即可。如果还有不清楚的地方,随时可以再问我!
← 返回问答库