我是lua后端老师!
小仙,你这个问题涉及到多人协同攻击同一个怪物的判断和伤害计算,这是个很有创意的想法!让我来帮你实现这个功能。
首先我们需要在怪物死亡触发中判断是否有多个玩家正在攻击同一个怪物。这里使用 `killmon` 触发接口,当怪物死亡时检查攻击者情况:
```lua
-- 在QF中注册killmon触发
function killmon(self, mon, killerType, monName, mapID)
-- 获取所有正在攻击这个怪物的玩家
local attackers = getattlist(mon, "ATTACKERS") -- 获取攻击者列表
if attackers and #attackers >= 2 then
-- 检查是否有两个不同的玩家在攻击
local player1 = nil
local player2 = nil
for i, attacker in ipairs(attackers) do
if isplayer(attacker) then
if not player1 then
player1 = attacker
elseif attacker ~= player1 then
player2 = attacker
break
end
end
end
-- 如果找到两个不同的玩家
if player1 and player2 then
-- 5%几率触发协同伤害
local randomNum = math.random(1, 100)
if randomNum <= 5 then
-- 获取两个玩家的最大攻击力
local attack1 = gethumability(player1, 1) -- 获取最大攻击力
local attack2 = gethumability(player2, 1)
-- 计算协同伤害:两人最大攻击之和的250%(150%加成)
local totalDamage = (attack1 + attack2) * 2.5
-- 对怪物造成伤害
local monObj = getobjectinmap(mon)
if monObj then
-- 这里需要根据实际伤害接口进行调整
-- 可以使用范围伤害或者其他伤害接口
rangeharm(player1, mon, totalDamage, 0)
-- 发送提示信息
sendmsg(player1, "协同攻击触发!造成"..totalDamage.."点额外伤害!", 1)
sendmsg(player2, "协同攻击触发!造成"..totalDamage.."点额外伤害!", 1)
end
end
end
end
end
```
不过小仙,上面的代码有个问题:`getattlist` 函数可能不直接支持获取攻击者列表。在实际开发中,我们需要用其他方式追踪攻击者。这里给你一个更实用的方案:
```lua
-- 在custommagicdamage触发中记录攻击者
function custommagicdamage(self, target, result)
if ismon(target) then
-- 获取怪物唯一ID
local monID = tostring(target)
-- 记录攻击者到怪物变量
local attackers = getobjstrvar(target, "ATTACKERS") or ""
-- 如果这个攻击者还没被记录
if not string.find(attackers, self) then
if attackers == "" then
attackers = self
else
attackers = attackers .. "#" .. self
end
setobjstrvar(target, "ATTACKERS", attackers)
end
end
return true
end
-- 怪物死亡时检查协同攻击
function killmon(self, mon, killerType, monName, mapID)
-- 获取记录的攻击者
local attackersStr = getobjstrvar(mon, "ATTACKERS") or ""
if attackersStr ~= "" then
-- 分割攻击者列表
local attackerList = {}
for attacker in string.gmatch(attackersStr, "([^#]+)") do
table.insert(attackerList, attacker)
end
-- 去重并统计
local uniqueAttackers = {}
for _, attacker in ipairs(attackerList) do
if not uniqueAttackers[attacker] then
uniqueAttackers[attacker] = true
end
end
-- 获取去重后的攻击者数量
local count = 0
local attacker1, attacker2
for attacker in pairs(uniqueAttackers) do
count = count + 1
if count == 1 then
attacker1 = attacker
elseif count == 2 then
attacker2 = attacker
end
end
-- 如果有两个及以上不同攻击者
if count >= 2 then
local randomNum = math.random(1, 100)
if randomNum <= 5 then
-- 获取攻击者对象
local player1 = getplayerbyid(attacker1)
local player2 = getplayerbyid(attacker2)
if player1 and player2 then
-- 获取最大攻击力
local maxAttack1 = gethumability(player1, 1)
local maxAttack2 = gethumability(player2, 1)
-- 计算协同伤害
local baseDamage = maxAttack1 + maxAttack2
local bonusDamage = baseDamage * 1.5 -- 150%加成
local totalDamage = baseDamage + bonusDamage
-- 这里需要根据实际情况应用伤害
-- 可以给怪物添加一个buff来记录这个额外伤害
addbuff(mon, "协同伤害", 1, totalDamage)
-- 发送系统公告
sendmsg(player1, "与"..getplayerbyid(attacker2).."触发协同攻击!", 1)
sendmsg(player2, "与"..getplayerbyid(attacker1).."触发协同攻击!", 1)
end
end
end
-- 清理怪物变量
setobjstrvar(mon, "ATTACKERS", "")
end
end
```
注意:小仙,实际实现时需要考虑更多细节,比如:
1. 攻击者列表的清理时机
2. 伤害计算的具体方式
3. 多人(超过2人)攻击时的处理逻辑
4. 时间窗口(比如5秒内攻击过才算)
如果你在实现过程中遇到具体问题,可以随时问我!记得先在测试服验证功能哦~