Fruit_1.lua 23 KB

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