--- --- Created by zhouzhipeng. --- DateTime: 2024/8/21 下午1:45 --- EquipMaster = {} local this = {} EquipMasterType = { -- cfg_equip_master表type字段 STRENGTHEN_LV = 1, -- 强化等级 APPEND_LV = 2, -- 追加等级 -- cfg_equip_master表count字段 TOTAL_LEVEL = 0, -- 0:计算部位总和等级 POS_LEVEL = 1, --1:计算每个部位等级 } EquipMasterConst = { STRENGTH_MASTER = "strengthMaster", -- 强化大师 APPEND_MASTER = "appendMaster", -- 追加大师 } --- 装备锻造大师变量 EquipMasterVariable = { EQUIP_MASTER_CACHE = "G$strength_master_cache", -- 装备大师缓存 STRENGTH_MASTER_ATTR = "strengthMasterAttr", -- 强化大师属性 APPEND_MASTER_ATTR = "appendMasterAttr", -- 追加大师属性 EQUIP_MASTER_DATA = "T$大师数据", } -- 脱穿需要重新计算强化和追加 转移 也需要 -- 强化与追加 分别触发强化大师与追加大师 -- 脱穿触发锻造大师 function EquipMaster.triggerEquipMaster(actor) EquipMaster.strengthMaster(actor) EquipMaster.appendMaster(actor) end -- 装备转移触发锻造大师 function EquipMaster.transferTrigger(actor, equip1, equip2, ts, ta) local equipindex1 = equip1.equipindex local equipindex2 = equip2.equipindex if tonumber(equipindex1) == 0 or tonumber(equipindex2) == 0 then return end if ts and ta then -- 转移强化触发强化大师 EquipMaster.strengthMaster(actor) -- 转移追加触发追加大师 EquipMaster.appendMaster(actor) elseif ts then -- 转移强化触发强化大师 EquipMaster.strengthMaster(actor) elseif ta then -- 转移追加触发追加大师 EquipMaster.appendMaster(actor) end end --- 触发强化触发大师 function EquipMaster.strengthMaster(actor) EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "触发强化大师开始") local equips = getputonequipinfo(actor) if next(equips) == nil then return end --EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "穿戴的装备数据", equips) local itemExtData = EquipAndAppear.getLuaItemExtData(actor) if next(itemExtData) == nil then --EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "没有强化追加数据") return end local strengthData = {} for _, equip in pairs(equips) do local id = equip.id local equipData = itemExtData[id] if equipData ~= nil then local strengthlv = equipData.strengthlv local pos = gameequip.pos(equip.equipindex) strengthData[pos] = strengthlv end end if next(strengthData) == nil then EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "没有强化数据", {}) return end EquipMaster.print("strengthMaster actor:" .. actor:toString() .. ", 强化table数据\n", strengthData) local masterCache = getsysvar(actor, EquipMasterVariable.EQUIP_MASTER_CACHE) local strengthCache = masterCache[EquipMasterType.STRENGTHEN_LV] --EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "强化大师缓存数据", strengthCache) if next(strengthCache) == nil then error("strengthMaster actor:" .. actor:toString() .. "强化大师缓存为空") EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "强化大师缓存为空") return end local configs = {} for group, cfgs in pairs(strengthCache) do -- group 遍历 local isSuccess = false for _, cfg in ipairs(cfgs) do local lv = tonumber(cfg.lv) local str = cfg.strpartid local posTab = string.split(str, "#") local count = tonumber(cfg.count) if count == EquipMasterType.TOTAL_LEVEL then -- 0:计算部位总和等级 local total = 0 for _, pos in pairs(posTab) do local strengthLv = strengthData[tonumber(pos)] if strengthLv ~= nil then total = total + strengthLv end end -- EquipMaster.print("strengthMaster actor:" .. actor:toString() .. ", total:" .. tostring(total) .. ", lv:" .. tostring(lv)) if total < lv then break end configs[group] = cfg --EquipMaster.print("strengthMaster actor:" .. actor:toString() .. " count == 0 满足的配置添加 group:\n" .. tostring(group), cfg) elseif count == EquipMasterType.POS_LEVEL then -- 1:计算每个部位等级 for _, pos in pairs(posTab) do local strengthLv = strengthData[tonumber(pos)] if strengthLv == nil or strengthLv < lv then isSuccess = true break end end if isSuccess then break end configs[group] = cfg --EquipMaster.print("strengthMaster actor:" .. actor:toString() .. " count == 1 满足的配置添加 group:" .. tostring(group), cfg) else error("strengthMaster actor:" .. actor:toString() .. "暂时不支持改类型计算:" .. tostring(count)) EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "暂时不支持改类型计算:" .. tostring(count), {}) end end end local equipMasterData = getplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA) or {} if next(configs) == nil then -- 清空属性 addrolekmlattributes(actor, EquipMasterVariable.STRENGTH_MASTER_ATTR, {}) equipMasterData[EquipMasterConst.STRENGTH_MASTER] = {} -- 移除添加的数据 setplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA, equipMasterData) EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "没有符合的强化大师配置:") return end EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "符合的强化大师配置:\n", configs) local attr_map = {} local cfgIds = {} local saveTable = {} --[[ for group, cfg in pairs(configs) do table.insert(cfgIds, cfg.id) local attStr = cfg.att local attJinHao = string.split(attStr, "|") for _, value in pairs(attJinHao) do local att = string.split(value, "#") local attr_id = att[1] local attr_value = att[2] local value = attr_map[attr_id] if value ~= nil and tonumber(value) > 0 then value = value + attr_value else value = attr_value end attr_map[attr_id] = value end end ]] for group, cfg in pairs(configs) do table.insert(cfgIds, cfg.id) local attStr = cfg.att2 local att = string.split(attStr, "#") local type = tonumber(att[1]) local allAttr = this.getPropertiesByType(actor, type) if table.count(allAttr) > 0 then this.calculateMasterAttr(attr_map, allAttr, tonumber(att[2])) end end saveTable["cfgIds"] = cfgIds saveTable["attr"] = attr_map addrolekmlattributes(actor, EquipMasterVariable.STRENGTH_MASTER_ATTR, attr_map) EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "触发强化大师结束,添加的属性如下:\n", attr_map) equipMasterData[EquipMasterConst.STRENGTH_MASTER] = saveTable -- 记录添加的数据 setplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA, equipMasterData) end --- 触发追加大师 function EquipMaster.appendMaster(actor) EquipMaster.print("appendMaster actor:" .. actor:toString() .. "触发追加大师开始") local equips = getputonequipinfo(actor) if next(equips) == nil then return end --EquipMaster.print("appendMaster actor:" .. actor:toString() .. "穿戴的装备数据", equips) local itemExtData = EquipAndAppear.getLuaItemExtData(actor) if next(itemExtData) == nil then EquipMaster.print("appendMaster actor:" .. actor:toString() .. "没有强化追加数据") return end --EquipMaster.print("appendMaster actor:" .. actor:toString() .. "强化追加lua存的数据数据\n", itemExtData) local appendData = {} for _, equip in pairs(equips) do local id = equip.id local equipData = itemExtData[id] if equipData ~= nil then local appendlv = equipData.appendlv local pos = gameequip.pos(equip.equipindex) appendData[pos] = appendlv end end if next(appendData) == nil then return end EquipMaster.print("appendMaster actor:" .. actor:toString() .. "追加数据:\n", appendData) local masterCache = getsysvar(actor, EquipMasterVariable.EQUIP_MASTER_CACHE) local appendCache = masterCache[EquipMasterType.APPEND_LV] --EquipMaster.print("appendMaster actor:" .. actor:toString() .. "追加缓存数据", appendCache) if next(appendCache) == nil then error("appendMaster actor:" .. actor:toString() .. "追加大师缓存为空") EquipMaster.print("appendMaster actor:" .. actor:toString() .. "追加大师缓存为空") return end local configs = {} for group, cfgs in pairs(appendCache) do -- group 遍历 local isSuccess = false for _, cfg in ipairs(cfgs) do local lv = tonumber(cfg.lv) local str = cfg.strpartid local posTab = string.split(str, "#") local count = tonumber(cfg.count) if count == EquipMasterType.TOTAL_LEVEL then -- 0:计算部位总和等级 local total = 0 for _, pos in pairs(posTab) do local appendLv = appendData[tonumber(pos)] if appendLv ~= nil then total = total + appendLv end end --EquipMaster.print("appendMaster actor:" .. actor:toString() .. ", total:" .. tostring(total) .. ", lv:" .. tostring(lv)) if total < lv then break end configs[group] = cfg --EquipMaster.print("appendMaster actor:" .. " count == 0 满足的配置添加 group:" .. tostring(group), cfg) elseif count == EquipMasterType.POS_LEVEL then -- 1:计算每个部位等级 for _, pos in pairs(posTab) do local appendLv = appendData[tonumber(pos)] if appendLv == nil or appendLv < lv then isSuccess = true break end end if isSuccess then break end configs[group] = cfg --EquipMaster.print("appendMaster actor:" .. " count == 1 满足的配置添加 group:" .. tostring(group), cfg) else error("appendMaster actor:" .. actor:toString() .. "暂时不支持改类型计算:" .. tostring(count)) EquipMaster.print("appendMaster actor:" .. actor:toString() .. " 暂时不支持改类型计算:" .. tostring(count)) end end end local equipMasterData = getplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA) or {} if next(configs) == nil then -- 清空属性 addrolekmlattributes(actor, EquipMasterVariable.APPEND_MASTER_ATTR, {}) equipMasterData[EquipMasterConst.APPEND_MASTER] = {} -- 移除添加的数据 setplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA, equipMasterData) EquipMaster.print("appendMaster actor:" .. actor:toString() .. " 没有符合的追加大师配置") return end EquipMaster.printDetails(configs, "") local attr_map = {} local cfgIds = {} local saveTable = {} --[[ for group, cfg in pairs(configs) do table.insert(cfgIds, cfg.id) local attStr = cfg.att local attJinHao = string.split(attStr, "|") for _, value in pairs(attJinHao) do local att = string.split(value, "#") local attr_id = att[1] local attr_value = att[2] local value = attr_map[attr_id] if value ~= nil and tonumber(value) > 0 then value = value + attr_value else value = attr_value end attr_map[attr_id] = value end end ]] for group, cfg in pairs(configs) do table.insert(cfgIds, cfg.id) local attStr = cfg.att2 local att = string.split(attStr, "#") local type = tonumber(att[1]) local allAttr = this.getPropertiesByType(actor, type) if table.count(allAttr) > 0 then this.calculateMasterAttr(attr_map, allAttr, tonumber(att[2])) end end saveTable["cfgIds"] = cfgIds saveTable["attr"] = attr_map addrolekmlattributes(actor, EquipMasterVariable.APPEND_MASTER_ATTR, attr_map) EquipMaster.print("appendMaster actor:" .. actor:toString() .. " 触发追加大师 结束添加的属性如下:\n", attr_map) equipMasterData[EquipMasterConst.APPEND_MASTER] = saveTable -- 记录添加的数据 setplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA, equipMasterData) end --- 缓存装备锻造大师数据 function EquipMaster.cacheEquipMasterData() -- 强化 local strength = EquipMasterType.STRENGTHEN_LV local append = EquipMasterType.APPEND_LV local strengthTable = this.getMasterData(strength) -- 追加 local appendTable = this.getMasterData(append) local cacheTable = {} cacheTable[strength] = strengthTable cacheTable[append] = appendTable setsysvar(EquipMasterVariable.EQUIP_MASTER_CACHE, cacheTable) info("cacheEquipMasterData 启动缓存装备锻造大师数据成功") EquipMaster.print("cacheEquipMasterData 缓存装备锻造大师数据:\n", cacheTable) return cacheTable end --- 获取装备锻造大师数据 function this.getMasterData (type) local masterList = ConfigDataManager.getTable("cfg_equip_master", "type", type) if masterList == nil then error("getMasterData cfg_equip_master锻造大师配置为空 type:" .. type) EquipMaster.print("getMasterData cfg_equip_master锻造大师配置为空 type:" .. type) return end local masterTable = {} for _, cfg in pairs(masterList) do local group = cfg.group local cfgs = masterTable[group] or {} table.insert(cfgs, cfg) masterTable[group] = cfgs end for _, cfgs in pairs(masterTable) do table.sort(cfgs, this.sortByLevel) end return masterTable end --- 计算大师加成属性 function this.calculateMasterAttr(attr_map, allAttr, number) local addition = number / 10000 for attrId, value in pairs(allAttr) do local newValue = math.ceil(value * addition) attr_map[attrId] = newValue end end --- 根据类型获取穿戴的全部强化或追加属性 function this.getPropertiesByType(actor, type) local alldata = getplaydef(actor, "T$luaitemextdata") local equiplist = getputonequipinfo(actor) local allattr = {} for _, equipinfo in pairs(equiplist) do local itemId = equipinfo.id local data = alldata[itemId] if data ~= nil then if type == 1 then --将该装备的属性加到角色身上 if data.strengthlv ~= nil then local strengthattr = data.strengthattr table.mergeAdd(allattr, strengthattr) end elseif type == 2 then if data.appendlv ~= nil then local appendattr = data.appendattr table.mergeAdd(allattr, appendattr) end end end end return allattr end --- 根据lv字段排序 自定义排序函数,根据lv字段排序 function this.sortByLevel(a, b) return tonumber(a.lv) < tonumber(b.lv)-- 升序排序 -- 如果需要降序排序,则返回 a.lv > b.lv end --- 打印数据 function EquipMaster.printDetails(t, indent) if type(t) ~= 'table' then jprint(indent .. tostring(t)) return end jprint(indent .. '{') indent = indent .. ' ' for k, v in pairs(t) do if type(v) == 'table' then jprint(indent .. '[' .. tostring(k) .. '] =') EquipMaster.printDetails(v, indent) else jprint(indent .. '[' .. tostring(k) .. '] = ' .. tostring(v)) end end jprint(indent:sub(1, string.len(indent) - 2) .. '}') end --- 打印日志 function EquipMaster.print(...) local isPrintLog = true if isPrintLog then return end jprint(...) local args = { ... } -- local var = table.cancat(args, ',') --local msg = string.format(...) --local count = select('#', ...) -- 获取参数的数量 --local first_arg = select(1, ...) -- 获取第一个参数 --if next(table) == nil then -- return --end --EquipMaster.printDetails(table, "") end -----------------------------------------------------------测试方法------------------------------------------------------------- --- 测试方法 function equipmastertest(actor) jprint("equipmastertest actor:" .. actor:toString() .. "equipmastertest开始") --EquipMaster.cacheEquipMasterData() -- 打印缓存 --EquipMaster.printDetails(getsysvar("G$strength_master_cache"), "") EquipMaster.strengthMaster(actor) EquipMaster.appendMaster(actor) --local masterCache = getsysvar(EquipMasterVariable.EQUIP_MASTER_CACHE) --local strengthCache = masterCache[1] --EquipMaster.printDetails(strengthCache, "") --jprint("equipmastertest actor:" .. actor:toString() .. "lua 存的强化数据") --local itemExtData = EquipAndAppear.getLuaItemExtData(actor) --EquipMaster.printDetails(itemExtData, "") --jprint("equipmastertest actor:" .. actor:toString() .. "已穿戴的装备数据") --local equips = getputonequipinfo(actor) --EquipMaster.printDetails(equips, "") local idx = 65538 local aa = gameequip.wearBar(idx) local bb = gameequip.pos(idx) jprint("equipmastertest actor:" .. actor:toString() .. "equipmastertest结束 aa:" .. tostring(aa) .. " bb:" .. tostring(bb)) end --- 测试方法 function cacheequipmasterdatatest(actor) jprint("cacheequipmasterdatatest actor:" .. actor:toString() .. "测试事件重新缓存") local cacheTable = EquipMaster.cacheEquipMasterData() EquipMaster.print("cacheequipmasterdatatest actor:", actor, "测试事件重新缓存数据:\n", cacheTable) -- EquipMaster.printDetails(strengthTable, "") jprint("cacheequipmasterdatatest actor:" .. actor:toString() .. "测试事件重新缓存成功") end