local ServerGameData = { seed = {} } local TempRewards = {} local WeightArr = {} function ServerGameData:init() if self.isInit then for k, v in pairs(self.dataMap) do v:_clear() end return end self.isInit = true self:initServerData("PlayerData", "app/server/data/server_player_data") self:initServerData("BagData", "app/server/data/server_bag_data") self:initServerData("HeroData", "app/server/data/server_hero_data") self:initServerData("ChapterData", "app/server/data/server_chapter_data") self:initServerData("FormationData", "app/server/data/server_formation_data") self:initServerData("TutorialData", "app/server/data/server_tutorial_data") end function ServerGameData:initData() self.disableSave = true self:init() if self.distinctId == nil or self.distinctId == "" then self.distinctId = LocalData:getDistinctId() end local isNewPlayer = self:getIsNewPlayer() if isNewPlayer then if EDITOR_MODE then Logger.logHighlight("create new player") end for k, v in pairs(self.dataMap) do v:init() end local playerInitialCfg = ConfigManager:getConfig("player_initial") if playerInitialCfg then for k, v in pairs(playerInitialCfg) do if v.reward then self.BagData.ItemData:addItemReward(v.reward, BIReport.ITEM_GET_TYPE.NEW_PLAYER_INITIAL) local rewardId = GFunc.getRewardId(v.reward) local rewardNum = GFunc.getRewardNum(v.reward) if rewardId == GConst.ItemConst.ITEM_ID_EXP then self.PlayerData:addExp(rewardNum) end end end local itemCfg = ConfigManager:getConfig("item") local heroCfg = ConfigManager:getConfig("hero") local heroLvCfg = ConfigManager:getConfig("hero_level") -- 如果初始化里面有碎片就直接合成 local initHeroMap = {} local items = self.BagData.ItemData:getAllItems() for idStr, item in pairs(items) do local itemInfo = itemCfg[item.cfg_id] if itemInfo and itemInfo.type == GConst.ItemConst.ITEM_TYPE.HERO_FRAGMENT then -- 英雄碎片就直接合成 local heroCfgId = itemInfo.parameter or 0 local hero = self.HeroData:getHeroByCfgId(heroCfgId) if hero == nil or hero.lv <= 0 then -- 没有此英雄的时候才自动转化,不消耗金币,且只激活1级 local heroInfo = heroCfg[heroCfgId] if heroInfo then local costKey = "cost_" .. heroInfo.qlt for k, v in ipairs(heroLvCfg) do if v[costKey] then -- 第一个有值的就是解锁所需的数量 local needCout = v[costKey][1] if item.count >= needCout then item.count = item.count - needCout self.HeroData:addHero(heroCfgId, k) initHeroMap[heroInfo.position] = heroCfgId end break end end end end end end for matchType, heroId in pairs(initHeroMap) do matchType = tostring(matchType) self.FormationData:upHeroToFormation(GConst.BattleConst.BATTLE_TYPE.STAGE, matchType, heroId) end end self:setNotNewPlayer() else for k, v in pairs(self.dataMap) do v:loadLocalData() end end self.disableSave = false end function ServerGameData:initServerData(name, path) self[name] = require(path):create() if self.dataMap == nil then self.dataMap = {} end self.dataMap[name] = self[name] end function ServerGameData:getData() local data = {} for k, v in pairs(self.dataMap) do data[k] = v:getCloneData() end return data end function ServerGameData:saveData() if self.disableSave then return end for k, v in pairs(self.dataMap) do v:saveLocalData() end LocalData:save() end -- 根据配置表添加奖励 function ServerGameData:addRewards(cfgRewards, getType) local rewards = {} if cfgRewards then local count = #TempRewards for i = 1, count do table.remove(TempRewards) end for _, reward in ipairs(cfgRewards) do local rewardType = GFunc.getRewardType(reward) if rewardType == GConst.ServerDataConst.REWARD_TYPE.ITEM then local rewardId = GFunc.getRewardId(reward) local rewardNum = GFunc.getRewardNum(reward) local cfg = ConfigManager:getItemConfig()[rewardId] if cfg.hero_drop then self:openRewardBox(TempRewards, cfg.hero_drop, rewardNum, rewardId) else table.insert(TempRewards, reward) end else table.insert(TempRewards, reward) end end count = #TempRewards for i = 1, count do local reward = table.remove(TempRewards) local newReward = self:getNewReward() local rewardType = GFunc.getRewardType(reward) newReward.type = rewardType if rewardType == GConst.ServerDataConst.REWARD_TYPE.ITEM then self.BagData.ItemData:addItemReward(reward, getType) local rewardId = GFunc.getRewardId(reward) local rewardNum = GFunc.getRewardNum(reward) if rewardId == GConst.ItemConst.ITEM_ID_EXP then self.PlayerData:addExp(rewardNum) end local item = self:getNewItem() item.cfg_id = rewardId item.count = rewardNum newReward.item = item end table.insert(rewards, newReward) end end return rewards end -- 根据配置表添加奖励 function ServerGameData:addCosts(cfgRewards, getType) local rewards = {} if cfgRewards then local count = #TempRewards for i = 1, count do table.remove(TempRewards) end for _, reward in ipairs(cfgRewards) do table.insert(TempRewards, reward) end count = #TempRewards for i = 1, count do local reward = table.remove(TempRewards) local newReward = self:getNewReward() local rewardType = GFunc.getRewardType(reward) newReward.type = rewardType if rewardType == GConst.ServerDataConst.REWARD_TYPE.ITEM then self.BagData.ItemData:addItemCost(reward, getType) local rewardId = GFunc.getRewardId(reward) local rewardNum = GFunc.getRewardNum(reward) newReward.item = { id = rewardId, num = rewardNum } end table.insert(rewards, newReward) end end return rewards end function ServerGameData:getNewReward() local rewards = { type = 0, item = {}, } return rewards end function ServerGameData:getNewItem() local item = { cfg_id = 0, count = 0 } return item end function ServerGameData:openRewardBox(finalReward, drop, num, id) local count = 0 for _, v in ipairs(drop) do if self.HeroData:getIsUnlockHero(v.id) then count = count + 1 WeightArr[count] = v end end for i = 1, num do local rewardIdx = ServerDataManager:randomReward(WeightArr, count, function (min, max) return ServerGameData:randomItemBox(id, min, max) end) table.insert(finalReward, WeightArr[rewardIdx]) end end function ServerGameData:randomItemBox(id, min, max) id = tostring(id) local seed = self.seed[id] if not seed then local str = self.distinctId .. "_ItemBox_" .. id seed = GFunc.hash(str) self.seed[id] = seed end self.seed[id] = (seed*9301 + 49297)%233280 return min + self.seed[id]*(max - min + 1)//233280 end function ServerGameData:getDistinctId() return self.distinctId end function ServerGameData:setDistinctId(distinctId) self.distinctId = distinctId end function ServerGameData:getIsNewPlayer() return LocalData:getIsNewPlayer() end function ServerGameData:setNotNewPlayer() LocalData:setNotNewPlayer() end if NOT_PUBLISH then ServerGameData.editorGetIsNewPlayer = ServerGameData.getIsNewPlayer function ServerGameData:getIsNewPlayer() return LocalData:getInt(LocalData:getDistinctId() .. LocalData.KEYS.IS_NEW_PLAYER, 0) == 0 end ServerGameData.editorSetNotNewPlayer = ServerGameData.setNotNewPlayer function ServerGameData:setNotNewPlayer() LocalData:setInt(LocalData:getDistinctId() .. LocalData.KEYS.IS_NEW_PLAYER, 1) end end return ServerGameData