449 lines
16 KiB
Lua
449 lines
16 KiB
Lua
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
|