bayuMIR/Mirserver/Mir200/Envir/QuestDiary/游戏功能/A2_二大陆/至宝老人.lua
2026-06-18 02:06:14 +08:00

449 lines
16 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

ZhiBaoLaoRenOBJ = Up_BaseClass:new()
ZhiBaoLaoRenOBJ._name = "ZhiBaoLaoRenOBJ"
-- NPCID
ZhiBaoLaoRenOBJ.id = { 87 }
for i, v in ipairs(ZhiBaoLaoRenOBJ.id or {}) do
Npc.clicknpcCfg[v] = ZhiBaoLaoRenOBJ
end
-- 配置文件
ZhiBaoLaoRenOBJ.cfg = Func.require("cfg_洪荒至宝")
ZhiBaoLaoRenOBJ.qz = Func.require("cfg_洪荒至宝抽取权重")
---* 加入上线同步数据
-- Player.sycCfg[ZhiBaoLaoRenOBJ._name] = ZhiBaoLaoRenOBJ.cfg
local function ZhiBaoLaoRenOBJ_for()
local tab = {}
local qz = {}
for k, v in pairs(ZhiBaoLaoRenOBJ.cfg or {}) do
tab[v.name] = v
end
for k, v in pairs(ZhiBaoLaoRenOBJ.qz or {}) do
table.insert(qz, string.format("%s#%d", k, v.qz))
end
return tab, table.concat(qz, "|")
end
ZhiBaoLaoRenOBJ.itemName, ZhiBaoLaoRenOBJ.itemQz = ZhiBaoLaoRenOBJ_for()
ZhiBaoLaoRenOBJ.CaChe = {}
---* 允许前端调用的函数
ZhiBaoLaoRenOBJ.allowFunc = { "up", "boxjiesuo", "chouqu" }
function ZhiBaoLaoRenOBJ:up(actor, p1, p2, p3, data)
if not Npc.CheckNPCRange(actor, 87) then
return
end
local id = data[1]
if not data or not id then
return
end
local cfg = self.cfg[id]
local xh = {
{ cfg.name, 1, 0 },
}
if Func.takeitmes(actor, xh, true, true) then
giveitem(actor, "先天元石", cfg.feijie, 819)
Func.sendmsg9(actor, string.format("恭喜您成功将#70|%s#215|分解为#70|%d#215|个先天元石", cfg.name, cfg.feijie))
end
end
function ZhiBaoLaoRenOBJ:chouqu(actor)
if not Npc.CheckNPCRange(actor, 87) then
return
end
local xh = {
{ "先天元石", 30, 0 }
}
if Func.takeitmes(actor, xh, true, true) then
local result1, result2 = ransjstr(self.itemQz, 1, 3)
giveitem(actor, result1, 1)
Func.sendmsg9(actor, string.format("[至宝老人]:#70|恭喜您抽中:#251|%sx1.#215", result1))
Message:SubLink(actor, self._name .. "_reloadcialiao")
end
end
----* 攻击前buff
ZhiBaoLaoRenOBJ.attackdamagebuff = {
["开天斧"] = function(actor, target, hitter, magicId, damage, model, Info)
if Info.target_curhp_per >= 100 then
Info._damage = Info._damage + math.floor(Info._damage * 0.2)
Func.sendmsg(actor, "[至宝]开天斧触发满血单位第一击额外提升20%伤害")
end
end,
}
local function ZhiBaoLaoRenOBJ_onattackdamage(actor, target, hitter, magicId, damage, model, Info)
for k, v in pairs(ZhiBaoLaoRenOBJ.attackdamagebuff or {}) do
if checkitemw(actor, k) then
local func = v
if func then
func(actor, target, hitter, magicId, damage, model, Info)
end
end
end
end
GameEvent.add(EventCfg.onAttackdamage, ZhiBaoLaoRenOBJ_onattackdamage, ZhiBaoLaoRenOBJ)
---* 至宝攻击触发buff
ZhiBaoLaoRenOBJ.itemAttackbuff = {
["长生戟"] = function(actor, target, hitter, magicId, Info)
local _cd = Player.getint(actor, VarCfg.Player.int.cd["长生戟"]) or 0
if Info.timer >= _cd then
if Func.random(5) then
Player.setint(actor, VarCfg.Player.int.cd["长生戟"], Info.timer + 60)
local my_maxdc = getbaseinfo(actor, ConstCfg.gbase.dc2) or 0
Player.setint(target, VarCfg.Player.int["长生戟敌方maxdc"], my_maxdc)
makeposion(target, 0, 5, 0, 0)
addbuff(target, 10007, 5)
Func.sendmsg(target, string.format("[至宝]长生戟触发使目标中绿毒持续5秒并每秒扣除%d点生命", my_maxdc))
Func.sendmsg(actor, string.format("[至宝]对方长生戟触发使你中绿毒持续5秒并每秒扣除%d点生命", my_maxdc))
end
end
end,
["天妖戒"] = function(actor, target, hitter, magicId, Info)
local _cd = Player.getint(actor, VarCfg.Player.int.cd["天妖戒"]) or 0
if Info.timer >= _cd then
if Func.random(1) then
Player.setint(actor, VarCfg.Player.int.cd["天妖戒"], Info.timer + 10)
humanhp(target, "-", math.ceil(Info.target_HP * 0.01), 1)
Func.sendmsg(actor, "[至宝]天妖戒触发切割目标单位1%的当前生命值")
Func.sendmsg(target, "[至宝]对方天妖戒触发切割你1%的当前生命值")
end
end
end,
["金刚镯"] = function(actor, target, hitter, magicId, Info)
local _cd = Player.getint(actor, VarCfg.Player.int.cd["金刚镯"]) or 0
if Info.timer >= _cd then
local target_maxAc = getbaseinfo(target, ConstCfg.gbase.ac2) or 0
if target_maxAc == 0 then
Player.setint(actor, VarCfg.Player.int.cd["金刚镯"], Info.timer + 10)
local my_maxdc = getbaseinfo(actor, ConstCfg.gbase.dc2) or 0
humanhp(target, "-", math.ceil(my_maxdc * 0.5), 1)
Func.sendmsg(actor, string.format("[至宝]金刚镯触发对防御0的单位额外造成%d的伤害", math.ceil(my_maxdc * 0.5)))
Func.sendmsg(target, string.format("[至宝]对方金刚镯触发由于你的防御为0,对你额外造成%d点伤害", math.ceil(my_maxdc * 0.5)))
end
end
end,
["诛杀令"] = function(actor, target, hitter, magicId, Info)
local _cd = Player.getint(actor, VarCfg.Player.int.cd["诛杀令"]) or 0
if Info.timer >= _cd then
if Func.random(1) then
Player.setint(actor, VarCfg.Player.int.cd["诛杀令"], Info.timer + 10)
addbuff(actor, 10012)
Func.sendmsg(actor, string.format("[至宝]诛杀令触发提升2点攻击速度持续10秒"))
end
end
end,
["炼妖壶"] = function(actor, target, hitter, magicId, Info)
if not Info.isplayer and Info.target_curhp_per < 10 then
killmonbyobj(actor, target, true, true, true)
Func.sendmsg(actor, "[至宝]炼妖壶触发怪物血量低于10%直接秒杀!")
end
end,
["伏羲扇"] = function(actor, target, hitter, magicId, Info)
if Info.isplayer then
if Func.random(5) then
if getattackmode(target) ~= 0 then
changeattackmode(target, 0)
Func.sendmsg(actor, "[至宝]伏羲扇触发,将目标强制设定为全体模式")
Func.sendmsg(target, "[至宝]对方金刚镯触发,将您强制切换为全体模式!")
end
end
end
end,
}
local function ZhiBaoLaoRenOBJ_onattack(actor, target, hitter, magicId, Info)
for k, v in pairs(ZhiBaoLaoRenOBJ.itemAttackbuff or {}) do
if checkitemw(actor, k) then
local func = v
if func then
func(actor, target, hitter, magicId, Info)
end
end
end
end
GameEvent.add(EventCfg.onAttack, ZhiBaoLaoRenOBJ_onattack, ZhiBaoLaoRenOBJ)
---* 至宝被攻击前触发buff
ZhiBaoLaoRenOBJ.struckdamagebuff = {
["生死簿"] = function(actor, hitter, target, magicId, damage, Info)
-- LOGPrint("至宝生死簿触发:", Player.getname(actor), Player.getname(hitter), Player.getname(target), magicId, damage)
local _cd = Player.getint(actor, VarCfg.Player.int.cd["生死簿"]) or 0
if Info.timer >= _cd then
if Func.random(5) then
Player.setint(actor, VarCfg.Player.int.cd["生死簿"], Info.timer + 60)
Player.setint(actor, VarCfg.Player.int["生死簿_时长"], Info.timer + 10)
Func.sendmsg(actor, string.format("[至宝]生死簿触发,免疫暴击 持续10秒"))
Func.sendmsg(hitter, string.format("[至宝]对方生死簿触发,免疫暴击 持续10秒"))
end
end
end,
["遮天布"] = function(actor, hitter, target, magicId, damage, Info)
local _cd = Player.getint(actor, VarCfg.Player.int.cd["遮天布"]) or 0
if Info.timer >= _cd then
Player.setint(actor, VarCfg.Player.int.cd["遮天布"], Info.timer + 180)
humanhp(hitter, "-", Info.damage, 1)
Info.damage = 0
Func.sendmsg(actor, "[至宝]遮天布触发100%反弹一次伤害,CD180秒")
Func.sendmsg(hitter, "[至宝]对方遮天布触发100%反弹一次伤害,CD180秒")
end
end,
-- ["雮尘珠"] = function(actor, hitter, target, magicId, damage, Info)
-- if hasbuff(actor, 10011) then
-- local _suckdamage = Player.getint(actor, VarCfg.Player.int["雮尘珠_吸收"]) or 0
-- if _suckdamage < 500 then
-- local _newdamage = 500 - _suckdamage
-- local _getdamage = 0
-- if Info.damage >= _newdamage then
-- Info.damage = Info.damage - _newdamage
-- _getdamage = _newdamage
-- Player.addint(actor, VarCfg.Player.int["雮尘珠_吸收"], _newdamage)
-- elseif Info.damage < _newdamage then
-- _getdamage = Info.damage
-- Info.damage = 0
-- Player.addint(actor, VarCfg.Player.int["雮尘珠_吸收"], _getdamage)
-- end
--
-- Func.sendmsg(actor, string.format("[至宝]雮尘珠触发,吸收%d点伤害,共计已吸收:%d", _getdamage, _suckdamage + _getdamage))
-- Func.sendmsg(hitter, string.format("[至宝]对方雮尘珠触发,吸收你%d点伤害", _getdamage))
-- if (_suckdamage + _getdamage) >= 500 then
-- if hasbuff(actor, 10011) then
-- Player.setint(actor, VarCfg.Player.int["雮尘珠_吸收"], 0)
-- Player.setint(actor, VarCfg.Player.int.cd["雮尘珠"], Info.timer + 180)
-- delbuff(actor, 10011)
-- end
-- end
-- else
-- if hasbuff(actor, 10011) then
-- Player.setint(actor, VarCfg.Player.int["雮尘珠_吸收"], 0)
-- Player.setint(actor, VarCfg.Player.int.cd["雮尘珠"], Info.timer + 180)
-- delbuff(actor, 10011)
-- end
-- end
-- end
-- end,
}
local function ZhiBaoLaoRenOBJ_onstruckdamage(actor, hitter, target, magicId, damage, Info)
for k, v in pairs(ZhiBaoLaoRenOBJ.struckdamagebuff or {}) do
if checkitemw(actor, k) then
local func = v
if func then
func(actor, hitter, target, magicId, damage, Info)
end
end
end
end
GameEvent.add(EventCfg.onstruckdamage, ZhiBaoLaoRenOBJ_onstruckdamage, ZhiBaoLaoRenOBJ)
---* 至宝暴击触发
ZhiBaoLaoRenOBJ.Arittriggerbuff = {
["生死簿"] = function(actor, attack, damage, magicId, Info)
local _cd = Player.getint(actor, VarCfg.Player.int["生死簿_时长"]) or 0
if Info.timer < _cd then
Info.damage = 0
end
end,
}
----* 解锁至宝盒子消耗
ZhiBaoLaoRenOBJ.boxxh = {
[1] = {
{ "金币", 100, 1 }
},
[2] = {
{ "元宝", 100, 1 }
},
[3] = {
{ "元宝", 500, 1 }
},
[4] = {
{ "元宝", 5000, 1 }
},
}
----* 至宝盒子解锁
function ZhiBaoLaoRenOBJ:boxjiesuo(actor, p1, p2, p3, data)
local id = data[1].id
if not data or not id then
return
end
local openData = Player.getkeytbl(actor, VarCfg.Player.str["至宝盒子"]) or {}
if openData[id] then
Func.sendmsg9(actor, "该位置已解锁")
return
end
if id > 1 then
local open = openData[id - 1] and true or false
if not open then
return Func.sendmsg9(actor, "请先解锁上一级至宝格子!")
end
end
if self.boxxh[id] then
local str = "解锁该位置需要消耗:\n" .. string.format("%sx%d", self.boxxh[id][1][1], self.boxxh[id][1][2]) .. "\n是否解锁?"
Func.messagebox(actor, str, "@zhibaojieshuo," .. id, "@exit")
else
return
end
end
function zhibaojieshuo(actor, id)
id = tonumber(id)
local openData = Player.getkeytbl(actor, VarCfg.Player.str["至宝盒子"]) or {}
if openData[id] then
Func.sendmsg9(actor, "该位置已解锁")
return
end
if id > 1 then
local open = openData[id - 1] and true or false
if not open then
return Func.sendmsg9(actor, "请先解锁上一级至宝格子!")
end
end
if ZhiBaoLaoRenOBJ.boxxh[id] then
if Func.takeitmes(actor, ZhiBaoLaoRenOBJ.boxxh[id], true, true) then
Player.setkeycount(actor, VarCfg.Player.str["至宝盒子"], id, "空置")
Func.sendmsg9(actor, "解锁成功!")
return
end
else
return
end
end
----* 至宝穿戴前触发
local function ZhiBaoLaoRenOBJ_takebeforon(actor, makeIndex, where, Info)
if where > 70 and where < 75 then
if checkitemw(actor, Info.name) then
Func.sendmsg9(actor, string.format("您已经穿戴了一个#251|%s#215|,不可重复穿戴!", Info.name))
Info.bool = false
end
local openData = Player.getkeytbl(actor, VarCfg.Player.str["至宝盒子"]) or {}
if not openData[where - 70] then
Info.bool = false
Func.sendmsg9(actor, "该位置未解锁,无法穿戴至宝!")
end
if ZhiBaoLaoRenOBJ.itemName[Info.name] and ZhiBaoLaoRenOBJ.itemName[Info.name].cd then
local _cd = Player.getint(actor, VarCfg.Player.int.cd[string.format("%s穿戴", Info.name)])
if os.time() < _cd then
Info.bool = false
Func.sendmsg9(actor, string.format("该至宝穿戴冷却CD,请稍后重试,倒计时:%d秒!", _cd - os.time()))
end
end
end
end
GameEvent.add(EventCfg.onTakebeforOnEx, ZhiBaoLaoRenOBJ_takebeforon, ZhiBaoLaoRenOBJ)
----* 至宝穿戴后触发
local function ZhiBaoLaoRenOBJ_takeon(actor, makeIndex, where, itemName, Info)
if itemName == "天哭袍" then
local groupNum = getbaseinfo(actor, ConstCfg.gbase.team_num) or 0
if groupNum > 0 then
GroupOBJ:tiankupao(actor)
end
end
if itemName == "龍魂令" then
local groupNum = getbaseinfo(actor, ConstCfg.gbase.team_num) or 0
if groupNum > 0 then
GroupOBJ:longhunling(actor)
end
end
if ZhiBaoLaoRenOBJ.itemName[itemName] and ZhiBaoLaoRenOBJ.itemName[itemName].buffid then
if not hasbuff(actor, ZhiBaoLaoRenOBJ.itemName[itemName].buffid) then
addbuff(actor, ZhiBaoLaoRenOBJ.itemName[itemName].buffid)
end
end
if ZhiBaoLaoRenOBJ.itemName[itemName] and ZhiBaoLaoRenOBJ.itemName[itemName].skillID then
addskill(actor, ZhiBaoLaoRenOBJ.itemName[itemName].skillID, 3)
end
end
GameEvent.add(EventCfg.onTakeOnEx, ZhiBaoLaoRenOBJ_takeon, ZhiBaoLaoRenOBJ)
----* 至宝穿戴后触发
local function ZhiBaoLaoRenOBJ_takeoff(actor, makeIndex, where, itemName, Info)
if itemName == "天哭袍" then
local groupNum = getbaseinfo(actor, ConstCfg.gbase.team_num) or 0
if groupNum > 0 then
GroupOBJ:tiankupao(actor)
end
end
if itemName == "龍魂令" then
local groupNum = getbaseinfo(actor, ConstCfg.gbase.team_num) or 0
if groupNum > 0 then
GroupOBJ:longhunling(actor)
end
end
if ZhiBaoLaoRenOBJ.itemName[itemName] and ZhiBaoLaoRenOBJ.itemName[itemName].buffid then
if hasbuff(actor, ZhiBaoLaoRenOBJ.itemName[itemName].buffid) then
delbuff(actor, ZhiBaoLaoRenOBJ.itemName[itemName].buffid)
end
end
if ZhiBaoLaoRenOBJ.itemName[itemName] and ZhiBaoLaoRenOBJ.itemName[itemName].skillID then
delskill(actor, ZhiBaoLaoRenOBJ.itemName[itemName].skillID)
end
if ZhiBaoLaoRenOBJ.itemName[itemName] and ZhiBaoLaoRenOBJ.itemName[itemName].cd then
Player.setint(actor, VarCfg.Player.int.cd[string.format("%s穿戴", itemName)],
os.time() + ZhiBaoLaoRenOBJ.itemName[itemName].cd)
end
if itemName == "雮尘珠" then
setsuckdamage(actor, "=", 0, 100, 100)
clearplayeffect(actor, 10208)
LOGDump("清理特效")
end
end
GameEvent.add(EventCfg.onTakeOffEx, ZhiBaoLaoRenOBJ_takeoff, ZhiBaoLaoRenOBJ)
return ZhiBaoLaoRenOBJ