HappyShopProxy = class('HappyShopProxy', pm.Proxy) HappyShopProxy.Instance = nil; HappyShopProxy.NAME = "HappyShopProxy" HappyShopProxy.Config = { PicId = 50, ChipId = 110, } HappyShopProxy.LimitType = { OneDay = SessionShop_pb.ESHOPLIMITTYPE_USER, --單人每日限購 OneTime = SessionShop_pb.ESHOPLIMITTYPE_ONE_ONLY, --只支援1次購買1個商品 AccUser = SessionShop_pb.ESHOPLIMITTYPE_ACC_USER, --賬號共享次數 每天 AccUserAlways = SessionShop_pb.ESHOPLIMITTYPE_ACC_USER_ALWAYS, --限制賬號永久的購買次數 UserWeek = SessionShop_pb.ESHOPLIMITTYPE_USER_WEEK, AccWeek = SessionShop_pb.ESHOPLIMITTYPE_ACC_WEEK, AccMonth = SessionShop_pb.ESHOPLIMITTYPE_ACC_MONTH, } HappyShopProxy.SourceType = { User = SessionShop_pb.ESHOPSOURCE_USER, Guild = SessionShop_pb.ESHOPSOURCE_GUILD, } local temp = {} local totalCostList = {} local packageCheck = GameConfig.PackageMaterialCheck and GameConfig.PackageMaterialCheck.shop local _SourceShop = ProtoCommon_pb.ESOURCE_SHOP function HappyShopProxy:ctor(proxyName, data) self.proxyName = proxyName or HappyShopProxy.NAME if(HappyShopProxy.Instance == nil) then HappyShopProxy.Instance = self end if data ~= nil then self:setData(data) end self:Init() end function HappyShopProxy:Init() self.shopItems = {} self.myProfessionItems = {} self.limitCountMap = {} end function HappyShopProxy:InitShop(npcdata , params , shopType) self.npc = npcdata self.params = params self.shopType = shopType self:InitMoneyType() self:InitAnimationConfig() self:InitShopData(shopType) self:CallQueryShopConfig() end function HappyShopProxy:RecvQueryShopConfig(data) if self.shopType == data.type then self:InitShopData(data.type) end end function HappyShopProxy:RecvUpdateShopConfigCmd(data) if self.shopType == data.type then self:InitShopData(data.type) end end function HappyShopProxy:InitMoneyType() self.moneyTypes = {130, 131} self.defaultDesc= ZhString.HappyShop_defaultDesc local types,desc if self.shopType then local nfcfg = Table_NpcFunction[self.shopType] types = nfcfg and nfcfg.Parama.ItemID desc= nfcfg and nfcfg.Parama.Desc end self.moneyTypes = types or self.moneyTypes self.desc = desc or self.defaultDesc end function HappyShopProxy:InitAnimationConfig() self.aniConfig={} if self.shopType then local nfcfg = Table_NpcFunction[self.shopType] if(nfcfg and nfcfg.Parama)then self.aniConfig[1]=nfcfg.Parama.ShowSkip self.aniConfig[2]=nfcfg.Parama.AnimationName self.aniConfig[3]=nfcfg.Parama.SkipType self.aniConfig[4]=nfcfg.Parama.Effect self.aniConfig[5]=nfcfg.Parama.Audio end end end function HappyShopProxy:InitShopData(shopType) --商品列表 TableUtility.ArrayClear(self.shopItems) local shopData = ShopProxy.Instance:GetShopDataByTypeId(shopType, self.params) if shopData then local config = shopData:GetGoods() for k,v in pairs(config) do TableUtility.ArrayPushBack(self.shopItems, k) end table.sort(self.shopItems, HappyShopProxy._SortItem) --本職業商品 if shopData:CheckScreen() then self:SetMyProfessionItems(self.shopItems) end end end function HappyShopProxy._SortItem(l,r) local _HappyShopProxy = HappyShopProxy.Instance local ldata = _HappyShopProxy:GetShopItemDataByTypeId(l) local rdata = _HappyShopProxy:GetShopItemDataByTypeId(r) if ldata.CanOpen ~= rdata.CanOpen then return not ldata:GetLock() else if ldata.ShopOrder == rdata.ShopOrder then return ldata.id < rdata.id else return ldata.ShopOrder < rdata.ShopOrder end end end --上線時,更新所有商品已購買的數量 function HappyShopProxy:UpdateQueryShopGotItem(data) --每日限購 self.cachedHaveBoughtItemCount = nil local items = data.items if items then for i=1,#items do self:CachedHaveBoughtItemCount(items[i].id, items[i].count) end end --打折限購 if self.discountItemMap == nil then self.discountItemMap = {} else TableUtility.TableClear(self.discountItemMap) end for i=1,#data.discountitems do local item = data.discountitems[i] self.discountItemMap[item.id] = item.count end --永久限制 if self.limitItemMap == nil then self.limitItemMap = {} else TableUtility.TableClear(self.limitItemMap) end for i=1,#data.limititems do local item = data.limititems[i] self.limitItemMap[item.id] = item.count end end --購買商品時,重新整理已購買的商品數量 function HappyShopProxy:UpdateShopGotItem(data) --每日限購 local item = data.item if item then self:CachedHaveBoughtItemCount(item.id, item.count) end --打折限購 local discountitem = data.discountitem if discountitem then self.discountItemMap[discountitem.id] = discountitem.count end --永久限制 local limititem = data.limititem if limititem then self.limitItemMap[limititem.id] = limititem.count end end function HappyShopProxy:JudgeCanBuy(data) local canBuy=false local temp if data.goodsID then temp = Table_Equip[data.goodsID] else errorLog("HappyShopProxy JudgeCanBuy : data.goodsID = nil") end if(temp)then if(#temp.CanEquip==1 and temp.CanEquip[1]==0)then canBuy=true return canBuy end for i=1,#temp.CanEquip do if(temp.CanEquip[i]==MyselfProxy.Instance:GetMyProfession())then canBuy=true return canBuy end end else canBuy=true end return canBuy end function HappyShopProxy:CachedHaveBoughtItemCount(id, count) if self.cachedHaveBoughtItemCount == nil then self.cachedHaveBoughtItemCount = {} end self.cachedHaveBoughtItemCount[id] = count end function HappyShopProxy:GetCachedHaveBoughtItemCount() return self.cachedHaveBoughtItemCount end function HappyShopProxy:GetNPC() return self.npc end function HappyShopProxy:GetShopItems() return self.shopItems end function HappyShopProxy:SetMyProfessionItems(datas) TableUtility.ArrayClear(self.myProfessionItems) for i=1,#datas do local data = self:GetShopItemDataByTypeId(datas[i]) if self:JudgeCanBuy(data) then TableUtility.ArrayPushBack(self.myProfessionItems, datas[i]) end end end function HappyShopProxy:GetMyProfessionItems() return self.myProfessionItems end function HappyShopProxy:SetSelectId(id) self.selectId = id end function HappyShopProxy:GetSelectId() return self.selectId end function HappyShopProxy:GetMoneyType() return self.moneyTypes end function HappyShopProxy:GetScreen() local shopData = ShopProxy.Instance:GetShopDataByTypeId(self.shopType, self.params) if shopData then return shopData:CheckScreen() end return false end function HappyShopProxy:BuyShopItem(id,count) if self.buyItemList == nil then self.buyItemList = {} end if self.buyItemList[id] == nil then self.buyItemList[id] = count else self.buyItemList[id] = self.buyItemList[id] + count end if self.buyItemList[id] then self:BuyItem(id, self.buyItemList[id]) self.buyItemList[id] = nil end end function HappyShopProxy:BuyItem(id, count) local item = self:GetShopItemDataByTypeId(id) if item == nil then return end self:BuyItemByShopItemData(item, count) end function HappyShopProxy:BuyItemByShopItemData(item, count) if item:CheckCanRemove() then MsgManager.ShowMsgByID(990) self:CallQueryShopConfig() return end if item.curProduceNum == 0 then MsgManager.ShowMsgByID(13000) return end local goodsID = item.goodsID local foreverLimitCount = GameConfig.Shop.forever_limit_item[goodsID] if foreverLimitCount ~= nil and self:GetLimitItemCount(goodsID) >= foreverLimitCount then MsgManager.ShowMsgByID(3436) return end if item.BaseLv == nil or (MyselfProxy.Instance:RoleLevel()>=item.BaseLv)then local canBuyCount, limitType = self:GetCanBuyCount(item) if canBuyCount ~= nil then if count > canBuyCount or canBuyCount == 0 then if limitType == self.LimitType.OneDay then MsgManager.ShowMsgByID(76) else MsgManager.ShowMsgByID(78) end return end end local goodsStaticData = Table_Item[goodsID] --獲取上限 local limitCfg = goodsStaticData.GetLimit if self:CheckLimitCount(limitCfg) then local limitCount = ItemData.Get_GetLimitCount(goodsID) local haveCount = self.limitCountMap[itemid] or 0 limitCount = limitCount - haveCount if limitCount < 0 then limitCount = 0 end if count > limitCount then local msgId if limitCfg.type == 1 then msgId = 64 elseif limitCfg.type == 7 then msgId = 63 end MsgManager.ShowMsgByID(msgId, goodsStaticData.NameZh) return end end TableUtility.ArrayClear(totalCostList) for i=1,5 do local temp = i if temp == 1 then temp = "" end local ItemID = item["ItemID"..temp] if ItemID then totalCostList[i] = item:GetBuyFinalPrice(item["ItemCount"..temp], count) local itemName = "" if Table_Item[ItemID] then itemName = Table_Item[ItemID].NameZh or "" end local moneyCount = self:GetItemNum(ItemID, item.source) if moneyCount < totalCostList[i] then MsgManager.FloatMsgTableParam(nil,ZhString.HappyShop_NotEnough,itemName) return end end end if item.IfMsg ~= nil then local itemName = "" if Table_Item[item.ItemID] then itemName = Table_Item[item.ItemID].NameZh or "" end MsgManager.ConfirmMsgByID(item.IfMsg, function () ServiceSessionShopProxy.Instance:CallBuyShopItem(item.id, count, totalCostList[1], totalCostList[2]) end, nil, nil, item.ItemCount, itemName, goodsStaticData.NameZh or "") else ServiceSessionShopProxy.Instance:CallBuyShopItem(item.id, count, totalCostList[1], totalCostList[2]) end else MsgManager.FloatMsgTableParam(nil,ZhString.HappyShop_levelNotEnough) end end function HappyShopProxy:CallQueryShopConfig() ShopProxy.Instance:CallQueryShopConfig(self.shopType, self.params) end function HappyShopProxy:GetShopItemDataByTypeId(id) return ShopProxy.Instance:GetShopItemDataByTypeId(self.shopType, self.params, id) end function HappyShopProxy:GetItemNum(itemid, source) local moneyCount = 0 if source == self.SourceType.Guild then moneyCount = GuildProxy.Instance:GetGuildPackItemNumByItemid(itemid) else local moneyId = GameConfig.MoneyId if itemid == moneyId.Zeny then moneyCount = MyselfProxy.Instance:GetROB() elseif itemid == moneyId.PvpCoin then moneyCount = MyselfProxy.Instance:GetPvpCoin() elseif itemid == moneyId.Lottery then moneyCount = MyselfProxy.Instance:GetLottery() elseif itemid == moneyId.GuildHonor then moneyCount = MyselfProxy.Instance:GetGuildHonor() elseif itemid == moneyId.Diamond then moneyCount = MyselfProxy.Instance:GetDiamond() elseif itemid == moneyId.Contribute then moneyCount = Game.Myself and Game.Myself.data.userdata:Get(UDEnum.CONTRIBUTE) or 0 elseif itemid == moneyId.Gods then moneyCount = GuildProxy.Instance:GetGuildPackItemNumByItemid(itemid) else moneyCount = self:GetItemNumByStaticID(itemid) end end return moneyCount end function HappyShopProxy:GetItemNumByStaticID(itemid) local _BagProxy = BagProxy.Instance local count = 0 for i=1,#packageCheck do count = count + _BagProxy:GetItemNumByStaticID(itemid, packageCheck[i]) end return count end function HappyShopProxy:GetCanBuyCount(data) local isOneDay = data:CheckLimitType(self.LimitType.OneDay) local isAccUser = data:CheckLimitType(self.LimitType.AccUser) local isAccUserAlways = data:CheckLimitType(self.LimitType.AccUserAlways) local isUserWeek = data:CheckLimitType(self.LimitType.UserWeek) local isAccWeek = data:CheckLimitType(self.LimitType.AccWeek) local isAccMonth = data:CheckLimitType(self.LimitType.AccMonth) if data.LimitNum ~= 0 and (isOneDay or isAccUser or isAccUserAlways or isUserWeek or isAccWeek or isAccMonth) then local boughtCount = 0 local haveBoughtItemCount = self:GetCachedHaveBoughtItemCount() if haveBoughtItemCount ~= nil then boughtCount = haveBoughtItemCount[data.id] or 0 end if isOneDay then return data.LimitNum - boughtCount, self.LimitType.OneDay elseif isAccUser then return data.LimitNum - boughtCount, self.LimitType.AccUser elseif isAccUserAlways then return data.LimitNum - boughtCount, self.LimitType.AccUserAlways elseif isAccWeek then return data.LimitNum - boughtCount, self.LimitType.AccWeek elseif isAccMonth then return data.LimitNum - boughtCount, self.LimitType.AccMonth elseif isUserWeek then return data.LimitNum - boughtCount, self.LimitType.UserWeek end end return nil end function HappyShopProxy:IsShowSkip() return self.aniConfig and self.aniConfig[1] or false end local ActionConfig = { ActionId = 506, IdleActionId = 505, LeanTime = 1.5, } local defaultEff,defaultAudio,defaultAni = "Common/Lottery","Common/LotteryMech","functional_action" function HappyShopProxy:PlayAnimationEff() local isSkip = LocalSaveProxy.Instance:GetSkipAnimation(self.aniConfig[3]) if(isSkip)then return end local npcID = self.npc.data:GetGuid() local npcRole = SceneCreatureProxy.FindCreature(npcID) if(npcRole)then local ani = self.aniConfig[2] or defaultAni self:PlayAction(npcRole,ActionConfig.ActionId) if self.effect then self.effect:Destroy() self.effect = nil end local effect = self.aniConfig[4] or defaultEff self.effect = npcRole:PlayEffect(nil, effect, 0, nil, nil, true) self.effect:RegisterWeakObserver(self) local audio = self.aniConfig[5] or defaultAudio npcRole:PlayAudio(audio) end self:RemoveLeanTween() self.lean = LeanTween.delayedCall(ActionConfig.LeanTime, function () self:PlayAction(npcRole, ActionConfig.IdleActionId) end) end function HappyShopProxy:PlayAction(npc, actionId) if npc ~= nil and actionId ~= nil then local actionName local config = Table_ActionAnime[actionId] if config ~= nil then actionName = config.Name end if actionName ~= nil then npc:Client_PlayAction(actionName, nil, false) end end end local strengthenAnimName = 'functional_action' local waitAnimName = 'wait' function HappyShopProxy:PlayFunctionalAction() local npcID = self.npc.data:GetGuid() local npcRole = SceneCreatureProxy.FindCreature(npcID) local animParams = Asset_Role.GetPlayActionParams(strengthenAnimName, nil, 1) animParams[7] = function () animParams = Asset_Role.GetPlayActionParams(waitAnimName, nil, 1) npcRole.assetRole:PlayActionRaw(animParams) end npcRole.assetRole:PlayActionRaw(animParams) end function HappyShopProxy:RemoveLeanTween() if(self.lean)then local npcID = self.npc.data:GetGuid() local npcRole = SceneCreatureProxy.FindCreature(npcID) self:PlayAction(npcRole, ActionConfig.IdleActionId) self.lean:cancel() self.lean=nil end end function HappyShopProxy:ObserverDestroyed(obj) if obj == self.effect then self.effect = nil end end function HappyShopProxy:SetLimitCount(itemid, count) if itemid ~= nil then self.limitCountMap[itemid] = count or 0 end end function HappyShopProxy:CheckLimitCount(limitCfg) if limitCfg == nil then return false end if limitCfg.type == nil then return false end if limitCfg.source == nil then return true else for i=1,#limitCfg.source do if limitCfg.source[i] == _SourceShop then return true end end end return false end function HappyShopProxy:GetDiscountItemCount(shopid) return self.discountItemMap[shopid] or 0 end function HappyShopProxy:GetLimitItemCount(itemid) return self.limitItemMap[itemid] or 0 end function HappyShopProxy:GetShopType() return self.shopType end function HappyShopProxy:GetShopId() return self.params end