Player_1.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  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 =
  67. 10 * maxDC + 8 * armor + 0.25 * maxHP + 1400 * excellentDamageChance * 0.01 + 1160 * criticalDamageChance * 0.01 +
  68. 4670 * doubleDamageChance * 0.01 +
  69. 3400 * attackSpeed * 0.01 +
  70. 3400 * damageRate * 0.01
  71. savefightvalue(actor, result)
  72. end
  73. function Player.updateLoginInfo(actor)
  74. --获取玩家数据,并更新世界等级
  75. Player.updateWorldLevel(actor, true)
  76. end
  77. function Player.onLoginEnd(actor)
  78. --获取玩家数据,并更新世界等级
  79. Player.updateWorldLevel(actor, false)
  80. Player.newPlayerGetGold(actor)
  81. -- Player.updateCurrency(actor)
  82. callonserial(actor, "_updatecurrency")
  83. end
  84. function Player.onLevelUp(actor)
  85. --获取玩家数据,并更新世界等级
  86. Player.updateWorldLevel(actor, true)
  87. end
  88. function Player.enterMap(actor)
  89. --获取玩家数据,并更新世界等级
  90. Player.updateWorldLevel(actor, true)
  91. end
  92. -- 内置经验只有泡点和杀怪有经验加成
  93. -- 这个方法复刻内置经验加成计算,用来计算实际加成后的经验
  94. -- 仅直接发经验奖励可调用,地图经验衰减,怪物衰减在这不适用
  95. function Player.calculExpByAddRate(actor, originExp)
  96. local finalExp = originExp
  97. finalExp = Player.applyExpModification(actor, finalExp, 19, true)
  98. finalExp = Player.applyExpModification(actor, finalExp, 20, false)
  99. finalExp = finalExp * TripleIncome.GetRate(actor)
  100. -- 应用线路经验倍率
  101. finalExp = LineManager.applyExpRate(actor, finalExp)
  102. return finalExp
  103. end
  104. function Player.applyExpModification(actor, exp, type, isAdd)
  105. local tableList = ConfigDataManager.getTable("cfg_att_special", "type", type)
  106. for _, t in pairs(tableList) do
  107. local attrId = tonumber(t.id)
  108. local attrName = attrid2name(actor, attrId)
  109. local attrValue = getattrinfo(actor, attrName)
  110. if isAdd then
  111. exp = attrValue * exp + exp
  112. else
  113. exp = exp - attrValue * exp
  114. end
  115. end
  116. return exp
  117. end
  118. function Player.calWorldLevelExpRate(actor)
  119. local roleLevel = getbaseinfo(actor, "level")
  120. local worldLevel = getsysvar(actor, db_world_level) or 0
  121. local levelDistance = math.floor((worldLevel - roleLevel) / 10.0)
  122. -- info("Player.calWorldLevelExpRate levelDistance:" .. levelDistance .. " 角色等级:" .. roleLevel .. " 世界等级:" .. worldLevel)
  123. if levelDistance > 10 then
  124. return 200
  125. elseif levelDistance > 0 then
  126. return levelDistance * 20
  127. end
  128. return 0
  129. end
  130. function Player.calWorldLevel()
  131. local roles = getallrolesummaryinfos()
  132. local allRoles = {}
  133. if roles then
  134. for _, role in ipairs(roles) do
  135. local actor = role["actor"]
  136. local buidRole = Player.buildOneRole(actor)
  137. table.insert(allRoles, buidRole)
  138. end
  139. table.sort(
  140. allRoles,
  141. function(a, b)
  142. if a.level == b.level then
  143. return a.rid > b.rid
  144. else
  145. return a.level > b.level
  146. end
  147. end
  148. )
  149. local levelNum = 0
  150. local levelCount = 0
  151. for i = 1, 50 do
  152. if #allRoles < i then
  153. break
  154. end
  155. levelNum = levelNum + allRoles[i].level
  156. levelCount = levelCount + 1
  157. end
  158. -- info("Player.calWorldLevel levelNum:" .. levelNum .. " levelCount:" .. levelCount)
  159. return math.floor(levelNum / levelCount)
  160. end
  161. return 0
  162. end
  163. function Player.buildOneRole(actor)
  164. local role = {}
  165. role["actor"] = actor
  166. role["rid"] = getbaseinfo(actor, "id")
  167. role["level"] = getbaseinfo(actor, "level")
  168. return role
  169. end
  170. function Player.updateWorldLevel(actor, needForceSendMsg)
  171. --获取玩家数据,并更新世界等级
  172. local data = getplayermaininfo(actor)
  173. local playerLevel = 0
  174. if data ~= nil and data.level ~= nil then
  175. playerLevel = data.level
  176. end
  177. local worldLevel = getsysvar(actor, db_world_level) or 0
  178. -- if data ~= nil and data.level ~= nil then
  179. -- 更新世界等级,世界等级计算按照服务器前50名的平均等级计算
  180. if worldLevel < playerLevel then
  181. local newWorldLevel = Player.calWorldLevel()
  182. setsysvar(actor, db_world_level, newWorldLevel)
  183. if newWorldLevel < playerLevel then
  184. local allPlayer = getallplayer(actor)
  185. if allPlayer ~= nil then
  186. for i = 1, #allPlayer do
  187. local player = getactor(actor, allPlayer[i])
  188. sendluamsg(player, LuaMessageIdToClient.RES_ROLE_INFO, {newWorldLevel})
  189. local expRate = Player.calWorldLevelExpRate(actor) * 100
  190. ExpBonus.changeBonus(actor, BonusType.WORLD_LEVEL_EXP_BONUS, expRate, 0, 0)
  191. end
  192. end
  193. return
  194. end
  195. -- end
  196. end
  197. if needForceSendMsg then
  198. sendluamsg(actor, LuaMessageIdToClient.RES_ROLE_INFO, {worldLevel})
  199. local expRate = Player.calWorldLevelExpRate(actor) * 100
  200. ExpBonus.changeBonus(actor, BonusType.WORLD_LEVEL_EXP_BONUS, expRate, 0, 0)
  201. end
  202. end
  203. function Player.newPlayerGetGold(actor)
  204. local uid = getbaseinfo(actor, "uid")
  205. local isNewPlayerForGold = getsysvar(db_player_new_get_gold .. uid) or 0
  206. if isNewPlayerForGold <= 0 then
  207. Bag.addItemToBag(actor, 10010001, Player.Const.player_new_get_gold, 0, 9999, "新账号金币福利")
  208. setsysvar(actor, db_player_new_get_gold .. uid, 1)
  209. sendluamsg(actor, LuaMessageIdToClient.RES_NEW_PLAYER_FOR_GOLD, {})
  210. return
  211. end
  212. -- sendluamsg(actor, LuaMessageIdToClient.RES_NEW_PLAYER_FOR_GOLD, {})
  213. end
  214. -- 更新货币数据
  215. -- function Player.updateCurrency(actor)
  216. function _updatecurrency(actor)
  217. local uid = getbaseinfo(actor, "uid")
  218. local mData = getsysvar(actor, "R$MoneyData_" .. uid)
  219. if mData == nil then
  220. mData = {}
  221. local ListInfo = getrolelist(actor, uid)
  222. for _, roleInfo in pairs(ListInfo) do
  223. local rid = roleInfo["id"]
  224. local player = getactor(rid)
  225. for _, cfgId in pairs({10010001, 10020001, 10040001, 10050001}) do
  226. local num = getbagitemcountbyid(player, cfgId) or 0
  227. mData[cfgId] = num + (mData[cfgId] or 0)
  228. end
  229. end
  230. setsysvar(actor, "R$MoneyData_" .. uid, mData)
  231. end
  232. for cfgId, count in pairs(mData) do
  233. local num = getbagitemcountbyid(actor, cfgId) or 0
  234. if num ~= count then
  235. -- info("Player.updateCurrency-> ", actor, cfgId, num, count)
  236. local diff = count - num
  237. if diff > 0 then
  238. Bag.addItemToBag(actor, cfgId, diff, 0, 9999, "货币数据同步补偿")
  239. elseif diff < 0 then
  240. removeitemfrombag(actor, cfgId, -diff, 0, 9999, "货币数据同步扣除")
  241. end
  242. end
  243. end
  244. end
  245. function Player.GoldCountAdd(num)
  246. if num <= 0 then
  247. return
  248. end
  249. local gold_count = getplaydef(db_gold_count) or 0
  250. setplaydef(db_gold_count, gold_count + num)
  251. end
  252. function Player.GoldCountEnough(num)
  253. if num < 0 then
  254. return false, 0
  255. end
  256. local level = getbaseinfo(actor, "level")
  257. local gold_count = getplaydef(db_gold_count) or 0
  258. local gold_max = ConfigDataManager.getById("cfg_gold_day_add", level)
  259. if gold_count > gold_max then
  260. return false, 0
  261. end
  262. if gold_max - gold_count >= num then
  263. return true, num
  264. end
  265. return true, gold_max - gold_count
  266. end