655 lines
30 KiB
Lua
655 lines
30 KiB
Lua
|
|
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.BuyShopType_Coin = 1 -- 家具金币购买类型
|
|||
|
|
GeneralShop.BuyShopType_AD = 2 -- 广告购买类型
|
|||
|
|
GeneralShop.BuyShopType_Clovers = 3 -- 家具四叶草购买类型
|
|||
|
|
GeneralShop.BuyShopType_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 curShop = player.gameData.shop[shopType]
|
|||
|
|
local data = {}
|
|||
|
|
data.shopInfo = {}
|
|||
|
|
-- 只有花盆的特殊商品需要根据等级填充花盆数据
|
|||
|
|
if dataType.ShopType_Seed == shopType then
|
|||
|
|
local flowerpotList = self:GetUnLockFlowerpot(player, self.FlowerpotType_Seed)
|
|||
|
|
|
|||
|
|
for k1, v1 in pairs(flowerpotList) do
|
|||
|
|
local isExistFlowerpot = false -- 是否存在花盆
|
|||
|
|
for k2, v2 in pairs(curShop.specialGoods) do
|
|||
|
|
if v1 == v2.id then
|
|||
|
|
isExistFlowerpot = true
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
if not isExistFlowerpot then
|
|||
|
|
-- 玩家可以购买该花盆
|
|||
|
|
table.insert(curShop.specialGoods, {
|
|||
|
|
id = v1,
|
|||
|
|
buyCount = 0
|
|||
|
|
})
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 时间超过了,刷新新的一批
|
|||
|
|
if skynet.GetTime() >= curShop.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:ReduceAll(player, phoneId)
|
|||
|
|
|
|||
|
|
-- 获取最新的商店数据
|
|||
|
|
data.shopInfo = self:GetShopData(player, shopType)
|
|||
|
|
|
|||
|
|
local cfgAllFlowerpot = skynet.server.gameConfig:GetPlayerAllCfg(player, "Flowerpot")
|
|||
|
|
-- local filterFlowerpot = {}
|
|||
|
|
-- for k, v in pairs(cfgAllFlowerpot) do
|
|||
|
|
-- if v.shopType == 1 then
|
|||
|
|
-- table.insert(filterFlowerpot, v)
|
|||
|
|
-- end
|
|||
|
|
-- end
|
|||
|
|
|
|||
|
|
local nextSeedId = 0 -- 下一个解锁花盆需要的种子
|
|||
|
|
local specialGoods = player.gameData.shop[shopType].specialGoods
|
|||
|
|
-- for k, v in pairs(filterFlowerpot) do
|
|||
|
|
-- if not skynet.server.common:IsExistForID(v.id, specialGoods) then
|
|||
|
|
-- nextSeedId = v.seedId
|
|||
|
|
-- break
|
|||
|
|
-- end
|
|||
|
|
-- end
|
|||
|
|
for k, v in pairs(cfgAllFlowerpot) do
|
|||
|
|
if v.unlockPotBefore >= 1 then
|
|||
|
|
if not skynet.server.common:IsExistForID(v.id, specialGoods) then
|
|||
|
|
nextSeedId = v.seedId
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
-- for k, v in pairs(cfgAllFlowerpot) do
|
|||
|
|
-- if v.unlockPotBefore >= 1 then
|
|||
|
|
-- if not skynet.server.common:IsExistForID(v.id, specialGoods) then
|
|||
|
|
-- nextSeedId = v.seedId
|
|||
|
|
-- break
|
|||
|
|
-- end
|
|||
|
|
-- end
|
|||
|
|
-- end
|
|||
|
|
|
|||
|
|
if 0 == nextSeedId then
|
|||
|
|
data.plantCount = 0
|
|||
|
|
else
|
|||
|
|
data.plantCount = skynet.server.flowerpot:GetPlantCountForSeed(player, nextSeedId)
|
|||
|
|
end
|
|||
|
|
-- log.info('花店展示',skynet.server.common:TableToString(data))
|
|||
|
|
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 methodType = c2sData.data.methodType -- 加速类型
|
|||
|
|
|
|||
|
|
local adType = "AppClothesRefresh"
|
|||
|
|
if shopType == 1 then
|
|||
|
|
adType = "AppHomeFurnitureRefresh"
|
|||
|
|
elseif shopType == 2 then
|
|||
|
|
adType = "AppHomeOrnamentsRefresh"
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local data = {}
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue")
|
|||
|
|
data.shopInfo = {}
|
|||
|
|
local isSuc = false
|
|||
|
|
|
|||
|
|
if methodType == dataType.AccelerateType_Volute then
|
|||
|
|
-- 消耗玩家蜗壳币
|
|||
|
|
local refreshPrice = self:GetRefreshShopPrice( player , shopType )
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_1")
|
|||
|
|
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 == cfgSValue.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, adType) and
|
|||
|
|
skynet.server.ad:PayADTicket(player, adType) then
|
|||
|
|
isSuc = true
|
|||
|
|
elseif methodType == dataType.AccelerateType_WatchAD and skynet.server.ad:CanWatch(player, adType) then
|
|||
|
|
skynet.server.ad:Update(player, adType)
|
|||
|
|
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)
|
|||
|
|
|
|||
|
|
--新手暖屋礼包
|
|||
|
|
if player.gameData.level <= cfgSValue.newplayerFurniturePack[1] and player.gameData.level >= cfgSValue.storeUnlockLvl then
|
|||
|
|
if not player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerFurniturePack[4]] then
|
|||
|
|
player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerFurniturePack[4]] = {}
|
|||
|
|
table.insert(player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerFurniturePack[4]],skynet.GetTime())
|
|||
|
|
else
|
|||
|
|
--将超时的记录清除
|
|||
|
|
for i, v in pairs(player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerFurniturePack[4]]) do
|
|||
|
|
if skynet.GetTime() - v > 3600*cfgSValue.newplayerFurniturePack[2] then
|
|||
|
|
table.remove(player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerFurniturePack[4]] , i)
|
|||
|
|
else
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if not player.gameData.storePack.storePackInfo[ cfgSValue.newplayerFurniturePack[4] ] then
|
|||
|
|
table.insert(player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerFurniturePack[4]],skynet.GetTime())
|
|||
|
|
else
|
|||
|
|
if player.gameData.storePack.storePackInfo[ cfgSValue.newplayerFurniturePack[4] ].failureTime < skynet.GetTime() and player.gameData.storePack.storePackInfo[ cfgSValue.newplayerFurniturePack[4] ].buyTimes == 0 then
|
|||
|
|
table.insert(player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerFurniturePack[4]],skynet.GetTime())
|
|||
|
|
else
|
|||
|
|
--直接跳过剩下的判断逻辑节约性能
|
|||
|
|
goto continueFurniturePack
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
--判断是否满足触发Y次的条件
|
|||
|
|
if #player.gameData.storePack.triggerPackTimeField[cfgSValue.newplayerFurniturePack[4]] >= cfgSValue.newplayerFurniturePack[3] then
|
|||
|
|
skynet.server.store:TriggerPack( player , skynet.server.store.TriggerPack_NewPlayerFurniture )
|
|||
|
|
end
|
|||
|
|
--判断出口防止做多余判断浪费性能
|
|||
|
|
::continueFurniturePack::
|
|||
|
|
end
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
player.gameData.shop[shopType].isBuySpecialGoods = false
|
|||
|
|
local randGoodsList = {}
|
|||
|
|
local historyGoods = {}
|
|||
|
|
|
|||
|
|
if dataType.ShopType_Furniture == shopType or dataType.ShopType_Cinnabar == shopType then -- 家具和摆件
|
|||
|
|
-- 特别商品
|
|||
|
|
historyGoods = self:GetHistoryGoods(player, shopType, true)
|
|||
|
|
local isSuc, randGoodsList = self:GetNoHistoryFurniture(player, shopType, historyGoods, level, 1,
|
|||
|
|
self.BuyShopType_Clovers)
|
|||
|
|
if not isSuc then
|
|||
|
|
-- 没有成功,就清历史记录,再刷新
|
|||
|
|
player.gameData.shop[shopType].historySpecialGoods = {}
|
|||
|
|
historyGoods = {}
|
|||
|
|
isSuc, randGoodsList = self:GetNoHistoryFurniture(player, shopType, historyGoods, level, 1,
|
|||
|
|
self.BuyShopType_Clovers)
|
|||
|
|
end
|
|||
|
|
self:SetShopData(player, shopType, dataType.GoodsType_Furniture, randGoodsList, true)
|
|||
|
|
|
|||
|
|
-- 普通商品随机
|
|||
|
|
historyGoods = self:GetHistoryGoods(player, shopType, false)
|
|||
|
|
isSuc, randGoodsList = self:GetNoHistoryFurniture(player, shopType, historyGoods, level, 6,
|
|||
|
|
self.BuyShopType_Coin)
|
|||
|
|
if not isSuc then
|
|||
|
|
-- 没有成功,就清历史记录,再刷新
|
|||
|
|
player.gameData.shop[shopType].historyGeneralGoods = {}
|
|||
|
|
historyGoods = {}
|
|||
|
|
isSuc, randGoodsList = self:GetNoHistoryFurniture(player, shopType, historyGoods, level, 6,
|
|||
|
|
self.BuyShopType_Coin)
|
|||
|
|
end
|
|||
|
|
self:SetShopData(player, shopType, dataType.GoodsType_Furniture, randGoodsList, false)
|
|||
|
|
|
|||
|
|
elseif dataType.ShopType_Seed == shopType then -- 种子相关
|
|||
|
|
local oldGeneralGoods = {}
|
|||
|
|
if player.gameData.shop[shopType].isFirstRefresh then
|
|||
|
|
-- 第一次刷新2这个种子不参与随机
|
|||
|
|
table.insert(oldGeneralGoods, {
|
|||
|
|
id = 2,
|
|||
|
|
buyCount = 0
|
|||
|
|
})
|
|||
|
|
end
|
|||
|
|
randGoodsList = self:GetRandSeed(player, 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)
|
|||
|
|
elseif dataType.ShopType_GardenShop == shopType then -- 青青园艺相关
|
|||
|
|
local cfgGarden = skynet.server.gameConfig:GetPlayerAllCfg(player, "Garden") -- 青青园艺信息
|
|||
|
|
local curShop = player.gameData.shop[shopType]
|
|||
|
|
local landscapes = {}
|
|||
|
|
local recreation = {}
|
|||
|
|
for k, v in pairs(cfgGarden) do
|
|||
|
|
if v.shopType == 2 and v.quality == 1 and v.gardenType == 1 then
|
|||
|
|
table.insert(landscapes, v.id)
|
|||
|
|
elseif v.shopType == 2 and v.quality == 1 and v.gardenType == 2 then
|
|||
|
|
table.insert(recreation, v.id)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
-- 随机货架上的6个普通景观
|
|||
|
|
local count = 6
|
|||
|
|
curShop.generalGoods = {}
|
|||
|
|
for i = 1, count do
|
|||
|
|
local ri = math.random(i, #landscapes)
|
|||
|
|
local tmp = landscapes[ri]
|
|||
|
|
table.remove(landscapes, ri)
|
|||
|
|
table.insert(curShop.generalGoods, {
|
|||
|
|
id = tmp,
|
|||
|
|
buyCount = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Garden, tmp)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
end
|
|||
|
|
-- 随机货架上的1个普通娱乐商品
|
|||
|
|
local countTwo = math.random(1, #recreation)
|
|||
|
|
curShop.specialGoods = {}
|
|||
|
|
curShop.specialGoods[1] = {
|
|||
|
|
id = recreation[countTwo],
|
|||
|
|
buyCount = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Garden, recreation[countTwo])
|
|||
|
|
}
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local nextRefreshTime = 0
|
|||
|
|
if level <= 6 then -- 小于6级时,刷新时间只有十分钟
|
|||
|
|
nextRefreshTime = 600 + skynet.GetTime()
|
|||
|
|
else
|
|||
|
|
local timeCoefficient = skynet.server.store:GetTimeCoefficient(player, 1) -- 月卡权益 时间系数
|
|||
|
|
nextRefreshTime = math.ceil(self:GetRefreshTime(player, shopType) * timeCoefficient) + skynet.GetTime()
|
|||
|
|
end
|
|||
|
|
player.gameData.shop[shopType].nextRefreshTime = nextRefreshTime
|
|||
|
|
log.debug(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(player, "Furniture", v.id)
|
|||
|
|
local costCoin = moneyCount * goodsCount
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_53")
|
|||
|
|
if dataType.ShopType_Cinnabar == shopType then
|
|||
|
|
eventId = pb.enum("EnumMoneyChangeEventID", "EventID_84")
|
|||
|
|
end
|
|||
|
|
if moneyType and player:MoneyChange(moneyType, -costCoin, eventId) then
|
|||
|
|
skynet.server.bag:AddGoods(player, dataType.GoodsType_Furniture, v.id, goodsCount)
|
|||
|
|
|
|||
|
|
-- 任务添加
|
|||
|
|
if dataType.ShopType_Furniture == shopType then
|
|||
|
|
skynet.server.levelTask:Modify(player, 1, goodsCount)
|
|||
|
|
skynet.server.dailyTask:Modify(player, 1, goodsCount)
|
|||
|
|
skynet.server.npcTask:Modify(player, 1, goodsCount)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,1, 1)
|
|||
|
|
else
|
|||
|
|
skynet.server.levelTask:Modify(player, 2, goodsCount)
|
|||
|
|
skynet.server.dailyTask:Modify(player, 2, goodsCount)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,2, 1)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg(player, "Furniture", v.id)
|
|||
|
|
if 16 == cfgFurniture.subType then -- 电器
|
|||
|
|
skynet.server.levelTask:Modify(player, 88, goodsCount)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,88, goodsCount)
|
|||
|
|
elseif 17 == cfgFurniture.subType then -- 宠物
|
|||
|
|
skynet.server.levelTask:Modify(player, 87, goodsCount)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,87, goodsCount)
|
|||
|
|
end
|
|||
|
|
skynet.server.achieveTask:Modify(player, 58, 1)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,58, 1)
|
|||
|
|
player.gameData.shop[shopType].specialGoods[k].buyCount = 1
|
|||
|
|
|
|||
|
|
-- 任务添加
|
|||
|
|
if moneyType ==pb.enum("EnumGoodsType","Coin") then
|
|||
|
|
--在逸家家居使用金币
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,122, math.abs(costCoin))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
isBuySuc = true
|
|||
|
|
curShop.isBuySpecialGoods = true
|
|||
|
|
end
|
|||
|
|
elseif dataType.ShopType_Seed == shopType then -- 花盆
|
|||
|
|
goodsCount = 1
|
|||
|
|
moneyType, moneyCount = skynet.server.gameConfig:GetBuyMoney(player, "Flowerpot", v.id) -- self:GetFlowerpotPrice( v.id )
|
|||
|
|
local costCoin = moneyCount * goodsCount
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_86")
|
|||
|
|
if moneyType and player:MoneyChange(moneyType, -costCoin, eventId) then
|
|||
|
|
curShop.consumeCoin = curShop.consumeCoin + (moneyCount * goodsCount)
|
|||
|
|
skynet.server.bag:AddGoods(player, dataType.GoodsType_Flowerpot, v.id, goodsCount)
|
|||
|
|
curShop.specialGoods[k].buyCount = 1
|
|||
|
|
curShop.isBuySpecialGoods = false
|
|||
|
|
isBuySuc = true
|
|||
|
|
|
|||
|
|
if player:IsOldIOS() then
|
|||
|
|
local oldData = player.gameData.oldData
|
|||
|
|
if oldData and oldData.flowerpots then
|
|||
|
|
local nextFlowerpotId = v.id + 1 --下一个花盆ID
|
|||
|
|
--花盆老数据进入升序
|
|||
|
|
table.sort( oldData.flowerpots ,function (a,b)
|
|||
|
|
return a.id < b.id
|
|||
|
|
end)
|
|||
|
|
|
|||
|
|
for k1, v1 in pairs( oldData.flowerpots ) do
|
|||
|
|
if nextFlowerpotId == v1.id then
|
|||
|
|
--如果下一个花盆曾经拥有就直接赠送
|
|||
|
|
skynet.server.bag:AddGoodsNoExp( player , dataType.GoodsType_Flowerpot , nextFlowerpotId , 1 , true )
|
|||
|
|
table.insert( curShop.specialGoods , { id = nextFlowerpotId , buyCount = 1} )
|
|||
|
|
|
|||
|
|
--赠送的花盆该种子直接给默认种植次数
|
|||
|
|
local cfgFlowerpot = skynet.server.gameConfig:GetPlayerCurCfg( player , "Flowerpot" , nextFlowerpotId )
|
|||
|
|
local ripePlantSeedsCount = player.gameData.ripePlantSeedsCount
|
|||
|
|
local isExistRipePlant = false
|
|||
|
|
for k2, v2 in pairs( ripePlantSeedsCount ) do
|
|||
|
|
if cfgFlowerpot.seedId == v2.id then
|
|||
|
|
v2.count = v2.count + cfgFlowerpot.plantValue
|
|||
|
|
isExistRipePlant = true
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if not isExistRipePlant then
|
|||
|
|
table.insert( ripePlantSeedsCount , { id = cfgFlowerpot.seedId , count = cfgFlowerpot.plantValue } )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--再看看下一个花盆是否曾经拥有
|
|||
|
|
nextFlowerpotId = nextFlowerpotId + 1
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if isBuySuc then
|
|||
|
|
data.shopType = shopType
|
|||
|
|
data.specialGoods = {
|
|||
|
|
id = v.id,
|
|||
|
|
buyCount = 1
|
|||
|
|
}
|
|||
|
|
log.debug(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(player, "Furniture", v.id)
|
|||
|
|
local costCoin = moneyCount * goodsCount
|
|||
|
|
local eventId = 0
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_53")
|
|||
|
|
if dataType.ShopType_Cinnabar == shopType then
|
|||
|
|
eventId = pb.enum("EnumMoneyChangeEventID", "EventID_84")
|
|||
|
|
end
|
|||
|
|
if moneyType and player:MoneyChange(moneyType, -costCoin, eventId) then
|
|||
|
|
skynet.server.bag:AddGoods(player, dataType.GoodsType_Furniture, v.id, goodsCount)
|
|||
|
|
|
|||
|
|
local cfgFurniture = skynet.server.gameConfig:GetPlayerCurCfg(player, "Furniture", v.id)
|
|||
|
|
if 16 == cfgFurniture.subType then -- 电器
|
|||
|
|
skynet.server.levelTask:Modify(player, 88, goodsCount)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,88, goodsCount)
|
|||
|
|
elseif 17 == cfgFurniture.subType then -- 宠物
|
|||
|
|
skynet.server.levelTask:Modify(player, 87, goodsCount)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,87, goodsCount)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 任务添加
|
|||
|
|
if dataType.ShopType_Furniture == shopType then -- 家具
|
|||
|
|
skynet.server.levelTask:Modify(player, 1, goodsCount)
|
|||
|
|
skynet.server.dailyTask:Modify(player, 1, goodsCount)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,1, 1)
|
|||
|
|
elseif dataType.ShopType_Cinnabar == shopType then -- 摆件
|
|||
|
|
skynet.server.levelTask:Modify(player, 2, goodsCount)
|
|||
|
|
skynet.server.dailyTask:Modify(player, 2, goodsCount)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,2, 1)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
skynet.server.achieveTask:Modify(player, 58, 1)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,58, 1)
|
|||
|
|
curShop.generalGoods[k].buyCount = 1
|
|||
|
|
|
|||
|
|
-- 任务添加
|
|||
|
|
if moneyType ==pb.enum("EnumGoodsType","Coin") then
|
|||
|
|
--在逸家家居使用金币
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,122, math.abs(costCoin))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
isBuySuc = true
|
|||
|
|
end
|
|||
|
|
elseif dataType.ShopType_Seed == shopType then -- 种子
|
|||
|
|
moneyType, moneyCount = skynet.server.gameConfig:GetBuyMoney(player, "Seed", v.id) -- self:GetSeedPrice( v.id )
|
|||
|
|
local costCoin = moneyCount * goodsCount
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_85")
|
|||
|
|
if moneyType and player:MoneyChange(moneyType, -costCoin, eventId) then
|
|||
|
|
curShop.consumeCoin =curShop.consumeCoin + costCoin
|
|||
|
|
skynet.server.bag:AddGoods(player, dataType.GoodsType_Seed, v.id, goodsCount)
|
|||
|
|
curShop.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.taskListEvent:Modify( player ,45, 1)
|
|||
|
|
skynet.server.taskListEvent:Modify( player ,7, 1)
|
|||
|
|
-- 解锁言叶
|
|||
|
|
skynet.server.friend:InitNpc(player, 3)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--通行证任务
|
|||
|
|
--在植物小铺购买种子累积超过%份
|
|||
|
|
skynet.server.taskListEvent:Modify( player , 120 , goodsCount )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if isBuySuc then
|
|||
|
|
data.shopType = shopType
|
|||
|
|
data.generalGoods = {
|
|||
|
|
id = v.id,
|
|||
|
|
buyCount = goodsCount
|
|||
|
|
}
|
|||
|
|
log.debug(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 dataType.ShopType_Furniture == shopType or dataType.ShopType_Cinnabar == shopType then -- 家具和摆件
|
|||
|
|
self:AddHistoryGoods(player, shopType, v, isSpecial)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if isSpecial then
|
|||
|
|
table.insert(player.gameData.shop[shopType].specialGoods, {
|
|||
|
|
id = v,
|
|||
|
|
buyCount = buyCount
|
|||
|
|
})
|
|||
|
|
log.debug(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.debug(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
|
|||
|
|
|
|||
|
|
-- 青青园艺计算下最新的数量
|
|||
|
|
if dataType.ShopType_GardenShop == shopType then
|
|||
|
|
for k, v in pairs(player.gameData.shop[shopType].generalGoods) do
|
|||
|
|
v.buyCount = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Garden, v.id)
|
|||
|
|
end
|
|||
|
|
player.gameData.shop[shopType].specialGoods[1].buyCount =
|
|||
|
|
skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Garden,
|
|||
|
|
player.gameData.shop[shopType].specialGoods[1].id)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- shopInfo.generalGoods = player.gameData.shop[ shopType ].generalGoods
|
|||
|
|
shopInfo.generalGoods = player.gameData.shop[shopType].generalGoods
|
|||
|
|
shopInfo.nextRefreshTime = player.gameData.shop[shopType].nextRefreshTime
|
|||
|
|
return shopInfo
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 增加历史商品
|
|||
|
|
function GeneralShop:AddHistoryGoods(player, shopType, goodsId, isSpecial)
|
|||
|
|
local historyGoods = nil
|
|||
|
|
if isSpecial then
|
|||
|
|
historyGoods = player.gameData.shop[shopType].historySpecialGoods
|
|||
|
|
else
|
|||
|
|
historyGoods = player.gameData.shop[shopType].historyGeneralGoods
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local isExistGoods = false
|
|||
|
|
for k, v in pairs(historyGoods) do
|
|||
|
|
if goodsId == v.id then
|
|||
|
|
isExistGoods = true
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if not isExistGoods then
|
|||
|
|
table.insert(historyGoods, {
|
|||
|
|
id = goodsId
|
|||
|
|
})
|
|||
|
|
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, isSpecial)
|
|||
|
|
if isSpecial then
|
|||
|
|
return player.gameData.shop[shopType].historySpecialGoods
|
|||
|
|
else
|
|||
|
|
return player.gameData.shop[shopType].historyGeneralGoods
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
skynet.server.generalShop = GeneralShop
|
|||
|
|
return GeneralShop
|