-- 判断目标是否可以被当前攻击模式攻击
-- @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:CanAt
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-29 23:06:08 |
👁️ 阅读: 4
我是lua后端老师!
小仙,你这个需求很明确,就是要让技能攻击目标选择时,能正确处理有主人的宝宝。思路完全正确,我来帮你修改这个 `CanAttackByMode` 函数。
你需要做的就是在函数开头,先判断目标是不是怪物,如果是怪物且有主人,就用主人的信息去进行模式判断,但最终返回的仍然是怪物本身是否可攻击。这里需要用到几个关键函数:
1. `ismon(obj)` 判断对象是否为怪物
2. `getbaseinfo(obj, 59)` 获取怪物的主人ID(如果不是怪物,这个值会是 `"0"`)
3. `getmyguild()` 获取行会ID
4. `getgroupmember()` 获取编组成员
5. `getpklevel()` 获取PK等级
下面是修改后的代码:
```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)
-- 先判断目标是否为怪物,且是否有主人
local isMonster = ismon(target) -- 判断是否为怪物
local masterId = "" -- 初始化主人ID
if isMonster then
masterId = getbaseinfo(target, 59) -- 获取怪物主人ID
-- release_print("怪物ID: " .. tostring(target) .. ", 主人ID: " .. masterId) -- 调试用
end
-- 如果有主人,则用主人的信息进行模式判断
local checkTarget = target -- 默认检查目标为原目标
local checkGuild = actor_guild -- 默认检查行会为攻击者行会
local checkGroupMembers = group_members -- 默认检查编组为攻击者编组
if masterId ~= "" and masterId ~= "0" then
-- 宝宝有主人,用主人的信息进行判断
checkTarget = masterId
checkGuild = getmyguild(masterId) -- 获取主人行会ID
-- 注意:这里需要获取主人的编组成员,但原函数参数是攻击者的编组
-- 所以我们需要在调用前处理好这个逻辑
end
-- 根据攻击模式进行判断
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 checkTarget == member then
inGroup = true
break
end
end
return not inGroup -- 不在编组内的才可以攻击
elseif actor_mode == 5 then -- 行会攻击
local target_guild = getmyguild(checkTarget) -- 获取目标(或主人)的行会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 -- 红名攻击
-- 注意:getpklevel只能用于玩家,不能用于怪物
-- 所以对于有主人的宝宝,我们检查主人的PK等级
if isMonster and masterId ~= "" and masterId ~= "0" then
local master_pklevel = getpklevel(masterId) -- 获取主人的PK等级
return master_pklevel > 0 -- 主人有PK等级(红名)的可以攻击
else
local target_pklevel = getpklevel(target) -- 获取目标的PK等级
return target_pklevel > 0 -- 有PK等级(红名)的可以攻击
end
elseif actor_mode == 7 then -- 国家攻击
return true
end
return false -- 默认返回不可攻击
end
```
不过小仙,我注意到你原来的 `GetTargetsInRange` 函数里调用 `CanAttackByMode` 时,`group_members` 参数传的是攻击者的编组成员。对于有主人的宝宝,我们应该用宝宝主人的编组成员来判断才更合理。所以你可能需要在调用 `CanAttackByMode` 之前,先获取宝宝主人的编组成员。
这里给你一个更完整的建议,修改 `GetTargetsInRange` 函数中调用判断的部分:
```lua
-- 在 GetTargetsInRange 函数中,当需要判断攻击模式时:
if not damagetype then -- 伤害性技能需要判断攻击模式
-- 先获取基础信息
local actor_mode = getattackmode(actor)
local group_members = getgroupmember(actor)
local actor_guild = getmyguild(actor)
-- 判断目标是否为怪物且有主人
local isMonster = ismon(obj)
local masterId = ""
local checkGroupMembers = group_members -- 默认用攻击者的编组
if isMonster then
masterId = getbaseinfo(obj, 59)
if masterId ~= "" and masterId ~= "0" then
-- 如果宝宝有主人,用主人的编组成员进行判断
checkGroupMembers = getgroupmember(masterId)
end
end
-- 调用判断函数
local canAttack = self:CanAttackByMode(actor, obj, actor_mode, checkGroupMembers, actor_guild)
if canAttack then
table.insert(targets, obj)
end
end
```
这样修改后,当攻击有主人的宝宝时,系统会:
1. 判断宝宝是否有主人
2. 如果有主人,就用主人的行会、编组、PK等级等信息来判断是否可攻击
3. 但最终可攻击目标列表里存入的还是怪物对象本身
这样逻辑就更完善了。小仙你看这样修改是否符合你的需求?如果还有不清楚的地方,随时问我!
← 返回问答库