import GameModel from "../core/GameModel"; import ItemUtil from "../core/ItemUtil"; import MsgAlert from "../game/msg/MsgAlert"; import FGUtil from "../gear_2.3.4/fgui/FGUtil"; import SKDataUtil from "../gear_2.3.4/util/SKDataUtil"; import SKUIUtil from "../gear_2.3.4/util/SKUIUtil"; const { ccclass, property } = cc._decorator; export default class Arena extends cc.Component { /** * 競技場單例實例 */ public static Instance : Arena = null; /** * 競技場面板 */ arenaPanel : fgui.GComponent = null; /** * 戰報面板 */ reportPanel : fgui.GComponent = null; /** * 兌換面板 */ convertPanel : fgui.GComponent = null; /** * 需要加載的預製體 */ prefabObject : any = {}; /** * 刷新冷卻時間 */ refreshCD : number = 0; /** * 積分兌換商品列表 */ convertItemsList : any = []; /** * 當前選擇的商品信息 */ selectedGoodItemsInfo : any = []; /** * 是否是進入戰鬥後隱藏 */ isBtlHide : boolean = false; onLoad() { if (Arena.Instance === null) { Arena.Instance = this; this.loadPrefab(); } else { this.destroy(); return; } } /** * 加載預製體 */ loadPrefab() { // 加載所需的預製體 var prefabList = [ { url: "Prefabs/UIRole", name: "UIRole" }, ] this.prefabObject = {} for (let item of prefabList) { cc.loader.loadRes(item.url, cc.Prefab, (err, prefab) => { if (err) console.warn(err); else { this.prefabObject[item.name] = prefab; } }) } } openArenaPanel(list : any = [], selfInfo = null, refresh : Boolean = false) { if (!this.arenaPanel || (this.arenaPanel && !this.arenaPanel.node && !SKUIUtil.isValid(this.arenaPanel.node))) { this.arenaPanel = FGUtil.create("main_ui", "arena_panel"); FGUtil.root().addChild(this.arenaPanel); this.arenaPanel.makeFullScreen(); this.addUIRole(); } let listBox = FGUtil.getList(this.arenaPanel, "alert/list") listBox.removeChildrenToPool(); if (this.refreshCD > 0) { FGUtil.getControl(this.arenaPanel, "alert/refreshBtn/cding").selectedIndex = 1; FGUtil.getTextField(this.arenaPanel, "alert/refreshBtn/title").text = `00:0${this.refreshCD}`; } if (refresh) { var score = 0; if (GameModel.equipData && GameModel.equipData.score) score = GameModel.equipData.score; FGUtil.getTextField(this.arenaPanel, "alert/rank").text = selfInfo.arena.ranking; FGUtil.getTextField(this.arenaPanel, "alert/arena").text = selfInfo.arena.jpoint; FGUtil.getTextField(this.arenaPanel, "alert/hasTimes").text = selfInfo.arena.count; FGUtil.getTextField(this.arenaPanel, "alert/equipScore").text = score.toString(); let timeWait = 0; for (let i = 0; i < list.length; i++) { this.scheduleOnce(() => { let item = listBox.addItemFromPool().asCom; item.visible = false FGUtil.getTextField(item, "rankLabel").text = list[i][7]; FGUtil.getTextField(item, "name").text = list[i][2]; FGUtil.getLoader(item, "ava").texture = GameModel.getRoleHead(list[i][1]); FGUtil.getTextField(item, "eqScore").text = list[i][8]; var btn = FGUtil.getButton(item, "btn"); btn.visible = (selfInfo.arena.ranking > 10 && i < 5) ? false : true btn.clearClick(); btn.onClick(() => { GameModel.send("c2s_arenaPK", { troleid: list[i][0], type: 2 }); }, this) this.scheduleOnce(() => { item.visible = true }, 0) }, timeWait) timeWait += 0.01; } this.arenaPanel.visible = true; return } var mask = FGUtil.getComponent(this.arenaPanel, "mask"); var close = FGUtil.getButton(this.arenaPanel, "alert/closeBtn"); this.pushCloseEvent(mask, this.arenaPanel, () => { listBox.removeChildrenToPool(); this.unscheduleAllCallbacks(); }); this.pushCloseEvent(close, this.arenaPanel, () => { listBox.removeChildrenToPool(); this.unscheduleAllCallbacks(); }); var historyBtn = FGUtil.getButton(this.arenaPanel, "alert/history"); historyBtn.onClick(() => { GameModel.send("c2s_report", { troleid: GameModel.player.roleid }) this.openReportPanel(); }, this) var convertBtn = FGUtil.getButton(this.arenaPanel, "alert/convert"); convertBtn.onClick(() => { this.openConvertPanel(); }, this) var cdBtn = FGUtil.getButton(this.arenaPanel, "alert/refreshBtn"); cdBtn.onClick(() => { if (this.refreshCD > 0) { MsgAlert.addMsg("請稍等再重置"); return; } GameModel.send("c2s_ask_paihang", { nByWhat: 4, object: "", nRoleid: GameModel.player.roleid }) this.refreshCD = 5; FGUtil.getControl(this.arenaPanel, "alert/refreshBtn/cding").selectedIndex = 1; FGUtil.getTextField(this.arenaPanel, "alert/refreshBtn/title").text = `00:0${this.refreshCD}`; this.schedule(() => { this.refreshCD--; if (this.refreshCD <= 0) { FGUtil.getControl(this.arenaPanel, "alert/refreshBtn/cding").selectedIndex = 0 this.unscheduleAllCallbacks() return } FGUtil.getTextField(this.arenaPanel, "alert/refreshBtn/title").text = `00:0${this.refreshCD}`; }, 1, 4) }, this) GameModel.send("c2s_ask_paihang", { nByWhat: 4, object: "", nRoleid: GameModel.player.roleid }) } hideArenaPanel() { if (!this.arenaPanel || !this.arenaPanel.node) return this.isBtlHide = true; this.arenaPanel.visible = false; this.unscheduleAllCallbacks(); } showArenaPanel() { if (!this.arenaPanel || !this.arenaPanel.node) return this.isBtlHide = false; GameModel.send("c2s_ask_paihang", { nByWhat: 4, object: "", nRoleid: GameModel.player.roleid }) } openReportPanel(list : any = [], refresh : Boolean = false) { if (!this.reportPanel || (this.reportPanel && !this.reportPanel.node && !SKUIUtil.isValid(this.reportPanel.node))) { this.reportPanel = FGUtil.create("main_ui", "report_panel"); FGUtil.root().addChild(this.reportPanel); this.reportPanel.makeFullScreen(); } let listBox = FGUtil.getList(this.reportPanel, "alert/list") listBox.removeChildrenToPool(); if (refresh) { for (let i = 0; i < list.length; i++) { let item = listBox.addItemFromPool().asCom; FGUtil.getTextField(item, "idx").text = list[i].ranking; FGUtil.getTextField(item, "name").text = list[i].erolename; FGUtil.getTextField(item, "time").text = this.getTimeStr(list[i].cdate); FGUtil.getLoader(item, "icon").texture = GameModel.getRoleHead(list[i].eresid); FGUtil.getControl(item, "type").selectedIndex = list[i].iswin ? list[i].ranking > 0 ? 1 : 2 : 0; } return } var mask = FGUtil.getComponent(this.reportPanel, "mask"); var close = FGUtil.getButton(this.reportPanel, "alert/close"); this.pushCloseEvent(mask, this.reportPanel, () => { listBox.removeChildrenToPool() }); this.pushCloseEvent(close, this.reportPanel, () => { listBox.removeChildrenToPool() }); } openConvertPanel(list : any = [], refresh : Boolean = false) { console.log("openConvertPanelopenConvertPanelopenConvertPanelopenConvertPanel") if (!this.convertPanel || (this.convertPanel && !this.convertPanel.node && !SKUIUtil.isValid(this.convertPanel.node))) { this.convertPanel = FGUtil.create("main_ui", "arena_exchange_panel"); FGUtil.root().addChild(this.convertPanel); this.convertPanel.makeFullScreen(); } FGUtil.dispose(this.arenaPanel); this.arenaPanel = null; let listBox = FGUtil.getList(this.convertPanel, "alert/list") listBox.removeChildrenToPool(); this.convertItemsList = [] if (refresh) { console.log(refresh) for (let i = 0; i < list.length; i++) { let item = listBox.addItemFromPool().asCom; this.convertItemsList.push(item); let itemData = SKDataUtil.clone(ItemUtil.getItemData(list[i].itemid)); itemData.price = list[i].price = list[i].price FGUtil.getTextField(item, "title").text = itemData.name; FGUtil.getTextField(item, "price").text = itemData.price; FGUtil.getLoader(item, "icon").texture = ItemUtil.getItemIcon(itemData.icon); item.clearClick(); item.onClick(() => { this.selectConvertGoodItems(i, itemData); }, this) if (i == 0) this.selectConvertGoodItems(0, itemData) } return; } var mask = FGUtil.getComponent(this.convertPanel, "mask"); var close = FGUtil.getButton(this.convertPanel, "alert/n4"); this.pushCloseEvent(mask, this.convertPanel, () => { listBox.removeChildrenToPool() }); this.pushCloseEvent(close, this.convertPanel, () => { listBox.removeChildrenToPool() }); this.initClacPad(FGUtil.getButton(this.convertPanel, "alert/calc")); FGUtil.getButton(this.convertPanel, "alert/n48").onClick(() => { FGUtil.getTextField(this.convertPanel, "alert/count").text = ""; FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString(); FGUtil.getComponent(this.convertPanel, "alert/calc").visible = true }) FGUtil.getButton(this.convertPanel, "alert/reduce").onClick(() => { this.reduceGoods(); }) FGUtil.getButton(this.convertPanel, "alert/add").onClick(() => { this.addGoods(); }) FGUtil.getButton(this.convertPanel, "alert/buy_btn").onClick(() => { var num = parseInt(FGUtil.getTextField(this.convertPanel, "alert/count").text); num = num > 0 ? num : 1; GameModel.send("c2s_buy_from_npc", { nCnt: num, nConfigID: 10240, nItemID: this.selectedGoodItemsInfo.id }) }) GameModel.send("c2s_ask_npc_shop_item", { nNpcConfigID: 10240 }) } /** * 選擇積分兌換商品項目 * @param idx 商品下標 */ selectConvertGoodItems(idx, info) { for (let i in this.convertItemsList) { FGUtil.getControl(this.convertItemsList[i], "selected").selectedIndex = i == idx ? 1 : 0; } this.showConvertGoodInfo(info) } /** * 顯示積分兌換商品信息 */ showConvertGoodInfo(data : any) { if (!this.convertPanel || !this.convertPanel.node || !SKUIUtil.isValid(this.convertPanel.node)) return; this.selectedGoodItemsInfo = data; FGUtil.getTextField(this.convertPanel, "alert/name").text = data.name; FGUtil.getTextField(this.convertPanel, "alert/des").text = data.description + "\n【類型】" + data.typedetail + "\n【用途】" + data.usedetail; FGUtil.getTextField(this.convertPanel, "alert/count").text = "1"; FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = data.price; } /** * 減少商品數量 */ reduceGoods() { if (!this.convertPanel || !this.convertPanel.node || !SKUIUtil.isValid(this.convertPanel.node)) return; var num = parseInt(FGUtil.getTextField(this.convertPanel, "alert/count").text); if (num <= 1) return num--; FGUtil.getTextField(this.convertPanel, "alert/count").text = num.toString(); FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (num * this.selectedGoodItemsInfo.price).toString(); } /** * 增加商品數量 */ addGoods() { if (!this.convertPanel || !this.convertPanel.node || !SKUIUtil.isValid(this.convertPanel.node)) return; var num = parseInt(FGUtil.getTextField(this.convertPanel, "alert/count").text); if (num >= 99999) return num++; FGUtil.getTextField(this.convertPanel, "alert/count").text = num.toString(); FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (num * this.selectedGoodItemsInfo.price).toString(); } initClacPad(pad) { for (let i = 0; i < 10; i++) { FGUtil.getButton(pad, `n${i}`).clearClick(); FGUtil.getButton(pad, `n${i}`).onClick(() => { var numStr = FGUtil.getTextField(this.convertPanel, "alert/count").text; numStr += i; var num = parseInt(numStr); if (num >= 99999) num = 99999 FGUtil.getTextField(this.convertPanel, "alert/count").text = num.toString(); FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (num * this.selectedGoodItemsInfo.price).toString(); }) } FGUtil.getButton(pad, `n10`).clearClick(); FGUtil.getButton(pad, `n10`).onClick(() => { FGUtil.getTextField(this.convertPanel, "alert/count").text = ""; FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString(); }) FGUtil.getButton(pad, `n12`).clearClick(); FGUtil.getButton(pad, `n12`).onClick(() => { FGUtil.getComponent(this.convertPanel, "alert/calc").visible = false; var numStr = FGUtil.getTextField(this.convertPanel, "alert/count").text; if (numStr == "") { FGUtil.getTextField(this.convertPanel, "alert/count").text = "1"; FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString(); } }) FGUtil.getButton(pad, `mask`).clearClick(); FGUtil.getButton(pad, `mask`).onClick(() => { FGUtil.getComponent(this.convertPanel, "alert/calc").visible = false; var numStr = FGUtil.getTextField(this.convertPanel, "alert/count").text; if (numStr == "") { FGUtil.getTextField(this.convertPanel, "alert/count").text = "1"; FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString(); } }) } /** * 獲取時間對比字符串 */ getTimeStr(str) { var timeArr = str.split(/[: -]/) if (timeArr.length != 6) return ""; var startTime = new Date(timeArr[0], timeArr[1] - 1, timeArr[2], timeArr[3], timeArr[4], timeArr[5]); var endTime = new Date(); var t = (endTime.getTime() - startTime.getTime()) / 1000; var num = Math.floor(t); if (num < 60) return `${num}秒前`; t = t / 60; num = Math.floor(t); if (num < 60) return `${num}分鐘前`; t = t / 60; num = Math.floor(t); if (num < 24) return `${num}小時前`; t = t / 24; num = Math.floor(t); if (num < 365) return `${num}天前`; t = t / 365; num = Math.floor(t); return `${num}年前`; } /** * 添加人物UI */ addUIRole() { if (!this.arenaPanel.node || this.prefabObject["UIRole"] == null) return; var roleNode = cc.instantiate(this.prefabObject["UIRole"]); roleNode.parent = this.arenaPanel.node; roleNode.setPosition(this.arenaPanel.node.width / 2 - 276, -285); roleNode.getComponent("UIRole").setInfo(GameModel.player) roleNode.getComponent("UIRole").offTouchRole(); } /** * 添加關閉事件 */ pushCloseEvent(item : fairygui.GComponent, target : fairygui.GComponent, call : Function = null) { item.clearClick(); item.onClick(() => { call && call() FGUtil.dispose(target); }, this) } }