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

1337 lines
67 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local skynet = require "skynet"
local oo = require "Class"
local log = require "Log"
local pb = require "pb"
local redisKeyUrl = require "RedisKeyUrl"
local json = require "json"
local dataType = require "DataType"
local errorInfo = require "ErrorInfo"
local House = oo.class()
House.OPType_House = 1 --放房间
House.OPType_Bag = 2 --放背包
House.OPType_Move = 3 --移动
House.OPType_Operate = 4 --家具原地操作
House.DecorateStatus_Suc = 1 --成功装修
House.DecorateStatus_Failed = 2 --部分装修
House.Status_Lock = 1 --未解锁
House.Status_NoBuy = 2 --未购买
House.Status_AlreadyBuy = 3 --已购买
House.Status_Live = 4 --正在居住
House.SchemeStatus_NoBuy = 1 --装修方案未购买
House.SchemeStatus_AlreadyBuy = 2 --装修方案已购买
House.SchemeStatus_Use = 3 --装修方案正在使用
House.ShopType_1 = 1 --恋家地产
House.ShopType_2 = 2 --恋家置业
House.ShopType_3 = 3 --双人空间
--登陆初始化数据
function House:LoginInitData( player )
self:CheckNew( player )
end
--检查一下是否有新的房子
function House:CheckNew( player )
local houseId = 0
local curHouse = player.gameData.house
--检查房子是否有新配置
local cfgHouse = skynet.server.gameConfig:GetPlayerAllCfg( player , "House")
for k, houseInfo in pairs( cfgHouse ) do
local houseId = houseInfo.id
local isInitHouse = true
if not curHouse[ houseId ] then
--初始化房间
curHouse[ houseId ] = {}
curHouse[ houseId ].id = houseId
if 4 == houseId then
curHouse[ houseId ].status = self.Status_NoBuy
else
curHouse[ houseId ].status = self.Status_Lock
end
if 11 == houseId then
--庭院需要同步家园数据 isInit 是否初始化过 archs 家园建筑信息
curHouse[ houseId ].groupGarden = { archs = skynet.server.common:DeepCopy( skynet.server.group.InitArchs ) }
end
curHouse[ houseId ].unlockAreaList = {} --已经解锁的区域
curHouse[ houseId ].curSchemeId = 0 --当前方案ID
curHouse[ houseId ].scheme = {} --所有方案数据
curHouse[ houseId ].isFirstEnter = true --是否第一次进行
end
--等级够后就解锁可以购买
if player.gameData.level >= houseInfo.level and self.Status_Lock == curHouse[ houseId ].status then
curHouse[ houseId ].status = self.Status_NoBuy
if self.ShopType_1 == houseInfo.shopType then
skynet.server.msgTips:Add( player , 14 )
end
end
end
end
--展示
function House:Show( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SHouseShow", c2sData.data ))
local shopTypes = c2sData.data.shopType
local data = {}
data.houseId = player.gameData.curHouseID
data.showInfo = {}
for k1, v1 in pairs( shopTypes ) do
for k2, v2 in pairs( player.gameData.house ) do
local cfgCurHouse = skynet.server.gameConfig:GetPlayerCurCfg( player , "House" , v2.id )
if cfgCurHouse and v1 == cfgCurHouse.shopType then --将指定商店类型的房间发给客户端
table.insert( data.showInfo , { id = v2.id , status = v2.status })
end
end
end
skynet.server.msgTips:ReduceAll( player , 14 )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_HouseShow")
s2cData.data = assert(pb.encode("S2CHouseShow", data))
end
--房子购买
function House:Buy( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SHouseBuy", c2sData.data ))
local houseId = c2sData.data.houseId
local data = {}
if not self:IsExistHouse( player , houseId) then
s2cData.code = errorInfo.ErrorCode.NoExistHouse
else
data.houseId = houseId
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
if self:Add( player , houseId , s2cData , false ) then
if 11 == houseId then
--打开购买庭院的标记
player:SetSwitch( dataType.SwitchType_GainGarden , true )
skynet.server.levelTask:Modify( player , 3 , 1 )
skynet.server.taskListEvent:Modify( player , 3 , 1 )
end
if player.gameData.level>=cfgSValue.storeUnlockLvl then
skynet.server.store:InitData(player)
end
local myPartnerId = player.gameData.partner.id
local redisKey = string.format( redisKeyUrl.GameServerHouseDetailHash , myPartnerId )
if skynet.server.redis:exists( redisKey) then
local houseList = {}
for k, v in pairs( player.gameData.house ) do
if self.Status_AlreadyBuy == v.status or self.Status_Live == v.status then
table.insert( houseList, k )
end
end
skynet.server.redis:hset( redisKey , "houseList" , json:encode(houseList) , "houseData_"..houseId , json:encode( player.gameData.house[ houseId ]) )
end
log.debug(string.format("玩家 %d 购买房子成功 房间ID %d " , player.basicInfo.userID , houseId ))
else
log.warning(string.format("玩家 %d 购买房子失败 房间ID %d " , player.basicInfo.userID , houseId ))
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_HouseBuy")
s2cData.data = assert(pb.encode("S2CHouseBuy", data))
end
--搬家
function House:Move( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SHouseMove", c2sData.data ))
local houseId = c2sData.data.houseId
local data = {}
if not self:IsExistHouse( player , houseId ) then
s2cData.code = errorInfo.ErrorCode.NoExistHouse
else
data.houseId = houseId
for k1, v1 in pairs( player.gameData.house ) do
--找到对应的房间ID并且是购买了
if houseId == v1.id and self.Status_AlreadyBuy == v1.status then
local curHouse = player.gameData.house[ houseId ]
curHouse.isFirstEnter = false --不是第一次进了。
--将上一次房间状态改为已购买
local lastHouseId = player.gameData.curHouseID
local srcSchemeId = player.gameData.house[ lastHouseId ].curSchemeId
player.gameData.house[ lastHouseId ].status = self.Status_AlreadyBuy
--将该房间状态改为正在居住
v1.status = self.Status_Live
--找到对应的房间
player.gameData.curHouseID = houseId
--获取下该房间的花盆
skynet.server.flowerpot:CheckExistFlowerpot( player )
--找到该房间的方案ID
data.schemeId = v1.curSchemeId
--当前房子下所有方案信息
data.schemeInfo = self:GetAllSchemeInfo( player , houseId )
--当前房子和当前方案下的家具信息
data.furnitureInfo = self:GetCurSchemeFurniture( player , houseId , v1.curSchemeId )
data.decorateInfo = self:GetCurSchemeDecorate( player , houseId , v1.curSchemeId )
--根据房间ID不同完成的任务不同
if 1 == houseId then
skynet.server.levelTask:Modify( player , 12 , 1 , 3)
elseif 2 == houseId then
skynet.server.levelTask:Modify( player , 12 , 1 , 4)
elseif 3 == houseId then
skynet.server.levelTask:Modify( player , 12 , 1 , 5)
elseif 5 == houseId then
skynet.server.levelTask:Modify( player , 12 , 1 , 6)
elseif 7 == houseId then
skynet.server.levelTask:Modify( player , 12 , 1 , 14)
elseif 8 == houseId then
skynet.server.levelTask:Modify( player , 12 , 1 , 15)
elseif 9 == houseId then
skynet.server.levelTask:Modify( player , 12 , 1 , 16)
elseif 10 == houseId then
skynet.server.levelTask:Modify( player , 12 , 1 , 17)
elseif 12 == houseId then
skynet.server.levelTask:Modify( player , 12 , 1 , 18)
elseif 13 == houseId then
skynet.server.levelTask:Modify( player , 12 , 1 , 19) --恋家置业新户型:宜居新房配置&实装 2
end
skynet.server.taskListEvent:Modify( player , 23 , 1 )
--发送已经解锁的区域
data.areaId ={}
for areaId, v in pairs( curHouse.unlockAreaList ) do
if true == v then
table.insert( data.areaId , areaId )
end
end
local myPartnerId = player.gameData.partner.id
local redisKey = string.format( redisKeyUrl.GameServerHouseDetailHash , myPartnerId )
if skynet.server.redis:exists( redisKey) then
skynet.server.redis:hset( redisKey , "curHouseId", houseId, "houseData_"..houseId , json:encode( curHouse ) )
skynet.server.redis:expire( redisKey , skynet.server.partner.HouseDetailMaxOutTime ) --设置过期时间为1小时
end
end
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_HouseMove")
s2cData.data = assert(pb.encode("S2CHouseMove", data))
end
--购买方案
function House:BuyScheme( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SHouseBuyScheme", c2sData.data ))
local schemeId = c2sData.data.schemeId
local data = {}
if not schemeId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
local houseId = player.gameData.curHouseID
local houseInfo = player.gameData.house[ houseId ]
local isExist = false
for k, v in pairs( houseInfo.scheme ) do
--找到对应的方案ID和已经购买的方案
if schemeId == v.id and self.SchemeStatus_NoBuy == v.status then
isExist = true
--根据方案ID找到配置的ID
local curCfgId = 0
local cfgScheme = skynet.server.gameConfig:GetPlayerAllCfg( player , "Scheme")
for k, v in pairs(cfgScheme) do
if schemeId == v.combineID then
curCfgId = v.id
end
end
local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney( player , "Scheme" , curCfgId )
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_31")
if player:MoneyChange( moneyType , -moneyCount , eventId) then
v.status = self.SchemeStatus_AlreadyBuy
--找到该房间的方案ID
data.schemeId = schemeId
--当前房子下所有方案信息
data.schemeInfo = self:GetAllSchemeInfo( player , houseId )
skynet.server.npcTask:Modify( player , 75 , 1 )
skynet.server.taskListEvent:Modify( player , 75 , 1 )
log.debug(string.format("玩家 %d 购买方案成功 房间ID %d 方案ID %d" , player.basicInfo.userID , houseId , schemeId ))
else
log.warning(string.format("玩家 %d 购买方案失败 货币不足 房间ID %d 方案ID %d" , player.basicInfo.userID , houseId , schemeId ))
end
break
end
end
self:UpdateDataToRedis( player , houseId )
if not isExist then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_HouseBuyScheme")
s2cData.data = assert(pb.encode("S2CHouseBuyScheme", data))
end
--切换方案
function House:SwitchScheme( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SHouseSwitchScheme", c2sData.data ))
local schemeId = c2sData.data.schemeId
local data = {}
local houseId = player.gameData.curHouseID
local houseInfo = player.gameData.house[ houseId ]
if not schemeId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
elseif not self:IsBuyScheme( houseInfo.scheme , schemeId ) then
s2cData.code = errorInfo.ErrorCode.NoExistSchemeID
else
if houseInfo then
for k, v in pairs( houseInfo.scheme ) do
--如果是使用使用状态就改为购买状态
if self.SchemeStatus_Use == v.status then
v.status = self.SchemeStatus_AlreadyBuy
end
--找到对应的方案ID和已经购买的方案
if schemeId == v.id and self.SchemeStatus_AlreadyBuy == v.status then
local srcSchemeId = player.gameData.house[ houseId ].curSchemeId
player.gameData.house[ houseId ].curSchemeId = schemeId
v.status = self.SchemeStatus_Use
skynet.server.flowerpot:CheckExistFlowerpot( player )
--找到该房间的方案ID
data.schemeId = schemeId
--当前房子下所有方案信息
data.schemeInfo = self:GetAllSchemeInfo( player , houseId )
--当前房子和当前方案下的家具信息
data.furnitureInfo = self:GetCurSchemeFurniture( player , houseId , schemeId )
data.decorateInfo = self:GetCurSchemeDecorate( player , houseId , schemeId )
log.debug(string.format("玩家 %d 切换方案成功 房间ID %d 方案ID %d" , player.basicInfo.userID , houseId , schemeId ))
end
end
self:UpdateDataToRedis( player , houseId )
else
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_HouseSwitchScheme")
s2cData.data = assert(pb.encode("S2CHouseSwitchScheme", data))
end
--修改方案名称
function House:SchemeName( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SHouseSchemeName", c2sData.data ))
local schemeId = c2sData.data.schemeId
local name = c2sData.data.name
local data = {}
if not schemeId or not name or #name > 21 then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
elseif skynet.server.common:IsExistSpecialChar( name ) then
s2cData.code = errorInfo.ErrorCode.ExistSpecialChar
elseif skynet.server.common:IsMaskWords( name ) then
s2cData.code = errorInfo.ErrorCode.ExistMaskWords
else
local isExist = false
local houseId = player.gameData.curHouseID
local houseInfo = player.gameData.house[ houseId ]
if houseInfo then
for k, v in pairs( houseInfo.scheme ) do
--找到对应的方案ID和已经购买的方案
if schemeId == v.id and (self.SchemeStatus_AlreadyBuy == v.status or self.SchemeStatus_Use == v.status) then
data.schemeId = schemeId
data.name = name
v.name = name
isExist = true
log.debug(string.format("玩家 %d 房子 修改方案名称 方案ID %d 修改方案名称 %s" , player.basicInfo.userID , schemeId, name))
break
end
end
else
s2cData.code = errorInfo.ErrorCode.NoExistHouse
end
if not isExist then
s2cData.code = errorInfo.ErrorCode.NoExistSchemeID
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_HouseSchemeName")
s2cData.data = assert(pb.encode("S2CHouseSchemeName", data))
end
--房屋摆放家具
function House:PutFurniture( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SHousePutFurniture", c2sData.data ))
local houseId = player.gameData.curHouseID
local funitureOp = c2sData.data.funitureOp --操作家具信息
local data = {}
data.houseId = houseId
data.funitureOp = {}
local isSuc = nil
for k, v in pairs( funitureOp ) do
isSuc = false
log.debug(string.format("玩家 %d 房屋摆放家具 操作类型 %d" , player.basicInfo.userID , v.opType))
if self.OPType_House == v.opType and self:AddFurnitureToHouse( player , houseId , v.furnitureInfo ) then --新增家具到房间
isSuc = true
elseif self.OPType_Bag == v.opType and self:RemoveFurnitureFromHouse( player , houseId , v.furnitureInfo ) then --从房间中移出家具
isSuc = true
elseif self.OPType_Move == v.opType and v.lastPos and self:MoveFurnitureFromHouse( player , houseId , v.furnitureInfo , v.lastPos ) then --移动家具
isSuc = true
elseif self.OPType_Operate == v.opType and self:OperateFurnitureFromHouse( player , houseId , v.furnitureInfo ) then --家具原地操作
isSuc = true
end
if isSuc then
table.insert( data.funitureOp , v )
else
log.warning(string.format("玩家 %d 装修失败家具信息 操作类型 %d 家具类型 %d 家具ID %d " , player.basicInfo.userID , v.opType , v.furnitureInfo.type , v.furnitureInfo.id ))
end
end
self:UpdateDataToRedis( player , houseId )
player:ResetAllUnUsedGoods()
s2cData.cmd = pb.enum("MsgType","CMD_S2C_HousePutFurniture")
s2cData.data = assert(pb.encode("S2CHousePutFurniture", data))
end
--添加装修
function House:Decorate( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SHouseDecorate", c2sData.data ))
local houseId = c2sData.data.houseId
local schemeId = c2sData.data.schemeId
local decorateInfo = c2sData.data.decorateInfo --装修信息
local data = {}
if not houseId or not schemeId or not decorateInfo then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
data.houseId = houseId
data.decorateInfo = {}
local cfgCurHouse = skynet.server.gameConfig:GetPlayerCurCfg( player , "House" , houseId )
if not cfgCurHouse then
s2cData.code = errorInfo.ErrorCode.NoExistHouse
else
local isSuc = false
--装修信息
for k, v in pairs( decorateInfo ) do
isSuc = self:AddDecorate( player , v , houseId , schemeId , cfgCurHouse["function"] )
if isSuc then
table.insert( data.decorateInfo , v )
else
log.warning(string.format("玩家 %d 装修失败装修信息 装修ID %d " , player.basicInfo.userID , v.decoId ))
end
end
self:UpdateDataToRedis( player , houseId )
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_HouseDecorate")
s2cData.data = assert(pb.encode("S2CHouseDecorate", data))
end
--删除装修
function House:RemoveHouseDecorate( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SRemoveHouseDecorate", c2sData.data ))
local houseId = player.gameData.curHouseID
local decorateInfo = c2sData.data.decorateInfo --装修信息
local data = {}
data.houseId = houseId
data.decorateInfo = {}
local isSuc = false
--装修信息
isSuc = self:DeleteDecorate( player , decorateInfo )
if isSuc then
table.insert( data.decorateInfo , decorateInfo )
else
log.warning(string.format("玩家 %d 删除装修失败装修信息 装修ID %d " , player.basicInfo.userID , decorateInfo.decoId ))
end
self:UpdateDataToRedis( player , houseId )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_RemoveHouseDecorate")
s2cData.data = assert(pb.encode("S2CRemoveHouseDecorate", data))
end
--解锁区域
function House:UnlockArea( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SHouseUnlockArea", c2sData.data ))
local data = {}
data.areaId = {}
local houseId = player.gameData.curHouseID
local areaId = c2sData.data.areaId --这里的areaId需要与客户端对一下传过来是1开始没问题传过来是0就需要减一
if not areaId or areaId <= 0 then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
s2cData.code = errorInfo.ErrorCode.AlreadyUnlock
local cfgOneHouse = skynet.server.gameConfig:GetPlayerCurCfg( player , "House" , houseId)
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_32")
for k, v in pairs( cfgOneHouse.unlockArearID ) do
if v == areaId and not player.gameData.house[ houseId ].unlockAreaList[ areaId ] then --未解锁的区域才处理
if player:MoneyChange( cfgOneHouse.currencyBuy , -cfgOneHouse.unlockAreaPrice[k] , eventId ) then
player.gameData.house[ houseId ].unlockAreaList[ areaId ] = true
s2cData.code = errorInfo.Suc
if 3 == houseId and 1 == areaId then --1-卫浴间 2-厨房间
player:AddExpForType( 6 , 7 )
skynet.server.levelTask:Modify( player , 13 , 1 , 1 )
skynet.server.taskListEvent:Modify( player , 13 , 1 )
elseif 3 == houseId and 2 == areaId then
player:AddExpForType( 6 , 8 )
skynet.server.levelTask:Modify( player , 13 , 1 , 2 )
skynet.server.taskListEvent:Modify( player , 13 , 1 )
elseif 5 == houseId and 3 == areaId then --复式小屋二层
player:AddExpForType( 6 , 10 )
skynet.server.levelTask:Modify( player , 13 , 1 , 12 )
skynet.server.taskListEvent:Modify( player , 13 , 1 )
elseif 10 == houseId and 4 == areaId then --三层小楼二层空间
player:AddExpForType( 6 , 16 )
skynet.server.levelTask:Modify( player , 13 , 1 , 13 )
skynet.server.taskListEvent:Modify( player , 13 , 1 )
end
log.debug(string.format("玩家 %d 解锁区域成功 房间ID %d 区域ID %d" , player.basicInfo.userID , houseId , areaId ))
else
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
end
break
end
end
self:UpdateDataToRedis( player , houseId )
end
--发送已经解锁的区域
for areaId, v in pairs( player.gameData.house[ houseId ].unlockAreaList ) do
if true == v then
table.insert( data.areaId , areaId )
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_HouseUnlockArea")
s2cData.data = assert(pb.encode("S2CHouseUnlockArea", data))
end
--庭院在主页展示
function House:HouseGardenShow( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SHouseGardenShow", c2sData.data ))
local data = {}
if not player:GetSwitch( dataType.SwitchType_GainGarden ) then
s2cData.code = errorInfo.ErrorCode.NoUnlockGarden
else
local isShow = c2sData.data.isShow
if true == isShow then
player:SetSwitch( dataType.SwitchType_ShowGarden , true )
--player.gameData.lastCurHouseID = player.gameData.curHouseID
--player.gameData.curHouseID = 11
else
player:SetSwitch( dataType.SwitchType_ShowGarden , false )
--player.gameData.curHouseID = player.gameData.lastCurHouseID
end
data.isShow = isShow
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_HouseGardenShow")
s2cData.data = assert(pb.encode("S2CHouseGardenShow", data))
end
--新增家具到房间
function House:AddFurnitureToHouse( player , houseId , furnitureInfo )
local type = furnitureInfo.type
local id = furnitureInfo.id
local isExistFlowerpot = false
for k, v in pairs( player.gameData.bag ) do
if type == v.type and id == v.id then
--该家具在当前房间的数量要小于背包的数量
local count = self:GetCurFurnitureCount( player , type , id )
if count < v.count then
--放到房间中
if self:AddFurniture( player , furnitureInfo , count ) then
isExistFlowerpot = true
log.debug(string.format("玩家 %d 增加家具到房间成功 房间ID %d 家具类型 %d 家具ID %d" , player.basicInfo.userID , houseId , type , v.id ))
return true
else
log.warning(string.format("玩家 %d 增加家具到房间失败 房间ID %d 家具类型 %d 家具ID %d" , player.basicInfo.userID , houseId , type , v.id ))
return false
end
else
return false
end
end
end
return false
end
--从房间中移出家具
function House:RemoveFurnitureFromHouse( player , houseId , furnitureInfo )
local id = furnitureInfo.id
local type = furnitureInfo.type
local nowPos = furnitureInfo.nowPos
local schemeId = player.gameData.house[ houseId ].curSchemeId
if dataType.GoodsType_Flowerpot == type then --花盆移除
return skynet.server.flowerpot:PutBag( player , furnitureInfo )
elseif dataType.GoodsType_Furniture == type then --家具的移除
for k1, v1 in pairs( player.gameData.house[ houseId ].scheme ) do
--找到对应的方案
if schemeId == v1.id then
--该方案下的家具
for k2, v2 in pairs( v1.furniture ) do
if type == v2.type and id == v2.id and skynet.server.common:Distance( nowPos.x , nowPos.y , v2.nowPos.x , v2.nowPos.y) <= 0.1 then
table.remove( v1.furniture , k2 )
log.debug(string.format("玩家 %d 家具从房间中移出成功 房间ID %d 家具类型 %d 家具ID %d" , player.basicInfo.userID , houseId , type ,v2.id ))
return true
end
end
end
end
end
log.info("在房间中移出家具失败",skynet.server.common:TableToString(furnitureInfo) )
return false
end
--在房间中移动家具
function House:MoveFurnitureFromHouse( player , houseId , furnitureInfo , lastPos )
local type = furnitureInfo.type
local id = furnitureInfo.id
local targetPos = furnitureInfo.nowPos --目标位置
local schemeId = player.gameData.house[ houseId ].curSchemeId
local curScheme = self:GetCurScheme( player )
--该方案下的家具
if dataType.GoodsType_Flowerpot == type then
return skynet.server.flowerpot:UpdateFlowerpotPos( player , houseId , schemeId , id , targetPos.x , targetPos.y , furnitureInfo.isPutInFurniture , furnitureInfo.rotateType )
elseif dataType.GoodsType_Furniture == type then
for k, v in pairs( curScheme.furniture ) 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 type == v.type and id == v.id and (srcPosDistance > 0.1 or dstPosDistance < 0 ) then
log.info("在房间中移动家具失败" , lastPos.x , lastPos.y , v.nowPos.x , v.nowPos.y , srcPosDistance , targetPos.x , targetPos.y , v.nowPos.x , v.nowPos.y , dstPosDistance)
end
if type == v.type and id == v.id and srcPosDistance <= 0.1 and dstPosDistance >= 0 then
v.nowPos = furnitureInfo.nowPos
v.rotateType = furnitureInfo.rotateType
v.isPutInFurniture = furnitureInfo.isPutInFurniture
v.parentFurId = furnitureInfo.parentFurId
log.debug(string.format("玩家 %d 家具从房间中移动成功 房间ID %d 家具类型 %d 家具ID %d" , player.basicInfo.userID , houseId , type ,v.id ))
return true
end
end
end
log.info("在房间中移动家具失败")
return false
end
--家具原地操作
function House:OperateFurnitureFromHouse( player , houseId , furnitureInfo )
local type = furnitureInfo.type
local id = furnitureInfo.id
local nowPos = furnitureInfo.nowPos
local schemeId = player.gameData.house[ houseId ].curSchemeId
for k1, v1 in pairs( player.gameData.house[ houseId ].scheme ) do
--找到对应的方案
if schemeId == v1.id then
--该方案下的家具
for k2, v2 in pairs( v1.furniture ) do
if type == v2.type and id == v2.id and skynet.server.common:Distance( nowPos.x , nowPos.y , v2.nowPos.x , v2.nowPos.y) <= 0.1 then
v2.nowPos = furnitureInfo.nowPos
v2.rotateType = furnitureInfo.rotateType
v2.isPutInFurniture = furnitureInfo.isPutInFurniture
v2.clickType = furnitureInfo.clickType
v2.parentFurId = furnitureInfo.parentFurId
log.debug(string.format("玩家 %d 家具 原地操作成功 房间ID %d 家具类型 %d 家具ID %d" , player.basicInfo.userID , houseId , type ,v2.id ))
return true
end
end
end
end
return false
end
--获取当前房间该家具数量
function House:GetCurFurnitureCount( player , type , id )
local houseId = player.gameData.curHouseID --当前房间ID
local schemeId = player.gameData.house[ houseId ].curSchemeId
local count = 0
skynet.server.flowerpot:GetAllFlowerpot( player )
local furnitureInfo = self:GetCurSchemeFurniture( player , houseId , schemeId )
for k, v in pairs( furnitureInfo ) do
if type == v.type and id == v.id then
count = count +1
end
end
return count
end
--获取当前家具在所有房间所有房间最大数量
function House:GetCurFurnitureMaxCount( player , goodsType , goodsId )
local maxCount = 0
--遍历所有房间
for k1, house in pairs( player.gameData.house ) do
--遍历该房间下所有方案
for k2, scheme in pairs( house.scheme ) do
--当前家具在该方案下的数量
local count = 0
for k3, furniture in pairs( scheme.furniture ) do
if goodsType == furniture.type and goodsId == furniture.id then
count = count + 1
end
end
--其它房间方案数量比该房间方案少,就赋值
if maxCount < count then
maxCount = count
end
end
end
return maxCount
end
--新增房间
function House:Add( player , houseId , s2cData , isFree)
isFree = isFree or false
local curHouse = player.gameData.house[ houseId ]
if self.Status_NoBuy ~= curHouse.status then
s2cData.code = errorInfo.ErrorCode.AlreadyGet
return false
end
--只有没购买才会走这里
local cfgHouse = skynet.server.gameConfig:GetPlayerAllCfg( player , "House")
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_33")
for k1, v1 in pairs( cfgHouse ) do
if houseId == v1.id and player.gameData.level >= v1.level then --找到对应的房间ID和等级足购
local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney( player , "House" , v1.id )
if isFree or player:MoneyChange( moneyType , -moneyCount , eventId)then
--修改为购买状态
player.gameData.house[ houseId ].status = self.Status_AlreadyBuy
--初始化所有装修方案
self:InitAllDecorateScheme( player , houseId , curHouse)
--赠送默认旧家具和摆放旧家具
self:InitHouseFurniture( player , houseId )
--解锁一些户型功能
for k2, v2 in pairs( v1["function"] ) do
skynet.server.decorateShop:AddUnlockType( player ,v2 )
end
--赠送一些基本装修
for k2, v2 in pairs( v1.unlockDecorate ) do
skynet.server.bag:AddGoods( player , dataType.GoodsType_Decorate , v2 , 1 )
end
--赠送花园ID到背包里
if 0 ~= v1.communityHouse then
skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , v1.communityHouse , 1 )
end
if 1 == houseId then
player:AddExpForType( 6 , 4 )
--skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 60 , 1)
skynet.server.levelTask:Modify( player , 11 , 1 )
skynet.server.taskListEvent:Modify( player , 11 , 1 )
elseif 2 == houseId then
player:AddExpForType( 6 , 5 )
--skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 63 , 1)
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Door )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Bar )
elseif 3 == houseId then
player:AddExpForType( 6 , 6 )
--skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 59 , 1)
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Door )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Bar )
elseif 4 == houseId then
player.gameData.house[ houseId ].status = self.Status_Live --新手默认房间是居住状态
--skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 62 , 1)
elseif 5 == houseId then
player:AddExpForType( 6 , 9 )
--skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 61 , 1)
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Door )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Stair )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_HandRail )
elseif 6 == houseId then
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Door )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Bar )
elseif 7 == houseId then
player:AddExpForType( 6 , 12 )
--skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 64 , 1)
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Stair )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_HandRail )
elseif 8 == houseId then
player:AddExpForType( 6 , 13 )
--skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 65 , 1)
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Stair )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Door )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Bar )
elseif 9 == houseId then
player:AddExpForType( 6 , 14 )
--skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 66 , 1)
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Stair )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_HandRail )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Door )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Bar )
elseif 10 == houseId then
player:AddExpForType( 6 , 15 )
--skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 67 , 1)
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Stair )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_HandRail )
--skynet.server.decorateShop:AddUnlockType( player , dataType.DecorateType_Door )
elseif 11 == houseId then
player:AddExpForType( 6 , 11 )
skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 56 , 1)
skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 57 , 1)
elseif 12 == houseId then
player:AddExpForType( 6 , 17 )
--skynet.server.bag:AddGoods( player , dataType.GoodsType_Garden , 134 , 1)
elseif 13 == houseId then
player:AddExpForType( 6 , 19 ) --家置业新户型:宜居新房配置&实装 id6
end
return true
else
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
return false
end
break
end
end
s2cData.code = errorInfo.ErrorCode.NoExistHouse
return false
end
--是否存在房子
function House:IsExistHouse( player , houseId )
if player.gameData.house[ houseId ] then
return true
end
return false
end
--是否购买房子
function House:IsBuyHouse( player , houseId )
if player.gameData.house[ houseId ] and self.Status_NoBuy ~= player.gameData.house[ houseId ].status and self.Status_Lock ~= player.gameData.house[ houseId ].status then
return true
end
return false
end
--是否存在方案
function House:IsExistScheme( player , houseId , schemeId )
for k, v in pairs( player.gameData.house[ houseId ].scheme ) do
if schemeId == v.id then
return true
end
end
return false
end
--是否购买方案
function House:IsBuyScheme( curScheme , schemeId)
for k, v in pairs( curScheme ) do
--找到对应的方案ID和已经购买的方案
if schemeId == v.id and (self.SchemeStatus_AlreadyBuy == v.status or self.SchemeStatus_Use == v.status) then
return true
end
end
return false
end
--获取方案信息
function House:GetAllSchemeInfo( player , houseId )
local data = {}
for k, v in pairs( player.gameData.house[ houseId ].scheme ) do
table.insert( data , { id = v.id , name = v.name , status = v.status })
end
return data
end
--获取当前方案下的家具和花盆
function House:GetCurSchemeFurniture( player , houseId , schemeId )
local furnitureInfo = {}
local curScheme = self:GetCurScheme( player )
--将家具和花盆打包在一起发给客户端
for k, v in pairs( curScheme.furniture ) do
table.insert( furnitureInfo , v )
end
for k, v in pairs( player.gameData.flowerpot ) do
--从花盆列表中找到当前方案下的位置信息
local flowerpotInfo = skynet.server.flowerpot:GetFlowerpot( player , v )
if flowerpotInfo then
table.insert( furnitureInfo , flowerpotInfo )
end
end
return furnitureInfo
end
--获取当前方案下的装修
function House:GetCurSchemeDecorate( player , houseId , schemeId )
local furnitureInfo = {}
for k1, v1 in pairs( player.gameData.house[ houseId ].scheme ) do
if schemeId == v1.id then
return v1.decorate
end
end
return nil
end
--获取当前方案
function House:GetCurScheme( player )
local houseId = player.gameData.curHouseID
local schemeId = player.gameData.house[ houseId ].curSchemeId
for k, v in pairs( player.gameData.house[ houseId ].scheme ) do
if schemeId == v.id then
return v
end
end
return nil
end
--获取当前方案
function House:GetCurSchemeForID( player , houseId , schemeId )
for k, v in pairs( player.gameData.house[ houseId ].scheme ) do
if schemeId == v.id then
return v
end
end
return nil
end
--获取当前方案下的家具
function House:AddFurniture( player , furnitureInfo , count )
if dataType.GoodsType_Flowerpot == furnitureInfo.type then --花盆
skynet.server.flowerpot:PutHouse( player , furnitureInfo.id , furnitureInfo )
return true
elseif dataType.GoodsType_Furniture == furnitureInfo.type then --家具
local cfgGoods = skynet.server.gameConfig:GetPlayerCurCfg( player , "Furniture", furnitureInfo.id )
if skynet.server.shop.BuyShopType_DoubleSpace == cfgGoods.shopType then
return false
end
--找到当前的方案ID
local curScheme = self:GetCurScheme( player )
table.insert( curScheme.furniture , self:InitFurniture( furnitureInfo ))
--修改任务
if skynet.server.shop.FurnitureType_Cinnabar == cfgGoods.type then
skynet.server.levelTask:Modify( player , 7 , 1 , nil , furnitureInfo.id)
skynet.server.dailyTask:Modify( player , 7 , 1 , furnitureInfo.id)
skynet.server.npcTask:Modify( player , 7 , 1 )
skynet.server.taskListEvent:Modify( player , 7 , 1)
else
skynet.server.levelTask:Modify( player , 6 , 1 , nil , furnitureInfo.id)
skynet.server.dailyTask:Modify( player , 6 , 1 , furnitureInfo.id)
skynet.server.npcTask:Modify( player , 6 , 1 )
skynet.server.taskListEvent:Modify( player , 6 , 1)
local houseId = player.gameData.curHouseID
if 2 == houseId then
skynet.server.npcTask:Modify( player , 6 , 1 )
skynet.server.taskListEvent:Modify( player , 6 , 1 )
end
end
return true
end
return false
end
--新增装修到房间
function House:AddDecorate( player , decorateInfo , houseId , schemeId , houseFunc )
local isSuc = false
--先检查玩家是否有该商品
if not player:IsBuyGoods( dataType.GoodsType_Decorate , decorateInfo.decoId ) then
return false
else
--更新装修任务
local cfgGoods = skynet.server.gameConfig:GetPlayerCurCfg( player , "Decoration" , decorateInfo.decoId )
if skynet.server.shop.BuyShopType_DoubleSpace == cfgGoods.shopType then
return false
else
skynet.server.levelTask:Modify( player , 8 , 1 )
skynet.server.npcTask:Modify( player , 8 , 1 )
skynet.server.dailyTask:Modify( player , 8 , 1)
skynet.server.taskListEvent:Modify( player , 8 , 1)
if dataType.DecorateType_Door == cfgGoods.type then
skynet.server.levelTask:Modify( player , 85 , 1 )
skynet.server.taskListEvent:Modify( player , 85 , 1 )
elseif dataType.DecorateType_Bar == cfgGoods.type then
skynet.server.levelTask:Modify( player , 86 , 1 )
skynet.server.taskListEvent:Modify( player , 86 , 1 )
end
--获取当前房间当前方案
local schemeInfo = self:GetCurSchemeForID( player , houseId , schemeId )
if schemeInfo then
local isExist = false
for k, v in pairs( schemeInfo.decorate ) do
if v.facilityType == cfgGoods.type and decorateInfo.facilityId == v.facilityId then
v.decoId = decorateInfo.decoId
isExist = true
break
end
end
--不存在并且该户型有当前设施就新增进来
if not isExist and skynet.server.common:IsExist( cfgGoods.type , houseFunc ) then
decorateInfo.facilityType = cfgGoods.type
table.insert( schemeInfo.decorate , decorateInfo )
end
end
log.debug(string.format("玩家 %d 家具 装修 房间ID %d 设施类型 %d 设施ID %d 装修ID %d" , player.basicInfo.userID , houseId , cfgGoods.type , decorateInfo.facilityId , decorateInfo.decoId))
return true
end
end
end
--删除装修到房间
function House:DeleteDecorate( player , decorateInfo )
local houseId = player.gameData.curHouseID --当前房间ID
local schemeId = player.gameData.house[ houseId ].curSchemeId
local isSuc = false
--先检查玩家是否有该商品
if not player:IsBuyGoods( dataType.GoodsType_Decorate , decorateInfo.decoId ) then
return false
else
--更新装修任务
local cfgGoods = skynet.server.gameConfig:GetPlayerCurCfg( player , "Decoration" , decorateInfo.decoId )
if skynet.server.shop.BuyShopType_DoubleSpace == cfgGoods.shopType then
return false
else
--获取当前房间当前方案
local schemeInfo = self:GetCurScheme( player )
if schemeInfo then
for k, v in pairs( schemeInfo.decorate ) do
if v.facilityType == cfgGoods.type and decorateInfo.facilityId == v.facilityId then
--schemeInfo.decorate[ k ] = nil
table.remove( schemeInfo.decorate , k )
log.debug(string.format("玩家 %d 家具 删除装修 房间ID %d 设施类型 %d 设施ID %d 装修ID %d" , player.basicInfo.userID , houseId , cfgGoods.type , decorateInfo.facilityId , decorateInfo.decoId))
return true
end
end
end
end
end
end
--初始化家具
function House:InitFurniture( furnitureInfo )
local data = {}
data.type = furnitureInfo.type
data.id = furnitureInfo.id
data.nowPos = furnitureInfo.nowPos
data.rotateType = furnitureInfo.rotateType
data.isPutInFurniture = furnitureInfo.isPutInFurniture
data.clickType = furnitureInfo.clickType
data.parentFurId = furnitureInfo.parentFurId
return data
end
--获取拥有房子的数量
function House:GetOwnCount( player )
local count = 0
for k, v in pairs(player.gameData.house ) do
if self.Status_AlreadyBuy == v.status or self.Status_Live == v.status then
count = count + 1
end
end
return count
end
--从当前房间移出
function House:RemoveFurniture( player , goodsType , goodsId )
--获取当前房间当前方案
local schemeInfo = self:GetCurScheme( player )
for k, v in pairs( schemeInfo.furniture ) do
if goodsType == v.type and goodsId == v.id then
table.remove( schemeInfo.furniture , k )
break
end
end
end
--初始化所有装修方案
function House:InitAllDecorateScheme( player , houseId , curHouse )
--初始化方案数据
local cfgScheme = skynet.server.gameConfig:GetPlayerAllCfg( player , "Scheme")
for k, v in pairs( cfgScheme ) do
local schemeId = v.combineID
if houseId == v.value and curHouse and not self:IsExistScheme( player , houseId , schemeId ) then
local status = self.SchemeStatus_NoBuy --未购买
local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney( player , "Scheme" , v.id )
if dataType.MoneyType_No == moneyType and 0 == moneyCount then
status = self.SchemeStatus_Use
curHouse.curSchemeId = schemeId
end
--将方案信息加载进去
local decorate = self:InitDecorate( player , houseId )
table.insert( curHouse.scheme , { id = schemeId , name = v.defaultName , status = status , furniture = {} , decorate = decorate })
end
end
end
--初始化装修
function House:InitDecorate( player , houseId )
local goodsType = dataType.GoodsType_Decorate
local curHouseData = skynet.server.gameConfig:GetInitHouseData( houseId )
if not curHouseData or not curHouseData.allDecoration then
log.debug(string.format("玩家 %d 未找到房间装修配置 房间ID %d " , player.userId , houseId ))
return false
end
local decorate = {}
--初始化装修数据
local function InitDecoData()
for k, v in pairs( curHouseData.allDecoration ) do
local decoId = v.decoID
local id = v.id
local cfgOneDecoration = skynet.server.gameConfig:GetPlayerCurCfg( player , "Decoration" , decoId )
table.insert( decorate , { facilityType = cfgOneDecoration.type , facilityId = id , decoId = decoId })
--直接加到背包里,但不增加经验
if not player:IsBuyGoods( dataType.GoodsType_Decorate , decoId ) then
skynet.server.bag:AddGoodsNoExp( player , dataType.GoodsType_Decorate , decoId , 1 )
end
end
end
if 1 == houseId then
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_Floor , facilityId = 1 , decoId = 24 })
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_MailBox , facilityId = 0 , decoId = 212 })
elseif 2 == houseId then
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_Floor , facilityId = 1 , decoId = 24 })
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 2 , decoId = 25 })
table.insert( decorate , { facilityType = dataType.DecorateType_Door , facilityId = 1 , 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_MailBox , facilityId = 0 , decoId = 212 })
elseif 3 == houseId then
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_WallPaper , facilityId = 4 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 5 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 1 , decoId = 24 })
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_Floor , facilityId = 4 , decoId = 24 })
table.insert( decorate , { facilityType = dataType.DecorateType_Bar , facilityId = 1 , decoId = 27 })
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_Eave , facilityId = 0 , decoId = 210 })
table.insert( decorate , { facilityType = dataType.DecorateType_OutDeco , facilityId = 0 , decoId = 211 })
table.insert( decorate , { facilityType = dataType.DecorateType_MailBox , facilityId = 0 , decoId = 212 })
elseif 4 == houseId then
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_Floor , facilityId = 1 , decoId = 24 })
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_MailBox , facilityId = 0 , decoId = 212 })
elseif 5 == houseId then
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 1 , decoId = 24 })
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 2 , decoId = 24 })
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 3 , decoId = 25 })
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 4 , decoId = 25 })
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 5 , 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_WallPaper , facilityId = 4 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 5 , 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_Stair , facilityId = 1 , decoId = 163 })
table.insert( decorate , { facilityType = dataType.DecorateType_HandRail , facilityId = 1 , decoId = 164 })
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_MailBox , facilityId = 0 , decoId = 212 })
elseif 7 == houseId then
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 1 , decoId = 24 })
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_Floor , facilityId = 4 , 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_WallPaper , facilityId = 4 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 5 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_Stair , facilityId = 1 , decoId = 163 })
table.insert( decorate , { facilityType = dataType.DecorateType_HandRail , facilityId = 1 , decoId = 164 })
table.insert( decorate , { facilityType = dataType.DecorateType_Eave , facilityId = 0 , decoId = 246 })
table.insert( decorate , { facilityType = dataType.DecorateType_OutDeco , facilityId = 0 , decoId = 250 })
table.insert( decorate , { facilityType = dataType.DecorateType_MailBox , facilityId = 0 , decoId = 248 })
elseif 8 == houseId then
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 1 , decoId = 24 })
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_Floor , facilityId = 4 , 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_WallPaper , facilityId = 4 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 5 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 6 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 7 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_Stair , facilityId = 1 , decoId = 163 })
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 = 245 })
table.insert( decorate , { facilityType = dataType.DecorateType_OutDeco , facilityId = 0 , decoId = 251 })
table.insert( decorate , { facilityType = dataType.DecorateType_MailBox , facilityId = 0 , decoId = 247 })
elseif 9 == houseId then
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 1 , decoId = 24 })
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_Floor , facilityId = 4 , decoId = 25 })
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_WallPaper , facilityId = 4 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 5 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_Stair , facilityId = 1 , decoId = 163 })
table.insert( decorate , { facilityType = dataType.DecorateType_Stair , facilityId = 2 , decoId = 163 })
table.insert( decorate , { facilityType = dataType.DecorateType_HandRail , facilityId = 1 , decoId = 164 })
table.insert( decorate , { facilityType = dataType.DecorateType_Door , facilityId = 1 , decoId = 26 })
table.insert( decorate , { facilityType = dataType.DecorateType_Bar , facilityId = 1 , decoId = 27 })
table.insert( decorate , { facilityType = dataType.DecorateType_Eave , facilityId = 0 , decoId = 244 })
table.insert( decorate , { facilityType = dataType.DecorateType_OutDeco , facilityId = 0 , decoId = 252 })
table.insert( decorate , { facilityType = dataType.DecorateType_MailBox , facilityId = 0 , decoId = 249 })
elseif 10 == houseId then
table.insert( decorate , { facilityType = dataType.DecorateType_Floor , facilityId = 1 , decoId = 24 })
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_Floor , facilityId = 4 , 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_WallPaper , facilityId = 4 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 5 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 6 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_WallPaper , facilityId = 7 , decoId = 23 })
table.insert( decorate , { facilityType = dataType.DecorateType_Stair , facilityId = 1 , decoId = 163 })
table.insert( decorate , { facilityType = dataType.DecorateType_Stair , facilityId = 2 , decoId = 163 })
table.insert( decorate , { facilityType = dataType.DecorateType_HandRail , facilityId = 1 , decoId = 164 })
table.insert( decorate , { facilityType = dataType.DecorateType_HandRail , facilityId = 2 , decoId = 164 })
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_Eave , facilityId = 0 , decoId = 210 })
table.insert( decorate , { facilityType = dataType.DecorateType_OutDeco , facilityId = 0 , decoId = 211 })
table.insert( decorate , { facilityType = dataType.DecorateType_MailBox , facilityId = 0 , decoId = 212 })
elseif houseId >= 12 then --恋家置业新户型:宜居新房配置&实装 id7
--待添加
InitDecoData()
end
--赠送装修到背包 12之前的从配置中读取装修数据
if houseId < 12 then
local cfgHouse = skynet.server.gameConfig:GetPlayerAllCfg( player , "House")
for k1, v1 in pairs(cfgHouse) do
if houseId == v1.id then
for k2, v2 in pairs(v1.unlockDecorate) do
if not player:IsBuyGoods( dataType.GoodsType_Decorate , v2 ) then
skynet.server.bag:AddGoods( player , dataType.GoodsType_Decorate , v2 , 1 )
end
end
break
end
end
end
return decorate
end
--是否解锁户型2和3
function House:IsUnlockHouse( player , houseId )
for k, v in pairs( player.gameData.house ) do
if houseId == v.id and v.status > self.Status_Lock then
return true
end
end
return false
end
--获取当前拥有的房子数量
function House:GetHouseCount( player )
local count = 0
for k, v in pairs( player.gameData.house ) do
if self.Status_Live == v.status or self.Status_AlreadyBuy == v.status then
count = count + 1
end
end
return count
end
--更新数据到redis
function House:UpdateDataToRedis( player , houseId )
local myPartnerId = player.gameData.partner.id
local redisKey = string.format( redisKeyUrl.GameServerHouseDetailHash , myPartnerId )
if skynet.server.redis:exists( redisKey) then
skynet.server.redis:hset( redisKey , "houseData_"..houseId ,
json:encode( player.gameData.house[ houseId ]) ,
"flowerpot" , json:encode( player.gameData.flowerpot) )
skynet.server.redis:expire( redisKey , skynet.server.partner.HouseDetailMaxOutTime ) --设置过期时间为1小时
end
end
--初始化房间家具
function House:InitHouseFurniture( player , houseId )
local schemeId = player.gameData.house[ houseId ].curSchemeId
local curHouseData = skynet.server.gameConfig:GetInitHouseData( houseId )
if not curHouseData then
log.debug(string.format("玩家 %d 未找到房间配置 房间ID %d " , player.userId , houseId ))
return false
end
local goodsType = dataType.GoodsType_Furniture
local furnitureInfo = {}
--获取当前的方案
local curScheme = nil
for k, v in pairs( player.gameData.house[ houseId ].scheme ) do
if schemeId == v.id then
curScheme = v
break
end
end
if not curScheme then
log.debug(string.format("玩家 %d 未找到方案配置 方案ID %d " , player.userId , schemeId ))
return false
end
curScheme.furniture = {}
for k, v in pairs( curHouseData.allPutFurniture ) do
skynet.server.bag:AddGoodsNoExp( player , goodsType , v.furnitureInfoId , 1 )
furnitureInfo =
{
type = goodsType ,
id = v.furnitureInfoId ,
nowPos = v.pos,
rotateType = v.rotateType ,
isPutInFurniture = v.isPutInFurniture ,
clickType = v.clickType ,
parentFurId = v.parentFurId
}
table.insert( curScheme.furniture , self:InitFurniture( furnitureInfo ))
end
return true
end
skynet.server.house = House
return House