123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489 |
- ---
- --- 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
|