PGRData/Script/matrix/xui/xuibuyasset/XUiExchangeAsset.lua

277 lines
11 KiB
Lua
Raw Normal View History

--######################## XUiExchangeAsset ########################
local XUiExchangeTargetItem = require("XUi/XUiBuyAsset/XUiExchangeTargetItem")
local XUiExchangeItem = require("XUi/XUiBuyAsset/XUiExchangeItem")
local XUiExchangeAsset = XLuaUiManager.Register(XLuaUi, "UiLottoTanchuang2")
function XUiExchangeAsset:OnAwake()
-- 重定义 begin
self.BtnClose2 = self.BtnTanchuangClose
self.UOExchangeItem1 = self.Card1
self.UOExchangeItem2 = self.Card2
self.UOTargetItem = self.TargetCard
-- 重定义 end
-- -- 兑换资源的配置
-- self.ExchangeConfigs = nil
self.CurrentExchangeData = nil
self.ItemId = nil
self.ExchangeItems = {}
self.ExchangeTargetItem = XUiExchangeTargetItem.New(self.UOTargetItem)
self.CurrentBuyCount = 1
self.CustomMaxCountTextFunc = nil
self.CustomMaxCountFunc = nil
self.ConsumeIcons = nil
self.TargetIcon = nil
self:RegisterUiEvents()
end
-- itemId : Share\Item\UiBuyAsset.tab的id
--[[
maxCountFunc : buyasset逻辑支持maxCountTextFunc一起设置
maxCountTextFunc : nilnil会自己读取UiBuyAsset的最大限购次数
consumeIcons :
targetIcon :
supportInput :
]]
function XUiExchangeAsset:OnStart(itemId, customData)
customData = customData or {}
self.ItemId = itemId
self.CustomMaxCountFunc = customData.maxCountFunc
self.CustomMaxCountTextFunc = customData.maxCountTextFunc
self.ConsumeIcons = customData.consumeIcons
self.TargetIcon = customData.targetIcon
self.SupportInput = customData.supportInput or false
-- 检查结束时间
local timeId = XItemConfigs.GetBuyAssetTimeId(itemId)
if timeId > 0 then
self:SetAutoCloseInfo(XFunctionManager.GetEndTimeByTimeId(timeId), function(isClose)
if isClose then
self:Close()
end
end, nil, 1)
end
end
function XUiExchangeAsset:OnEnable()
XUiExchangeAsset.Super.OnEnable(self)
self:RefreshExchangeInfo(self.ItemId)
end
function XUiExchangeAsset:OnDisable()
XUiExchangeAsset.Super.OnDisable(self)
end
--######################## 私有方法 ########################
function XUiExchangeAsset:RegisterUiEvents()
XUiHelper.RegisterClickEvent(self, self.BtnClose2, self.OnBtnCloseClicked)
XUiHelper.RegisterClickEvent(self, self.BtnClose, self.OnBtnCloseClicked)
XUiHelper.RegisterClickEvent(self, self.BtnAddSelect, self.OnBtnAddSelectClicked)
XUiHelper.RegisterClickEvent(self, self.BtnMinusSelect, self.OnBtnMinusSelectClicked)
self.InputBuyCount.onEndEdit:AddListener(function(count) self:OnEndEdit(count) end)
end
function XUiExchangeAsset:OnBtnAddSelectClicked()
-- 如果有自定义最大数量限制,优先处理
local maxCount = self.CurrentBuyCount + 1
if self.CustomMaxCountFunc then
maxCount = self.CustomMaxCountFunc()
else
local totalLimitCount = XItemConfigs.GetBuyAssetTotalLimit(self.CurrentExchangeData.TargetId)
local hasTotal = totalLimitCount > 0
local hasDaily = self.CurrentExchangeData.LeftTimes ~= nil
-- 每日
if hasDaily then
maxCount = self.CurrentExchangeData.LeftTimes
elseif hasTotal then
local item = XDataCenter.ItemManager.GetItem(self.CurrentExchangeData.TargetId)
local leftTotalCount = totalLimitCount - item.TotalBuyTimes
maxCount = leftTotalCount
end
end
-- 范围防御限制
self.CurrentBuyCount = math.max(math.min(self.CurrentBuyCount + 1, maxCount), 1)
self:RefreshExchangeInfo()
end
function XUiExchangeAsset:OnBtnMinusSelectClicked()
self.CurrentBuyCount = math.max(self.CurrentBuyCount - 1, 1)
self:RefreshExchangeInfo()
end
function XUiExchangeAsset:OnEndEdit(inputText)
-- 如果有自定义最大数量限制,优先处理
local maxCount = self.CurrentBuyCount + 1
if self.CustomMaxCountFunc then
maxCount = self.CustomMaxCountFunc()
else
local totalLimitCount = XItemConfigs.GetBuyAssetTotalLimit(self.CurrentExchangeData.TargetId)
local hasTotal = totalLimitCount > 0
local hasDaily = self.CurrentExchangeData.LeftTimes ~= nil
-- 每日
if hasDaily then
maxCount = self.CurrentExchangeData.LeftTimes
elseif hasTotal then
local item = XDataCenter.ItemManager.GetItem(self.CurrentExchangeData.TargetId)
local leftTotalCount = totalLimitCount - item.TotalBuyTimes
maxCount = leftTotalCount
end
end
-- 范围防御限制
local count = tonumber(inputText)
self.CurrentBuyCount = math.max(math.min(count, maxCount), 1)
self:RefreshExchangeInfo()
end
function XUiExchangeAsset:OnBtnCloseClicked()
self:EmitSignal("Close")
self:Close()
end
function XUiExchangeAsset:RefreshExchangeInfo(itemId)
if itemId == nil then itemId = self.ItemId end
local itemManager = XDataCenter.ItemManager
-- 当前兑换配置数据
self.CurrentExchangeData = itemManager.GetBuyAssetInfo(itemId)
-- 获取购买数量信息
local costCountDic, getCount, exchangeConfigs = self:GetItemBuyAssetConsumeCountAndGetCount(itemId, self.CurrentBuyCount)
-- 创建本次兑换数据
local targetId = self.CurrentExchangeData.TargetId
local exchangeDatas = {}
for i, consumeId in ipairs(self.CurrentExchangeData.ConsumeId) do
table.insert(exchangeDatas, {
TemplateId = consumeId,
CostCount = costCountDic[consumeId] or 0,
Discount = self.CurrentExchangeData.DiscountShows[i],
CustomIcon = self.ConsumeIcons[i]
})
end
-- 创建本次目标数据
local targetData = {
TemplateId = targetId,
GetCount = getCount,
CustomIcon = self.TargetIcon ,
}
-- 设置交换的物品信息
local exchangeItem
for index, exchangeData in ipairs(exchangeDatas) do
exchangeItem = self.ExchangeItems[index]
if exchangeItem == nil then
exchangeItem = XUiExchangeItem.New(self["UOExchangeItem" .. index])
exchangeItem:ConnectSignal("BuySuccess", self, self.OnBuySuccess)
self.ExchangeItems[index] = exchangeItem
end
exchangeItem:SetData(exchangeData, targetId, self.CurrentBuyCount)
end
-- 设置目标的物品信息
if targetData.TemplateId == itemManager.ItemId.Coin then
local buyAssetCoinBase = CS.XGame.Config:GetInt("BuyAssetCoinBase")
local buyAssetCoinMul = CS.XGame.Config:GetInt("BuyAssetCoinMul")
local newTargetCount = 0
for _, exchangeConfig in ipairs(exchangeConfigs) do
newTargetCount = newTargetCount + (buyAssetCoinBase + XPlayer.Level * buyAssetCoinMul) * exchangeConfig.GainCount
end
targetData.GetCount = newTargetCount
end
self.ExchangeTargetItem:SetData(targetData)
-- 刷新购买数量
self:RefreshBuyCountInfo(itemId)
end
function XUiExchangeAsset:OnBuySuccess()
self:EmitSignal("BuySuccess", self.CurrentBuyCount)
-- 发送事件XUiBuyAsset原有逻辑保留
CsXGameEventManager.Instance:Notify(XEventId.EVENT_ITEM_FAST_TRADING)
-- 判定是否需要关闭
if XItemConfigs.GetBuyAssetAutoClose(self.CurrentExchangeData.TargetId) ~= 0 then
self:Close()
return
end
-- 刷新下一次的数据
self.CurrentBuyCount = 1
self:RefreshExchangeInfo(self.ItemId)
end
function XUiExchangeAsset:GetItemBuyAssetConsumeCountAndGetCount(itemId, buyCount)
local itemManager = XDataCenter.ItemManager
local item = itemManager.GetItem(itemId)
-- 获取当前购买次数
local currentBuyTime = self.CurrentExchangeData.LeftTimes and item.BuyTimes + 1 or item.TotalBuyTimes + 1
-- 获取该物品所有兑换的配置数据
local exchangeConfigs = XItemConfigs.GetBuyAssetTemplateById(itemId)
-- 待检查的兑换数据下标
local exchangeIndex = #exchangeConfigs
-- 根据购买次数找到合适的兑换配置
local resultExchangeConfigs = {}
-- 根据购买次数找到所有符合的交换配置
local tmpConfig = nil
while buyCount > 0 and exchangeIndex >= 1 do
tmpConfig = exchangeConfigs[exchangeIndex]
-- 符合直接插入配置
if currentBuyTime >= tmpConfig.Times then
table.insert(resultExchangeConfigs, tmpConfig)
exchangeIndex = math.min(exchangeIndex + 1, #exchangeConfigs)
buyCount = buyCount - 1
currentBuyTime = currentBuyTime + 1
else -- 不符合,倒退回去找合适的
exchangeIndex = exchangeIndex - 1
end
end
-- 该购买次数下消耗的物品数量字典
local costCountDic = {}
-- 该购买次数下能够获得的该物品的数量
local getCount = 0
for _, config in ipairs(resultExchangeConfigs) do
getCount = getCount + config.GainCount
for i, consumeId in ipairs(config.ConsumeId) do
costCountDic[consumeId] = costCountDic[consumeId] or 0
costCountDic[consumeId] = costCountDic[consumeId] + config.ConsumeCount[i]
end
end
return costCountDic, getCount, resultExchangeConfigs
end
function XUiExchangeAsset:RefreshBuyCountInfo(itemId)
-- 获取是否能够多次选择
local canMutiply = XItemConfigs.GetBuyAssetCanMutiply(itemId) > 1
self.PanelBuyCount.gameObject:SetActiveEx(canMutiply)
if not canMutiply then return end
-- 设置是否支持输入
self.InputBuyCount.interactable = self.SupportInput
-- 设置当前购买次数
self.InputBuyCount.text = self.CurrentBuyCount
-- 如果配置了自定义的数量限制,直接使用自定义的
if self.CustomMaxCountTextFunc then
self.TxtExchangeTip.text = self.CustomMaxCountTextFunc()
self.TxtCanBuyCount.text = self.CustomMaxCountFunc()
else
local totalLimitCount = XItemConfigs.GetBuyAssetTotalLimit(itemId)
local item = XDataCenter.ItemManager.GetItem(itemId)
local leftTotalCount = totalLimitCount - item.TotalBuyTimes
local hasTotal = totalLimitCount > 0
local hasDaily = self.CurrentExchangeData.LeftTimes ~= nil
-- 每日的 + 总共的
if hasDaily and hasTotal then
if self.CurrentExchangeData.LeftTimes < leftTotalCount then
self.TxtExchangeTip.text = XUiHelper.GetText("BuyAssetDailyExchangeTip")
self.TxtCanBuyCount.text = self.CurrentExchangeData.LeftTimes .. XUiHelper.GetText("BuyAssetTotalLeftCountTip", leftTotalCount)
else
self.TxtExchangeTip.text = XUiHelper.GetText("BuyAssetTotalExchangeTip")
self.TxtCanBuyCount.text = leftTotalCount
end
-- 每日的
elseif hasDaily then
self.TxtExchangeTip.text = XUiHelper.GetText("BuyAssetDailyExchangeTip")
self.TxtCanBuyCount.text = self.CurrentExchangeData.LeftTimes
-- 总共的
elseif hasTotal then
self.TxtExchangeTip.text = XUiHelper.GetText("BuyAssetTotalExchangeTip")
self.TxtCanBuyCount.text = leftTotalCount
else -- 都没有配置
self.TxtExchangeTip.gameObject:SetActiveEx(false)
self.TxtCanBuyCount.gameObject:SetActiveEx(false)
end
end
end
return XUiExchangeAsset