HomeServer/Server/AllServer/GameServer/Personal.lua

703 lines
33 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 serverId = tonumber(skynet.getenv "serverId")
local Personal = oo.class()
Personal.MaxColorType = 3 --最大颜色类型
Personal.MaxNickNameLen = 21 --最大昵称长度
Personal.AddGoods = 1 --添加物品
Personal.DelGoods = 2 --移除物品
Personal.listNewPartnerId = {} --当前正在创建的partnerId列表
--初始数据
function Personal:InitData( player )
player.gameData.personal.clothesData = {}
player.gameData.personal.colorData = {}
--所有数据默认为0
for i = 1, dataType.ClothesType_Max - 1 , 1 do
player.gameData.personal.clothesData[ i ] = 0
end
for i = 1, self.MaxColorType, 1 do
player.gameData.personal.colorData[ i ] = 0
end
--默认服饰 2,3,10,14,17,16
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
local cfgDefalutClothes = cfgSValue.characterDefalutClothes
local cfgClothes = skynet.server.gameConfig:GetPlayerAllCfg( player , "Clothes")
for k1, v1 in pairs( cfgDefalutClothes ) do
for k2, v2 in pairs( cfgClothes ) do
if v1 == v2.id then
player.gameData.personal.clothesData[ v2.type ] = v1
break
end
end
--将该商品赠送到玩家背包里
skynet.server.bag:AddGoods( player , dataType.GoodsType_Clothes , v1 , 1)
end
--默认颜色 1 6 26
local cfgDefalutColor = cfgSValue.characterDefalutColor
local cfgColor = skynet.server.gameConfig:GetPlayerAllCfg( player , "Color")
for k1, v1 in pairs( cfgDefalutColor ) do
for k2, v2 in pairs( cfgColor ) do
if v1 == v2.id then
player.gameData.personal.colorData[ v2.types ] = v1
break
end
end
end
player.gameData.personal.headId = 1
player.gameData.personal.headFrameId = 13
player.gameData.personal.title1 = 1
player.gameData.personal.title2 = 11
player.gameData.personal.medals = { 0 ,0 ,0 }
local clothesData = player.gameData.personal.clothesData
local colorData = player.gameData.personal.colorData
local whileCount = 0
while true do
whileCount = whileCount + 1
--已经有玩家ID就不再处理
if "" ~= player.gameData.partner.id or whileCount >= 100 then
break
end
local myPartnerId = skynet.server.common:RandIDNoIAndL(12)
if not self.listNewPartnerId [ myPartnerId ] then
self.listNewPartnerId [ myPartnerId ] = true --先本地缓存一下是否存在好友ID可能同时生成相同的好友ID
--local redisKey = string.format( redisKeyUrl.GameServerPersonalDetail , myPartnerId )
--local curRedis = skynet.server.redisCenter:GetPartnerRedis( myPartnerId ) --根据partnerId来获取redis索引
if not self:IsExistDetailKey( myPartnerId ) then
--新生成的partnerId,保存到用户相关数据中去
local account = player.basicInfo.accountName
skynet.server.redisCenter:SetRedisDBInfo( account , "PartnerId" , myPartnerId )
--初始化个人redis数据
player.gameData.partner.id = myPartnerId
local initData = {}
initData[ "dbIndex" ] = player.basicInfo.dbIndex
initData[ "platform" ] = player.basicInfo.platform
initData[ "account" ] = account
initData[ "userId" ] = player.userId
initData[ "partnerId" ] = tostring(player.gameData.partner.id)
initData[ "nickName" ] = player.gameData.nickName
initData[ "headId" ] = 1
initData[ "headFrameId" ] = 13
initData[ "level" ] = player.gameData.level
initData[ "title1" ] = 1
initData[ "title2" ] = 11
initData[ "medals1" ] = 0
initData[ "medals2" ] = 0
initData[ "medals3" ] = 0
initData[ "cuisineLevel" ] = 1
initData[ "fishLevel" ] = 1
initData[ "isOnline" ] = true
initData[ "gameServerId" ] = serverId
initData[ "newFriendCount" ] = 0
initData[ "groupId" ] = ""
initData[ "groupExitTime" ] = 0
initData[ "clothesData1" ] = clothesData[ dataType.ClothesType_Head ]
initData[ "clothesData2" ] = clothesData[ dataType.ClothesType_Hair ]
initData[ "clothesData3" ] = clothesData[ dataType.ClothesType_Eyes ]
initData[ "clothesData4" ] = clothesData[ dataType.ClothesType_HeadWear ]
initData[ "clothesData5" ] = clothesData[ dataType.ClothesType_Clothes ]
initData[ "clothesData6" ] = clothesData[ dataType.ClothesType_Trousers ]
initData[ "clothesData7" ] = clothesData[ dataType.ClothesType_Suit ]
initData[ "clothesData8" ] = clothesData[ dataType.ClothesType_Shoes ]
initData[ "clothesData9" ] = clothesData[ dataType.ClothesType_Earrings ]
initData[ "clothesData10" ] = clothesData[ dataType.ClothesType_Facing ]
initData[ "colorData1" ] = colorData[ 1 ] --发色
initData[ "colorData2" ] = colorData[ 2 ] --瞳色
initData[ "colorData3" ] = colorData[ 3 ] --肤色
initData[ "rechargeAmount" ] = 0
initData[ "lastWeekGameTime" ] = 0
initData[ "updateTime" ] = skynet.GetTime()
local packData = skynet.server.common:PackData( initData )
local redisDetailKey = string.format( redisKeyUrl.GameServerPersonalDetail , myPartnerId )
local curPartnerRedis = skynet.server.redisCenter:GetPartnerRedis( myPartnerId )
curPartnerRedis:hmset( redisDetailKey , table.unpack( packData ))
--self:SetDetail( myPartnerId, table.unpack( packData ))
self.listNewPartnerId[ myPartnerId ] = nil --玩家成功注册了,删除本地缓存
log.debug(string.format("玩家 %d 生成伙伴码 %s" , player.userId , myPartnerId))
break
else
self.listNewPartnerId[ myPartnerId ] = nil --已经有玩家注册了,删除本地缓存
end
else
log.info("随机出来相同的partnerId重新生成" , myPartnerId , player.basicInfo.accountName )
end
end
end
--检查是否有新的默认头像
function Personal:LoginInitData( player )
local cfgAllHead = skynet.server.gameConfig:GetPlayerAllCfg( player , "Head")
local ownHeadIds = player.gameData.personal.ownHeadIds
local ownHeadFrameIds = player.gameData.personal.ownHeadFrameIds
for k, v in pairs( cfgAllHead ) do
if dataType.HeadGainType_Default == v.obtainWay then
if dataType.HeadType_Head == v.type then
if not skynet.server.common:IsExist( v.id , ownHeadIds ) then
--不存在该数据才会保存
self:ChangeGainInfo(player , dataType.GoodsType_HeadAndHeadFrame , v.id , dataType.HeadType_Head , skynet.server.personal.AddGoods)
end
elseif dataType.HeadType_Frame == v.type then
if not skynet.server.common:IsExist( v.id , ownHeadFrameIds ) then
--不存在该数据才会保存
self:ChangeGainInfo(player , dataType.GoodsType_HeadAndHeadFrame , v.id , dataType.HeadType_Frame , skynet.server.personal.AddGoods)
end
end
end
end
local cfgAllTitle = skynet.server.gameConfig:GetPlayerAllCfg( player , "Title")
local ownTitle1s = player.gameData.personal.ownTitle1s
local ownTitle2s = player.gameData.personal.ownTitle2s
for k, v in pairs( cfgAllTitle ) do
if dataType.TitleGainType_Default == v.obtainWay then
--不存在该数据才会保存
if dataType.TitleType_Adj == v.type and not skynet.server.common:IsExist( v.id , ownTitle1s ) then
table.insert( player.gameData.personal.ownTitle1s , v.id )
elseif dataType.TitleType_Noun == v.type and not skynet.server.common:IsExist( v.id , ownTitle2s ) then
table.insert( player.gameData.personal.ownTitle2s , v.id )
end
end
end
local cfgAllBadge = skynet.server.gameConfig:GetPlayerAllCfg( player , "Badge")
local ownMedals = player.gameData.personal.ownMedals
for k, v in pairs( cfgAllBadge ) do
if dataType.MedalGainType_Default == v.obtainWay then
if not skynet.server.common:IsExist( v.id , ownMedals ) then
--不存在该数据才会保存
table.insert( player.gameData.personal.ownMedals , v.id )
end
end
end
end
--个人特征展示
function Personal:Show( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SPersonalShow", c2sData.data ))
local data ={}
--策划把45号头像配成了头像框这里需要做一下兼容
local ownHeadIds = player.gameData.personal.ownHeadIds
local ownHeadFrameIds = player.gameData.personal.ownHeadFrameIds
for k, v in pairs( ownHeadFrameIds ) do
if v == 45 then
--如果存在45号关像框就把它替换成头像
table.insert( ownHeadIds , 45 )
table.remove( ownHeadFrameIds , k )
break
end
end
data.personalInfo = self:GetInfo( player )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_PersonalShow")
s2cData.data = assert(pb.encode("S2CPersonalShow", data))
end
--个人特征改变
function Personal:Change( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SPersonalChange", c2sData.data ))
local personalInfo = c2sData.data.personalInfo
local data ={}
if not personalInfo or not personalInfo.nickName or not personalInfo.clothesData or not personalInfo.colorData or #personalInfo.nickName > self.MaxNickNameLen then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
elseif skynet.server.common:IsExistSpecialChar( personalInfo.nickName ) then
s2cData.code = errorInfo.ErrorCode.ExistSpecialChar
elseif skynet.server.common:IsMaskWords( personalInfo.nickName ) then
s2cData.code = errorInfo.ErrorCode.ExistMaskWords
else
local isChangeClothes = false --衣服是否有变化
player.gameData.nickName = personalInfo.nickName
local myPlayerId = player.gameData.partner.id
self:SetDetail( myPlayerId ,"nickName", player.gameData.nickName)
--更新服装数据
for k, goodsId in pairs( personalInfo.clothesData ) do
local cfgClothes = nil
if 0 ~= goodsId then
cfgClothes = skynet.server.gameConfig:GetPlayerCurCfg( player , "Clothes" , goodsId )
end
if ( 4 == k or 7 == k or 9 == k or 10 == k) and 0 == goodsId then
--头饰套装耳饰面饰可能为0直接赋值就行
player.gameData.personal.clothesData[ k ] = goodsId
elseif cfgClothes and k == cfgClothes.type and player:IsBuyGoods( dataType.GoodsType_Clothes , goodsId ) then
--类型必须一致,并且玩家有该商品
player.gameData.personal.clothesData[ k ] = goodsId
isChangeClothes = true
end
end
if isChangeClothes then
skynet.server.levelTask:Modify( player , 22 , 1 )
skynet.server.taskListEvent:Modify( player , 22 , 1 )
end
--更新色彩数据
for k, v in pairs( personalInfo.colorData ) do
--背包中没有该商品并且商品id不等于0
if skynet.server.gameConfig:GetPlayerCurCfg( player , "Color", v ) then
player.gameData.personal.colorData[ k ] = v
end
end
local curInfo = self:GetInfo( player )
--个人特征改变更新到redis
local myPlayerId = player.gameData.partner.id
self:SetDetail( myPlayerId ,"clothesData1", curInfo.clothesData[ dataType.ClothesType_Head ] ,"clothesData2", curInfo.clothesData[ dataType.ClothesType_Hair ] ,
"clothesData3", curInfo.clothesData[ dataType.ClothesType_Eyes ] ,"clothesData4", curInfo.clothesData[ dataType.ClothesType_HeadWear ] ,
"clothesData5", curInfo.clothesData[ dataType.ClothesType_Clothes ] ,"clothesData6", curInfo.clothesData[ dataType.ClothesType_Trousers ] ,
"clothesData7", curInfo.clothesData[ dataType.ClothesType_Suit ] ,"clothesData8", curInfo.clothesData[ dataType.ClothesType_Shoes ] ,
"clothesData9", curInfo.clothesData[ dataType.ClothesType_Earrings ] ,"clothesData10", curInfo.clothesData[ dataType.ClothesType_Facing ] ,
"colorData1" , curInfo.colorData[ 1 ] , "colorData2" , curInfo.colorData[ 2 ] ,"colorData3" , curInfo.colorData[ 3 ])
data.clothesData = player.gameData.personal.clothesData
data.colorData = player.gameData.personal.colorData
data.personalInfo = curInfo
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_PersonalChange")
s2cData.data = assert(pb.encode("S2CPersonalChange", data))
end
--个人特征改变
function Personal:Rename( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SPersonalRename", c2sData.data ))
local nickName = c2sData.data.nickName
local data ={}
if not nickName or #nickName > self.MaxNickNameLen then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
elseif skynet.server.common:IsExistSpecialChar( nickName ) then
s2cData.code = errorInfo.ErrorCode.ExistSpecialChar
elseif skynet.server.common:IsMaskWords( nickName ) then
s2cData.code = errorInfo.ErrorCode.ExistMaskWords
else
player.gameData.nickName = nickName
data.nickName = nickName
local myPlayerId = player.gameData.partner.id
self:SetDetail( myPlayerId ,"nickName", nickName)
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_PersonalRename")
s2cData.data = assert(pb.encode("S2CPersonalRename", data))
end
--个人获取资料
function Personal:GetData( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SPersonalGetData", c2sData.data ))
local data = {}
data.curData = {}
data.curData.partnerId = player.gameData.partner.id
data.curData.nickName = player.gameData.nickName
data.curData.headId = player.gameData.personal.headId
data.curData.headFrameId = player.gameData.personal.headFrameId
data.curData.level = player.gameData.level
data.curData.exp = player.gameData.exp
data.curData.title1 = player.gameData.personal.title1
data.curData.title2 = player.gameData.personal.title2
data.curData.medals = player.gameData.personal.medals
data.curData.DIYHeadInfo = player.gameData.personal.diyHeadInfo
data.curData.birthdayDate=player.gameData.personal.birthday.birthdayDate
data.ownData = {}
data.ownData.headIds = player.gameData.personal.ownHeadIds
data.ownData.headFrameIds = player.gameData.personal.ownHeadFrameIds
data.ownData.title1s = player.gameData.personal.ownTitle1s
data.ownData.title2s = player.gameData.personal.ownTitle2s
data.ownData.medals = player.gameData.personal.ownMedals
data.ownData.gainPersonalInfos = player.gameData.personal.gainGoodsInfo
skynet.server.msgTips:Reduce(player , 52)
s2cData.cmd = pb.enum("MsgType","CMD_S2C_PersonalGetData")
s2cData.data = assert(pb.encode("S2CPersonalGetData", data))
end
--个人设置资料
function Personal:SetData( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SPersonalSetData", c2sData.data ))
local curData = c2sData.data.curData
local data ={}
if not curData or #curData.nickName > self.MaxNickNameLen then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
elseif skynet.server.common:IsExistSpecialChar( curData.nickName ) then
s2cData.code = errorInfo.ErrorCode.ExistSpecialChar
elseif skynet.server.common:IsMaskWords( curData.nickName ) then
s2cData.code = errorInfo.ErrorCode.ExistMaskWords
else
player.gameData.nickName = curData.nickName
player.gameData.personal.headId = curData.headId
player.gameData.personal.headFrameId = curData.headFrameId
player.gameData.personal.title1 = curData.title1
player.gameData.personal.title2 = curData.title2
player.gameData.personal.medals = curData.medals
local myPartnerId = player.gameData.partner.id
self:SetDetail( myPartnerId ,
"nickName" , player.gameData.nickName or "" ,
"headId" , player.gameData.personal.headId or 1 ,
"headFrameId" , player.gameData.personal.headFrameId or 0,
"title1" , player.gameData.personal.title1 or 0,
"title2" , player.gameData.personal.title2 or 0,
"medals1" , curData.medals[1] or 0,
"medals2" , curData.medals[2] or 0,
"medals3" , curData.medals[3] or 0 )
--这几种数据无法修改
curData.partnerId = player.gameData.partner.id
curData.level = player.gameData.level
curData.exp = player.gameData.exp
--自定义头像由专门的协议接口修改
curData.DIYHeadInfo = player.gameData.personal.diyHeadInfo
data.curData = curData
end
--data.nickName = curData.nickName
s2cData.cmd = pb.enum("MsgType","CMD_S2C_PersonalSetData")
s2cData.data = assert(pb.encode("S2CPersonalSetData", data))
end
--获取个人详情
function Personal:GetDetail( partnerId )
local redisKey = string.format( redisKeyUrl.GameServerPersonalDetail , partnerId )
local curPartnerRedis = skynet.server.redisCenter:GetPartnerRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
--当前好友ID数据可能未迁移到新的redis所以从旧的数据库去查找
curPartnerRedis = skynet.server.redisCenter:GetPartnerOldRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
--完全没有好友信息就直接返回null
return nil
end
end
local basicInfo = curPartnerRedis:hgetall(redisKey)
basicInfo = redisKeyUrl:CovertTable(basicInfo)
--自定义头像单独处理
if basicInfo.DIYHeadInfo ~= nil and basicInfo.DIYHeadInfo ~="" then
basicInfo.DIYHeadInfo = json:decode(basicInfo.DIYHeadInfo)
end
basicInfo.medals = {}
table.insert( basicInfo.medals , basicInfo.medals1 )
table.insert( basicInfo.medals , basicInfo.medals2 )
table.insert( basicInfo.medals , basicInfo.medals3 )
return basicInfo
end
--获取个人多个参数详情
function Personal:GetMulDetail( partnerId , ... )
local redisKey = string.format( redisKeyUrl.GameServerPersonalDetail , partnerId )
local curPartnerRedis = skynet.server.redisCenter:GetPartnerRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
return nil
end
local value = curPartnerRedis:hmget(redisKey , ...)
local newValue = {}
for k, v in pairs( value ) do
table.insert( newValue , redisKeyUrl:CovertValue(v) )
end
return newValue
end
--获取个人单个参数详情
function Personal:GetCurDetail( partnerId , keyName )
local redisKey = string.format( redisKeyUrl.GameServerPersonalDetail , partnerId )
local curPartnerRedis = skynet.server.redisCenter:GetPartnerRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
--当前好友ID数据可能未迁移到新的redis所以从旧的数据库去查找
curPartnerRedis = skynet.server.redisCenter:GetPartnerOldRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
--完全没有好友信息就直接返回null
return nil
end
end
local value = curPartnerRedis:hget(redisKey , keyName)
return redisKeyUrl:CovertValue( value )
end
--设置个人详情
function Personal:SetDetail( partnerId , ... )
local redisKey = string.format( redisKeyUrl.GameServerPersonalDetail , partnerId )
local curPartnerRedis = skynet.server.redisCenter:GetPartnerRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
--当前好友ID数据可能未迁移到新的redis所以从旧的数据库去查找
curPartnerRedis = skynet.server.redisCenter:GetPartnerOldRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
--完全没有好友信息就直接返回null
return nil
end
end
curPartnerRedis:hmset( redisKey , "updateTime" , skynet.GetTime() , ... )
end
--个人详情累加(整型数据才能操作)
function Personal:AccDetail( partnerId , key , value )
local redisKey = string.format( redisKeyUrl.GameServerPersonalDetail , partnerId )
local curPartnerRedis = skynet.server.redisCenter:GetPartnerRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
--当前好友ID数据可能未迁移到新的redis所以从旧的数据库去查找
curPartnerRedis = skynet.server.redisCenter:GetPartnerOldRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
--完全没有好友信息就直接返回null
return nil
end
end
curPartnerRedis:hincrby( redisKey , key , tonumber(value) )
curPartnerRedis:hset( redisKey , "updateTime" , skynet.GetTime())
end
--获取信息
function Personal:GetInfo( player )
local data = {}
data.nickName = player.gameData.nickName
data.clothesData = player.gameData.personal.clothesData
data.colorData = player.gameData.personal.colorData
return data
end
--增加拥有的各种信息
function Personal:AddOwnData( player , ownType , ownIds , newOwn )
local curData = player.gameData.personal
if nil == ownIds then
return
end
if "table" == type( ownIds ) then
--如果传进来是个表,就遍历
for k, v in pairs( ownIds ) do
--头衔需要根据ID获取下类型
if dataType.PersonalOwnType_Title1 == ownType or dataType.PersonalOwnType_Title2 == ownType then
ownType = self:GetTitleOwnType( player , v )
end
if ownType == dataType.PersonalOwnType_Head then
self:ChangeGainInfo(player , dataType.GoodsType_HeadAndHeadFrame , v , dataType.HeadType_Head , skynet.server.personal.AddGoods)
elseif ownType == dataType.PersonalOwnType_HeadFrame then
self:ChangeGainInfo(player , dataType.GoodsType_HeadAndHeadFrame , v , dataType.HeadType_Frame , skynet.server.personal.AddGoods)
elseif ownType == dataType.PersonalOwnType_Title1 then
table.insert( curData.ownTitle1s , v )
elseif ownType == dataType.PersonalOwnType_Title2 then
table.insert( curData.ownTitle2s , v )
elseif ownType == dataType.PersonalOwnType_Medal then
table.insert( curData.ownMedals , v )
end
table.insert( newOwn , { ownType = ownType , ownId = v })
end
else
if 0 == ownIds then
return
end
if dataType.PersonalOwnType_Title1 == ownType or dataType.PersonalOwnType_Title2 == ownType then
ownType = self:GetTitleOwnType( player , ownIds )
end
if ownType == dataType.PersonalOwnType_Head then
self:ChangeGainInfo(player , dataType.GoodsType_HeadAndHeadFrame , ownIds , dataType.HeadType_Head , skynet.server.personal.AddGoods)
elseif ownType == dataType.PersonalOwnType_HeadFrame then
self:ChangeGainInfo(player , dataType.GoodsType_HeadAndHeadFrame , ownIds , dataType.HeadType_Frame , skynet.server.personal.AddGoods)
elseif ownType == dataType.PersonalOwnType_Title1 then
table.insert( curData.ownTitle1s , ownIds )
elseif ownType == dataType.PersonalOwnType_Title2 then
table.insert( curData.ownTitle2s , ownIds )
elseif ownType == dataType.PersonalOwnType_Medal then
table.insert( curData.ownMedals , ownIds )
end
table.insert( newOwn , { ownType = ownType , ownId = ownIds })
end
end
--获取头衔信息
function Personal:GetTitleOwnType( player , titleId )
local cfgOne = skynet.server.gameConfig:GetPlayerCurCfg( player , "Title" , titleId)
if dataType.TitleType_Adj == cfgOne.type then
return dataType.PersonalOwnType_Title1
elseif dataType.TitleType_Noun == cfgOne.type then
return dataType.PersonalOwnType_Title2
end
end
--[[
--是否存在该玩家
function Personal:IsExist( partnerId )
local redisKey = string.format( redisKeyUrl.GameServerPersonalDetail , partnerId )
local curPartnerRedis = skynet.server.redisCenter:GetPartnerRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
return false
end
return true
end
]]
--更新个人获取物品信息
function Personal:ChangeGainInfo( player , goodsType , goodsId , type , status )
if status == self.AddGoods then
--先添加对应物品
if type == dataType.HeadType_Head then
table.insert(player.gameData.personal.ownHeadIds , goodsId)
elseif type == dataType.HeadType_Frame then
table.insert(player.gameData.personal.ownHeadFrameIds , goodsId)
end
--再更新对应记录
table.insert(player.gameData.personal.gainGoodsInfo , {type = goodsType , id = goodsId , count = 1 , gainTime = skynet.GetTime()})
elseif status == self.DelGoods then
--先移除对应物品
if type == dataType.HeadType_Head then
for k ,v in pairs(player.gameData.personal.ownHeadIds) do
if v == goodsId then
table.remove(player.gameData.personal.ownHeadIds , k)
break
end
end
elseif type == dataType.HeadType_Frame then
for k ,v in pairs(player.gameData.personal.ownHeadFrameIds) do
if v == goodsId then
table.remove(player.gameData.personal.ownHeadFrameIds , k)
break
end
end
end
--再移除对应记录
for k ,v in pairs(player.gameData.personal.gainGoodsInfo) do
if v.type == goodsType and v.id == goodsId then
table.remove(player.gameData.personal.gainGoodsInfo , k)
break
end
end
end
end
--添加离线消息partnerId , msgType , data , retainTime , sendMailTime 分别为好友ID 消息类型 ,消息数据, 保留时间, 发送邮件时间(如果该时间未到,暂时不删除该离线消息)
function Personal:AddOfflineMsg( partnerId , msgType , data , retainTime , sendMailTime )
local msgData = {}
msgData.type = msgType
msgData.data = data
retainTime = retainTime or 7 --如果没有指定保留时间默认7天
retainTime = retainTime * dataType.OneDaySec
msgData.outOfTime = skynet.GetTime() + retainTime
msgData.sendMailTime = sendMailTime or 0 --0表示立即发送
local redisKey = string.format( redisKeyUrl.GameServerPersonalOfflineMsgList , partnerId )
skynet.server.redis:rpush( redisKey , json:encode( msgData ))
skynet.server.redis:expire( redisKey , math.random( 60 * dataType.OneDaySec , 65 * dataType.OneDaySec ) ) --设置60天~65天过期时间
end
--检查离线消息
function Personal:CheckOfflineMsg( player )
local myParentId = player.gameData.partner.id
local redisKey = string.format( redisKeyUrl.GameServerPersonalOfflineMsgList , myParentId )
local allOfflineMsg = skynet.server.redis:lrange( redisKey , 0 , -1)
local curTime = skynet.GetTime()
local listNoDeleteOfflineMsg = {} --暂时不删除的离线消息
--对玩家的各种离线消息进行处理
for k, jsonData in pairs( allOfflineMsg ) do
function Do()
local msgData = json:decode( jsonData )
if curTime <= msgData.outOfTime then --在有效期内的离线消息才会被处理
local data = msgData.data
if 0 ~= msgData.sendMailTime and curTime < msgData.sendMailTime then
--未到指定时间,暂时不删除该离线消息
table.insert( listNoDeleteOfflineMsg, jsonData )
else
if dataType.OfflineMsgType_ActivityDecoRankId == msgData.type then --周赛邮件
--周赛结算邮件
local rankRange = data.rankRange
local rankRewardId = data.rankRewardId
--发送邮件
local award = skynet.server.playerLand:GetRewardInfoNoPlayer( rankRewardId )
local content = string.format("感谢您参与本次的设计师周赛,您的排名位于此次参赛设计师的前%d" , math.floor( rankRange * 100)) .."%" .. ",奖励已随邮件发放,期待您的下次参与哦!" --由于有个百分号,只能采取拼接方式
skynet.server.mail:AddNewMail( player, skynet.server.mail.MailType_Award , "装修周赛奖励" , content , award)
self:SetDetail( myParentId , "decoWeekRewardStatus" , dataType.DecoWeekRewardStatus_SendMail )
skynet.server.msgTips:ReduceAll( player , 122 ) --清除红点
elseif dataType.OfflineMsgType_DoubleSpaceDissolve == msgData.type then --双人空间解散
local removeFurnitures = data.removeFurnitures
for k, goodsId in pairs( removeFurnitures ) do
skynet.server.bag:RemovePutGoodsMaxCount( player , dataType.GoodsType_Furniture , goodsId , 1 )
log.debug(string.format("玩家 %d 双人空间场景 离线移除 家具ID %d " , player.userId , goodsId ))
end
elseif dataType.OfflineMsgType_AddMail == msgData.type then --新增游戏邮件
local mailData = data.mailData
skynet.server.mail:AddNewMail(player, mailData.mailType, mailData.mailTitle, mailData.mailText, mailData.award, false )
elseif dataType.OfflineMsgType_PayFailed == msgData.type then --支付失败
local c2sData = {}
local s2cData = {}
c2sData.account = data.account
c2sData.storeId = data.storeId
c2sData.count = 1
skynet.server.gameServer:AddPayInfo( c2sData , s2cData )
local award = {}
skynet.server.mail:AddNewMail( player , skynet.server.mail.MailType_Msg, "充值物品已到账", "亲爱的小蜗:\
", award, true)
log.debug(string.format("玩家 %s 从缓存中发放充值礼包 %d 数量 %d", data.account , data.storeId , data.count ))
end
end
end
return true
end
local isDo,callData = pcall( Do )
if not isDo then
local errorText = string.format("Personal:CheckOfflineMsg 内部错误")
log.warning( errorText , callData , player.basicInfo.accountName)
end
end
--删除玩家所有的离线消息
skynet.server.redis:del(redisKey)
--将不删除的离线消息重新保存到redis中
for k, jsonData in pairs( listNoDeleteOfflineMsg ) do
skynet.server.redis:rpush( redisKey , jsonData )
skynet.server.redis:expire( redisKey , math.random( 60 * dataType.OneDaySec , 65 * dataType.OneDaySec ) ) --设置60天~65天过期时间
end
end
--是否存在Key
function Personal:IsExistDetailKey( partnerId )
local redisKey = string.format( redisKeyUrl.GameServerPersonalDetail , partnerId )
local curPartnerRedis = skynet.server.redisCenter:GetPartnerRedis( partnerId )
if not curPartnerRedis:exists( redisKey ) then
--如果在新的redis中不存在就去旧的redis中查找
curPartnerRedis = skynet.server.redisCenter:GetPartnerOldRedis( partnerId )
if not curPartnerRedis:exists( redisKey) then
return false
end
end
return true
end
skynet.server.personal = Personal
return Personal