bayuMIR/Mirserver/Mir200/Envir/QuestDiary/游戏功能/A1_一大陆/绝学修炼.lua
2026-06-24 02:59:53 +08:00

465 lines
14 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.

JueXueXiuLianOBJ = Up_BaseClass:new()
JueXueXiuLianOBJ._name = "JueXueXiuLianOBJ"
-- NPCID
JueXueXiuLianOBJ.id = { 12 }
for i, v in ipairs(JueXueXiuLianOBJ.id or {}) do
Npc.clicknpcCfg[v] = JueXueXiuLianOBJ
end
-- 配置文件
JueXueXiuLianOBJ.cfg = {
juexue = Func.require("cfg_绝学修炼"),
jiesuo = Func.require("cfg_绝学解锁"),
xilian = {
{ "灵石", 50, 0 },
{ "金币", 5000, 1 },
},
}
local function JueXueXiuLianOBJ_for()
local tbl = {}
for i, v in ipairs(JueXueXiuLianOBJ.cfg.juexue) do
if not tbl[v.calss] then
tbl[v.calss] = {}
end
table.insert(tbl[v.calss], string.format("%d#%d", i, v.cgl))
end
return tbl
end
JueXueXiuLianOBJ.qz = JueXueXiuLianOBJ_for()
---* 加入上线同步数据
Player.sycCfg[JueXueXiuLianOBJ._name] = JueXueXiuLianOBJ.cfg
JueXueXiuLianOBJ.bookPos = 9
JueXueXiuLianOBJ.bookName = "武林秘籍"
JueXueXiuLianOBJ.bookVarKeys = {
VarCfg.item.int["绝学修炼_1"],
VarCfg.item.int["绝学修炼_2"],
VarCfg.item.int["绝学修炼_3"],
VarCfg.item.int["绝学修炼_4"],
}
function JueXueXiuLianOBJ:up(actor, p1, p2, p3, data)
if not Npc.CheckNPCRange(actor, 12) then
return
end
if not data or not data[1] then
return
end
local id = data[1].id
if not id then
return
end
local bookItem = self:getBookItem(actor)
if not bookItem then
return
end
local open = self:getBookJueXue(bookItem, id)
if open <= 0 then
Func.sendmsg9(actor, "该位置您未没有解锁!")
return
end
if Func.takeitmes(actor, self.cfg.xilian, true, true) then
setflagstatus(actor, VarCfg.Falg_fangshua, 1)
local xilian_id = self:xilian(actor, id)
local _oldid = self:getBookJueXue(bookItem, id)
if self.cfg.juexue[_oldid] and self.cfg.juexue[_oldid].buff then
if hasbuff(actor, self.cfg.juexue[_oldid].buff) then
delbuff(actor, self.cfg.juexue[_oldid].buff)
end
end
self:setBookJueXue(actor, bookItem, id, xilian_id)
if self.cfg.juexue[xilian_id].buff then
if not hasbuff(actor, self.cfg.juexue[xilian_id].buff) then
addbuff(actor, self.cfg.juexue[xilian_id].buff)
end
end
Func.sendmsg9(actor, string.format("[绝学修炼]:#70|恭喜您洗练成功,获得:#255|%s#215|!", self.cfg.juexue[xilian_id].name))
end
end
function JueXueXiuLianOBJ:jiesuo(actor, p1, p2, p3, data)
if not Npc.CheckNPCRange(actor, 12) then
return
end
if not data or not data[1] then
return
end
local id = data[1].id
if not id then
return
end
local bookItem = self:getBookItem(actor)
if not bookItem then
return
end
local open = self:getBookJueXue(bookItem, id)
if open > 0 then
Func.sendmsg9(actor, "您已经解锁了该绝学修炼位置!")
return
end
local cfg = self.cfg.jiesuo[id]
if not Func.checkcontion(actor, cfg.checkcontion, false, true) then
return
end
if Func.takeitmes(actor, cfg.xh, true, true) then
setflagstatus(actor, VarCfg.Falg_fangshua, 1)
local xilian_id = self:xilian(actor, id)
self:setBookJueXue(actor, bookItem, id, xilian_id)
if self.cfg.juexue[xilian_id].buff then
if not hasbuff(actor, self.cfg.juexue[xilian_id].buff) then
addbuff(actor, self.cfg.juexue[xilian_id].buff)
end
end
end
end
---* 洗练绝学
function JueXueXiuLianOBJ:xilian(actor, id)
--* 防刷标识
if getflagstatus(actor, VarCfg.Falg_fangshua) == 0 then
return
end
if not id then
return
end
local get_calss = self:get_juexue(actor, id)
local new_qzCfg = {}
for i, v in ipairs(self.qz or {}) do
if not get_calss[i] then
for _, qz in ipairs(v) do
table.insert(new_qzCfg, qz)
end
end
end
local result1, result2 = ransjstr(table.concat(new_qzCfg, "|"), 1, 3)
--* 防刷标识
setflagstatus(actor, VarCfg.Falg_fangshua, 0)
return tonumber(result1)
end
function JueXueXiuLianOBJ:getBookItem(actor, tips)
local bookItem = GetItemByPos(actor, self.bookPos)
if not bookItem or bookItem == "0" then
if tips ~= false then
Func.sendmsg9(actor, "请先佩戴武林秘籍!")
end
return nil
end
local itemName = getiteminfo(actor, bookItem, ConstCfg.iteminfo.name)
if itemName ~= self.bookName then
if tips ~= false then
Func.sendmsg9(actor, "请先佩戴武林秘籍!")
end
return nil
end
return bookItem
end
function JueXueXiuLianOBJ:getBookJueXue(bookItem, id)
local key = self.bookVarKeys[id]
if not key then
return 0
end
return Item.getint(bookItem, key) or 0
end
function JueXueXiuLianOBJ:getBookJueXueTbl(actor)
local bookItem = self:getBookItem(actor, false)
local tbl = {}
if not bookItem then
return tbl
end
for i, key in ipairs(self.bookVarKeys or {}) do
tbl[i] = Item.getint(bookItem, key) or 0
end
return tbl
end
function JueXueXiuLianOBJ:setBookJueXue(actor, bookItem, id, juexueId)
local key = self.bookVarKeys[id]
if not key then
return
end
Item.setint(actor, bookItem, key, juexueId or 0)
end
function JueXueXiuLianOBJ:get_juexue(actor, id)
if not id then
return
end
local juexueCfg = self:getBookJueXueTbl(actor)
local tbl = {}
for i, v in pairs(juexueCfg or {}) do
if id ~= i and v > 0 and self.cfg.juexue[v] then
tbl[self.cfg.juexue[v].calss] = true
end
end
return tbl
end
function JueXueXiuLianOBJ:hasJueXue(actor, juexueId)
if not juexueId then
return false
end
local juexueCfg = self:getBookJueXueTbl(actor)
for i, v in pairs(juexueCfg or {}) do
if v == juexueId then
return true
end
end
return false
end
JueXueXiuLianOBJ.AttackdamageCfg = {
--* 基本剑术伤害提升5%
[1] = function(actor, target, hitter, magicId, damage, model, Info)
if Player.CheckNPCRange(actor, target, 1) and magicId ~= 26 then
Info._damage = Info._damage + math.floor(Info._damage * 0.05)
end
end,
[2] = function(actor, target, hitter, magicId, damage, model, Info)
if Player.CheckNPCRange(actor, target, 1) and magicId ~= 26 then
if Func.random(5) and not hasbuff(actor, 10000) then
if addbuff(actor, 10000, 5) then
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,忽视目标100%防御,持续5s.#7", "百步穿杨"))
end
end
end
end,
---* 使用刺杀剑术 有5%的概率提升刺杀剑术伤害10% 持续5秒
[5] = function(actor, target, hitter, magicId, damage, model, Info)
if magicId == 12 and not Player.CheckNPCRange(actor, target, 1) then
if Func.random(5) and not hasbuff(actor, 10001) then
addbuff(actor, 10001, 10)
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,提升刺杀剑术伤害10%%,持续10s.#7", "撕裂长空"))
end
if hasbuff(actor, 10001) then
Info._damage = Info._damage + math.floor(Info._damage * 0.1)
end
end
end,
[9] = function(actor, target, hitter, magicId, damage, model, Info)
if magicId == 25 then
Info._damage = Info._damage + math.floor(Info._damage * 0.2)
end
end,
[16] = function(actor, target, hitter, magicId, damage, model, Info)
if magicId == 66 then
Info._damage = Info._damage + math.floor(Info._damage * 0.1)
end
end,
[19] = function(actor, target, hitter, magicId, damage, model, Info)
if magicId == 56 then
Info._damage = Info._damage + math.floor(Info._damage * 0.3)
end
end,
}
JueXueXiuLianOBJ.AttackHumandamageCfg = {
--* 使用基本剑术有5%概率忽视目标防御持续5秒
-- [2] = function(actor, target, hitter, magicId, damage, model, Info)
-- if Player.CheckNPCRange(actor, target, 1) and magicId ~= 26 then
-- if Func.random(50) and not hasbuff(actor, 10000) then
-- if addbuff(actor, 10000, 5) then
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,忽视目标100%防御,持续5s.#7", "百步穿杨"))
-- end
-- end
-- end
-- end,
}
JueXueXiuLianOBJ.onAttackCfg = {
--* 攻击有1%概率召唤一只道士骷髅附带绿毒效果骷髅血量1000仅仅可召唤1只
-- [3] = function(actor, target, hitter, magicId, Info)
-- if magicId == 3 then
-- if Func.random(1) then
-- local mmon = getslavebyindex(actor, 0)
-- if Player.getname(mmon) == "骷髅" then
-- return
-- end
-- recallmob(actor, "骷髅", 7, 65535, 0, 0, 0)
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,召唤一只道士骷髅助力.#7", "刀光剑影"))
-- end
-- end
-- end,
---* 使用刺杀剑术有1%概率 冰冻目标2秒
[4] = function(actor, target, hitter, magicId, Info)
if magicId == 12 then
if Func.random(1) then
makeposion(target, 12, 2, nil, 1)
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,冰冻目标2秒.#7", "游龙戏凤"))
end
end
end,
---* 使用烈火剑法有10%概率附带 红毒效果 持续10秒
[13] = function(actor, target, hitter, magicId, Info)
if magicId == 26 then
if Func.random(50) then
makeposion(target, 1, 10, 3, 1)
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,使目标中红毒,持续10秒.#7", "巫毒精灵"))
end
end
end,
---* 使用烈火剑法有10%概率附带 红毒效果 持续10秒
[14] = function(actor, target, hitter, magicId, Info)
if magicId == 26 then
if Func.random(25) and not hasbuff(target, 10004) then
if addbuff(target, 10004) then
playeffect(actor, 30347, 0, 0, 3, 0, 0)
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,使其燃烧当前生命值的1%% 持续4s.#7", "灼热之炎"))
end
end
end
end,
---* 开天斩击中单位蛛网2秒
[17] = function(actor, target, hitter, magicId, Info)
if magicId == 66 then
makeposion(target, 13, 2, 0, 1)
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,使目标中蛛网2s.#7", "改天换地"))
end
end,
---* 开天斩可将敌人击退1格且定身1秒
[18] = function(actor, target, hitter, magicId, Info)
if magicId == 66 then
releasemagic(actor, 2015, 1, 3, 1, 0)
changemode(target, 10, 1)
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,将敌人击退1格并定身1s.#7", "断海裂空"))
end
end,
}
JueXueXiuLianOBJ.onAttackMonCfg = {
[6] = function(actor, target, hitter, magicId, Info)
if magicId == 12 then
if Info.target_HP < 1000 then
humanhp(target, "-", 1000)
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,怪物生命不足1000,直接斩杀.#7", "斩妖除魔"))
end
end
end,
[8] = function(actor, target, hitter, magicId, Info)
local _cd = Player.getint(actor, VarCfg.Player.int["吸星大法"]) or 0
if Info.timer > _cd then
monmove(actor, 6, 4, 0, 0, 1, 1)
Player.setint(actor, VarCfg.Player.int["吸星大法"], Info.timer + 60)
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,强制将6x6范围内的怪物牵引到自己身边.#7", "吸星大法"))
end
end,
}
JueXueXiuLianOBJ.onAttackPlayCfg = {
[21] = function(actor, target, hitter, magicId, Info)
if magicId == 56 and not hasbuff(target, 10006) and Func.random(30) then
if addbuff(target, 10006, 5) then
-- Func.sendmsg(actor, string.format("[技能绝学]:#70|%s#215|触发,使目标无法使用任何药品,持续5s.#7", "剑灵束魂"))
-- Func.sendmsg(target, string.format("[技能绝学]:#70|对方#7|%s#215|触发,使你无法使用任何药品,持续5s.#7", "剑灵束魂"))
end
end
end,
}
--------------* 注册攻击事件
---* 攻击前触发 对人对怪
local function _onAttackdamage(actor, target, hitter, magicId, damage, model, Info)
for i, v in pairs(JueXueXiuLianOBJ:getBookJueXueTbl(actor)) do
if v > 0 and JueXueXiuLianOBJ.AttackdamageCfg[v] then
local func = JueXueXiuLianOBJ.AttackdamageCfg[v]
func(actor, target, hitter, magicId, damage, model, Info)
end
end
end
GameEvent.add(EventCfg.onAttackdamage, _onAttackdamage, JueXueXiuLianOBJ)
---* 攻击前触发 对人
local function _onAttackHumandamage(actor, target, hitter, magicId, damage, model, Info)
for i, v in pairs(JueXueXiuLianOBJ:getBookJueXueTbl(actor)) do
if v > 0 and JueXueXiuLianOBJ.AttackHumandamageCfg[v] then
local func = JueXueXiuLianOBJ.AttackHumandamageCfg[v]
func(actor, target, hitter, magicId, damage, model, Info)
end
end
end
GameEvent.add(EventCfg.onAttackHumandamage, _onAttackHumandamage, JueXueXiuLianOBJ)
---* 攻击后触发 对人对怪
local function _onAttack(actor, target, hitter, magicId, Info)
for i, v in pairs(JueXueXiuLianOBJ:getBookJueXueTbl(actor)) do
if v > 0 and JueXueXiuLianOBJ.onAttackCfg[v] then
local func = JueXueXiuLianOBJ.onAttackCfg[v]
func(actor, target, hitter, magicId, Info)
end
end
end
GameEvent.add(EventCfg.onAttack, _onAttack, JueXueXiuLianOBJ)
---* 攻击后触发 对怪
local function _onAttackMon(actor, target, hitter, magicId, Info)
for i, v in pairs(JueXueXiuLianOBJ:getBookJueXueTbl(actor)) do
if v > 0 and JueXueXiuLianOBJ.onAttackMonCfg[v] then
local func = JueXueXiuLianOBJ.onAttackMonCfg[v]
func(actor, target, hitter, magicId, Info)
end
end
end
GameEvent.add(EventCfg.onAttackMon, _onAttackMon, JueXueXiuLianOBJ)
---* 攻击后触发 对人
local function _onAttackPlay(actor, target, hitter, magicId, Info)
for i, v in pairs(JueXueXiuLianOBJ:getBookJueXueTbl(actor)) do
if v > 0 and JueXueXiuLianOBJ.onAttackPlayCfg[v] then
local func = JueXueXiuLianOBJ.onAttackPlayCfg[v]
func(actor, target, hitter, magicId, Info)
end
end
end
GameEvent.add(EventCfg.onAttackPlay, _onAttackPlay, JueXueXiuLianOBJ)
JueXueXiuLianOBJ.allowFunc = {"up", "jiesuo"}
return JueXueXiuLianOBJ