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

692 lines
19 KiB
JavaScript
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 "../../ts/core/GameModel";
import VIPUtil from "../../ts/game/role/VIPUtil";
import SKUIUtil from "../../ts/gear_2.3.4/util/SKUIUtil";
import MsgAlert from "../../ts/game/msg/MsgAlert";
import RoleMenuAlert from "../../ts/RoleMenuAlert"
let GoodsMgr = require('../../game/GoodsMgr');
let CPubFunction = require('../../game/PubFunction');
let zhufuyu = '大哥大嫂新年好! ';
cc.Class({
extends: cc.Component,
properties: {
chatItemOther: cc.Prefab,
chatItemSelf: cc.Prefab,
contentNode: cc.Node,
editbox: cc.EditBox,
bgNode: cc.Node,
progressNode: cc.Node,
joinBangNode: cc.Node,
lingdangNode: cc.Node,
inputNode: cc.Node,
preBang: cc.Prefab,
emojiContent: cc.Node,
emojiAtlas: cc.SpriteAtlas,
joinTeamBg: cc.SpriteFrame,
fontRes: cc.Font,
GmUI: cc.Prefab,
btnGmButton: cc.Prefab,
autoPlayToggle: cc.Toggle,
voiceBtn: cc.Node,
chatView: cc.Node,
},
onLoad() {
// this.node.on(cc.Node.EventType.TOUCH_START, this.touchBegan.bind(this));
this.teamItemList = [];
this.campItemList = [];
this.worldItemList = [];
this.sysItemList = [];
this.meItemList = [];
this.maxItems = 50;
this.curItemList = this.worldItemList;
this.curChatScale = 0;
this.chatItemNodes = [];
this.bgOpacity = 255;
this.isTransparent = false;
this.opacityProgress = this.progressNode.getComponent(cc.ProgressBar);
this.autoPlayToggle.isChecked = GameModel.autoWorldVoice == 1;
this.name = 'ChatPanel';
this.vecGmBtn = [];
this.mSendStr = "";
this.mSendIds = [];
},
start() {
this.mSendIds = [];
let mainUILogic = cc.find('Canvas/MainUI').getComponent('MainUI');
if (mainUILogic) {
this.voiceBtn.on(cc.Node.EventType.TOUCH_START, mainUILogic.onWorldVoiceRecord.bind(this));
this.voiceBtn.on(cc.Node.EventType.TOUCH_CANCEL, mainUILogic.onWorldVoiceRecord.bind(this));
this.voiceBtn.on(cc.Node.EventType.TOUCH_END, mainUILogic.onWorldVoiceRecord.bind(this));
}
this.chatView.getComponent("ChatView").setCallback(this.onInputCallback.bind(this));
},
onBiaoqingItemClicked(e, d) {
this.editbox.string += `[${d}]`;
},
onEditBoxEnded() {
},
onEditBoxChang() {
// if(this.editbox.string.length < 15){
// this.editbox.textLabel.horizontalAlign = cc.Label.HorizontalAlign.LEFT;
// }else{
// this.editbox.textLabel.horizontalAlign = cc.Label.HorizontalAlign.RIGHT;
// }
},
onInputCallback(data) {
if (!this.checkInput()) {
return;
}
this.mType = data.type;
if (data.type == 0) { // 表情
// this.mSendStr += ("#"+data.index)
this.mSendStr += ("[" + data.index + "]")
this.editbox.string += `#${data.index}`;
} else { // 道具
let link = '[' + data.name + '@' + data.id + '@' + data.type + ']'
this.mSendStr += link;
this.editbox.string += `[${data.name}]`;
// let info = {};
// info.id = data.id+'@123';
// info.name = data.name;
// info.poss = [];
this.mSendIds.push(link);
}
this.onEditBoxChang();
},
checkInput() {
if (this.mSendIds.length >= 5) {
MsgAlert.addMsg("最多發送5個鏈接");
return false;
}
return true;
},
hideEmoji() {
if (this.isEmojiShow) {
this.isEmojiShow = false;
this.node.stopAllActions();
this.node.runAction(cc.moveTo(0.1, cc.v2(this.node.x, 0)));
}
},
editingDidBegan(e, d) {
this.hideEmoji();
},
loadListInfo(list) {
for (const info of list) {
if (info.scale == 0) {
this.worldItemList.push(info);
} else if (info.scale == 1) {
this.teamItemList.push(info);
} else if (info.scale == 2) {
this.campItemList.push(info);
} else if (info.scale == 3) {
this.sysItemList.push(info);
}
// else if (info.scale == 7) {
// this.meItemList.push(info);
// }
}
this.showListInfo();
},
addListInfo(info) {
// cc.log(info);
// 0世界1隊伍2幫派3系統5系統撤回6快訊
if (info.scale == 0) {
this.worldItemList.push(info);
} else if (info.scale == 1) {
this.teamItemList.push(info);
} else if (info.scale == 2) {
this.campItemList.push(info);
} else if (info.scale == 3) {
this.sysItemList.push(info);
}
// else if (info.scale == 7) {
// this.meItemList.push(info);
// }
if (info.scale == 5) {
for (let i = 0; i < this.worldItemList.length; i++) {
const chatinfo = this.worldItemList[i];
if (chatinfo.roleid == info.roleid) {
chatinfo.msg = zhufuyu;
}
}
for (let i = 0; i < this.campItemList.length; i++) {
const chatinfo = this.campItemList[i];
if (chatinfo.roleid == info.roleid) {
chatinfo.msg = zhufuyu;
}
}
for (let i = 0; i < this.teamItemList.length; i++) {
const chatinfo = this.teamItemList[i];
if (chatinfo.roleid == info.roleid) {
chatinfo.msg = zhufuyu;
}
}
this.fixChatItemNode(info.roleid);
return;
}
if (this.curChatScale == info.scale) {
this.addChatItem(info);
}
if (this.curItemList.length > this.maxItems) {
this.delFirstChatItem();
}
if (this.worldItemList.length > this.maxItems) {
this.worldItemList.shift();
}
if (this.teamItemList.length > this.maxItems) {
this.teamItemList.shift();
}
if (this.campItemList.length > this.maxItems) {
this.campItemList.shift();
}
if (this.sysItemList.length > this.maxItems) {
this.sysItemList.shift();
}
if (this.meItemList.length > this.maxItems) {
this.meItemList.shift();
}
},
tipNo() {
MsgAlert.addMsg("暫未開放")
},
showListInfo() {
this.inputNode.active = true;
this.joinBangNode.active = false;
this.lingdangNode.active = false;
this.contentNode.destroyAllChildren();
this.chatItemNodes = [];
this.contentNode.height = this.contentNode.parent.height;
// for (const info of this.curItemList) {
// this.addChatItem(info);
// }
if (this.curItemList.length > 0) {
// 是否反向添加
var reverse = this.curItemList.length > 6 ? true : false
if (reverse) {
// 反向
let index = this.curItemList.length - 1;
this.schedule(() => {
this.addChatItem(this.curItemList[index], reverse, index == 0);
index--;
}, 0.01, this.curItemList.length);
} else {
let index = 0;
this.schedule(() => {
this.addChatItem(this.curItemList[index], reverse);
index++;
}, 0.01, this.curItemList.length);
}
}
},
delFirstChatItem() {
let delItem = this.chatItemNodes.shift();
if (delItem) {
this.contentNode.height -= delItem.height;
for (const item of this.chatItemNodes) {
item.y += delItem.height;
}
delItem.destroy();
}
},
addChatItem(info, reverse = false, first = false) {
if (info == null) {
return;
}
let chatItem = null;
let vipLevel = VIPUtil.getVipLevel(info.chargesum);
if (this.curChatScale == 3) {
chatItem = new cc.Node();
chatItem.parent = this.contentNode;
let richText = chatItem.addComponent('CustomRichText');
richText.maxWidth = this.contentNode.width - 6;
richText.fontSize = 18;
richText.font = this.fontRes;
richText.lineHeight = 20;
richText.type = 1;
richText.vipLevel = vipLevel;
richText.rolename = info.name;
richText.scale = info.scale;
richText.emojiAtlas = this.emojiAtlas;
richText.string = info.msg;
chatItem.x = -this.contentNode.width / 2 + 3;
chatItem.color = cc.color(200, 0, 0, 255);
} else {
if (info.roleid == GameModel.player.roleid) {
chatItem = cc.instantiate(this.chatItemSelf);
} else {
chatItem = cc.instantiate(this.chatItemOther);
cc.find('HeadSprite', chatItem).getComponent(cc.Button).clickEvents.push(CPubFunction
.CreateEventHandler(this.node, "ChatPanel", "OnClickSpeaker", info));
}
chatItem.parent = this.contentNode;
chatItem.getComponent('ChatItem').loadInfo(info);
chatItem.x = 0;
chatItem.roleid = info.roleid;
chatItem.voiceid = info.voice;
}
//聊天記錄從上面添加
if (!reverse) {
// 正向
chatItem.y = 0;
if (this.chatItemNodes.length > 0) {
let preItem = this.chatItemNodes[this.chatItemNodes.length - 1];
chatItem.y = preItem.y - preItem.height;
}
if (chatItem.y - chatItem.height < -this.contentNode.height) {
this.contentNode.height = chatItem.height - chatItem.y;
}
this.chatItemNodes.push(chatItem);
if (this.contentNode.y > this.contentNode.height - this.contentNode.parent.height - chatItem
.height - 20) {
this.contentNode.y = this.contentNode.height - this.contentNode.parent.height;
}
} else {
// 反向
if (this.chatItemNodes[0]) {
// 不是倒數第一個
chatItem.y = this.chatItemNodes[0].y + chatItem.height;
} else {
// 是倒數第一個
chatItem.y = -this.contentNode.height + chatItem.height;
}
this.chatItemNodes.unshift(chatItem);
if (this.contentNode.y > this.contentNode.height - this.contentNode.parent.height - chatItem
.height - 20) {
this.contentNode.y = this.contentNode.height - this.contentNode.parent.height;
}
if (first) {
// console.log(this.chatItemNodes)
if (this.chatItemNodes[0].y != 0) {
var offY = this.chatItemNodes[0].y - 0
for (const item of this.chatItemNodes) {
item.y -= offY;
}
this.contentNode.height = -this.chatItemNodes[this.chatItemNodes.length - 1].y + this
.chatItemNodes[this.chatItemNodes.length - 1].height;
this.contentNode.height = this.contentNode.height < this.contentNode.parent.height ? this
.contentNode.parent.height : this.contentNode.height;
if (this.contentNode.height > this.contentNode.parent.height) {
this.contentNode.y = this.contentNode.height - this.contentNode.parent.height;
}
}
}
}
/**
* 聊天記錄從下面開始顯示,不要刪
*/
// let blankHeight = this.contentNode.height;
// if (this.chatItemNodes[0]) {
// blankHeight = -this.chatItemNodes[0].y;
// }
// if (chatItem.height > blankHeight) {
// this.contentNode.height += chatItem.height - blankHeight;
// for (const item of this.chatItemNodes) {
// item.y += blankHeight;
// }
// }
// else {
// for (const item of this.chatItemNodes) {
// item.y += chatItem.height;
// }
// }
// chatItem.y = -this.contentNode.height + chatItem.height
// this.chatItemNodes.push(chatItem);
// if (this.contentNode.y > this.contentNode.height - this.contentNode.parent.height - chatItem.height - 20) {
// this.contentNode.y = this.contentNode.height - this.contentNode.parent.height;
// }
},
fixChatItemNode(roleid) {
for (const chatitem of this.chatItemNodes) {
if (chatitem.roleid == roleid) {
chatitem.getComponent('ChatItem').setMsg(zhufuyu);
}
}
},
OnClickSpeaker(e, info) {
//console.log(info)
RoleMenuAlert.show(info, true)
return;
SKUIUtil.destroyList(this.vecGmBtn);
let goGmUI = CPubFunction.CreateSubNode(this.node, {
nX: 0,
nY: 0
}, this.GmUI, 'GmUI');
let goContent = cc.find('ScrollView/view/content', goGmUI);
cc.find('btnClose', goGmUI).getComponent(cc.Button).clickEvents.push(CPubFunction.CreateEventHandler(
this.node, "ChatPanel", 'CloseGmUI', info));
cc.find('nodPlayerInfo/picPlayerAvater', goGmUI).getComponent(cc.Sprite).spriteFrame = GameModel
.getRoleHead(info.resid);
cc.find('nodPlayerInfo/labID', goGmUI).getComponent(cc.Label).string = info.roleid;
cc.find('nodPlayerInfo/labName', goGmUI).getComponent(cc.Label).string = info.name;
let menu = [{
name: '加入隊伍',
fun: 'ApplyJoint'
}, {
name: '邀請入隊',
fun: 'InviteTeam'
}, {
name: '添加好友',
fun: 'AddFriend'
}, {
name: '禁言',
fun: 'ShutUp'
}, {
name: '封號',
fun: 'KickOff'
}, {
name: '封IP',
fun: 'FreezeIP'
}, {
name: '封設備',
fun: 'FreezeMAC'
}];
let myPlayer = GameModel.player;
for (let key in menu) {
if (myPlayer.gmlevel < 1 && menu[key].name == '禁言')
continue;
if (myPlayer.gmlevel < 1 && menu[key].name == '封號')
continue;
if (myPlayer.gmlevel < 15 && menu[key].name == '封IP')
continue;
if (myPlayer.gmlevel < 30 && menu[key].name == '封設備')
continue;
// 自已有隊,對方有隊不能加入隊伍
if (myPlayer.teamid != 0 && info.teamid == 0 && menu[key].name == '加入隊伍') {
continue;
}
if ((myPlayer.teamid == 0 && info.teamid != 0) && menu[key].name == '邀請入隊') {
continue;
}
let btnGmButton = CPubFunction.CreateSubNode(goContent, {
nX: 0,
nY: 0 - this.vecGmBtn.length * 55
}, this.btnGmButton, 'btnGmButton');
cc.find('Label', btnGmButton).getComponent(cc.Label).string = menu[key].name;
btnGmButton.getComponent(cc.Button).clickEvents.push(CPubFunction.CreateEventHandler(this.node,
"ChatPanel", menu[key].fun, info));
this.vecGmBtn.push(btnGmButton);
}
goContent.height = Math.max(goContent.height, this.vecGmBtn.length * 60 + 10);
},
//zfy 請求 紅包列表
onworldBtnClick() {
// //打開UI
GameModel.send('c2s_world_reward_list');
this.hideEmoji();
},
CloseGmUI(e, d) {
CPubFunction.FindAndDeleteNode(this.node, 'GmUI');
},
ShutUp(e, info) {
GameModel.send('c2s_player_shutup', {
nRoleID: info.roleid
});
this.CloseGmUI(0, 0);
},
KickOff(e, info) {
GameModel.send('c2s_kick_off', {
nRoleID: info.roleid
});
this.CloseGmUI(0, 0);
},
FreezeIP(e, info) {
GameModel.send('c2s_freeze_ip', {
nRoleID: info.roleid
});
this.CloseGmUI(0, 0);
},
FreezeMAC(e, info) {
GameModel.send('c2s_freeze_mac', {
nRoleID: info.roleid
});
this.CloseGmUI(0, 0);
},
ApplyJoint(e, info) {
GameModel.send('c2s_requst_team', {
roleid: GameModel.player.roleid,
teamid: info.teamid
});
this.CloseGmUI(0, 0);
},
InviteTeam(e, info) {
GameModel.send('c2s_team_invite', {
toroleid: info.roleid,
});
this.CloseGmUI(0, 0);
},
AddFriend(e, info) {
GameModel.send('c2s_add_friend', {
roleid: info.roleid
});
this.CloseGmUI(0, 0);
},
onToggleClicked(e, param) {
this.contentNode.parent.height = 500;
this.autoPlayToggle.node.active = false;
if (param == 'team') {
this.curChatScale = 1;
this.curItemList = this.teamItemList;
this.showListInfo();
} else if (param == 'world') {
this.curChatScale = 0;
this.curItemList = this.worldItemList;
this.showListInfo();
this.autoPlayToggle.node.active = true;
this.lingdangNode.active = true;
} else if (param == 'camp') {
this.curChatScale = 2;
this.curItemList = this.campItemList;
this.showListInfo();
if (GameModel.player.bangid == 0) {
this.joinBangNode.active = true;
this.inputNode.active = false;
return;
}
} else if (param == 'system') {
this.curChatScale = 3;
this.curItemList = this.sysItemList;
this.contentNode.parent.height = 560;
this.showListInfo();
this.inputNode.active = false;
}
// else if (param == 'self') {
// this.curChatScale = 7;
// this.curItemList = this.meItemList;
// this.contentNode.parent.height = 560;
// this.showListInfo();
// this.inputNode.active = false;
// }
else {
this.curChatScale = -1;
this.curItemList = [];
this.showListInfo();
this.inputNode.active = false;
}
},
onButtonClick(event, param) {
if (param == 'close') {
this.node.destroy();
} else if (param == 'emoji') {
if (!this.isEmojiShow) {
this.isEmojiShow = true;
this.node.stopAllActions();
this.node.runAction(cc.moveTo(0.1, cc.v2(this.node.x, 250)));
}
} else if (param == 'send') {
if (this.editbox.string.length == 0) {
return;
}
let str = this.editbox.string;
// if (str.substr(0, 1) == ':') {
// if (str.substr(1, 1) == '+') {
// GoodsMgr.addItem(str.substr(2));
// } else {
// GoodsMgr.subItem(str.substr(2));
// }
// }
this.hideEmoji();
let msg = this.editbox.string;
if (msg[0] == '/') {
let str = msg.substr(1, msg.length);
let command = str.split(',');
GameModel.send('gm_command', {
commands: command
});
this.node.destroy();
return;
}
// let flitlist = GameDefine.limitWordList;
// for (let i = 0; i < flitlist.length; i++) {
// const fword = flitlist[i];
// if (msg.indexOf(fword) != -1) {
// msg = msg.replace(new RegExp(fword, 'g'), '*');
// }
// }
let msgstr = this.editbox.string;
let patt1 = /\[[^(@)]*?\]/;
let pos1 = msgstr.search(patt1);
while (pos1 != -1) {
let matchstr = msgstr.match(patt1);
msgstr = msgstr.replace(matchstr[0], this.mSendIds.shift());
pos1 = msgstr.search(patt1);
}
// cc.log(msgstr);
let patt = /(?<!color=)#(?:[0-9]{1,3}|1000)(?!([0-9]|[a-f]))/;
let pos = msgstr.search(patt);
while (pos != -1) {
let matchstr = msgstr.match(patt);
msgstr = msgstr.replace(matchstr[0], '[' + matchstr[0].substr(1) + ']');
pos = msgstr.search(patt);
}
// cc.log(this.mSendStr);
GameModel.send('c2s_game_chat', {
scale: this.curChatScale,
msg: msgstr,
});
this.editbox.string = '';
this.mSendIds = [];
this.mSendStr = "";
// let info = {
// roleid: GameModel.player.roleid,
// scale: 0, // 0,世界 1,隊伍 2,幫派 3 系統 5 系統撤回
// msg: msgstr,
// name: "yryrur",
// // resid: 6,
// // teamid: 7,
// // voice: 8,
// // relive: 9,
// chargesum: 100000,
// };
// this.addChatItem(info);
} else if (param == 'opacity') {
this.isTransparent = !this.isTransparent;
if (!this.isTransparent) {
cc.find('handleNode/handle', this.progressNode).active = false;
} else if (this.bgNode.opacity <= 155) {
cc.find('handleNode/handle', this.progressNode).active = true;
}
} else if (param == 'joinbang') {
if (cc.find('Canvas').getChildByName('BangPanel')) {
cc.find('Canvas').getChildByName('BangPanel').destroy();
}
let bang = cc.instantiate(this.preBang);
bang.name = 'BangPanel';
bang.parent = cc.find('Canvas');
let bangid = GameModel.player.bangid;
if (bangid > 0) {
bang.getComponent('BangPanel').showBangLayer();
} else {
bang.getComponent('BangPanel').showAddlayer();
}
this.node.destroy();
}
},
update() {
if (this.isTransparent && this.bgNode.opacity > 155) {
this.bgNode.opacity -= 5;
if (this.bgNode.opacity <= 155) {
this.bgNode.opacity = 155;
cc.find('handleNode/handle', this.progressNode).active = true;
}
this.opacityProgress.progress = (255 - this.bgNode.opacity) / 100;
cc.find('handleNode', this.progressNode).y = 3 + 0.9 * this.progressNode.height * this
.opacityProgress.progress;
} else if (!this.isTransparent && this.bgNode.opacity < 255) {
this.bgNode.opacity += 5;
if (this.bgNode.opacity >= 255) {
this.bgNode.opacity = 255;
}
this.opacityProgress.progress = (255 - this.bgNode.opacity) / 100;
cc.find('handleNode', this.progressNode).y = 3 + 0.9 * this.progressNode.height * this
.opacityProgress.progress;
}
},
touchBegan(event) {
// this.hideEmoji();
},
onAutoPlayWorldToggle(e, d) {
GameModel.autoWorldVoice = this.autoPlayToggle.isChecked ? 1 : 0;
cc.sys.localStorage.setItem('auto_play_world', GameModel.autoWorldVoice);
},
changeVoicePlayedId(id) {
for (const chatitem of this.chatItemNodes) {
if (chatitem.voiceid == id) {
chatitem.getComponent('ChatItem').playVoiceAct();
break;
}
}
}
});