local ServerGameData = { seed = {} } local TempRewards = {} function ServerGameData:init() if self.isInit then 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("ChapterData", "app/server/data/server_chapter_data") end function ServerGameData:initData() self:init() if self.distinctId == nil or self.distinctId == "" then self.distinctId = LocalData:getDistinctId() end local isNewPlayer = LocalData:getIsNewPlayer() if isNewPlayer then for k, v in pairs(self.dataMap) do v:loadNewPlayerData() end local playerInitialCfg = ConfigManager:getConfig("player_initial") if playerInitialCfg then for k, v in pairs(playerInitialCfg) do if v.reward then self:addReward(v.reward) end end end LocalData:setNotNewPlayer() else for k, v in pairs(self.dataMap) do v:loadLocalData() end end 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: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.box_drop then self:openRewardBox(TempRewards, cfg.box_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: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:addRewards(cfgReward, getType) if cfgReward == nil then return end local count = #TempRewards for i = 1, count do table.remove(TempRewards) end local rewardType = GFunc.getRewardType(cfgReward) if rewardType == GConst.ServerDataConst.REWARD_TYPE.ITEM then local rewardId = GFunc.getRewardId(cfgReward) local rewardNum = GFunc.getRewardNum(cfgReward) local cfg = ConfigManager:getItemConfig()[rewardId] if cfg.box_drop then self:openRewardBox(TempRewards, cfg.box_drop, rewardNum, rewardId) else table.insert(TempRewards, cfgReward) end else table.insert(TempRewards, cfgReward) end count = #TempRewards for i = 1, count do local reward = table.remove(TempRewards) local rewardType = GFunc.getRewardType(reward) if rewardType == GConst.ServerDataConst.REWARD_TYPE.ITEM then self.BagData: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 end end 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 weightArr = {} for _, v in ipairs(drop) do table.insert(weightArr, v.weight) end for i = 1, num do local rewardIdx = ServerDataManager:randomReward(weightArr, function (min, max) return ServerGameData:randomItemBox(id, min, max) end) table.insert(finalReward, drop[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 return ServerGameData