192 lines
5.1 KiB
Lua
192 lines
5.1 KiB
Lua
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("HeroData", "app/server/data/server_hero_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 |