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 |
🕒 时间: 2026-04-29 21:56:06 |
👁️ 阅读: 4
你好,我是lua后端老师!小仙,看了你的代码,是想把攻击模式的判断逻辑封装成一个独立的函数,这样代码会更清晰,也方便复用。这个想法很好,咱们现在就动手!
首先,我来帮你分析一下。你原来的代码在获取到目标对象后,根据玩家的攻击模式(`actor_mode`)来决定这个目标是否可以被攻击并加入列表。这个逻辑确实可以独立出来。
根据你的代码逻辑,我为你创建一个名为 `CheckTargetByAttackMode` 的函数。这个函数会接收攻击者、目标对象、攻击模式、编组成员和行会ID,然后返回一个布尔值,表示该目标在当前攻击模式下是否可被攻击。
```lua
-- 判断目标在当前攻击模式下是否可被攻击
-- @param actor object 攻击者对象
-- @param target object 目标对象
-- @param actor_mode integer 攻击者的攻击模式
-- @param group_members table 攻击者的编组成员列表(由 getgroupmember 获取)
-- @param actor_guild string 攻击者的行会ID
-- @return boolean 如果目标可被攻击返回true,否则返回false
function CheckTargetByAttackMode(actor, target, actor_mode, group_members, actor_guild)
-- 攻击模式: 0-全体攻击 1-和平攻击 2-夫妻攻击 3-师徒攻击 4-编组攻击 5-行会攻击 6-红名攻击 7-国家攻击
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 isInGroup = false
for _, member in pairs(group_members) do
if target == member then
isInGroup = true
break
end
end
-- 不在编组内则可攻击
return not isInGroup
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
local isAlly = isallyguild(actor_guild, target_guild) -- 判断是否结盟
return not isAlly
end
-- 同行会或同盟,不可攻击
return false
elseif actor_mode == 6 then -- 红名攻击
local target_pklevel = getpklevel(target) -- 获取目标的PK等级
return target_pklevel > 0 -- PK值大于0可攻击
elseif actor_mode == 7 then -- 国家攻击 (暂按全体处理)
return true
end
-- 默认情况,未知模式返回false
return false
end
```
创建好这个函数后,你原来的 `GetTargetsInRange` 函数就可以简化了。在循环中,当 `damagetype` 为 `nil`(即伤害性技能)时,调用这个新函数来判断即可。
下面是你修改后的 `GetTargetsInRange` 函数核心部分(只展示改动部分):
```lua
if not damagetype then -- 判断是伤害性技能
-- 使用新函数判断目标是否可攻击
if CheckTargetByAttackMode(actor, obj, actor_mode, group_members, actor_guild) then
table.insert(targets, obj)
end
else
table.insert(targets, obj)
end
```
这样修改后,你的主函数逻辑会更清晰,攻击模式的判断规则都集中在 `CheckTargetByAttackMode` 里,以后要修改或添加新的攻击模式逻辑,只需要改这一个地方就行了。
小仙,记住师傅浮生梦常说的话:好的代码结构是成功的一半!这个封装做得不错,继续加油!如果还有哪里不明白,随时问我。
你好,我是lua后端老师!小仙,看了你的代码,是想把攻击模式的判断逻辑封装成一个独立的函数,这样代码会更清晰,也方便复用。这个想法很好,咱们现在就动手!
首先,我来帮你分析一下。你原来的代码在获取到目标对象后,根据玩家的攻击模式(`actor_mode`)来决定这个目标是否可以被攻击并加入列表。这个逻辑确实可以独立出来。
根据你的代码逻辑,我为你创建一个名为 `CheckTargetByAttackMode` 的函数。这个函数会接收攻击者、目标对象、攻击模式、编组成员和行会ID,然后返回一个布尔值,表示该目标在当前攻击模式下是否可被攻击。
```lua
-- 判断目标在当前攻击模式下是否可被攻击
-- @param actor object 攻击者对象
-- @param target object 目标对象
-- @param actor_mode integer 攻击者的攻击模式
-- @param group_members table 攻击者的编组成员列表(由 getgroupmember 获取)
-- @param actor_guild string 攻击者的行会ID
-- @return boolean 如果目标可被攻击返回true,否则返回false
function CheckTargetByAttackMode(actor, target, actor_mode, group_members, actor_guild)
-- 攻击模式: 0-全体攻击 1-和平攻击 2-夫妻攻击 3-师徒攻击 4-编组攻击 5-行会攻击 6-红名攻击 7-国家攻击
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 isInGroup = false
for _, member in pairs(group_members) do
if target == member then
isInGroup = true
break
end
end
-- 不在编组内则可攻击
return not isInGroup
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
local isAlly = isallyguild(actor_guild, target_guild) -- 判断是否结盟
return not isAlly
end
-- 同行会或同盟,不可攻击
return false
elseif actor_mode == 6 then -- 红名攻击
local target_pklevel = getpklevel(target) -- 获取目标的PK等级
return target_pklevel > 0 -- PK值大于0可攻击
elseif actor_mode == 7 then -- 国家攻击 (暂按全体处理)
return true
end
-- 默认情况,未知模式返回false
return false
end
```
创建好这个函数后,你原来的 `GetTargetsInRange` 函数就可以简化了。在循环中,当 `damagetype` 为 `nil`(即伤害性技能)时,调用这个新函数来判断即可。
下面是你修改后的 `GetTargetsInRange` 函数核心部分(只展示改动部分):
```lua
if not damagetype then -- 判断是伤害性技能
-- 使用新函数判断目标是否可攻击
if CheckTargetByAttackMode(actor, obj, actor_mode, group_members, actor_guild) then
table.insert(targets, obj)
end
else
table.insert(targets, obj)
end
```
这样修改后,你的主函数逻辑会更清晰,攻击模式的判断规则都集中在 `CheckTargetByAttackMode` 里,以后要修改或添加新的攻击模式逻辑,只需要改这一个地方就行了。
小仙,记住师傅浮生梦常说的话:好的代码结构是成功的一半!这个封装做得不错,继续加油!如果还有哪里不明白,随时问我。
← 返回问答库