SamsaraGame/assets/Script/ts/ChatPanel_new.ts

674 lines
22 KiB
TypeScript
Raw Permalink Normal View History

2025-04-24 17:03:28 +08:00
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 = /(?<!color=)#(?:[0-9]{1,3}|1000)(?!([0-9]|[a-f]))/;
let pos = msg.search(patt);
while (pos != -1) {
let matchstr = msg.match(patt);
msg = msg.replace(matchstr[0], '[' + matchstr[0].substr(1) + ']');
pos = msg.search(patt);
}
// console.log(msg)
let input = FGUtil.getTextInput(this.MainPanel, "alert/input");
input.text = "";
this.mSendIds = [];
FGUtil.getControl(this.MainPanel, "alert/clear/showClear").selectedIndex = 0;
var scale = -1;
if (this.curChatType == 4)
scale = 0;
GameModel.send("c2s_game_chat", {
scale: scale,
msg: msg,
})
}
chooseCur() {
this.curChatType = 0;
this.refreshChatList();
}
chooseMy() {
this.curChatType = 1;
this.refreshChatList();
}
chooseTeam() {
this.curChatType = 2;
this.refreshChatList();
}
chooseBang() {
this.curChatType = 3;
if (GameModel.player.bangid == 0)
FGUtil.getControl(this.MainPanel, "alert/nobang").selectedIndex = 1;
else
FGUtil.getControl(this.MainPanel, "alert/nobang").selectedIndex = 0;
this.refreshChatList();
}
chooseWorld() {
this.curChatType = 4;
console.log(this.chatContentObj)
this.refreshChatList();
}
chooseSys() {
this.curChatType = 5;
this.refreshChatList();
}
getListItemResource(idx: number) {
// 自己
if (this.curChatContetnList[idx].roleid == GameModel.player.roleid)
return "ui://main_ui/player_chat_item_right";
// 他人
else
return "ui://main_ui/player_chat_item_left";
}
initPlayerChatItem(idx, obj: fairygui.GObject) {
let item = obj.asCom;
let info = this.curChatContetnList[idx];
let coms = item.node.getComponents("customRich");
let MsgLg: CustomRich = null;
if (coms.length == 0)
MsgLg = item.node.addComponent("customRich");
else
MsgLg = coms[0];
// 初始化Msg
MsgLg.initInfo(info.msg, FGUtil.getRichTextField(item, "title/title"));
// 頭像
FGUtil.getLoader(item, "head").texture = GameModel.getRoleHead(info.resid);
// 名字
FGUtil.getTextField(item, "name").text = info.name;
// 顯示頭像框
this.setHeadBorder(FGUtil.getComponent(item, "head_border"), info.portrait ? info.portrait : 555100);
// 顯示聊天框
FGUtil.getLoader(item, "chat_border").url = `ui://main_ui/chat_bell`;
}
refreshChatList() {
if (!SKUIUtil.isFGUIValid(this.MainPanel)) return;
FGUtil.getControl(this.MainPanel, "alert/page").selectedIndex = this.curChatType;
if (this.curChatType == -1) return;
if (this.curChatType == 0) return;
if (this.curChatType == 1) return;
var contentList = FGUtil.getList(this.MainPanel, "alert/list");
if (this.curChatType == 2) {
this.curChatContetnList = this.chatContentObj.team;
contentList.numItems = this.curChatContetnList.length;
if (contentList.scrollPane.percY == 1)
contentList.scrollToView(this.curChatContetnList.length - 1);
return;
};
if (this.curChatType == 3) {
this.curChatContetnList = this.chatContentObj.bang;
contentList.numItems = this.curChatContetnList.length;
if (contentList.scrollPane.percY == 1)
contentList.scrollToView(this.curChatContetnList.length - 1);
return;
};
if (this.curChatType == 4) {
this.curChatContetnList = this.chatContentObj.world;
contentList.numItems = this.curChatContetnList.length;
if (contentList.scrollPane.percY == 1)
contentList.scrollToView(this.curChatContetnList.length - 1);
return;
};
if (this.curChatType == 5) {
this.curChatContetnList = this.chatContentObj.sys;
contentList.numItems = this.curChatContetnList.length;
if (contentList.scrollPane.percY == 1)
contentList.scrollToView(this.curChatContetnList.length - 1);
return;
};
}
addTeamMsg() {
var data = {
bangname: "",
chargesum: 0,
level: 105,
msg: "加入隊伍把1/5[img]ui://main_ui/join_team_btn@joinTeam#1688[/img]",
name: "南夢越",
onlyid: 11787,
portrait: 0,
chatBorder: "bell",
relive: 1,
resid: 1111,
roleid: 462,
scale: 0,
teamid: 0,
voice: -1,
}
this.chatContentObj.team.push(data);
this.refreshChatList();
}
addBangMsg() {
var data = {
bangname: "測試幫派",
chargesum: 0,
level: 105,
msg: "幫派聊天信息內容",
name: "南夢越",
onlyid: 11787,
portrait: 0,
relive: 1,
resid: 1111,
roleid: 462,
scale: 0,
teamid: 0,
voice: -1,
}
this.chatContentObj.bang.push(data);
this.refreshChatList();
}
addWorldMsg() {
var R = Math.floor(Math.random() * 5)
var str = "世界聊天[11]信息內容[3]"
for (let i = 0; i < R; i++) {
str += str
}
var hb = 555100 + R;
var roleid = Math.random() < 0.5 ? 11787 : GameModel.player.roleid
var data = {
bangname: "",
chargesum: 0,
level: 105,
msg: str,
name: "南夢越",
onlyid: roleid,
portrait: hb,
chatBorder: "bell",
relive: 1,
resid: 1111,
roleid: 462,
scale: 0,
teamid: 0,
voice: -1
}
this.chatContentObj.world.push(data);
this.refreshChatList();
}
addSysMsg() {
var data = {
bangname: "",
chargesum: 0,
level: 105,
msg: "系統聊天信息內容",
name: "",
onlyid: 11787,
portrait: 0,
relive: 1,
resid: 1111,
roleid: 462,
scale: 0,
teamid: 0,
voice: -1,
}
this.chatContentObj.sys.push(data);
this.refreshChatList();
}
changeOpacity() {
if (this.isOpacity) {
// 變成不透明
var trans: fgui.Transition = FGUtil.getComponent(this.MainPanel, "alert").getTransition("show");
var trans2: fgui.Transition = FGUtil.getComponent(this.MainPanel, "alert/opacityBtn").getTransition("hide");
trans.play();
trans2.play();
this.isOpacity = false;
} else {
var trans: fgui.Transition = FGUtil.getComponent(this.MainPanel, "alert").getTransition("hide");
var trans2: fgui.Transition = FGUtil.getComponent(this.MainPanel, "alert/opacityBtn").getTransition("show");
trans.play();
trans2.play();
this.isOpacity = true;
}
}
showPropView() {
if (FGUtil.getComponent(this.MainPanel, "propBg").visible) return;
var trans: fgui.Transition = this.MainPanel.getTransition("show");
trans.play();
FGUtil.getComponent(this.MainPanel, "propBg").visible = true;
}
hidePropView() {
if (!FGUtil.getComponent(this.MainPanel, "propBg").visible) return;
var trans: fgui.Transition = this.MainPanel.getTransition("hide");
trans.play();
this.scheduleOnce(() => {
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;
}
}