HomeServer/Server/AllServer/GameServer/DoubleSpace.lua

2218 lines
91 KiB
Lua
Raw Normal View History

2024-11-20 15:41:09 +08:00
local skynet = require "skynet"
local oo = require "Class"
local pb = require "pb"
local log = require "Log"
local errorInfo = require "ErrorInfo"
local dataType = require "DataType"
local redisKeyUrl = require "RedisKeyUrl"
local sqlUrl = require "SqlUrl"
local json = require "json"
local serverId = tonumber(skynet.getenv "serverId")
local shop = require "Shop"
local DoubleSpace = oo.class(shop)
DoubleSpace.houseId = 6 --双人空间的房子
DoubleSpace.ShopTypeNo = 12 --友爱商店在配置中的商店ID
DoubleSpace.MaxNickNameLen = 21 --最大昵称长度
--初始装修方案列表
DoubleSpace.initDeco = {}
--双人空间已经购买的房间id列表rediskey
DoubleSpace.doubleSpaceBuyHouseKey = "doubleSpaceBuyHouse"
--双人空间已购买的装修方案列表rediskey[% 房间id]
DoubleSpace.doubleSpaceBuyDecoKey = "doubleSpaceBuyDecoList_%s"
function DoubleSpace:Init()
--默认方案
local decorate = {}
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 1 , decoId = 25 })
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 2 , decoId = 24 })
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 3 , decoId = 24 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 1 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 2 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 3 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_Door , facilityId = 1 , decoId = 26 })
table.insert( decorate , { facilityType = dataType.DecorateType_Door , facilityId = 2 , decoId = 26 })
table.insert( decorate , { facilityType = dataType.DecorateType_Bar , facilityId = 1 , decoId = 27 })
table.insert( decorate , { facilityType = dataType.DecorateType_Eave , facilityId = 0 , decoId = 210 })
table.insert( decorate , { facilityType = dataType.DecorateType_OutDeco , facilityId = 0 , decoId = 211 })
--table.insert( decorate , { facilityType = dataType.DecorateType_OutDoorDeco , facilityId = 0 , decoId = 0 })
table.insert( decorate , { facilityType = dataType.DecorateType_OutDoorFloor , facilityId = 0 , decoId = 262 })
DoubleSpace.initDeco[DoubleSpace.houseId]=decorate
--阳光友居
local decorate2 = {}
table.insert( decorate2 , { facilityType = dataType.DecorateType_WallPaper , facilityId = 1 , decoId = 23 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_WallPaper , facilityId = 2 , decoId = 23 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_WallPaper , facilityId = 3 , decoId = 23 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_WallPaper , facilityId = 4 , decoId = 23 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_WallPaper , facilityId = 5 , decoId = 23 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_WallPaper , facilityId = 6 , decoId = 23 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_Floor , facilityId = 1 , decoId = 24 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_Floor , facilityId = 2 , decoId = 24 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_Floor , facilityId = 3 , decoId = 24 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_Floor , facilityId = 4 , decoId = 24 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_Stair , facilityId = 1 , decoId = 163 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_HandRail , facilityId = 1 , decoId = 164 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_Door , facilityId = 1 , decoId = 26 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_Bar , facilityId = 1 , decoId = 27 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_Eave , facilityId = 0 , decoId = 210 })
table.insert( decorate2 , { facilityType = dataType.DecorateType_OutDeco , facilityId = 0 , decoId = 211 })
DoubleSpace.initDeco[14]=decorate2
end
--初始化玩家数据
function DoubleSpace:InitData( player )
local myPlayerId = player.gameData.partner.id
skynet.server.personal:SetDetail( myPlayerId ,"doubleSpaceCount", 0 )
end
--初始装修
function DoubleSpace:InitDeco(houseId)
return self.initDeco[houseId]
end
--创建双人空间
function DoubleSpace:Cretate( player , otherPartnerId )
local addHouseIdList = {}
local myPartnerId = player.gameData.partner.id
--添加默认房间
self:AddHouseInfo(player, otherPartnerId , self.houseId,true )
table.insert(addHouseIdList,self.houseId)
--检查已购买的房间
local myBuyHouseList = self:GetBuyHouseIdList(myPartnerId)
--获取好友购买房间信息
local otherBuyHouseList = self:GetBuyHouseIdList(otherPartnerId)
if next(myBuyHouseList) and next(otherBuyHouseList) then
for _, myHouseId in ipairs(myBuyHouseList) do
for _, otherHouseId in ipairs(otherBuyHouseList) do
--共同都有这个房屋
if myHouseId == otherHouseId then
--添加房间
self:AddHouseInfo(player, otherPartnerId , myHouseId )
table.insert(addHouseIdList, otherHouseId)
--添加装修方案
local myBuyHouseDecList=self:GetBuyHouseDecorateList(myPartnerId, myHouseId)
local otherBuyHouseDecList=self:GetBuyHouseDecorateList(otherPartnerId, otherHouseId)
if next(myBuyHouseDecList) and next(otherBuyHouseDecList) then
for _, myBuyHouseDec in ipairs(myBuyHouseDecList) do
for _, otherBuyHouseDec in ipairs(otherBuyHouseDecList) do
--共同都有这个装修方案
if myBuyHouseDec == otherBuyHouseDec then
--添加装方案
self:AddHouseDeco( player, otherPartnerId , myHouseId ,myBuyHouseDec )
end
end
end
end
end
end
end
end
skynet.server.personal:SetDetail( myPartnerId ,"isExistDoubleSpace", true) --是否存在双人空间
skynet.server.personal:SetDetail( otherPartnerId ,"isExistDoubleSpace", true) --是否存在双人空间
skynet.server.personal:AccDetail( myPartnerId ,"doubleSpaceCount", 1) --增加双人空间数量
skynet.server.personal:AccDetail( otherPartnerId ,"doubleSpaceCount", 1) --增加双人空间数量
--我同意创建双人间,我增加双人空间户型,解锁该房间主要是在商店里刷出门和护栏
local s2cData ={}
for _, tempHouseId in ipairs(addHouseIdList) do
skynet.server.house:Add( player , tempHouseId , s2cData , false)
end
skynet.server.gameRecord:Add( player.userId , dataType.GameRecordType_200 , myPartnerId , otherPartnerId )
end
--更新双人空间数据到redis,isdwell是否居住
function DoubleSpace:AddHouseInfo(player, otherPartnerId , houseId,isDwell )
isDwell = isDwell or false
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
local createTime=skynet.GetTime()
local createTimeRedis = skynet.server.redis:hget( myInfoKey , "createTime" )
if type(createTimeRedis) == "number" then
createTime=createTimeRedis
end
local allHouseId=json:encode({ houseId })
local allHouseIdRedisJson = skynet.server.redis:hget( myInfoKey , "allHouseId" )
if allHouseIdRedisJson ~= nil then
local allHouseIdRedis=json:decode(allHouseIdRedisJson)
--是否存在
local isExist=false
--判断是否存在
for _, value in ipairs(allHouseIdRedis) do
if value == houseId then
isExist = true
break
end
end
if not isExist then
table.insert(allHouseIdRedis, houseId)
end
allHouseId=json:encode(allHouseIdRedis)
end
if isDwell then
skynet.server.redis:hmset( myInfoKey ,
"spaceName", "温馨小家" , --空间名称
"allHouseId" , allHouseId , --所有房间ID
"createTime", createTime , --创建时间
self:GetMyKey("curHouseId" , myPartnerId ) , houseId , --我当前房间ID
self:GetMyKey("curHouseId" , otherPartnerId ) , houseId , --好友当前房间ID
self:GetMyKey("decorates" , houseId ) , json:encode(self:InitDeco(houseId))--, --室内装修
)--self:GetMyKey("furnitures" , houseId ) , json:encode({}) --装修家具信息
--创建的时候才加家具
if houseId ==self.houseId then
skynet.server.redis:hmset( myInfoKey ,
self:GetMyKey("furnitures" , houseId ) , json:encode({}),
self:GetMyKey("decoPartnerId" , houseId ) , "" , --当前房间装修玩家)
self:GetMyKey("decoStartTime" , houseId ) , 0 ) --当前房间开始装修时间
end
else
skynet.server.redis:hmset( myInfoKey ,
"spaceName", "温馨小家" , --空间名称
"allHouseId" , allHouseId , --所有房间ID
"createTime", createTime --创建时间
--self:GetMyKey("decorates" , houseId ) , json:encode(self:InitDeco(houseId)) --室内装修
)--self:GetMyKey("furnitures" , houseId ) , json:encode({})
end
--添加房屋
self:AddBuyHouseId(player, myPartnerId , houseId )
self:AddBuyHouseId(player, otherPartnerId , houseId )
end
--获取双人空间当前房间已有的房间列表
function DoubleSpace:GetDoubleSpaceHouseIdList( player, otherPartnerId )
--房屋
local houseIdList = {}
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
local houseIdRedisListJson = skynet.server.redis:hget( myInfoKey ,"allHouseId") --已有的房间
if houseIdRedisListJson== nil then
return houseIdList
end
local houseIdRedisList=json:decode(houseIdRedisListJson)
for _, value in pairs(houseIdRedisList) do
table.insert( houseIdList , value )
end
return houseIdList
end
--启动房间
function DoubleSpace:StartHouse( player, otherPartnerId ,houseId )
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--是否启用当前装修方案
skynet.server.redis:hset( myInfoKey ,self:GetMyKey("curHouseId" , myPartnerId ) , houseId ) --已有的装修方案
end
--获取当前房间ID
function DoubleSpace:GetCurHouseId( myPartnerId , otherPartnerId )
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
local curHouseId = skynet.server.redis:hget( redisKey , self:GetMyKey("curHouseId" , myPartnerId ))
return tonumber( curHouseId )
end
--更新双人空间装修方案
function DoubleSpace:AddHouseDeco( player, otherPartnerId , houseId ,schemeId )
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--装修方案
local allSchemeId=json:encode({ schemeId })
local allSchemeIdListJson = skynet.server.redis:hget( myInfoKey ,self:GetMyKey("allHouseSchemeId" , houseId) )
if allSchemeIdListJson ~= nil then
local allSchemeIdList=json:decode(allSchemeIdListJson)
--判断是否存在
for _, value in ipairs(allSchemeIdList) do
if value == schemeId then
return
end
end
table.insert(allSchemeIdList, schemeId)
--allSchemeIdList 去重复
allSchemeIdList=RemoveRepeat(allSchemeIdList)
allSchemeId=json:encode(allSchemeIdList)
end
--防止覆盖更新这里一一判断
if not skynet.server.redis:hget(myInfoKey, self:GetMyKey2("decorates" , houseId,schemeId )) then
skynet.server.redis:hset( myInfoKey ,self:GetMyKey2("decorates" , houseId,schemeId ) , json:encode(self:InitDeco(houseId))) --室内装修
end
if not skynet.server.redis:hget(myInfoKey, self:GetMyKey2("furnitures" , houseId,schemeId )) then
skynet.server.redis:hset( myInfoKey ,self:GetMyKey2("furnitures" , houseId,schemeId ) , json:encode({})) --装修家具信息
end
skynet.server.redis:hmset( myInfoKey ,
-- self:GetMyKey2("decorates" , houseId,schemeId ) , json:encode(self:InitDeco(houseId)), --室内装修
-- self:GetMyKey2("furnitures" , houseId,schemeId ) , json:encode({}), --装修家具信息
self:GetMyKey2("decoPartnerId" , houseId,schemeId ) , "" , --当前房间装修玩家
self:GetMyKey2("decoStartTime" , houseId,schemeId ) , 0 , --当前房间开始装修时间
self:GetMyKey("allHouseSchemeId" , houseId),allSchemeId) --已有的装修方案
--添加装修方案
self:AddBuyHouseDecorate( myPartnerId , houseId , schemeId )
self:AddBuyHouseDecorate( otherPartnerId , houseId , schemeId )
end
--获取双人空间当前房间已有的装修方案
function DoubleSpace:GetDoubleSpaceDecorateScheme( player, otherPartnerId , houseId )
--装修方案默认是0 免费
local schemeIdList = {}
local cfgSchemeAll =skynet.server.gameConfig:GetPlayerAllCfg(player, "Scheme" )
for k , v in pairs(cfgSchemeAll) do
if v.value == houseId and v.currencyBuy == 0 then
table.insert( schemeIdList , v.id )
break
end
end
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
local schemeIdRedisListJson = skynet.server.redis:hget( myInfoKey ,self:GetMyKey("allHouseSchemeId" , houseId)) --已有的装修方案
if schemeIdRedisListJson ==nil then
return schemeIdList
end
local schemeIdRedisList = json:decode(schemeIdRedisListJson)
for key, value in pairs(schemeIdRedisList) do
table.insert( schemeIdList , value )
end
return schemeIdList
end
--启动装修方案
function DoubleSpace:StartDecorate( player, otherPartnerId ,schemeId )
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--是否启用当前装修方案
skynet.server.redis:hset( myInfoKey ,self:GetMyKey("curHouseSchemeId" , myPartnerId ),schemeId ) --已有的装修方案
end
--获取当前装修方案
function DoubleSpace:GetCurScheme( player, otherPartnerId )
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--是否启用当前装修方案
local schemeId = skynet.server.redis:hget( myInfoKey ,self:GetMyKey("curHouseSchemeId" , myPartnerId ) ) --已有的装修方案
if schemeId == nil or (type(schemeId) ~="number" and schemeId =="") then
return 37
end
return tonumber(schemeId)
end
--双人空间展示
function DoubleSpace:Show( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceShow", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceShow")
local data = {}
local otherPartnerId = c2sData.data.partnerId
if not otherPartnerId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
self:CheckExistHouse( player )
local myPartnerId = player.gameData.partner.id
local curHouseId = self:GetCurHouseId( myPartnerId , otherPartnerId )
if curHouseId == nil then
s2cData.code = errorInfo.ErrorCode.NoExistDoubleSpace
return
end
--获取正在开启的装修方案
local curDecorateId=self:GetCurScheme(player,otherPartnerId)
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
local spaceInfo = skynet.server.redis:hmget( redisKey , "spaceName" ,
self:GetMyKey("curHouseId" , myPartnerId ),
self:GetMyKey2("decoPartnerId" , curHouseId, curDecorateId) ,
self:GetMyKey2("decoStartTime" , curHouseId,curDecorateId ) ,
self:GetMyKey2("decorates" , curHouseId ,curDecorateId) ,
self:GetMyKey2("furnitures" , curHouseId,curDecorateId ),
"allHouseId")
spaceInfo = redisKeyUrl:CovertValue(spaceInfo)
data.spaceName = spaceInfo[1]
data.curHouseId = spaceInfo[2]
--看看另一个玩家是不是还在装修如果超过10分钟就取消他的资格。
self:CheckStopDeco(myPartnerId , otherPartnerId , curHouseId , curDecorateId , spaceInfo[4] )
data.isCanDeco = self:IsCanDeco(myPartnerId , otherPartnerId , curHouseId,curDecorateId )
data.decorates = json:decode(spaceInfo[5])
data.furnitures = json:decode(spaceInfo[6])
--当前开启的房间和装修
data.curHouseId = curHouseId
data.curDecorateId=curDecorateId
--房屋显示信息
--获取房屋配置
local houseConfig = skynet.server.gameConfig:GetPlayerAllCfg(player,"House")
local doubleSpaceHouse={}
for _,v in ipairs(houseConfig) do
--双人空间
if v.shopType == 3 then
table.insert(doubleSpaceHouse,v)
end
end
data.houseSchemeItemList={}
for _, cfgHouse in ipairs(doubleSpaceHouse) do
local temHouse=self:BuildBuyHouseInfo(player,otherPartnerId,myPartnerId,cfgHouse.id )
table.insert(data.houseSchemeItemList,temHouse)
end
--获取对方的个人数据
data.personalInfo = {}
local otherDetail = skynet.server.personal:GetDetail( otherPartnerId )
--衣服数据
local clothesData = {}
table.insert( clothesData , otherDetail.clothesData1 or 2 )
table.insert( clothesData , otherDetail.clothesData2 or 3 )
table.insert( clothesData , otherDetail.clothesData3 or 10 )
table.insert( clothesData , otherDetail.clothesData4 or 14 )
table.insert( clothesData , otherDetail.clothesData5 or 17 )
table.insert( clothesData , otherDetail.clothesData6 or 16 )
table.insert( clothesData , otherDetail.clothesData7 or 0 )
table.insert( clothesData , otherDetail.clothesData8 or 0 )
table.insert( clothesData , otherDetail.clothesData9 or 0 )
table.insert( clothesData , otherDetail.clothesData10 or 0 )
--肤色
local colorData = {}
table.insert( colorData , otherDetail.colorData1 or 1 )
table.insert( colorData , otherDetail.colorData2 or 6 )
table.insert( colorData , otherDetail.colorData3 or 26 )
data.personalInfo.nickName = otherDetail.nickName
data.personalInfo.clothesData = clothesData
data.personalInfo.colorData = colorData
--检查否可以用在当前双人空间
self:CheckDoubleSpaceInSpace( player,otherPartnerId )
s2cData.data = assert(pb.encode("S2CDoubleSpaceShow", data))
end
--双人空间设置状态
function DoubleSpace:SetStatus( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceSetStatus", c2sData.data ))
local data = {}
local otherPartnerId = c2sData.data.partnerId
local isStartDeco = c2sData.data.isStartDeco
if not otherPartnerId or nil == isStartDeco then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
data.isCanDeco = false
local myPartnerId = player.gameData.partner.id
local curHouseId = self:GetCurHouseId( myPartnerId , otherPartnerId )
if curHouseId == nil then
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceSetStatus")
s2cData.code = errorInfo.ErrorCode.NoExistDoubleSpace
return
end
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
local curDecorateId=self:GetCurScheme(player,otherPartnerId)
if self:IsCanDeco(myPartnerId , otherPartnerId , curHouseId , curDecorateId) then
--记录下装修的人和装修的时间
if isStartDeco then
skynet.server.redis:hmset( myInfoKey , self:GetMyKey2("decoPartnerId" , curHouseId,curDecorateId ) , myPartnerId ,
self:GetMyKey2("decoStartTime" , curHouseId ,curDecorateId) , skynet.GetTime())
else
skynet.server.redis:hmset( myInfoKey , self:GetMyKey2("decoPartnerId" , curHouseId ,curDecorateId) , "" , self:GetMyKey2("decoStartTime" , curHouseId ,curDecorateId) , 0)
end
data.isCanDeco = true
end
local spaceInfo = skynet.server.redis:hmget( myInfoKey , self:GetMyKey2("decorates" , curHouseId ,curDecorateId) , self:GetMyKey2("furnitures" , curHouseId ,curDecorateId))
spaceInfo = redisKeyUrl:CovertValue(spaceInfo)
data.decorates = json:decode(spaceInfo[1])
data.furnitures = json:decode(spaceInfo[2])
--推送房间装修状态
local playerDetail = skynet.server.personal:GetDetail( otherPartnerId ) --获取个人详情
local isPlaying =skynet.server.playerCenter:IsPlaying(playerDetail.userId)
--推送装修状态给好友
local returnValue = skynet.server.playerCenter:IsSameServer( otherPartnerId )
local postData ={}
postData.houseId=curHouseId
postData.decorateId=curDecorateId
postData.isCanDeco = self:IsCanDeco( otherPartnerId ,myPartnerId , curHouseId,curDecorateId )
if true ==returnValue then
if playerDetail and isPlaying then
skynet.server.gameServer:SendMsgToUser( playerDetail.userId , "CMD_S2C_DoubleSpaceStatus" , postData )
end
elseif false ==returnValue then
local sendData = {}
sendData.userId = playerDetail.userId
sendData.cmd = "CMD_S2C_DoubleSpaceStatus"
sendData.data = postData
local serverCmd = skynet.server.gameServer.GameToGame_NetMsg
skynet.server.gameServer:SendMsgToServer( playerDetail.gameServerId , serverCmd, sendData )
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceSetStatus")
s2cData.data = assert(pb.encode("S2CDoubleSpaceSetStatus", data))
end
--双人空间装修
function DoubleSpace:Decorate( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceDecorate", c2sData.data ))
local data = {}
local otherPartnerId = c2sData.data.partnerId --好友的ID
local decorates = c2sData.data.decorates --装修信息
if "" == otherPartnerId or 0 == #decorates then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
--从redis中获取装修信息
local myPartnerId = player.gameData.partner.id
local curHouseId = self:GetCurHouseId( myPartnerId , otherPartnerId )
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
local curSchemeId=self:GetCurScheme(player,otherPartnerId)
local jsonDecorates = skynet.server.redis:hget( redisKey , self:GetMyKey2("decorates" , curHouseId ,curSchemeId) )
local allDecorates = json:decode( jsonDecorates )
--替换玩家的最新装修信息然后同步到redis上去
for k1, v1 in pairs( decorates ) do
local isExist = false
for k2, v2 in pairs( allDecorates ) do
local cfgGoods = skynet.server.gameConfig:GetPlayerCurCfg( player , "Decoration" , v1.decoId )
if v2.facilityType == cfgGoods.type and v1.facilityId == v2.facilityId then
v2.decoId = v1.decoId
isExist = true
break
end
end
if not isExist then
local cfgGoods = skynet.server.gameConfig:GetPlayerCurCfg( player , "Decoration" , v1.decoId )
if cfgGoods.type == dataType.DecorateType_OutDoorDeco then
table.insert( allDecorates , { facilityType = dataType.DecorateType_OutDoorDeco , facilityId = 0 , decoId = v1.decoId })
elseif cfgGoods.type == dataType.DecorateType_OutDoorFloor then
--兼容老数据如果玩家的好友空间没有初始化地板就给他初始化一个并带上装修ID
table.insert( allDecorates , { facilityType = dataType.DecorateType_OutDoorFloor , facilityId = 0 , decoId = v1.decoId })
end
end
end
skynet.server.redis:hset( redisKey , self:GetMyKey2("decorates" , curHouseId ,curSchemeId) , json:encode( allDecorates ))
data.partnerId = otherPartnerId
data.decorates = allDecorates
skynet.server.gameRecord:Add( player.userId , dataType.GameRecordType_202 , myPartnerId , otherPartnerId )
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceDecorate")
s2cData.data = assert(pb.encode("S2CDoubleSpaceDecorate", data))
end
--双人空间放置家具
function DoubleSpace:Put( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpacePut", c2sData.data ))
local data = {}
local myPartnerId = player.gameData.partner.id
local otherPartnerId = c2sData.data.partnerId --好友的ID
local spaceOp = c2sData.data.spaceOp --操作家园信息
local curHouseId = self:GetCurHouseId( myPartnerId , otherPartnerId )
--获取当前装修方案
local curSchemeId=self:GetCurScheme(player,otherPartnerId)
if "" == otherPartnerId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
elseif not self:IsCanDeco(myPartnerId , otherPartnerId , curHouseId , curSchemeId) then
s2cData.code = errorInfo.ErrorCode.PartnerDecorating
else
data.spaceOp = {}
--从redis中获取家具信息
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
local jsonFurnitures = skynet.server.redis:hget( redisKey , self:GetMyKey2("furnitures" , curHouseId ,curSchemeId) )
local allFurnitures = json:decode( jsonFurnitures )
local isSuc = nil
for k, v in pairs( spaceOp ) do
isSuc = false
log.debug(string.format("玩家 %d 双人空间摆放 操作类型 %d" , player.userId , v.opType))
if skynet.server.group.PutType_House == v.opType and self:AddToSpace( player , allFurnitures , v.furniture ) then --新增家具到房间
isSuc = true
elseif skynet.server.group.PutType_Bag == v.opType and self:RemoveToSpace( player , allFurnitures , v.furniture ) then --从房间中移出家具
isSuc = true
elseif skynet.server.group.PutType_Move == v.opType and v.lastPos and self:MoveToSpace( player , allFurnitures , v.furniture , v.lastPos ) then --移动家具
isSuc = true
elseif skynet.server.group.PutType_Operate == v.opType and self:OperateSpace( player , allFurnitures , v.furniture) then --原地操作
isSuc = true
end
if isSuc then
--更新装修的信息到redis中去
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
skynet.server.redis:hset( myInfoKey , self:GetMyKey2("furnitures" , curHouseId ,curSchemeId) , json:encode(allFurnitures))
skynet.server.npcTask:Modify( player , 111 , 1 )
skynet.server.taskListEvent:Modify( player , 111 , 1 )
table.insert( data.spaceOp , v )
player:ResetAllUnUsedGoods()
else
log.debug(string.format("玩家 %d 双人空间场景 操作失败类型 %d 家具ID %d " , player.userId , v.opType , v.furniture.goodsId ))
end
end
skynet.server.gameRecord:Add( player.userId , dataType.GameRecordType_202 , myPartnerId , otherPartnerId )
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpacePut")
s2cData.data = assert(pb.encode("S2CDoubleSpacePut", data))
end
--删除装修
function DoubleSpace:RemoveDecorate( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceRemoveDecorate", c2sData.data ))
local otherPartnerId = c2sData.data.partnerId --好友的ID
local facilityType = c2sData.data.facilityType
local data = {}
data.partnerId = otherPartnerId
if not otherPartnerId or "" == otherPartnerId or not facilityType or facilityType ~= dataType.DecorateType_OutDoorDeco then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
--从redis中获取装修信息
local myPartnerId = player.gameData.partner.id
local curHouseId = self:GetCurHouseId( myPartnerId , otherPartnerId )
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
local curSchemeId=self:GetCurScheme(player,otherPartnerId)
local jsonDecorates = skynet.server.redis:hget( redisKey , self:GetMyKey2("decorates" , curHouseId ,curSchemeId) )
local allDecorates = json:decode( jsonDecorates )
for k, v in pairs( allDecorates ) do
if facilityType == v.facilityType then
table.remove( allDecorates , k )
break
end
end
skynet.server.redis:hset( redisKey , self:GetMyKey2("decorates" , curHouseId ,curSchemeId) , json:encode( allDecorates ))
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceRemoveDecorate")
s2cData.data = assert(pb.encode("S2CDoubleSpaceRemoveDecorate", data))
end
--双人空间重命名
function DoubleSpace:Rename( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceRename", c2sData.data ))
local data = {}
local otherPartnerId = c2sData.data.partnerId --好友的ID
local spaceName = c2sData.data.spaceName --新的双人空间名
if "" == otherPartnerId or "" == spaceName or #spaceName > self.MaxNickNameLen then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
elseif skynet.server.common:IsMaskWords( spaceName ) then
s2cData.code = errorInfo.ErrorCode.ExistMaskWords
else
local myPartnerId = player.gameData.partner.id
self:SetInfo( myPartnerId , otherPartnerId , "spaceName" , spaceName )
data.partnerId = otherPartnerId
data.spaceName = spaceName
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceRename")
s2cData.data = assert(pb.encode("S2CDoubleSpaceRename", data))
end
--双人空间刷新商店
function DoubleSpace:RefreshShop( player )
local doubleSpace = player.gameData.doubleSpace
local level = player.gameData.level
if not skynet.server.common:IsSameDay( skynet.GetTime() , doubleSpace.shopRefreshTime ) then
--随机6件家具
local cfgAllFurniture = skynet.server.gameConfig:GetPlayerAllCfg( player , "Furniture")
local cfgShopFurniture = {} --找到指定商店的家具
for k, v in pairs( cfgAllFurniture ) do
if self.ShopTypeNo == v.shopType then
table.insert( cfgShopFurniture , v )
end
end
doubleSpace.shopFurniture = {}
local curFurniture = skynet.server.common:DeepCopy( doubleSpace.shopFurniture ) --当前展示的商品就不刷出来
local randGoodsList = self:GetAllRandFurniture( player , curFurniture , level , 6 , self.ShopTypeNo )
self:SetShopData( player , dataType.GoodsType_Furniture , randGoodsList )
--随机3件装修
local cfgAllDecoration = skynet.server.gameConfig:GetPlayerAllCfg( player , "Decoration")
local cfgShopDecoration = {} --找到指定商店的家具
for k, v in pairs( cfgAllDecoration ) do
if self.ShopTypeNo == v.shopType then
table.insert( cfgShopDecoration , v )
end
end
doubleSpace.shopDecorate = {}
local curDecorate = skynet.server.common:DeepCopy( doubleSpace.shopDecorate ) --当前展示的商品就不刷出来
randGoodsList = self:GetRandDecoration( player , curDecorate , level , 3 , self.ShopTypeNo )
self:SetShopData( player , dataType.GoodsType_Decorate , randGoodsList )
doubleSpace.shopRefreshTime = skynet.GetTime()
end
end
--双人空间设置商店数据
function DoubleSpace:SetShopData( player , goodsType , randGoodsList )
local doubleSpace = player.gameData.doubleSpace
--是否购买
for k, v in pairs( randGoodsList ) do
local buyCount = 0
if player:IsBuyGoods( goodsType , v ) then
buyCount = 1
end
if dataType.GoodsType_Furniture == goodsType then
table.insert( doubleSpace.shopFurniture , { id = v , buyCount =buyCount } )
elseif dataType.GoodsType_Decorate == goodsType then
table.insert( doubleSpace.shopDecorate , { id = v , buyCount =buyCount } )
end
log.debug(string.format("玩家 %d 双人空间 设置商店数据 商品类型 %d 商品ID %d 是否购买 %d" , player.basicInfo.userID , goodsType , v , buyCount ))
end
end
--双人空间商店展示
function DoubleSpace:ShopShow( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceShopShow", c2sData.data ))
local data = {}
local otherPartnerId = c2sData.data.partnerId --好友的ID
if "" == otherPartnerId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
self:RefreshShop( player ) --刷新友爱商店
local doubleSpace = player.gameData.doubleSpace
data.partnerId = otherPartnerId
data.furnitures = {}
data.decorates = {}
for k, v in pairs( doubleSpace.shopFurniture ) do
local goodsCount = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Furniture , v.id )
table.insert( data.furnitures , { id = v.id , buyCount = goodsCount } )
end
for k, v in pairs( doubleSpace.shopDecorate ) do
local goodsCount = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Decorate , v.id )
table.insert( data.decorates , { id = v.id , buyCount = goodsCount } )
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceShopShow")
s2cData.data = assert(pb.encode("S2CDoubleSpaceShopShow", data))
end
--双人空间商店购买
function DoubleSpace:ShopBuy( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceShopBuy", c2sData.data ))
local data = {}
local otherPartnerId = c2sData.data.partnerId --好友的ID
local buyGoods = c2sData.data.buyGoods --购买商品信息
if "" == otherPartnerId or not self:IsVaildGoodsInfo( buyGoods ) then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
buyGoods.goodsCount = math.abs( buyGoods.goodsCount ) --客户端可能传负数过来,需要绝对值一下
local doubleSpace = player.gameData.doubleSpace
local isSucBuy = false
if dataType.GoodsType_Furniture == buyGoods.goodsType then
for k, v in pairs( doubleSpace.shopFurniture ) do
if buyGoods.goodsId == v.id then
local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney( player , "Furniture" , v.id )
local costCoin = moneyCount * buyGoods.goodsCount
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_87" )
if not player:MoneyChange( moneyType , -costCoin , eventId ) then
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
else
data.partnerId = otherPartnerId
data.buyGoods = buyGoods
isSucBuy = true
end
break
end
end
elseif dataType.GoodsType_Decorate == buyGoods.goodsType then
local goodsCount = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Decorate , buyGoods.goodsId )
if goodsCount <=0 then
for k, v in pairs( doubleSpace.shopDecorate ) do
if buyGoods.goodsId == v.id then
local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney( player , "Decoration" , v.id )
local costCoin = moneyCount * buyGoods.goodsCount
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_87" )
if not player:MoneyChange( moneyType , -costCoin , eventId ) then
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
else
data.partnerId = otherPartnerId
data.buyGoods = buyGoods
isSucBuy = true
end
break
end
end
end
end
if not isSucBuy then
s2cData.code = errorInfo.ErrorCode.NoGoodsID
else
skynet.server.bag:AddGoods( player , buyGoods.goodsType , buyGoods.goodsId , buyGoods.goodsCount ) --成功扣钱发货
skynet.server.levelTask:Modify( player , 83 , 1 )
skynet.server.taskListEvent:Modify( player ,83, 1)
log.debug(string.format("玩家 %d 双人空间 商店购买商品 商品类型 %d 商品ID %d 商品数量 %d" , player.userId , buyGoods.goodsType , buyGoods.goodsId , buyGoods.goodsCount ))
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceShopBuy")
s2cData.data = assert(pb.encode("S2CDoubleSpaceShopBuy", data))
end
--双人空间解散
function DoubleSpace:Dissolve( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceDissolve", c2sData.data ))
local data = {}
local otherPartnerId = c2sData.data.partnerId --好友的ID
if not otherPartnerId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local myPartnerId = player.gameData.partner.id
self:RemovePutFurniture(player, myPartnerId, otherPartnerId)
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
skynet.server.redis:del( redisKey )
skynet.server.personal:AccDetail( myPartnerId ,"doubleSpaceCount", -1) --减少双人空间数量
skynet.server.personal:AccDetail( otherPartnerId ,"doubleSpaceCount", -1) --减少双人空间数量
--如果好友在线就将消息转发给他
local msgData,lastMsgId = skynet.server.partner:InitMsg( myPartnerId , otherPartnerId , skynet.server.partner.MsgType_Text )
msgData.msgText = "我已解除双人空间"
redisKey = skynet.server.partner:GetMsgKey( myPartnerId , otherPartnerId )
skynet.server.redis:zadd( redisKey , lastMsgId , json:encode(msgData) )
skynet.server.partner:SendMsgToFriend( myPartnerId , otherPartnerId , msgData )
skynet.server.gameRecord:Add( player.userId , dataType.GameRecordType_201 , myPartnerId , otherPartnerId )
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceDissolve")
s2cData.data = assert(pb.encode("S2CDoubleSpaceDissolve", data))
end
--获取自己和朋友的双人空间的Key
function DoubleSpace:GetMyInfoKey( myPartnerId , otherPlayerId )
local key = ""
--谁的ID大就谁在前面
if myPartnerId > otherPlayerId then
key = string.format("%s-%s" , myPartnerId , otherPlayerId )
else
key = string.format("%s-%s" , otherPlayerId , myPartnerId )
end
local redisKey = string.format( redisKeyUrl.GameServerDoubleSpaceInfoHash , key )
return redisKey
end
--是否能装修
function DoubleSpace:IsCanDeco(myPartnerId , otherPartnerId , curHouseId ,schemeId )
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
local decoPartnerId = skynet.server.redis:hget( myInfoKey , self:GetMyKey2("decoPartnerId" , curHouseId,schemeId ))
if "" == decoPartnerId or myPartnerId == decoPartnerId then
return true
end
return false
end
--检查是否停止装修
function DoubleSpace:CheckStopDeco(myPartnerId , otherPartnerId , curHouseId , decoPartnerId , decoStartTime )
--如果30分钟还未完成装修就必须取消他的装修资格对于客户端有可能不会发送结束装修的消息所以服务器必须考虑超时自动取消装修状态。
local isUpdate = false
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
if 0 ~= decoStartTime and skynet.GetTime() >= decoStartTime + 1800 then
skynet.server.redis:hmset( myInfoKey , self:GetMyKey2("decoPartnerId" , curHouseId ,decoPartnerId) , ""
, self:GetMyKey2("decoStartTime" , curHouseId,decoPartnerId ) , 0)
end
end
--设置双人空间信息
function DoubleSpace:SetInfo( myPartnerId , otherPartnerId , ... )
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
skynet.server.redis:hmset( redisKey , ... )
end
--获取我的Key信息
function DoubleSpace:GetMyKey( keyName , value )
return keyName .. "_".. value
end
--获取我的Key信息-这个函数只能用于装修方案和家具摆件
function DoubleSpace:GetMyKey2(keyName , value1 , value2 )
if value1 == nil then
log.info("GetMyKey2 value1 is nil",keyName)
end
keyName = keyName .. "_"..value1
--获取当前房间方案id由于有历史数据这里如果房间是6并且装修方案是免费或者0这返回原来历史数据的key
if value1 == self.houseId and (value2 == 37 or value2 =="") then
return keyName
end
keyName = keyName .. "_"..value2
return keyName
end
--获取我放置商品数量
function DoubleSpace:GetPutGoodsCount( partnerId , allGoods , id )
--找出我所有的家具
local count = 0
for k, v in pairs( allGoods ) do
if partnerId == v.partnerId and id == v.id then
count = count + 1
end
end
return count
end
--双人空间新增家具到房间
function DoubleSpace:AddToSpace( player , allFurnitures , furniture )
local myPartnerId = player.gameData.partner.id --家具是谁放上去的。
local goodsId = furniture.goodsId
local count1 = self:GetPutGoodsCount( myPartnerId , allFurnitures , goodsId ) --当前摆放的数量
local count2 = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Furniture , goodsId ) --我背包里的数量
if count1 >= count2 then --摆放的数量已经大于等于背包数量
return false
else
furniture.partnerId = myPartnerId
table.insert( allFurnitures , furniture)
count1 = count1 + 1 --成功放置,最大数量+1
skynet.server.bag:AddPutGoodsMaxCount( player , dataType.GoodsType_Furniture , goodsId , count1 )
return true
end
return false
end
--双人空间从地块中移出
function DoubleSpace:RemoveToSpace( player , allFurnitures , furniture )
local goodsId = furniture.goodsId
local furniturePos = furniture.nowPos
for k, v in pairs( allFurnitures ) do
if goodsId == v.goodsId and skynet.server.common:Distance( furniturePos.x , furniturePos.y , v.nowPos.x , v.nowPos.y) <= 0.1 then
table.remove( allFurnitures , k )
skynet.server.bag:RemovePutGoodsMaxCount( player , dataType.GoodsType_Furniture , goodsId , 1 )
return true
end
end
return false
end
--双人空间在地块中移动
function DoubleSpace:MoveToSpace( player , allFurnitures , furniture , lastPos )
local goodsId = furniture.goodsId
local targetPos = furniture.nowPos
for k, v in pairs( allFurnitures ) do
local srcPosDistance = skynet.server.common:Distance( lastPos.x , lastPos.y , v.nowPos.x , v.nowPos.y) --原位置距离
local dstPosDistance = skynet.server.common:Distance( targetPos.x , targetPos.y , lastPos.x , lastPos.y) --目标位置距离
if v.goodsId == goodsId and srcPosDistance <= 0.1 and dstPosDistance >= 0 then
v.nowPos = targetPos
v.rotateType = furniture.rotateType
v.isPutInFurniture = furniture.isPutInFurniture
v.clickType = furniture.clickType
return true
end
end
return false
end
--双人空间原地操作
function DoubleSpace:OperateSpace( player , allFurnitures , furniture )
local goodsId = furniture.goodsId
local furniturePos = furniture.nowPos
for k, v in pairs( allFurnitures ) do
local isSamePos = skynet.server.common:Distance( furniturePos.x , furniturePos.y , v.nowPos.x , v.nowPos.y ) <= 0.1
if v.goodsId == goodsId and isSamePos then
v.nowPos = furniture.nowPos
v.rotateType = furniture.rotateType
v.isPutInFurniture = furniture.isPutInFurniture
v.clickType = furniture.clickType
return true
end
end
return false
end
--是否与好友存在双人空间
function DoubleSpace:IsExist( myPartnerId , otherPartnerId )
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
if not skynet.server.redis:exists( redisKey ) then
return false
end
return true
end
--检查有不有双人空间房子
function DoubleSpace:CheckExistHouse( player )
if not skynet.server.house:IsBuyHouse( player , self.houseId ) then
local myPartnerId = player.gameData.partner.id
local isExist = skynet.server.personal:GetCurDetail( myPartnerId , "isExistDoubleSpace")
if true == isExist then
local s2cData ={}
skynet.server.house:Add( player , self.houseId , s2cData , false)
end
end
end
--移除玩家身上放置的家具
function DoubleSpace:RemovePutFurniture(player, myPartnerId , otherPartnerId)
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--获取全部装修配置
local cfgSchemeAll=skynet.server.gameConfig:GetPlayerAllCfg(player,"Scheme")
--该房间下的装修
local cfgSchemeList={}
for _, value in ipairs(cfgSchemeAll) do
for houseId, _ in pairs(self.initDeco) do
if value.value==houseId then
table.insert(cfgSchemeList,value)
break
end
end
end
local myRemoveFurnitures = {}
local otherRemoveFurnitures = {}
for _, cfgScheme in ipairs(cfgSchemeList) do
local jsonFurnitures = skynet.server.redis:hget( redisKey , self:GetMyKey2("furnitures" , cfgScheme.value ,cfgScheme.id) )
--不存在家具
if jsonFurnitures == nil or jsonFurnitures == "" then
--log.info("双人空间解散 回收家具 失败",json:encode(cfgScheme))
goto continue
end
local allFurnitures = json:decode( jsonFurnitures )
--log.info("双人空间解散 回收家具",json:encode(cfgScheme),jsonFurnitures)
for k, v in pairs( allFurnitures ) do
local removeGoodsId = v.goodsId
if myPartnerId == v.partnerId then
table.insert( myRemoveFurnitures, removeGoodsId )
elseif otherPartnerId == v.partnerId then
table.insert( otherRemoveFurnitures, removeGoodsId )
end
end
::continue::
end
local msgData = {}
msgData.removeFurnitures = myRemoveFurnitures
skynet.server.personal:AddOfflineMsg( myPartnerId , dataType.OfflineMsgType_DoubleSpaceDissolve , msgData , 45 , 0 )
msgData.removeFurnitures = otherRemoveFurnitures
skynet.server.personal:AddOfflineMsg( otherPartnerId , dataType.OfflineMsgType_DoubleSpaceDissolve , msgData , 45 , 0)
end
--以下是新函数
--添加已购买的双人空间房间id
function DoubleSpace:AddBuyHouseId(player,partnerId , houseId )
local isOk=false
local houseList =self:GetBuyHouseIdList( partnerId )
--判断是否存在
for _, tempHouseId in ipairs(houseList) do
if tempHouseId == houseId then
return isOk
end
end
table.insert( houseList , houseId )
isOk=true
--保存到rendis
local result= skynet.server.personal:SetDetail(partnerId,self.doubleSpaceBuyHouseKey , json:encode( houseList ) )
--local result= skynet.server.redis:hset( redisKey , self.doubleSpaceBuyHouseKey , json:encode( houseList ) )
--[[
if result == nil then
log.error("添加已购买的双人空间房间id失败")
end
]]
--默认购买免费装修方案
local cfgSchemeAll =skynet.server.gameConfig:GetPlayerAllCfg(player, "Scheme" )
for k , v in pairs(cfgSchemeAll) do
--添加免费的装修费方案
if v.value == houseId and v.currencyBuy == 0 then
self:AddBuyHouseDecorate(partnerId,houseId,v.id)
end
end
return isOk
end
--获取已购买的双人空间房间id列表
function DoubleSpace:GetBuyHouseIdList( partnerId )
local houseList={}
local houseListJson = skynet.server.personal:GetCurDetail(partnerId,self.doubleSpaceBuyHouseKey)
--local houseListJson = skynet.server.redis:hget( redisKey , self.doubleSpaceBuyHouseKey )
if houseListJson ~= nil and #houseListJson > 0 then
houseList=json:decode( houseListJson )
end
--没有6房间 需要把6房间的id加进去
local isSixRoom = false
for _, value in ipairs(houseList) do
if value == self.houseId then
isSixRoom=true
break
end
end
if not isSixRoom then
table.insert(houseList, self.houseId)
end
return houseList
end
--添加已购买的双人空间房间的装修方案
function DoubleSpace:AddBuyHouseDecorate( partnerId , houseId , decorateId )
local isOk =false
local redisbuyDecoKey = string.format(self.doubleSpaceBuyDecoKey,houseId)
local houseDecorateList =self:GetBuyHouseDecorateList( partnerId , houseId )
for _, tempdecorateId in ipairs(houseDecorateList) do
if tempdecorateId == decorateId then
return isOk
end
end
table.insert( houseDecorateList , decorateId )
isOk = true
--保存到rendis
skynet.server.personal:SetDetail(partnerId, redisbuyDecoKey , json:encode( houseDecorateList ) )
return isOk
end
--获取已购买的双人空间房间的装修方案列表
function DoubleSpace:GetBuyHouseDecorateList( partnerId , houseId )
local houseDecorateList={}
local redisbuyDecoKey = string.format(self.doubleSpaceBuyDecoKey,houseId)
local houseDecorateListJson = skynet.server.personal:GetCurDetail(partnerId,redisbuyDecoKey)
if houseDecorateListJson ~= nil and #houseDecorateListJson >0 then
houseDecorateList=json:decode(houseDecorateListJson)
else
houseDecorateList={}
end
--如果是6 没有37 则添加37
if houseId == self.houseId then
local isSixRoom = false
for _, value in ipairs(houseDecorateList) do
if value == 37 then
isSixRoom=true
break
end
end
if not isSixRoom then
table.insert(houseDecorateList, 37)
end
end
return houseDecorateList
end
--购买房产
function DoubleSpace:HouseRentBuy( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceHouseRentBuy", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceHouseRentBuy")
local data = {}
local otherPartnerId = c2sData.data.partnerId --好友的ID
local houseId = c2sData.data.houseId --购买房产id
local buyType = c2sData.data.buyType --购买类型 1-自己购买 2-邀请好友购买 3-代替好友购买
data.partnerId=otherPartnerId
data.houseId=houseId
data.buyType=buyType
if not otherPartnerId or (buyType ~=1 and buyType ~= 2 and buyType ~= 3) then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
local myPartnerId = player.gameData.partner.id
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--判断双人空间是否存在
if not self:IsExist(myPartnerId,otherPartnerId) then
s2cData.code = errorInfo.ErrorCode.NoExistDoubleSpace
return
end
local partnerId = player.gameData.partner.id
if buyType ~=1 then
partnerId = otherPartnerId
end
--判断玩家是否存在该房间
local houseIdList = self:GetBuyHouseIdList(partnerId)
for _, tempHouseId in ipairs(houseIdList) do
if tempHouseId ==houseId then--房间是否购买
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
end
--获取房间购买信息
local houseInfo = skynet.server.gameConfig:GetPlayerCurCfg( player , "House" , houseId )
if not houseInfo then
s2cData.code=errorInfo.ErrorCode.ErrRequestParam
return
end
--自己的等级判断
if buyType ==1 and player.gameData.level < houseInfo.level then
s2cData.code=errorInfo.ErrorCode.ErrRequestParam
return
end
--判断玩家等级,好友
local friendLevel = skynet.server.personal:GetCurDetail( otherPartnerId , "level" )
if buyType ~= 1 and friendLevel < houseInfo.level then
s2cData.code=errorInfo.ErrorCode.ErrRequestParam
return
end
local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_148")
local coin = 0
local coinType = 0
--消耗资源
if houseInfo.currencyBuy ==1 then--金币
coinType=pb.enum("EnumGoodsType", "Coin")
coin = houseInfo.coin
elseif houseInfo.currencyBuy == 2 then--三叶草
coinType=pb.enum("EnumGoodsType", "Clovers")
coin = houseInfo.mapCoin
elseif houseInfo.currencyBuy == 3 then--蜗壳币
coinType=pb.enum("EnumGoodsType", "VoluteCoin")
coin = houseInfo.voluteCoin
end
--验证资源
if buyType ~= 2 then --购买
--消耗金币
if not player:MoneyChange(coinType, -(coin/2), eventId) then
s2cData.code=errorInfo.ErrorCode.ErrRequestParam
log.error("获取房间购买信息失败 GetDoubleSpaceInfo:MoneyChange is false",houseId,houseInfo.coin/2)
return
end
end
if buyType == 1 then
--添加房屋
self:AddBuyHouseId(player, myPartnerId , houseId )
--自己购买 标记邀请消息为已同意
skynet.server.partner:DoubleSpaceBuyInviteRespond( player , otherPartnerId,skynet.server.partner.MsgType_InviteDoubleSpaceBuyHouse,houseId,0 )
elseif buyType == 3 then
--添加房屋
local isOk= self:AddBuyHouseId(player, otherPartnerId , houseId )
if isOk then
skynet.server.partner:DoubleSpaceBuyInvite( player , otherPartnerId,skynet.server.partner.MsgType_InviteDoubleSpaceBuyHouseNotice,houseId,0 )
end
end
--添加房屋
local addHouseIdList ={}
--好友邀请,如果好友为购买的房屋, 需要通知好友
if buyType == 2 then
local otherBuyHouseIdList = self:GetBuyHouseIdList(otherPartnerId)
if next(otherBuyHouseIdList) == nil then
skynet.server.partner:DoubleSpaceBuyInvite( player , otherPartnerId,skynet.server.partner.MsgType_InviteDoubleSpaceBuyHouse,houseId,0 )
else
local isExist =false
for _, value in ipairs(otherBuyHouseIdList) do
if value == houseId then
isExist = true
break
end
end
--不存在房间才会邀请
if not isExist then
skynet.server.partner:DoubleSpaceBuyInvite( player , otherPartnerId,skynet.server.partner.MsgType_InviteDoubleSpaceBuyHouse,houseId,0 )
end
end
else
--检查已购买的房间
local myBuyHouseList = self:GetBuyHouseIdList(myPartnerId)
--获取好友购买房间信息
local otherBuyHouseList = self:GetBuyHouseIdList(otherPartnerId)
if next(myBuyHouseList) and next(otherBuyHouseList) then
for _, myHouseId in ipairs(myBuyHouseList) do
if myHouseId ~= houseId then
goto continue
end
for _, otherHouseId in ipairs(otherBuyHouseList) do
--共同都有这个房屋
if myHouseId == otherHouseId then
--添加房间
self:AddHouseInfo(player, otherPartnerId , myHouseId )
table.insert(addHouseIdList, otherHouseId)
--检查是否添加默认装修
local myBuyHouseDecList=self:GetBuyHouseDecorateList(myPartnerId, myHouseId)
local otherBuyHouseDecList=self:GetBuyHouseDecorateList(otherPartnerId, otherHouseId)
if next(myBuyHouseDecList) and next(otherBuyHouseDecList) then
for _, myBuyHouseDec in ipairs(myBuyHouseDecList) do
for _, otherBuyHouseDec in ipairs(otherBuyHouseDecList) do
--共同都有这个装修方案
if myBuyHouseDec == otherBuyHouseDec then
--添加装方案
self:AddHouseDeco( player, otherPartnerId , myHouseId ,myBuyHouseDec )
end
end
end
end
end
end
::continue::
end
end
end
--我同意创建双人间,我增加双人空间户型,解锁该房间主要是在商店里刷出门和护栏
for _, tempHouseId in ipairs(addHouseIdList) do
skynet.server.house:Add( player , tempHouseId , s2cData , true)
end
self:CheckBuyHouseInSpace( player,otherPartnerId, houseId )
--房间有改变通知玩家
if buyType ~= 2 then
local playerDetail = skynet.server.personal:GetDetail( otherPartnerId ) --获取个人详情
local isPlaying =skynet.server.playerCenter:IsPlaying(playerDetail.userId)
--推送房产信息给好友
local returnValue = skynet.server.playerCenter:IsSameServer( otherPartnerId )
--推送数据
local postData ={}
postData.doubleSpaceHouseSchemeItem=self:BuildBuyHouseInfo(player,myPartnerId,otherPartnerId,houseId )
if true ==returnValue then
if playerDetail and isPlaying then
skynet.server.gameServer:SendMsgToUser( playerDetail.userId , "CMD_S2C_DoubleSpaceHouseBuyInfo" , postData )
end
elseif false ==returnValue then
--不在同一服务器
local playerDetail = skynet.server.personal:GetDetail( otherPartnerId ) --获取个人详情
local sendData = {}
sendData.userId = playerDetail.userId
sendData.cmd = "CMD_S2C_DoubleSpaceHouseBuyInfo"
sendData.data = postData
local serverCmd = skynet.server.gameServer.GameToGame_NetMsg
skynet.server.gameServer:SendMsgToServer( playerDetail.gameServerId , serverCmd, sendData )
end
--推送自己的房间信息
local pushData ={}
pushData.doubleSpaceHouseSchemeItem=self:BuildBuyHouseInfo(player,otherPartnerId,myPartnerId,houseId )
skynet.server.gameServer:SendMsgToUser( player.userId, "CMD_S2C_DoubleSpaceHouseBuyInfo" , pushData )
end
s2cData.data = assert(pb.encode("S2CDoubleSpaceHouseRentBuy", data))
end
--购买装修方案
function DoubleSpace:HouseRentSchemeBuy( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceHouseRentSchemeBuy", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceHouseRentSchemeBuy")
local data = {}
local otherPartnerId = c2sData.data.partnerId --好友的ID
local houseId = c2sData.data.houseId --购买房产id
local schemeId = c2sData.data.schemeId --购买装修方案id
local buyType = c2sData.data.buyType --购买类型 1-自己购买 2-邀请好友购买 3-自己购买
data.houseId = houseId
data.schemeId = schemeId
data.buyType = buyType
if not otherPartnerId or (buyType ~=1 and buyType ~= 2 and buyType ~= 3) then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("购买装修方案 参数错误",otherPartnerId,buyType,houseId,schemeId)
return
end
local myPartnerId = player.gameData.partner.id
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--判断双人空间是否存在
if not self:IsExist(myPartnerId,otherPartnerId) then
s2cData.code = errorInfo.ErrorCode.NoExistDoubleSpace
log.info("双人空间未开通 GetDoubleSpaceInfo:redisKey is not exist",redisKey)
return
end
--判断参数是否异常
local cfgScheme=skynet.server.gameConfig:GetPlayerCurCfg( player , "Scheme" , schemeId )
if cfgScheme.value ~= houseId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("参数异常 GetDoubleSpaceInfo:cfgScheme.value ~= houseId",cfgScheme.value,houseId)
return
end
--当前购买者
local partnerId = player.gameData.partner.id
if buyType ~=1 then
partnerId = otherPartnerId
end
--判断房屋是否购买
local isBuyHouse =false
local houseIdList = self:GetBuyHouseIdList(partnerId)
for _, tempHouseId in ipairs(houseIdList) do
if tempHouseId ==houseId then
isBuyHouse =true
break
end
end
if not isBuyHouse then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家没有购买此房屋 GetDoubleSpaceInfo:houseId",houseId)
return
end
--判断玩家是否存在该房间
local schemeList = self:GetBuyHouseDecorateList(partnerId,houseId)
for _, tempscheme in ipairs(schemeList) do
if tempscheme ==schemeId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未成功购买该装修方案 该方案已购买 GetDoubleSpaceInfo:schemeId is exist",schemeId)
return
end
end
local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_148")
local coin = 0
local coinType = 0
--免费
if cfgScheme.currencyBuy==0 then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未购买该房间 房间免费 ",schemeId)
return
elseif cfgScheme.currencyBuy ==1 then--金币
coinType=pb.enum("EnumGoodsType", "Coin")
coin = cfgScheme.coin
elseif cfgScheme.currencyBuy == 2 then--三叶草
coinType=pb.enum("EnumGoodsType", "Clovers")
coin = cfgScheme.mapCoin
elseif cfgScheme.currencyBuy == 3 then--蜗壳币
coinType=pb.enum("EnumGoodsType", "VoluteCoin")
coin = cfgScheme.voluteCoin
end
--验证资源
if buyType ~= 2 then
--消耗金币
if not player:MoneyChange(coinType, -(coin/2), eventId) then
s2cData.code=errorInfo.ErrorCode.ErrRequestParam
log.info("购买装修方案失败,资源不足 GetDoubleSpaceInfo:MoneyChange is false",houseId,coin/2,coinType)
return
end
end
--自己购买
if buyType == 1 then
--添加装修
self:AddBuyHouseDecorate( myPartnerId, houseId ,schemeId)
--自己购买 标记邀请消息为已同意
skynet.server.partner:DoubleSpaceBuyInviteRespond( player , otherPartnerId,skynet.server.partner.MsgType_InviteDoubleSpaceBuyHouseScheme,houseId,schemeId )
elseif buyType == 3 then--代购
local isOk= self:AddBuyHouseDecorate( otherPartnerId, houseId ,schemeId)
if isOk then
skynet.server.partner:DoubleSpaceBuyInvite( player , otherPartnerId,skynet.server.partner.MsgType_InviteDoubleSpaceBuyHouseSchemeNotice,houseId,schemeId )
end
end
--添加装修方案
local myBuyHouseDecList=self:GetBuyHouseDecorateList(myPartnerId, houseId)
local otherBuyHouseDecList=self:GetBuyHouseDecorateList(otherPartnerId, houseId)
if next(myBuyHouseDecList) and next(otherBuyHouseDecList) then
for _, myBuyHouseDec in ipairs(myBuyHouseDecList) do
if myBuyHouseDec ~= schemeId then
goto continue
end
for _, otherBuyHouseDec in ipairs(otherBuyHouseDecList) do
--共同都有这个装修方案
if myBuyHouseDec == otherBuyHouseDec then
--添加装方案
self:AddHouseDeco( player, otherPartnerId , houseId ,myBuyHouseDec )
end
end
::continue::
end
end
--好友邀请 需要通知好友
if buyType == 2 then
local otherBuyHouseschmemIdList = self:GetBuyHouseDecorateList(otherPartnerId,houseId)
if next(otherBuyHouseschmemIdList) == nil then
skynet.server.partner:DoubleSpaceBuyInvite( player , otherPartnerId,skynet.server.partner.MsgType_InviteDoubleSpaceBuyHouseScheme,houseId,schemeId )
else
local isExist =false
for _, value in ipairs(otherBuyHouseschmemIdList) do
if value == schemeId then
isExist = true
break
end
end
--不存在房间才会邀请
if not isExist then
skynet.server.partner:DoubleSpaceBuyInvite( player , otherPartnerId,skynet.server.partner.MsgType_InviteDoubleSpaceBuyHouseScheme,houseId,schemeId )
end
end
else--房间有改变通知玩家
local playerDetail = skynet.server.personal:GetDetail( otherPartnerId ) --获取个人详情
local isPlaying =skynet.server.playerCenter:IsPlaying(playerDetail.userId)
--推送房产信息给好友
local returnValue = skynet.server.playerCenter:IsSameServer( otherPartnerId )
local postData ={}
postData.doubleSpaceHouseSchemeItem=self:BuildBuyHouseInfo(player,myPartnerId,otherPartnerId,houseId )
if true ==returnValue then
if playerDetail and isPlaying then
skynet.server.gameServer:SendMsgToUser( playerDetail.userId , "CMD_S2C_DoubleSpaceHouseBuyInfo" , postData )
end
elseif false ==returnValue then
--不在同一服务器
local playerDetail = skynet.server.personal:GetDetail( otherPartnerId ) --获取个人详情
local sendData = {}
sendData.userId = playerDetail.userId
sendData.cmd = "CMD_S2C_DoubleSpaceHouseBuyInfo"
sendData.data = postData
local serverCmd = skynet.server.gameServer.GameToGame_NetMsg
skynet.server.gameServer:SendMsgToServer( playerDetail.gameServerId , serverCmd, sendData )
end
--推送自己的房间信息
local pushData ={}
pushData.doubleSpaceHouseSchemeItem=self:BuildBuyHouseInfo(player,otherPartnerId,myPartnerId,houseId )
skynet.server.gameServer:SendMsgToUser( player.userId, "CMD_S2C_DoubleSpaceHouseBuyInfo" , pushData )
end
s2cData.data = assert(pb.encode("S2CDoubleSpaceHouseRentSchemeBuy", data))
end
--切换房间
function DoubleSpace:ChangeHouse( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceChangeHouse", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceChangeHouse")
local data = {}
local otherPartnerId = c2sData.data.partnerId --好友的ID
local houseId = c2sData.data.houseId --购买房产id
data.partnerId = otherPartnerId
data.houseId = houseId
if not otherPartnerId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
local myPartnerId = player.gameData.partner.id
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--判断双人空间是否存在
if not self:IsExist(myPartnerId,otherPartnerId) then
s2cData.code = errorInfo.ErrorCode.NoExistDoubleSpace
log.info("双人空间未开通 GetDoubleSpaceInfo:redisKey is not exist",redisKey)
return
end
--判断玩家是否存在该房间
local isBuyHouse=false
local houseIdList = self:GetBuyHouseIdList(myPartnerId)
for _, tempHouseId in ipairs(houseIdList) do
if tempHouseId ==houseId then
isBuyHouse = true
break
end
end
if not isBuyHouse then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未购买该房间 房间未购买 GetDoubleSpaceInfo:houseId is exist",houseId)
return
end
--判断房间是否可以切换
local changeHouseIdList = self:GetDoubleSpaceHouseIdList(player,otherPartnerId)
if not next(changeHouseIdList ) then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未购买该房间 房间未全部购买 GetDoubleSpaceInfo:houseId is not exist",houseId)
return
end
--是否存在
local isExist = false
for _, temHouseId in ipairs(changeHouseIdList) do
if temHouseId == houseId then
isExist = true
break
end
end
if not isExist then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未购买该房间 房间未全部购买 GetDoubleSpaceInfo:houseId is not exist",houseId)
return
end
local curHouseId = self:GetCurHouseId( myPartnerId , otherPartnerId )
--获取正在开启的装修方案
local curDecorateId=self:GetCurScheme(player,otherPartnerId)
--取消之前的装修方案
skynet.server.redis:hmset( redisKey ,
self:GetMyKey2("decoPartnerId" , curHouseId ,curDecorateId) , "" ,
self:GetMyKey2("decoStartTime" , curHouseId ,curDecorateId) , 0)
--设置房间未当前选中房间
self:StartHouse(player,otherPartnerId,houseId)
--获取上一个设置的装修方案
local previousSchemeId = self:GetPlayerHouseDecorate(player,otherPartnerId,houseId)
--设置房间装修方案
self:StartDecorate(player,otherPartnerId,previousSchemeId)
--设置装修方案是默认状态
self:SetPlayerHouseDecorate(player,otherPartnerId,houseId,previousSchemeId)
local spaceInfo = skynet.server.redis:hmget( redisKey ,
self:GetMyKey2("decorates" , houseId ,previousSchemeId) ,
self:GetMyKey2("furnitures" , houseId,previousSchemeId ))
local curHouseId = self:GetCurHouseId( myPartnerId , otherPartnerId )
--获取正在开启的装修方案
local curDecorateId=self:GetCurScheme(player,otherPartnerId)
-- --设置当前装修方案
-- skynet.server.redis:hmset( redisKey ,
-- self:GetMyKey2("decoPartnerId" , curHouseId,curDecorateId ) , myPartnerId ,
-- self:GetMyKey2("decoStartTime" , curHouseId ,curDecorateId) , skynet.GetTime())
data.decorates = json:decode(spaceInfo[1])
data.furnitures = json:decode(spaceInfo[2])
s2cData.data = assert(pb.encode("S2CDoubleSpaceChangeHouse", data))
end
--修改装修方案名称
function DoubleSpace:ChangeDecorateSchemeName(player,c2sData,s2cData)
c2sData.data = assert(pb.decode("C2SDoubleSpaceChangeDecorateSchemeName", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceChangeDecorateSchemeName")
local data = {}
local otherPartnerId = c2sData.data.partnerId --好友的ID
local houseId = c2sData.data.houseId --购买房产id
local schemeId = c2sData.data.houseSchemeId
local schemeName = c2sData.data.schemeName
data.partnerId = otherPartnerId
data.houseId = houseId
data.houseSchemeId = schemeId
data.schemeName = schemeName
if not otherPartnerId or schemeName == "" then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
local myPartnerId = player.gameData.partner.id
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--判断双人空间是否存在
if not self:IsExist(myPartnerId,otherPartnerId) then
s2cData.code = errorInfo.ErrorCode.NoExistDoubleSpace
log.info("双人空间未开通 GetDoubleSpaceInfo:redisKey is not exist",redisKey)
return
end
--判断玩家是否存在该房间
local isBuyHouse=false
local houseIdList = self:GetBuyHouseIdList(myPartnerId)
for _, tempHouseId in ipairs(houseIdList) do
if tempHouseId ==houseId then
isBuyHouse = true
break
end
end
if not isBuyHouse then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未购买该房间 房间未购买 GetDoubleSpaceInfo:houseId is exist",houseId)
return
end
--判断房间是否可以切换
local changeHouseIdList = self:GetDoubleSpaceHouseIdList(player,otherPartnerId)
if not next(changeHouseIdList ) then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未购买该房间 房间未全部购买 GetDoubleSpaceInfo:houseId is not exist",houseId,changeHouseIdList)
return
end
--是否存在
local isExist = false
for _, temHouseId in ipairs(changeHouseIdList) do
if temHouseId == houseId then
isExist = true
break
end
end
if not isExist then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未购买该房间 房间未购买 GetDoubleSpaceInfo:houseId is not exist",houseId)
return
end
--设置房间装修方案名称
self:SetPlayerHouseDecorateName(player,otherPartnerId,houseId,schemeId,schemeName)
s2cData.data = assert(pb.encode("S2CDoubleSpaceChangeDecorateSchemeName", data))
end
--切换房间装修方案
function DoubleSpace:ChangeDecorateScheme( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SDoubleSpaceChangeDecorateScheme", c2sData.data ))
s2cData.cmd = pb.enum("MsgType","CMD_S2C_DoubleSpaceChangeDecorateScheme")
local data = {}
local otherPartnerId = c2sData.data.partnerId --好友的ID
local houseSchemeId = c2sData.data.houseSchemeId --购买房产装修方案
data.partnerId = otherPartnerId
data.houseSchemeId = houseSchemeId
if not otherPartnerId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
return
end
local myPartnerId = player.gameData.partner.id
local redisKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--判断双人空间是否存在
if not self:IsExist(myPartnerId,otherPartnerId) then
s2cData.code = errorInfo.ErrorCode.NoExistDoubleSpace
log.info("双人空间未开通 GetDoubleSpaceInfo:redisKey is not exist",redisKey)
return
end
--获取当前房间id
local curHouseId = self:GetCurHouseId( myPartnerId ,otherPartnerId)
--判断玩家是否存在该房间
local isBuyHouse = false
local houseIdList = self:GetBuyHouseIdList(myPartnerId)
for _, tempHouseId in ipairs(houseIdList) do
if tempHouseId ==curHouseId then
isBuyHouse = true
break
end
end
if not isBuyHouse then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未购买该房间 房间已购买 GetBuyHouseIdList:houseId is exist",curHouseId)
return
end
--判断房间是否可以切换
local houseSchemeList = self:GetDoubleSpaceDecorateScheme(player,otherPartnerId,curHouseId)
if not next(houseSchemeList ) then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未购买该房间 装修方案未购买 GetDoubleSpaceDecorateScheme:curHouseId is not exist",curHouseId)
return
end
--是否存在
local isExist = false
for _, houseScheme in ipairs(houseSchemeList) do
if houseScheme == houseSchemeId then
isExist = true
break
end
end
if not isExist then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
log.info("玩家未购买该房间 装修方案未购买 GetDoubleSpaceDecorateScheme:houseSchemeId is not exist",houseSchemeId)
return
end
--获取正在开启的装修方案
local curDecorateId=self:GetCurScheme(player,otherPartnerId)
--取消之前的装修方案
skynet.server.redis:hmset( redisKey ,
self:GetMyKey2("decoPartnerId" , curHouseId ,curDecorateId) , "" ,
self:GetMyKey2("decoStartTime" , curHouseId ,curDecorateId) , 0)
--设置房间装修方案
self:StartDecorate(player,otherPartnerId,houseSchemeId)
local curDecorateId=self:GetCurScheme(player,otherPartnerId)
-- --设置当前装修方案
-- skynet.server.redis:hmset( redisKey , self:GetMyKey2("decoPartnerId" , curHouseId,curDecorateId ) , myPartnerId ,
-- self:GetMyKey2("decoStartTime" , curHouseId ,curDecorateId) , skynet.GetTime())
local spaceInfo = skynet.server.redis:hmget( redisKey ,
self:GetMyKey2("decorates" , curHouseId ,houseSchemeId) ,
self:GetMyKey2("furnitures" , curHouseId,houseSchemeId ))
data.decorates = json:decode(spaceInfo[1])
data.furnitures = json:decode(spaceInfo[2])
--设置装修方案
self:SetPlayerHouseDecorate(player,otherPartnerId,curHouseId,houseSchemeId)
s2cData.data = assert(pb.encode("S2CDoubleSpaceChangeDecorateScheme", data))
end
--检查购买房产设置成双人空间可以设置
function DoubleSpace:CheckBuyHouseInSpace( player,otherPartnerId, houseId )
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--判断该房间是否存在
local houseIdListJson= skynet.server.redis:hget( myInfoKey , "allHouseId")
--存在数据
if houseIdListJson ~= nil then
local houseIdList=json:decode(houseIdListJson)
for _, value in ipairs(houseIdList) do
--已经存在直接返回
if value == houseId then
return
end
end
end
--检查已购买的房间
local myBuyHouseList = self:GetBuyHouseIdList(myPartnerId)
--获取好友购买房间信息
local otherBuyHouseList = self:GetBuyHouseIdList(otherPartnerId)
if next(myBuyHouseList) and next(otherBuyHouseList) then
for _, myHouseId in ipairs(myBuyHouseList) do
--只检查当前房间
if myHouseId ~= houseId then
goto continue
end
for _, otherHouseId in ipairs(otherBuyHouseList) do
--共同都有这个房屋
if myHouseId == otherHouseId then
--添加房间
self:AddHouseInfo(player, otherPartnerId , myHouseId )
--添加装修方案
local myBuyHouseDecList=self:GetBuyHouseDecorateList(myPartnerId, myHouseId)
local otherBuyHouseDecList=self:GetBuyHouseDecorateList(otherPartnerId, otherHouseId)
if next(myBuyHouseDecList) and next(otherBuyHouseDecList) then
for _, myBuyHouseDec in ipairs(myBuyHouseDecList) do
for _, otherBuyHouseDec in ipairs(otherBuyHouseDecList) do
--共同都有这个装修方案
if myBuyHouseDec == otherBuyHouseDec then
--添加装方案
self:AddHouseDeco( player, otherPartnerId , myHouseId ,myBuyHouseDec )
end
end
end
end
end
end
::continue::
end
end
end
--构建房间/装修购买信息
function DoubleSpace:BuildBuyHouseInfo(player,friendPartherId,myPartnerId,houseId )
local spaceDecorateSchemeHouseItem={}
spaceDecorateSchemeHouseItem.SpaceDecorateSchemeItemList={}
--购买房屋情况
local myBuyHouseList=self:GetBuyHouseIdList(myPartnerId)
local otherBuyHouseList=self:GetBuyHouseIdList(friendPartherId)
spaceDecorateSchemeHouseItem.buyHouseId=houseId
spaceDecorateSchemeHouseItem.myIsBuy=false
spaceDecorateSchemeHouseItem.friendIsBuy=false
--是否购买
for _, value in ipairs(myBuyHouseList) do
if value == spaceDecorateSchemeHouseItem.buyHouseId then
spaceDecorateSchemeHouseItem.myIsBuy=true
break
end
end
--是否购买
for _, value in ipairs(otherBuyHouseList) do
if value == spaceDecorateSchemeHouseItem.buyHouseId then
spaceDecorateSchemeHouseItem.friendIsBuy=true
break
end
end
--获取全部装修配置
local cfgSchemeAll=skynet.server.gameConfig:GetPlayerAllCfg(player,"Scheme")
--该房间下的装修
local cfgSchemeList={}
for _, value in ipairs(cfgSchemeAll) do
if value.value==houseId then
table.insert(cfgSchemeList,value)
end
end
--获取已购买的装修
local mySchemeIdList=self:GetBuyHouseDecorateList(myPartnerId,houseId)
local otherSchemeIdList=self:GetBuyHouseDecorateList(friendPartherId,houseId)
for _, scheme in ipairs(cfgSchemeList) do
local temScheme={}
temScheme.decorateId=scheme.id
temScheme.decorateName=scheme.defaultName
--是否修改过名称
local decorateName=self:GetPlayerHouseDecorateName(player,friendPartherId,houseId,scheme.id )
if decorateName ~= "" then
temScheme.decorateName=decorateName
end
temScheme.myIsBuy=false
temScheme.friendIsBuy=false
if scheme.currencyBuy == 0 then
if spaceDecorateSchemeHouseItem.myIsBuy then
temScheme.myIsBuy=true
end
if spaceDecorateSchemeHouseItem.friendIsBuy then
temScheme.friendIsBuy=true
end
else
for _, value in ipairs(mySchemeIdList) do
if value == temScheme.decorateId then
temScheme.myIsBuy=true
break
end
end
for _, value in ipairs(otherSchemeIdList) do
if value == temScheme.decorateId then
temScheme.friendIsBuy=true
break
end
end
end
table.insert(spaceDecorateSchemeHouseItem.SpaceDecorateSchemeItemList,temScheme)
end
return spaceDecorateSchemeHouseItem
end
--设置玩家房间的装修方案
function DoubleSpace:SetPlayerHouseDecorate(player,friendPartherId,houseId,schemeId )
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , friendPartherId )
local houseToSchemeList={}
--获取该房间的装修方案
local houseIdListJson= skynet.server.redis:hget( myInfoKey ,self:GetMyKey("houseToSchemeIdList",myPartnerId))
if houseIdListJson ~= nil and houseIdListJson ~= "" then
houseToSchemeList=json:decode(houseIdListJson)
end
local isExist=false
--是否存在
for _, houseToScheme in ipairs(houseToSchemeList) do
if houseToScheme.houseId == houseId then
isExist=true
houseToScheme.schemeId=schemeId
end
end
if not isExist then
table.insert( houseToSchemeList,{houseId=houseId,schemeId=schemeId})
end
--判断该房间是否存在
skynet.server.redis:hset( myInfoKey ,self:GetMyKey("houseToSchemeIdList",myPartnerId),json:encode(houseToSchemeList))
end
--获取玩家房间的装修方案
function DoubleSpace:GetPlayerHouseDecorate(player,friendPartherId,houseId )
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , friendPartherId )
local houseToSchemeList={}
--获取该房间的装修方案
local houseIdListJson= skynet.server.redis:hget( myInfoKey ,self:GetMyKey("houseToSchemeIdList",myPartnerId))
if houseIdListJson ~= nil and houseIdListJson ~= "" then
houseToSchemeList=json:decode(houseIdListJson)
end
--是否存在
for _, houseToScheme in ipairs(houseToSchemeList) do
if houseToScheme.houseId == houseId then
return houseToScheme.schemeId
end
end
--返回免费的方案
local cfgSchemeAll =skynet.server.gameConfig:GetPlayerAllCfg(player, "Scheme" )
for k , v in pairs(cfgSchemeAll) do
if v.value == houseId and v.currencyBuy == 0 then
return v.id
end
end
return 0
end
--设置玩家房间的装修方案名称
function DoubleSpace:SetPlayerHouseDecorateName(player,friendPartherId,houseId,schemeId,schemeName )
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , friendPartherId )
local houseToSchemeList={}
--获取该房间的装修方案
local houseIdListJson= skynet.server.redis:hget( myInfoKey ,self:GetMyKey("houseToSchemeIdList",myPartnerId))
if houseIdListJson ~= nil and houseIdListJson ~= "" then
houseToSchemeList=json:decode(houseIdListJson)
end
local isExist=false
--是否存在
for _, houseToScheme in ipairs(houseToSchemeList) do
if houseToScheme.houseId == houseId then
isExist=true
if houseToScheme.schemeList ==nil then
houseToScheme.schemeList={}
end
--查找是否存在
for _, scheme in ipairs(houseToScheme.schemeList) do
if scheme.id == schemeId then
scheme.name=schemeName
goto continue
end
end
--未查找到
table.insert(houseToScheme.schemeList,{id=schemeId,name=schemeName})
--跳出循环(已查找到)
::continue::
break
end
end
if not isExist then
table.insert( houseToSchemeList,{houseId=houseId,schemeId=schemeId,schemeList={{id=schemeId,name=schemeName}}})
end
--判断该房间是否存在
skynet.server.redis:hset( myInfoKey ,self:GetMyKey("houseToSchemeIdList",myPartnerId),json:encode(houseToSchemeList))
end
--获取玩家房间的装修方案名称
function DoubleSpace:GetPlayerHouseDecorateName(player,friendPartherId,houseId,schemeId )
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , friendPartherId )
local houseToSchemeList={}
--获取该房间的装修方案
local houseIdListJson= skynet.server.redis:hget( myInfoKey ,self:GetMyKey("houseToSchemeIdList",myPartnerId))
if houseIdListJson ~= nil and houseIdListJson ~= "" then
houseToSchemeList=json:decode(houseIdListJson)
end
--是否存在
for _, houseToScheme in ipairs(houseToSchemeList) do
if houseToScheme.houseId == houseId and houseToScheme.schemeList ~= nil then
--查找是否存在
for _, scheme in ipairs(houseToScheme.schemeList) do
if scheme.id == schemeId then
return scheme.name
end
end
end
end
return ""
end
--检查双人空间可以设置
function DoubleSpace:CheckDoubleSpaceInSpace( player,otherPartnerId )
local myPartnerId = player.gameData.partner.id
local myInfoKey = self:GetMyInfoKey( myPartnerId , otherPartnerId )
--判断该房间是否存在
local houseIdListJson= skynet.server.redis:hget( myInfoKey , "allHouseId")
--检查已购买的房间
local myBuyHouseList = self:GetBuyHouseIdList(myPartnerId)
--获取好友购买房间信息
local otherBuyHouseList = self:GetBuyHouseIdList(otherPartnerId)
if next(myBuyHouseList) and next(otherBuyHouseList) then
for _, myHouseId in ipairs(myBuyHouseList) do
for _, otherHouseId in ipairs(otherBuyHouseList) do
--共同都有这个房屋
if myHouseId == otherHouseId then
--是否存在公共数据
local isExist=true
--房间不存在则添加
if houseIdListJson == nil then
isExist=false
else
local houseIdList=json:decode(houseIdListJson)
for _, value in ipairs(houseIdList) do
--已经存在直接返回
if value == myHouseId then
goto continue--直接结束
end
end
isExist=false
::continue::
end
if not isExist then
--添加房间
self:AddHouseInfo(player, otherPartnerId , myHouseId )
end
--添加装修方案
local myBuyHouseDecList=self:GetBuyHouseDecorateList(myPartnerId, myHouseId)
local otherBuyHouseDecList=self:GetBuyHouseDecorateList(otherPartnerId, otherHouseId)
if next(myBuyHouseDecList) and next(otherBuyHouseDecList) then
for _, myBuyHouseDec in ipairs(myBuyHouseDecList) do
for _, otherBuyHouseDec in ipairs(otherBuyHouseDecList) do
--共同都有这个装修方案
if myBuyHouseDec == otherBuyHouseDec then
--添加装方案
self:AddHouseDeco( player, otherPartnerId , myHouseId ,myBuyHouseDec )
end
end
end
end
end
end
::continue::
end
end
end
--table去重
function RemoveRepeat(t)
local unique={}
for _, value in ipairs(t) do
unique[value] = true
end
local newt={}
for index,_ in pairs(unique) do
table.insert(newt,index)
end
return newt
end
skynet.server.doubleSpace = DoubleSpace
return DoubleSpace