import GameModel from "../core/GameModel"; import ItemUtil from "../core/ItemUtil"; import MsgAlert from "../game/msg/MsgAlert"; import FGAlert from "../gear_2.3.4/fgui/FGAlert"; 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 Contact extends cc.Component { /** * 社交單例實例 */ public static Instance: Contact = null; /** * 社交面板 */ contactPanel: fgui.GComponent = null; /** * 需要加載的預製體 */ prefabObject: any = {}; /** * 幫派郵件數據 */ bangEmailData: any = []; /** * 普通郵件數據 */ NormalEmailData: any = [] /** * 備份郵件數據(星標和非星標交替備份 */ backupsEmailData: any = [] /** * 當前是否展示的為星標郵件 */ isShowStarEmail: boolean = false; /** * 選擇的郵件 */ selectEmailIdx: number = 0; /** * 阻止點擊 */ stopTap: boolean = false; onLoad() { if (Contact.Instance === null) { Contact.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; } }) } } openContactPanel(list: any = [], refresh: Boolean = false) { if (!this.contactPanel || (this.contactPanel && !this.contactPanel.node && !SKUIUtil.isValid(this.contactPanel.node))) { this.contactPanel = FGUtil.create("main_ui", "contact_panel"); FGUtil.root().addChild(this.contactPanel); this.contactPanel.makeFullScreen(); } var mask = FGUtil.getComponent(this.contactPanel, "mask"); var close = FGUtil.getButton(this.contactPanel, "alert/close"); this.pushCloseEvent(mask, this.contactPanel, () => { this.unscheduleAllCallbacks(); }); this.pushCloseEvent(close, this.contactPanel, () => { this.unscheduleAllCallbacks(); }); if (!refresh) { GameModel.send("c2s_mail_list", {}) return; } if (list.length > 0) { this.NormalEmailData = []; this.backupsEmailData = []; this.isShowStarEmail = false this.NormalEmailData = SKDataUtil.clone(list); } // 處理郵件 this.handleEmailData(); FGUtil.getButton(this.contactPanel, "alert/n136").onClick(this.openFriend, this) FGUtil.getButton(this.contactPanel, "alert/n137").onClick(this.tipNo, this) // 郵件左側列表 let emailList = FGUtil.getList(this.contactPanel, "alert/emailList"); // 設置初始化方法 emailList.itemRenderer = this.initEmailItem.bind(this); // 虛擬列表 emailList.setVirtual(); emailList.numItems = this.NormalEmailData.length; // 幫派郵件內容列表 let bangContentList = FGUtil.getList(this.contactPanel, "alert/bang_content"); // 設置初始化方法 bangContentList.itemRenderer = this.initBangEmailContent.bind(this); // 虛擬列表 bangContentList.setVirtual(); // 一鍵領取 let oneKeyReceiveBtn = FGUtil.getButton(this.contactPanel, "alert/allReward"); oneKeyReceiveBtn.clearClick(); oneKeyReceiveBtn.onClick(this.oneKeyReceiveAllReward, this); // 一鍵刪除 let oneKeyDeleteeBtn = FGUtil.getButton(this.contactPanel, "alert/oneKeyDel"); oneKeyDeleteeBtn.clearClick(); oneKeyDeleteeBtn.onClick(this.oneKeyDeleteAllEmail, this); // 顯示星標郵件 FGUtil.getComponent(this.contactPanel, "alert/n75").clearClick(); FGUtil.getComponent(this.contactPanel, "alert/n75").onClick(() => { if (this.backupsEmailData.length == 0) MsgAlert.addMsg("大俠,星標郵件數量為0~") else this.exchangeEmailData() }) // 顯示非星標郵件 FGUtil.getComponent(this.contactPanel, "alert/back").clearClick(); FGUtil.getComponent(this.contactPanel, "alert/back").onClick(() => { this.exchangeEmailData() }) if (this.NormalEmailData.length == 0) { // 沒有郵件 FGUtil.getControl(this.contactPanel, "alert/noEmail").selectedIndex = 1; } else { // 有郵件 FGUtil.getControl(this.contactPanel, "alert/noEmail").selectedIndex = 0; this.onEmailClick(null, 0); } // 調試功能 // var bangEmailBtn = FGUtil.getComponent(this.contactPanel, "alert/n95"); // bangEmailBtn.onClick(this.createBangEmail, this) // var norEmailBtn = FGUtil.getComponent(this.contactPanel, "alert/n96"); // norEmailBtn.onClick(this.createNormalEmail, this) // var rewardEmailBtn = FGUtil.getComponent(this.contactPanel, "alert/n121"); // rewardEmailBtn.onClick(this.createRewardEmail, this) // var delAllEmailBtn = FGUtil.getComponent(this.contactPanel, "alert/n122"); // delAllEmailBtn.onClick(() => { // this.bangEmailData = []; // this.NormalEmailData = []; // emailList.numItems = 0; // bangContentList.numItems = 0; // }, this) } checkHasNoRead(list) { if (list.length <= 0) return this.NormalEmailData = []; this.backupsEmailData = []; this.isShowStarEmail = false this.NormalEmailData = SKDataUtil.clone(list); // 處理郵件 this.handleEmailData(); var needTip = false for (let i = this.NormalEmailData.length - 1; i >= 0; i--) { if (this.NormalEmailData[i].type && this.NormalEmailData[i].type != "email2") { needTip = true } } if (needTip) { var fp = cc.find("Canvas/MainUI/FriendPanel") if (fp) { let lg = fp.getComponent("FriendPanel") if (lg) lg.showEmailTip() } else { if (!SKUIUtil.isFGUIValid(this.contactPanel)) { var mainui = cc.find("Canvas/MainUI") if (mainui) { let mlg = mainui.getComponent("MainUI") if (mlg) mlg.friendAddTip() } } } } } /** * 處理星標和非星標數據,默認是非星標 */ handleEmailData() { for (let i = this.NormalEmailData.length - 1; i >= 0; i--) { this.NormalEmailData[i].isStar = false; if (!this.NormalEmailData[i].type) { this.NormalEmailData[i].type = "email0" } if (this.NormalEmailData[i].gets && this.NormalEmailData[i].gets.length > 0) { this.NormalEmailData[i].isReward = true this.NormalEmailData[i].countDown = 99 this.NormalEmailData[i].receive = this.NormalEmailData[i].state == 2 ? true : false if (this.NormalEmailData[i].receive) { this.NormalEmailData[i].type = "email2" } else { this.NormalEmailData[i].type = "email1" } } if (this.NormalEmailData[i].isStar) { this.backupsEmailData.push(this.NormalEmailData.splice(i, 1)) } } } /** * 交換星標或非星標數據為當前顯示數據 */ exchangeEmailData() { var temp = SKDataUtil.clone(this.NormalEmailData); this.NormalEmailData = SKDataUtil.clone(this.backupsEmailData); this.backupsEmailData = temp; this.isShowStarEmail = !this.isShowStarEmail; FGUtil.getControl(this.contactPanel, "alert/isStar").selectedIndex = this.isShowStarEmail ? 1 : 0; this.changeEmailListNum(); console.log("當前數據") console.log(this.NormalEmailData) } /** * 初始化郵件項目 * @param idx 下標 * @param obj fgui=》Obj */ initEmailItem(idx, obj: fairygui.GObject) { let item = obj.asCom; if (this.NormalEmailData[idx].type == "bang") { // 幫派郵件 item.icon = `ui://main_ui/9043` FGUtil.getControl(item, "isBang").selectedIndex = 1; } else { // 普通郵件 item.icon = `ui://main_ui/icon_${this.NormalEmailData[idx].type}` FGUtil.getControl(item, "isBang").selectedIndex = 0; // 已讀 if (this.NormalEmailData[idx].type == "email2") FGUtil.getControl(item, "isRead").selectedIndex = 1; } // 發件人和日期 FGUtil.getTextField(item, "title").text = this.NormalEmailData[idx].title; FGUtil.getTextField(item, "time").text = this.NormalEmailData[idx].date; if (this.selectEmailIdx == idx) { // 選中狀態 FGUtil.getControl(item, "selected").selectedIndex = 1; item.asButton.touchable = false; } else { // 非選中狀態 FGUtil.getControl(item, "selected").selectedIndex = 0; item.node["idx"] = idx item.asButton.onClick(this.onEmailClick, this) item.asButton.touchable = true; } } /** * 郵件點擊事件 */ onEmailClick(e: Event, id: number = 0) { // 改變選中的idx var idx; if (e && e.target && e.target["idx"]) idx = e.target["idx"]; else idx = id; this.selectEmailIdx = idx; var contentData = this.NormalEmailData[idx]; if (contentData.type != "bang") { // 無禮物郵件改為已讀圖標 if (this.NormalEmailData[idx].type == "email0") { GameModel.send("c2s_mail_action", { action: 4, mailId: contentData.mailId }) this.NormalEmailData[idx].type = "email2"; } // 展示普通郵件內容 FGUtil.getControl(this.contactPanel, "alert/isBang").selectedIndex = 0; this.showNormalEmailContent(contentData, idx); } else { // 顯示幫派郵件內容 FGUtil.getControl(this.contactPanel, "alert/isBang").selectedIndex = 1; let bangContentList = FGUtil.getList(this.contactPanel, "alert/bang_content"); bangContentList.numItems = this.bangEmailData.length } // 刷新列表 this.refreshEmailList(); } // 刷新郵件列表 refreshEmailList() { let emailList = FGUtil.getList(this.contactPanel, "alert/emailList"); emailList.refreshVirtualList(); } // 改變郵件列表數量(並刷新) changeEmailListNum() { if (this.NormalEmailData.length == 0) { // 沒有郵件 FGUtil.getControl(this.contactPanel, "alert/noEmail").selectedIndex = 1; return } // 有郵件 FGUtil.getControl(this.contactPanel, "alert/noEmail").selectedIndex = 0; let emailList = FGUtil.getList(this.contactPanel, "alert/emailList"); emailList.numItems = this.NormalEmailData.length; if (this.selectEmailIdx >= this.NormalEmailData.length) this.selectEmailIdx = this.NormalEmailData.length - 1; if (this.selectEmailIdx != -1) this.onEmailClick(null, this.selectEmailIdx); } /** * 初始化幫派郵件內容 */ initBangEmailContent(idx, obj: fairygui.GObject) { let item = obj.asCom; FGUtil.getRichTextField(item, "content").text = this.bangEmailData[idx].content; FGUtil.getTextField(item, "fromTime").text = this.bangEmailData[idx].date; FGUtil.getTextField(item, "fromPerson").text = this.bangEmailData[idx].signer; } /** * 展示普通郵件內容 * @param contentData 郵件內容 */ showNormalEmailContent(contentData: any, idx) { // 顯示郵件內容 var contentPanle = FGUtil.getComponent(this.contactPanel, "alert/normal_content"); // 是否星標 FGUtil.getControl(contentPanle, "isStar").selectedIndex = contentData.isStar ? 1 : 0; // 郵件類型 FGUtil.getTextField(contentPanle, "fromType").text = contentData.title; FGUtil.getList(contentPanle, "content").removeChildrenToPool(); var con = FGUtil.getList(contentPanle, "content").addItemFromPool().asCom; // 內容 FGUtil.getRichTextField(con, "content").text = contentData.content; // 日期 FGUtil.getTextField(con, "fromTime").text = contentData.date; // 落款人 FGUtil.getTextField(con, "fromPerson").text = contentData.title; if (contentData.gets && contentData.gets.length > 0) { // 是獎勵型郵件 FGUtil.getControl(contentPanle, "showReward").selectedIndex = 1; // 過期時間 FGUtil.getControl(contentPanle, "showTime").selectedIndex = 1; FGUtil.getTextField(contentPanle, "time").text = contentData.countDown + "天后過期"; // 是否領取 FGUtil.getControl(contentPanle, "isReceived").selectedIndex = contentData.receive ? 1 : 0; // 獎勵內容 let rewardBox = FGUtil.getList(contentPanle, "rewardList"); rewardBox.removeChildren(); for (let i in contentData.gets) { var itemData = ItemUtil.getItemData(contentData.gets[i].itemId) if (contentData.gets[i].type == "score") { var item = rewardBox.addItem("ui://main_ui/email_reward_score").asCom; FGUtil.getLoader(item, "icon").texture = ItemUtil.getItemIcon(itemData.icon); FGUtil.getTextField(item, "num").text = SKDataUtil.transform(contentData.gets[i].itemCount); } else { var item = rewardBox.addItem("ui://main_ui/email_reward_item").asCom; FGUtil.getLoader(item, "icon").texture = ItemUtil.getItemIcon(itemData.icon); FGUtil.getTextField(item, "title").text = SKDataUtil.transform(contentData.gets[i].itemCount); } } rewardBox.ensureBoundsCorrect(); // 領取郵件中的獎勵 let receiveBtn = FGUtil.getButton(contentPanle, "reward"); receiveBtn.clearClick(); receiveBtn.onClick(() => { if (this.stopTap) { MsgAlert.addMsg("您操作過於頻繁"); return } this.stopTap = true GameModel.send("c2s_mail_action", { action: 0, mailId: contentData.mailId }) // this.NormalEmailData[idx].receive = true // FGUtil.getControl(contentPanle, "isReceived").selectedIndex = 1; this.scheduleOnce(() => { this.stopTap = false }, 0.5) }, this) } else { // 普通郵件,没有积分或物品 FGUtil.getControl(contentPanle, "showReward").selectedIndex = 0; FGUtil.getControl(contentPanle, "showTime").selectedIndex = 0; FGUtil.getControl(contentPanle, "isReceived").selectedIndex = 0; } // 刪除郵件 let delBtn = FGUtil.getButton(contentPanle, "delete"); delBtn.clearClick(); delBtn.onClick(() => { // 星標郵件刪除需要提示 if (contentData.isStar) { FGAlert.show("是否刪除星標郵件,刪除後將不可恢復?", () => { FGAlert.hide(); }, () => { if (this.stopTap) { MsgAlert.addMsg("您操作過於頻繁"); return } this.stopTap = true FGAlert.hide(); GameModel.send("c2s_mail_action", { action: 1, mailId: contentData.mailId }) this.NormalEmailData.splice(idx, 1) // 星標數量為0,則切換為非星標郵件顯示 if (this.NormalEmailData.length == 0 && this.isShowStarEmail) this.exchangeEmailData(); else this.changeEmailListNum(); this.scheduleOnce(() => { this.stopTap = false }, 0.5) }) return; } if (this.stopTap) { MsgAlert.addMsg("您操作過於頻繁"); return } this.stopTap = true GameModel.send("c2s_mail_action", { action: 1, mailId: contentData.mailId }) this.NormalEmailData.splice(idx, 1) this.changeEmailListNum(); this.scheduleOnce(() => { this.stopTap = false }, 0.5) }, this) FGUtil.getComponent(contentPanle, "n4").asButton.clearClick(); FGUtil.getComponent(contentPanle, "n5").asButton.clearClick(); FGUtil.getComponent(contentPanle, "n4").asButton.onClick(this.convertStarEmail, this) FGUtil.getComponent(contentPanle, "n5").asButton.onClick(this.converNoStarEmail, this) } convertStarEmail() { // console.log(SKDataUtil.clone(this.NormalEmailData)) this.NormalEmailData[this.selectEmailIdx].isStar = true; this.backupsEmailData.push(this.NormalEmailData.splice(this.selectEmailIdx, 1)[0]) this.changeEmailListNum(); MsgAlert.addMsg("標記成功,此郵件已移入星標郵件中"); } converNoStarEmail() { this.NormalEmailData[this.selectEmailIdx].isStar = false; this.backupsEmailData.push(this.NormalEmailData.splice(this.selectEmailIdx, 1)[0]) // 星標數量為0,則切換為非星標郵件顯示 if (this.NormalEmailData.length == 0 && this.isShowStarEmail) this.exchangeEmailData(); else this.changeEmailListNum(); MsgAlert.addMsg("取消成功,此郵件已移出星標郵件"); } /** * 一鍵領取所有獎勵 */ oneKeyReceiveAllReward() { if (this.stopTap) { MsgAlert.addMsg("您操作過於頻繁"); return } this.stopTap = true var count = 0; for (let i in this.NormalEmailData) { if (this.NormalEmailData[i].isReward) { // this.NormalEmailData[i].type = "email2" // this.NormalEmailData[i].receive = true count++; } } if (count > 0) { // this.refreshEmailList(); // this.onEmailClick(null, this.selectEmailIdx) GameModel.send("c2s_mail_action", { action: 2 }) } else MsgAlert.addMsg("大俠,當前暫無可領取的獎勵") this.scheduleOnce(() => { this.stopTap = false }, 0.5) } /** * 一鍵刪除所有郵件 */ oneKeyDeleteAllEmail() { var count = 0; for (let i = this.NormalEmailData.length - 1; i >= 0; i--) { if (this.NormalEmailData[i].type != "bang" && (!this.NormalEmailData[i].isReward || (this.NormalEmailData[i].isReward && this.NormalEmailData[i].receive))) { count++; break; } } if (count == 0) { MsgAlert.addMsg("大俠,當前暫無可刪除的郵件") return; } FGAlert.show("確定將已領獎的非星標郵件一鍵刪除?", () => { FGAlert.hide(); }, () => { if (this.stopTap) { MsgAlert.addMsg("您操作過於頻繁"); return } this.stopTap = true FGAlert.hide(); for (let i = this.NormalEmailData.length - 1; i >= 0; i--) { if (this.NormalEmailData[i].type != "bang" && (!this.NormalEmailData[i].isReward || (this.NormalEmailData[i].isReward && this.NormalEmailData[i].receive))) { this.NormalEmailData.splice(i, 1) continue; } } GameModel.send("c2s_mail_action", { action: 3 }) this.changeEmailListNum(); this.scheduleOnce(() => { this.stopTap = false }, 0.3) }) } /** * 添加關閉事件 */ pushCloseEvent(item: fairygui.GComponent, target: fairygui.GComponent, call: Function = null) { item.clearClick(); item.onClick(() => { call && call() FGUtil.dispose(target); }, this) } tipNo() { MsgAlert.addMsg("暫未開放") } openFriend() { var mainui = cc.find("Canvas/MainUI") if (mainui) { let mlg = mainui.getComponent("MainUI") if (mlg) mlg.onFriendBtnClicked() } FGUtil.dispose(this.contactPanel) this.contactPanel = null } /** * 造假郵件 */ createBangEmail() { return var idxArr = Object.keys(GameModel.conf_npc) var rand, num = Math.floor(Math.random() * 5 + 1); var str = ""; for (let i = 0; i < num; i++) { rand = Math.floor(Math.random() * idxArr.length) str += GameModel.conf_npc[idxArr[rand]].talk } let item = { from: "幫派郵件", signer: "系統管理員", content: str, date: "2021-4-29" } this.bangEmailData.push(item) if (this.NormalEmailData && this.NormalEmailData.length > 0) { if (this.NormalEmailData[0].type != "bang") this.NormalEmailData.unshift({ type: "bang", from: "幫派郵件", date: "2021-4-29" }) } else { this.NormalEmailData = [] this.NormalEmailData.push({ type: "bang", from: "幫派郵件", date: "2021-4-29" }) } this.changeEmailListNum(); } createNormalEmail() { return var idxArr = Object.keys(GameModel.conf_npc) var rand = Math.floor(Math.random() * idxArr.length) let item = { type: "email0", isStar: false, from: GameModel.conf_npc[idxArr[rand]].name, signer: GameModel.conf_npc[idxArr[rand]].name, content: GameModel.conf_npc[idxArr[rand]].talk, date: "2021-4-29" } this.NormalEmailData.push(item) this.changeEmailListNum(); } createRewardEmail() { return var idxArr = Object.keys(GameModel.conf_npc) var rand = Math.floor(Math.random() * idxArr.length) var rand2 = Math.floor(Math.random() * 7) + 1 var rand3 = rand2 % 3 + 1; var list = [] for (let i = 0; i < rand2; i++) { if (i % rand3 == 1) list.push({ id: 90002, num: 999999, type: "score" }) else list.push({ id: 90002, num: 999999, type: "item" }) } let item = { type: "email1", isStar: false, isReward: true, rewardList: list, from: GameModel.conf_npc[idxArr[rand]].name, signer: GameModel.conf_npc[idxArr[rand]].name, content: GameModel.conf_npc[idxArr[rand]].talk, date: "2021-4-29", countDown: 99, receive: false } this.NormalEmailData.push(item) this.changeEmailListNum(); } }