664 lines
23 KiB
TypeScript
Raw Normal View History

2025-04-24 17:03:28 +08:00
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();
}
}