autoImport("CardRandomMakeData") autoImport("CardMakeData") CardMakeProxy = class('CardMakeProxy', pm.Proxy) CardMakeProxy.Instance = nil; CardMakeProxy.NAME = "CardMakeProxy" CardMakeProxy.MakeType = { Random = SceneItem_pb.EEXCHANGECARDTYPE_DRAW, Compose = SceneItem_pb.EEXCHANGECARDTYPE_COMPOSE, Decompose = SceneItem_pb.EEXCHANGECARDTYPE_DECOMPOSE, } local tempList = {} local filter = {} local _getCardList = {} local _getItemList = {} local packageCheck = GameConfig.PackageMaterialCheck.exchange local _ArrayPushBack = TableUtility.ArrayPushBack local _ArrayClear = TableUtility.ArrayClear function CardMakeProxy:ctor(proxyName, data) self.proxyName = proxyName or CardMakeProxy.NAME if(CardMakeProxy.Instance == nil) then CardMakeProxy.Instance = self end if data ~= nil then self:setData(data) end self:Init() end function CardMakeProxy:Init() self.randomCardList = {} self.filterRandomCardList = {} self.chooseRandomCardList = {} self.filterCardList = {} self.decomposeCardList = {} self.filterDecomposeCardList = {} self.cardConfig = { [self.MakeType.Random] = {name = EffectMap.Maps.Randomcard, audio = AudioMap.Maps.Randomcard, skipType = SKIPTYPE.CardRandomMake}, [self.MakeType.Compose] = {name = EffectMap.Maps.Compoundcard, audio = AudioMap.Maps.Compoundcard, skipType = SKIPTYPE.CardMake}, [self.MakeType.Decompose] = {name = EffectMap.Maps.Randomcard, audio = AudioMap.Maps.Randomcard, skipType = SKIPTYPE.CardDecompose}, } end function CardMakeProxy:RecvExchangeCardItemCmd(data) self.npcid = data.npcid local npcRole = SceneCreatureProxy.FindCreature(data.npcid) local isSelf = data.charid == Game.Myself.data.id local config = self.cardConfig[data.type] --自己製作 and 跳過動畫 if isSelf then if self:IsSkipGetEffect(config.skipType) then self:ShowAward(data.cardid, data.items) return end end --不跳過動畫 if isSelf then self:ShowAward(data.cardid, data.items, true) end if npcRole then --找到npc if isSelf then self:CameraReset() local viewPort = CameraConfig.CardMake_ViewPort local duration = CameraConfig.NPC_Dialog_DURATION self.cft = CameraEffectFocusTo.new(npcRole.assetRole.completeTransform, viewPort, duration) FunctionCameraEffect.Me():Start(self.cft) Game.Myself:Client_NoMove(true) end --動作 npcRole:Client_PlayAction('functional_action', nil, false) --特效 if self.effect then self.effect:Destroy() self.effect = nil end self.effect = npcRole:PlayEffect(nil, config.name, 0, nil, nil, true) self.effect:RegisterWeakObserver(self) npcRole:PlayAudio(config.audio) if isSelf then --獲得物品界面 LeanTween.delayedCall(GameConfig.Delay.card_exchange / 1000, function () local id = TableUtility.ArrayPopFront(_getCardList) if id then self:ShowFloatAward(id) elseif #_getItemList > 0 then self:ShowItemPop(_getItemList) end self:CameraReset() Game.Myself:Client_NoMove(false) end) end else --找不到npc,自己製作成功飄字 if isSelf then self:ShowAward(data.cardid, data.items) end end end function CardMakeProxy:ObserverDestroyed(obj) if obj == self.effect then self.effect = nil end end function CardMakeProxy:ShowAward(cardid, items, isDelay) if #items > 0 then _ArrayClear(_getItemList) for i=1,#items do local item = items[i] local itemData = ItemData.new(item.guid, item.id) itemData.num = item.count _ArrayPushBack(_getItemList, itemData) end if not isDelay then self:ShowItemPop(_getItemList) end else local itemData = ItemData.new("ExchangeCard", cardid) if isDelay then _ArrayPushBack(_getCardList, itemData) else self:ShowFloatAward(itemData) end end end function CardMakeProxy:ShowFloatAward(itemData) if BagProxy.CheckIsCardTypeItem(itemData.staticData.Type) then FloatAwardView.addItemDatasToShow({itemData} ,function () local npcRole = SceneCreatureProxy.FindCreature(self.npcid) if npcRole then local viewdata = { viewname = "DialogView", dialoglist = {9}, npcinfo = npcRole, addconfig = npcRole.data.staticData.NpcFunction, } FunctionNpcFunc.ShowUI(viewdata) end end, nil, true) end end function CardMakeProxy:ShowItemPop(itemlist) self:sendNotification(UIEvent.ShowUI, {viewname = "PopUp10View"}) self:sendNotification(SystemMsgEvent.MenuItemPop, itemlist) end function CardMakeProxy:CameraReset() if self.cft ~= nil then FunctionCameraEffect.Me():End(self.cft) self.cft = nil end end --可抽卡卡片列表 function CardMakeProxy:InitRandomCard() _ArrayClear(self.randomCardList) local timecheck_func = ItemUtil.CheckCardCanLotteryByTime for i=1,#packageCheck do local items = BagProxy.Instance:GetBagItemsByTypes(Game.Config_ItemTypeGroup[BagProxy.ItemTypeGroup.Card], packageCheck[i]) if items ~= nil then for j=1,#items do local bagData = items[j] if bagData.staticData.Quality < 4 and not bagData:CheckItemCardType(Item_CardType.Raffle) then for j=1,bagData.num do if(timecheck_func(bagData.staticData.id))then local data = CardRandomMakeData.new( bagData:Clone() ) _ArrayPushBack(self.randomCardList, data) end end end end end end self:SortRandomCard(self.randomCardList) end function CardMakeProxy:GetRandomCard() return self.randomCardList end --抽卡排序 function CardMakeProxy:SortRandomCard(list) table.sort( list, CardMakeProxy._SortRandomCard) end function CardMakeProxy._SortRandomCard(l,r) if l.isChoose == r.isChoose then local staticDatal = l.itemData.staticData local staticDatar = r.itemData.staticData if staticDatal and staticDatar then if staticDatal.Quality == staticDatar.Quality then return staticDatal.id < staticDatar.id else return staticDatal.Quality < staticDatar.Quality end end else return l.isChoose end end --根據卡片品質篩選 function CardMakeProxy:FilterRandomCard(quality) if quality == 0 then self:SortRandomCard(self.randomCardList) return self.randomCardList end _ArrayClear(self.filterRandomCardList) for i=1,#self.randomCardList do local data = self.randomCardList[i] if data.isChoose then _ArrayPushBack(self.filterRandomCardList, data) elseif data.itemData and data.itemData.staticData and data.itemData.staticData.Quality == quality then _ArrayPushBack(self.filterRandomCardList, data) end end self:SortRandomCard(self.filterRandomCardList) return self.filterRandomCardList end function CardMakeProxy:CheckFilterRandomCardList(quality) if quality == 0 then return self.randomCardList end for i = #self.filterRandomCardList, 1, -1 do local data = self.filterRandomCardList[i] if not data.isChoose and data.itemData and data.itemData.staticData and data.itemData.staticData.Quality ~= quality then table.remove(self.filterRandomCardList, i) end end return self.filterRandomCardList end --獲得選中列表 function CardMakeProxy:GetRandomChooseList() _ArrayClear(self.chooseRandomCardList) local data for i=1,#self.randomCardList do data = self.randomCardList[i] if data.isChoose then _ArrayPushBack(self.chooseRandomCardList, data) end end return self.chooseRandomCardList end --獲得選中id列表 function CardMakeProxy:GetRandomChooseIdList() _ArrayClear(tempList) for i=1,#self.chooseRandomCardList do _ArrayPushBack(tempList, self.chooseRandomCardList[i].itemData.id) end return tempList end function CardMakeProxy:GetRandomCost() local randomList = GameConfig.CardMake.RandomTip local data for i=1,#Table_CardRate do _ArrayClear(tempList) for i=1,#self.chooseRandomCardList do _ArrayPushBack(tempList, self.chooseRandomCardList[i].itemData.staticData.Quality) end data = Table_CardRate[i] for j=1,#data.quality do TableUtility.ArrayRemove(tempList, data.quality[j]) end if #tempList == 0 then return data.Cost end end return nil end function CardMakeProxy:InitRandomGetList() local timecheck_func = ItemUtil.CheckCardCanLotteryByTime for k,v in pairs(Table_Card) do if(timecheck_func(v.id))then if self:CheckType(v.Type, Item_CardType.Get) then local data = ItemData.new("Card", v.id) _ArrayPushBack(self.randomGetList, data) end end end table.sort(self.randomGetList, CardMakeProxy._SortRandomGet) end function CardMakeProxy._SortRandomGet(l,r) local staticDatal = l.staticData local staticDatar = r.staticData if staticDatal and staticDatar then if staticDatal.Quality == staticDatar.Quality then return staticDatal.id < staticDatar.id else return staticDatal.Quality > staticDatar.Quality end end end function CardMakeProxy:GetRandomGetList() if self.randomGetList == nil then self.randomGetList = {} self:InitRandomGetList() end return self.randomGetList end --可製作卡片列表 function CardMakeProxy:InitCard() self.cardList = {} for k,v in pairs(Table_Compose) do if v.Category == 7 then local data = CardMakeData.new(k) _ArrayPushBack(self.cardList, data) end end end function CardMakeProxy:GetCard() return self.cardList end function CardMakeProxy:SortCard(list) table.sort( list, CardMakeProxy._SortCard) end function CardMakeProxy._SortCard(l,r) local composel = Table_Compose[l.id] local composer = Table_Compose[r.id] local staticDatal = l.itemData.staticData local staticDatar = r.itemData.staticData if staticDatal and staticDatar then if composel.IsTop == composer.IsTop then if staticDatal.Quality == staticDatar.Quality then return staticDatal.id < staticDatar.id else return staticDatal.Quality > staticDatar.Quality end else return composel.IsTop == 1 end end end function CardMakeProxy:FilterCard(type) if self.cardList == nil then self:InitCard() end _ArrayClear(self.filterCardList) local timecheck_func = ItemUtil.CheckCardCanComposeByTime if(type == 0)then for i=1,#self.cardList do local d = self.cardList[i]; if( timecheck_func(d.itemData.staticData.id) )then _ArrayPushBack(self.filterCardList, d) end end else for i=1,#self.cardList do local data = self.cardList[i] if data.itemData and data.itemData.staticData and data.itemData.staticData.Type == type then if( timecheck_func(data.itemData.staticData.id) )then _ArrayPushBack(self.filterCardList, data) end end end end self:SortCard(self.filterCardList) return self.filterCardList end function CardMakeProxy:CanMake() if self.chooseData then return self.chooseData:CanMake() else return false end end --篩選下拉框 function CardMakeProxy:GetFilter(filterData) _ArrayClear(filter) for k,v in pairs(filterData) do table.insert(filter,k) end table.sort( filter, function (l,r) return l < r end ) return filter end --是否高級卡片 function CardMakeProxy:IsCostGreatCard(composeId) local data = Table_Compose[composeId] if data then for i=1,#data.BeCostItem do local itemid = data.BeCostItem[i].id if Table_Card[itemid] ~= nil then local staticData = Table_Item[itemid] if staticData and staticData.Quality >= 4 then return true end end end end return false end function CardMakeProxy:CheckType(type,index) if type == nil or index == nil then return false end return type & index > 0 end function CardMakeProxy:SetChoose(data) self.chooseData = data end function CardMakeProxy:GetChoose() return self.chooseData end function CardMakeProxy:CheckCanMake(materialData) if materialData and self.chooseData then return self.chooseData:CheckCanMake(materialData) end return false end function CardMakeProxy:IsSkipGetEffect(type) return LocalSaveProxy.Instance:GetSkipAnimation(type) end function CardMakeProxy: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 CardMakeProxy:InitDecomposeCard() _ArrayClear(self.decomposeCardList) local _BagProxy = BagProxy.Instance for i=1,#packageCheck do local items = _BagProxy:GetBagItemsByTypes(Game.Config_ItemTypeGroup[BagProxy.ItemTypeGroup.Card], packageCheck[i]) if items ~= nil then for j=1,#items do local bagData = items[j] if bagData.staticData.Quality <= 4 and not bagData:CheckItemCardType(Item_CardType.Decompose) then _ArrayPushBack(self.decomposeCardList, bagData:Clone()) end end end end self:SortDecomposeCard(self.decomposeCardList) end function CardMakeProxy:GetDecomposeCard() return self.decomposeCardList end function CardMakeProxy:FilterDecomposeCard(quality) if quality == 0 then self:SortDecomposeCard(self.decomposeCardList) return self.decomposeCardList end _ArrayClear(self.filterDecomposeCardList) for i=1,#self.decomposeCardList do local data = self.decomposeCardList[i] if data.staticData.Quality == quality then _ArrayPushBack(self.filterDecomposeCardList, data) end end self:SortDecomposeCard(self.filterDecomposeCardList) return self.filterDecomposeCardList end function CardMakeProxy:SortDecomposeCard(list) table.sort( list, CardMakeProxy._SortDecomposeCard) end function CardMakeProxy._SortDecomposeCard(l,r) local staticDatal = l.staticData local staticDatar = r.staticData if staticDatal and staticDatar then if staticDatal.Quality == staticDatar.Quality then return staticDatal.id < staticDatar.id else return staticDatal.Quality < staticDatar.Quality end end end function CardMakeProxy:GetDecomposeMaterialItemData() if self.decomposeMaterialItemData == nil then self.decomposeMaterialItemData = ItemData.new("CardDecompose", GameConfig.Card.decompose_item_id) end return self.decomposeMaterialItemData end