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

709 lines
26 KiB
Lua
Raw Permalink 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 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