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

346 lines
16 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 dataType = require "DataType"
local errorInfo = require "ErrorInfo"
local shop = require "Shop"
local json = require "json"
local ClothesShop = oo.class(shop)
function ClothesShop:Init()
end
--显示一种类型
function ClothesShop:Show( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SClothesShopShow", c2sData.data ))
local shopType = dataType.ShopType_Clothes
local data = {}
data.shopInfo = {}
--时间超过了,刷新新的一批
if skynet.GetTime() >= player.gameData.shop[ shopType ].nextRefreshTime then
self:RefreshShop( player , shopType )
end
skynet.server.msgTips:Reduce( player , 9)
--获取最新的商店数据
data.shopInfo = self:GetShopData(player , shopType )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ClothesShopShow")
s2cData.data = assert(pb.encode("S2CClothesShopShow", data))
end
--刷新
function ClothesShop:Refresh( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SClothesShopRefresh", c2sData.data ))
local shopType = dataType.ShopType_Clothes
local methodType = c2sData.data.methodType -- 加速类型
local data = {}
data.shopInfo = {}
local isSuc = false
if methodType == dataType.AccelerateType_Volute then
-- 消耗玩家蜗壳币
local refreshPrice = self:GetRefreshShopPrice( player , shopType )
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_4")
if refreshPrice then
if player:MoneyChange( dataType.MoneyType_Volute , -refreshPrice , eventId ) then
--使用蜗壳币进行刷新 修改相关数据
player.gameData.todayGain.updateUseCount = player.gameData.todayGain.updateUseCount + 1
if player.gameData.todayGain.updateUseCount == skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue").triggerUpdatePack[ 1 ] then
skynet.server.store:TriggerPack(player , skynet.server.store.TriggerPack_Update)
end
isSuc = true
else
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
end
else
s2cData.code = errorInfo.ErrorCode.NoExistShopType
end
elseif methodType == dataType.AccelerateType_AccTicket and skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 4) > 0 then
--消耗玩家一个刷新券
skynet.server.bag:RemoveGoods(player , dataType.GoodsType_Prop, 4 , 1)
isSuc = true
elseif methodType == dataType.AccelerateType_ADTicket and skynet.server.ad:CanWatch(player, "AppClothesRefresh") and
skynet.server.ad:PayADTicket(player, "AppClothesRefresh") then
isSuc = true
elseif methodType == dataType.AccelerateType_WatchAD and skynet.server.ad:CanWatch(player, "AppClothesRefresh") then
skynet.server.ad:Update(player, "AppClothesRefresh")
isSuc = true
end
if isSuc then
self:RefreshShop( player , shopType )
data.shopInfo = self:GetShopData( player , shopType )
skynet.server.achieveTask:Modify( player , 34 , 1)
skynet.server.taskListEvent:Modify( player , 34 , 1)
--主动刷新优衣服饰触发礼包
--新手实惠礼包
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
if not skynet.server.illustration:CheckClothesAchieve( player , cfgSValue.newplayerClothesPack[1] ) then
--将当前时间存入该礼包的触发时间集合中用于下一步的判断
if not player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerClothesPack[4]] then
player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerClothesPack[4]] = {}
table.insert(player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerClothesPack[4]],skynet.GetTime())
else
--将超时的记录清除
for i, v in pairs(player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerClothesPack[4]]) do
if skynet.GetTime() - v > 3600*cfgSValue.newplayerClothesPack[2] then
table.remove(player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerClothesPack[4]] , i)
else
break
end
end
if not player.gameData.storePack.storePackInfo[ cfgSValue.newplayerClothesPack[4] ] then
table.insert(player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerClothesPack[4]],skynet.GetTime())
else
if player.gameData.storePack.storePackInfo[ cfgSValue.newplayerClothesPack[4] ].failureTime < skynet.GetTime() and player.gameData.storePack.storePackInfo[ cfgSValue.newplayerClothesPack[4] ].buyTimes == 0 then
table.insert(player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerClothesPack[4]],skynet.GetTime())
else
--直接跳过剩下的判断逻辑节约性能
goto continueClothesPack
end
end
end
--判断是否满足在X小时内触发Y次的条件
if #player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerClothesPack[4]] >= cfgSValue.newplayerClothesPack[3] then
skynet.server.store:TriggerPack( player , skynet.server.store.TriggerPack_NewPlayerClothesPack )
end
--判断出口防止做多余判断浪费性能
::continueClothesPack::
end
end
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ClothesShopRefresh")
s2cData.data = assert(pb.encode("S2CClothesShopRefresh", data))
end
--商店购买
function ClothesShop:Buy( player , c2sData , s2cData )
c2sData.data = assert(pb.decode("C2SClothesShopBuy", c2sData.data ))
local goodsId = c2sData.data.goodsId
local data = {}
local shopType = dataType.ShopType_Clothes
local curShop = player.gameData.shop[ shopType ]
--特殊商品购买
if not goodsId then
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
else
--检查是商店中是否存在该商品
local isExistGoods = false
if goodsId == curShop.headWear.id then --头饰
isExistGoods = true
elseif goodsId == curShop.clothes.id then --衣服
isExistGoods = true
elseif goodsId == curShop.trousers.id then --裤子
isExistGoods = true
elseif goodsId == curShop.shoes.id then --鞋子
isExistGoods = true
end
--检查该商品是否存在背包
local isBagGoods = player:IsBuyGoods( dataType.GoodsType_Clothes , goodsId )
if not isExistGoods then
s2cData.code = errorInfo.ErrorCode.NoGoodsID
elseif isBagGoods then
s2cData.code = errorInfo.ErrorCode.ExistGoodsInBag
else
--未购买过商品,先扣钱,再发货
local moneyType , moneyCount = skynet.server.gameConfig:GetBuyMoney( player , "Clothes" , goodsId ) --self:GetClothesPrice( goodsId )
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_35")
if moneyType and player:MoneyChange( moneyType , -moneyCount , eventId) then
if goodsId == curShop.headWear.id then --头饰
player.gameData.shop[ shopType ].headWear.buyCount = 1
elseif goodsId == curShop.clothes.id then --衣服
player.gameData.shop[ shopType ].clothes.buyCount = 1
elseif goodsId == curShop.trousers.id then --裤子
player.gameData.shop[ shopType ].trousers.buyCount = 1
elseif goodsId == curShop.shoes.id then --鞋子
player.gameData.shop[ shopType ].shoes.buyCount = 1
end
table.insert( player.gameData.shop[ shopType ].buyGoods , goodsId )
skynet.server.bag:AddGoods( player , dataType.GoodsType_Clothes , goodsId , 1 )
skynet.server.taskListEvent:Modify( player , 5 , moneyCount )
skynet.server.taskListEvent:Modify( player , 6 , 1 )
log.debug(string.format("玩家 %d 服装商店 购买成功 商品 %d 扣除四叶草 %d" , player.basicInfo.userID , goodsId , moneyCount))
else
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
log.warning(string.format("玩家 %d 服装商店 购买失败 商品 %d " , player.basicInfo.userID , goodsId))
end
end
end
data.shopInfo = self:GetShopData(player , shopType )
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ClothesShopBuy")
s2cData.data = assert(pb.encode("S2CClothesShopBuy", data))
end
--刷新商店类型
function ClothesShop:RefreshShop( player , shopType )
local goodsIds= {}
local clothesType = nil
local curShop = player.gameData.shop[ shopType ]
-- --头饰
-- clothesType = dataType.ClothesType_HeadWear
-- goodsId = self:GetRandClothes( player , 1 , clothesType )
-- self:SetShopData( player , shopType , clothesType , goodsId[1] )
-- --衣服
-- clothesType = dataType.ClothesType_Clothes
-- goodsId = self:GetRandClothes( player , 1 , clothesType )
-- self:SetShopData( player , shopType , clothesType , goodsId[1] )
-- --裤子
-- clothesType = dataType.ClothesType_Trousers
-- goodsId = self:GetRandClothes( player , 1 , clothesType )
-- self:SetShopData( player , shopType , clothesType , goodsId[1] )
-- --鞋子
-- clothesType = dataType.ClothesType_Shoes
-- goodsId = self:GetRandClothes( player , 1 , clothesType )
-- self:SetShopData( player , shopType , clothesType , goodsId[1] )
--刷新物品
clothesType = dataType.ClothesType_Suit
goodsIds = self:GetRandClothesNew( player , clothesType )
for goodsId, clothesShopType in pairs(goodsIds) do
--类型特殊处理
-- "服装栏位
-- 1=上衣+连衣裙+套装
-- 2=鞋
-- 3=头饰+耳饰+面饰
-- 4=半身裙+裤子"
--转换成
-- "类型
-- 4=头饰
-- 5=上衣+连衣裙
-- 6=下裤+短裙
-- 8=鞋
-- "
local clothesShopTypeTemp = clothesShopType
if clothesShopTypeTemp==1 then
clothesShopTypeTemp=5
elseif clothesShopTypeTemp==2 then
clothesShopTypeTemp=8
elseif clothesShopTypeTemp==3 then
clothesShopTypeTemp=4
elseif clothesShopTypeTemp==4 then
clothesShopTypeTemp=6
end
self:SetShopData( player , shopType , clothesShopTypeTemp , goodsId )
end
--本次刷新已经购买的商品
curShop.buyGoods = {}
--刷新告罄标记
self:SetSoldType(player,shopType)
--刷新时间
local timeCoefficient = skynet.server.store:GetTimeCoefficient(player , 2) --月卡权益 时间系数
curShop.nextRefreshTime = math.ceil(self:GetRefreshTime(player,shopType) * timeCoefficient) + skynet.GetTime()
end
--设置商店数据
function ClothesShop:SetShopData( player , shopType , clothesType , goodsId )
if nil == goodsId then
return
end
local buCount = 0 --是否购买
if player:IsBuyGoods( dataType.GoodsType_Clothes , goodsId ) then
buCount = 1
end
if dataType.ClothesType_HeadWear == clothesType then
player.gameData.shop[ shopType ].headWear.id = goodsId
player.gameData.shop[ shopType ].headWear.buyCount = buCount
log.debug(string.format("玩家 %d 服饰商店 设置商店数据 最新头饰 ID %d 是否购买 %d" , player.basicInfo.userID , goodsId , buCount ))
elseif dataType.ClothesType_Clothes == clothesType then
player.gameData.shop[ shopType ].clothes.id = goodsId
player.gameData.shop[ shopType ].clothes.buyCount = buCount
log.debug(string.format("玩家 %d 服饰商店 设置商店数据 最新衣服 ID %d 是否购买 %d" , player.basicInfo.userID , goodsId , buCount ))
elseif dataType.ClothesType_Trousers == clothesType then
player.gameData.shop[ shopType ].trousers.id = goodsId
player.gameData.shop[ shopType ].trousers.buyCount = buCount
log.debug(string.format("玩家 %d 服饰商店 设置商店数据 最新裤子 ID %d 是否购买 %d" , player.basicInfo.userID , goodsId , buCount ))
elseif dataType.ClothesType_Shoes == clothesType then
player.gameData.shop[ shopType ].shoes.id = goodsId
player.gameData.shop[ shopType ].shoes.buyCount = buCount
log.debug(string.format("玩家 %d 服饰商店 设置商店数据 最新鞋子 ID %d 是否购买 %d" , player.basicInfo.userID , goodsId , buCount ))
end
table.insert( player.gameData.shop[ shopType ].historyGoods[ clothesType ] , { id = goodsId })
end
--获取商店数据
function ClothesShop:GetShopData( player , shopType )
local shopInfo = {}
shopInfo.headWear = player.gameData.shop[ shopType ].headWear
shopInfo.clothes = player.gameData.shop[ shopType ].clothes
shopInfo.trousers = player.gameData.shop[ shopType ].trousers
shopInfo.shoes = player.gameData.shop[ shopType ].shoes
shopInfo.buyGoods = player.gameData.shop[ shopType ].buyGoods
shopInfo.nextRefreshTime = player.gameData.shop[ shopType ].nextRefreshTime
shopInfo.isSellOut = player.gameData.shop[ shopType ].isSellOut
-- 老帐号在游戏更新后如果还未到服装商店刷新时间这个字段会为null此处做个临时处理下个版本后可以删掉此处判断逻辑
if shopInfo.isSellOut == nil then
self:SetSoldType(player,shopType)
shopInfo.isSellOut = player.gameData.shop[ shopType ].isSellOut
end
return shopInfo
end
--检测玩家背包 设置告罄标记
function ClothesShop:SetSoldType(player , shopType)
local cfgAllClothes = skynet.server.gameConfig:GetPlayerAllCfg( player , "Clothes")
--先将标记全部设置为告罄,遍历服装表如果有未入背包物品则将标记设为未告罄
player.gameData.shop[ shopType ].isSellOut ={true,true,true,true}
local playerSoldTag = player.gameData.shop[ shopType ].isSellOut
local playerLevel = player.gameData.level
for k,v in pairs(cfgAllClothes) do
--目前只服务于线上服装店 ,后期其他地方要用的话可以设置成参数
if v.shopType == 1 and playerLevel >= v.level then
-- "服装栏位
-- 1=上衣+连衣裙+套装
-- 2=鞋
-- 3=头饰+耳饰+面饰
-- 4=半身裙+裤子"
if v.clothesShopType == 3 and playerSoldTag[1] then
if not player:IsBuyGoods( dataType.GoodsType_Clothes , v.id ) then
playerSoldTag[1]=false
end
elseif v.clothesShopType == 1 and playerSoldTag[2] then
if not player:IsBuyGoods( dataType.GoodsType_Clothes , v.id ) then
playerSoldTag[2]=false
end
elseif v.clothesShopType == 4 and playerSoldTag[3] then
if not player:IsBuyGoods( dataType.GoodsType_Clothes , v.id ) then
playerSoldTag[3]=false
end
elseif v.clothesShopType == 2 and playerSoldTag[4] then
if not player:IsBuyGoods( dataType.GoodsType_Clothes , v.id ) then
playerSoldTag[4]=false
end
end
--当4个标记全为未告罄时提前跳出循环
if not playerSoldTag[1] and not playerSoldTag[2] and not playerSoldTag[3] and not playerSoldTag[4] then
break
end
end
end
end
skynet.server.clothesShop = ClothesShop
return ClothesShop