c1_lua/lua/app/server/server_game_data.lua
2023-04-10 17:56:15 +08:00

200 lines
5.7 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local ServerGameData = {
seed = {}
}
local TempRewards = {}
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")
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: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 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)
end
break
end
end
end
end
end
end
end
self:saveData()
LocalData:setNotNewPlayer()
LocalData:save()
else
for k, v in pairs(self.dataMap) do
v:init(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:saveData()
for k, v in pairs(self.dataMap) do
v:saveLocalData()
end
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.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: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