HomeServer/lualib-src/Server-main/AllServer/GameServer/Shop/GeneralShop.lua

441 lines
22 KiB
Lua
Raw Permalink Normal View History

2024-11-20 15:41:09 +08:00
local skynet = require "skynet"
local oo = require "Class"
local log = require "Log"
local pb = require "pb"
local dataType = require "DataType"
local errorInfo = require "ErrorInfo"
local shop = require "Shop"
local GeneralShop = oo.class(shop)
GeneralShop.MaxSpecialGoodsCount = 1 --特殊最大商品数量
GeneralShop.MaxGeneralGoodsCount = 6 --普通最大商品数量
GeneralShop.BuyStatus_Suc = 1 --成功
GeneralShop.BuyStatus_NoMoney = 2 --余额不足
GeneralShop.BuyStatus_NoExistShop = 3 --无法购买该家具
GeneralShop.RefreshStatus_Suc = 1 --成功
GeneralShop.RefreshStatus_NoMoney = 2 --余额不足
GeneralShop.RefreshStatus_NoExistShop = 3 --不存在商店类型
GeneralShop.FurnitureBuyType_Coin = 1 --家具金币购买类型
GeneralShop.FurnitureBuyType_AD = 2 --广告购买类型
GeneralShop.FurnitureBuyType_Clovers = 3 --家具四叶草购买类型
GeneralShop.FurnitureBuyType_Flower = 7 --花店购买类型
GeneralShop.DecorateBuyType_Coin = 1 --装修金币购买类型
GeneralShop.DecorateBuyType_Clovers = 2 --装修四叶草购买类型
function GeneralShop:Init()
end
--显示一种类型
function GeneralShop:Show( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SShopShow", c2sData.data ))
local shopType = c2sData.data.shopType
local data = {}
data.shopInfo = {}
--只有花盆的特殊商品需要根据等级填充花盆数据
if dataType.ShopType_Seed == shopType then
local unlockCount = player.gameData.plantCount
local flowerpotList = self:GetUnLockFlowerpot( self.FlowerpotType_Seed , unlockCount )
for k1, v1 in pairs( flowerpotList ) do
local isExistFlowerpot = false --是否存在花盆
for k2, v2 in pairs( player.gameData.shop[ shopType ].specialGoods ) do
if v1 == v2.id then
isExistFlowerpot = true
break
end
end
if not isExistFlowerpot then
--玩家可以购买该花盆
table.insert( player.gameData.shop[ shopType ].specialGoods , { id = v1 , buyCount =0 } )
end
end
end
--时间超过了,刷新新的一批
if skynet.GetTime() >= player.gameData.shop[ shopType ].nextRefreshTime then
self:RefreshShop( player , shopType )
end
local phoneId = 0
if dataType.ShopType_Furniture == shopType then
phoneId = 5
elseif dataType.ShopType_Cinnabar == shopType then
phoneId = 6
elseif dataType.ShopType_Seed == shopType then
phoneId = 11
end
skynet.server.msgTips:Reduce( player , phoneId)
--获取最新的商店数据
data.shopInfo = self:GetShopData(player , shopType)
data.plantCount = player.gameData.plantCount
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ShopShow")
s2cData.data = assert(pb.encode("S2CShopShow", data))
end
--刷新商店类型
function GeneralShop:Refresh( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SShopRefresh", c2sData.data ))
local shopType = c2sData.data.shopType
local data = {}
data.shopInfo = {}
local refreshPrice = self:GetRefreshShopPrice( shopType )
if refreshPrice then
--扣除
if player:MoneyChange( dataType.MoneyType_Volute , -refreshPrice ) then
self:RefreshShop( player , shopType )
data.shopInfo = self:GetShopData( player , shopType )
skynet.server.achieveTask:Modify( player , 34 , 1)
else
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
end
else
s2cData.code = errorInfo.ErrorCode.NoExistShopType
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ShopRefresh")
s2cData.data = assert(pb.encode("S2CShopRefresh", data))
end
--刷新商店类型
function GeneralShop:RefreshShop( player , shopType )
local level = player.gameData.level
local oldSpecialGoods = player.gameData.shop[ shopType ].specialGoods
local oldGeneralGoods = player.gameData.shop[ shopType ].generalGoods
player.gameData.shop[ shopType ].isBuySpecialGoods = false
local randGoodsList = {}
if dataType.ShopType_Furniture == shopType then --家具
randGoodsList = self:GetRandFurniture( oldSpecialGoods , level , 1 , self.FurnitureBuyType_Clovers ) --特别商品
self:SetShopData( player , shopType , dataType.GoodsType_Furniture , randGoodsList , true)
randGoodsList = {}
local noBuyCount = math.random(1,3) --随机1~3个未购买的家具数量
log.info(string.format("玩家 %d 通用商店 随机未购买家具数量 %d" , player.userId , noBuyCount ))
self:GetHistoryGoods( player , shopType , oldGeneralGoods )
local isSuc,tmpGoodsList = self:GetNoBuyFurniture( player , oldGeneralGoods , level , noBuyCount , self.FurnitureBuyType_Coin )
if isSuc then
--成功刷出指定未购买的数量
for k, v in pairs(tmpGoodsList) do
table.insert( randGoodsList , v )
table.insert( oldGeneralGoods , { id = v , buyCount = 0 } )
self:AddHistoryGoods( player , shopType , v )
log.info(string.format("玩家 %d 通用商店 未购买家具ID %d" , player.userId , v ))
end
self:GetHistoryGoods( player , shopType , oldGeneralGoods )
--剩余数量的可以随机刷
tmpGoodsList = self:GetRandFurniture( oldGeneralGoods , level , 6 - noBuyCount , self.FurnitureBuyType_Coin )
for k, v in pairs(tmpGoodsList) do
table.insert( randGoodsList , v )
self:AddHistoryGoods( player , shopType , v )
log.info(string.format("玩家 %d 通用商店 纯随机家具ID %d" , player.userId , v ))
end
else
--纯随机家具
randGoodsList = self:GetRandFurniture( oldGeneralGoods , level , 6 , self.FurnitureBuyType_Coin )
for k, v in pairs(randGoodsList) do
log.info(string.format("玩家 %d 通用商店 纯随机家具ID %d" , player.userId , v ))
end
end
self:RefreshHistoryGoods( player ,shopType )
self:SetShopData( player , shopType , dataType.GoodsType_Furniture , randGoodsList , false)
elseif dataType.ShopType_Cinnabar == shopType then --摆件
randGoodsList = self:GetRandCinnabar( oldSpecialGoods , level , 1 , self.FurnitureBuyType_Clovers ) --特别商品
self:SetShopData( player , shopType , dataType.GoodsType_Furniture , randGoodsList , true)
randGoodsList = {}
local noBuyCount = math.random(1,3) --随机1~3个未购买的摆件数量
log.info(string.format("玩家 %d 通用商店 随机未购买摆件数量 %d" , player.userId , noBuyCount ))
self:GetHistoryGoods( player , shopType , oldGeneralGoods )
local isSuc,tmpGoodsList = self:GetNoBuyCinnabar( player , oldGeneralGoods , level , noBuyCount , self.FurnitureBuyType_Coin )
if isSuc then
--成功刷出指定未购买的数量
for k, v in pairs(tmpGoodsList) do
table.insert( randGoodsList , v )
table.insert( oldGeneralGoods , { id = v , buyCount = 0 } )
self:AddHistoryGoods( player , shopType , v )
log.info(string.format("玩家 %d 通用商店 未购买摆件ID %d" , player.userId , v ))
end
self:GetHistoryGoods( player , shopType , oldGeneralGoods )
--剩余数量的可以随机刷
tmpGoodsList = self:GetRandCinnabar( oldGeneralGoods , level , 6 - noBuyCount , self.FurnitureBuyType_Coin )
for k, v in pairs(tmpGoodsList) do
table.insert( randGoodsList , v )
self:AddHistoryGoods( player , shopType , v )
log.info(string.format("玩家 %d 通用商店 纯随机摆件ID %d" , player.userId , v ))
end
else
randGoodsList = self:GetRandCinnabar( oldGeneralGoods , level , 6 , self.FurnitureBuyType_Coin )
for k, v in pairs(randGoodsList) do
log.info(string.format("玩家 %d 通用商店 纯随机摆件ID %d" , player.userId , v ))
end
end
self:RefreshHistoryGoods( player ,shopType )
self:SetShopData( player , shopType , dataType.GoodsType_Furniture , randGoodsList , false)
elseif dataType.ShopType_Seed == shopType then --种子相关
oldGeneralGoods = {}
if player.gameData.shop[ shopType ].isFirstRefresh then
--第一次刷新2这个种子不参与随机
table.insert( oldGeneralGoods , { id = 2 , buyCount =0 })
end
randGoodsList = self:GetRandSeed( self.FlowerpotType_Seed , oldGeneralGoods , level , 5 ) --5个普通种子
if player.gameData.shop[ shopType ].isFirstRefresh then
--第一次刷新第一个种子给指定的种子
player.gameData.shop[ shopType ].isFirstRefresh = false
randGoodsList[ 1 ] = 2
end
table.insert( randGoodsList , 11) --1个奇异种子
self:SetShopData( player , shopType , dataType.GoodsType_Flowerpot , randGoodsList , false)
end
local nextRefreshTime = 0
if level <= 6 then
nextRefreshTime = 600 + skynet.GetTime()
else
nextRefreshTime = self:GetRefreshTime(shopType) + skynet.GetTime()
end
player.gameData.shop[ shopType ].nextRefreshTime = nextRefreshTime
log.info(string.format("玩家 %d 通用商店 刷新时间 %s" , player.userId , skynet.server.common:GetStrTime(player.gameData.shop[ shopType ].nextRefreshTime)))
end
--商店购买
function GeneralShop:Buy( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SShopBuy", c2sData.data ))
local shopType = c2sData.data.shopType
local specialGoods = c2sData.data.specialGoods
local generalGoods = c2sData.data.generalGoods
local data = {}
if not self:IsVaildShopType( shopType ) then
s2cData.code = errorInfo.ErrorCode.NoExistShopType
else
local curShop = player.gameData.shop[ shopType ]
local isBuySuc = false
--特殊商品购买
if specialGoods then
for k, v in pairs( curShop.specialGoods ) do
--if specialGoods.id == v.id and not player.gameData.shop[ shopType ].isBuySpecialGoods then
if specialGoods.id == v.id then
--存在该商品
local goodsCount = math.abs(specialGoods.count)
local moneyType , moneyCount = 0,0
if dataType.ShopType_Furniture == shopType or dataType.ShopType_Cinnabar == shopType then --家具和摆件
moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Furniture" , v.id )
local costCoin = moneyCount * goodsCount
if moneyType and player:MoneyChange( moneyType , -costCoin ) then
skynet.server.bag:AddGoods( player , dataType.GoodsType_Furniture , v.id , goodsCount )
--任务添加
if dataType.ShopType_Furniture == shopType then
skynet.server.levelTask:Modify( player , dataType.GeneralTaskType_BuyFurniture , goodsCount)
skynet.server.dailyTask:Modify( player , 1 , goodsCount)
skynet.server.achieveTask:Modify( player , 1 , goodsCount)
else
skynet.server.levelTask:Modify( player , dataType.GeneralTaskType_BuyCinnabar , goodsCount)
skynet.server.dailyTask:Modify( player , 2 , goodsCount)
skynet.server.achieveTask:Modify( player , 2 , goodsCount)
end
skynet.server.passCheck:Modify( player , 2 , 1 )
--增加经验
local exp = skynet.server.bag:CalcExp( dataType.GoodsType_Furniture , v.id, goodsCount )
player:AddExp( exp )
player.gameData.shop[ shopType ].specialGoods[k].buyCount = 1
isBuySuc = true
player.gameData.shop[ shopType ].isBuySpecialGoods = true
end
elseif dataType.ShopType_Seed == shopType then --花盆
moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Flowerpot" , v.id ) --self:GetFlowerpotPrice( v.id )
local costCoin = moneyCount * goodsCount
if moneyType and player:MoneyChange( moneyType , -costCoin ) then
player.gameData.shop[ shopType ].consumeCoin = player.gameData.shop[ shopType ].consumeCoin + (moneyCount * goodsCount)
skynet.server.bag:AddGoods( player , dataType.GoodsType_Flowerpot , v.id , goodsCount )
--skynet.server.map:CheckUnlockFlowerShop( player , player.gameData.shop[ shopType ].consumeCoin )
--增加经验
local exp = math.ceil(moneyCount * 0.8)
player:AddExp( exp )
player.gameData.shop[ shopType ].specialGoods[k].buyCount = 1
player.gameData.shop[ shopType ].isBuySpecialGoods = false
isBuySuc = true
end
end
if isBuySuc then
data.shopType = shopType
data.specialGoods = { id = v.id , buyCount = 1 }
log.info(string.format("玩家 %d 通用商店 购买特殊商品成功 商品 %d 扣除四叶草 %d" , player.userId , v.id , moneyCount))
else
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
end
end
end
end
isBuySuc = false
--普通商品购买
if generalGoods then
for k, v in pairs( curShop.generalGoods ) do
if generalGoods.id == v.id then
--存在该商品
local goodsCount = math.abs(generalGoods.count)
local moneyType , moneyCount = 0,0
if dataType.ShopType_Furniture == shopType or dataType.ShopType_Cinnabar == shopType then --家具和摆件
moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Furniture" , v.id )
local costCoin = moneyCount * goodsCount
if moneyType and player:MoneyChange( moneyType , -costCoin ) then
skynet.server.bag:AddGoods( player , dataType.GoodsType_Furniture , v.id , goodsCount )
--任务添加
if dataType.ShopType_Furniture == shopType then
skynet.server.levelTask:Modify( player , dataType.GeneralTaskType_BuyFurniture , goodsCount)
skynet.server.dailyTask:Modify( player , 1 , goodsCount)
skynet.server.achieveTask:Modify( player , 1 , goodsCount)
else
skynet.server.levelTask:Modify( player , dataType.GeneralTaskType_BuyCinnabar , goodsCount)
skynet.server.dailyTask:Modify( player , 2 , goodsCount)
skynet.server.achieveTask:Modify( player , 2 , goodsCount)
end
skynet.server.passCheck:Modify( player , 1 , costCoin )
skynet.server.passCheck:Modify( player , 2 , 1 )
--增加经验
local exp = skynet.server.bag:CalcExp( dataType.GoodsType_Furniture , v.id, goodsCount )
player:AddExp( exp )
player.gameData.shop[ shopType ].generalGoods[k].buyCount = 1
isBuySuc = true
end
elseif dataType.ShopType_Seed == shopType then --种子
moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney("Seed" , v.id ) --self:GetSeedPrice( v.id )
local costCoin = moneyCount * goodsCount
if moneyType and player:MoneyChange( moneyType , -costCoin ) then
player.gameData.shop[ shopType ].consumeCoin = player.gameData.shop[ shopType ].consumeCoin + costCoin
skynet.server.bag:AddGoods( player , dataType.GoodsType_Seed , v.id , goodsCount )
player.gameData.shop[ shopType ].generalGoods[k].buyCount = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Seed , v.id )
isBuySuc = true
--skynet.server.map:CheckUnlockFlowerShop( player , player.gameData.shop[ shopType ].consumeCoin )
skynet.server.levelTask:Modify( player , 45 , 1 )
skynet.server.passCheck:Modify( player , 7 , 1 )
--解锁言叶
skynet.server.friend:InitNpc( player , 3 )
end
end
if isBuySuc then
data.shopType = shopType
data.generalGoods = { id = v.id , buyCount = goodsCount}
log.info(string.format("玩家 %d 通用商店 购买普通商品成功 商品ID %d 扣除金币 %d" , player.userId , v.id , moneyCount))
else
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
end
end
end
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ShopBuy")
s2cData.data = assert(pb.encode("S2CShopBuy", data))
end
--设置商店数据
function GeneralShop:SetShopData( player , shopType , goodsType , randGoodsList , isSpecial )
--是否为特殊商品
if isSpecial then
player.gameData.shop[ shopType ].specialGoods = {}
else
player.gameData.shop[ shopType ].generalGoods = {}
end
--是否购买
for k, v in pairs( randGoodsList ) do
local buyCount = 0
if player:IsBuyGoods( goodsType , v ) then
buyCount = 1
end
if isSpecial then
table.insert( player.gameData.shop[ shopType ].specialGoods , { id = v , buyCount = buyCount } )
log.info(string.format("玩家 %d 通用商店 设置特殊商店数据 商店类型 %d 商品ID %d 是否购买 %d" , player.basicInfo.userID , shopType , v , buyCount ))
else
table.insert( player.gameData.shop[ shopType ].generalGoods , { id = v , buyCount =buyCount } )
log.info(string.format("玩家 %d 通用商店 设置普通商店数据 商店类型 %d 商品ID %d 是否购买 %d" , player.basicInfo.userID , shopType , v , buyCount ))
end
end
end
--获取商店数据
function GeneralShop:GetShopData( player , shopType )
local shopInfo = {}
shopInfo.shopType = shopType
shopInfo.specialGoods = player.gameData.shop[ shopType ].specialGoods
--种子计算下最新的数量
if dataType.ShopType_Seed == shopType then
for k, v in pairs( player.gameData.shop[ shopType ].generalGoods ) do
v.buyCount = skynet.server.bag:GetGoodsCount( player , dataType.GoodsType_Seed , v.id )
end
end
shopInfo.generalGoods = player.gameData.shop[ shopType ].generalGoods
shopInfo.nextRefreshTime = player.gameData.shop[ shopType ].nextRefreshTime
return shopInfo
end
--增加历史商品
function GeneralShop:AddHistoryGoods( player , shopType , goodsId )
local goods = player.gameData.shop[ shopType ].historyGoods
local isExistGoods = false
for k, v in pairs( goods ) do
if goodsId == v.id then
isExistGoods = true
break
end
end
if not isExistGoods then
table.insert( goods , { id = goodsId , count = 1})
end
end
--刷新历史商品
function GeneralShop:RefreshHistoryGoods( player , shopType )
local goods = player.gameData.shop[ shopType ].historyGoods
for k, v in pairs( goods ) do
--每个商品都加1
v.count = v.count + 1
--大于3次就置空
if v.count > 3 then
goods[k] = nil
end
end
end
--获取历史商品
function GeneralShop:GetHistoryGoods( player , shopType , oldGeneralGoods)
if not player.gameData.shop[ shopType ].historyGoods then
player.gameData.shop[ shopType ].historyGoods ={}
end
local goods = player.gameData.shop[ shopType ].historyGoods
for k, v in pairs( goods ) do
table.insert( oldGeneralGoods , { id = v.id , buyCount = 0 } )
end
end
skynet.server.generalShop = GeneralShop
return GeneralShop