2025-04-24 17:03:28 +08:00

664 lines
23 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}