HomeServer/Server/AllServer/GameServer/MsgTips.lua

709 lines
26 KiB
Lua
Raw Permalink Normal View History

2024-11-20 15:41:09 +08:00
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 redisKeyUrl = require "RedisKeyUrl"
local json = require "json"
local MsgTips = oo.class()
--检查一下玩家是否有新的消息提示
function MsgTips:LoginInitData( player )
player.tmpData.lastRefreshTime = 0 --上一次刷新时间
local cfgTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "PhoneMsg") --消息配置
for k, v in pairs( cfgTask ) do
if not player.gameData.msgTips.data[ v.id ] then
player.gameData.msgTips.data[ v.id ] = {}
player.gameData.msgTips.data[ v.id ].id = v.id
player.gameData.msgTips.data[ v.id ].isRefresh = true --是否能刷新
player.gameData.msgTips.data[ v.id ].count = 0 --数量
end
end
end
--消息提示确认
function MsgTips:Confirm( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SMsgTipsConfirm", c2sData.data ))
local data = {}
local id = c2sData.data.tipsInfo.id
local count = c2sData.data.tipsInfo.count
if not id or not count then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local msgTips = player.gameData.msgTips.data[ id ]
if not msgTips then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
msgTips.isRefresh = true
--只种设置面板中领奖的
if (id >= 20 and id <= 22) or 66 == id then
msgTips.count = 0
end
--[[
if 15 ~= id then
msgTips.count = msgTips.count - count
if msgTips.count < 0 then
msgTips.count = 0
end
end
]]
data.tipsInfo = self:GetOneTips( player , id )
data.reward = {}
--只有部分可以红点领奖
for k, v in pairs( player.gameData.msgTips.reward ) do
if id == v.id and dataType.Status_CanGain == v.status then
local goodsType = v.goodsType
local goodsId = v.goodsId
local goodsCount = v.goodsCount
data.reward = { goodsType = goodsType , goodsId = goodsId , goodsCount = goodsCount }
skynet.server.bag:AddGoods( player , goodsType , goodsId , goodsCount )
v.status = dataType.Status_AlreadyGain
log.debug(string.format("玩家 %d 消息提示 领取奖励 消息ID %d 物品类型 %d 物品ID %d 物品数量 %d" , player.userId , id , goodsType , goodsId , goodsCount))
end
end
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_MsgTipsConfirm")
s2cData.data = assert(pb.encode("S2CMsgTipsConfirm", data))
end
--清除指定红点
function MsgTips:ReduceTips( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SReduceTips", c2sData.data ))
self:ReduceAll(player, c2sData.data.id)
local data = {}
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ReduceTips")
s2cData.data = assert(pb.encode("S2CReduceTips", data))
end
--发送最新的消息提示
function MsgTips:SendLastTips( player , msgId )
local data = {}
data.tipsInfo = self:GetOneTips( player , msgId )
skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_MsgTipsNotice" , data )
end
--增加提示
function MsgTips:Add( player , id , count , isSendMsg )
count = count or 1
if nil == isSendMsg then
isSendMsg = true
end
local msgTips = player.gameData.msgTips.data[ id ]
if not msgTips then
return
end
local phoneMsg = skynet.server.gameConfig:GetPlayerCurCfg( player , "PhoneMsg", id )
if not phoneMsg then
return
end
--未解锁的不发红点
if 1 == phoneMsg.msgType and not player:IsUnlockSystem( dataType.UnlockSystem_Gift) or
2 == phoneMsg.msgType and not player:IsUnlockSystem( dataType.UnlockSystem_Used) or
3 == phoneMsg.msgType and not player:IsUnlockSystem( dataType.UnlockSystem_Furniture) or
4 == phoneMsg.msgType and not player:IsUnlockSystem( dataType.UnlockSystem_Clothing) or
5 == phoneMsg.msgType and not player:IsUnlockSystem( dataType.UnlockSystem_Plant) or
6 == phoneMsg.msgType and not player:IsUnlockSystem( dataType.UnlockSystem_MoveHome) or
7 == phoneMsg.msgType and not player:IsUnlockSystem( dataType.UnlockSystem_Friend) then
return
end
msgTips.isRefresh = false
msgTips.count = msgTips.count + count
if id >= 20 and id <= 22 then
local goodsId = 0
if 20 == id then
goodsId = 674
elseif 21 == id then
goodsId = 672
elseif 22 == id then
goodsId = 673
end
local isExist = false
for k, v in pairs( player.gameData.msgTips.reward ) do
if id == v.id then
isExist = true
end
end
if not isExist then
local reward = {}
reward.id = id
reward.status = dataType.Status_CanGain
reward.goodsType = pb.enum("EnumGoodsType" ,"Furniture")
reward.goodsId = goodsId
reward.goodsCount = 1
table.insert( player.gameData.msgTips.reward , reward )
end
end
local data = {}
data.tipsInfo = self:GetOneTips( player , id )
skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_MsgTipsNotice" , data )
log.debug(string.format("玩家 %d 消息提示 发送红点 消息ID %d " , player.userId , id))
end
--重置为0
function MsgTips:Reset( player , id )
local msgTips = player.gameData.msgTips
if msgTips.data[ id ] then
msgTips.data[ id ].count = 0
self:Get(player ,id).isRefresh = true
end
end
--减少
function MsgTips:Reduce( player , id )
local msgTipsData = player.gameData.msgTips.data[ id ]
if msgTipsData and msgTipsData.count > 0 then
msgTipsData.count = msgTipsData.count - 1
if msgTipsData.count < 0 then
msgTipsData.count = 0
end
local data = {}
data.tipsInfo = self:GetOneTips( player , id )
skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_MsgTipsNotice" , data )
self:Get(player ,id).isRefresh = true
end
end
--减少所有
function MsgTips:ReduceAll( player , id )
local msgTipsData = player.gameData.msgTips.data[ id ]
if msgTipsData and msgTipsData.count > 0 then
msgTipsData.count = 0
local data = {}
data.tipsInfo = self:GetOneTips( player , id )
skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_MsgTipsNotice" , data )
self:Get(player ,id).isRefresh = true
end
end
--增加提示
function MsgTips:AddNoNotice( player , id )
local msgTips = player.gameData.msgTips.data[ id ]
if not msgTips then
return
end
msgTips.count = msgTips.count + 1
end
--获取TIPS信息
function MsgTips:Get( player , id )
return player.gameData.msgTips.data[ id ]
end
--获取当个TIPS信息
function MsgTips:GetOneTips( player , id )
return { id = id , count = player.gameData.msgTips.data[ id ].count }
end
--获取所有TIPS信息(玩家登录时会调用)
function MsgTips:GetAllTips( player , curDetail , groupData )
local myGroupId = curDetail.groupId
local myPartnerId = player.gameData.partner.id
--登录时,对所有的红点进行检查一下,有的话统一发给客户端
local isFriendNewMsg = false
local friendList = skynet.server.partner:GetFriendList( player )
for k, v in pairs(friendList) do
if v.unReadCount > 0 then
isFriendNewMsg = true
break
end
end
if isFriendNewMsg then
self:Reset(player , 53 )
self:Add( player , 53 , 1 , false )
end
--检查一下是否有申请好友
local applyList = skynet.server.partner:GetApplyList( player )
if #applyList > 0 then
self:Reset(player , 54 )
skynet.server.msgTips:Add( player , 54 , 1 , false )
end
--如果自己是家园管理园,就需要检查是下有不有人加入,发送红点
if curDetail and "" ~= curDetail.groupId and skynet.server.group.IdentityType_Member ~= curDetail.groupIdentityType then
local redisApplyJoinKey = string.format( redisKeyUrl.GameServerGroupUserApplyJoinZSet , myGroupId )
local partnerIds = skynet.server.redis:zrange( redisApplyJoinKey , 0 , -1 )
if #partnerIds > 0 then
--有玩家需要加入
local joinType = tonumber(groupData[2]) or skynet.server.groupManage.JoinType_Audit
if skynet.server.groupManage.JoinType_Freedom == joinType then
--如果家园已经改成自由加入,那么之前的申请列表就可以清除了
for k, joinPartnerId in pairs( partnerIds ) do
--将每个玩家的申请加入家园的列表中删除该家园
local redisJoinPartnerIdKey = string.format( redisKeyUrl.GameServerGroupMyApplyJoinZSet , joinPartnerId )
skynet.server.redis:zrem( redisJoinPartnerIdKey , myGroupId )
end
--然后删除该家园的所有申请列表
skynet.server.redis:del(redisApplyJoinKey)
elseif skynet.server.groupManage.JoinType_Audit == joinType then
--如果家园还是审核状态,就需要发送红点
self:Reset(player , 60 )
self:Add( player , 60 , 1 , false )
end
else
self:Reset(player , 60 )
end
end
if curDetail and "" ~= curDetail.groupId and 0 == curDetail.groupSignInType then
local isHave = false
--没有签到就有红点
if 0 == curDetail.groupSignInType then
isHave = true
end
--有奖励并且我没有领取有红点
local contributeReward = tonumber(groupData[1] )
if contributeReward and contributeReward > 0 then
local redisKey = string.format( redisKeyUrl.GameServerGroupContributeRewardRecordSet, myGroupId )
if skynet.server.redis:sismember( redisKey , myPartnerId ) then
isHave = true
end
end
--检查有不有帮助奖励
local helpCount,rewardId = skynet.server.groupManage:CheckHelpReward( player )
if 0 ~= helpCount then
isHave = true
end
if isHave then
self:Reset( player , 38 )
self:Add( player , 38 , 1 , false)
end
else
self:Reset( player , 38 )
end
if curDetail and "" ~= curDetail.groupId and curDetail.groupRandId >= 1 and curDetail.groupRandId <= 6 then
self:Reset( player , 39 )
self:Add( player , 39 , 1 , false)
else
self:Reset( player , 39 )
end
skynet.server.friend:GetMsgTipsCount( player )
--获取当前所有的红点信息
local tipsInfo = {}
for id, v in pairs( player.gameData.msgTips.data ) do
table.insert( tipsInfo , { id = id , count = v.count })
end
return tipsInfo
end
--刷新
function MsgTips:Refresh( player )
if skynet.GetTime() < player.tmpData.lastRefreshTime then
return
end
player.tmpData.lastRefreshTime = skynet.GetTime() + 60
local time = skynet.GetTime()
local gameData = player.gameData
if self:Get(player ,3).isRefresh then
skynet.server.used:CheckRefreshGoods( player )
self:ReduceAll( player , 3 )
--出售的商品有买家来下单啦!
for k, v in pairs( gameData.used.sellInfo ) do
if time >=v.sellTime and skynet.server.used.SellStatus_SomeoneWant == v.status then
self:Add( player , 3 )
break
end
end
end
if self:Get(player ,4).isRefresh then
self:ReduceAll( player , 4 )
--快递已送达,快去取件吧
for k, v in pairs( gameData.used.logisticsInfo ) do
if time >= v.reachTime and skynet.server.used.GoodsStatus_AlreadyReach == v.goodsStatus then
self:Add( player , 4 )
--通知客户端
local data = {}
data.logisticsInfo = skynet.server.used:GetLogisticsInfo( player )
skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_UsedLogisticsShow" , data )
break
end
end
end
if self:Get(player ,5).isRefresh then
--家具换货咯,快来看看
local shopType = dataType.ShopType_Furniture
if gameData.shop[ shopType ] and time >= gameData.shop[ shopType ].nextRefreshTime then
self:Add( player , 5 )
end
end
if self:Get(player ,6).isRefresh then
--摆件换货咯,快来看看
local shopType = dataType.ShopType_Cinnabar
if gameData.shop[ shopType ] and time >= gameData.shop[ shopType ].nextRefreshTime then
self:Add( player , 6 )
end
end
if self:Get(player ,7).isRefresh then
--装修换货咯,快来看看
local shopType = dataType.ShopType_Decorate
if gameData.shop[ shopType ] and time >= gameData.shop[ shopType ].nextRefreshTime then
self:Add( player , 7 )
end
end
if self:Get(player ,8).isRefresh then
--套间展示更换咯,快来看看
local shopType = dataType.ShopType_Suit
if gameData.shop[ shopType ] and time >= gameData.shop[ shopType ].nextRefreshTime then
self:Add( player , 8 )
end
end
if self:Get(player ,9).isRefresh then
--服饰换货咯,快来看看
local shopType = dataType.ShopType_Clothes
if gameData.shop[ shopType ] and time >= gameData.shop[ shopType ].nextRefreshTime then
self:Add( player , 9 )
end
end
if self:Get(player ,10).isRefresh then
--装扮换货咯,快来看看
local shopType = dataType.ShopType_Fashion
if gameData.shop[ shopType ] and time >= gameData.shop[ shopType ].nextRefreshTime then
self:Add( player , 10 )
end
end
if self:Get(player ,11).isRefresh then
--植物种子换货咯,快来看看
local shopType = dataType.ShopType_Seed
if gameData.shop[ shopType ] and time >= gameData.shop[ shopType ].nextRefreshTime then
self:Add( player , 11 )
end
end
if self:Get(player ,12).isRefresh then
--出售的植物被买家买走啦
local shopType = dataType.ShopType_Plant
local curShelf = nil
if gameData.shop[ shopType ] then
for i = 1, skynet.server.plantShop.MaxShelfCount , 1 do
curShelf = gameData.shop[ shopType ].shopShelf[ i ]
if 0 ~= curShelf.goodsId and time >= curShelf.sellTime and not curShelf.isSell then
self:Add( player , 12 )
break
end
end
end
end
if self:Get(player ,13).isRefresh then
--新的花盆解锁了,快来看看
local shopType = dataType.ShopType_Seed
local flowerpotList = skynet.server.generalShop:GetUnLockFlowerpot( player , self.FlowerpotType_Seed )
for k1, v1 in pairs( flowerpotList ) do
local isExistFlowerpot = false --是否存在花盆
for k2, v2 in pairs( gameData.shop[ shopType ].specialGoods ) do
if v1 == v2.id then
isExistFlowerpot = true
break
end
end
if not isExistFlowerpot then
self:Add( player , 13 )
break
end
end
end
if self:Get(player ,16).isRefresh then
--闲菜换货咯,快来看看
if time >= gameData.used.buyRefreshTime then
self:Add( player , 16 )
end
end
if self:Get(player ,31).isRefresh then
if skynet.server.raffle:CheckFreeDesign(player,skynet.server.raffle.LotteryType_2) then
self:Add( player , 31 )
end
end
if self:Get(player ,34).isRefresh then
if skynet.server.raffle:CheckFreeDesign(player,skynet.server.raffle.LotteryType_1) then
self:Add( player , 34 )
end
end
if self:Get(player ,41).isRefresh then
--染色工坊有可领取的 进行添加对应的红点
for k ,v in pairs(gameData.dyeWorkShop.slotData) do
if time >= v.finishTime and v.status == skynet.server.dyeworkshop.SlotStatusTime then
v.status = skynet.server.dyeworkshop.SlotStatusGet
self:Add( player , 41 )
end
end
end
--扭蛋机红点
if self:Get(player ,50).isRefresh then
--消除对应红点
if skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Prop , 7) > 0 then
skynet.server.msgTips:Add(player , 50)
end
end
if self:Get(player ,51).isRefresh and gameData.shop[ dataType.ShopType_Cuisine ] then
--料理店植物成熟 进行添加对应的红点
local timeCoefficient = skynet.server.store:GetTimeCoefficient(player , 3)
for k ,v in pairs(gameData.shop[ dataType.ShopType_Cuisine ].plotInfos) do
if v.matId > 0 then
local cfgCuisineMaterial = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMaterial")
local allStatusTime = skynet.server.cuisineShop:GetAllStatusTime(player , cfgCuisineMaterial[v.matId].plantId , v.status , v.nextStatusTime , timeCoefficient)
if allStatusTime[4] and time >= allStatusTime[4].nextStatusTime and v.nextStatusTime > 0 then
self:Add( player , 51 )
--修改对应状态
v.status = 5
v.nextStatusTime = 0
end
end
end
end
if self:Get(player ,61).isRefresh then
--家具工坊有可领取的 进行添加对应的红点
for k ,v in pairs(gameData.furnitureWorkShop.slotData) do
if time >= v.finishTime and v.status == skynet.server.furnitureWorkShop.SlotStatusTime then
v.status = skynet.server.furnitureWorkShop.SlotStatusGet
self:Add( player , 61 )
end
end
end
--咖啡店有一种材料可以领取就给红点
if self:Get(player ,72).isRefresh then
local curShop = gameData.shop[ dataType.ShopType_Coffee ]
if curShop then
for k, v in pairs( curShop.supplierBoxes ) do
--如果CD时间到了就给红点
if skynet.GetTime() > v.nextRefreshTime and v.count < 1 then
self:Reset( player , 72 )
self:Add( player , 72 )
break
end
end
end
end
--造型间剪刀满了
if self:Get(player ,74).isRefresh then
skynet.server.styleShop:CheckRestoreEnergy( player )
end
--宠物店出游奖励可领取增加红点
if self:Get(player ,82).isRefresh then
local curShop = gameData.shop[ dataType.ShopType_PetShop ]
if curShop then
for k, v in pairs( curShop.petTravel ) do
--如果CD时间到了就给红点
if self:GetOneTips(player, 82).count == 0 then
if v.status == 2 or v.status == 1 and skynet.GetTime() >= v.finishTime then
self:Reset( player , 82 )
self:Add( player , 82 )
break
end
end
end
end
end
--宠物店商店盲盒有奖励可领取增加红点
if self:Get(player ,83).isRefresh then
local curShop = gameData.shop[ dataType.ShopType_PetShop ]
if curShop then
if self:GetOneTips(player, 83).count == 0 then
if curShop.blindBoxStatus == 1 or curShop.blindBoxStatus == 0 and skynet.GetTime() >= curShop.nextFreeTime then
self:Reset( player , 83 )
self:Add( player , 83 )
end
end
end
end
--恋家置业房产咨询租房完成可领奖时增加红点
if self:Get(player ,86).isRefresh then
local curShop = gameData.houseRent
if curShop then
self:ReduceAll( player , 86 )
for k, v in pairs( curShop.houseInfo ) do
--如果CD时间到了就给红点
if (v.leaseStatus == 2 or v.leaseStatus == 3) and skynet.GetTime() >= v.finishTime and skynet.server.houseRent:IsShow( player , v.id ) then
self:Add( player , 86 )
end
end
end
end
--限时累计充值
if self:Get(player ,94).isRefresh then
if skynet.server.activityLimitedAccum:IfConDrawReward(player) then
self:Add( player , 94 )
end
end
-- --向往一日任务可领奖时增加红点
if self:Get(player ,99).isRefresh then
if gameData.activity[dataType.ActivityType_DreamLife] and next(gameData.activity[dataType.ActivityType_DreamLife]) ~= nil then
skynet.server.group:CheckDreamLifeTask(player)
for k, v in pairs( gameData.activity[dataType.ActivityType_DreamLife].DreamLife.tasks ) do
if v.kind == 1 and v.status == skynet.server.activityDreamLife.TaskStatus_NoFinish and skynet.GetTime() >= v.finishTime then
v.status = skynet.server.activityDreamLife.TaskStatus_NoGet
self:Add( player , 99 )
elseif v.kind == 2 and v.status ~= skynet.server.activityDreamLife.TaskStatus_Get and v.status ~= skynet.server.activityDreamLife.TaskStatus_NoGet then
local cfgOneDreamLifeTask = skynet.server.gameConfig:GetPlayerCurCfg(player, "DreamLifeTask", v.id).targetHeadcount
local taskType = dataType.GroupTaskType_DreamLife
v.progress = skynet.server.group:GetTaskCount(player, taskType, v.id)
if v.progress >= cfgOneDreamLifeTask then
v.status = skynet.server.activityDreamLife.TaskStatus_NoGet
self:Add( player , 99 )
elseif v.progress < cfgOneDreamLifeTask and v.status == skynet.server.activityDreamLife.TaskStatus_NoFinish then
if skynet.server.group:GetDreamLifeTaskState(player, v.id) then
v.status = skynet.server.activityDreamLife.TaskStatus_OtherNoFinish
end
-- 修改进度
-- skynet.server.group:UpdateTask(player, taskType, v.id)
--进度赋值
v.progress = skynet.server.group:GetTaskCount(player, taskType, v.id)
if v.progress >= cfgOneDreamLifeTask then
v.status = skynet.server.activityDreamLife.TaskStatus_NoGet
self:Add( player , 99 )
end
end
end
end
end
end
-- 好物匹配 关卡可以挑战
if self:Get(player ,104).isRefresh then
--活动开启,放大镜大于0
if skynet.server.activityMatchStuff:CanChallenge(player) then
self:Add(player,104)
end
end
--好物匹配 商店可以兑换
if self:Get(player ,105).isRefresh then
if skynet.server.activityMatchStuff:IsCanBuy(player) then
--可以购买
self:Add(player,105)
end
end
--新手限定设计卡池 领奖
if self:Get(player ,107).isRefresh then
if skynet.server.activityNewPlayerRaffle:IsDrawReward(player) then
self:Add(player,107)
end
end
--限时签到 领奖
if self:Get(player ,109).isRefresh then
local conNormalRewardIds,conSpecialRewardIds =skynet.server.activitySignPack:GetConDrawReward(player)
if next(conNormalRewardIds) or next(conSpecialRewardIds) then
self:Add(player,109)
end
end
--寻宝活动有挑战机会时
if self:Get(player ,113).isRefresh then
if skynet.server.activitySeekTreasure:IsConParticipationNum(player) then
self:Add(player,113)
end
end
--寻宝活动挑战未完成时
if self:Get(player ,114).isRefresh then
if skynet.server.activitySeekTreasure:IsEnd(player) then
self:Add(player,114)
end
end
--进阶礼包
if self:Get(player ,116).isRefresh then
if skynet.server.activityStagePack:isCanDraw(player) then
self:Add(player,116)
end
end
--限时设计礼包
if self:Get(player ,68).isRefresh then
if skynet.server.raffle:CheckTimeAward(player) then
self:Add(player,68)
end
end
--限时设计签到
if self:Get(player ,69).isRefresh then
if skynet.server.raffle:CheckSignIn(player) then
self:Add(player,69)
end
end
--分层礼包
if self:Get(player,115).isRefresh then
-- 处理红点
if not skynet.server.activityLevelPack:isFirstOpen(player) then
self:Add(player, 115)
end
end
--每日灯谜-答题
if self:Get(player ,119).isRefresh then
if skynet.server.activityDailyRiddle:isCanAnswer(player) then
self:Add(player,119)
end
end
--每日灯谜-领奖
if self:Get(player ,120).isRefresh then
if skynet.server.activityDailyRiddle:isCanDraw(player) then
self:Add(player,120)
end
end
--复刻商店
if self:Get(player ,123).isRefresh then
if skynet.server.activityReplicaStore:isCanDraw(player) then
self:Add(player,123)
end
end
end
skynet.server.msgTips = MsgTips
return MsgTips