HomeServer/Server/AllServer/GameServer/Activity/ActivityMatchStuff.lua
2024-11-20 15:41:37 +08:00

715 lines
23 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 skynet = require "skynet"
local oo = require "Class"
local log = require "Log"
local pb = require "pb"
local dataType = require "DataType"
local errorInfo = require "ErrorInfo"
local activity = require "Activity"
local json =require "json"
local ActivityMatchStuff = oo.class()
ActivityMatchStuff.ActivityType = dataType.ActivityType_MatchStuff
--构造函数
function ActivityMatchStuff:Init()
end
-- 每次登录需要进行修改的数据
function ActivityMatchStuff:LoginInitData(player)
--log.debug("好物匹配 登录初始化")
-- 重置红点
skynet.server.msgTips:Reset(player, 104)
skynet.server.msgTips:Reset(player, 105)
--获取玩家数据 检查活动是否结束,并结算银星币
if not next(player.gameData.matchStuffMap) then
return
end
--获取开启的活动
local activityId, startTime, endTime, id = activity:GetActivityInfo(player, ActivityMatchStuff.ActivityType)
--循环配置
--没有开启的活动处理银星币结算
for key, matchStuff in pairs(player.gameData.matchStuffMap) do
if (key ~= activityId and activityId == 0) and not matchStuff.isSettle then
self:settle(player,matchStuff)
return
end
end
end
function ActivityMatchStuff:settle(player,matchStuff)
-- 查询道具是否足够-道具id 是26 银星币 这里写死以往规则
local goodsCount=skynet.server.bag:GetGoodsCount(player,dataType.GoodsType_Prop, 26)
if goodsCount<=0 then
log.debug(string.format("银星币无需结算,玩家:%s,银星币数量:%d",player.userId,skynet.server.bag:GetGoodsCount(player,dataType.GoodsType_Prop, 26)))
matchStuff.isSettle = true
return
end
local cfgSValue = skynet.server.gameConfig:GetAllCfg( "SValue")
--计算可以获取的金币数量
local coinCount= goodsCount * tonumber(cfgSValue.silverCoinIntegralCoin)
if coinCount<tonumber(cfgSValue.silverCoinIntegralCoinLimit) then
coinCount=tonumber(cfgSValue.silverCoinIntegralCoinLimit)
end
--扣除道具--道具id 是26 银星币 这里写死以往规则
skynet.server.bag:RemoveGoods(player,dataType.GoodsType_Prop, 26,goodsCount)
--发放金币
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_117")
player:MoneyChange(pb.enum("EnumGoodsType","Coin") , coinCount , eventId)
matchStuff.isSettle = true
end
--初始玩家数据
function ActivityMatchStuff:CheckData(player)
if player==nil then
--log.debug("好物匹配活动checkdata player is nil")
return 0
end
--获取开启的活动
local activityId, startTime, endTime, id = activity:GetActivityInfo(player, ActivityMatchStuff.ActivityType)
--没有开启的活动
if activityId == 0 then
--log.debug("好物匹配活动未开启-未获取到有效的活动1")
return 0
end
local cfgActivity = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity")
if cfgActivity == nil then
--log.debug("好物匹配活动未开启-未获取到有效的活动2")
return 0
end
local ifContain = false
for index, v in pairs(cfgActivity) do
if v.id==id and v.level<=player.gameData.level then
ifContain=true
break
end
end
if not ifContain then
--log.debug("好物匹配活动未开启-玩家未满足条件")
return 0
end
--初始化
if player.gameData.matchStuffMap==nil then
player.gameData.matchStuffMap={}
end
--如果玩家已经存在活动,检查是否需要重置数据
if player.gameData.matchStuffMap[activityId] then
--获取当前时间
local now = os.date("*t", skynet.GetTime())
local today = os.time({ year = now.year, month=now.month, day=now.day })
--是否需要重置数据
if player.gameData.matchStuffMap[activityId].ActivityTime==nil
or player.gameData.matchStuffMap[activityId].ActivityTime~=today then
--获取配置
local cfMatchStuff=self:GetMatchStuffConfig(player,activityId)
player.gameData.matchStuffMap[activityId].ActivityTime=today
--重置数据
player.gameData.matchStuffMap[activityId].magnifierAd=cfMatchStuff~=nil and cfMatchStuff.magnifierAd or 0 --广告次数
player.gameData.matchStuffMap[activityId].magnifierDaily=cfMatchStuff~=nil and cfMatchStuff.magnifierDaily or 0--剩余放大镜次数
end
--删除过期活动,减少数据产生
local removeKeyList = {}
for exceedActivityId, value in pairs(player.gameData.matchStuffMap) do
if exceedActivityId ~= activityId and value.id ~= id then
table.insert(removeKeyList, exceedActivityId)
end
end
if next(removeKeyList) then
for _, removeKey in ipairs(removeKeyList) do
player.gameData.matchStuffMap[removeKey]=nil
end
end
return activityId
end
local levelId=0
local magnifierDaily=0
local magnifierAd=0
local cfMatchStuff=self:GetMatchStuffConfig(player,activityId)
--未获取到有效的活动
if cfMatchStuff==nil then
return activityId
end
if cfMatchStuff~=nil then
levelId= GetNextLevel(cfMatchStuff.levelContent,0)
magnifierDaily=cfMatchStuff.magnifierDaily
magnifierAd=cfMatchStuff.magnifierAd
end
--存在活动初始化玩家数据
local playerActivityMatchSuff = {}
playerActivityMatchSuff.id = id
playerActivityMatchSuff.activityId = activityId
playerActivityMatchSuff.levelId = levelId --默认关卡
playerActivityMatchSuff.magnifierDaily=magnifierDaily--剩余放大镜次数
playerActivityMatchSuff.magnifierAd=magnifierAd --广告次数
playerActivityMatchSuff.LevelisFinish=false--是否完成挑战
playerActivityMatchSuff.StoreInfo={}
local now = os.date("*t", skynet.GetTime())
playerActivityMatchSuff.ActivityTime=os.time({ year = now.year, month=now.month, day=now.day })
--更新缓存
player.gameData.matchStuffMap[activityId] = playerActivityMatchSuff
return activityId
end
--商城是否可以购买
function ActivityMatchStuff:IsCanBuy(player)
local isCanBuy=false
--不存在开启的活动
local activityId=ActivityMatchStuff:CheckData(player)
--活动未开启,是否通关
if activityId==0 or player.gameData.matchStuffMap[activityId].LevelisFinish then
return isCanBuy
end
--获取该活动的默认初始关卡
local cfMatchStuffStores=skynet.server.gameConfig:GetPlayerAllCfg(player, "MatchStuffStore")
if cfMatchStuffStores==nil then
return isCanBuy
end
--循环配置
for key, cfMatchStuffStore in pairs(cfMatchStuffStores) do
-- 是否可以购买
if cfMatchStuffStore.limitExchange>0
and player.gameData.matchStuffMap[activityId]~=nil
and player.gameData.matchStuffMap[activityId].StoreInfo[cfMatchStuffStore.id]~=nil
and player.gameData.matchStuffMap[activityId].StoreInfo[cfMatchStuffStore.id].BuyCount>=cfMatchStuffStore.limitExchange
then
goto continue
end
-- 查询道具是否足够-道具id 是26 银星币 这里写死以往规则
if skynet.server.bag:GetGoodsCount(player,dataType.GoodsType_Prop, 26)<cfMatchStuffStore.silverCoinPrice then
goto continue
end
--可以购买
isCanBuy= true
break
--提前结束当前循环
::continue::
end
return isCanBuy
end
--获取下一个挑战节点
function GetNextLevel(tbl,thisLevel)
local nextLevel = thisLevel
if tbl==nil or #tbl==0 then
log.error("GetNextLevel tbl==nil or #tbl==0")
return nextLevel
end
for _, value in ipairs(tbl) do
if value > thisLevel and (nextLevel > value or nextLevel == 0 or nextLevel == thisLevel) then
nextLevel = value
end
end
return nextLevel
end
--获取配置信息
function ActivityMatchStuff:GetMatchStuffConfig(player,activityId)
local cfMatchStuff=nil
--获取该活动的默认初始关卡
local cfMatchStuffs=skynet.server.gameConfig:GetPlayerAllCfg(player, "MatchStuff")
if cfMatchStuffs==nil then
--log.debug("cfMatchStuff is nil")
return cfMatchStuff
end
for index, value in pairs(cfMatchStuffs) do
if value.id==activityId then
cfMatchStuff=value
break
end
end
return cfMatchStuff
end
--获取显示信息
function ActivityMatchStuff:Show( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityMatchStuffShow", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityMatchStuffShow")
local data = {}
data.magnifyingGlassNum = 0
data.curLevelId = 0
data.haveWatchAD = 0
--不存在开启的活动
local activityId=self:CheckData(player)
--活动未开启
if activityId==0 then
--log.debug("activityId==0")
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
if player.gameData.matchStuffMap[activityId]~=nil then
--处理错误数据
if player.gameData.matchStuffMap[activityId].magnifierDaily < 0 then
player.gameData.matchStuffMap[activityId].magnifierDaily = 0
end
data.magnifyingGlassNum = player.gameData.matchStuffMap[activityId].magnifierDaily
data.curLevelId = player.gameData.matchStuffMap[activityId].levelId
data.haveWatchAD = player.gameData.matchStuffMap[activityId].magnifierAd
data.curLevelisFinish=player.gameData.matchStuffMap[activityId].LevelisFinish
end
s2cData.data = assert(pb.encode("S2CActivityMatchStuffShow", data))
end
--获取商店显示信息
function ActivityMatchStuff:ShopShow( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityMatchStuffShopShow", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityMatchStuffShopShow")
local data = {}
data.shopGoodsInfos = {}
--不存在开启的活动
local activityId=self:CheckData(player)
--活动未开启
if activityId==0 then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
--获取该活动的默认初始关卡
local cfMatchStuffStore=skynet.server.gameConfig:GetPlayerAllCfg(player, "MatchStuffStore")
if cfMatchStuffStore==nil then
return
end
local cfgMatchStuff=self:GetMatchStuffConfig(player,activityId)
if cfgMatchStuff==nil then
return
end
--循环获取商城配置
for k,cofg in pairs(cfMatchStuffStore) do
local buyCount=0
--是否存在玩家数据
if player.gameData.matchStuffMap[activityId]~=nil and player.gameData.matchStuffMap[activityId].StoreInfo[cofg.id]~=nil then
buyCount=player.gameData.matchStuffMap[activityId].StoreInfo[cofg.id].BuyCount
end
local shopGoodsInfos={}
shopGoodsInfos.id=cofg.id
shopGoodsInfos.buyCount=buyCount
shopGoodsInfos.todayBuyCount=0
local index=0
for tmpIndex, value in ipairs(cfgMatchStuff.silverStoreContent) do
if value == cofg.id then
index=tmpIndex
end
end
--添加到列表
data.shopGoodsInfos[index]=shopGoodsInfos
end
s2cData.data = assert(pb.encode("S2CActivityMatchStuffShopShow", data))
end
--是否可以挑战
function ActivityMatchStuff:CanChallenge( player )
--活动未开启
local activityId=self:CheckData(player)
if activityId == 0 then
return false
end
--放大镜不足
if player.gameData.matchStuffMap[activityId].magnifierDaily<=0 then
return false
end
--已全部挑战
if player.gameData.matchStuffMap[activityId].LevelisFinish then
return false
end
return true
end
--商品购买
function ActivityMatchStuff:ShopBuy( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SActivityMatchStuffShopBuy", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityMatchStuffShopBuy")
--参数
local goodsId = c2sData.data.goodsId
--返回信息
local data = {}
data.buyShopGoodsInfo = {}
--不存在开启的活动
local activityId=self:CheckData(player)
--活动未开启
if activityId==0 then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
--log.debug("errorInfo.ErrorCode.ActivityClosed")
return
end
--获取该活动的默认初始关卡
local cfMatchStuffStore=skynet.server.gameConfig:GetPlayerAllCfg(player, "MatchStuffStore")
if cfMatchStuffStore==nil then
--log.debug("cfMatchStuffStore==nil ")
return
end
local storeCofg=nil
--循环获取商城配置
for index, cofg in pairs(cfMatchStuffStore) do
if cofg.id==goodsId then
storeCofg=cofg
break
end
end
--配置不存在
if storeCofg==nil then
s2cData.code = errorInfo.ErrorCode.NoExistShopType
--log.debug("storeCofg==nil ")
return
end
--判断是否限购
if storeCofg.limitExchange>0
and player.gameData.matchStuffMap[activityId]~=nil
and player.gameData.matchStuffMap[activityId].StoreInfo[goodsId]~=nil
and player.gameData.matchStuffMap[activityId].StoreInfo[goodsId].BuyCount>=storeCofg.limitExchange
then
s2cData.code = errorInfo.ErrorCode.StoreMaxLimit
--log.debug("判断是否限购")
return
end
-- 查询道具是否足够-道具id 是26 银星币 这里写死以往规则
if skynet.server.bag:GetGoodsCount(player,dataType.GoodsType_Prop, 26)<storeCofg.silverCoinPrice then
s2cData.code = errorInfo.ErrorCode.SilverCoinPriceNotEnough
--log.debug( string.format(" skynet.server.bag:GetGoodsCount(player,dataType.GoodsType_Prop, 26)>=storeCofg.silverCoinPrice then,playerPrice:%d, Price:%d",skynet.server.bag:GetGoodsCount(player,dataType.GoodsType_Prop, 26),storeCofg.silverCoinPrice))
return
end
--扣除道具--道具id 是26 银星币 这里写死以往规则
skynet.server.bag:RemoveGoods(player,dataType.GoodsType_Prop, 26,storeCofg.silverCoinPrice)
--发放奖励
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_114")
player:GiveReward(storeCofg.rewardId ,eventId,1)
--添加购买次数
if player.gameData.matchStuffMap[activityId].StoreInfo[goodsId]==nil then
player.gameData.matchStuffMap[activityId].StoreInfo[goodsId]={ BuyCount=0 }
end
player.gameData.matchStuffMap[activityId].StoreInfo[goodsId].BuyCount =player.gameData.matchStuffMap[activityId].StoreInfo[goodsId].BuyCount + 1
--返回购买结果
data.buyShopGoodsInfo={id=storeCofg.id,buyCount=player.gameData.matchStuffMap[activityId].StoreInfo[goodsId].BuyCount,todayBuyCount=0}
--处理红点
if not self:IsCanBuy(player) then
skynet.server.msgTips:ReduceAll(player, 105)
end
s2cData.data = assert(pb.encode("S2CActivityMatchStuffShopBuy", data))
end
--游戏开始
function ActivityMatchStuff:GameStart(player,c2sData,s2cData)
c2sData.data = assert(pb.decode("C2SActivityMatchStuffGameStart", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityMatchStuffGameStart")
--参数
local curLevelId = c2sData.data.curLevelId
--返回信息
local data = {}
--不存在开启的活动
local activityId=self:CheckData(player)
--活动未开启
if activityId==0 then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
local matchStuff=player.gameData.matchStuffMap[activityId]
--获取当前可以挑战的关卡
if curLevelId~=matchStuff.levelId then
s2cData.code = errorInfo.ErrorCode.ThisNodeNotFight
return
end
--添加挑战状态
matchStuff.isFightingLevel = true
--log.debug("好物匹配 玩家开始游戏 !")
s2cData.data = assert(pb.encode("S2CActivityMatchStuffGameStart", data))
end
--游戏结束
function ActivityMatchStuff:GameOver(player,c2sData,s2cData)
c2sData.data = assert(pb.decode("C2SActivityMatchStuffGameOver", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityMatchStuffGameOver")
--参数
local isFinish = c2sData.data.isFinish
local extraRewards=c2sData.data.extraRewards
--返回信息
local data = {}
--不存在开启的活动
local activityId=self:CheckData(player)
--活动未开启
if activityId==0 then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
local matchStuff=player.gameData.matchStuffMap[activityId]
--消耗资源是否足够
if matchStuff.magnifierDaily <= 0 then
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
return
end
--是否可以结束挑战
if not matchStuff.isFightingLevel then
s2cData.code = errorInfo.ErrorCode.AlreadyFinish
return
end
--更新缓存
if isFinish then
--获取配置
local matchStuffCfg={}
local matchStuffCfgs= skynet.server.gameConfig:GetPlayerAllCfg(player, "MatchStuff")
for index,data in pairs(matchStuffCfgs) do
if data.id==activityId then
matchStuffCfg=data
end
end
if matchStuffCfg==nil then
s2cData.code = errorInfo.ErrorCode.NoGoodsID
return
end
--当前节点
local levelId=player.gameData.matchStuffMap[activityId].levelId
--获取节点配置
local cfgMatchStuffLevel=nil
local cfgMatchStuffLevels=skynet.server.gameConfig:GetPlayerAllCfg(player, "MatchStuffLevel")
for index,data in pairs(cfgMatchStuffLevels) do
if data.level==levelId then
cfgMatchStuffLevel=data
end
end
if cfgMatchStuffLevel==nil then
s2cData.code = errorInfo.ErrorCode.NoGoodsID
return
end
--发奖节点奖励
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_115")
player:GiveReward(cfgMatchStuffLevel.levelReward ,eventId,1)
--获取下一个挑战节点
local nextLevelId= GetNextLevel(matchStuffCfg.levelContent,levelId)
if nextLevelId==levelId then
--log.debug(string.format("玩家 % d 挑战节点 %d 已完成",player.id,levelId))
player.gameData.matchStuffMap[activityId].LevelisFinish=true
end
--log.debug(string.format("nextLevelId:%d",nextLevelId))
player.gameData.matchStuffMap[activityId].levelId = nextLevelId
-- 发放额外奖励
if #matchStuffCfg.timeExchangeSilverCoin==2 then
local totalCoin=matchStuffCfg.timeExchangeSilverCoin[2]*extraRewards
skynet.server.bag:AddGoods(player,dataType.GoodsType_Prop, 26,totalCoin)
end
end
--消耗放大镜
player.gameData.matchStuffMap[activityId].magnifierDaily =player.gameData.matchStuffMap[activityId].magnifierDaily -1
data.magnifyingGlassNum = player.gameData.matchStuffMap[activityId].magnifierDaily
data.curLevelId = player.gameData.matchStuffMap[activityId].levelId
data.curLevelisFinish = player.gameData.matchStuffMap[activityId].LevelisFinish
--处理红点
if self:CanChallenge(player) then
skynet.server.msgTips:ReduceAll(player, 104)
end
--处理商城红点
if self:IsCanBuy(player) then
skynet.server.msgTips:Add(player, 105)
end
--处理当前挑战关卡
matchStuff.isFightingLevel = false
s2cData.data = assert(pb.encode("S2CActivityMatchStuffGameOver", data))
end
--购买放大镜
function ActivityMatchStuff:MagnifyingGlassSupplement(player,c2sData,s2cData)
c2sData.data = assert(pb.decode("C2SActivityMatchStuffMagnifyingGlassSupplement", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityMatchStuffMagnifyingGlassSupplement")
--参数
local methodType = c2sData.data.methodType
--返回信息
local data = {}
--不存在开启的活动
local activityId=self:CheckData(player)
--活动未开启
if activityId==0 then
s2cData.code = errorInfo.ErrorCode.ActivityClosed
return
end
--获取配置
local matchStuffCfg={}
local matchStuffCfgs= skynet.server.gameConfig:GetPlayerAllCfg(player, "MatchStuff")
for index,data in pairs(matchStuffCfgs) do
if data.id==activityId then
matchStuffCfg=data
end
end
if matchStuffCfg==nil then
s2cData.code = errorInfo.ErrorCode.NoGoodsID
return
end
--1-蜗壳币
if methodType == dataType.AccelerateType_Volute then
-- 消耗玩家蜗壳币
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_116")
if player:MoneyChange(dataType.MoneyType_Volute, -matchStuffCfg.magnifierPrice, eventId) then
-- -- 使用蜗壳币进行刷新 修改相关数据
-- player.gameData.todayGain.updateUseCount = player.gameData.todayGain.updateUseCount + 1
-- if player.gameData.todayGain.updateUseCount == cfgSValue.triggerUpdatePack[1] then
-- skynet.server.store:TriggerPack(player, skynet.server.store.TriggerPack_Update)
-- end
else
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
return
end
elseif methodType == dataType.AccelerateType_WatchAD then -- 4-观看广告
--判断进入观看次数
if player.gameData.matchStuffMap[activityId].magnifierAd==0 then
--log.debug(string.format("观看次数已用完,activityId:%d,已看次数:%d,总次数:%d",activityId,matchStuffCfg.magnifierAd-player.gameData.matchStuffMap[activityId].magnifierAd,matchStuffCfg.magnifierAd))
s2cData.code = errorInfo.ErrorCode.OPFailed
return
end
player.gameData.matchStuffMap[activityId].magnifierAd= player.gameData.matchStuffMap[activityId].magnifierAd - 1
else--参数不支持
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
--添加放大镜
player.gameData.matchStuffMap[activityId].magnifierDaily =player.gameData.matchStuffMap[activityId].magnifierDaily +1
if self:CanChallenge(player) then
--处理红点
skynet.server.msgTips:Add(player, 104)
end
--日志
--log.debug(string.format("玩家 %d 购买放大镜 1 购买类型" , player.userId , methodType))
data.magnifyingGlassNum= player.gameData.matchStuffMap[activityId].magnifierDaily
s2cData.data = assert(pb.encode("S2CActivityMatchStuffMagnifyingGlassSupplement", data))
end
skynet.server.activityMatchStuff = ActivityMatchStuff
return ActivityMatchStuff