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

493 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.

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