local Lang = require("common.Lang") local Util = require("common.Util") local Msg = require("core.Msg") local ObjHuman = require("core.ObjHuman") local ShopExcel = require("excel.shop") local Broadcast = require("broadcast.Broadcast") local ItemDefine = require("bag.ItemDefine") local BagLogic = require("bag.BagLogic") local Grid = require("bag.Grid") local ShopDefine = require("shop.ShopDefine") local ChatPaoMaLogic = require("chat.ChatPaoMaLogic") local GuideLogic = require("guide.GuideLogic") local VipLogic = require("vip.VipLogic") local MoshouLogic = require("moshou.MoshouLogic") local UnionLivenessLogic = require("union.UnionLivenessLogic") local UnionDefine = require("union.UnionDefine") local ChengjiuLogic = require("chengjiu.ChengjiuLogic") local ChengjiuDefine = require("chengjiu.ChengjiuDefine") local EquipLogic = require("equip.EquipLogic") local FuwenGrid = require("fuwen.FuwenGrid") local HeroGrowUp = require("absAct.HeroGrowUp") local YunYingLogic = require("yunying.YunYingLogic") local Config = require("Config") local TriggerDefine = require("trigger.TriggerDefine") local TriggerLogic = require("trigger.TriggerLogic") local function inServerIndex(svrIndexs) for i = 1, #svrIndexs do local index1 = svrIndexs[i][1] local index2 = svrIndexs[i][2] if Config.SVR_INDEX >= index1 and Config.SVR_INDEX <= index2 then return true end end end local function initGoodsDb(human, shopType, index, refreshTs) if not human.db.shop[shopType].goods then return end human.db.shop[shopType].goods[index] = {} human.db.shop[shopType].goods[index].nowBuy = 0 human.db.shop[shopType].goods[index].index = index human.db.shop[shopType].goods[index].refreshTs = refreshTs end -- 花费刷新总次数 function getCostCntMax(human, shopType) if shopType == ShopDefine.SHOP_TYPE_BLACKMARKET then return VipLogic.getPowerArgs(human, VipLogic.VIP_POWER4) or 0 end local config = ShopExcel.shop[shopType] if not config then return 0 end return config.costCnt end -- 剩余花费刷新次数 function getLeftCostCnt(human, shopType) local maxCnt = getCostCntMax(human, shopType) local shopData = human.db.shop[shopType] local useCnt = shopData and shopData.costCnt or 0 return math.max(maxCnt - useCnt, 0) end -- 清除删掉的商品 增加限制的数据 function cleanShopGoods(human, shopType) local shopTypeConfig = ShopExcel.shop[shopType] if not shopTypeConfig then return end local shopConfig = ShopExcel[shopType] if not shopConfig then return end if not human.db.shop then return end if not human.db.shop[shopType] then return end if not human.db.shop[shopType].goods then return end local shopBuy = GuideLogic.getGuideSkip(human, GuideLogic.SKIPTYPE_JUMP_SHOPBUY) if shopType == ShopDefine.SHOP_TYPE_BLACKMARKET and not shopBuy then for k,v in pairs(human.db.shop[shopType].goods) do human.db.shop[shopType].goods[k].index = 0 break end end -- 清除没有的 for k,v in pairs(human.db.shop[shopType].goods) do local tempConfig = shopConfig[v.index] if not tempConfig then human.db.shop[shopType].goods[k] = nil end end -- 加入新增的 if shopTypeConfig.refreshType == ShopDefine.SHOP_REFRESH_TYPE0 then for index, v in pairs(shopConfig) do if not human.db.shop[shopType].goods[index] then if v.limitType ~= ShopDefine.SHOP_LIMIT_TYPE0 then initGoodsDb(human, shopType, index, 0) end end end end end -- 查询商店物品 function query(human, shopType) local shopTypeConfig = ShopExcel.shop[shopType] if not shopTypeConfig then return end if not inServerIndex(shopTypeConfig.serverIndex) then return end local msgRet = Msg.gc.GC_SHOP_QUERY msgRet.shopInfo.shopType = shopType msgRet.shopInfo.mainType = shopTypeConfig.mainType msgRet.shopInfo.refreshType = shopTypeConfig.refreshType msgRet.shopInfo.name = shopTypeConfig.name msgRet.shopInfo.icon = shopTypeConfig.icon msgRet.shopList[0] = 0 for stype, sconfig in pairs(ShopExcel.shop) do if sconfig.mainType == shopTypeConfig.mainType and inServerIndex(sconfig.serverIndex) then msgRet.shopList[0] = msgRet.shopList[0] + 1 local net = msgRet.shopList[msgRet.shopList[0]] net.shopType = stype net.mainType = sconfig.mainType net.refreshType = sconfig.refreshType net.name = sconfig.name net.icon = sconfig.icon end end Grid.makeItem(msgRet.refreshItem,shopTypeConfig.refreshItemID,shopTypeConfig.refreshItemCnt) local shopConfig = ShopExcel[shopType] if not shopConfig then return end local now = os.time() initHumanShopDB(human,shopType) checkFreeCnt(human,shopType) msgRet.nextRefreshTime = 0 msgRet.freeCnt = human.db.shop[shopType].freeCnt msgRet.freeMax = shopTypeConfig.freeCnt msgRet.costCnt = getLeftCostCnt(human, shopType) msgRet.costMax = getCostCntMax(human, shopType) if human.db.shop[shopType].refreshTs > now then msgRet.nextRefreshTime = human.db.shop[shopType].refreshTs - now end cleanShopGoods(human, shopType) -- 不刷新的没有记录的 走配置 local cnt = 0 if shopTypeConfig.refreshType == ShopDefine.SHOP_REFRESH_TYPE0 then for index, v in pairs(shopConfig) do if not human.db.shop[shopType].goods[index] then local tempConfig = v cnt = cnt + 1 Grid.makeItem(msgRet.list[cnt].itemData, tempConfig.itemID, tempConfig.cnt) msgRet.list[cnt].itemIndex = index Grid.makeItem(msgRet.list[cnt].needItem, tempConfig.needItemID, tempConfig.price) msgRet.list[cnt].maxCanBuy = tempConfig.limitBuyCnt msgRet.list[cnt].nowBuy = 0 msgRet.list[cnt].zhekou = tempConfig.zhekou msgRet.list[cnt].order = tempConfig.order msgRet.list[cnt].needVipLv = tempConfig.needVipLv msgRet.list[cnt].rare = tempConfig.rare msgRet.list[cnt].limitType = tempConfig.limitType end end end for _, v in pairs(human.db.shop[shopType].goods) do local tempConfig = shopConfig[v.index] cnt = cnt + 1 Grid.makeItem(msgRet.list[cnt].itemData, tempConfig.itemID, tempConfig.cnt) msgRet.list[cnt].itemIndex = v.index Grid.makeItem(msgRet.list[cnt].needItem, tempConfig.needItemID, tempConfig.price) msgRet.list[cnt].maxCanBuy = tempConfig.limitBuyCnt msgRet.list[cnt].nowBuy = v.nowBuy msgRet.list[cnt].zhekou = tempConfig.zhekou msgRet.list[cnt].order = tempConfig.order msgRet.list[cnt].needVipLv = tempConfig.needVipLv msgRet.list[cnt].rare = tempConfig.rare msgRet.list[cnt].limitType = tempConfig.limitType end msgRet.list[0] = cnt Msg.send(msgRet, human.fd) end -- 刷新物品 function refresh(human, shopType) local shopConfig = ShopExcel.shop[shopType] if not shopConfig then return end if not inServerIndex(shopConfig.serverIndex) then return end cleanShopGoods(human, shopType) -- 是否可刷新 -- 不是主动刷新,主动+日,主动+购完 if shopConfig.refreshType ~= ShopDefine.SHOP_REFRESH_TYPE1 and shopConfig.refreshType ~= ShopDefine.SHOP_REFRESH_TYPE2 and shopConfig.refreshType ~= ShopDefine.SHOP_REFRESH_TYPE7 then return end -- 主动+日 主动+购完重置 主动刷新不判断时间 if shopConfig.refreshType ~= ShopDefine.SHOP_REFRESH_TYPE2 or shopConfig.refreshType ~= ShopDefine.SHOP_REFRESH_TYPE7 then local now = os.time() if human.db.shop[shopType].refreshTs > now -- 刷新时间未到 and human.db.shop[shopType].freeCnt <= 0 -- 免费刷新次数小于0 and human.db.shop[shopType].costCnt >= ShopExcel.shop[shopType].costCnt and ShopExcel.shop[shopType].costCnt ~= -1 then -- 花费刷新次数小于0 return end end local isFree = nil -- 是否免费 -- 不需要刷新物品,则可免费刷新 if shopConfig.refreshItemID == 0 then isFree = true else -- 需要物品,且可免费次数不等于0,且有剩余可免费次数 if shopConfig.freeCnt ~= 0 and human.db.shop[shopType].freeCnt > 0 then isFree = true end end -- 判断道具 local needItemID = shopConfig.refreshItemID local needItemCnt = shopConfig.refreshItemCnt -- 需要道具 if isFree ~= true then -- 判断剩余刷新次数 if getCostCntMax(human, shopType) ~= 0 and getCostCntMax(human, shopType) ~= -1 and getLeftCostCnt(human, shopType) < 1 then return Broadcast.sendErr(human, Lang.SHOP_REFRESH_ERR_CNT) end -- 判断道具 local nowItemCnt = BagLogic.getItemCnt(human, needItemID) if nowItemCnt < needItemCnt then return Broadcast.sendErr(human, Util.format(Lang.SHOP_ERR_NOITEM,ItemDefine.getValue(needItemID,"name"))) end -- 扣除道具 BagLogic.delItem(human, needItemID, needItemCnt, "shop_refresh") human.db.shop[shopType].costCnt = human.db.shop[shopType].costCnt + 1 else if shopConfig.refreshItemID ~= 0 then human.db.shop[shopType].freeCnt = human.db.shop[shopType].freeCnt - 1 end end -- 刷新 initHumanShopDB(human,shopType,true) if isFree then -- 如果没有免费刷新了则刷新时间置0 if human.db.shop[shopType].freeCnt >= shopConfig.freeCnt then human.db.shop[shopType].refreshTs = 0 end end -- 通知客户端 query(human, shopType) end function buyAllItemsRefresh(human,shopType) for itemIndex in pairs(human.db.shop[shopType].goods) do local tempConfig = ShopExcel[shopType][itemIndex] if tempConfig == nil then return end local maxCanBuy = tempConfig.limitBuyCnt if maxCanBuy ~= 0 then local nowBuy = human.db.shop[shopType].goods[itemIndex].nowBuy if nowBuy < maxCanBuy then return end end end initHumanShopDB(human,shopType,true) return true end -- 购买物品 function buy(human, shopType, itemID, itemIndex, buyCnt) if buyCnt < 1 then return end --购买数量不该小于1呀 if buyCnt > 30000 then return end local tempConfig = ShopExcel[shopType][itemIndex] if tempConfig == nil then return end -- 商店强制效验 if tempConfig.itemID ~= itemID then return Broadcast.sendErr(human, Lang.ITEM_BUY_ERROR) end if tempConfig.needVipLv ~= 0 and VipLogic.getVipLv(human) < tempConfig.needVipLv then return Broadcast.sendErr(human, Lang.VIP_LV_TOO_LOW) end -- 装备检测数量 if ItemDefine.isEquip(itemID) then if not EquipLogic.checkEmptyCnt(human, buyCnt * tempConfig.cnt) then return end end -- 符文检测数量 if ItemDefine.isFuwen(itemID) then if not FuwenGrid.checkEmptyCnt(human, buyCnt * tempConfig.cnt) then return end end cleanShopGoods(human, shopType) -- 判断上限 local maxCanBuy = tempConfig.limitBuyCnt local dbIndex = itemIndex local nowBuy = 0 for k,v in pairs(human.db.shop[shopType].goods) do if v.index == itemIndex then nowBuy = v.nowBuy dbIndex = k break end end if maxCanBuy ~= 0 and maxCanBuy - nowBuy < buyCnt then return end if dbIndex == 0 then return end -- 道具判断 local needItemID = tempConfig.needItemID local needItemCnt = tempConfig.price * buyCnt local nowItemCnt = BagLogic.getItemCnt(human, needItemID) if nowItemCnt < needItemCnt then return Broadcast.sendErr(human, Util.format(Lang.SHOP_ERR_NOITEM,ItemDefine.getValue(needItemID,"name"))) end -- 改db if human.db.shop[shopType].goods and human.db.shop[shopType].goods[dbIndex] then human.db.shop[shopType].goods[dbIndex].nowBuy = human.db.shop[shopType].goods[dbIndex].nowBuy + buyCnt local refreshType = ShopExcel.shop[shopType].refreshType if refreshType == ShopDefine.SHOP_REFRESH_TYPE6 or refreshType == ShopDefine.SHOP_REFRESH_TYPE7 then buyAllItemsRefresh(human,shopType) end end -- 先删 BagLogic.delItem(human, needItemID, needItemCnt, "shop_buy", nil, itemID, buyCnt * tempConfig.cnt) -- 后加 BagLogic.addItem(human, itemID, buyCnt * tempConfig.cnt, "shop_buy") -- 加道具 --ChatPaoMaLogic.trigger(human, ChatPaoMaLogic.TRIGGER_TYPE_1, itemID, buyCnt * tempConfig.cnt, needItemID, needItemCnt) --通知客户端 local rewardID = itemID local rewardCnt = tempConfig.cnt * buyCnt local msgRet = Msg.gc.GC_SHOP_BUY msgRet.shopType = shopType if ItemDefine.isEquip(rewardID) then EquipLogic.makeEquipItemOne(human, msgRet.item) else Grid.makeItem(msgRet.item, rewardID, rewardCnt) end Msg.send(msgRet, human.fd) query(human, shopType) GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_SHOPBUY) -- 商店购买物品回调 if shopType == ShopDefine.SHOP_TYPE_UNION then UnionLivenessLogic.touchLiveness(human,UnionDefine.UNION_LIVENESS_SHOP,1) end if shopType == ShopDefine.SHOP_TYPE_BLACKMARKET then ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_4,1) HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE10, 1) YunYingLogic.onCallBack(human, "onShopBuy",1) TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_SHOPBUY, human.db._id, 1) end end -- 初始化玩家商店数据 function initHumanShopDB(human, shopType,refresh) local shopTypeConfig = ShopExcel.shop[shopType] local shopConfig = ShopExcel[shopType] if not shopConfig then return end if not shopTypeConfig then return end if not inServerIndex(shopTypeConfig.serverIndex) then return end -- 下次刷新时间 local initDb = nil if not human.db.shop or not human.db.shop[shopType] or not human.db.shop[shopType].goods then -- 初始化 initDb = true elseif refresh == nil then -- 不是初始化也不是刷新 return end human.db.shop = human.db.shop or {} human.db.shop[shopType] = human.db.shop[shopType] or {} human.db.shop[shopType].freeCnt = human.db.shop[shopType].freeCnt or shopTypeConfig.freeCnt -- 免费刷新次数 human.db.shop[shopType].costCnt = human.db.shop[shopType].costCnt or 0 -- 钻石刷新次数 human.db.shop[shopType].refreshTs = human.db.shop[shopType].refreshTs or 0 human.db.shop[shopType].goods = human.db.shop[shopType].goods or {} -- 固定物品,重置类型 local now = os.time() if shopTypeConfig.refreshGoods == 1 then -- 随机物品,刷新类型 human.db.shop[shopType].goods = {} getRandShopGoods(human,shopType) else for i, v in pairs(shopConfig) do -- 刷新时,活动物品不重置 local refreshTs = v.refreshTs * 60 * 60 local goodsRefreshTs = human.db.shop[shopType].goods[i] and human.db.shop[shopType].goods[i].refreshTs or 0 local endRefreshTs = 0 if initDb == true or refresh ~= nil then -- 初始化 endRefreshTs = now + refreshTs else -- 其他 local resetCnt = 0 if v.limitType == ShopDefine.SHOP_LIMIT_TYPE2 then -- 日限购 local sameDay = Util.isSameDayByTimes(now, goodsRefreshTs) if sameDay ~= true then local dayStart = Util.getDayStartTime(now) endRefreshTs = dayStart + refreshTs end elseif v.limitType == ShopDefine.SHOP_LIMIT_TYPE3 then -- 周限购 local sameWeek = Util.isSameWeek(now, goodsRefreshTs) if sameWeek ~= true then local weekStart = Util.getWeekStartTime(now) endRefreshTs = weekStart + refreshTs end elseif v.limitType == ShopDefine.SHOP_LIMIT_TYPE4 then -- 月限购 local sameMonth = Util.isSameMonth(now, goodsRefreshTs) if sameMonth ~= true then local monthStart = Util.getMonthStartTime(now) endRefreshTs = monthStart + refreshTs end end end if v.limitType ~= ShopDefine.SHOP_LIMIT_TYPE0 and endRefreshTs > 0 then initGoodsDb(human, shopType, i, endRefreshTs) end end end -- 设置免费刷新时间 if refresh ~= nil then if shopTypeConfig.refreshType == ShopDefine.SHOP_REFRESH_TYPE1 and human.db.shop[shopType].refreshTs == 0 then human.db.shop[shopType].refreshTs = os.time() + shopTypeConfig.refreshTs * 60 * 60 end end -- 设置商店重置时间 if shopTypeConfig.refreshType == ShopDefine.SHOP_REFRESH_TYPE3 or shopTypeConfig.refreshType == ShopDefine.SHOP_REFRESH_TYPE2 then -- 每日自动刷新 或 主动刷新+日刷新 local dayStart = Util.getDayStartTime(now) human.db.shop[shopType].refreshTs = dayStart + 24*60*60 -- 下次刷新时间 elseif shopTypeConfig.refreshType == ShopDefine.SHOP_REFRESH_TYPE4 then -- 周刷新 local weekStart = Util.getWeekStartTime(now) human.db.shop[shopType].refreshTs = weekStart + 7*24*60*60 -- 下次刷新时间 elseif shopTypeConfig.refreshType == ShopDefine.SHOP_REFRESH_TYPE5 then -- 月刷新 local monthStart = Util.getMonthStartTime(now) human.db.shop[shopType].refreshTs = monthStart + 30*24*60*60 -- 下次刷新时间 end end -- 刷新商店物品 local specialTb = {1,5,6,7,8} function getRandShopGoods(human,shopType) local net = human.db.shop[shopType].goods local shopTypeConfig = ShopExcel.shop[shopType] if not inServerIndex(shopTypeConfig.serverIndex) then return end if shopTypeConfig.refreshGoods ~= 1 then return end local shopConfig = ShopExcel[shopType] if not shopConfig then return end local now = os.time() local indexTb = {} -- 需要随机物品次数 local count = 0 local totalWeight = 0 local totalWeight1 = 0 local totalWeight2 = 0 for k, v in pairs(shopConfig) do totalWeight = totalWeight + v.weight if v.itemType == 1 then totalWeight1 = totalWeight1 + v.weight end if v.itemType == 2 then totalWeight2 = totalWeight2 + v.weight end end for i = 1,shopTypeConfig.goodsCnt do local randomNum = math.random(1,totalWeight) for j, v in pairs(shopConfig) do if indexTb[j] == nil then if randomNum <= v.weight then count = count + 1 net[count] = {} net[count].nowBuy = 0 net[count].index = j net[count].refreshTs = now + shopTypeConfig.refreshTs * 60 * 60 indexTb[j] = true totalWeight = totalWeight - v.weight break else randomNum = randomNum - v.weight end end end end -- 特殊商店刷新 if shopType == ShopDefine.SHOP_TYPE_XUYUAN then local len = #shopConfig for _,v in pairs(specialTb) do local randomNum = 0 if v == 1 then randomNum = math.random(1, totalWeight1) else randomNum = math.random(1, totalWeight2) end for j, b in pairs(shopConfig) do if v == b.itemType or (v ~= 1 and b.itemType == 2) then if randomNum <= b.weight then net[v] = {} net[v].nowBuy = 0 net[v].index = j net[v].refreshTs = now + shopTypeConfig.refreshTs * 60 * 60 break else randomNum = randomNum - b.weight end end end end end end function updateDaily(human) local shopTypeConfig = ShopExcel.shop local len = #shopTypeConfig local now = os.time() for i ,v in pairs(shopTypeConfig) do if inServerIndex(v.serverIndex) then -- 日刷新 or 主动+日 cleanShopGoods(human, i) if i == ShopDefine.SHOP_TYPE_BLACKMARKET and human.db.shop and human.db.shop[i] then human.db.shop[i].costCnt = 0 end if v.refreshType == ShopDefine.SHOP_REFRESH_TYPE3 or v.refreshType == ShopDefine.SHOP_REFRESH_TYPE2 then initHumanShopDB(human,i,true) -- 周刷新 elseif v.refreshType == ShopDefine.SHOP_REFRESH_TYPE4 then if human.db.shop and human.db.shop[i] then local sameWeek = Util.isSameWeek(now,human.db.shop[i].refreshTs) if sameWeek ~= true then initHumanShopDB(human,i,true) end else initHumanShopDB(human,i,true) end -- 月刷新 elseif v.refreshType == ShopDefine.SHOP_REFRESH_TYPE5 then if human.db.shop and human.db.shop[i] then local sameMonth = Util.isSameMonth(now,human.db.shop[i].refreshTs) if sameMonth ~= true then initHumanShopDB(human,i,true) end else initHumanShopDB(human,i,true) end -- 没配刷新类型,则根据道具类型来刷新 else if human.db.shop and human.db.shop[i] then for k, v in pairs(human.db.shop[i].goods) do local config = ShopExcel[i][v.index] -- 日限购 if config.limitType == ShopDefine.SHOP_LIMIT_TYPE2 then local dayStart = Util.getDayStartTime(now) v.nowBuy = 0 v.refreshTs = dayStart + config.refreshTs * 60 * 60 -- 周限购 elseif config.limitType == ShopDefine.SHOP_LIMIT_TYPE3 then local sameWeek = Util.isSameWeek(now,v.refreshTs) if sameWeek ~= true then local weekStart = Util.getWeekStartTime(now) v.nowBuy = 0 v.refreshTs = weekStart + config.refreshTs * 60 * 60 end -- 月限购 elseif config.limitType == ShopDefine.SHOP_LIMIT_TYPE4 then local sameMonth = Util.isSameMonth(now,v.refreshTs) if sameMonth ~= true then local monthStart = Util.getMonthStartTime(now) v.nowBuy = 0 v.refreshTs = monthStart + config.refreshTs * 60 * 60 end end end end end end end end function checkFreeCnt(human,shopType) local shopConfig = ShopExcel.shop[shopType] if not shopConfig then return end if not inServerIndex(shopConfig.serverIndex) then return end local now = os.time() -- 当前商店免费刷新次数不是满的 local freeCnt = shopConfig.freeCnt - human.db.shop[shopType].freeCnt if freeCnt > 0 then local opTs = human.db.shop[shopType].refreshTs - shopConfig.refreshTs*60*60 local overTime = now - opTs local cnt = math.floor(overTime/(shopConfig.refreshTs*60*60)) if cnt == 0 then return end if cnt >= freeCnt then human.db.shop[shopType].freeCnt = shopConfig.freeCnt human.db.shop[shopType].refreshTs = 0 else human.db.shop[shopType].freeCnt = human.db.shop[shopType].freeCnt + cnt human.db.shop[shopType].refreshTs = human.db.shop[shopType].refreshTs + (shopConfig.refreshTs*60*60*cnt) end end end