493 lines
16 KiB
Lua
493 lines
16 KiB
Lua
JiuMiOBJ = Up_BaseClass:new()
|
||
|
||
|
||
JiuMiOBJ._name = "JiuMiOBJ"
|
||
-- NPCID
|
||
|
||
JiuMiOBJ.id = { 86 }
|
||
|
||
for i, v in ipairs(JiuMiOBJ.id or {}) do
|
||
Npc.clicknpcCfg[v] = JiuMiOBJ
|
||
end
|
||
|
||
-- 配置文件
|
||
JiuMiOBJ.cfg = {
|
||
up = Func.require("cfg_九秘修炼"),
|
||
xl = {
|
||
cfg = Func.require("cfg_九秘buff"),
|
||
xh = {
|
||
{ "天命石", 5, 0 },
|
||
{ "千年玄石", 2000, 0 },
|
||
}
|
||
},
|
||
}
|
||
|
||
|
||
local function JiuMiOBJ_for()
|
||
local tbl = {}
|
||
local Qzvalue = {
|
||
1350, 800, 336, 50
|
||
}
|
||
for i, v in pairs(JiuMiOBJ.cfg.xl.cfg or {}) do
|
||
table.insert(tbl, string.format("%s#%d", i, Qzvalue[v.level]))
|
||
end
|
||
return tbl
|
||
end
|
||
|
||
|
||
JiuMiOBJ.qz = JiuMiOBJ_for()
|
||
|
||
|
||
|
||
|
||
---* 加入上线同步数据
|
||
Player.sycCfg[JiuMiOBJ._name] = JiuMiOBJ.cfg
|
||
|
||
|
||
JiuMiOBJ.CaChe = {}
|
||
|
||
---* 允许前端调用的函数
|
||
JiuMiOBJ.allowFunc = { "up", "xl" }
|
||
|
||
|
||
function JiuMiOBJ:up(actor, p1, p2, p3, data)
|
||
if not Npc.CheckNPCRange(actor, 86) then
|
||
return
|
||
end
|
||
|
||
|
||
local _bool = Player.gettempint(actor, VarCfg.Player.temp.int["九秘升级状态"]) or 0
|
||
if _bool > 0 then
|
||
return
|
||
end
|
||
|
||
|
||
local id = data[1]
|
||
if not data or not id then
|
||
Player.settempint(actor, VarCfg.Player.temp.int["九秘升级状态"], 0)
|
||
return
|
||
end
|
||
|
||
|
||
local cfg = self.cfg.up[id]
|
||
local level = Player.getkeycount(actor, VarCfg.Player.str["九秘等级"], id) or 0
|
||
|
||
if level >= cfg.level then
|
||
Player.settempint(actor, VarCfg.Player.temp.int["九秘升级状态"], 0)
|
||
return Func.sendmsg9(actor, "[九秘修炼]:#70|该字秘已经满级!")
|
||
end
|
||
|
||
|
||
if Func.takeitmes(actor, cfg.xh, true, true) then
|
||
local cgl = cfg.cgl * 10
|
||
local baodi = Player.getkeycount(actor, VarCfg.Player.str["九秘升级保底"], id) or 0
|
||
|
||
if baodi >= 1 then
|
||
cgl = cgl + baodi
|
||
end
|
||
|
||
if Func.random(cgl, 1000) then
|
||
screffects(actor, 1, 21100, 500, 500, 1, 1, 0)
|
||
Player.setkeycount(actor, VarCfg.Player.str["九秘等级"], id, level + 1)
|
||
Func.sendmsg9(actor,
|
||
string.format("[九秘修炼]:#70|恭喜您升级成功,将#251|[%s]#250|升级至#251|[%s级]#215|!", cfg.name, level + 1))
|
||
if level + 1 >= cfg.level then
|
||
setflagstatus(actor, VarCfg.Falg_fangshua, 1)
|
||
self:xilian_Buff(actor, id)
|
||
end
|
||
JiuMiOBJ:all_up(actor)
|
||
else
|
||
screffects(actor, 2, 21102, 500, 500, 1, 1, 0)
|
||
Player.setkeycount(actor, VarCfg.Player.str["九秘等级"], id, 0)
|
||
Player.setkeycount(actor, VarCfg.Player.str["九秘升级保底"], id, baodi + 1)
|
||
sendredvartoclient(actor)
|
||
-- Player.setkeycount(actor, VarCfg.Player.str["九秘升级保底"], id, 999)
|
||
Func.sendmsg9(actor, string.format("[九秘修炼]:#70|抱歉,升级失败,#251|[%s]#250|已降为#251|[%s级]#215|!", cfg.name, 0))
|
||
end
|
||
ReloadAttOBJ.main(actor)
|
||
end
|
||
Player.settempint(actor, VarCfg.Player.temp.int["九秘升级状态"], 0)
|
||
end
|
||
|
||
---* 满级称号检测
|
||
function JiuMiOBJ:all_up(actor)
|
||
if checktitle(actor, "九秘归一") then
|
||
return
|
||
end
|
||
local levelData = Player.getkeytbl(actor, VarCfg.Player.str["九秘等级"])
|
||
if not levelData then
|
||
return
|
||
end
|
||
local top_level = 0
|
||
for i, v in ipairs(self.cfg.up or {}) do
|
||
local level = levelData[i] and levelData[i] or 0
|
||
if level >= v.level then
|
||
top_level = top_level + 1
|
||
end
|
||
end
|
||
if top_level >= #self.cfg.up then
|
||
Player.confertitle(actor, "九秘归一", 0, true)
|
||
Func.sendmsg9(actor, "[九秘]:#70|恭喜您将所有秘字决升级到满级,获得:#251|九秘归一#215|称号.")
|
||
addskill(actor, 2014, 3)
|
||
end
|
||
end
|
||
|
||
----* 升级属性刷新
|
||
local function JiuMiOBJ_attreload(actor)
|
||
local levelData = Player.getkeytbl(actor, VarCfg.Player.str["九秘等级"])
|
||
local att = {}
|
||
|
||
----* 计算字秘单属性
|
||
for i, v in ipairs(JiuMiOBJ.cfg.up or {}) do
|
||
local level = levelData[i] and levelData[i] or 0
|
||
if level > 0 then
|
||
local attID = v.attrId
|
||
local value = Up_BaseClass:getattValue(actor, attID, level * v.addatt)
|
||
table.insert(att, { attID, value })
|
||
end
|
||
end
|
||
|
||
|
||
---* 计算总和属性
|
||
local up_num = 0
|
||
for k, v in pairs(levelData or {}) do
|
||
up_num = up_num + v
|
||
end
|
||
|
||
if up_num > 0 then
|
||
Player.setint(actor, VarCfg.Player.int["九秘排行榜"], up_num)
|
||
end
|
||
|
||
---* 增加buff属性
|
||
-- local buffData = Player.getkeytbl(actor, VarCfg.Player.str["九秘BUFF"]) or {}
|
||
-- for k, v in pairs(buffData or {}) do
|
||
-- if JiuMiOBJ.cfg.xl.cfg[v] and JiuMiOBJ.cfg.xl.cfg[v].attId then
|
||
-- for _, value in ipairs(JiuMiOBJ.cfg.xl.cfg[v].attId or {}) do
|
||
-- table.insert(att, { value[1], Up_BaseClass:getattValue(actor, value[1], value[2]) })
|
||
-- end
|
||
-- end
|
||
-- end
|
||
|
||
if checktitle(actor, "九秘归一") and getskillinfo(actor, 2014, 1) == nil then
|
||
addskill(actor, 2014, 3)
|
||
end
|
||
|
||
|
||
|
||
table.insert(att, { 4, math.floor(up_num / 5) })
|
||
return att
|
||
end
|
||
ReloadAttOBJ:insert("JiuMiOBJ_attreload", JiuMiOBJ_attreload)
|
||
|
||
|
||
|
||
|
||
function JiuMiOBJ:xl(actor, p1, p2, p3, data)
|
||
local _bool = Player.gettempint(actor, VarCfg.Player.temp.int["九秘升级状态"]) or 0
|
||
if _bool > 0 then
|
||
return
|
||
else
|
||
Player.settempint(actor, VarCfg.Player.temp.int["九秘升级状态"], 1)
|
||
end
|
||
|
||
local id = data[1]
|
||
if not data or not id then
|
||
Player.settempint(actor, VarCfg.Player.temp.int["九秘升级状态"], 0)
|
||
return
|
||
end
|
||
|
||
local level = Player.getkeycount(actor, VarCfg.Player.str["九秘等级"], id) or 0
|
||
local cfg = self.cfg.up[id]
|
||
if level < cfg.level then
|
||
Func.sendmsg9(actor, string.format("[九秘修炼]:#70|%s未达到[%d级]!", cfg.name, cfg.level))
|
||
Player.settempint(actor, VarCfg.Player.temp.int["九秘升级状态"], 0)
|
||
return
|
||
end
|
||
|
||
if Func.takeitmes(actor, JiuMiOBJ.cfg.xl.xh, true, true) then
|
||
setflagstatus(actor, VarCfg.Falg_fangshua, 1)
|
||
showprogressbardlg(actor, 2, "jiumiobj_xl," .. id, "正在洗炼%d...", 0, nil)
|
||
return
|
||
end
|
||
Player.settempint(actor, VarCfg.Player.temp.int["九秘升级状态"], 0)
|
||
end
|
||
|
||
function jiumiobj_xl(actor, id)
|
||
if getflagstatus(actor, VarCfg.Falg_fangshua) == 0 then
|
||
return
|
||
end
|
||
id = tonumber(id)
|
||
JiuMiOBJ:xilian_Buff(actor, id)
|
||
end
|
||
|
||
---* 满级洗炼buff
|
||
function JiuMiOBJ:xilian_Buff(actor, id)
|
||
if getflagstatus(actor, VarCfg.Falg_fangshua) == 0 then
|
||
return
|
||
end
|
||
if not id then
|
||
return
|
||
end
|
||
|
||
local level = Player.getkeycount(actor, VarCfg.Player.str["九秘等级"], id) or 0
|
||
local cfg = self.cfg.up[id]
|
||
if level < cfg.level then
|
||
return
|
||
end
|
||
|
||
local buffData = Player.getkeytbl(actor, VarCfg.Player.str["九秘BUFF"]) or {}
|
||
local buffList = table.Copy(JiuMiOBJ.qz)
|
||
local newArray = {}
|
||
|
||
local excludeNames = {}
|
||
for _, name in pairs(buffData) do
|
||
excludeNames[name] = true
|
||
end
|
||
|
||
for _, item in ipairs(buffList) do
|
||
local shouldInclude = true
|
||
for excludeName in pairs(excludeNames) do
|
||
if string.find(item, excludeName) then
|
||
shouldInclude = false
|
||
break
|
||
end
|
||
end
|
||
|
||
if shouldInclude then
|
||
table.insert(newArray, item)
|
||
end
|
||
end
|
||
|
||
local _y_title = Player.getkeycount(actor, VarCfg.Player.str["九秘BUFF"], id)
|
||
if checktitle(actor, _y_title) then
|
||
deprivetitle(actor, _y_title)
|
||
end
|
||
|
||
local result1, result2 = ransjstr(table.concat(newArray, "|"), 1, 3)
|
||
confertitle(actor, result1, 0)
|
||
Player.setkeycount(actor, VarCfg.Player.str["九秘BUFF"], id, result1)
|
||
Func.sendmsg9(actor, string.format("[九秘]:#70|恭喜您,#251|[%s]#215|获得了BUFF:#251|[%s]#215|.", cfg.name, result1))
|
||
ReloadAttOBJ.main(actor)
|
||
setflagstatus(actor, VarCfg.Falg_fangshua, 0)
|
||
Player.settempint(actor, VarCfg.Player.temp.int["九秘升级状态"], 0)
|
||
end
|
||
|
||
-----* 九秘BUFF触发
|
||
|
||
---* 受击后触发
|
||
JiuMiOBJ.onStruck = {
|
||
["铁骑"] = function(actor, hitter, target, magicId, Info)
|
||
if not hasbuff(actor, 10016) and Func.random(5) then
|
||
addbuff(actor, 10016)
|
||
-- Func.sendmsg(actor, string.format("[九秘]铁骑触发,防御+20%%,持续5秒."))
|
||
end
|
||
end,
|
||
}
|
||
|
||
local function JiuMiOBJ_onStruck(actor, hitter, target, magicId, Info)
|
||
local buffData = Player.getstr(actor, VarCfg.Player.str["九秘BUFF"]) or ""
|
||
for k, v in pairs(JiuMiOBJ.onStruck or {}) do
|
||
if string.find(buffData, k, 1, true) ~= nil then
|
||
if v then
|
||
v(actor, hitter, target, magicId, Info)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
GameEvent.add(EventCfg.onStruckOut, JiuMiOBJ_onStruck, JiuMiOBJ)
|
||
|
||
----* 攻击时触发
|
||
JiuMiOBJ.onAttack = {
|
||
["虎啸"] = function(actor, target, hitter, magicId, Info)
|
||
if not hasbuff(actor, 10017) and Func.random(5) then
|
||
addbuff(actor, 10017)
|
||
-- Func.sendmsg(actor, string.format("[九秘]虎啸触发,攻击力+2%%,持续3秒."))
|
||
end
|
||
end,
|
||
["诛仙"] = function(actor, target, hitter, magicId, Info)
|
||
if not hasbuff(actor, 10018) and Func.random(5) then
|
||
addbuff(actor, 10018)
|
||
-- Func.sendmsg(actor, string.format("[九秘]诛仙触发,暴击几率+5%%,持续5秒."))
|
||
end
|
||
end,
|
||
["饮蝶"] = function(actor, target, hitter, magicId, Info)
|
||
if not hasbuff(actor, 10019) and Func.random(5) then
|
||
addbuff(actor, 10019)
|
||
-- Func.sendmsg(actor, string.format("[九秘]饮蝶触发,吸血+2%%,持续3秒."))
|
||
end
|
||
end,
|
||
["战魂"] = function(actor, target, hitter, magicId, Info)
|
||
if Info.isplayer and Func.random(100) then
|
||
local target_weapon = GetItemByPos(target, 1)
|
||
if type(target_weapon) ~= "0" then
|
||
setdura(target, target_weapon, "=", 0)
|
||
-- Func.sendmsg(actor, string.format("[九秘]战魂触发,将%s武器持久打击为0.", Player.getname(target)))
|
||
-- Func.sendmsg(target, string.format("[九秘]对方战魂触发,将你的武器持久打击为0."))
|
||
end
|
||
end
|
||
end,
|
||
["狂风"] = function(actor, target, hitter, magicId, Info)
|
||
if not hasbuff(actor, 10020) and Func.random(5) then
|
||
addbuff(actor, 10020)
|
||
-- Func.sendmsg(actor, string.format("[九秘]狂风触发,攻击速度+1,持续3秒."))
|
||
end
|
||
end,
|
||
["破万法"] = function(actor, target, hitter, magicId, Info)
|
||
if not hasbuff(actor, 10021) and Func.random(5) then
|
||
addbuff(actor, 10021)
|
||
-- Func.sendmsg(actor, string.format("[九秘]破万法触发,免疫所有负面效果,持续5秒."))
|
||
end
|
||
end,
|
||
["罪の罚"] = function(actor, target, hitter, magicId, Info)
|
||
if Info.isplayer then
|
||
local Pkvalue = getbaseinfo(target, ConstCfg.gbase.pkvalue) or 0
|
||
if Pkvalue < 100 then
|
||
if Func.random(5) then
|
||
setbaseinfo(target, ConstCfg.sbase.pkvalue, 100)
|
||
-- Func.sendmsg(actor, string.format("[九秘]罪の罚触发,将%s变成红名.", Player.getname(target)))
|
||
-- Func.sendmsg(target, string.format("[九秘]%s罪の罚触发,将你变成红名.", Player.getname(actor)))
|
||
end
|
||
end
|
||
end
|
||
end,
|
||
["屠刀"] = function(actor, target, hitter, magicId, Info)
|
||
if Info.isplayer then
|
||
if Func.random(5) then
|
||
changemode(target, 10, 1)
|
||
playeffect(target, 10261, 0, 0, 1, 0, 0)
|
||
-- Func.sendmsg(actor, string.format("[九秘]屠刀触发,将%s缴械1秒.", Player.getname(target)))
|
||
-- Func.sendmsg(target, string.format("[九秘]%s屠刀触发,将你缴械1秒.", Player.getname(actor)))
|
||
end
|
||
end
|
||
end,
|
||
["九天揽月"] = function(actor, target, hitter, magicId, Info)
|
||
if Func.random(1) then
|
||
local index = 0
|
||
local ncount = getbaseinfo(actor, 38)
|
||
for i = 0, ncount - 1 do
|
||
local mon = getslavebyindex(actor, i)
|
||
if mon and isnotnull(mon) then
|
||
if getbaseinfo(mon, ConstCfg.gbase.name) == "白虎" then
|
||
index = index + 1
|
||
end
|
||
end
|
||
end
|
||
|
||
if index == 0 then
|
||
local hp_par = Info.self_MAXHP / 100 * 30
|
||
recallmobex(actor, "白虎", getbaseinfo(actor, ConstCfg.gbase.x), getbaseinfo(actor, ConstCfg.gbase.y), 7, 1,
|
||
nil, 252, 0, 1, 0, 30, hp_par)
|
||
-- Func.sendmsg(actor, "[九秘]九天揽月触发,召唤白虎作战.")
|
||
end
|
||
end
|
||
end,
|
||
|
||
["横扫千军"] = function(actor, target, hitter, magicId, Info)
|
||
if Func.random(5) then
|
||
local self_maxdc = getbaseinfo(actor, ConstCfg.gbase.custom_attr, 4) or 0
|
||
local _damage = self_maxdc / 100 * 20
|
||
humanhp(target, "-", _damage, 1)
|
||
playeffect(actor, 181, 0, 0, 1, 0, 0)
|
||
playeffect(actor, 182, 0, 0, 1, 0, 0)
|
||
playeffect(target, 183, 0, 0, 1, 0, 0)
|
||
-- Func.sendmsg(actor, "[九秘]横扫千军触发,召唤白虎作战.")
|
||
end
|
||
end,
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
local function JiuMiOBJ_onAttack(actor, target, hitter, magicId, Info)
|
||
local buffData = Player.getstr(actor, VarCfg.Player.str["九秘BUFF"]) or ""
|
||
for k, v in pairs(JiuMiOBJ.onAttack or {}) do
|
||
if string.find(buffData, k, 1, true) ~= nil then
|
||
if v then
|
||
v(actor, target, hitter, magicId, Info)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
GameEvent.add(EventCfg.onAttack, JiuMiOBJ_onAttack, JiuMiOBJ)
|
||
|
||
|
||
---* 被攻击前触发
|
||
JiuMiOBJ.onStruckdamage = {
|
||
["金钟罩"] = function(actor, hitter, target, magicId, damage, Info)
|
||
if Func.random(5) then
|
||
Info.damage = 0
|
||
-- Func.sendmsg(actor, string.format("[九秘]金钟罩触发,格挡本次伤害."))
|
||
end
|
||
end,
|
||
}
|
||
|
||
local function JiuMiOBJ_onStruckdamage(actor, hitter, target, magicId, damage, Info)
|
||
local buffData = Player.getstr(actor, VarCfg.Player.str["九秘BUFF"]) or ""
|
||
for k, v in pairs(JiuMiOBJ.onStruckdamage or {}) do
|
||
if string.find(buffData, k, 1, true) ~= nil then
|
||
if v then
|
||
v(actor, hitter, target, magicId, damage, Info)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
GameEvent.add(EventCfg.onstruckdamage, JiuMiOBJ_onStruckdamage, JiuMiOBJ)
|
||
|
||
|
||
|
||
---* 攻击前触发
|
||
JiuMiOBJ.onAttackdamage = {
|
||
["灭鬼神"] = function(actor, target, hitter, magicId, damage, model, Info)
|
||
if model == 0 then
|
||
if Func.random(1) then
|
||
Info._damage = Info._damage * 3
|
||
setattackefftype(actor, 13)
|
||
-- Func.sendmsg(actor, string.format("[九秘]灭鬼神触发,触发神圣一击."))
|
||
end
|
||
end
|
||
end,
|
||
}
|
||
|
||
local function JiuMiOBJ_onAttackdamage(actor, target, hitter, magicId, damage, model, Info)
|
||
local buffData = Player.getstr(actor, VarCfg.Player.str["九秘BUFF"]) or ""
|
||
for k, v in pairs(JiuMiOBJ.onAttackdamage or {}) do
|
||
if string.find(buffData, k, 1, true) ~= nil then
|
||
if v then
|
||
v(actor, target, hitter, magicId, damage, model, Info)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
GameEvent.add(EventCfg.onAttackdamage, JiuMiOBJ_onAttackdamage, JiuMiOBJ)
|
||
|
||
|
||
|
||
---* 人物死亡之前
|
||
JiuMiOBJ.onNextdie = {
|
||
["逆生死"] = function(actor, hitter, isplayer)
|
||
local _cd = Player.getint(actor, VarCfg.Player.int.cd["逆生死"]) or 0
|
||
if os.time() >= _cd then
|
||
Player.setint(actor, VarCfg.Player.int.cd["逆生死"], os.time() + 360)
|
||
addhpper(actor, "=", 20)
|
||
-- Func.sendmsg(actor, string.format("[九秘]逆生死触发,立即复活并恢复20%%生命值,CD:360s."))
|
||
end
|
||
end,
|
||
}
|
||
|
||
local function JiuMiOBJ_onNextdie(actor, hitter, isplayer)
|
||
local buffData = Player.getstr(actor, VarCfg.Player.str["九秘BUFF"]) or ""
|
||
for k, v in pairs(JiuMiOBJ.onNextdie or {}) do
|
||
if string.find(buffData, k, 1, true) ~= nil then
|
||
if v then
|
||
v(actor, hitter, isplayer)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
GameEvent.add(EventCfg.onNextdie, JiuMiOBJ_onNextdie, JiuMiOBJ)
|
||
|
||
|
||
|
||
|
||
return JiuMiOBJ
|