local PlayerData = class("PlayerData", BaseData) local RECHARGE_CFG = ConfigManager:getConfig("recharge") local PlayerExpCfg = ConfigManager:getConfig("player_exp") function PlayerData:ctor() self.data.isDirty = 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:setDirty() end) self.createTime = (basicInfo.create_at or 0) // 1000 -- 创角时间 local time = (data.now_ts or 0) // 1000 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 _, info in pairs(cfg) do if info.pop_ups == nil and info.stage 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:setDirty() self.data.dirty = not self.data.dirty end function PlayerData:getAuthInfo() return self.auth end function PlayerData:setAuthInfo(authInfo) self.auth = authInfo or {} self:setDirty() end function PlayerData:setVit(vit) self.vit = vit end function PlayerData:getVit() return self.vit or 0 end function PlayerData:getMaxVit() local isCardOpen = DataManager.PrivilegeCardData:getIsMonthlyCardActive() local cfg = ConfigManager:getConfig("recovery")[GConst.ItemConst.ITEM_ID_VIT] local maxVit = isCardOpen and cfg.monthly_card or cfg.limit return 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:setDirty() 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:setDirty() 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 ModuleManager.TaskManager:addTaskProgress(GConst.TaskConst.TASK_TYPE.X_BUY_ANYONE) 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:getCreateDay() local time = self:getCreateTime() time = Time:getDayBeginTimeStamp(time) return (Time:getServerTime() - time) // GConst.SECONDS_PRE_DAY + 1 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:setDirty() 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:setDirty() 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:setDirty() 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 then local itemCfg = ConfigManager:getConfig("item")[reward.item.id] -- 头像道具、皮肤道具可解锁头像 if itemCfg.type == GConst.ItemConst.ITEM_TYPE.AVATAR or itemCfg.type == GConst.ItemConst.ITEM_TYPE.SKIN 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 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:setDirty() 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:setDirty() 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 --region 特权卡 -- 免广告卡相关 function PlayerData:getNoAdFuncOpen() return ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.CARD_AD, true) end function PlayerData:getNoAdActive() return DataManager.PrivilegeCardData:getIsCardActive(GConst.ShopConst.PRIVILEGE_CARD_ID.CARD_AD) end function PlayerData:getNoAdPrice() local cfg = DataManager.ShopData:getActGiftConfig(GConst.ShopConst.PRIVILEGE_CARD_ID.CARD_AD) if cfg == nil then return end return GFunc.getFormatPrice(cfg.recharge_id) end --endregion --@region 玩家经验 function PlayerData:getPlayerExpCfg() return PlayerExpCfg end --@endregion --@region 战斗力 function PlayerData:getShowPower() if self.curPower == nil then self:calcPower() end return self.curPower end function PlayerData:getLastPower() return self.lastPower or 0 end function PlayerData:clearLastPower() self.lastPower = nil end -- 计算战斗力 function PlayerData:calcPower() if self.lastPower then self.lastPower = self.curPower end local attrPower = 0 local formation = DataManager.FormationData:getStageFormation() for matchType, heroEntity in pairs(formation) do -- 属性战力 for attrName, value in pairs(heroEntity:getAllAttr()) do local cfg = GFunc.getAttrNameCfg()[attrName] if cfg and cfg.power then -- 特殊处理,玩家基础暴击伤害不算 if attrName == GConst.BattleConst.ATTR_NAME.CRIT_TIME then value = value - 15000 end attrPower = attrPower + math.floor(value * cfg.power / GConst.DEFAULT_FACTOR + 0.0000001) end end end -- -- 天赋战力 -- local talentPower = DataManager.TalentData:getPower() -- -- 英雄战力 -- local forcePower = DataManager.ForceData:getPower() -- -- 英雄皮肤战力 -- local forceSkinPower = DataManager.ForceData:getSkinPower() -- -- 英雄装备战力 -- local equipPower = DataManager.ForceEquipData:getPower() -- -- 领主时装战力 -- local skinPower = DataManager.SkinData:getPower() -- -- 宝物战力 -- local collectionPower = DataManager.CollectionData:getPower() -- -- 防线战力 -- local defenseLinePower = DataManager.DefenseLineData:getPower() -- -- 防线皮肤战力 -- local defenseLineSkinPower = DataManager.DefenseLineData:getSkinPower() -- -- 宠物战力 -- local petPower = DataManager.PetData:getPower() -- -- 魔法书战力 -- local magicBookPower = DataManager.MagicBookData:getPower() -- -- 魔法阵战力 -- local magicCirclePower = DataManager.MagicCircleData:getPower() self.curPower = 0 self.curPower = self.curPower + attrPower -- self.curPower = self.curPower + talentPower -- self.curPower = self.curPower + forcePower -- self.curPower = self.curPower + forceSkinPower -- self.curPower = self.curPower + equipPower -- self.curPower = self.curPower + skinPower -- self.curPower = self.curPower + collectionPower -- self.curPower = self.curPower + defenseLinePower -- self.curPower = self.curPower + defenseLineSkinPower -- self.curPower = self.curPower + petPower -- self.curPower = self.curPower + magicBookPower -- self.curPower = self.curPower + magicCirclePower -- if EDITOR_MODE and self:getIsSelf() then -- Logger.logHighlight("PlayerEntity 总战力:" .. self.curPower) -- Logger.logHighlight("PlayerEntity 属性战力:" .. attrPower) -- Logger.logHighlight("PlayerEntity 天赋战力:" .. talentPower) -- Logger.logHighlight("PlayerEntity 英雄战力:" .. forcePower) -- Logger.logHighlight("PlayerEntity 英雄皮肤战力:" .. forceSkinPower) -- Logger.logHighlight("PlayerEntity 英雄装备战力:" .. equipPower) -- Logger.logHighlight("PlayerEntity 领主时装战力:" .. skinPower) -- Logger.logHighlight("PlayerEntity 宝物战力:" .. collectionPower) -- Logger.logHighlight("PlayerEntity 防线战力:" .. defenseLinePower) -- Logger.logHighlight("PlayerEntity 防线皮肤战力:" .. defenseLineSkinPower) -- Logger.logHighlight("PlayerEntity 宠物战力:" .. petPower) -- Logger.logHighlight("PlayerEntity 魔法书战力:" .. magicBookPower) -- Logger.logHighlight("PlayerEntity 魔法阵战力:" .. magicCirclePower) -- end if self:getIsSelf() then if not self.lastPower then self.lastPower = self.curPower end if self.lastPower ~= self.curPower then self:setPowerDirty() end end end function PlayerData:setPowerDirty() self.data.isPowerDirty = not self.data.isPowerDirty end --@endregion return PlayerData