Fruit.lua 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. -- ==============================脚本内全局变量========================================
  2. local scriptConst = {
  3. -- 一级属等级配置
  4. FIRST_LEVEL_ATTR_CONFIG = 1,
  5. -- 一级属性最大值配置id
  6. FIRST_LEVEL_ATTR_MAX_VALUE_CONFIG = 3001,
  7. -- 重置果实配置
  8. RESET_FIRST_LEVEL_ATTR_CONDITION = 3002,
  9. -- 使用成功提示
  10. FRUIT_SUCCESS = 200,
  11. -- 使用失败提示
  12. FRUIT_FAIL = 201
  13. }
  14. ---玩家累计使用果实数量
  15. local USE_FRUIT_COUNT = "T$use_fruit_count"
  16. -- =====================================存储上次的果实使用信息实体===================================
  17. local LastUsageInfo = {}
  18. LastUsageInfo.__index = LastUsageInfo
  19. function LastUsageInfo:new()
  20. local obj = {lastUsageTime = 0, usageCount = 0}
  21. setmetatable(obj, LastUsageInfo)
  22. return obj
  23. end
  24. -- ====================================使用cd检验工具======================================
  25. local ItemCanUseTool = {}
  26. ItemCanUseTool.__index = ItemCanUseTool
  27. function ItemCanUseTool:new(maxUsageCount, cooldownSeconds, useageInfos)
  28. local self =
  29. setmetatable(
  30. {
  31. maxUsageCount = maxUsageCount,
  32. cooldownMilSeconds = cooldownSeconds * 1000,
  33. usageInfos = useageInfos or {}
  34. },
  35. ItemCanUseTool
  36. )
  37. return self
  38. end
  39. function ItemCanUseTool:canUseItem(actor, itemId)
  40. if self.maxUsageCount == -1 or self.cooldownMilSeconds == -1 then
  41. -- 不限制
  42. return true
  43. end
  44. local oneInfo = self.usageInfos[itemId]
  45. if not oneInfo then
  46. return true
  47. end
  48. local lastTime = oneInfo.lastUsageTime
  49. local curTime = getbaseinfo(actor, "now")
  50. local timeSinceLastUse = curTime - lastTime
  51. if timeSinceLastUse >= self.cooldownMilSeconds then
  52. oneInfo.usageCount = 0
  53. return true
  54. end
  55. return oneInfo.usageCount < self.maxUsageCount
  56. end
  57. function ItemCanUseTool:useItem(actor, itemId, count)
  58. local oneInfo = self.usageInfos[itemId] or LastUsageInfo:new()
  59. self.usageInfos[itemId] = oneInfo
  60. local curTime = getbaseinfo(actor, "now")
  61. oneInfo.lastUsageTime = curTime
  62. oneInfo.usageCount = oneInfo.usageCount + count
  63. end
  64. -- ================================================果实逻辑脚本模板==========================================================
  65. FruitScript = {}
  66. FruitScript.__index = FruitScript
  67. function FruitScript:new()
  68. local obj = setmetatable({}, FruitScript)
  69. return obj
  70. end
  71. local fruitScript = FruitScript:new()
  72. function FruitScript.handleUseFruit(actor, cfgId, count)
  73. local useCfgId = cfgId
  74. local useCount = count
  75. local realUseCount, currAttrAddValue = fruitScript:useFruit(actor, useCfgId, useCount)
  76. local recoveryCount = 0
  77. local msg
  78. local fruitAttrId = ConfigDataManager.getTableValue("cfg_fruit", "attribute", "id", cfgId)
  79. local attrTipName = ConfigDataManager.getTableValue("cfg_att_info", "name", "id", fruitAttrId)
  80. if realUseCount == 0 then
  81. recoveryCount = count
  82. msg = false
  83. -- noticeTip.noticeinfo(actor, scriptConst.FRUIT_FAIL)
  84. end
  85. if realUseCount == count then
  86. msg = true
  87. -- if currAttrAddValue > 0 then
  88. -- noticeTip.noticeinfo(actor, scriptConst.FRUIT_SUCCESS, attrTipName, currAttrAddValue)
  89. -- else
  90. -- noticeTip.noticeinfo(actor, scriptConst.FRUIT_FAIL)
  91. -- end
  92. end
  93. if realUseCount ~= count and realUseCount > 0 then
  94. msg = true
  95. recoveryCount = count - realUseCount
  96. -- if currAttrAddValue > 0 then
  97. -- noticeTip.noticeinfo(actor, scriptConst.FRUIT_SUCCESS, attrTipName, currAttrAddValue)
  98. -- else
  99. -- noticeTip.noticeinfo(actor, scriptConst.FRUIT_FAIL)
  100. -- end
  101. end
  102. -- lg("恢复果实数量:", recoveryCount, "回包消息:", msg)
  103. local config = ConfigDataManager.getById("cfg_fruit", cfgId)
  104. if config ~= nil and next(config) ~= nil then
  105. if recoveryCount ~= 0 then
  106. Bag.addItemToBag(actor, cfgId, recoveryCount, 0, 9999, "果实")
  107. else
  108. sendluamsg(actor, LuaMessageIdToClient.USE_FRUIT_RESULT, msg)
  109. end
  110. end
  111. if realUseCount ~= nil and realUseCount > 0 then
  112. --记录使用数量
  113. local oldCount = FruitScript.GetUseFruitCount(actor)
  114. setplaydef(actor, USE_FRUIT_COUNT, oldCount + realUseCount)
  115. ---使用果实任务
  116. TaskHandler.TriggerTaskGoal(actor, TaskTargetType.USE_FRUIT_ITEM)
  117. end
  118. end
  119. ---获取玩家累计使用果实数量
  120. function FruitScript.GetUseFruitCount(actor)
  121. local totalCount = getplaydef(actor, USE_FRUIT_COUNT)
  122. if totalCount == nil then
  123. totalCount = 0
  124. end
  125. return totalCount
  126. end
  127. function FruitScript.toGetAlreadyUsePoints(actor)
  128. fruitScript:getAlreadyUsePoints(actor)
  129. end
  130. function FruitScript.resetFruit(actor, msgData)
  131. if msgData.isOneXi then
  132. fruitScript:resetOneFruitAttr(actor, msgData)
  133. else
  134. fruitScript:resetFruitAttr(actor, msgData)
  135. end
  136. end
  137. function FruitScript.toGetResetCount(actor)
  138. fruitScript:getResetCount(actor)
  139. end
  140. -- ===================================使用果实============================================
  141. function FruitScript:useFruit(actor, cfgId, count)
  142. if count <= 0 then
  143. return 0, 0
  144. end
  145. local config = ConfigDataManager.getById("cfg_fruit", cfgId)
  146. if config == nil or next(config) == nil then
  147. -- lg('果实表中没有找到主键', cfgId)
  148. return 0, 0
  149. end
  150. -- lg(cfgId, count)
  151. local hasCount = getbagitemcountbyid(actor, cfgId)
  152. -- lg('拥有道具' .. cfgId .. '数量' .. hasCount)
  153. -- 这里加上count是因为判断的逻辑在消耗了果实之后,要判断消耗之前的
  154. if hasCount == nil or tonumber(hasCount) + count <= 0 then
  155. -- lg('道具数量不足')
  156. return 0, 0
  157. end
  158. if count > tonumber(hasCount) + count then
  159. -- lg('道具数量不足')
  160. return 0, 0
  161. end
  162. local canUse = self:canUseFruit(actor, cfgId)
  163. if not canUse then
  164. return 0, 0
  165. end
  166. local fruitData = getplaydef(actor, "T$fruit_data") or {}
  167. local lastUsageInfos = fruitData["lastUsageInfo"] or {}
  168. fruitData["lastUsageInfo"] = lastUsageInfos
  169. -- 单个使用cd检查
  170. local coolingTime = ConfigDataManager.getTableValue("cfg_item", "coolingTime", "id", cfgId)
  171. if coolingTime ~= nil and coolingTime ~= "" then
  172. local curTime = getbaseinfo(actor, "now")
  173. local lastUsageInfo = lastUsageInfos[cfgId] or LastUsageInfo:new()
  174. -- lg(lastUsageInfo)
  175. local lastUsageTime = lastUsageInfo["lastUsageTime"] or 0
  176. if lastUsageTime ~= 0 then
  177. local timeSinceLastUse = curTime - lastUsageTime
  178. if timeSinceLastUse < tonumber(coolingTime) then
  179. -- lg('使用cd未冷却')
  180. return 0, 0
  181. end
  182. end
  183. end
  184. -- 使用多个后cd检查
  185. local canUseManager = nil
  186. local countAndTimeLimit = ConfigDataManager.getTableValue("cfg_item", "useLimit", "id", cfgId)
  187. if countAndTimeLimit ~= nil and countAndTimeLimit ~= "" then
  188. local splits = string.split(countAndTimeLimit, "#")
  189. local countLimit = tonumber(splits[1])
  190. if count > countLimit then
  191. -- lg('使用数量超过限制')
  192. return 0, 0
  193. end
  194. local timeLimit = tonumber(splits[2])
  195. canUseManager = ItemCanUseTool:new(countLimit, timeLimit, lastUsageInfos)
  196. -- lg("canUseManager:", canUseManager)
  197. local canUseItem = canUseManager:canUseItem(actor, cfgId)
  198. if not canUseItem then
  199. local tipTime = timeLimit / 60
  200. -- lg('使用数量达到上限' .. countLimit .. ',请等待' .. tipTime .. '分钟再使用!')
  201. return 0, 0
  202. end
  203. end
  204. local realUseCount, currAttrAddValue = self:addFruitAttrPoint(actor, count, cfgId, fruitData)
  205. -- lg("实际使用果实数量:", realUseCount, "本次实际增加值", currAttrAddValue)
  206. if realUseCount == 0 then
  207. -- 使用失败或者添加值为零
  208. return 0, 0
  209. end
  210. if canUseManager == nil then
  211. -- 不限制使用,在这里初始化
  212. canUseManager = ItemCanUseTool:new(-1, -1, lastUsageInfos)
  213. end
  214. canUseManager:useItem(actor, cfgId, realUseCount)
  215. -- 更新果实的使用信息
  216. local updatedUseageInfo = canUseManager["usageInfos"]
  217. -- lg("果实使用信息", updatedUseageInfo)
  218. setplaydef(actor, "T$fruit_data", fruitData)
  219. self:getAlreadyUsePoints(actor)
  220. return realUseCount, currAttrAddValue
  221. end
  222. -- 添加属性点
  223. function FruitScript:addFruitAttrPoint(actor, count, cfgId, fruitData)
  224. local fruitAttrId = ConfigDataManager.getTableValue("cfg_fruit", "attribute", "id", cfgId)
  225. -- lg("果实id", fruitAttrId)
  226. if fruitAttrId == "" or tonumber(fruitAttrId) <= 0 then
  227. return 0, 0
  228. end
  229. local attributeGroup = ConfigDataManager.getTableValue("cfg_fruit", "group", "id", cfgId)
  230. -- lg("属性组", attributeGroup)
  231. if attributeGroup == "" or tonumber(attributeGroup) <= 0 then
  232. return 0, 0
  233. end
  234. local realUseFruitCount = 0
  235. local currAttrAddValue = 0
  236. if self:isFirstLevelAttribute(fruitAttrId) then
  237. realUseFruitCount, currAttrAddValue =
  238. self:firstLevelAttrLogic(actor, cfgId, fruitAttrId, count, attributeGroup, fruitData)
  239. else
  240. realUseFruitCount, currAttrAddValue =
  241. self:notFirstLevelAttrLogic(actor, cfgId, fruitAttrId, count, attributeGroup, fruitData)
  242. end
  243. -- lg("使用果实后的当前对应属性值", currAttrAddValue)
  244. if realUseFruitCount == 0 then
  245. return 0, 0
  246. end
  247. if realUseFruitCount > 0 and currAttrAddValue > 0 then
  248. local attrName = ConfigDataManager.getTableValue("cfg_att_info", "attribute", "id", fruitAttrId)
  249. if attrName == nil or attrName == nil then
  250. return false
  251. end
  252. -- lg("attrName", attrName)
  253. local newFruitData = getplaydef(actor, "T$fruit_data") or {}
  254. local newFruitAttrPoints = newFruitData["fruitAttrPoints"] or {}
  255. -- local newValue = newFruitAttrPoints[tonumber(fruitAttrId)] or 0
  256. -- 更新属性值
  257. -- updateattrgroup(actor, "fruitAttrs", attrName, newValue)
  258. addrolekmlattributes(actor, "fruitAttrs", newFruitAttrPoints)
  259. end
  260. return realUseFruitCount, currAttrAddValue
  261. end
  262. -- 第一级属性点添加逻辑
  263. function FruitScript:firstLevelAttrLogic(actor, cfgId, fruitAttrId, count, attributeGroup, fruitData)
  264. -- lg("第一级属性点添加逻辑")
  265. local realUseFruitCount = 0
  266. local maxFirstLevelAttrSum =
  267. ConfigDataManager.getTableValue("cfg_global", "value", "id", scriptConst.FIRST_LEVEL_ATTR_MAX_VALUE_CONFIG)
  268. if maxFirstLevelAttrSum == "" or maxFirstLevelAttrSum == nil then
  269. -- lg("获取最大属性点失败")
  270. return 0, 0
  271. end
  272. maxFirstLevelAttrSum = tonumber(maxFirstLevelAttrSum)
  273. local fruitAttrPoints = fruitData["fruitAttrPoints"] or {}
  274. fruitData["fruitAttrPoints"] = fruitAttrPoints
  275. local totalAddValue = 0
  276. while count > 0 do
  277. local oldFruitAttr = fruitAttrPoints[tonumber(fruitAttrId)] or 0
  278. -- lg("当前已经有的属性值:", fruitAttrId, oldFruitAttr)
  279. local probability =
  280. ConfigDataManager.getTableValue(
  281. "cfg_fruitgroup",
  282. "probability",
  283. "acquired",
  284. oldFruitAttr,
  285. "group",
  286. attributeGroup
  287. )
  288. -- lg("概率字符:", probability)
  289. local probabilityArr = string.splitByAll(probability, "#")
  290. local index = self:selectIndexByWeight(probabilityArr)
  291. -- lg("本次选中的索引:", index)
  292. local values =
  293. ConfigDataManager.getTableValue(
  294. "cfg_fruitgroup",
  295. "number",
  296. "acquired",
  297. oldFruitAttr,
  298. "group",
  299. attributeGroup
  300. )
  301. local realAddAttrValue = tonumber(string.splitByAll(values, "#")[index])
  302. -- lg("本次实际增加值:", realAddAttrValue)
  303. local numberType = ConfigDataManager.getTableValue("cfg_att_info", "remarks", "id", fruitAttrId)
  304. -- lg("数值类型:", numberType)
  305. if tonumber(numberType) == 2 then
  306. realAddAttrValue = realAddAttrValue * 0.0001
  307. end
  308. local currentFirstLevelAttrSum = self:gainCurrentFirstLevelAttrSum(actor)
  309. -- lg("当前一级属性总和 : ", currentFirstLevelAttrSum)
  310. if currentFirstLevelAttrSum >= maxFirstLevelAttrSum then
  311. -- lg("当前属性点已达到上限")
  312. break
  313. end
  314. if currentFirstLevelAttrSum + realAddAttrValue >= maxFirstLevelAttrSum then
  315. -- lg("大于等于最大值")
  316. realUseFruitCount = realUseFruitCount + 1
  317. local realAddThisTime = maxFirstLevelAttrSum - currentFirstLevelAttrSum
  318. totalAddValue = totalAddValue + realAddThisTime
  319. fruitAttrPoints[tonumber(fruitAttrId)] = oldFruitAttr + realAddThisTime
  320. break
  321. end
  322. if currentFirstLevelAttrSum + realAddAttrValue < maxFirstLevelAttrSum then
  323. -- lg("小于最大值")
  324. realUseFruitCount = realUseFruitCount + 1
  325. totalAddValue = totalAddValue + realAddAttrValue
  326. fruitAttrPoints[tonumber(fruitAttrId)] = oldFruitAttr + realAddAttrValue
  327. end
  328. count = count - 1
  329. if realAddAttrValue > 0 then
  330. local attrTipName = ConfigDataManager.getTableValue("cfg_att_info", "name", "id", fruitAttrId)
  331. local tipInfo = realAddAttrValue
  332. if tonumber(numberType) == 2 then
  333. tipInfo = realAddAttrValue * 100 .. "%"
  334. end
  335. noticeTip.noticeinfo(actor, scriptConst.FRUIT_SUCCESS, attrTipName, tipInfo)
  336. else
  337. noticeTip.noticeinfo(actor, scriptConst.FRUIT_FAIL)
  338. end
  339. -- 更新果实属性值
  340. setplaydef(actor, "T$fruit_data", fruitData)
  341. end
  342. return realUseFruitCount, totalAddValue
  343. end
  344. -- 非属性点第一级添加逻辑
  345. function FruitScript:notFirstLevelAttrLogic(actor, cfgId, fruitAttrId, count, attributeGroup, fruitData)
  346. -- lg("非属性点第一级添加逻辑")
  347. local realUseFruitCount = 0
  348. local fruitAttrPoints = fruitData["fruitAttrPoints"] or {}
  349. fruitData["fruitAttrPoints"] = fruitAttrPoints
  350. -- 一级属性之外的属性不设上限
  351. local totalAddValue = 0
  352. while count > 0 do
  353. local oldFruitAttr = fruitAttrPoints[tonumber(fruitAttrId)] or 0
  354. local numberType = ConfigDataManager.getTableValue("cfg_att_info", "remarks", "id", fruitAttrId)
  355. -- lg("数值类型:", numberType)
  356. local acquired = oldFruitAttr
  357. if tonumber(numberType) == 2 then
  358. acquired = math.round(oldFruitAttr * 10000)
  359. end
  360. -- lg("当前已经有的属性值:", fruitAttrId, oldFruitAttr, acquired)
  361. local probability =
  362. ConfigDataManager.getTableValue(
  363. "cfg_fruitgroup",
  364. "probability",
  365. "acquired",
  366. acquired,
  367. "group",
  368. attributeGroup
  369. )
  370. local probabilityArr = string.splitByAll(probability, "#")
  371. local index = self:selectIndexByWeight(probabilityArr)
  372. -- lg("本次选中的索引:", index)
  373. local values =
  374. ConfigDataManager.getTableValue("cfg_fruitgroup", "number", "acquired", acquired, "group", attributeGroup)
  375. local realAddAttrValue = tonumber(string.splitByAll(values, "#")[index])
  376. if tonumber(numberType) == 2 then
  377. realAddAttrValue = realAddAttrValue * 0.0001
  378. end
  379. -- lg("本次实际增加值:", realAddAttrValue)
  380. totalAddValue = totalAddValue + realAddAttrValue
  381. fruitAttrPoints[tonumber(fruitAttrId)] = oldFruitAttr + realAddAttrValue
  382. realUseFruitCount = realUseFruitCount + 1
  383. count = count - 1
  384. if realAddAttrValue > 0 then
  385. local attrTipName = ConfigDataManager.getTableValue("cfg_att_info", "name", "id", fruitAttrId)
  386. local tipInfo = realAddAttrValue
  387. if tonumber(numberType) == 2 then
  388. tipInfo = realAddAttrValue * 100 .. "%"
  389. end
  390. noticeTip.noticeinfo(actor, scriptConst.FRUIT_SUCCESS, attrTipName, tipInfo)
  391. else
  392. noticeTip.noticeinfo(actor, scriptConst.FRUIT_FAIL)
  393. end
  394. end
  395. setplaydef(actor, "T$fruit_data", fruitData)
  396. return realUseFruitCount, totalAddValue
  397. end
  398. -- 获取属性点第一级属性点总和
  399. function FruitScript:gainCurrentFirstLevelAttrSum(actor)
  400. local currentFirstLevelAttrSum = 0
  401. local firstLevelAttributeEnum = self:getFirstAttrConfig()
  402. local fruitData = getplaydef(actor, "T$fruit_data") or {}
  403. local fruitAttrPoints = fruitData["fruitAttrPoints"] or {}
  404. for i, attrId in ipairs(firstLevelAttributeEnum) do
  405. local currFruitAttrPoint = fruitAttrPoints[tonumber(attrId)] or 0
  406. currentFirstLevelAttrSum = currentFirstLevelAttrSum + currFruitAttrPoint
  407. end
  408. -- lg("一级属性值总和", currentFirstLevelAttrSum)
  409. return currentFirstLevelAttrSum
  410. end
  411. -- 校验是否可以使用
  412. function FruitScript:canUseFruit(actor, cfgId)
  413. local itemConfig = ConfigDataManager.getById("cfg_item", cfgId)
  414. local fruitConfig = ConfigDataManager.getById("cfg_fruit", cfgId)
  415. if itemConfig == nil or fruitConfig == nil then
  416. -- lg('要使用的果实道具不存在,请检查配置')
  417. return false
  418. end
  419. local fruitAttrIdStr = ConfigDataManager.getTableValue("cfg_fruit", "attribute", "id", cfgId)
  420. if fruitAttrIdStr == nil or fruitAttrIdStr == "" then
  421. return false
  422. end
  423. local fruitAttrId = tonumber(fruitAttrIdStr)
  424. if fruitAttrId <= 0 then
  425. -- lg('配置属性id不合法')
  426. return false
  427. end
  428. local attInfoConfig = ConfigDataManager.getById("cfg_att_info", fruitAttrId)
  429. -- -- lg("属性信息", attInfoConfig)
  430. if attInfoConfig == nil or next(attInfoConfig) == nil then
  431. -- lg('未找到属性信息')
  432. return false
  433. end
  434. if self:isFirstLevelAttribute(fruitAttrId) then
  435. local currentFirstLevelAttrSum = self:gainCurrentFirstLevelAttrSum(actor)
  436. local maxFirstLevelAttrSum =
  437. ConfigDataManager.getTableValue("cfg_global", "value", "id", scriptConst.FIRST_LEVEL_ATTR_MAX_VALUE_CONFIG)
  438. maxFirstLevelAttrSum = tonumber(maxFirstLevelAttrSum)
  439. if currentFirstLevelAttrSum >= maxFirstLevelAttrSum then
  440. -- lg('当前一级果实属性加成已经达到最大值,无法使用果实继续加成!')
  441. return false
  442. end
  443. end
  444. return true
  445. end
  446. -- 判断是否是属性点第一级
  447. function FruitScript:isFirstLevelAttribute(fruitAttrId)
  448. local firstLevelAttributeEnum = self:getFirstAttrConfig()
  449. -- lg("判断是否是属性点第一级属性", fruitAttrId, array.simpleContains(firstLevelAttributeEnum, fruitAttrId))
  450. return array.simpleContains(firstLevelAttributeEnum, fruitAttrId)
  451. end
  452. -- 将字符串转换成map
  453. function FruitScript:convertStringToMap(source)
  454. if source == nil then
  455. return nil
  456. end
  457. local strValue = tostring(source)
  458. local map = {}
  459. if strValue ~= "" then
  460. map = string.toStringStringMap(strValue, "#", "|")
  461. end
  462. return map
  463. end
  464. -- ===========================================重置果实属性请求==========================================
  465. -- 重置果实属性请求
  466. function FruitScript:resetFruitAttr(actor, attrIdAndValue)
  467. local fruitData = getplaydef(actor, "T$fruit_data") or {}
  468. local resetFruitAttrCount = fruitData["resetFruitAttrCount"] or 0
  469. local resetCondition =
  470. ConfigDataManager.getTableValue("cfg_global", "value", "id", scriptConst.RESET_FIRST_LEVEL_ATTR_CONDITION)
  471. -- 根据重置条件,扣除道具
  472. local tobeResetCount = resetFruitAttrCount + 1
  473. local index = tobeResetCount
  474. if tobeResetCount > 4 then
  475. index = 4
  476. end
  477. local resetConditions = string.splitByAll(resetCondition, "|")
  478. local resetCost = string.splitByAll(resetConditions[index], "#")
  479. local itemCount = getbagitemcountbyid(actor, tonumber(resetCost[2]))
  480. -- lg("重置果实属性请求,已有道具%d,数量%d", resetCost[2], itemCount)
  481. if tonumber(itemCount) < tonumber(resetCost[3]) then
  482. noticeTip.noticeinfo(actor, StringIdConst.TEXT348)
  483. return
  484. end
  485. -- 校验一级属性值总数是否一致
  486. local totalAttrPoints = self:gainCurrentFirstLevelAttrSum(actor)
  487. local receivePoints = 0
  488. for k, v in pairs(attrIdAndValue) do
  489. receivePoints = receivePoints + v
  490. end
  491. -- lg("重置果实属性请求,一级属性值总和%d,已获得属性值总和%d", totalAttrPoints, receivePoints)
  492. if tonumber(totalAttrPoints) ~= tonumber(receivePoints) then
  493. -- lg("重置果实属性请求失败,一级属性值总和不一致")
  494. return
  495. end
  496. local firstLevelAttributeEnum = self:getFirstAttrConfig()
  497. -- lg(firstLevelAttributeEnum)
  498. -- 客户端清除一级果实属性 (非一级属性不清除)
  499. local fruitAttrPoints = fruitData["fruitAttrPoints"] or {}
  500. for _, attrId in ipairs(firstLevelAttributeEnum) do
  501. local newValue = attrIdAndValue[attrId]
  502. fruitAttrPoints[tonumber(attrId)] = newValue
  503. end
  504. addrolekmlattributes(actor, "fruitAttrs", fruitAttrPoints)
  505. removeitemfrombag(actor, tonumber(resetCost[2]), tonumber(resetCost[3]), 0, 9999, "果实")
  506. fruitData["resetFruitAttrCount"] = tobeResetCount
  507. fruitData["fruitAttrPoints"] = fruitAttrPoints
  508. setplaydef(actor, "T$fruit_data", fruitData)
  509. self:getAlreadyUsePoints(actor)
  510. end
  511. -- 获取果实属性重置次数
  512. function FruitScript:getResetCount(actor)
  513. local fruitData = getplaydef(actor, "T$fruit_data") or {}
  514. local resetFruitAttrCount = fruitData["resetFruitAttrCount"] or 0
  515. -- lg("已经重置次数", resetFruitAttrCount)
  516. sendluamsg(actor, LuaMessageIdToClient.C_RESET_FRUIT_COUNT, resetFruitAttrCount)
  517. end
  518. -- 获取果实当前已经使用的点数
  519. function FruitScript:getAlreadyUsePoints(actor)
  520. local data = getplaydef(actor, "T$fruit_data") or {}
  521. local attrPoints = data["fruitAttrPoints"]
  522. if attrPoints == nil then
  523. -- lg("没有属性点数据")
  524. sendluamsg(actor, LuaMessageIdToClient.C_USE_FRUIT_RESULT, {totalFirstLevelAttrs = 0, attrPoints = {}})
  525. return
  526. end
  527. local totalFirstLevelAttrs = self:gainCurrentFirstLevelAttrSum(actor)
  528. for k, v in pairs(attrPoints) do
  529. attrPoints[k] = tostring(v)
  530. end
  531. -- lg("已分配属性点", attrPoints)
  532. sendluamsg(
  533. actor,
  534. LuaMessageIdToClient.C_USE_FRUIT_RESULT,
  535. {totalFirstLevelAttrs = totalFirstLevelAttrs, attrPoints = attrPoints}
  536. )
  537. end
  538. function FruitScript:getFirstAttrConfig()
  539. local firstLevelAttrConfigs =
  540. ConfigDataManager.getTable("cfg_att_info", "base", scriptConst.FIRST_LEVEL_ATTR_CONFIG)
  541. if table.isNullOrEmpty(firstLevelAttrConfigs) then
  542. return
  543. end
  544. local firstLevelAttributeEnum = {}
  545. for i, attInfoConfig in ipairs(firstLevelAttrConfigs) do
  546. local attrId = attInfoConfig["id"]
  547. table.insert(firstLevelAttributeEnum, attrId)
  548. end
  549. return firstLevelAttributeEnum
  550. end
  551. -- 根据权重随机选位置索引
  552. function FruitScript:selectIndexByWeight(weights)
  553. local totalWeight = 0
  554. for _, weight in ipairs(weights) do
  555. weight = tonumber(weight)
  556. totalWeight = totalWeight + weight
  557. end
  558. local randomValue = math.random(1, totalWeight)
  559. -- 遍历权重数组,找到对应的下标
  560. local accumulatedWeight = 0
  561. for i, weight in ipairs(weights) do
  562. accumulatedWeight = accumulatedWeight + weight
  563. if randomValue <= accumulatedWeight then
  564. return i
  565. end
  566. end
  567. -- 如果没有找到合适的下标(理论上不会发生),返回最后一个下标
  568. return #weights
  569. end
  570. function FruitScript:resetOneFruitAttr(actor, msgData)
  571. local fruitData = getplaydef(actor, "T$fruit_data") or {}
  572. local fruitAttrPoints = fruitData["fruitAttrPoints"] or {}
  573. local costType = 10040001 --钻石
  574. local newValue = (fruitAttrPoints[msgData.type] or 0) - msgData.xiPoint
  575. if newValue < 0 then
  576. return
  577. end
  578. local costNum = msgData.xiPoint * 10
  579. local itemCount = getbagitemcountbyid(actor, costType)
  580. if tonumber(itemCount) < tonumber(costNum) then
  581. noticeTip.noticeinfo(actor, StringIdConst.TEXT348)
  582. return
  583. end
  584. removeitemfrombag(actor, costType, tonumber(costNum), 0, 9999, "果实洗点")
  585. fruitAttrPoints[tonumber(msgData.type)] = newValue
  586. fruitData["fruitAttrPoints"] = fruitAttrPoints
  587. addrolekmlattributes(actor, "fruitAttrs", fruitAttrPoints)
  588. setplaydef(actor, "T$fruit_data", fruitData)
  589. self:getAlreadyUsePoints(actor)
  590. end
  591. function clearfruit(actor)
  592. setplaydef(actor, "T$fruit_data", {})
  593. end