ExpBoostItem.lua 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. --- 经验加成道具使用
  2. --- Generated by EmmyLua(https://github.com/EmmyLua)
  3. --- Created by zhoutao.
  4. --- DateTime: 2024/11/6 19:47
  5. ---
  6. ExpBoost = {}
  7. --- 使用经验加成道具
  8. ---@param actor table 角色对象
  9. ---@param itemConfigId number 道具配置ID
  10. ---@param count number 使用数量
  11. function ExpBoost.useExperienceBoostItem(actor, itemConfigId, count)
  12. local tableValue = ConfigDataManager.getTable("cfg_item", "id", itemConfigId)
  13. if tableValue == nil then
  14. jprint("=============================>cfg_item没有查到此道具,itemConfigId:", itemConfigId)
  15. return
  16. end
  17. local type = tonumber(tableValue[1]["type"])
  18. local subType = tonumber(tableValue[1]["subtype"])
  19. -- 经验药水类item特殊处理
  20. if ItemType.DRUG == type and ItemSubType.EXP_BOOST == subType then
  21. local useParam = tableValue[1]["useparam"]
  22. if string.isNullOrEmpty(useParam) then
  23. return
  24. end
  25. local strSplit = string.split(useParam, "#")
  26. if #strSplit == 3 then
  27. local attrId = strSplit[1]
  28. local duration = strSplit[2]
  29. local buffId = strSplit[3]
  30. local attrValue = 0
  31. local expireTime = 0
  32. local buffValue = ConfigDataManager.getTableValue("cfg_buff", "buffvalue", "id", buffId)
  33. local buffValueSplit = string.split(buffValue, "#")
  34. if #buffValueSplit == 2 then
  35. attrValue = tonumber(buffValueSplit[2])
  36. end
  37. for i = 1, count do
  38. local playerExpireInfo = getplaydef(actor, PlayerDefKey.player.EXP_BOOST_EXPIRE_TIME)
  39. if not table.isNullOrEmpty(playerExpireInfo) then
  40. -- 如果之前已经使用过永久的经验药水,则不做后续操作,直接return
  41. local playerExpireTime = tonumber(playerExpireInfo["expireTime"])
  42. if playerExpireTime < 0 and tonumber(duration) < 0 then
  43. return
  44. end
  45. -- 如果之前已经使用过经验药水,则只增加时间不做加属性操作
  46. if tonumber(duration) < 0 then
  47. expireTime = -1
  48. else
  49. expireTime = tonumber(playerExpireTime) + tonumber(duration) * TimeUnit.MILLISECOND
  50. end
  51. else
  52. local attrMap = {}
  53. attrMap[attrId] = attrValue
  54. RoleAttr.addAndSaveRoleAttr(actor, RoleAttrKey.EXP_BOOST_ITEM_USE, attrMap)
  55. local now = getbaseinfo(actor, "now")
  56. if tonumber(duration) < 0 then
  57. expireTime = -1
  58. else
  59. expireTime = tonumber(now) + tonumber(duration) * TimeUnit.MILLISECOND
  60. end
  61. end
  62. local expBoostInfo = {}
  63. expBoostInfo["buffId"] = buffId
  64. expBoostInfo["expireTime"] = expireTime
  65. setplaydef(actor, PlayerDefKey.player.EXP_BOOST_EXPIRE_TIME, expBoostInfo)
  66. -- 通知客户端经验收益
  67. ExpBonus.changeBonus(actor, BonusType.EXP_DRUG_BONUS, attrValue, expireTime, buffId)
  68. -- 设置经验药水经验加成值,打怪经验展示加成值使用
  69. setplaydef(actor, PlayerDefKey.player.EXP_BOOST_ATTR_VALUE, attrValue)
  70. local mark = getplaydef(actor, PlayerDefKey.player.EXP_BOOST_EXPIRE_MARK)
  71. if not string.isNullOrEmpty(mark) then
  72. clearintervalcall(actor, mark)
  73. end
  74. local intervalMark = intervalcalldelay(actor, expireTime - tonumber(getbaseinfo(actor, "now")), 1000, 1, "clearexpboost")
  75. setplaydef(actor, PlayerDefKey.player.EXP_BOOST_EXPIRE_MARK, intervalMark)
  76. end
  77. end
  78. end
  79. end
  80. --- 清空角色经验药水信息
  81. ---@param actor table 角色对象
  82. function clearexpboost(actor)
  83. local playerExpireInfo = getplaydef(actor, PlayerDefKey.player.EXP_BOOST_EXPIRE_TIME)
  84. if string.isNullOrEmpty(playerExpireInfo) then
  85. return
  86. end
  87. local buffId = playerExpireInfo["buffId"]
  88. RoleAttr.clearRoleAttrAndDB(actor, RoleAttrKey.EXP_BOOST_ITEM_USE)
  89. ExpBonus.changeBonus(actor, BonusType.EXP_DRUG_BONUS, 0, 0, buffId)
  90. setplaydef(actor, PlayerDefKey.player.EXP_BOOST_EXPIRE_TIME, nil)
  91. setplaydef(actor, PlayerDefKey.player.EXP_BOOST_ATTR_VALUE, 0)
  92. end
  93. --- 角色登录通知客户端经验药水信息
  94. ---@param actor table 角色对象
  95. function ExpBoost.login(play)
  96. local playerExpireInfo = getplaydef(play, PlayerDefKey.player.EXP_BOOST_EXPIRE_TIME)
  97. if string.isNullOrEmpty(playerExpireInfo) then
  98. return
  99. end
  100. local buffId = playerExpireInfo["buffId"]
  101. local expireTime = playerExpireInfo["expireTime"]
  102. local attrValue = 0
  103. local buffValue = ConfigDataManager.getTableValue("cfg_buff", "buffvalue", "id", buffId)
  104. local buffValueSplit = string.split(buffValue, "#")
  105. if #buffValueSplit == 2 then
  106. attrValue = tonumber(buffValueSplit[2])
  107. end
  108. ExpBonus.changeBonus(play, BonusType.EXP_DRUG_BONUS, attrValue, expireTime, buffId)
  109. end
  110. --- 检查经验药水是否过期
  111. ---@param actor table 角色对象
  112. function ExpBoost.expBoostExpireCheck(actor)
  113. local nowTime = getbaseinfo(actor, "now")
  114. local playerExpireInfo = getplaydef(actor, PlayerDefKey.player.EXP_BOOST_EXPIRE_TIME)
  115. if string.isNullOrEmpty(playerExpireInfo) then
  116. return
  117. end
  118. local expireTime = playerExpireInfo["expireTime"]
  119. if tonumber(nowTime) > tonumber(expireTime) then
  120. clearexpboost(actor)
  121. end
  122. end