Player_1.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. ---
  2. --- Generated by EmmyLua(https://github.com/EmmyLua)
  3. --- Created by zhoutao.
  4. --- DateTime: 2024/10/28 14:17
  5. ---
  6. Player = {}
  7. local filename = "Player"
  8. local db_world_level = "R$_world_level" -- 世界等级关键字
  9. local db_player_new_get_gold = "R$_player_new_get_gold" -- 新账号的第一个角色给金币
  10. Player.Const = {
  11. player_new_get_gold = 500000
  12. }
  13. local db_gold_count = "Q$_gold_count" -- 每日获得金币限制
  14. --- 改变角色名称
  15. --- @param actor table 玩家对象
  16. --- @param msgData table 角色名称
  17. function Player.changeRoleName(actor, msgData)
  18. local roleName = msgData["roleName"]
  19. -- 首次改名不再免费
  20. -- local isFirstChangeName = getplaydef(actor, PlayerDefKey.player.FIRST_CHANGE_NAME)
  21. -- if not string.isNullOrEmpty(isFirstChangeName) then
  22. local value = ConfigDataManager.getTableValue("cfg_global", "value", "id", GlobalConfigId.CHANGE_NAME_CARD_COST)
  23. local split = string.split(value, "|")
  24. local tmps = string.split(split[2], "#")
  25. local costItemId = tmps[1]
  26. local costCount = tmps[2]
  27. if not Bag.checkItem(actor, costItemId, costCount) then
  28. noticeTip.noticeinfo(actor, StringIdConst.TEXT346)
  29. return
  30. end
  31. if not checkrolename(actor, roleName) then
  32. jprint("角色名不合法 actor:" .. actor:toString() .. " roleName:" .. roleName)
  33. return
  34. end
  35. -- 从背包中移除指定数量的道具
  36. removeitemfrombag(actor, costItemId, costCount, 0, 9999, '角色改名')
  37. changerolename(actor, roleName)
  38. return
  39. -- else
  40. -- if not checkrolename(actor, roleName) then
  41. -- jprint("角色名不合法 actor:" .. actor:toString() .. " roleName:" .. roleName)
  42. -- return
  43. -- end
  44. -- changerolename(actor, roleName)
  45. -- setplaydef(actor, PlayerDefKey.player.FIRST_CHANGE_NAME, 1)
  46. -- end
  47. end
  48. --- 获取角色是否为首次改名
  49. --- @param actor table 玩家对象
  50. function Player.getRoleChangeNameInfo(actor)
  51. -- local isFirstChangeName = getplaydef(actor, PlayerDefKey.player.FIRST_CHANGE_NAME)
  52. -- sendluamsg(actor, LuaMessageIdToClient.RES_ROLE_IS_FIRST_CHANGE_NAME, isFirstChangeName and 1 or 0)
  53. -- 首次改名不再免费
  54. sendluamsg(actor, LuaMessageIdToClient.RES_ROLE_IS_FIRST_CHANGE_NAME, 1)
  55. end
  56. function Player.UpdateFightValue(actor)
  57. --默认战斗力=10*攻击+8*防御+0.25*生命+1400*1%卓越一击倍率+1160*1%幸运一击倍率+4670*1%双倍一击倍率+3400*1%攻速+3400*1%伤害加成
  58. local maxDC = getattrinfo(actor, "maxDC")
  59. local armor = getattrinfo(actor, "armor")
  60. local maxHP = getattrinfo(actor, "maxHP")
  61. local excellentDamageChance = math.max(getattrinfo(actor, "excellentDamageChance"), 1)
  62. local criticalDamageChance = math.max(getattrinfo(actor, "criticalDamageChance"), 1)
  63. local doubleDamageChance = math.max(getattrinfo(actor, "doubleDamageChance"), 1)
  64. local attackSpeed = math.max(getattrinfo(actor, "attackSpeed"), 1)
  65. local damageRate = math.max(getattrinfo(actor, "damageRate"), 1)
  66. local result = 10 * maxDC + 8 * armor + 0.25 * maxHP + 1400 * excellentDamageChance * 0.01 +
  67. 1160 * criticalDamageChance * 0.01 +
  68. 4670 * doubleDamageChance * 0.01 +
  69. 3400 * attackSpeed * 0.01 + 3400 * damageRate * 0.01
  70. savefightvalue(actor, result)
  71. end
  72. function Player.updateLoginInfo(actor)
  73. --获取玩家数据,并更新世界等级
  74. Player.updateWorldLevel(actor, true)
  75. end
  76. function Player.onLoginEnd(actor)
  77. --获取玩家数据,并更新世界等级
  78. Player.updateWorldLevel(actor, false)
  79. Player.newPlayerGetGold(actor)
  80. -- Player.updateCurrency(actor)
  81. callonserial(actor,"_updatecurrency")
  82. end
  83. function Player.onLevelUp(actor)
  84. --获取玩家数据,并更新世界等级
  85. Player.updateWorldLevel(actor, true)
  86. end
  87. function Player.enterMap(actor)
  88. --获取玩家数据,并更新世界等级
  89. Player.updateWorldLevel(actor, true)
  90. end
  91. -- 内置经验只有泡点和杀怪有经验加成
  92. -- 这个方法复刻内置经验加成计算,用来计算实际加成后的经验
  93. -- 仅直接发经验奖励可调用,地图经验衰减,怪物衰减在这不适用
  94. function Player.calculExpByAddRate(actor, originExp)
  95. local finalExp = originExp
  96. finalExp = Player.applyExpModification(actor, finalExp, 19, true)
  97. finalExp = Player.applyExpModification(actor, finalExp, 20, false)
  98. finalExp = finalExp * TripleIncome.GetRate(actor)
  99. -- 应用线路经验倍率
  100. finalExp = LineManager.applyExpRate(actor, finalExp)
  101. return finalExp
  102. end
  103. function Player.applyExpModification(actor, exp, type, isAdd)
  104. local tableList = ConfigDataManager.getTable("cfg_att_special", "type", type)
  105. for _, t in pairs(tableList) do
  106. local attrId = tonumber(t.id)
  107. local attrName = attrid2name(actor, attrId)
  108. local attrValue = getattrinfo(actor, attrName)
  109. if isAdd then
  110. exp = attrValue * exp + exp
  111. else
  112. exp = exp - attrValue * exp;
  113. end
  114. end
  115. return exp
  116. end
  117. function Player.calWorldLevelExpRate(actor)
  118. local roleLevel = getbaseinfo(actor, "level")
  119. local worldLevel = getsysvar(actor, db_world_level) or 0
  120. local levelDistance = math.floor((worldLevel - roleLevel) / 10.0)
  121. -- info("Player.calWorldLevelExpRate levelDistance:" .. levelDistance .. " 角色等级:" .. roleLevel .. " 世界等级:" .. worldLevel)
  122. if levelDistance > 10 then
  123. return 200
  124. elseif levelDistance > 0 then
  125. return levelDistance * 20
  126. end
  127. return 0
  128. end
  129. function Player.calWorldLevel()
  130. local roles = getallrolesummaryinfos()
  131. local allRoles = {}
  132. if roles then
  133. for _, role in ipairs(roles) do
  134. local actor = role["actor"]
  135. local buidRole = Player.buildOneRole(actor)
  136. table.insert(allRoles, buidRole)
  137. end
  138. table.sort(allRoles, function(a, b)
  139. if a.level == b.level then
  140. return a.rid > b.rid
  141. else
  142. return a.level > b.level
  143. end
  144. end)
  145. local levelNum = 0
  146. local levelCount = 0
  147. for i = 1, 50 do
  148. if #allRoles < i then
  149. break
  150. end
  151. levelNum = levelNum + allRoles[i].level
  152. levelCount = levelCount + 1
  153. end
  154. -- info("Player.calWorldLevel levelNum:" .. levelNum .. " levelCount:" .. levelCount)
  155. return math.floor(levelNum / levelCount)
  156. end
  157. return 0
  158. end
  159. function Player.buildOneRole(actor)
  160. local role = {}
  161. role["actor"] = actor
  162. role["rid"] = getbaseinfo(actor, "id")
  163. role["level"] = getbaseinfo(actor, "level")
  164. return role
  165. end
  166. function Player.updateWorldLevel(actor, needForceSendMsg)
  167. --获取玩家数据,并更新世界等级
  168. local data = getplayermaininfo(actor)
  169. local playerLevel = 0
  170. if data ~= nil and data.level ~= nil then
  171. playerLevel = data.level
  172. end
  173. local worldLevel = getsysvar(actor, db_world_level) or 0
  174. -- if data ~= nil and data.level ~= nil then
  175. -- 更新世界等级,世界等级计算按照服务器前50名的平均等级计算
  176. if worldLevel < playerLevel then
  177. local newWorldLevel = Player.calWorldLevel()
  178. setsysvar(actor, db_world_level, newWorldLevel)
  179. if newWorldLevel < playerLevel then
  180. local allPlayer = getallplayer(actor)
  181. if allPlayer ~= nil then
  182. for i = 1, #allPlayer do
  183. local player = getactor(actor, allPlayer[i])
  184. sendluamsg(player, LuaMessageIdToClient.RES_ROLE_INFO, { newWorldLevel })
  185. local expRate = Player.calWorldLevelExpRate(actor) * 100
  186. ExpBonus.changeBonus(actor, BonusType.WORLD_LEVEL_EXP_BONUS, expRate, 0, 0)
  187. end
  188. end
  189. return
  190. end
  191. -- end
  192. end
  193. if needForceSendMsg then
  194. sendluamsg(actor, LuaMessageIdToClient.RES_ROLE_INFO, { worldLevel })
  195. local expRate = Player.calWorldLevelExpRate(actor) * 100
  196. ExpBonus.changeBonus(actor, BonusType.WORLD_LEVEL_EXP_BONUS, expRate, 0, 0)
  197. end
  198. end
  199. function Player.newPlayerGetGold(actor)
  200. local uid = getbaseinfo(actor, "uid")
  201. local isNewPlayerForGold = getsysvar(db_player_new_get_gold..uid) or 0
  202. if isNewPlayerForGold <= 0 then
  203. additemtobag(actor, 10010001, Player.Const.player_new_get_gold, 0, 9999, "新账号金币福利")
  204. setsysvar(actor, db_player_new_get_gold..uid, 1)
  205. sendluamsg(actor, LuaMessageIdToClient.RES_NEW_PLAYER_FOR_GOLD, {})
  206. return
  207. end
  208. -- sendluamsg(actor, LuaMessageIdToClient.RES_NEW_PLAYER_FOR_GOLD, {})
  209. end
  210. -- 更新货币数据
  211. -- function Player.updateCurrency(actor)
  212. function _updatecurrency(actor)
  213. local uid = getbaseinfo(actor, "uid")
  214. local mData = getsysvar(actor, "R$MoneyData_"..uid)
  215. if mData == nil then
  216. mData = {}
  217. local ListInfo = getrolelist(actor,uid)
  218. for _, roleInfo in pairs(ListInfo) do
  219. local rid = roleInfo["id"]
  220. local player = getactor(rid)
  221. for _,cfgId in pairs({10010001,10020001,10040001,10050001 }) do
  222. local num = getbagitemcountbyid(player, cfgId) or 0
  223. mData[cfgId] = num + (mData[cfgId] or 0)
  224. end
  225. end
  226. setsysvar(actor, "R$MoneyData_"..uid, mData)
  227. end
  228. for cfgId, count in pairs(mData) do
  229. local num = getbagitemcountbyid(actor, cfgId) or 0
  230. if num ~= count then
  231. -- info("Player.updateCurrency-> ", actor, cfgId, num, count)
  232. local diff = count - num
  233. if diff > 0 then
  234. additemtobag(actor, cfgId, diff, 0, 9999, "货币数据同步补偿")
  235. elseif diff < 0 then
  236. removeitemfrombag(actor, cfgId, -diff, 0, 9999, "货币数据同步扣除")
  237. end
  238. end
  239. end
  240. end
  241. function Player.GoldCountAdd(num)
  242. if num <= 0 then
  243. return
  244. end
  245. local gold_count = getplaydef(db_gold_count) or 0
  246. setplaydef(db_gold_count, gold_count + num)
  247. end
  248. function Player.GoldCountEnough(num)
  249. if num < 0 then
  250. return false, 0
  251. end
  252. local level = getbaseinfo(actor, "level")
  253. local gold_count = getplaydef(db_gold_count) or 0
  254. local gold_max = ConfigDataManager.getById("cfg_gold_day_add", level)
  255. if gold_count > gold_max then
  256. return false, 0
  257. end
  258. if gold_max - gold_count >= num then
  259. return true, num
  260. end
  261. return true, gold_max - gold_count
  262. end