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 object 攻击者对象
-- @param target object 目标对象
-- @param attackMode integer 攻击模式 (0-7)
-- @return boolean true=可攻击, false=不可攻击
function CanAttackTarget(actor, target, attackMode)
-- 获取攻击者的相关信息
local groupMembers = getgroupmember(actor) -- 获取编组成员
local actorGuild = getmyguild(actor) -- 获取攻击者行会ID
-- 攻击模式判断
if attackMode == 0 then -- 0-全体攻击
return true
elseif attackMode == 1 then -- 1-和平攻击
return false
elseif attackMode == 2 then -- 2-夫妻攻击 (暂按全体处理)
return true
elseif attackMode == 3 then -- 3-师徒攻击 (暂按全体处理)
return true
elseif attackMode == 4 then -- 4-编组攻击
-- 检查目标是否在编组中
for _, member in pairs(groupMembers) do
if target == member then
return false -- 同组成员不可攻击
end
end
return true
elseif attackMode == 5 then -- 5-行会攻击
local targetGuild = getmyguild(target) -- 获取目标行会ID
-- 目标无行会,可攻击
if targetGuild == "" or targetGuild == nil then
return true
end
-- 同个行会,不可攻击
if actorGuild == targetGuild then
return false
end
-- 检查是否同盟行会
local isAlly = isallyguild(actorGuild, targetGuild)
if isAlly then
return false -- 同盟行会不可攻击
end
return true -- 不同行会且非同盟,可攻击
elseif attackMode == 6 then -- 6-红名攻击
local targetPKLevel = getpklevel(target) -- 获取目标PK等级
return targetPKLevel > 0 -- 红名可攻击
elseif attackMode == 7 then -- 7-国家攻击
return true
end
-- 默认返回false
return false
end
```
现在,我们重写你的主函数,使用这个新的判断函数:
```lua
function godTier_skill_trigger:GetTargetsInRange(actor, centerX, centerY, radius, targetType, damagetype)
local targets = {}
local mapId = getbaseinfo(actor, 3)
local actorMode = getattackmode(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(mapId, 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 or CanAttackTarget(actor, obj, actorMode) 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(mapId, 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 or CanAttackTarget(actor, obj, actorMode) then
table.insert(targets, obj)
end
end
end
end
end
end
-- dump(targets) -- 调试用
return targets
end
-- 如果targetType不是表也不是nil,返回空表
return {}
end
```
**重构说明:**
1. **分离关注点**:`CanAttackTarget` 函数专门处理攻击模式判断逻辑,主函数专注于范围搜索和距离判断。
2. **逻辑简化**:主函数中的判断条件更简洁,只需要检查 `damagetype` 和调用 `CanAttackTarget`。
3. **可重用性**:`CanAttackTarget` 函数可以在其他地方复用,比如在单体技能、普通攻击等场景。
4. **可维护性**:如果需要修改攻击模式的判断逻辑,只需要修改 `CanAttackTarget` 函数即可。
**注意点:**
- 夫妻模式(2)和师徒模式(3)我暂时按全体攻击处理,等你实现了相关系统后,可以在 `CanAttackTarget` 函数中添加具体的判断逻辑。
- 国家攻击模式(7)也按全体处理,需要根据你的国家系统来实现具体判断。
- 记得在实际使用前测试各种攻击模式下的表现。
这样重构后,代码是不是清晰多了?如果还有不明白的地方,随时问我,或者去请教浮生梦尊师!