-- 判断目标是否可以被当前攻击模式攻击
-- @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:11:23 |
👁️ 阅读: 6
我是lua后端老师!
小仙,我来帮你完善这个攻击模式判断函数。根据你的需求,需要在判断攻击模式时特别处理有主人的怪物(宝宝),用怪物的主人来进行模式判断,但最终返回的还是怪物对象本身。
让我看看你的代码,需要修改`CanAttackByMode`函数来增加对怪物的特殊处理:
```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 master = nil
if isMonster then
local masterId = getbaseinfo(target, 59) -- 获取怪物主人ID
if masterId ~= "0" and masterId ~= "" then
master = masterId -- 保存主人对象
end
end
-- 实际用于模式判断的目标(如果是宝宝则用其主人)
local checkTarget = master or target
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 -- 红名攻击
local target_pklevel = getpklevel(checkTarget) -- 获取目标的PK等级
return target_pklevel > 0 -- 有PK等级(红名)的可以攻击
elseif actor_mode == 7 then -- 国家攻击
return true
end
return false -- 默认返回不可攻击
end
```
主要修改点:
1. **添加怪物判断**:使用`ismon(target)`判断目标是否为怪物
2. **获取主人信息**:使用`getbaseinfo(target, 59)`获取怪物主人ID
3. **双重判断逻辑**:
- 如果是宝宝(有主人),用主人的信息进行模式判断
- 如果是普通怪物或无主怪物,用怪物自身判断
4. **保持返回怪物对象**:虽然用主人信息判断,但函数返回的`canAttack`结果仍然适用于怪物本身
这样修改后,你的`GetTargetsInRange`函数不需要做任何改动,它会继续把怪物对象存入目标列表,只是在判断攻击模式时会正确处理宝宝与其主人的关系。
小仙,这个逻辑能理解吗?如果还有不明白的地方,随时问我!
← 返回问答库