c1_lua/lua/app/userdata/player/player_data.lua
2023-11-15 16:41:43 +08:00

601 lines
15 KiB
Lua

local PlayerData = class("PlayerData", BaseData)
local RECHARGE_CFG = ConfigManager:getConfig("recharge")
function PlayerData:ctor()
self.data.dirty = false
end
function PlayerData:clear()
DataManager:unregisterCrossDayFunc("PlayerData")
end
function PlayerData:init(data)
local basicInfo = data.basic_info or GConst.EMPTY_TABLE
local stat = data.stat or GConst.EMPTY_TABLE
self.data.level = basicInfo.level or 1
self.data.exp = basicInfo.exp or 0
self.lvUpNeedExp = self:getNextExp(self.data.level)
self.data.payAmount = 0
self.data.payCount = 0
self.data.adCount = stat.ad_count or 0
self.pay_counts = stat.pay_counts or {}
self.register_ts = GFunc.formatTimeStep(stat.register_ts or Time:getServerTime())
if stat.pay_counts then
for id, count in pairs(stat.pay_counts) do
if RECHARGE_CFG[id] then
self.data.payAmount = self.data.payAmount + (RECHARGE_CFG[id].price or 0) * count
self.data.payCount = self.data.payCount + count
end
end
end
if stat.internal ~= nil then
self.internal = stat.internal
end
if data.game_version then
self.game_version = data.game_version
end
if self.data.playInfo == nil then
self.data.playInfo = {}
end
self.data.playInfo.nickName = basicInfo.name
self.data.playInfo.nameChanged = basicInfo.name_changed
self.data.playInfo.usingAvatarId = basicInfo.avatar
self.data.playInfo.usingFrameId = basicInfo.avatar_frame
self.data.playInfo.unlockAvatar = data.bag.avatars
self.data.playInfo.unlockFrame = data.bag.avatar_frames
if EDITOR_MODE then
Logger.printTable(self.data.playInfo)
end
-- 体力购买情况初始化
local energyLimit = data.energy_limit or GConst.EMPTY_TABLE
self.data.vitGemCount = energyLimit.diamond_count or 0
self.data.vitADCount = energyLimit.ad_count or 0
self.lastLoginTime = basicInfo.lastLoginTime or Time:getBeginningOfServerToday()
DataManager:registerCrossDayFunc("PlayerData", function()
self:resetOnCrossDay()
self:markDirty()
end)
self.createTime = basicInfo.create_at or 0 -- 创角时间
local time = data.now_ts or 0
if math.abs(self.createTime - time) <= 3000 then -- 认为是新号初次登录
local vit = self:getMaxVit()
BIReport:postVitGet(vit, BIReport.ITEM_GET_TYPE.NEW_PLAYER_INITIAL, vit)
end
self:initModuleUnlockInfo()
end
-- 竞技场入场券购买情况初始化
function PlayerData:initArena(gemCount, adCount)
self.data.arenaTicketGemCount = gemCount or 0
self.data.arenaTicketADCount = adCount or 0
end
function PlayerData:initModuleUnlockInfo()
self.showModuleUnlockChapter = 0
if self.moduleUnlockChapterMap then
return
end
self.moduleUnlockChapterMap = {}
local cfg = ConfigManager:getConfig("func_open")
for name, info in pairs(cfg) do
if info.pop_ups == nil and info.stage and name ~= "arena_open" then
self.moduleUnlockChapterMap[info.stage] = true
end
end
Logger.printTable(self.moduleUnlockChapterMap)
end
function PlayerData:resetOnCrossDay()
self.data.vitGemCount = 0
self.data.vitADCount = 0
self.data.arenaTicketGemCount = 0
self.data.arenaTicketADCount = 0
end
function PlayerData:markDirty()
self.data.dirty = not self.data.dirty
end
function PlayerData:setVit(vit)
self.vit = vit
end
function PlayerData:getVit()
return self.vit or 0
end
function PlayerData:getMaxVit()
if self.maxVit == nil then
self.maxVit = ConfigManager:getConfig("recovery")[GConst.ItemConst.ITEM_ID_VIT].limit
end
return self.maxVit
end
function PlayerData:getMaxLv()
return ConfigManager:getConfigNum("player_exp")
end
function PlayerData:addExp(exp)
self.data.exp = self.data.exp + exp
if self.data.level >= self:getMaxLv() then
return
end
self:markDirty()
end
function PlayerData:setLv(level, exp)
local beforeLv = self.data.level or 0
self.data.level = level
self.data.exp = exp
self.lvUpNeedExp = self:getNextExp(self.data.level)
self:markDirty()
local data = {}
data.player_level = self.data.level
CS.ThinkingAnalytics.ThinkingAnalyticsAPI.UserSet(data)
BIReport:postLvEvent(beforeLv, level)
end
function PlayerData:getLv()
return self.data.level
end
function PlayerData:getNextExp(lv)
lv = lv or self.data.level
local cfg = ConfigManager:getConfig("player_exp")
if not cfg[lv] then
return 1
end
return cfg[lv].need_exp
end
function PlayerData:getExpPercent()
return self.data.exp / self.lvUpNeedExp
end
function PlayerData:getIfCanLevelUp()
if self.data.level >= self:getMaxLv() then
return false
end
return self.data.exp >= self.lvUpNeedExp
end
function PlayerData:getAccountInfo()
if not self.accountInfo then
self.accountInfo = LocalData:getAccountInfo()
end
return self.accountInfo
end
function PlayerData:getAcountId()
return self:getAccountInfo().id or GConst.EMPTY_STRING
end
function PlayerData:addVitGemBuyCount()
self.data.vitGemCount = self.data.vitGemCount + 1
end
function PlayerData:addVitAdBuyCount()
self.data.vitADCount = self.data.vitADCount + 1
end
function PlayerData:getVitGemBuyCount()
return self.data.vitGemCount
end
function PlayerData:getVitAdBuyCount()
return self.data.vitADCount
end
-- 获取玩家支付总额
function PlayerData:getTotalPayAmount()
return self.data.payAmount or 0
end
-- 支付回调中调用
function PlayerData:addPayment(rechargeId)
local cfg = ConfigManager:getConfig("recharge")[rechargeId]
self.data.payAmount = self.data.payAmount + cfg.price
self.data.payCount = self.data.payCount + 1
self.pay_counts[rechargeId] = (self.pay_counts[rechargeId] or 0) + 1
end
function PlayerData:getPayCount()
return self.data.payCount
end
function PlayerData:getPayCounts(rechargeId)
return self.pay_counts[rechargeId] or 0
end
function PlayerData:addPayCount()
self.data.payCount = self.data.payCount + 1
end
function PlayerData:getAdCount()
return self.data.adCount
end
function PlayerData:addAdCount()
self.data.adCount = self.data.adCount + 1
end
-- 获取创角时间
function PlayerData:getCreateTime()
return self.createTime
end
-- 获取玩家是否可以显示功能解锁
function PlayerData:getIfCanShowModuleUnlock()
return self.showModuleUnlockChapter > 0
end
function PlayerData:markShowModuleUnlock()
self.showModuleUnlockChapter = 0
end
function PlayerData:getModuleUnlockChapter()
return self.showModuleUnlockChapter
end
function PlayerData:checkIfCanShowModuleUnlock(chapterId)
if self.moduleUnlockChapterMap == nil then
return
end
if not self.moduleUnlockChapterMap[chapterId] then
return
end
self.showModuleUnlockChapter = chapterId
end
-- 头像------------------------------------------------------------------------------------
-- 获取玩家昵称
function PlayerData:getNickname()
if self.data.playInfo.nickName == nil or #self.data.playInfo.nickName == 0 then
return I18N:getGlobalText(I18N.GlobalConst.NEW_PLAYER)
end
return self.data.playInfo.nickName
end
-- 设置玩家昵称
function PlayerData:setNickname(name)
self.data.playInfo.nickName = name
self.data.playInfo.nameChanged = true
self:markDirty()
end
-- 是否可以免费修改昵称
function PlayerData:isFreeRename()
return not self.data.playInfo.nameChanged
end
-- 获取修改昵称的花费
function PlayerData:getRenameCost()
return GFunc.getConstReward("change_name_cost")
end
-- 头像------------------------------------------------------------------------------------
-- 获取玩家当前使用的头像
function PlayerData:getUsingAvatarId()
return self.data.playInfo.usingAvatarId
end
-- 设置玩家使用的头像
function PlayerData:setAvatarUsing(id)
self.data.playInfo.usingAvatarId = id
self:markDirty()
end
-- 获取头像icon id
function PlayerData:getAvatarIconId(id)
local cfg = ConfigManager:getConfig("avatar")[id]
if cfg then
return cfg.iconId
end
end
-- 头像是否解锁
function PlayerData:isAvatarUnlock(id)
if self.data.playInfo.unlockAvatar == nil then
return false
end
return self.data.playInfo.unlockAvatar[id] ~= nil
end
-- 设置头像解锁
function PlayerData:setAvatarUnlock(id)
Logger.logHighlight("解锁头像:"..id)
if self.data.playInfo.unlockAvatar == nil then
self.data.playInfo.unlockAvatar = {}
end
self.data.playInfo.unlockAvatar[id] = Time:getServerTime()
self:setNewAvatarStatus(id, true)
end
-- 获取头像描述
function PlayerData:getAvatarDesc(id)
return I18N:getText("avatar", id, "desc")
end
-- 是否有新头像
function PlayerData:hasNewAvatar()
local newIds = LocalData:getNewAvatarAndFrame()
if newIds.avatar == nil or #newIds.avatar == 0 then
return false
end
return true
end
-- 是否是新头像
function PlayerData:isNewAvatar(id)
local newIds = LocalData:getNewAvatarAndFrame()
if newIds.avatar ~= nil then
return table.containValue(newIds.avatar, id)
end
return false
end
-- 设置新头像状态
function PlayerData:setNewAvatarStatus(id, isNew)
local newIds = LocalData:getNewAvatarAndFrame()
if newIds.avatar == nil then
newIds.avatar = {}
end
if isNew then
table.insert(newIds.avatar, id)
else
table.removebyvalue(newIds.avatar, id, true)
end
LocalData:setNewAvatarAndFrame(newIds)
self:markDirty()
end
-- 是否显示头像(已解锁+未解锁可显示)
function PlayerData:isShowAvatar(id)
if self:isAvatarUnlock(id) then
return true
end
-- 判断未解锁时是否显示
return not ConfigManager:getConfig("avatar")[id].unlock_show
end
-- 获取可以显示的所有头像id
function PlayerData:getShowAvatarIds()
local unlockIds = table.keys(self.data.playInfo.unlockAvatar)
local lockIds = {}
for id, data in pairs(ConfigManager:getConfig("avatar")) do
if (not self:isAvatarUnlock(id)) and self:isShowAvatar(id) then
table.insert(lockIds, id)
end
end
table.sort(unlockIds, function(a, b)
return a < b
end)
table.sort(lockIds, function(a, b)
return a < b
end)
return table.addArray(unlockIds, lockIds)
end
-- 获取可解锁的头像id列表
function PlayerData:getCanUnlockAvatarIds(checkData)
local ids = {}
if type(checkData) == "table" then
-- 判断items解锁
for index, reward in ipairs(checkData) do
if reward.type == GConst.REWARD_TYPE.ITEM and ConfigManager:getConfig("item")[reward.item.id].type == GConst.ItemConst.ITEM_TYPE.AVATAR then
for id, data in pairs(ConfigManager:getConfig("avatar")) do
if not self:isAvatarUnlock(id) and data.item == reward.item.id then
table.insert(ids, id)
end
end
end
end
elseif type(checkData) == "number" then
-- 判断hero解锁
for id, data in pairs(ConfigManager:getConfig("avatar")) do
if not self:isAvatarUnlock(id) and data.hero == checkData then
table.insert(ids, id)
end
end
end
return ids
end
-- 获取头像背景
function PlayerData:getAvatarBg(id)
local cfg = ConfigManager:getConfig("avatar")[id]
if cfg and cfg.hero then
-- hero来源
local hero = ConfigManager:getConfig("hero")[cfg.hero]
return hero and GConst.HERO_SMALL_FRAME_QLT[hero.qlt]
elseif cfg and cfg.item then
-- item来源
local item = ConfigManager:getConfig("item")[cfg.item]
return item and GConst.HERO_SMALL_FRAME_QLT[item.qlt]
end
return nil
end
-- 头像框-----------------------------------------------------------------------------------
-- 获取玩家当前使用的头像框
function PlayerData:getUsingFrameId()
return self.data.playInfo.usingFrameId
end
-- 设置玩家使用的头像框
function PlayerData:setFrameUsing(id)
self.data.playInfo.usingFrameId = id
self:markDirty()
end
-- 获取框icon id
function PlayerData:getFrameIconId(id)
local cfg = ConfigManager:getConfig("avatar_frame")[id]
if cfg then
return cfg.iconId
end
end
-- 头像框是否解锁
function PlayerData:isFrameUnlock(id)
if self.data.playInfo.unlockFrame == nil then
return false
end
return self.data.playInfo.unlockFrame[id] ~= nil
end
-- 设置头像框解锁
function PlayerData:setFrameUnlock(id)
Logger.logHighlight("解锁头像框:"..id)
if self.data.playInfo.unlockFrame == nil then
self.data.playInfo.unlockFrame = {}
end
self.data.playInfo.unlockFrame[id] = Time:getServerTime()
self:setNewFrameStatus(id, true)
end
-- 获取头像框描述
function PlayerData:getFrameDesc(id)
return I18N:getText("avatar_frame", id, "desc")
end
-- 是否有新头像框
function PlayerData:hasNewFrame()
local newIds = LocalData:getNewAvatarAndFrame()
if newIds.frame == nil or #newIds.frame == 0 then
return false
end
return true
end
-- 是否是新头像框
function PlayerData:isNewFrame(id)
local newIds = LocalData:getNewAvatarAndFrame()
if newIds.frame ~= nil then
return table.containValue(newIds.frame, id)
end
return false
end
-- 设置新头像框状态
function PlayerData:setNewFrameStatus(id, isNew)
local newIds = LocalData:getNewAvatarAndFrame()
if newIds.frame == nil then
newIds.frame = {}
end
if isNew then
table.insert(newIds.frame, id)
else
table.removebyvalue(newIds.frame, id, true)
end
LocalData:setNewAvatarAndFrame(newIds)
self:markDirty()
end
-- 是否显示头像框(已解锁+未解锁可显示)
function PlayerData:isShowFrame(id)
if self:isFrameUnlock(id) then
return true
end
-- 判断未解锁时是否显示
local lock_show = ConfigManager:getConfig("avatar_frame")[id].unlock_show
if lock_show ~= nil then
return not lock_show
else
return true
end
end
-- 获取可以显示的所有头像框id(已解锁小id>已解锁大id>未解锁小id>未解锁大id)
function PlayerData:getShowFrameIds()
local unlockIds = table.keys(self.data.playInfo.unlockFrame)
local lockIds = {}
for id, data in pairs(ConfigManager:getConfig("avatar_frame")) do
if (not self:isFrameUnlock(id)) and self:isShowFrame(id) then
table.insert(lockIds, id)
end
end
table.sort(unlockIds, function(a, b)
return a < b
end)
table.sort(lockIds, function(a, b)
return a < b
end)
return table.addArray(unlockIds, lockIds)
end
-- 获取可解锁的头像框id列表
function PlayerData:getCanUnlockFrameIds(checkData)
local ids = {}
if type(checkData) == "table" then
-- 判断items解锁
for index, reward in ipairs(checkData) do
if reward.type == GConst.REWARD_TYPE.ITEM and ConfigManager:getConfig("item")[reward.item.id].type == GConst.ItemConst.ITEM_TYPE.FRAME then
for id, data in pairs(ConfigManager:getConfig("avatar_frame")) do
if not self:isFrameUnlock(id) and data.item == reward.item.id then
table.insert(ids, id)
end
end
end
end
end
return ids
end
-- 竞技场入场券
function PlayerData:getArenaTicket()
return self.arenaTicket or 0
end
function PlayerData:getArenaTicketGemBuyCount()
return self.data.arenaTicketGemCount
end
function PlayerData:getArenaTicketAdBuyCount()
return self.data.arenaTicketADCount
end
function PlayerData:setArenaTicket(ticket)
self.arenaTicket = ticket
end
function PlayerData:getMaxArenaTicket()
if self.maxArenaTicket == nil then
self.maxArenaTicket = ConfigManager:getConfig("recovery")[GConst.ItemConst.ITEM_ID_ARENA_TICKET].limit
end
return self.maxArenaTicket
end
function PlayerData:addArenaTicketGemBuyCount()
self.data.arenaTicketGemCount = self.data.arenaTicketGemCount + 1
end
function PlayerData:addArenaTicketAdBuyCount()
self.data.arenaTicketADCount = self.data.arenaTicketADCount + 1
end
function PlayerData:getRegisterTs()
return self.register_ts or Time:getServerTime()
end
function PlayerData:getIsInternal()
return self.internal
end
-- 服务器下发的版本号,跟客户端版本号不一致
function PlayerData:getGameVersion()
return self.game_version
end
return PlayerData