源战役客户端
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

574 lines
20 KiB

--[[@------------------------------------------------------------------
@description:云购界面
@author:wyb
----------------------------------------------------------------------]]
CloudShoppingView = CloudShoppingView or BaseClass(BaseView)
function CloudShoppingView:__init()
self.base_file = "cloudShopping"
self.layout_file = "CloudShoppingView"
self.layer_name = "UI"
-- self.use_local_view = true
self.use_background = true
self.close_mode = CloseMode.CloseDestroy
self.destroy_imm = true
self.append_to_ctl_queue = true
self.model = CustomActivityModel:getInstance()
self.item_list = {}
self.event_list = {}
self.first_open_view = false
self.base_type = CustomActivityModel.CustomActBaseType.CLOUD_SHOPPING
self.load_callback = function ()
self:LoadSuccess()
self:InitEvent()
end
self.open_callback = function ()
if self.sub_type then
self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33112, self.sub_type)
end
end
self.close_callback = function ()
self:Remove()
end
end
function CloudShoppingView:Open(sub_type, open_type)
self.sub_type = sub_type
self.open_type = open_type
BaseView.Open(self)
end
function CloudShoppingView:Remove()
self:CancelLeftTimer()
for _, v in pairs(self.event_list) do
self.model:UnBind(v)
v = nil
end
for _, v in pairs(self.item_list) do
v:DeleteMe()
v = nil
end
self.item_list = {}
self.first_open_view = false
self:CancelTimer()
end
function CloudShoppingView:LoadSuccess()
self.bg2,
self.iconOne,
self.iconTen
= GetChildImages(self.transform, {
"bg2",
"rightCon/poolCon/btnOne/icon",
"rightCon/poolCon/btnTen/icon"
})
-- lua_resM:setOutsideImageSprite(self, self.bg2, GameResPath.GetJpgImage("cloud_shopping_bg.jpg"), false)
self.txtProgress,
self.txtPrice,
self.txtTime,
self.txtBuy,
self.txtLimit,
self.txtOne,
self.txtTen,
self.txtName
= GetChildTexts(self.transform, {
"leftCon/txtProgress",
"leftCon/priceCon/txtPrice",
"rightCon/timeCon/txtTime",
"rightCon/poolCon/txtBuy",
"rightCon/poolCon/txtLimit",
"rightCon/poolCon/btnOne/text",
"rightCon/poolCon/btnTen/text",
"leftCon/nameCon/txtName",
})
self.imgGoods,
self.effect
= GetChildTransforms(self.transform, {
"leftCon/imgGoods",
"leftCon/effect",
})
self.timeCon,
self.imgOver,
self.btnHelp,
self.btnReward,
self.btnOne,
self.btnTen,
self.probBtn,
self.btnGL,
self.clickGo
= GetChildGameObjects(self.transform, {
"rightCon/timeCon",
"rightCon/imgOver",
"rightCon/btnHelp",
"rightCon/btnReward",
"rightCon/poolCon/btnOne",
"rightCon/poolCon/btnTen",
"Window/probBtn",
"rightCon/btnGL",
"clickGo"
})
self.box_list = {}
for i = 1, 14 do
self.box_list[i] = self:GetChild("rightCon/poolCon/BoxCon/Box" .. i)
end
self:AddUIEffect("effect_xunbao_001_3", self.effect, self.layer_name, nil, 0.7, true)
end
function CloudShoppingView:InitEvent()
local onClickHandler = function (target, x, y)
if not self.goods_basic then
return
end
local onGotoBag = function ()
local ok_callback = function ()
GlobalEventSystem:Fire(EventName.OPEN_BAG_VIEW)
end
Alert.show("您的背包已满,无法购买,是否前往整理背包!", Alert.Type.Two, ok_callback, nil, "确定", "取消")
end
local empty = GoodsModel:getInstance():GetEmptyGrid()
local goodsNum = GoodsModel:getInstance():GetTypeGoodsNum(self.type_id)
if self.btnOne == target then
if empty <= 0 then
onGotoBag()
return
end
if goodsNum >= self.cost then
self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33113, self.sub_type, 1, 0)
else
if TreasureHuntModel:getInstance().not_show["cloud_shopping"] then
self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33113, self.sub_type, 1, 1)
else
self:TipsFunc(self.cost, 1)
end
end
elseif self.btnTen == target then
if empty < 10 then
onGotoBag()
return
end
if goodsNum >= (self.cost * 10) then
self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33113, self.sub_type, 10, 0)
else
if TreasureHuntModel:getInstance().not_show["cloud_shopping"] then
self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33113, self.sub_type, 10, 1)
else
self:TipsFunc(self.cost * 10, 10)
end
end
elseif self.btnReward == target then
self.model:Fire(CustomActivityModel.OPEN_CLOUD_REWARD_VIEW, self.sub_type)
elseif self.btnHelp == target then
if not self.open_type then return end
if self.open_type == CustomActivityModel.CloudShoppingType.BenFu then
UIToolTipMgr:getInstance():AppendSimpleTips(Config.ConfigActStatic.CloudShoppingDescBenFu, x, y)
elseif self.open_type == CustomActivityModel.CloudShoppingType.KuaFu then
UIToolTipMgr:getInstance():AppendSimpleTips(Config.ConfigActStatic.CloudShoppingDescKuaFu, x, y)
end
elseif self.probBtn == target then
elseif self.clickGo == target then
self:ClickBigRewardFunc(x, y)
elseif target == self.btnGL then
self.model:Fire(CustomActivityModel.OPEN_CLOUD_SHOP_ODDS_VIEW)
end
end
AddClickEvent(self.btnOne, onClickHandler)
AddClickEvent(self.btnTen, onClickHandler)
AddClickEvent(self.btnReward, onClickHandler)
AddClickEvent(self.btnHelp, onClickHandler)
AddClickEvent(self.probBtn, onClickHandler)
AddClickEvent(self.btnGL, onClickHandler)
AddClickEvent(self.clickGo, onClickHandler)
local onUpdate = function ()
self:SetData()
if self.first_open_view == false then
-- self:UpdateItems()
self.first_open_view = true
end
end
self.event_list[1] = self.model:Bind(CustomActivityModel.UPDATE_CLOUD_SHOPPING_VIEW, onUpdate)
local onUpateItem = function ()
--购买成功之后的处理
self:UpdateItems()
end
self.event_list[2] = self.model:Bind(CustomActivityModel.UPDATE_CLOUD_BUY_LIST, onUpateItem)
end
function CloudShoppingView:TipsFunc(costNum, buyNum)
local goodsNum = GoodsModel:getInstance():GetTypeGoodsNum(self.type_id)
local goodsPrice, _ = GoodsModel:getInstance():GetGoodsPrice(self.goods_basic.type_id)
local str_color = WordManager.GetGoodsColor(self.goods_basic.color)
local need_price = (costNum - goodsNum) * goodsPrice
local content = string.format("当前材料<color=%s>%s</color>不足\n",
str_color, Trim(self.goods_basic.goods_name))
local per_str = "是否使用"..need_price
local cur_str = "立即补充<color=#4eae1a>" .. (costNum - goodsNum) .. "</color>个"
local jin = RoleManager.Instance.mainRoleInfo:GetRealJin()
local function ok_callback()
if jin >= need_price then
self.model:Fire(CustomActivityModel.PROTO_CCMD_EVENT, 33113, self.sub_type, buyNum, 1)
else
Message.show("您的彩钻不足")
end
end
TreasureHuntModel:getInstance():Fire(TreasureHuntModel.OPEN_HINT_VIEW, "cloud_shopping", content, ok_callback, per_str, cur_str)
end
function CloudShoppingView:SetData()
self.act_data = self.model:getActList(self.base_type)
self.data = self.model:GetCloudShoppingInfo()
if not self.act_data or not self.data then
return
end
self:SetLeftTime()
self:CreateItems()
end
function CloudShoppingView:SetLeftTime()
local time = self.data.next_reward_time - TimeUtil:getServerTime()
local function timer_func()
self:CancelLeftTimer()
local timeStr = TimeUtil:timeConvert9(time)
self.txtTime.text = time > 0 and timeStr or ""
if time <= 0 then
self:CancelLeftTimer()
end
if time - 3600 > 0 then --大于1小时的
local duration = 60
local first_time = time % 60 --先计算秒数的
if first_time ~= 0 then
duration = first_time
end
local function delayFunc( )
time = time - duration
timer_func()
end
self.left_time_id = GlobalTimerQuest:AddPeriodQuest(delayFunc, duration)
else
local function delayFunc( )
time = time - 1
timer_func()
end
self.left_time_id = GlobalTimerQuest:AddPeriodQuest(delayFunc, 1)
end
end
timer_func()
self.imgOver:SetActive(time <= 0)
self.timeCon:SetActive(time > 0)
end
function CloudShoppingView:CancelLeftTimer()
if self.left_time_id then
GlobalTimerQuest:CancelQuest(self.left_time_id)
self.left_time_id = nil
end
end
function CloudShoppingView:CreateItems()
local cfg = Config.Cloudbuy[self.data.big_reward_id]
if cfg then
local boxList = ErlangParser:GetInstance():Parse(cfg.happy_awards)
if TableSize(boxList) > 0 then
local onSortFunc = function (a, b)
return tonumber(a[2]) < tonumber(b[2])
end
table.sort(boxList, onSortFunc)
local item = nil
for i, v in ipairs(boxList) do
if self.box_list[i] then
local reward_id = tonumber(v[2])
item = self.item_list[reward_id]
if item == nil then
item = CloudShoppingItem.New(self.box_list[i])
self.item_list[reward_id] = item
end
item:SetData(reward_id)
end
end
end
local total_count = tonumber(cfg.total_count)
local buyNumStr = "<color="..ColorUtil.GREEN..">" .. self.data.all_buy_num .. "</color>"
self.txtProgress.text = string.format("开奖进度:%s/%d", buyNumStr, total_count)
self.txtPrice.text = cfg.worth
buyNumStr = "<color="..ColorUtil.GREEN..">" .. self.data.self_buy_num .. "</color>"
local leftStr = total_count - self.data.all_buy_num > 0 and "<color="..ColorUtil.GREEN..">" .. (total_count - self.data.all_buy_num) .. "</color>" or "<color="..ColorUtil.RED..">0</color>"
self.txtBuy.text = string.format("您已购买%s份(剩余%s份)", buyNumStr, leftStr)
local unlimited_time, award_time = self:GetActCondition()
if unlimited_time and award_time then
local cur_hour = os.date("%H", TimeUtil:getServerTime())
cur_hour = tonumber(cur_hour)
local str = ""
local buy_time_str = self.data.less_buy_num > 0 and self.data.less_buy_num or "<color="..ColorUtil.RED..">0</color>"
if cur_hour < unlimited_time or cur_hour > award_time then
str = string.format("(还可购买%s份,开奖前%d小时不限制)", buy_time_str, award_time - unlimited_time)
else
str = string.format("(还可购买%s份)", buy_time_str)
end
self.txtLimit.text = str
end
self:SetGiftName(cfg)
self:SetGiftModel(cfg)
self:SetCost(cfg.cost)
end
end
function CloudShoppingView:SetGiftName(cfg)
local reward = ErlangParser:GetInstance():Parse(cfg.rewards)
if TableSize(reward) > 0 then
local type_id = 0
if cfg.reward_type == 2 then --按职业区分
local career = RoleManager.Instance:GetMainRoleVo().career
for _,v in pairs(reward) do
if career == tonumber(v[1]) then
type_id = tonumber(v[2][1][2])
break
end
end
else
type_id = tonumber(reward[1][2])
end
local goods_basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(type_id)
if goods_basic then
local goodsName = "<color="..WordManager.GetGoodsColor(goods_basic.color) .. "><a@><u>"..Trim(goods_basic.goods_name) .. "</u></a></color>"
local numStr = "<color="..ColorUtil.GREEN..">(" .. cfg.award_count .. "份)</color>"
self.txtName.text = goodsName .. numStr
local call_back = function(param, x, y)
self:ClickBigRewardFunc(x, y)
end
AddUnderLineAndClick(self, self.txtName.transform, call_back, false, true)
end
end
end
function CloudShoppingView:ClickBigRewardFunc(x, y)
local cfg = Config.Cloudbuy[self.data.big_reward_id]
if not cfg then
return
end
local reward = ErlangParser:GetInstance():Parse(cfg.rewards)
if TableSize(reward) > 0 then
local type_id = 0
if cfg.reward_type == 2 then --按职业区分
local career = RoleManager.Instance:GetMainRoleVo().career
for _,v in pairs(reward) do
if career == tonumber(v[1]) then
type_id = tonumber(v[2][1][2])
break
end
end
else
type_id = tonumber(reward[1][2])
end
local goods_basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(type_id)
if goods_basic then
if goods_basic.type == GoodsModel.TYPE.EQUIP then
local target_config = Config.Equipattr[type_id]
if target_config then
local dynamic = {}
dynamic.type_id = type_id
dynamic.rating = target_config.base_rating
dynamic.equip_extra_attr = {}
dynamic.equip_type = goods_basic.equip_type
local target_pro = ErlangParser:GetInstance():Parse(target_config.recommend_attr)
for i, v in ipairs(target_pro) do
local attr = {}
attr.color = tonumber(v[2][1])
attr.attr_id = tonumber(v[2][2])
if #v[2] == 5 then
attr.type_id = 1
attr.plus_interval = tonumber(v[2][4])
attr.plus_unit = tonumber(v[2][5])
else
attr.type_id = 2
attr.attr_val = tonumber(v[2][3])
end
table.insert(dynamic.equip_extra_attr, attr)
end
UIToolTipMgr:getInstance():AppendEquipShowTips(dynamic, x, y, EquipShowTips.EQUIP_RECOMMAND_TARGET)
end
else
UIToolTipMgr:getInstance():AppendGoodsTips(type_id, x, y)
end
end
end
end
function CloudShoppingView:SetGiftModel(cfg)
local resouce_id_list = ErlangParser:GetInstance():Parse(cfg.resouce_id)
local res_id = 0
local career = RoleManager.Instance.mainRoleInfo.career
for _,v in pairs(resouce_id_list) do
if tonumber(v[1]) == career then
res_id = tonumber(v[2])
break
end
end
local scale = tonumber(cfg.resouce_size)
if scale and scale > 0 then
scale = scale
else
scale = nil
end
local posList = ErlangParser:GetInstance():Parse(cfg.resouce_height)
local x, y = 0, 0
if TableSize(posList) > 0 then
x = tonumber(posList[1][1])
y = tonumber(posList[1][2])
end
local data = {
clothe_res_id = res_id,
type = SceneBaseType.Role,
layer_name = self.layer_name,
action_name_list = {"show", "idle"},
can_rotate = true,
layout_file = self.layout_file
-- position = Vector3(x, y, 0),
}
lua_resM:SetRoleModel(self, self.imgGoods, data)
--lua_resM:SetRoleModel(self,self.imgGoods,nil,nil,res_id,nil,nil,SceneBaseType.Role,self.layer_name,nil,{"show","idle"},false,scale,Vector3(x, y, 0))
self.imgGoods:GetComponent("RawImage").raycastTarget = true
end
function CloudShoppingView:SetCost(costList)
local cost_list = ErlangParser:GetInstance():Parse(costList)
if TableSize(cost_list) > 0 then
self.cost_type = tonumber(cost_list[1][1])
self.cost = tonumber(cost_list[1][3])
self.type_id = tonumber(cost_list[1][2])
self.txtOne.text = self.cost
self.txtTen.text = self.cost * 10
self.goods_basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(self.type_id)
if self.goods_basic then
lua_resM:setOutsideImageSprite(self, self.iconOne, GameResPath.GetGoodsIcon(self.goods_basic.goods_icon))
lua_resM:setOutsideImageSprite(self, self.iconTen, GameResPath.GetGoodsIcon(self.goods_basic.goods_icon))
end
end
end
function CloudShoppingView:UpdateItems()
local buy_list = self.model:GetCloudBuyList()
for _, item in pairs(self.item_list) do
item:ResetItem()
end
self:CancelTimer()
local last_item = nil
local len = TableSize(buy_list)
if len > 0 then
local index = 1
local sub_index = 1
function go_next()
local data = buy_list[index]
self:CancelTimer()
if data then
sub_index = sub_index % 14
if sub_index == 0 then
sub_index = 14
end
local function show_anim()
local item = self.item_list[sub_index]
if item then
local find = false
if not item.stop_change then
local bool, num = self:ShowItemLightBg(buy_list, sub_index)
if bool then
item:ShowLightBg(bool, num)
find = true
else
item:ShowLightBg(true, 0, true)
end
end
if last_item then
if not last_item.stop_change then
last_item:ShowLightBg(false, 0, true)
end
end
last_item = item
if find then
go_next()
return
end
end
sub_index = sub_index + 1
end
self.timer_id_1 = GlobalTimerQuest:AddPeriodQuest(show_anim, 0.1, -1)
show_anim()
end
index = index + 1
end
go_next()
end
end
function CloudShoppingView:ShowItemLightBg(buy_list, reward_id)
local bool = false
local num = 0
for _, v in pairs(buy_list) do
if v.reward_id == reward_id then
bool = true
num = v.reward_num
break
end
end
return bool, num
end
--获得活动条件
function CloudShoppingView:GetActCondition()
local act_data = self.model:getActList(self.base_type)
--不限购时间和开奖时间
local unlimited_time, award_time
if act_data and act_data.condition_list then
local condList = act_data.condition_list
if TableSize(condList) > 0 then
for _, v in ipairs(condList) do
if Trim(v[1]) == "unlimited_time" then
unlimited_time = tonumber(v[2][1])
end
if Trim(v[1]) == "award_time" then
award_time = tonumber(v[2][1])
end
end
end
end
return unlimited_time, award_time
end
function CloudShoppingView:CancelTimer()
if self.timer_id_1 then
GlobalTimerQuest:CancelQuest(self.timer_id_1)
self.timer_id_1 = nil
end
if self.timer_id_2 then
GlobalTimerQuest:CancelQuest(self.timer_id_2)
self.timer_id_2 = nil
end
end