Fruit.lua 23 KB

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