import { HeadBorderUtil } from "./appearance/HeadBorderUtil"; import GameModel from "./core/GameModel"; import GameUtil from "./core/GameUtil"; import ItemUtil from "./core/ItemUtil"; import CustomRich from "./customRich"; 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"; export default class ChatPanel extends cc.Component { /** * 單例實例 */ public static Instance: ChatPanel = null; /** * 面板 */ MainPanel: fgui.GComponent = null; /** * 是否透明 */ isOpacity: boolean = false; /** * 聊天可以發送的道具列表 */ goodsList: any = []; /** * 聊天可以發送的寵物列表 */ petsList: any = []; /** * 聊天內容對象 */ chatContentObj: any = { cur: [], my: [], team: [], bang: [], world: [], sys: [], }; /** * 當前聊天頻道 */ curChatType: number = 4; /** * 當天聊天頻道內容 */ curChatContetnList: any = []; /** * 發送的id列表 */ mSendIds: any = []; onLoad() { if (ChatPanel.Instance === null) { ChatPanel.Instance = this; } else { this.destroy(); return; } } /** * 打開聊天面板 */ openChatPanel(type: number = 4) { if (!SKUIUtil.isFGUIValid(this.MainPanel)) { this.MainPanel = FGUtil.create("main_ui", "chat_panel"); FGUtil.root().addChild(this.MainPanel); console.log(FGUtil.root()) console.log(FGUtil.root().node) this.MainPanel.makeFullScreen(); this.isOpacity = false; var trans: fgui.Transition = this.MainPanel.getTransition("enter"); trans.play(); } FGUtil.getButton(this.MainPanel, "alert/close").onClick(this.closeChatPanel, this) FGUtil.getButton(this.MainPanel, "alert/n3").onClick(this.chooseCur, this) FGUtil.getButton(this.MainPanel, "alert/n4").onClick(this.chooseMy, this) FGUtil.getButton(this.MainPanel, "alert/n5").onClick(this.chooseTeam, this) FGUtil.getButton(this.MainPanel, "alert/n6").onClick(this.chooseBang, this) FGUtil.getButton(this.MainPanel, "alert/n7").onClick(this.chooseWorld, this) FGUtil.getButton(this.MainPanel, "alert/n8").onClick(this.chooseSys, this) FGUtil.getButton(this.MainPanel, "alert/team1").onClick(this.addTeamMsg, this) FGUtil.getButton(this.MainPanel, "alert/bang1").onClick(this.addBangMsg, this) FGUtil.getButton(this.MainPanel, "alert/world1").onClick(this.addWorldMsg, this) FGUtil.getButton(this.MainPanel, "alert/sys1").onClick(this.addSysMsg, this) FGUtil.getButton(this.MainPanel, "alert/send").onClick(this.sendMsg, this); FGUtil.getComponent(this.MainPanel, "alert/opacityBtn").onClick(this.changeOpacity, this); FGUtil.getButton(this.MainPanel, "alert/emo_btn").onClick(this.showPropView, this); FGUtil.getComponent(this.MainPanel, "propBg").onClick(this.hidePropView, this); FGUtil.getTextInput(this.MainPanel, "alert/input").onClick(this.hidePropView, this); FGUtil.getTextInput(this.MainPanel, "alert/input").on("text-changed", this.showClear, this); FGUtil.getButton(this.MainPanel, "alert/clear").onClick(this.clearEdit, this); var contentList = FGUtil.getList(this.MainPanel, "alert/list"); contentList.itemRenderer = this.initPlayerChatItem.bind(this); contentList.itemProvider = this.getListItemResource.bind(this); contentList.setVirtual(); if (type == 2) this.chooseTeam(); if (type == 3) this.chooseBang(); if (type == 4) this.chooseWorld(); if (type == 5) this.chooseSys(); this.initPropPanel(); } showClear() { if (!SKUIUtil.isFGUIValid(this.MainPanel)) return; let input = FGUtil.getTextInput(this.MainPanel, "alert/input"); let tempStr = ""; if (input) tempStr = input.text; if (tempStr == "") FGUtil.getControl(this.MainPanel, "alert/clear/showClear").selectedIndex = 0; else FGUtil.getControl(this.MainPanel, "alert/clear/showClear").selectedIndex = 1; } clearEdit() { if (!SKUIUtil.isFGUIValid(this.MainPanel)) return; let input = FGUtil.getTextInput(this.MainPanel, "alert/input"); let tempStr = ""; if (input) tempStr = input.text; if (tempStr == "") input.requestFocus(); else { input.text = ""; this.mSendIds = []; FGUtil.getControl(this.MainPanel, "alert/clear/showClear").selectedIndex = 0; } } initPropPanel() { this.initEmoData(); this.initGoodsData(); this.initPetData(); } addMsg(info) { console.log(info) if (GameModel.player.mapid == 4004 && info.scale == 3) { if (GameModel.player.teamid != info.teamid) return; } // 0世界,1隊伍,2幫派,3系統,5系統撤回,6快訊 if (info.scale == 0) { this.chatContentObj.world.push(info); this.refreshChatList(); return; } if (info.scale == 1) { this.chatContentObj.team.push(info); this.refreshChatList(); return; } if (info.scale == 2) { this.chatContentObj.bang.push(info); this.refreshChatList(); return; } if (info.scale == 3) { this.chatContentObj.sys.push(info); this.refreshChatList(); return; } } sendMsg() { if (!SKUIUtil.isFGUIValid(this.MainPanel)) return; var msg = FGUtil.getComponent(this.MainPanel, "alert/input").text; // console.log(msg); // 屏蔽玩家輸入的顏色 let colorPrefix = /\[color=#([0-9]|[a-f]){6}\]/g; let colorSuffix = /\[\/color\]/g; msg = msg.replace(colorPrefix, ""); msg = msg.replace(colorSuffix, ""); // console.log(msg) // 道具替換 let patt1 = /\[[^(@)]*?\]/; let pos1 = msg.search(patt1); while (pos1 != -1) { let matchstr = msg.match(patt1); msg = msg.replace(matchstr[0], this.mSendIds.shift()); pos1 = msg.search(patt1); } // 表情替換 let patt = /(? { FGUtil.getTextInput(this.MainPanel, "alert/input").requestFocus(); }, 0.27) FGUtil.getComponent(this.MainPanel, "propBg").visible = false; } /** * 關閉聊天面板 */ closeChatPanel() { var trans: fgui.Transition = this.MainPanel.getTransition("close"); trans.play(); this.scheduleOnce(() => { FGUtil.dispose(this.MainPanel); this.MainPanel = null; }, 0.25) } /** * 設置頭像框 * @param headBorderId */ setHeadBorder(borderCom: fgui.GComponent, headBorderId: number) { var data = HeadBorderUtil.getBorderData(headBorderId); FGUtil.getLoader(borderCom, "border").url = `ui://main_ui/${data.border}`; var LT = FGUtil.getComponent(borderCom, "LT") LT.asLoader.url = `ui://main_ui/${data.addLT}`; LT.x = data.LTPos.x; LT.y = data.LTPos.y; var LB = FGUtil.getComponent(borderCom, "LB") LB.asLoader.url = `ui://main_ui/${data.addLB}`; LB.x = data.LBPos.x; LB.y = data.LBPos.y; var RT = FGUtil.getComponent(borderCom, "RT") RT.asLoader.url = `ui://main_ui/${data.addRT}`; RT.x = data.RTPos.x; RT.y = data.RTPos.y; var RB = FGUtil.getComponent(borderCom, "RB") RB.asLoader.url = `ui://main_ui/${data.addRB}`; RB.x = data.RBPos.x; RB.y = data.RBPos.y; } // 初始化表情 initEmoData() { var emoList = FGUtil.getList(this.MainPanel, "prop/emoList"); emoList.itemRenderer = this.initEmoItem.bind(this); emoList.setVirtual(); emoList.numItems = 165; } initEmoItem(idx, obj: fairygui.GObject) { let item = obj.asCom; var iconName = ("000" + idx.toString()).substr(-3) + "0000"; FGUtil.getLoader(item, "icon").url = `ui://main_ui/${iconName}`; item.node["emoId"] = idx; item.onClick(this.tapEmo, this); } tapEmo(e: Event) { var id = 0; if (SKDataUtil.hasProperty(e.target, "emoId")) id = e.target["emoId"]; if (!SKUIUtil.isFGUIValid(this.MainPanel)) return; let input = FGUtil.getTextInput(this.MainPanel, "alert/input"); let tempStr = input.text; tempStr += `#${id}`; input.text = tempStr; } // 初始化道具 initGoodsData() { let list = []; if (GameModel.equipData) { let equipData = GameModel.equipData; for (const equip of equipData.list) { if (equipData.info[equip]) { let info = { itemid: equip, info: GameModel.equipData.info[equip], type: 1 }; list.push(info); } } for (let key in equipData.use) { if (equipData.info[equipData.use[key]]) { let info = { itemid: equipData.use[key], info: GameModel.equipData.info[equipData.use[key]], type: 1 }; list.push(info); } } } let itemList = GameModel.player.itemList; for (let itemId in itemList) { let count = SKDataUtil.valueForKey(GameModel.player.itemList, itemId); if (count != null && count > 0) { let info = { itemid: itemId, count: count, type: 0 }; list.push(info); } } this.goodsList = list; var goodsList = FGUtil.getList(this.MainPanel, "prop/goodList"); goodsList.itemRenderer = this.initGoodsItem.bind(this); goodsList.setVirtual(); goodsList.numItems = list.length; } initGoodsItem(idx, obj: fairygui.GObject) { let item = obj.asCom; let info = this.goodsList[idx]; FGUtil.getControl(item, "type").selectedIndex = info.type; FGUtil.getControl(item, "mask").selectedIndex = 0; FGUtil.getControl(item, "grade").selectedIndex = 0; FGUtil.getTextField(item, "title").text = ""; if (info.type == 0) { // 如果是道具 let data = ItemUtil.getItemData(info.itemid); // 未找到該道具信息 if (data == null) { FGUtil.getLoader(item, "icon").texture = ItemUtil.getItemIcon("1000"); return; } FGUtil.getLoader(item, "icon").url = `ui://main_ui/${data.icon}`; FGUtil.getTextField(item, "title").text = SKDataUtil.transform(info.count); item.node["info"] = data; item.node["type"] = 0; } else if (info.type == 1) { // 如果是裝備 var data = info.info; FGUtil.getLoader(item, "icon").url = `ui://main_ui/${data.Shape}`; if (ItemUtil.isBaldric(data.EIndex)) { FGUtil.getControl(item, "grade").selectedIndex = data.Grade; FGUtil.getTextField(item, "title").text = data.Grade.toString(); if (data.flag == 1 || data.BaseAttr == "[]") { FGUtil.getControl(item, "grade").selectedIndex = 0; FGUtil.getControl(item, "mask").selectedIndex = 1; FGUtil.getTextField(item, "title").text = ""; } } else { FGUtil.getControl(item, "grade").selectedIndex = 0; FGUtil.getTextField(item, "title").text = data.Grade.toString(); } item.node["info"] = data; item.node["type"] = 1; } item.onClick(this.tapGoods, this); } tapGoods(e: Event) { if (!SKDataUtil.hasProperty(e.target, "info") || !SKDataUtil.hasProperty(e.target, "type")) return; if (!SKUIUtil.isFGUIValid(this.MainPanel)) return; let info = e.target["info"]; let type = e.target["type"]; let link = ""; let input = FGUtil.getTextInput(this.MainPanel, "alert/input"); let tempStr = input.text; if (type == 1) { // 裝備 link = '[' + info.EName + '@' + info.EquipID + '@' + 1 + ']'; tempStr += `[${info.EName}]`; } else { // 道具 link = '[' + info.name + '@' + info.id + '@' + 2 + ']'; tempStr += `[${info.name}]`; } this.mSendIds.push(link); input.text = tempStr; } // 初始化寵物 initPetData() { let petInfo = GameModel.player.petInfo; this.petsList = []; for (let index = 0; index < petInfo.list.length; index++) { let pinfo = petInfo.list[index]; if (!pinfo || !pinfo.petid) { cc.warn(`$警告:召喚獸面板加載列表數據錯誤${index}`); continue; } this.petsList.push(pinfo) } var petsList = FGUtil.getList(this.MainPanel, "prop/petList"); petsList.itemRenderer = this.initPetsItem.bind(this); petsList.setVirtual(); petsList.numItems = this.petsList.length; } initPetsItem(idx, obj: fairygui.GObject) { let item = obj.asCom; let info = this.petsList[idx]; FGUtil.getLoader(item, "item/icon").url = `ui://main_ui/${info.resid || info.resId}`; FGUtil.getTextField(item, "name_label").text = info.name; FGUtil.getTextField(item, "level_label").text = info.relive + "轉" + info.level + "級"; FGUtil.getTextField(item, "level_label").color = GameUtil.getReliveColor(info.relive, 1); item.node["info"] = this.petsList[idx]; item.onClick(this.tapPet, this); } tapPet(e: Event) { if (!SKDataUtil.hasProperty(e.target, "info")) return; if (!SKUIUtil.isFGUIValid(this.MainPanel)) return; let info = e.target["info"]; let link = ""; let input = FGUtil.getTextInput(this.MainPanel, "alert/input"); let tempStr = input.text; link = '[' + info.name + '@' + info.petid + '@' + 3 + ']'; tempStr += `[${info.name}]`; this.mSendIds.push(link); input.text = tempStr; } }