LianJi = {} local this = LianJi; local filename = "LianJi"; this.msgId = 90001025 --data [1]类型 0数据通知 l领取 2投资 this.TotalConfig = { unlockItemName = "SD果实", --解锁连击功能道具名字 addLianJi = { --连击加成道具配置 itemName = "SD果实", --连击加成道具 attr_id = 310012, --增加的属性id add_value = 10, --使用一个增加的属性值 max_count = 6000, --最大使用数量 }, addSD = { --增加SD护盾道具配置 itemName = "SD果实", --增加SD护盾道具 attr_id = 301011, --增加的属性id add_value = 100, --增加的属性值 max_count = 9000, }, time = 3, --触发时间(秒) lianji_skill = 0, --最终的连击技能id --[[ 配置说明 key(int):职业id key(int):连击方案index key(int):技能阶段 通常为【启动技】(StringList)-【衔接技】(StringList ,可为nil 或有多个衔接技) .... -【迸发技】(StringList) 各阶段[1]:为初始默认设置 attr_name:方案对应cfg_att_info attribute值 只有1项时不分分支 属性值最高的生效 ]] list = { --连击表 [1] = { { { "旋风斩" }, { "霹雳回旋斩", "雷霆裂闪" }, { "袭风刺", "致命一击" }, attr_name = "strength", }, }, [2] = { { { "冰封" }, { "黑龙波术", "血龙波术" }, { "爆炎术", "爆裂炎术" }, }, }, [3] = { { { "冰封箭", "冰封冽箭" }, { "多重箭" }, { "穿透箭", "穿透刺箭" }, }, }, [4] = { { { "天雷闪" }, { "霹雳回旋斩" }, { "玄月斩" }, attr_name = "strength", }, { { "掌心雷" }, { "闪电轰顶" }, attr_name = "intelligence", }, }, }, list2 = { [1] = { [1100003] = 1, -- 旋风斩 [1100005] = 1, -- 天地十字剑 [1100004] = 1, -- 牙突刺 [1100002] = 1, -- 地裂斩 [1100001] = 1, -- 升龙击 [1100006] = 2, -- 霹雳回旋斩 [1100009] = 2, -- 雷霆裂闪 [1100008] = 3, -- 袭风刺 } } } this.charge_type = 21; --投资 ---以下是实现逻辑 非程序误擅自改动 local DBVar = "ZC_LianJi"; -- 连击 local OpenVar = "ZC_LianJiOpenFlag"; -- 连击开启标记 local AutoLianJiVar = "AutoLianJiVar"; -- 自动连击状态 local LianJiRateItemVar = "ZC_LianJiRateItemVar"; -- 连击开启标记 local SDHuDunItemVar = "ZC_SDHuDunItemVar"; -- 连击开启标记 ; --连击db变量 --[[ DBVar={ index顺序:首发技能名 index顺序:衔接技能名 (可为nil) ... ... index顺序:释放技能名 first_skill_time:起手技能释放时间/上一阶段技能释放时间 jieduan:当前释放阶段 } ]] function tableHasValue(ta, value) for i, v in ipairs(ta) do if v == value then return true end end return false end function APIGetTable(actor, varName, var_type) local val = nil if var_type == 0 then val = getplaydef(actor, "J$" .. varName) elseif var_type == 1 then val = getplaydef(actor, "@" .. varName) else val = getplaydef(actor, "T$" .. varName) end return val end ---设置玩家table变量 val类型必须是table var_type 0天变量 1缓存变量 其它正常保存数据库变量 function APISetTable(actor, varName, val, var_type) if type(val) ~= "table" then return end if var_type == 0 then setplaydef(actor, "J$" .. varName, val) elseif var_type == 1 then setplaydef(actor, "@" .. varName, val) else setplaydef(actor, "T$" .. varName, val) -- info("记录成功",val,getplaydef(actor,"T$"..varName)) end end function APIGetInt(actor, varName, var_type) local val = 0 if var_type == 0 then val = getplaydef(actor, "J$" .. varName) elseif var_type == 1 then val = getplaydef(actor, "@" .. varName) else val = getplaydef(actor, "T$" .. varName) end return val or 0 end ---设置玩家Int变量 val类型必须是number function APISetInt(actor, varName, val, var_type) if type(val) ~= "number" then return end if var_type == 0 then return setplaydef(actor, "J$" .. varName, val) elseif var_type == 1 then return setplaydef(actor, "@" .. varName, val) else return setplaydef(actor, "T$" .. varName, val) end end --获取数据 function LianJi.getdata(actor) local dbdata = APIGetTable(actor, DBVar) return dbdata; end --检查开启 function LianJi.checkOpen(actor) return APIGetInt(actor, OpenVar) == 1; -- return true end --刷新属性 function LianJi.RefreshAttr(actor) if not LianJi.checkOpen(actor) then return end local lianji_count = APIGetInt(actor, LianJiRateItemVar) local sd_count = APIGetInt(actor, SDHuDunItemVar) local attr_tab = {} if lianji_count > 0 then attr_tab[this.TotalConfig.addLianJi.attr_id] = this.TotalConfig.addLianJi.add_value * lianji_count end if sd_count > 0 then attr_tab[this.TotalConfig.addSD.attr_id] = this.TotalConfig.addSD.add_value * sd_count end addrolekmlattributes(actor, AttCfg.LianJiGuoShiAtt, attr_tab) end --初始化默认连击 function LianJi.InitLianJi(actor) local data = {} local baseCareer = getbaseinfo(actor, "getbasecareer") local conf = this.TotalConfig.list[baseCareer]; if conf == nil then gameDebug.print("连击初始化错误,对应职业配置为nil,baseCareer=" .. baseCareer) return end if #conf > 1 then -- local strength = getattrinfo(actor, "strength") -- local agility = getattrinfo(actor, "agility") -- local intelligence = getattrinfo(actor, "intelligence") -- local stamina = getattrinfo(actor, "stamina") local max_key = "" local max_value = 0; for k, v in pairs(conf) do if v.attr_name then local value = getattrinfo(actor, v.attr_name) if value > max_value then max_key = k max_value = value end end end conf = conf[max_key] data.fangan = max_key else conf = conf[1] data.fangan = 1 end if conf == nil then gameDebug.print("连击初始化错误2,对应职业配置为nil,baseCareer=" .. baseCareer) return end for i = 1, #conf do local skill_id = ConfigDataManager.getTableValue("cfg_skill", "id", "name", conf[i][1]); data[i] = skill_id end APISetTable(actor, DBVar, data) return data end --数据通知 function LianJi.DataNotify(actor) if LianJi.checkOpen(actor) then local data = LianJi.getdata(actor) if data == nil then data = LianJi.InitLianJi(actor) end local conf = this.TotalConfig; local auto_state = APIGetInt(actor, AutoLianJiVar) local rate_count = APIGetInt(actor, LianJiRateItemVar) local sd_count = APIGetInt(actor, SDHuDunItemVar) sendluamsg(actor, this.msgId, { 0, conf, data, auto_state = auto_state, rate_count = rate_count, sd_count = sd_count }) end end function APISendCenterMsg(actor, msg, color, log) if not color then tipinfo(actor, msg) else tipinfo(actor, "" .. msg .. "") end if log then error(getbaseinfo(actor, "rolename"), msg) end end --连击设置变化请求 function LianJi.LianJiChange(actor, jieduan, skillName, fangan) if not LianJi.checkOpen(actor) then APISendCenterMsg(actor, "连击未解锁,请使用" .. this.TotalConfig.unlockItemName .. "解锁") return end local data = LianJi.getdata(actor) if data == nil then data = LianJi.InitLianJi(actor) end fangan = fangan or 1 -- info("data",fangan,data) if fangan ~= data.fangan then APISendCenterMsg(actor, "此方案未使用,不能设置") return end local skill_id = ConfigDataManager.getTableValue("cfg_skill", "id", "name", skillName); if data[jieduan] == skill_id then APISendCenterMsg(actor, "请勿重复设置") return end local skill_level = getskilllevel(actor, skill_id) if skill_level <= 0 then APISendCenterMsg(actor, "连击设置失败,未解锁" .. skillName) return end local baseCareer = getbaseinfo(actor, "getbasecareer") local conf = this.TotalConfig.list[baseCareer][data.fangan][jieduan]; if conf == nil then APISendCenterMsg(actor, "连击配置为nil,请联系管理员,basecareer=" .. baseCareer .. " fangan=" .. data.fangan, nil, true) return end if not tableHasValue(conf, skillName) then APISendCenterMsg(actor, skillName .. "不能设置") return end data[jieduan] = skill_id; APISetTable(actor, DBVar, data) APISendCenterMsg(actor, "连击" .. jieduan .. "阶段," .. skillName .. "设置成功", "#00ff00") sendluamsg(actor, this.msgId, { 1, data }) end function APItblkeytonumber(tbl) local newTable = {} for key, value in pairs(tbl) do local newKey = tonumber(key) or key if type(value) == "table" then newTable[newKey] = APItblkeytonumber(value) else newTable[newKey] = value end end return newTable end function LianJi.FangAnChange(actor, data) if not LianJi.checkOpen(actor) then APISendCenterMsg(actor, "连击未解锁,请使用" .. this.TotalConfig.unlockItemName .. "解锁") return end data = APItblkeytonumber(data) local baseCareer = getbaseinfo(actor, "getbasecareer") local conf = this.TotalConfig.list[baseCareer][data.fangan]; if conf == nil then APISendCenterMsg(actor, "连击配置为nil,请联系管理员,basecareer=" .. baseCareer .. " fangan=" .. data.fangan, nil, true) return end -- info("???",data,#data,conf) for i = 1, #data do local skillName = ConfigDataManager.getTableValue("cfg_skill", "name", "id", data[i]); -- info("skillName",conf[i]) if not tableHasValue(conf[i], skillName) then APISendCenterMsg(actor, skillName .. "不能设置") return end end APISetTable(actor, DBVar, data) APISendCenterMsg(actor, "连击方案替换成功", "#00ff00") sendluamsg(actor, this.msgId, { 1, data }) end --自动连击状态变化请求 function LianJi.AutoLianJiChange(actor) if not LianJi.checkOpen(actor) then APISendCenterMsg(actor, "连击未解锁,请使用" .. this.TotalConfig.unlockItemName .. "解锁") return end local data = LianJi.getdata(actor) if data == nil then APISendCenterMsg(actor, "开启自动连击失败,未设置连击") -- return end for i = 1, #data do if getskilllevel(actor, data[i]) <= 0 then local skill_name = ConfigDataManager.getTableValue("cfg_skill", "name", "id", data[i]); APISendCenterMsg(actor, "开启自动连击失败," .. skill_name .. "未解锁") return end end local auto_state = APIGetInt(actor, AutoLianJiVar) auto_state = auto_state == 1 and 0 or 1; APISetInt(actor, AutoLianJiVar, auto_state) APISendCenterMsg(actor, auto_state == 1 and "已开启自动连击" or "已关闭自动连击", "#00ff00") sendluamsg(actor, this.msgId, { 2, auto_state }) end function APICheck(check_str, have_count, itemNum) check_str = check_str or ">=" local result = true; if check_str == ">" or check_str == nil then if have_count <= itemNum then result = false end elseif check_str == "<" then if have_count >= itemNum then result = false end elseif check_str == "==" then if have_count ~= itemNum then result = false end elseif check_str == ">=" then if have_count < itemNum then result = false end elseif check_str == "<=" then if have_count > itemNum then result = false end end return result end function APICheckItem(actor, tcl, desc) if not next(tcl) then return false end for k, v in pairs(tcl) do if type(k) ~= "string" then local itemName = v[1]; --类型为变化或者道具时可用 道具名或者变量名 local itemNum = tonumber(v[2]); --对应类型需要的检查值 local bangding = v[3] or v.bind; --是否绑定 道具用 暂无用 local item_type = v[4] or v.mold; --类型 1或者nil道具 2 Int变量 3开服天数 4龙魂连击等级 玩家等级 转职 local var_type = v[5] or v.var_type; --变量类型 nil 存盘 0日变量 1 缓存小退清零 local check_str = v[6] or v.checkStr; -- == > < >= <= local def_str = v[7] or v.desc --检查失败后的默认消息提示 不传没有 -- info(v,itemName) if not item_type or item_type == 1 then local itemID = ConfigDataManager.getTableValue("cfg_item", "id", "name", itemName) local hasCount = getbagitemcountbyid(actor, itemID) if hasCount < itemNum then if desc then if desc ~= "" then APISendCenterMsg(actor, desc) end else APISendCenterMsg(actor, itemName .. "不足") end return false end --2 Int变量 elseif item_type == 2 then local have_count = APIGetInt(actor, itemName, var_type) -- info(v,itemName,have_count) def_str = def_str or "变量不足!" if APICheck(check_str, have_count, itemNum) == false then if def_str and desc ~= "" then APISendCenterMsg(actor, def_str) end return false end --3 开服天数 elseif item_type == 3 then local have_count = tonumber(getserveropendays(actor)) -- info("开服天数",have_count) if APICheck(check_str, have_count, itemNum) == false then if def_str then APISendCenterMsg(actor, def_str) end return false end elseif item_type == 4 then -- local comboSkill = getrolefield(actor,"role.roleskill.comboskill") -- local have_count = comboSkill.skillLv local have_count = APIGetInt(actor, "ZC_NewDragonSoulComboLevel") if not APICheck(check_str, have_count, itemNum) then if desc then if desc ~= "" then APISendCenterMsg(actor, desc) end else APISendCenterMsg(actor, "龙魂连击等级不足") end return false end elseif item_type == "玩家等级" then local cur_level = tonumber(getbaseinfo(actor, "level")) or 0 if APICheck(check_str, cur_level, itemNum) == false then if desc then if desc ~= "" then APISendCenterMsg(actor, desc) end else APISendCenterMsg(actor, "等级不足,需要" .. itemNum .. "级") end return false end elseif item_type == "转职" then local data = APIGetTable(actor, "ZC_ZhuanZhiVar") or {} local count = data.count or 0; if APICheck(check_str, count, itemNum) == false then if desc then if desc ~= "" then APISendCenterMsg(actor, desc) end else APISendCenterMsg(actor, "请" .. itemNum .. "转后再来吧") end return false end end end end -- info("来了122133","成功了澳") return true end function APItakeItem(actor, tcl, desc) if not next(tcl) then return false end if APICheckItem(actor, tcl) == false then return false end for k, v in pairs(tcl) do if type(k) ~= "string" then local itemName = v[1] local itemNum = tonumber(v[2]) local bangding = v[3]; local item_type = v[4] or v.mold; --检查 1或者nil道具 2 Int变量 local var_type = v[5]; if not item_type or item_type == 1 then local itemID = ConfigDataManager.getTableValue("cfg_item", "id", "name", itemName) removeitemfrombag(actor, itemID, itemNum, 9999, desc) --2 Int变量 elseif item_type == 2 then local var = APIGetInt(actor, itemName, var_type) var = var - itemNum APISetInt(actor, itemName, var, var_type) end end end return true end --增加连击加成 function LianJi.addLianJiRate(actor, count) local add_count = APIGetInt(actor, LianJiRateItemVar) local conf = this.TotalConfig.addLianJi if add_count >= conf.max_count then APISendCenterMsg(actor, conf.itemName .. "使用已达上限") return end count = math.min(count, conf.max_count - add_count) if not APItakeItem(actor, { { conf.itemName, count } }, "连击") then return end APISetInt(actor, LianJiRateItemVar, add_count + count) LianJi.RefreshAttr(actor) APISendCenterMsg(actor, conf.itemName .. "使用成功,连击加成增加" .. (count * conf.add_value / 100) .. "%", "#00ff00") sendluamsg(actor, this.msgId, { 3, add_count + count }) end --增加sd护盾 function LianJi.addSDHuDun(actor, count) local add_count = APIGetInt(actor, SDHuDunItemVar) local conf = this.TotalConfig.addSD if add_count >= conf.max_count then APISendCenterMsg(actor, conf.itemName .. "使用已达上限") return end count = math.min(count, conf.max_count - add_count) if not APItakeItem(actor, { { conf.itemName, count } }, "连击") then return end APISetInt(actor, SDHuDunItemVar, add_count + count) LianJi.RefreshAttr(actor) APISendCenterMsg(actor, conf.itemName .. "使用成功,SD护盾值增加" .. count * conf.add_value, "#00ff00") sendluamsg(actor, this.msgId, { 4, add_count + count }) end --玩家登录 login调用 function LianJi.onLoginEnd(actor) -- LianJi.RefreshAttr(actor) LianJi.DataNotify(actor) APISetInt(actor, "ZC_LainJiRelease", 0) end --交互 handlerequest调用 function LianJi.onHandlereQuest(actor, msgid, sMsg) --登录奖励领取 if msgid == this.msgId then if sMsg[1] == 0 then --数据请求 LianJi.DataNotify(actor) elseif sMsg[1] == 1 then --连击技能替换 LianJi.LianJiChange(actor, sMsg[2], sMsg[3], sMsg[4]) elseif sMsg[1] == 2 then --自动连击状态变化 LianJi.AutoLianJiChange(actor, sMsg[2]) elseif sMsg[1] == 3 then --增加连击加成 LianJi.addLianJiRate(actor, sMsg[2]) elseif sMsg[1] == 4 then --增加sd护盾 LianJi.addSDHuDun(actor, sMsg[2]) elseif sMsg[1] == 5 then --方案替换 LianJi.FangAnChange(actor, sMsg[2]) end return true end end --重载配置 reloadscript调用 function LianJi.onReloadScript(actor) if LianJi.checkOpen(actor) then sendluamsg(actor, this.msgId, { -1, this.TotalConfig }) end end function LianJi.Unlock(actor) APISetInt(actor, OpenVar, 1) APISendCenterMsg(actor, "恭喜解锁连击功能", "#00ff00") local comboSkill = getrolefield(actor, "role.roleskill.comboskill") local skillLv = comboSkill.skillLv local skillCfgId = comboSkill.skillCfgId if skillCfgId == 0 then local comboSkillInfo = ConfigDataManager.getTableValue("cfg_global", "value", "id", 1501) local baseCareer = getbaseinfo(actor, "getbasecareer") local comboSkillTable = string.split(comboSkillInfo, "|") for index, careerComboSkill in pairs(comboSkillTable) do local careerComboSkillInfo = string.split(careerComboSkill, "#") if tonumber(careerComboSkillInfo[1]) == tonumber(baseCareer) then skillCfgId = tonumber(careerComboSkillInfo[2]) end end addcomboskill(actor, skillCfgId, 1) end LianJi.InitLianJi(actor) LianJi.DataNotify(actor) end --gm解锁连击 function LianJi.OnGmUnlockLianji(actor, career_name) LianJi.Unlock(actor) end --道具使用后触发 useitemtrigger 调用 function LianJi.onUseItem(actor, itemConfigId, count) local item_name = ConfigDataManager.getTableValue("cfg_item", "name", "id", itemConfigId) -- if this.TotalConfig.unlockItemName ~= item_name then -- return -- end if itemConfigId ~= 30030105 then return end LianJi.Unlock(actor) end function LianJi.isLainJiSkill(strSkillid, data) for index, value in ipairs(data) do if value == strSkillid then return true end end return false end function LianJi.releaseskill(actor, skillid, skilllevel, targetlist) if not LianJi.checkOpen(actor) then return 0 end local strSkillId = tostring(skillid) local nowsec = getbaseinfo(actor, "nowsec") local lianjiTime = APIGetInt(actor, "ZC_LainJiTime", 1) APISetInt(actor, "ZC_LainJiTime", nowsec, 1) local lianJiSkillIndex = this.TotalConfig.list2[1][skillid] or 0 local lianjiDatas = APIGetTable(actor, "ZC_LianJiSkills", 1) or {} if nowsec - lianjiTime > 15 or lianJiSkillIndex == 0 or lianJiSkillIndex == 1 or lianjiDatas[1] == nil then -- 连击中断 local skills = {} if lianJiSkillIndex == 1 then skills[lianJiSkillIndex] = 1 end APISetTable(actor, "ZC_LianJiSkills", skills, 1) return end local isRepeatReleases = lianjiDatas[lianJiSkillIndex] ~= nil; if isRepeatReleases then local skills = {} skills[strSkillId] = 1 APISetTable(actor, "ZC_LianJiSkills", skills, 1) return end lianjiDatas[lianJiSkillIndex] = 1 if table.count(lianjiDatas) <= 2 then APISetTable(actor, "ZC_LianJiSkills", lianjiDatas, 1) return end if targetlist[1] == nil then return end APISetTable(actor, "ZC_LianJiSkills", {}, 1) APISetInt(actor, "ZC_LainJiRelease", 1) -- local targetId = targetlist[1].toString(); -- skill(actor, skillid, skilllevel, targetId) end -- function setcombovaluebefore(actor, skillCfgId, skillLevel, skill) -- return 0 -- end function setcombovaluebefore(actor, skillCfgId, skillLevel, skill) local isRelease = APIGetInt(actor, "ZC_LainJiRelease") or 0 -- info("setcombovaluebefore") if isRelease == 1 then APISetInt(actor, "ZC_LainJiRelease", 0) return 100000 end return 0 end -- function setcombovaluebefore(actor, skillCfgId, skillLevel, skill) -- -- info("没走吗??") -- if not LianJi.checkOpen(actor) then -- return 0 -- end -- local skill_name = ConfigDataManager.getTableValue("cfg_skill", "name", "id", skill); -- -- APISendCenterMsg(actor,"释放技能"..skill_name,nil,true) -- local data = LianJi.getdata(actor); -- local now = getbaseinfo("nowsec"); -- local jieduan = (data.jieduan and data.jieduan or 0) + 1 -- data.first_skill_time = data.first_skill_time or 0 -- if now > data.first_skill_time + this.TotalConfig.time then -- jieduan = 0; -- end -- if tonumber(data[1]) == skill then -- jieduan = 1; -- sendluamsg(actor, this.msgId, { 5 }) -- end -- -- info("释放技能", data[jieduan] and data[jieduan] == skillid,skillid,data[jieduan],type(skillid),type(data[jieduan])) -- if data[jieduan] and tonumber(data[jieduan]) == skill then -- data.jieduan = jieduan; -- data.first_skill_time = now -- APISetTable(actor, DBVar, data) -- -- else -- -- data.jieduan = 1 -- end -- if jieduan == #data then -- -- APISendCenterMsg(actor,"连击技能释放成功"..skillCfgId,nil,true) -- return 10000 -- end -- return 0 -- end