EquipMaster.lua 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. ---
  2. --- Created by zhouzhipeng.
  3. --- DateTime: 2024/8/21 下午1:45
  4. ---
  5. EquipMaster = {}
  6. local this = {}
  7. EquipMasterType = {
  8. -- cfg_equip_master表type字段
  9. STRENGTHEN_LV = 1, -- 强化等级
  10. APPEND_LV = 2, -- 追加等级
  11. -- cfg_equip_master表count字段
  12. TOTAL_LEVEL = 0, -- 0:计算部位总和等级
  13. POS_LEVEL = 1, --1:计算每个部位等级
  14. }
  15. EquipMasterConst = {
  16. STRENGTH_MASTER = "strengthMaster", -- 强化大师
  17. APPEND_MASTER = "appendMaster", -- 追加大师
  18. }
  19. --- 装备锻造大师变量
  20. EquipMasterVariable = {
  21. EQUIP_MASTER_CACHE = "G$strength_master_cache", -- 装备大师缓存
  22. STRENGTH_MASTER_ATTR = "strengthMasterAttr", -- 强化大师属性
  23. APPEND_MASTER_ATTR = "appendMasterAttr", -- 追加大师属性
  24. EQUIP_MASTER_DATA = "T$大师数据",
  25. }
  26. -- 脱穿需要重新计算强化和追加 转移 也需要
  27. -- 强化与追加 分别触发强化大师与追加大师
  28. -- 脱穿触发锻造大师
  29. function EquipMaster.triggerEquipMaster(actor)
  30. EquipMaster.strengthMaster(actor)
  31. EquipMaster.appendMaster(actor)
  32. end
  33. -- 装备转移触发锻造大师
  34. function EquipMaster.transferTrigger(actor, equip1, equip2, ts, ta)
  35. local equipindex1 = equip1.equipindex
  36. local equipindex2 = equip2.equipindex
  37. if tonumber(equipindex1) == 0 or tonumber(equipindex2) == 0 then
  38. return
  39. end
  40. if ts and ta then
  41. -- 转移强化触发强化大师
  42. EquipMaster.strengthMaster(actor)
  43. -- 转移追加触发追加大师
  44. EquipMaster.appendMaster(actor)
  45. elseif ts then
  46. -- 转移强化触发强化大师
  47. EquipMaster.strengthMaster(actor)
  48. elseif ta then
  49. -- 转移追加触发追加大师
  50. EquipMaster.appendMaster(actor)
  51. end
  52. end
  53. --- 触发强化触发大师
  54. function EquipMaster.strengthMaster(actor)
  55. EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "触发强化大师开始")
  56. local equips = getputonequipinfo(actor)
  57. if next(equips) == nil then
  58. return
  59. end
  60. --EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "穿戴的装备数据", equips)
  61. local itemExtData = EquipAndAppear.getLuaItemExtData(actor)
  62. if next(itemExtData) == nil then
  63. --EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "没有强化追加数据")
  64. return
  65. end
  66. local strengthData = {}
  67. for _, equip in pairs(equips) do
  68. local id = equip.id
  69. local equipData = itemExtData[id]
  70. if equipData ~= nil then
  71. local strengthlv = equipData.strengthlv
  72. local pos = gameequip.pos(equip.equipindex)
  73. strengthData[pos] = strengthlv
  74. end
  75. end
  76. if next(strengthData) == nil then
  77. EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "没有强化数据", {})
  78. return
  79. end
  80. EquipMaster.print("strengthMaster actor:" .. actor:toString() .. ", 强化table数据\n", strengthData)
  81. local masterCache = getsysvar(actor, EquipMasterVariable.EQUIP_MASTER_CACHE)
  82. local strengthCache = masterCache[EquipMasterType.STRENGTHEN_LV]
  83. --EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "强化大师缓存数据", strengthCache)
  84. if next(strengthCache) == nil then
  85. error("strengthMaster actor:" .. actor:toString() .. "强化大师缓存为空")
  86. EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "强化大师缓存为空")
  87. return
  88. end
  89. local configs = {}
  90. for group, cfgs in pairs(strengthCache) do
  91. -- group 遍历
  92. local isSuccess = false
  93. for _, cfg in ipairs(cfgs) do
  94. local lv = tonumber(cfg.lv)
  95. local str = cfg.strpartid
  96. local posTab = string.split(str, "#")
  97. local count = tonumber(cfg.count)
  98. if count == EquipMasterType.TOTAL_LEVEL then
  99. -- 0:计算部位总和等级
  100. local total = 0
  101. for _, pos in pairs(posTab) do
  102. local strengthLv = strengthData[tonumber(pos)]
  103. if strengthLv ~= nil then
  104. total = total + strengthLv
  105. end
  106. end
  107. -- EquipMaster.print("strengthMaster actor:" .. actor:toString() .. ", total:" .. tostring(total) .. ", lv:" .. tostring(lv))
  108. if total < lv then
  109. break
  110. end
  111. configs[group] = cfg
  112. --EquipMaster.print("strengthMaster actor:" .. actor:toString() .. " count == 0 满足的配置添加 group:\n" .. tostring(group), cfg)
  113. elseif count == EquipMasterType.POS_LEVEL then
  114. -- 1:计算每个部位等级
  115. for _, pos in pairs(posTab) do
  116. local strengthLv = strengthData[tonumber(pos)]
  117. if strengthLv == nil or strengthLv < lv then
  118. isSuccess = true
  119. break
  120. end
  121. end
  122. if isSuccess then
  123. break
  124. end
  125. configs[group] = cfg
  126. --EquipMaster.print("strengthMaster actor:" .. actor:toString() .. " count == 1 满足的配置添加 group:" .. tostring(group), cfg)
  127. else
  128. error("strengthMaster actor:" .. actor:toString() .. "暂时不支持改类型计算:" .. tostring(count))
  129. EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "暂时不支持改类型计算:" .. tostring(count), {})
  130. end
  131. end
  132. end
  133. local equipMasterData = getplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA) or {}
  134. if next(configs) == nil then
  135. -- 清空属性
  136. addrolekmlattributes(actor, EquipMasterVariable.STRENGTH_MASTER_ATTR, {})
  137. equipMasterData[EquipMasterConst.STRENGTH_MASTER] = {}
  138. -- 移除添加的数据
  139. setplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA, equipMasterData)
  140. EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "没有符合的强化大师配置:")
  141. return
  142. end
  143. EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "符合的强化大师配置:\n", configs)
  144. local attr_map = {}
  145. local cfgIds = {}
  146. local saveTable = {}
  147. --[[
  148. for group, cfg in pairs(configs) do
  149. table.insert(cfgIds, cfg.id)
  150. local attStr = cfg.att
  151. local attJinHao = string.split(attStr, "|")
  152. for _, value in pairs(attJinHao) do
  153. local att = string.split(value, "#")
  154. local attr_id = att[1]
  155. local attr_value = att[2]
  156. local value = attr_map[attr_id]
  157. if value ~= nil and tonumber(value) > 0 then
  158. value = value + attr_value
  159. else
  160. value = attr_value
  161. end
  162. attr_map[attr_id] = value
  163. end
  164. end
  165. ]]
  166. for group, cfg in pairs(configs) do
  167. table.insert(cfgIds, cfg.id)
  168. local attStr = cfg.att2
  169. local att = string.split(attStr, "#")
  170. local type = tonumber(att[1])
  171. local allAttr = this.getPropertiesByType(actor, type)
  172. if table.count(allAttr) > 0 then
  173. this.calculateMasterAttr(attr_map, allAttr, tonumber(att[2]))
  174. end
  175. end
  176. saveTable["cfgIds"] = cfgIds
  177. saveTable["attr"] = attr_map
  178. addrolekmlattributes(actor, EquipMasterVariable.STRENGTH_MASTER_ATTR, attr_map)
  179. EquipMaster.print("strengthMaster actor:" .. actor:toString() .. "触发强化大师结束,添加的属性如下:\n", attr_map)
  180. equipMasterData[EquipMasterConst.STRENGTH_MASTER] = saveTable
  181. -- 记录添加的数据
  182. setplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA, equipMasterData)
  183. end
  184. --- 触发追加大师
  185. function EquipMaster.appendMaster(actor)
  186. EquipMaster.print("appendMaster actor:" .. actor:toString() .. "触发追加大师开始")
  187. local equips = getputonequipinfo(actor)
  188. if next(equips) == nil then
  189. return
  190. end
  191. --EquipMaster.print("appendMaster actor:" .. actor:toString() .. "穿戴的装备数据", equips)
  192. local itemExtData = EquipAndAppear.getLuaItemExtData(actor)
  193. if next(itemExtData) == nil then
  194. EquipMaster.print("appendMaster actor:" .. actor:toString() .. "没有强化追加数据")
  195. return
  196. end
  197. --EquipMaster.print("appendMaster actor:" .. actor:toString() .. "强化追加lua存的数据数据\n", itemExtData)
  198. local appendData = {}
  199. for _, equip in pairs(equips) do
  200. local id = equip.id
  201. local equipData = itemExtData[id]
  202. if equipData ~= nil then
  203. local appendlv = equipData.appendlv
  204. local pos = gameequip.pos(equip.equipindex)
  205. appendData[pos] = appendlv
  206. end
  207. end
  208. if next(appendData) == nil then
  209. return
  210. end
  211. EquipMaster.print("appendMaster actor:" .. actor:toString() .. "追加数据:\n", appendData)
  212. local masterCache = getsysvar(actor, EquipMasterVariable.EQUIP_MASTER_CACHE)
  213. local appendCache = masterCache[EquipMasterType.APPEND_LV]
  214. --EquipMaster.print("appendMaster actor:" .. actor:toString() .. "追加缓存数据", appendCache)
  215. if next(appendCache) == nil then
  216. error("appendMaster actor:" .. actor:toString() .. "追加大师缓存为空")
  217. EquipMaster.print("appendMaster actor:" .. actor:toString() .. "追加大师缓存为空")
  218. return
  219. end
  220. local configs = {}
  221. for group, cfgs in pairs(appendCache) do
  222. -- group 遍历
  223. local isSuccess = false
  224. for _, cfg in ipairs(cfgs) do
  225. local lv = tonumber(cfg.lv)
  226. local str = cfg.strpartid
  227. local posTab = string.split(str, "#")
  228. local count = tonumber(cfg.count)
  229. if count == EquipMasterType.TOTAL_LEVEL then
  230. -- 0:计算部位总和等级
  231. local total = 0
  232. for _, pos in pairs(posTab) do
  233. local appendLv = appendData[tonumber(pos)]
  234. if appendLv ~= nil then
  235. total = total + appendLv
  236. end
  237. end
  238. --EquipMaster.print("appendMaster actor:" .. actor:toString() .. ", total:" .. tostring(total) .. ", lv:" .. tostring(lv))
  239. if total < lv then
  240. break
  241. end
  242. configs[group] = cfg
  243. --EquipMaster.print("appendMaster actor:" .. " count == 0 满足的配置添加 group:" .. tostring(group), cfg)
  244. elseif count == EquipMasterType.POS_LEVEL then
  245. -- 1:计算每个部位等级
  246. for _, pos in pairs(posTab) do
  247. local appendLv = appendData[tonumber(pos)]
  248. if appendLv == nil or appendLv < lv then
  249. isSuccess = true
  250. break
  251. end
  252. end
  253. if isSuccess then
  254. break
  255. end
  256. configs[group] = cfg
  257. --EquipMaster.print("appendMaster actor:" .. " count == 1 满足的配置添加 group:" .. tostring(group), cfg)
  258. else
  259. error("appendMaster actor:" .. actor:toString() .. "暂时不支持改类型计算:" .. tostring(count))
  260. EquipMaster.print("appendMaster actor:" .. actor:toString() .. " 暂时不支持改类型计算:" .. tostring(count))
  261. end
  262. end
  263. end
  264. local equipMasterData = getplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA) or {}
  265. if next(configs) == nil then
  266. -- 清空属性
  267. addrolekmlattributes(actor, EquipMasterVariable.APPEND_MASTER_ATTR, {})
  268. equipMasterData[EquipMasterConst.APPEND_MASTER] = {}
  269. -- 移除添加的数据
  270. setplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA, equipMasterData)
  271. EquipMaster.print("appendMaster actor:" .. actor:toString() .. " 没有符合的追加大师配置")
  272. return
  273. end
  274. EquipMaster.printDetails(configs, "")
  275. local attr_map = {}
  276. local cfgIds = {}
  277. local saveTable = {}
  278. --[[
  279. for group, cfg in pairs(configs) do
  280. table.insert(cfgIds, cfg.id)
  281. local attStr = cfg.att
  282. local attJinHao = string.split(attStr, "|")
  283. for _, value in pairs(attJinHao) do
  284. local att = string.split(value, "#")
  285. local attr_id = att[1]
  286. local attr_value = att[2]
  287. local value = attr_map[attr_id]
  288. if value ~= nil and tonumber(value) > 0 then
  289. value = value + attr_value
  290. else
  291. value = attr_value
  292. end
  293. attr_map[attr_id] = value
  294. end
  295. end
  296. ]]
  297. for group, cfg in pairs(configs) do
  298. table.insert(cfgIds, cfg.id)
  299. local attStr = cfg.att2
  300. local att = string.split(attStr, "#")
  301. local type = tonumber(att[1])
  302. local allAttr = this.getPropertiesByType(actor, type)
  303. if table.count(allAttr) > 0 then
  304. this.calculateMasterAttr(attr_map, allAttr, tonumber(att[2]))
  305. end
  306. end
  307. saveTable["cfgIds"] = cfgIds
  308. saveTable["attr"] = attr_map
  309. addrolekmlattributes(actor, EquipMasterVariable.APPEND_MASTER_ATTR, attr_map)
  310. EquipMaster.print("appendMaster actor:" .. actor:toString() .. " 触发追加大师 结束添加的属性如下:\n", attr_map)
  311. equipMasterData[EquipMasterConst.APPEND_MASTER] = saveTable
  312. -- 记录添加的数据
  313. setplaydef(actor, EquipMasterVariable.EQUIP_MASTER_DATA, equipMasterData)
  314. end
  315. --- 缓存装备锻造大师数据
  316. function EquipMaster.cacheEquipMasterData()
  317. -- 强化
  318. local strength = EquipMasterType.STRENGTHEN_LV
  319. local append = EquipMasterType.APPEND_LV
  320. local strengthTable = this.getMasterData(strength)
  321. -- 追加
  322. local appendTable = this.getMasterData(append)
  323. local cacheTable = {}
  324. cacheTable[strength] = strengthTable
  325. cacheTable[append] = appendTable
  326. setsysvar(EquipMasterVariable.EQUIP_MASTER_CACHE, cacheTable)
  327. info("cacheEquipMasterData 启动缓存装备锻造大师数据成功")
  328. EquipMaster.print("cacheEquipMasterData 缓存装备锻造大师数据:\n", cacheTable)
  329. return cacheTable
  330. end
  331. --- 获取装备锻造大师数据
  332. function this.getMasterData (type)
  333. local masterList = ConfigDataManager.getTable("cfg_equip_master", "type", type)
  334. if masterList == nil then
  335. error("getMasterData cfg_equip_master锻造大师配置为空 type:" .. type)
  336. EquipMaster.print("getMasterData cfg_equip_master锻造大师配置为空 type:" .. type)
  337. return
  338. end
  339. local masterTable = {}
  340. for _, cfg in pairs(masterList) do
  341. local group = cfg.group
  342. local cfgs = masterTable[group] or {}
  343. table.insert(cfgs, cfg)
  344. masterTable[group] = cfgs
  345. end
  346. for _, cfgs in pairs(masterTable) do
  347. table.sort(cfgs, this.sortByLevel)
  348. end
  349. return masterTable
  350. end
  351. --- 计算大师加成属性
  352. function this.calculateMasterAttr(attr_map, allAttr, number)
  353. local addition = number / 10000
  354. for attrId, value in pairs(allAttr) do
  355. local newValue = math.ceil(value * addition)
  356. attr_map[attrId] = newValue
  357. end
  358. end
  359. --- 根据类型获取穿戴的全部强化或追加属性
  360. function this.getPropertiesByType(actor, type)
  361. local alldata = getplaydef(actor, "T$luaitemextdata")
  362. local equiplist = getputonequipinfo(actor)
  363. local allattr = {}
  364. for _, equipinfo in pairs(equiplist) do
  365. local itemId = equipinfo.id
  366. local data = alldata[itemId]
  367. if data ~= nil then
  368. if type == 1 then
  369. --将该装备的属性加到角色身上
  370. if data.strengthlv ~= nil then
  371. local strengthattr = data.strengthattr
  372. table.mergeAdd(allattr, strengthattr)
  373. end
  374. elseif type == 2 then
  375. if data.appendlv ~= nil then
  376. local appendattr = data.appendattr
  377. table.mergeAdd(allattr, appendattr)
  378. end
  379. end
  380. end
  381. end
  382. return allattr
  383. end
  384. --- 根据lv字段排序 自定义排序函数,根据lv字段排序
  385. function this.sortByLevel(a, b)
  386. return tonumber(a.lv) < tonumber(b.lv)-- 升序排序
  387. -- 如果需要降序排序,则返回 a.lv > b.lv
  388. end
  389. --- 打印数据
  390. function EquipMaster.printDetails(t, indent)
  391. if type(t) ~= 'table' then
  392. jprint(indent .. tostring(t))
  393. return
  394. end
  395. jprint(indent .. '{')
  396. indent = indent .. ' '
  397. for k, v in pairs(t) do
  398. if type(v) == 'table' then
  399. jprint(indent .. '[' .. tostring(k) .. '] =')
  400. EquipMaster.printDetails(v, indent)
  401. else
  402. jprint(indent .. '[' .. tostring(k) .. '] = ' .. tostring(v))
  403. end
  404. end
  405. jprint(indent:sub(1, string.len(indent) - 2) .. '}')
  406. end
  407. --- 打印日志
  408. function EquipMaster.print(...)
  409. local isPrintLog = true
  410. if isPrintLog then
  411. return
  412. end
  413. jprint(...)
  414. local args = { ... }
  415. -- local var = table.cancat(args, ',')
  416. --local msg = string.format(...)
  417. --local count = select('#', ...) -- 获取参数的数量
  418. --local first_arg = select(1, ...) -- 获取第一个参数
  419. --if next(table) == nil then
  420. -- return
  421. --end
  422. --EquipMaster.printDetails(table, "")
  423. end
  424. -----------------------------------------------------------测试方法-------------------------------------------------------------
  425. --- 测试方法
  426. function equipmastertest(actor)
  427. jprint("equipmastertest actor:" .. actor:toString() .. "equipmastertest开始")
  428. --EquipMaster.cacheEquipMasterData()
  429. -- 打印缓存
  430. --EquipMaster.printDetails(getsysvar("G$strength_master_cache"), "")
  431. EquipMaster.strengthMaster(actor)
  432. EquipMaster.appendMaster(actor)
  433. --local masterCache = getsysvar(EquipMasterVariable.EQUIP_MASTER_CACHE)
  434. --local strengthCache = masterCache[1]
  435. --EquipMaster.printDetails(strengthCache, "")
  436. --jprint("equipmastertest actor:" .. actor:toString() .. "lua 存的强化数据")
  437. --local itemExtData = EquipAndAppear.getLuaItemExtData(actor)
  438. --EquipMaster.printDetails(itemExtData, "")
  439. --jprint("equipmastertest actor:" .. actor:toString() .. "已穿戴的装备数据")
  440. --local equips = getputonequipinfo(actor)
  441. --EquipMaster.printDetails(equips, "")
  442. local idx = 65538
  443. local aa = gameequip.wearBar(idx)
  444. local bb = gameequip.pos(idx)
  445. jprint("equipmastertest actor:" .. actor:toString() .. "equipmastertest结束 aa:" .. tostring(aa) .. " bb:" .. tostring(bb))
  446. end
  447. --- 测试方法
  448. function cacheequipmasterdatatest(actor)
  449. jprint("cacheequipmasterdatatest actor:" .. actor:toString() .. "测试事件重新缓存")
  450. local cacheTable = EquipMaster.cacheEquipMasterData()
  451. EquipMaster.print("cacheequipmasterdatatest actor:", actor, "测试事件重新缓存数据:\n", cacheTable)
  452. -- EquipMaster.printDetails(strengthTable, "")
  453. jprint("cacheequipmasterdatatest actor:" .. actor:toString() .. "测试事件重新缓存成功")
  454. end