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后端老师!
小仙,你这个函数写得不错,思路很清晰!你需要在获取到宝宝、分身或英雄对象时,找到他们的主人是谁,对吧?这个需求很常见,比如技能伤害结算时可能需要把伤害反馈给主人。
根据你提供的代码和知识库里的资料,我们可以利用 `getbaseinfo` 函数来获取一个对象的“主人”信息。具体来说,对于宝宝、分身、英雄这些非玩家直接控制的单位,我们可以通过 `getbaseinfo(obj, 17)` 来尝试获取其主人对象的ID(字符串形式)。
在你的循环里,当判断 `obj` 是这些特定类型时,我们可以将 `obj` 替换为其主人。但要注意,主人可能不存在(比如宝宝叛变了),所以需要判断一下。
下面我帮你修改一下代码,在插入目标列表前增加这个判断逻辑:
```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
-- 攻击模式: 0-全体攻击 1-和平攻击 2-夫妻攻击 3-师徒攻击 4-编组攻击 5-行会攻击 6-红名攻击 7-国家攻击
local mode = { 0, 1, 2, 3, 4, 5, 6, 7 }
-- 定义所有可获取的对象类型参数
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
-- 新增:检测对象是否为宝宝、分身、英雄,并尝试获取其主人
local finalTarget = obj -- 默认目标为对象本身
local objType = getbaseinfo(obj, 0) -- 获取对象类型
-- 类型参考:1-玩家,2-怪物,32-英雄,64-分身,128-宝宝?(注意:知识库提到getobjectinmap标记值64是英雄,128是分身,宝宝可能需要单独判断)
-- 更通用的方法是直接尝试获取主人
local masterObj = getbaseinfo(obj, 17) -- 参数17通常用于获取主人对象
if masterObj and masterObj ~= "" then
-- 如果成功获取到主人对象,则将目标替换为主人
finalTarget = masterObj
end
-- 注意:现在使用 finalTarget 进行后续的攻击模式判断
if not damagetype then -- 判断是伤害性技能
if actor_mode == 0 then -- 全体攻击
table.insert(targets, finalTarget)
elseif actor_mode == 1 then -- 平和攻击
targets = {}
elseif actor_mode == 2 then -- 夫妻模式 ---当前未实现为全体模式
table.insert(targets, finalTarget)
elseif actor_mode == 3 then -- 师徒攻击 ---当前未实现为全体模式
table.insert(targets, finalTarget)
elseif actor_mode == 4 then -- 编组攻击
for _, member in pairs(group_members) do --获取编组成员对象是否在我编组内
if finalTarget ~= member then
table.insert(targets, finalTarget)
end
end
elseif actor_mode == 5 then -- 行会攻击
local obj_guild = getmyguild(finalTarget) -- 获取目标的行会对象
local isnotat = false
-- 首先检查目标是否有行会
if obj_guild == "" or obj_guild == nil then
isnotat = true -- 无行会玩家可以被攻击
else
-- 判断是否是不同行会的玩家
if actor_guild ~= obj_guild then
-- 还需要检查是否是同盟行会
local isAlly = isallyguild(actor_guild, obj_guild) -- 判断是否结盟
if not isAlly then
isnotat = true
end
end
end
if isnotat then
table.insert(targets, finalTarget)
end
elseif actor_mode == 6 then -- 红名攻击
local obj_pklevel = getpklevel(finalTarget) -- 获取目标的PK等级
if obj_pklevel > 0 then -- 有PK等级玩家可以被攻击
table.insert(targets, finalTarget)
end
elseif actor_mode == 7 then -- 国家攻击
table.insert(targets, finalTarget)
end
else
table.insert(targets, finalTarget)
end
end
end
end
end
end
-- dump(targets) -- 调试用,可注释掉
return targets
end
-- ... (你原来的其他逻辑,比如指定targetType的情况)
end
```
**主要修改点:**
1. 在距离判断通过后,我声明了一个 `finalTarget` 变量,初始值为 `obj`。
2. 使用 `getbaseinfo(obj, 17)` 尝试获取该对象的“主人”。如果返回有效值(非空字符串),则将 `finalTarget` 替换为这个主人对象。
3. 后续所有关于攻击模式、行会判断等逻辑,都改为对 `finalTarget` 进行操作。
4. 这样,当 `obj` 是一个宝宝时,`finalTarget` 会变成它的主人(玩家),后续的行会判断 (`getmyguild`)、PK等级判断 (`getpklevel`) 就会基于这个主人玩家来进行,这正是你需要的效果。
**注意事项:**
* `getbaseinfo(obj, 17)` 的返回值可能是主人对象的ID(字符串),引擎内部可能会自动处理为对象引用。在996引擎的上下文中,通常可以直接用作对象参数传递给其他函数(如 `getmyguild`)。
* 这个修改可能会**改变函数的行为**。比如,原本你的技能可能想同时攻击一个玩家和他的所有宝宝,现在宝宝会被“折叠”成它的主人。你需要根据技能的具体设计来决定这是否是你想要的。如果不想要这个效果,可以把宝宝和主人作为两个独立目标都加入列表,但这需要更复杂的去重逻辑。
* 你代码中 `allTargetTypes` 包含了 `256`,这个类型可能对应其他特殊单位,同样适用这个规则。
小仙,这个改动能满足你的需求吗?如果技能设计上就是需要“追踪溯源”攻击主人,那这样改就对了。如果有其他想法,随时可以再问我!