function godTier_skill_trigger:GetTargetsInRange(actor, centerX, centerY, radius, targetType, damagetype)
local targets = {}
local map_id = getbaseinfo(actor, 3)
local actor_mode = getattackmode(actor) -- 获取当前玩家的攻击模式
local group_m
嗨,我是Lua后端老师!
小仙,你这个想法很好,把攻击模式的判断逻辑单独提取出来,这样主函数会更清晰,也方便复用。让我帮你重构一下代码。
首先,我帮你创建一个专门判断攻击模式的函数:
```lua
-- 判断目标是否可以被当前攻击模式攻击
-- @param actor string 攻击者对象
-- @param target string 目标对象
-- @param actor_mode integer 攻击模式
-- @param group_members table 编组成员列表
-- @param actor_guild string 攻击者行会ID
-- @return boolean 是否可以被攻击
function godTier_skill_trigger:CanAttackByMode(actor, target, actor_mode, group_members, actor_guild)
if actor_mode == 0 then -- 全体攻击
return true
elseif actor_mode == 1 then -- 和平攻击
return false
elseif actor_mode == 2 then -- 夫妻模式(当前未实现,按全体处理)
return true
elseif actor_mode == 3 then -- 师徒攻击(当前未实现,按全体处理)
return true
elseif actor_mode == 4 then -- 编组攻击
-- 检查目标是否在编组内
local inGroup = false
for _, member in pairs(group_members) do
if target == member then
inGroup = true
break
end
end
return not inGroup -- 不在编组内的才可以攻击
elseif actor_mode == 5 then -- 行会攻击
local target_guild = getmyguild(target) -- 获取目标的行会ID
-- 目标没有行会,可以攻击
if target_guild == "" or target_guild == nil then
return true
end
-- 目标与攻击者同属一个行会,不能攻击
if actor_guild == target_guild then
return false
end
-- 检查是否是同盟行会
local isAlly = isallyguild(actor_guild, target_guild)
return not isAlly -- 不是同盟的可以攻击
elseif actor_mode == 6 then -- 红名攻击
local target_pklevel = getpklevel(target) -- 获取目标的PK等级
return target_pklevel > 0 -- 有PK等级(红名)的可以攻击
elseif actor_mode == 7 then -- 国家攻击
return true
end
return false -- 默认返回不可攻击
end
```
现在,我帮你修改主函数来调用这个判断函数:
```lua
function godTier_skill_trigger:GetTargetsInRange(actor, centerX, centerY, radius, targetType, damagetype)
local targets = {}
local map_id = getbaseinfo(actor, 3)
local actor_mode = getattackmode(actor) -- 获取当前玩家的攻击模式
local group_members = getgroupmember(actor) -- 获取当前玩家的编组成员对象
local actor_guild = getmyguild(actor) -- 获取自己的行会ID
-- 定义所有可获取的对象类型参数
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
if not damagetype then -- 伤害性技能需要判断攻击模式
-- 调用判断函数
local canAttack = self:CanAttackByMode(actor, obj, actor_mode, group_members, actor_guild)
if canAttack then
table.insert(targets, obj)
end
else -- 非伤害性技能(如治疗、增益等)
table.insert(targets, obj)
end
end
end
end
end
end
release_print("获取到的目标数量:" .. #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 not damagetype then -- 伤害性技能需要判断攻击模式
-- 调用判断函数
local canAttack = self:CanAttackByMode(actor, obj, actor_mode, group_members, actor_guild)
if canAttack then
table.insert(targets, obj)
end
else -- 非伤害性技能
table.insert(targets, obj)
end
end
end
end
end
end
release_print("获取到的目标数量:" .. #targets) -- 调试用
return targets
end
-- 如果targetType不是表也不是nil,返回空表
return {}
end
```
小仙,这样重构后有几个好处:
1. **代码更清晰**:攻击模式判断逻辑单独在一个函数里,主函数更简洁
2. **可复用性高**:其他需要判断攻击模式的地方可以直接调用这个函数
3. **易于维护**:修改攻击模式逻辑只需要改一个地方
4. **可扩展性强**:如果需要增加新的攻击模式,只需要在判断函数中添加即可
注意:我使用了`release_print()`来替换原来的`dump()`,这是引擎推荐的调试输出方式。如果你需要更详细的调试信息,可以在判断函数里也加上一些输出。
这样改完后,你的主函数每次都会调用判断函数来确定每个目标是否符合当前攻击模式,逻辑清晰多了!