| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- ---
- --- Generated by EmmyLua(https://github.com/EmmyLua)
- --- Created by zhoutao.
- --- DateTime: 2024/10/28 14:17
- ---
- Player = {}
- local filename = "Player"
- local db_world_level = "R$_world_level" -- 世界等级关键字
- local db_player_new_get_gold = "R$_player_new_get_gold" -- 新账号的第一个角色给金币
- Player.Const = {
- player_new_get_gold = 500000
- }
- local db_gold_count = "Q$_gold_count" -- 每日获得金币限制
- --- 改变角色名称
- --- @param actor table 玩家对象
- --- @param msgData table 角色名称
- function Player.changeRoleName(actor, msgData)
- local roleName = msgData["roleName"]
- -- 首次改名不再免费
- -- local isFirstChangeName = getplaydef(actor, PlayerDefKey.player.FIRST_CHANGE_NAME)
- -- if not string.isNullOrEmpty(isFirstChangeName) then
- local value = ConfigDataManager.getTableValue("cfg_global", "value", "id", GlobalConfigId.CHANGE_NAME_CARD_COST)
- local split = string.split(value, "|")
- local tmps = string.split(split[2], "#")
- local costItemId = tmps[1]
- local costCount = tmps[2]
- if not Bag.checkItem(actor, costItemId, costCount) then
- noticeTip.noticeinfo(actor, StringIdConst.TEXT346)
- return
- end
- if not checkrolename(actor, roleName) then
- jprint("角色名不合法 actor:" .. actor:toString() .. " roleName:" .. roleName)
- return
- end
- -- 从背包中移除指定数量的道具
- removeitemfrombag(actor, costItemId, costCount, 0, 9999, '角色改名')
- changerolename(actor, roleName)
- return
- -- else
- -- if not checkrolename(actor, roleName) then
- -- jprint("角色名不合法 actor:" .. actor:toString() .. " roleName:" .. roleName)
- -- return
- -- end
- -- changerolename(actor, roleName)
- -- setplaydef(actor, PlayerDefKey.player.FIRST_CHANGE_NAME, 1)
- -- end
- end
- --- 获取角色是否为首次改名
- --- @param actor table 玩家对象
- function Player.getRoleChangeNameInfo(actor)
- -- local isFirstChangeName = getplaydef(actor, PlayerDefKey.player.FIRST_CHANGE_NAME)
- -- sendluamsg(actor, LuaMessageIdToClient.RES_ROLE_IS_FIRST_CHANGE_NAME, isFirstChangeName and 1 or 0)
- -- 首次改名不再免费
- sendluamsg(actor, LuaMessageIdToClient.RES_ROLE_IS_FIRST_CHANGE_NAME, 1)
- end
- function Player.UpdateFightValue(actor)
- --默认战斗力=10*攻击+8*防御+0.25*生命+1400*1%卓越一击倍率+1160*1%幸运一击倍率+4670*1%双倍一击倍率+3400*1%攻速+3400*1%伤害加成
- local maxDC = getattrinfo(actor, "maxDC")
- local armor = getattrinfo(actor, "armor")
- local maxHP = getattrinfo(actor, "maxHP")
- local excellentDamageChance = math.max(getattrinfo(actor, "excellentDamageChance"), 1)
- local criticalDamageChance = math.max(getattrinfo(actor, "criticalDamageChance"), 1)
- local doubleDamageChance = math.max(getattrinfo(actor, "doubleDamageChance"), 1)
- local attackSpeed = math.max(getattrinfo(actor, "attackSpeed"), 1)
- local damageRate = math.max(getattrinfo(actor, "damageRate"), 1)
- local result = 10 * maxDC + 8 * armor + 0.25 * maxHP + 1400 * excellentDamageChance * 0.01 +
- 1160 * criticalDamageChance * 0.01 +
- 4670 * doubleDamageChance * 0.01 +
- 3400 * attackSpeed * 0.01 + 3400 * damageRate * 0.01
- savefightvalue(actor, result)
- end
- function Player.updateLoginInfo(actor)
- --获取玩家数据,并更新世界等级
- Player.updateWorldLevel(actor, true)
- end
- function Player.onLoginEnd(actor)
- --获取玩家数据,并更新世界等级
- Player.updateWorldLevel(actor, false)
- Player.newPlayerGetGold(actor)
- -- Player.updateCurrency(actor)
- callonserial(actor,"_updatecurrency")
- end
- function Player.onLevelUp(actor)
- --获取玩家数据,并更新世界等级
- Player.updateWorldLevel(actor, true)
- end
- function Player.enterMap(actor)
- --获取玩家数据,并更新世界等级
- Player.updateWorldLevel(actor, true)
- end
- -- 内置经验只有泡点和杀怪有经验加成
- -- 这个方法复刻内置经验加成计算,用来计算实际加成后的经验
- -- 仅直接发经验奖励可调用,地图经验衰减,怪物衰减在这不适用
- function Player.calculExpByAddRate(actor, originExp)
- local finalExp = originExp
- finalExp = Player.applyExpModification(actor, finalExp, 19, true)
- finalExp = Player.applyExpModification(actor, finalExp, 20, false)
- finalExp = finalExp * TripleIncome.GetRate(actor)
- -- 应用线路经验倍率
- finalExp = LineManager.applyExpRate(actor, finalExp)
- return finalExp
- end
- function Player.applyExpModification(actor, exp, type, isAdd)
- local tableList = ConfigDataManager.getTable("cfg_att_special", "type", type)
- for _, t in pairs(tableList) do
- local attrId = tonumber(t.id)
- local attrName = attrid2name(actor, attrId)
- local attrValue = getattrinfo(actor, attrName)
- if isAdd then
- exp = attrValue * exp + exp
- else
- exp = exp - attrValue * exp;
- end
- end
- return exp
- end
- function Player.calWorldLevelExpRate(actor)
- local roleLevel = getbaseinfo(actor, "level")
- local worldLevel = getsysvar(actor, db_world_level) or 0
- local levelDistance = math.floor((worldLevel - roleLevel) / 10.0)
- -- info("Player.calWorldLevelExpRate levelDistance:" .. levelDistance .. " 角色等级:" .. roleLevel .. " 世界等级:" .. worldLevel)
- if levelDistance > 10 then
- return 200
- elseif levelDistance > 0 then
- return levelDistance * 20
- end
- return 0
- end
- function Player.calWorldLevel()
- local roles = getallrolesummaryinfos()
- local allRoles = {}
- if roles then
- for _, role in ipairs(roles) do
- local actor = role["actor"]
- local buidRole = Player.buildOneRole(actor)
- table.insert(allRoles, buidRole)
- end
- table.sort(allRoles, function(a, b)
- if a.level == b.level then
- return a.rid > b.rid
- else
- return a.level > b.level
- end
- end)
- local levelNum = 0
- local levelCount = 0
- for i = 1, 50 do
- if #allRoles < i then
- break
- end
- levelNum = levelNum + allRoles[i].level
- levelCount = levelCount + 1
- end
- -- info("Player.calWorldLevel levelNum:" .. levelNum .. " levelCount:" .. levelCount)
- return math.floor(levelNum / levelCount)
- end
- return 0
- end
- function Player.buildOneRole(actor)
- local role = {}
- role["actor"] = actor
- role["rid"] = getbaseinfo(actor, "id")
- role["level"] = getbaseinfo(actor, "level")
- return role
- end
- function Player.updateWorldLevel(actor, needForceSendMsg)
- --获取玩家数据,并更新世界等级
- local data = getplayermaininfo(actor)
- local playerLevel = 0
- if data ~= nil and data.level ~= nil then
- playerLevel = data.level
- end
- local worldLevel = getsysvar(actor, db_world_level) or 0
- -- if data ~= nil and data.level ~= nil then
- -- 更新世界等级,世界等级计算按照服务器前50名的平均等级计算
- if worldLevel < playerLevel then
- local newWorldLevel = Player.calWorldLevel()
- setsysvar(actor, db_world_level, newWorldLevel)
- if newWorldLevel < playerLevel then
- local allPlayer = getallplayer(actor)
- if allPlayer ~= nil then
- for i = 1, #allPlayer do
- local player = getactor(actor, allPlayer[i])
- sendluamsg(player, LuaMessageIdToClient.RES_ROLE_INFO, { newWorldLevel })
- local expRate = Player.calWorldLevelExpRate(actor) * 100
- ExpBonus.changeBonus(actor, BonusType.WORLD_LEVEL_EXP_BONUS, expRate, 0, 0)
- end
- end
- return
- end
- -- end
- end
- if needForceSendMsg then
- sendluamsg(actor, LuaMessageIdToClient.RES_ROLE_INFO, { worldLevel })
- local expRate = Player.calWorldLevelExpRate(actor) * 100
- ExpBonus.changeBonus(actor, BonusType.WORLD_LEVEL_EXP_BONUS, expRate, 0, 0)
- end
- end
- function Player.newPlayerGetGold(actor)
- local uid = getbaseinfo(actor, "uid")
- local isNewPlayerForGold = getsysvar(db_player_new_get_gold..uid) or 0
- if isNewPlayerForGold <= 0 then
- additemtobag(actor, 10010001, Player.Const.player_new_get_gold, 0, 9999, "新账号金币福利")
- setsysvar(actor, db_player_new_get_gold..uid, 1)
- sendluamsg(actor, LuaMessageIdToClient.RES_NEW_PLAYER_FOR_GOLD, {})
- return
- end
-
- -- sendluamsg(actor, LuaMessageIdToClient.RES_NEW_PLAYER_FOR_GOLD, {})
- end
- -- 更新货币数据
- -- function Player.updateCurrency(actor)
- function _updatecurrency(actor)
- local uid = getbaseinfo(actor, "uid")
- local mData = getsysvar(actor, "R$MoneyData_"..uid)
- if mData == nil then
- mData = {}
- local ListInfo = getrolelist(actor,uid)
- for _, roleInfo in pairs(ListInfo) do
- local rid = roleInfo["id"]
- local player = getactor(rid)
- for _,cfgId in pairs({10010001,10020001,10040001,10050001 }) do
- local num = getbagitemcountbyid(player, cfgId) or 0
- mData[cfgId] = num + (mData[cfgId] or 0)
- end
- end
- setsysvar(actor, "R$MoneyData_"..uid, mData)
- end
- for cfgId, count in pairs(mData) do
- local num = getbagitemcountbyid(actor, cfgId) or 0
- if num ~= count then
- -- info("Player.updateCurrency-> ", actor, cfgId, num, count)
- local diff = count - num
- if diff > 0 then
- additemtobag(actor, cfgId, diff, 0, 9999, "货币数据同步补偿")
- elseif diff < 0 then
- removeitemfrombag(actor, cfgId, -diff, 0, 9999, "货币数据同步扣除")
- end
- end
- end
- end
- function Player.GoldCountAdd(num)
- if num <= 0 then
- return
- end
- local gold_count = getplaydef(db_gold_count) or 0
- setplaydef(db_gold_count, gold_count + num)
- end
- function Player.GoldCountEnough(num)
- if num < 0 then
- return false, 0
- end
- local level = getbaseinfo(actor, "level")
- local gold_count = getplaydef(db_gold_count) or 0
- local gold_max = ConfigDataManager.getById("cfg_gold_day_add", level)
- if gold_count > gold_max then
- return false, 0
- end
- if gold_max - gold_count >= num then
- return true, num
- end
- return true, gold_max - gold_count
- end
|