HomeServer/Server/AllServer/GameServer/Friend.lua

1154 lines
49 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 Friend = oo.class()
local json = require "json"
Friend.UserType_AI = 1 --AI
Friend.UserType_Player= 2 --用户
Friend.MsgStatus_Start = 1 --消息开始
Friend.MsgStatus_End = 2 --消息结束
Friend.MsgType_Detail = 0; --文本消息
Friend.MsgType_Friend = 1; --推荐好友消息
Friend.MsgType_Scene = 2; --场景邀请消息
Friend.MsgType_Gift = 3; --赠送礼物消息
Friend.NewsTriggerType_Dialogue = 1 --对话ID
Friend.NewsTriggerType_Favorable = 2 --好感值
Friend.NewsTriggerType_Level = 3 --等级
Friend.MsgStaus_No = 1 --无状态
Friend.MsgStaus_NoClick = 2 --未点击(推荐好友、赠送礼物、场景邀请三个消息会有该状态
Friend.MsgStaus_AlreadyClick = 3 --已点击(推荐好友、赠送礼物、场景邀请点击后的状态)
Friend.Unlock_FavorabilityLevel = 1 --好感等级
Friend.Unlock_Level = 2 --玩家等级
Friend.Unlock_FinishFunc = 3 --完成某功能
function Friend:Init()
end
--登陆初始化数据
function Friend:LoginInitData( player )
self:CheckNewMsg( player )
end
--朋友圈消息列表
function Friend:MsgList( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendMsgList", c2sData.data ))
local data ={}
--self:CheckAddFriend( player )
self:CheckNewMsg( player )
data.msgList = self:GetMsgList( player )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendMsgList")
s2cData.data = assert(pb.encode("S2CFriendMsgList", data))
end
--朋友圈消息详情
function Friend:MsgDetail( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendMsgDetail", c2sData.data ))
local data ={}
local npcId = c2sData.data.npcId
if not npcId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
data = self:GetMsgDetail( player , npcId )
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendMsgDetail")
s2cData.data = assert(pb.encode("S2CFriendMsgDetail", data))
end
--朋友圈客户端发送消息
function Friend:MsgClient( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendMsgClient", c2sData.data ))
local data ={}
local npcId = c2sData.data.npcId
local userType = c2sData.data.userType or 0
local msgId = c2sData.data.msgId
local msgBranch = c2sData.data.msgBranch
log.debug(string.format("玩家 %d 通用朋友圈客户端发送消息 参数 " , player.basicInfo.userID ), npcId , userType ,msgId ,msgBranch)
local curNpc = player.gameData.friend[ npcId ]
if not npcId or not msgId or not userType or not curNpc then
log.debug(string.format("玩家 %d 通用朋友圈客户端发送消息 错误参数1" , player.basicInfo.userID ))
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local isExistMsgId = false --是否存在消息ID
local segIndex = 0
local isOver = false --消息是否结束
--验证消息ID合法性
isExistMsgId , segIndex ,isOver = self:IsVaildMsg( player , npcId , userType , msgId , curNpc.lastUserType , curNpc.lastMsgId )
if not isExistMsgId then
log.debug(string.format("玩家 %d 通用朋友圈客户端发送消息 错误参数2" , player.basicInfo.userID ))
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local isFirstPlayerMsg = false --第一句是否为玩家消息,这样肯定会有问题,
for k, v in pairs( curNpc.msgDetail ) do
if segIndex == v.detail.segIndex and 0 == #v.detail.record and userType == self.UserType_Player then
isFirstPlayerMsg = true
end
end
if isFirstPlayerMsg then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.debug(string.format("玩家 %d 通用朋友圈客户端发送消息 错误参数3" , player.basicInfo.userID ))
else
self:CheckNews( player , npcId , segIndex )
--检查这个ID是否存在,可能新一轮还没开始
local isExistSameId = false
for k1, v1 in pairs( curNpc.msgDetail ) do
if segIndex == v1.detail.segIndex then
for k2, v2 in pairs( v1.detail.record ) do
if userType == v2.userType and msgId == v2.msgId then
isExistSameId = true
end
end
end
end
--不存在这个ID就插入进去
if not isExistSameId then
for k, v in pairs( curNpc.msgDetail ) do
if segIndex == v.detail.segIndex and #v.detail.record <= 10 then
--把玩家的对话加入记录中
local msgStatus = self.MsgStaus_No
local cfgNpcDialog = skynet.server.gameConfig:GetPlayerCurCfg( player , "NPCDialog" , msgId )
if cfgNpcDialog and 0 ~= cfgNpcDialog.notifyType then
msgStatus = self.MsgStaus_NoClick
if 2 == cfgNpcDialog.notifyType then
curNpc.isUnlockHouse = true
log.debug(string.format("玩家 %d 朋友圈 解锁NPC %d 的房间 " , player.userId , npcId))
end
end
--是否能解锁
table.insert( v.detail.record , { userType = userType , msgType = cfgNpcDialog.notifyType , msgId = msgId , msgBranch = msgBranch , msgStatus = msgStatus } )
log.debug(string.format("玩家 %d 朋友圈客户端发送消息 用户类型 %d 消息ID %d 消息分支 %d " , player.userId , userType ,msgId ,msgBranch ))
curNpc.lastUserType = userType
curNpc.lastMsgId = msgId
curNpc.msgCount = curNpc.msgCount - 1
--玩家发送了消息后计算下后面AI还有多少条数据
if self.UserType_Player == userType then
curNpc.msgCount = self:GetEndMsgCount( player , npcId , msgBranch)
log.debug(string.format("玩家 %d 朋友圈客户端发送消息 玩家发送 计算AI剩余条数 %d " , player.userId ,curNpc.msgCount))
end
--星级+1
if isOver then
v.detail.isOver = isOver
curNpc.starLevel = curNpc.starLevel + 1
curNpc.lastUserType = self.UserType_AI
curNpc.lastMsgId = msgId
curNpc.msgCount = self:GetStartMsgCount( player , npcId )
log.debug(string.format("玩家 %d 朋友圈客户端发送消息 一轮对话结束 下一轮星级 %d 下一轮AI消息ID %d 下一轮AI消息数量 %d" , player.basicInfo.userID ,curNpc.starLevel ,
curNpc.lastMsgId , curNpc.msgCount))
skynet.server.levelTask:Modify( player , 36 , 1 )
skynet.server.achieveTask:Modify( player , 36 , 1)
skynet.server.taskListEvent:Modify( player , 36 , 1)
--计算最新的TIPS数量
self:GetMsgTipsCount( player )
player:AddExpForType( 2 )
end
break
end
end
else
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.debug(string.format("玩家 %d 通用朋友圈客户端发送消息 错误参数4" , player.basicInfo.userID ))
end
end
end
end
data = self:GetMsgDetail( player , npcId )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendMsgClient")
s2cData.data = assert(pb.encode("S2CFriendMsgClient", data))
end
--朋友圈消息添加好友
function Friend:AddFriend( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendMsgAddFriend", c2sData.data ))
local data ={}
local npcId = c2sData.data.npcId
local addNpcId = c2sData.data.addNpcId
local msgId = c2sData.data.msgId
if not npcId or not msgId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local npcInfo = player.gameData.friend[ npcId ]
local isExistMsg = false
for k1, v1 in pairs( npcInfo.msgDetail ) do
--找到对应的消息
for k2, v2 in pairs( v1.detail.record ) do
if msgId == v2.msgId and self.MsgType_Friend == v2.msgType and self.MsgStaus_NoClick == v2.msgStatus then
isExistMsg = true
v2.msgStatus = self.MsgStaus_AlreadyClick
--添加好友
self:InitNpc( player , addNpcId )
data = self:GetMsgDetail( player , npcId )
data.msgId = msgId
data.addNpcId = addNpcId
log.debug(string.format("玩家 %d 朋友圈 添加好友成功 参数 %d %d %d" , player.userId , npcId, addNpcId , msgId ))
break
end
end
if isExistMsg then
break
end
end
if not isExistMsg then
s2cData.code = errorInfo.ErrorCode.NoExistFriendMsg
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendMsgAddFriend")
s2cData.data = assert(pb.encode("S2CFriendMsgAddFriend", data))
end
--朋友圈消息获取礼物
function Friend:GetGift( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendMsgGetGift", c2sData.data ))
local data ={}
local npcId = c2sData.data.npcId
local msgIndex = c2sData.data.msgIndex
local msgId = c2sData.data.msgId
if not npcId or not msgIndex or not msgId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local npcInfo = player.gameData.friend[ npcId ]
local isExistMsg = false
for k1, v1 in pairs( npcInfo.msgDetail ) do
--找到对应的消息
--if msgIndex == v1.detail.segIndex then
for k2, v2 in pairs( v1.detail.record ) do
if msgId == v2.msgId and self.MsgType_Gift == v2.msgType and self.MsgStaus_NoClick == v2.msgStatus then
isExistMsg = true
v2.msgStatus = self.MsgStaus_AlreadyClick
--赠送礼物
local cfgNpcDialog = skynet.server.gameConfig:GetPlayerCurCfg( player , "NPCDialog" , msgId )
local rewardId = cfgNpcDialog.notifyValue
if rewardId > 0 then
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_63")
player:GiveReward( rewardId ,eventId)
end
skynet.server.achieveTask:Modify( player , 57 , 1 )
skynet.server.npcTask:Modify( player , 57 , 1 )
skynet.server.taskListEvent:Modify( player , 57 , 1 )
data = self:GetMsgDetail( player , npcId )
data.msgId = msgId
break
end
end
--end
if isExistMsg then
break
end
end
if not isExistMsg then
s2cData.code = errorInfo.ErrorCode.NoExistFriendMsg
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendMsgGetGift")
s2cData.data = assert(pb.encode("S2CFriendMsgGetGift", data))
end
--朋友圈消息进入场景
function Friend:EnterScene( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendMsgEnterScene", c2sData.data ))
local data ={}
local npcId = c2sData.data.npcId
if not npcId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
data.npcId = npcId
data.friend = self:GetFriendDetail( player , npcId )
local npcInfo = player.gameData.friend[ npcId ]
npcInfo.scene.enterCount = npcInfo.scene.enterCount + 1 --场景进入次数
npcInfo.scene.enterTime = skynet.GetTime() --场景进入时间
skynet.server.levelTask:Modify( player , 50 , 1 )
skynet.server.taskListEvent:Modify( player , 50 , 1 )
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendMsgEnterScene")
s2cData.data = assert(pb.encode("S2CFriendMsgEnterScene", data))
end
--朋友圈消息离开场景
function Friend:LeaveScene( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendMsgLeaveScene", c2sData.data ))
local data ={}
local npcId = c2sData.data.npcId
if not npcId or not player.gameData.friend[ npcId ] then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local npcInfo = player.gameData.friend[ npcId ]
npcInfo.scene.enterCount = npcInfo.scene.enterCount + 1 --场景进入次数
if 0 ~= npcInfo.scene.enterTime then
--计算停留时间
local stayTime = skynet.GetTime() - npcInfo.scene.enterTime
npcInfo.scene.stayTime = npcInfo.scene.stayTime + stayTime
npcInfo.scene.enterTime = 0
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendMsgLeaveScene")
s2cData.data = assert(pb.encode("S2CFriendMsgLeaveScene", data))
end
--好友列表展示
function Friend:ListShow( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendListShow", c2sData.data ))
local data ={}
data.friends = {}
for k, v in pairs( player.gameData.friend ) do
table.insert( data.friends , self:GetFriendDetail( player , v.npcId ))
end
skynet.server.msgTips:Reduce( player , 42 )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendListShow")
s2cData.data = assert(pb.encode("S2CFriendListShow", data))
end
--礼物背包
function Friend:GiftBag( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendGiftBag", c2sData.data ))
local data ={}
local npcId = c2sData.data.npcId
local goodsType = c2sData.data.goodsType
if not npcId or not goodsType then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local bagItem = {}
local allGoods = {}
local curNpc = player.gameData.friend[ npcId ]
local isGiveGoods = function( goodsType , goodsId )
for k, v in pairs( curNpc.giftGoods ) do
if v.goodsType == goodsType and v.goodsId == goodsId then
return true
end
end
return false
end
--是否存在商品
local isExistGoods = function( goodsId )
goodsId = skynet.server.gameConfig:RestoreGeneralID( goodsId )
for k, v in pairs( allGoods ) do
if goodsId == v.id then
return true
end
end
return false
end
if dataType.GoodsType_Furniture == goodsType then
self:GetFeatureGoods( player ,npcId ,goodsType , allGoods ) --获取满足特征的商品
local unUsedBag = skynet.server.bag:GetUnusedGoodsInfo( player , goodsType ) --找到未使用的才能赠送
for k, v in pairs( unUsedBag ) do
if v.count > 0 then
--未赠送过并且满足条件的商品才加入
if not isGiveGoods( v.type , v.id ) and isExistGoods( v.id ) then
--符合特征的商品才去查看
--local maxCount = skynet.server.house:GetCurFurnitureMaxCount( player , v.type , v.id )
--maxCount = v.count - maxCount
table.insert( bagItem , { type = v.type , id = v.id , count = v.count > 0 and v.count or 0 , gainTime = v.gainTime })
end
end
end
elseif dataType.GoodsType_Plant == goodsType then
for k, v in pairs( player.gameData.bag ) do
if goodsType == v.type and not isGiveGoods( v.type , v.id ) then
table.insert( bagItem , { type = v.type , id = v.id , count = v.count , gainTime = v.gainTime })
end
end
end
data.npcId = npcId
data.goodsType = goodsType
data.bagItem = bagItem
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendGiftBag")
s2cData.data = assert(pb.encode("S2CFriendGiftBag", data))
end
--赠送礼物
function Friend:GiftGive( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendGiftGive", c2sData.data ))
local data ={}
local npcId = c2sData.data.npcId
local goodsInfo = c2sData.data.goodsInfo
if not npcId or not goodsInfo then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local goodsType = goodsInfo.goodsType
local goodsId = goodsInfo.goodsId
--检查礼物是否合法
local cfgNpc = skynet.server.gameConfig:GetPlayerCurCfg( player , "NPC" , npcId )
local cfgGoods = {}
if not cfgNpc then
s2cData.code = errorInfo.ErrorCode.NoExistCfg
else
local featureCount = 0 --特征满足次数
local favorabilityValue = 0
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
--根据商品类型获取配置
if dataType.GoodsType_Furniture == goodsType then
local tmpGoodsId = skynet.server.gameConfig:RestoreGeneralID( goodsId )
cfgGoods = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture" , tmpGoodsId )
for k1, v1 in pairs( cfgNpc.featureTag ) do
for k2, v2 in pairs( cfgGoods.featureTag ) do
if v1 == v2 then
featureCount = featureCount + 1
end
end
end
favorabilityValue = featureCount * cfgSValue.relationValueTagGift
elseif dataType.GoodsType_Plant == goodsType then
favorabilityValue = cfgSValue.relationValuePlantGift
featureCount = 1
end
if 0 == featureCount then
s2cData.code = errorInfo.ErrorCode.NoSameFeatureGoods
else
local removeCount = 1
local isSuc = skynet.server.bag:IsRemoveGoods( player , goodsType , goodsId , removeCount )
if not isSuc then
s2cData.code = errorInfo.ErrorCode.NoEnoughGoods
else
--这里开是合法的商品
local curNpc = player.gameData.friend[ npcId ]
--增加好感度
self:AddFavorability( player, curNpc , favorabilityValue)
table.insert( curNpc.giftGoods , { goodsType = goodsType , goodsId = goodsId })
player:AddExpForType( 3 )
curNpc.giveFriendGift = curNpc.giveFriendGift + 1
--扣除商品
skynet.server.bag:RemoveGoods( player , goodsType , goodsId , removeCount )
skynet.server.levelTask:Modify( player , 17, 1 )
skynet.server.dailyTask:Modify( player , 17 , 1)
skynet.server.achieveTask:Modify( player , 17 , 1 )
skynet.server.npcTask:Modify( player , 17 , 1 )
skynet.server.taskListEvent:Modify( player , 20 , 1 )
skynet.server.taskListEvent:Modify( player , 17 , 1 )
data.npcId = npcId
data.goodsInfo = {}
data.goodsInfo.goodsType = goodsType
data.goodsInfo.goodsId = goodsId
data.goodsInfo.goodsCount = 1
data.friends = self:GetFriendDetail( player , npcId )
end
end
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendGiftGive")
s2cData.data = assert(pb.encode("S2CFriendGiftGive", data))
end
--友圈动态
function Friend:NewsShow( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendNewsShow", c2sData.data ))
local data ={}
data.news = {}
for k1, v1 in pairs( player.gameData.friend ) do
for k2, v2 in pairs( v1.news ) do
table.insert( data.news , { npcId = v1.npcId , newsId = v2.id , isLike = v2.isLike , updateTime = v2.updateTime})
end
end
--降序
table.sort(data.news,function (a,b)
return a.updateTime > b.updateTime
end)
skynet.server.msgTips:Reduce( player , 43 )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendNewsShow")
s2cData.data = assert(pb.encode("S2CFriendNewsShow", data))
end
--友圈点赞
function Friend:LikeNews( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendLikeNews", c2sData.data ))
local data ={}
data.news ={}
local news = c2sData.data.news
if not news then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local curNpc = player.gameData.friend[ news.npcId ]
if not curNpc then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local isExist = false
for k, v in pairs( curNpc.news ) do
if news.newsId == v.id then
--v.isLike = news.isLike
if v.isLike then
v.isLike = false
else
v.isLike = true
end
data.news.npcId = news.npcId
data.news.newsId = news.newsId
data.news.isLike = v.isLike
isExist = true
break
end
end
if not isExist then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
end
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendLikeNews")
s2cData.data = assert(pb.encode("S2CFriendLikeNews", data))
end
--友圈互动
function Friend:Interact( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SFriendInteract", c2sData.data ))
local data ={}
local npcId = c2sData.data.npcId
if not npcId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local curNpc = player.gameData.friend[ npcId ]
if not curNpc then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
if not curNpc.isInteract then
curNpc.isInteract = true
--增加好感度
self:AddFavorability( player, curNpc , 1 )
end
data.friend = self:GetFriendDetail( player , npcId )
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_FriendInteract")
s2cData.data = assert(pb.encode("S2CFriendInteract", data))
end
--检查是否有新消息
function Friend:CheckNewMsg( player )
if not player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then
return
end
local cfgPlayerDialog = skynet.server.gameConfig:GetPlayerAllCfg( player , "PlayerDialog")
for k, v in pairs( cfgPlayerDialog ) do
local npcId = v.NPCId
local curNpc = player.gameData.friend[ npcId ]
if curNpc and self:IsUnlockDialog( player , v , v.segIndex ) then
local detail = { segIndex = v.segIndex , isOver = false , record = {} }
table.insert( curNpc.msgDetail , { msgType = self.MsgType_Detail , msgIndex = curNpc.curMsgIndex , detail = detail} )
skynet.server.msgTips:AddNoNotice( player , 15 )
end
end
end
--初始化新NPC
function Friend:InitNpc( player , npcId )
if not player.gameData.friend[ npcId ] then
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
player.gameData.friend[ npcId ] = {}
local curNpc = player.gameData.friend[ npcId ]
curNpc.npcId = npcId
curNpc.starLevel = 0 --星级
curNpc.msgCount = self:GetStartMsgCount( player , npcId )
curNpc.lastUserType = self.UserType_AI
curNpc.lastMsgId = self:GetLastInitMsgID( player , npcId )
curNpc.isMsgTips = false
curNpc.msgDetail = {} --消息
curNpc.isUnlockHouse = false --是否解锁房间
curNpc.isInteract = false
curNpc.favorabilityLevel = 0 --好感等级
curNpc.favorabilityValue = 0 --好感值
curNpc.giftGoods = {} --玩家赠与过的家具
curNpc.scene = {} --场景信息
curNpc.scene.enterCount = 0 --场景进入次数
curNpc.scene.enterTime = 0 --进入时间
curNpc.scene.stayTime = 0 --场景停留时间
curNpc.news = {}
curNpc.giveFriendGift = 0 --赠送给好友的礼物数量
self:CheckNewMsg( player )
skynet.server.msgTips:Reset( player , 42 )
skynet.server.msgTips:Add( player , 42 )
log.debug(string.format("玩家 %d 朋友圈 初始化NPC %d" , player.userId , npcId ))
end
end
--新消息生成
function Friend:NewMsg( npcId , segIndex )
local record = {}
local lastMsgId = 0
local cfgNPCDialog = skynet.server.gameConfig.NPCDialog
for k, v in pairs( cfgNPCDialog ) do
if npcId == v.NPCId and segIndex == v.segIndex then
table.insert( record , { userType = self.UserType_AI , msgId = v.id } )
if 1 == v.triggerId then
lastMsgId = v.id
break
end
end
end
return record,lastMsgId
end
--是否存在对话
function Friend:IsExistDialog( player , npcId , segIndex )
local npcInfo = player.gameData.friend[ npcId ]
if npcInfo then
for npcId, v in pairs( npcInfo.msgDetail ) do
if self.MsgType_Detail == v.msgType and segIndex == v.detail.segIndex then
return true
end
end
end
return false
end
--是否有消息提示
function Friend:IsExistMsgTips( player , npcId )
local npcInfo = player.gameData.friend[ npcId ]
if npcInfo then
for k, v in pairs( npcInfo.msgDetail ) do
--有消息没有结束
if self.MsgType_Detail == v.msgType and false == v.detail.isOver then
return true
end
end
end
return false
end
--获取朋友圈消息列表
function Friend:GetMsgList( player )
local data = {}
for k, v in pairs( player.gameData.friend ) do
table.insert( data , { npcId = k , starLevel = v.favorabilityLevel , msgCount = v.msgCount ,lastUserType = v.lastUserType , lastMsgId = v.lastMsgId , isMsgTips = self:IsExistMsgTips( player , k)})
end
return data
end
--获取朋友圈消息详情
function Friend:GetMsgDetail( player , npcId )
local data = {}
data.npcId = npcId
data.msgDetail = {}
local count = 0 --没有结束的只能有一条发给客户端
local npcInfo = player.gameData.friend[ npcId ]
if npcInfo then
for k, v in pairs(npcInfo.msgDetail) do
if self.MsgType_Detail == v.msgType and count < 1 then
table.insert( data.msgDetail , v.detail)
if not v.detail.isOver then
count = count+ 1
end
end
end
end
return data
end
--获取初始化的消息ID
function Friend:GetLastInitMsgID( player , npcId )
--local segIndex =player.gameData.friend[ npcId ].curMsgIndex
local startSegIndex = 1
--[[if 1 == npcId then
startSegIndex = 13
end]]
local cfgNPCDialog = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPCDialog")
for k, v in pairs( cfgNPCDialog ) do
--if npcId == v.NPCId and segIndex == v.segIndex and 1 == v.beginOrEnd then
if npcId == v.NPCId and 1 == v.beginOrEnd and startSegIndex == v.segIndex then
return v.id
end
end
end
--获取最新开始消息ID
function Friend:GetLastStartMsgID( player , npcId , segIndex )
local cfgNPCDialog = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPCDialog")
for k, v in pairs( cfgNPCDialog ) do
if npcId == v.NPCId and 1 == v.beginOrEnd and segIndex == v.segIndex then
return v.id
end
end
end
--获取最新的消息ID
function Friend:GetStartMsgCount( player , npcId )
local id1,id2 =0,0
local startSegIndex = 1
--[[if 1 == npcId then
startSegIndex = 13
end]]
--local segIndex =player.gameData.friend[ npcId ].curMsgIndex
local cfgNPCDialog = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPCDialog")
for k, v in pairs( cfgNPCDialog ) do
--if npcId == v.NPCId and segIndex == v.segIndex then
if npcId == v.NPCId and startSegIndex == v.segIndex then
if 1 == v.beginOrEnd then
id1 = v.id
end
if 1 == v.triggerId then
id2 = v.id
end
end
end
return (id2 - id1) + 1
end
--获取最新的消息ID
function Friend:GetEndMsgCount( player , npcId , msgBranch )
local count = 0
local segIndex =player.gameData.friend[ npcId ].starLevel + 1
local cfgNPCDialog = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPCDialog")
for k, v in pairs( cfgNPCDialog ) do
if npcId == v.NPCId and segIndex == v.segIndex and msgBranch == v.branch then
count = count + 1
end
end
return count
end
--是否有效的消息
function Friend:IsVaildMsg( player , npcId , userType , curMsgId , lastUserType , lastMsgId )
local isExistMsgId = false --是否存在消息ID
local segIndex = 0
local isOver = false --消息是否结束
local isCheck = true --是否开记检测 这个功能复杂线上会先10%的检测
if isCheck and self.UserType_AI == lastUserType then
local cfgLastNPCDialog = skynet.server.gameConfig:GetCurCfg("NPCDialog" , lastMsgId )
if not cfgLastNPCDialog then
log.warning(string.format("玩家 %d 友圈检测消息出错 NPCDialog找不到配置 %d", player.userId , lastMsgId or 0))
return isExistMsgId ,segIndex ,isOver
end
--如果上一条未触发玩家对话,那么这一条肯定不是玩家对话,需要报错返回
--[[
if 0 == cfgLastNPCDialog.triggerId and userType == self.UserType_Player then
log.warning(string.format("玩家 %d 友圈检测消息出错1 消息不对", player.userId ))
return isExistMsgId ,segIndex ,isOver
end
]]
--如果上一条触发玩家对话则当前消息不可能是AI消息需要报错返回
if 1 == cfgLastNPCDialog.triggerId and userType == self.UserType_AI and 1 ~= cfgLastNPCDialog.beginOrEnd then
log.warning(string.format("玩家 %d 友圈检测消息出错2 消息不对", player.userId ))
return isExistMsgId ,segIndex ,isOver
end
elseif isCheck and self.UserType_Player == lastUserType then
local cfgPlayerDialog = skynet.server.gameConfig:GetCurCfg("PlayerDialog" , lastMsgId )
if not cfgPlayerDialog then
log.warning(string.format("玩家 %d 友圈检测消息出错 PlayerDialog找不到配置 %d", player.userId , lastMsgId or 0))
return isExistMsgId ,segIndex ,isOver
end
--如果上一条是玩家对话,则当前消息不可能是又是玩家对话,需要报错返回
if userType == self.UserType_Player then
log.warning(string.format("玩家 %d 友圈检测消息出错3 消息不对", player.userId ))
return isExistMsgId ,segIndex ,isOver
end
end
if self.UserType_AI == userType then
local cfgNPCDialog = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPCDialog")
for k, v in pairs( cfgNPCDialog ) do
if npcId == v.NPCId and curMsgId == v.id then
isExistMsgId = true
segIndex = v.segIndex
if v.beginOrEnd == self.MsgStatus_End then
isOver = true
end
end
end
elseif self.UserType_Player == userType then
local cfgPlayerDialog = skynet.server.gameConfig:GetPlayerAllCfg( player , "PlayerDialog")
for k, v in pairs( cfgPlayerDialog ) do
if npcId == v.NPCId and curMsgId == v.id then
isExistMsgId = true
segIndex = v.segIndex
end
end
end
return isExistMsgId ,segIndex ,isOver
end
--获取消息提示数量
function Friend:GetMsgTipsCount( player )
skynet.server.msgTips:Reset( player , 15 )
for k1, v1 in pairs( player.gameData.friend ) do
local isTips = false
for k2, v2 in pairs( v1.msgDetail ) do
if self.MsgType_Detail == v2.msgType and false == v2.detail.isOver then
isTips = true
break
end
end
if isTips then
skynet.server.msgTips:Add( player , 15 )
end
end
end
--检查是不是有新的朋友圈消息
function Friend:CheckNews( player , npcId , segIndex )
local cfgNpcNews = skynet.server.gameConfig:GetPlayerAllCfg( player , "NpcNews")
for k, v in pairs( cfgNpcNews ) do
if npcId == v.npcId and segIndex == v.typeValue then
if self.NewsTriggerType_Dialogue == v.type then
self:AddNews( player , npcId , v.id)
elseif self.NewsTriggerType_Favorable == v.type then
elseif self.NewsTriggerType_Level == v.type then
end
end
end
end
--新增朋友圈消息
function Friend:AddNews( player , npcId , newsId )
local curNews = player.gameData.friend[ npcId ].news
local isExist = false
for k, v in pairs( curNews ) do
if newsId == v.id then
isExist = true
break
end
end
if not isExist then
table.insert( curNews , { id = newsId , isLike = false , updateTime = skynet.GetTime()})
skynet.server.msgTips:Reset( player , 43 )
skynet.server.msgTips:Add( player , 43 )
skynet.server.npcTask:Modify( player , 95 , 1 )
skynet.server.taskListEvent:Modify( player , 95 , 1 )
end
end
--获取特征商品
function Friend:GetFeatureGoods( player , npcId , goodsType , allGoods)
local cfgNpc = skynet.server.gameConfig:GetPlayerCurCfg( player , "NPC" , npcId )
local cfgGoods = {} --符合当前NPC的商品
--根据商品类型获取配置
if dataType.GoodsType_Furniture == goodsType then
cfgGoods = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture")
end
--从配置中查找符合特征的商品
for k1, v1 in pairs( cfgNpc.featureTag ) do --当前NPC特征
for k2, v2 in pairs( cfgGoods ) do
for k3, v3 in pairs( v2.featureTag ) do
if v1 == v3 then
table.insert( allGoods , { id = v2.id })
break
end
end
end
end
end
--获取朋友详情
function Friend:GetFriendDetail( player , npcId )
local friends = {}
for k1, v1 in pairs( player.gameData.friend ) do
if npcId == v1.npcId then
friends.id = npcId
friends.favorabilityLevel = v1.favorabilityLevel
friends.favorabilityValue = v1.favorabilityValue
friends.isUnlockHouse = v1.isUnlockHouse
friends.furnitures = {}
friends.isInteract = v1.isInteract
for k2, v2 in pairs(v1.giftGoods) do
if dataType.GoodsType_Furniture == v2.type then
table.insert(friends.furnitures , v2.id)
end
end
break
end
end
return friends
end
--增加好感度
function Friend:AddFavorability( player, curNpc , count )
local data = {}
data.preFriend = self:GetFriendDetail( player , curNpc.npcId ) --改变前
--11级后就不再增加好感度
if curNpc.favorabilityLevel >= 11 then
return
end
local cfgNPCFavorability = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPCFavorability")
local cfgOne = nil
for k, v in pairs( cfgNPCFavorability ) do
if curNpc.favorabilityLevel == v.relationLevel then
cfgOne = v
break
end
end
if not cfgOne then
return
end
--增加好感值
curNpc.favorabilityValue = curNpc.favorabilityValue + count
--好感度升级
if curNpc.favorabilityValue >= cfgOne.targetValue then
curNpc.favorabilityLevel = curNpc.favorabilityLevel + 1
curNpc.favorabilityValue = curNpc.favorabilityValue - cfgOne.targetValue
--最大只有11级
if curNpc.favorabilityLevel >= 11 then
curNpc.favorabilityLevel = 11
else
self:CheckNewMsg( player )
if 4 == curNpc.npcId then
skynet.server.levelTask:Modify( player , 56 , 1 , 7 )
skynet.server.taskListEvent:Modify( player , 56 , 1 )
elseif 6 == curNpc.npcId then
skynet.server.levelTask:Modify( player , 56 , 1 , 8 )
skynet.server.taskListEvent:Modify( player , 56 , 1 )
elseif 7 == curNpc.npcId then
skynet.server.levelTask:Modify( player , 56 , 1 , 9 )
skynet.server.taskListEvent:Modify( player , 56 , 1 )
elseif 9 == curNpc.npcId then
skynet.server.levelTask:Modify( player , 56 , 1 , 11 )
skynet.server.taskListEvent:Modify( player , 56 , 1 )
end
skynet.server.npcTask:Modify( player , 56 , 1 )
skynet.server.taskListEvent:Modify( player , 56 , 1 )
end
end
data.friend = self:GetFriendDetail( player , curNpc.npcId ) --改变后
skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_FriendFavorabilityChange" , data )
end
--检查是不是有好友没有添加
function Friend:CheckAddFriend( player )
for k1, v1 in pairs( player.gameData.friend ) do
for k2, v2 in pairs( v1.msgDetail ) do
for k3, v3 in pairs( v2.detail.record ) do
if self.MsgType_Friend == v3.msgType and self.MsgStaus_NoClick == v3.msgStatus then
v3.msgStatus = self.MsgStaus_AlreadyClick
local cfgNpcDialog = skynet.server.gameConfig:GetPlayerCurCfg( player , "NPCDialog" , v3.msgId )
local addNpcId = cfgNpcDialog.notifyValue
--添加好友
self:InitNpc( player , addNpcId )
log.debug(string.format("玩家 %d 朋友圈 自动添加好友 %d 成功" , player.userId , addNpcId ))
break
end
end
end
end
end
--是否解锁对话
function Friend:IsUnlockDialog( player , cfgOnePlayerDialog , segIndex )
local npcId = cfgOnePlayerDialog.NPCId
if 0 == cfgOnePlayerDialog.unlockType then
return false
end
--存在对话就返回
if self:IsExistDialog( player , npcId , segIndex ) then
return false
end
local level = player.gameData.level
local curNpc = player.gameData.friend[ npcId ]
local isAdd = false
if curNpc then
--到达指定等级就解锁对话
if 1 == cfgOnePlayerDialog.unlockType and cfgOnePlayerDialog.unlockValue <= curNpc.favorabilityLevel then
isAdd = true
elseif 2 == cfgOnePlayerDialog.unlockType and cfgOnePlayerDialog.unlockValue <= level then
isAdd = true
elseif 3 == cfgOnePlayerDialog.unlockType then
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
local cfgCuisineMenu = skynet.server.gameConfig:GetPlayerAllCfg( player , "CuisineMenu")
local count = 0
if 1 == cfgOnePlayerDialog.unlockValue then --在植物小铺出售n次植物
count = cfgSValue.flowerShopSell
local shopType = dataType.ShopType_Plant
local sellCount = player.gameData.shop[ shopType ].sellCount
if sellCount >= count then
isAdd = true
end
elseif 2 == cfgOnePlayerDialog.unlockValue then --地图花店解锁
if skynet.server.map:IsUnlock( player , 2 ) then
isAdd = true
end
elseif 3 == cfgOnePlayerDialog.unlockValue then --言叶小屋解锁
if level >= cfgSValue.npcYYHouseUnlockLvl then
isAdd = true
end
elseif 4 == cfgOnePlayerDialog.unlockValue and player:IsUnlockSystem( dataType.UnlockSystem_CoffeeShop ) then --玩家在咖啡店完成n次材料合成
count = cfgSValue.coffeeMaterialMerge
local shopType = dataType.ShopType_Coffee
local mergeCount = player.gameData.shop[ shopType ].mergeCount
if mergeCount >= count then
isAdd = true
end
elseif 5 == cfgOnePlayerDialog.unlockValue and player:IsUnlockSystem( dataType.UnlockSystem_CoffeeShop ) then --玩家在咖啡店收集n种新咖啡
count = cfgSValue.coffeeNewComplete
local shopType = dataType.ShopType_Coffee
local coffeesCount = #player.gameData.shop[ shopType ].coffees
if coffeesCount >= count then
isAdd = true
end
elseif 6 == cfgOnePlayerDialog.unlockValue and player:IsUnlockSystem( dataType.UnlockSystem_StyleRoom ) then --玩家在造型室完成n次阶段设计
count = cfgSValue.styleProgressComplete
local shopType = dataType.ShopType_Style
local curStyleId = player.gameData.shop[ shopType ].curStyleId
if curStyleId > count then
isAdd = true
end
elseif 7 == cfgOnePlayerDialog.unlockValue and player:IsUnlockSystem( dataType.UnlockSystem_CuisineShop ) then --玩家在料理店解锁1道隐藏料理
--等配置
count = 1
local shopType = dataType.ShopType_Cuisine
local attemptCount = 0 --玩家解锁隐藏料理的数量
for k ,v in pairs(player.gameData.shop[ shopType ].cuisineInfos) do
if v.status == 1 and cfgCuisineMenu[ v.id ].foodType == 2 then
attemptCount = attemptCount + 1
end
end
if attemptCount >= count then
isAdd = true
end
elseif 8 == cfgOnePlayerDialog.unlockValue and player:IsUnlockSystem( dataType.UnlockSystem_CuisineShop ) then --玩家在料理店完成4级常规料理
local shopType = dataType.ShopType_Cuisine
if player.gameData.shop[ shopType ].menuInfos[ 4 ].status > 0 then
isAdd = true
end
elseif 9 == cfgOnePlayerDialog.unlockValue and player:IsUnlockSystem( dataType.UnlockSystem_FishShop ) then --玩家解锁所有鱼竿
local shopType = dataType.ShopType_Fish
local isFinish = true
for k,v in pairs(player.gameData.shop[ shopType ].fishingRodInfos) do
if v.status == 0 then
isFinish = false
end
end
--isAdd = isFinish
elseif 10 == cfgOnePlayerDialog.unlockValue then --完成小家拜访
if curNpc.scene.enterCount >= 1 then
isAdd = true
end
elseif 11 == cfgOnePlayerDialog.unlockValue then --搬至仕居
local curHouse = player.gameData.house[1]
if curHouse and not curHouse.isFirstEnter then
isAdd = true
end
elseif 12 == cfgOnePlayerDialog.unlockValue then --搬至晨曦小筑
local curHouse = player.gameData.house[2]
if curHouse and not curHouse.isFirstEnter then
isAdd = true
end
elseif 13 == cfgOnePlayerDialog.unlockValue then --搬至两室标间
local curHouse = player.gameData.house[3]
if curHouse and not curHouse.isFirstEnter then
isAdd = true
end
elseif 14 == cfgOnePlayerDialog.unlockValue then --在宠物店完成所有课程
local petShop = player.gameData.shop[dataType.ShopType_PetShop]
local isTrue = true
for k, v in pairs(petShop.courseType) do
if petShop.petStudy[v].studyLvl == 4 and petShop.petStudy[v].studyStage == 5 and petShop.petStudy[v].studyExp == 40000 then
else
isTrue = false
end
end
isAdd = isTrue
elseif 15 == cfgOnePlayerDialog.unlockValue then --在恋家置业购买LOFT
if skynet.server.house:IsBuyHouse( player , 7 ) then
isAdd = true
end
elseif 16 == cfgOnePlayerDialog.unlockValue and player:IsUnlockSystem( dataType.UnlockSystem_PetShop ) then --在宠物店完成所有魔法课程
local petShop = player.gameData.shop[dataType.ShopType_PetShop]
if petShop.petStudy[3].studyLvl == 4 and petShop.petStudy[3].studyStage == 5 and petShop.petStudy[3].studyExp == 40000 then
isAdd = true
end
elseif 17 == cfgOnePlayerDialog.unlockValue and player:IsUnlockSystem( dataType.UnlockSystem_PetShop ) then --在宠物店完成所有体育课程
local petShop = player.gameData.shop[dataType.ShopType_PetShop]
if petShop.petStudy[2].studyLvl == 4 and petShop.petStudy[2].studyStage == 5 and petShop.petStudy[2].studyExp == 40000 then
isAdd = true
end
elseif 18 == cfgOnePlayerDialog.unlockValue and player:IsUnlockSystem( dataType.UnlockSystem_PetShop ) then --在宠物店完成所有语言课程
local petShop = player.gameData.shop[dataType.ShopType_PetShop]
if petShop.petStudy[1].studyLvl == 4 and petShop.petStudy[1].studyStage == 5 and petShop.petStudy[1].studyExp == 40000 then
isAdd = true
end
end
elseif 4 == cfgOnePlayerDialog.unlockType and skynet.server.map:IsVisitMap( player , cfgOnePlayerDialog.unlockValue ) then
isAdd = true
elseif 5 == cfgOnePlayerDialog.unlockType and curNpc.giveFriendGift >= cfgOnePlayerDialog.unlockValue then
isAdd = true
elseif 6 == cfgOnePlayerDialog.unlockType and self:IsExistDialog( player , npcId , 1 ) and skynet.server.birthday:IsUnlockNpcDialog( player ) then --生日解锁对话 NPC必须要解锁1这个对话
isAdd = true
end
else
return false
end
return isAdd
end
--检查解锁NPC
function Friend:CheckUnlockNpc( player )
local level = player.gameData.level
local cfgNPC = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPC")
for k, v in pairs( cfgNPC ) do
if 1 == v.unlockType and level == v.unlockValue then
self:InitNpc( player , v.id )
end
end
end
skynet.server.friend = Friend
return Friend