--- --- 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