c1_lua/lua/app/server/server_game_data.lua
2023-04-08 17:52:36 +08:00

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