import ActivityMgr from "../activity/ActivityMgr"; import ActivityDefine from "../activity/ActivityDefine"; import PlayerMgr from "../object/PlayerMgr"; import Player from "../object/Player"; import NpcMgr from "./NpcMgr"; import SKDataUtil from "../gear/SKDataUtil"; import SKLogger from "../gear/SKLogger"; import GTimer from "../common/GTimer"; import { Channel } from "../role/EEnum"; import RobotMgr from "../core/RobotMgr"; export default class TeamMgr { static shared = new TeamMgr(); teamList: any; hallList: any; team_id: number; constructor() { this.teamList = {}; this.hallList = {}; this.team_id = 100000; } init() { } //创建队伍 creatTeam(player: Player, info: any) { let team: any = {}; team.teamid = ++this.team_id; team.relive = 0; team.level = 0; team.type = ''; team.content = '';//喊话内容 team.mapid = player.mapid; team.leader = player; team.playerlist = []; (info.relive) && (team.relive = info.relive); (info.level) && (team.level = info.level); (info.type) && (team.type = info.type); team.playerlist.push(player); team.partnerlist = player.getPartnerOnBattle(); team.poslist = []; team.requestlist = []; // 创建队伍时间 team.creationTime = GTimer.dateFormat(GTimer.getCurTime()); this.teamList[this.team_id] = team; player.teamid = this.team_id; player.isleader = true; player.OnEnterTeam(); this.sendInfoToMember(this.team_id); player.synInfoToWatcher(); } //申请队伍 requestTeam(p: any, teamid: any) { if (p) { if (p.teamid > 0) { p.send('s2c_notice', { strRichText: '您已经加入其它队伍,请刷新' }); return; } let team = this.teamList[teamid]; if (team == null) { p.send('s2c_notice', { strRichText: '队伍已解散,请选择其他队伍' }); return; } if (team.requestlist.length > 100) { p.send('s2c_notice', { strRichText: '申请名额已满,请选择其他队伍' }); return; } if (team.requestlist.indexOf(p.roleid) == -1) { team.requestlist.push(p.roleid); this.getTeamList(p, team.type); } p.send('s2c_notice', { strRichText: '已申请,请等待队长确认' }); team.leader.send('s2c_team_join'); } } // 加入队伍 joinTeam(p: any, teamid: any): boolean { if (p.teamid > 0) { return false; } let pTeamInfo = this.teamList[teamid]; if (pTeamInfo == null || pTeamInfo.playerlist.length >= 5) { return false; } if (p.relive < pTeamInfo.relive || p.level < pTeamInfo.level) { return false; } // 水陆大会期间,不能入队 let shuiludahui = ActivityMgr.shared.getActivity(ActivityDefine.activityKindID.ShuiLuDaHui); if (shuiludahui && shuiludahui.activity_state != ActivityDefine.activityState.Close && shuiludahui.checkSign(teamid) && shuiludahui.sldh_state > 1) { return false; } let team = this.teamList[teamid] p.pause = 0; pTeamInfo.playerlist.push(p); p.teamid = teamid; p.isleader = false; this.sendInfoToMember(teamid); // 同步组队大厅 this.hallList = this.teamList; this.teamMove(pTeamInfo, true); // p.synPosToWatcher(); pTeamInfo.leader.getTaskMgr().SynchroTaskToTeam(); return true; } matchTeam(p: any) { for (const key in this.teamList) { if (this.teamList.hasOwnProperty(key)) { let team = this.teamList[key]; if (team.playerlist.length < 5 && p.relive >= team.relive && p.level >= team.level) { this.joinTeam(p, team.teamid); return; } } } } destroyTeam(teamid: any) { let team = this.teamList[teamid]; if (team == null) return; for (let index = 0; index < team.playerlist.length; index++) { let player: Player = team.playerlist[index]; player.leaveTeam(); let teamSend: any = {}; teamSend.teamid = 0; teamSend.leader = 0; player.send('s2c_team_info', { info: SKDataUtil.toJson(teamSend,"{}") }); player.synInfoToWatcher(); } delete this.teamList[teamid]; NpcMgr.shared.deleteTeamsNpc(teamid); } //离开队伍 leaveTeam(player: Player) { let teamid = player.teamid; if (teamid == 0) { console.warn(`队伍管理:玩家[${player.roleid}:${player.name}]已离队`); return; } player.leaveTeam(); let teamSend: any = {}; teamSend.teamid = 0; teamSend.leader = 0; player.send('s2c_team_info', { info: SKDataUtil.toJson(teamSend,"{}") }); player.synInfoToWatcher(); let team = this.teamList[teamid]; if (team == null) return; let pIndex = team.playerlist.indexOf(player); if (pIndex > -1) { team.playerlist.splice(pIndex, 1); } if (team.playerlist <= 0) { delete this.teamList[teamid]; delete this.hallList[teamid]; NpcMgr.shared.deleteTeamsNpc(teamid); return; } if (pIndex == 0) { team.playerlist[0].isleader = true; team.playerlist[0].pause = 0; team.leader = team.playerlist[0]; team.partnerlist = team.playerlist[0].getPartnerOnBattle(); team.leader.synInfoToWatcher(); } this.sendInfoToMember(teamid); // 离队同步组队大厅 this.hallList = this.teamList; } //队伍移动 teamMove(team: any, synpos = false) { if(team == undefined || team == null) return; if (team.mapid == 3002 || team.mapid == 4001) return; for (let index = 1; index < team.playerlist.length; index++) { let curPos = { x: team.leader.x, y: team.leader.y }; if (team.poslist.length > index) { curPos = team.poslist[index]; } let player = team.playerlist[index]; if (player.isleader || player.pause == 1) { continue; } if (player.mapid != team.mapid) { player.changeMap({ mapid: team.mapid }); player.send('s2c_change_map', { mapid: team.mapid, pos: SKDataUtil.toJson(curPos,"{}") }); SKLogger.debug(`队友[${player.roleid}:${player.name}]跟随切换地图[${team.mapid}]`); } player.playerMove(curPos); if (synpos) { player.synPosToWatcher(); } } } setTeamPath(teamid: any, path: any) { let team = this.teamList[teamid]; if (team == null) return; team.poslist = path; this.teamMove(team); } updateTeamPos(teamid: any, pos: any) { let team = this.teamList[teamid]; if (!team) { return; } team.poslist.unshift(pos); if (team.poslist.length > 5) { team.poslist.splice(5, team.poslist.length - 5); } this.teamMove(team) } changeTeamMap(teamid: any, mapid: any) { let team = this.teamList[teamid]; if (!team) { return; } team.mapid = mapid; team.poslist = []; this.teamMove(team); } changePartner(teamid: any, p: any) { let team = this.teamList[teamid]; if (team == null) return; if (p.teamid != team.teamid || !p.isleader) { return; } team.partnerlist = p.getPartnerOnBattle(); this.sendInfoToMember(teamid); } //移交队长 changeTeamLeader(p1: any, p2: any, id: any, type: any) { if (p1.teamid != p2.teamid) { return; } // 申请队长 if (type == 2){ if (p1.isleader){ return; } const p0 = p1; p1 = p2; p2 = p0; }else { // 转移队长 if (!p1.isleader){ return; } } let team = this.teamList[id]; if (team == null) { return; } let index = team.playerlist.indexOf(p2); if (index < 0) { return; } p1.isleader = false; p2.isleader = true; p2.pause = 0; team.playerlist[0] = p2; team.playerlist[index] = p1; team.partnerlist = p2.getPartnerOnBattle(); team.leader = p2; this.sendInfoToMember(id); } //发布招募 issueRecruit(player: any,data: any){ // 取出队伍信息 let team = this.teamList[data.teamid]; if (team){ let datum = SKDataUtil.jsonBy(data.datum) // 更新队伍目标 team.type = datum.type; // 更新队伍喊话内容 team.content = datum.content; // 0转不能发喊话内容 if(player.relive < 1){ team.content = ''; } // 同步组队大厅 this.hallList[team.teamid] = team; // 同步队伍集合 this.teamList[team.teamid] = team; // 返回数据给前端 this.sendInfoToMember(team.teamid); let obj: any = {}; let list: any = []; // 队伍目标 obj.type = datum.type; // 喊话内容 obj.content = datum.content; // 0转不能发喊话内容 if(player.relive < 1){ obj.content = ''; } // 队伍ID obj.teamId = team.teamid; // 队伍当前人数 obj.num = team.playerlist.length; // 频道 obj.scale = Channel.TEAM; // 通知前端进行发布队伍频道显示 player.send('s2c_post_message',{ channel: Channel.TEAM, datum: SKDataUtil.toJson(obj,"{}") }); list.push(obj); let d: any = {}; d.scale = Channel.TEAM; d.name = player.name; d.resid = player.resid; d.roleid = player.roleid; d.teamData = list; player.send_notice("喊话已经发送"); // 广播 PlayerMgr.shared.broadcast('s2c_game_chat', d,1); // 人机申请加入队伍 // RobotMgr.shared.robotPutInTeam(team.teamid); } } dealRequest(p: any, data: any) { let team = this.teamList[data.teamid]; if (team == null) return; if (data.operation == 1) { if (p.inPrison) { team.leader.send('s2c_notice', { strRichText: '此人正在天牢反省,暂时不能入队!' }); } else { this.joinTeam(p, data.teamid); } } else { let pindex = team.requestlist.indexOf(p.roleid); if (pindex != -1) { team.requestlist.splice(pindex, 1); } } } broadcast(teamid: any, event: any, data: any, excludeid: any = 0) { let team = this.teamList[teamid]; if (team == null) return; for (let index = 0; index < team.playerlist.length; index++) { const p = team.playerlist[index]; if (p.roleid == excludeid) { continue; } p.send(event, data); } } sendInfoToMember(teamid: any, excludeid: any = 0) { let team = this.teamList[teamid]; if (team == null) return; let teamSend: any = {}; teamSend.teamid = team.teamid; teamSend.relive = team.relive; teamSend.level = team.level; teamSend.type = team.type; teamSend.mapid = team.mapid; teamSend.content = team.content; teamSend.leader = team.leader.roleid; teamSend.teamcnt = team.playerlist.length; teamSend.createTime = team.creationTime; teamSend.objlist = this.getTeamMember(teamid); this.broadcast(teamid, 's2c_team_info', { info: SKDataUtil.toJson(teamSend,"{}") }, excludeid); } getTeamMember(teamid: any): any { let team = this.teamList[teamid]; let count = 0; if (team == null) return null; let objlist = []; for (let player of team.playerlist) { objlist.push(player.toObj()); } for(let brole of team.playerlist){ let player = brole.toObj(); if(player.pause == 1){ count ++; } } if ((objlist.length - count) < 5) { let needPartnerCnt = 5 - (objlist.length - count); for (let index = 0; index < needPartnerCnt; index++) { if (team.partnerlist.length > index) { objlist.push(team.partnerlist[index].toObj()); } else { break; } } } return objlist; } getTeamLeaderPartner(teamid: any): any { let team = this.teamList[teamid]; let count = 0; if (team == null) return null; let teamPnum = team.playerlist.length; let objlist = []; //team.playerlist.slice(0); for(let brole of team.playerlist){ let player = brole.toObj(); if(player.pause == 1){ count ++; } } if ((teamPnum - count) < 5) { let needPartnerCnt = 5 - (teamPnum - count); for (let index = 0; index < needPartnerCnt; index++) { if (team.partnerlist.length > index) { objlist.push(team.partnerlist[index]); } else { break; } } } return objlist; } getTeamPlayer(teamid: number): Player[] { let team = this.teamList[teamid]; if (team == null) return []; return team.playerlist; } getTeamInfo(teamid: any): any { let team = this.teamList[teamid]; if (team == null) return null; return team; } getTeamList(p: any, type: any) { let temlist = []; for (const key in this.hallList) { if (this.hallList.hasOwnProperty(key)) { const team = this.hallList[key]; if (team.playerlist.length < 5 && team.type == type && team.requestlist.length < 100 && temlist.length < 100) { let info: any = {}; info.cnt = team.playerlist.length; info.resid = team.leader.resid; info.relive = team.leader.relive; info.level = team.leader.level; info.name = team.leader.name; info.teamid = team.teamid; info.request = team.requestlist.indexOf(p.roleid) == -1 ? 0 : 1; // 封装队员角色ID及外观ID let obj: any = {}; for (let i = 0; i < team.playerlist.length; i++) { obj[team.playerlist[i].roleid] = team.playerlist[i].resid; } info.teamMembers = SKDataUtil.toJson(obj,"{}"); temlist.push(info); } } } p.send('s2c_team_list', { list: SKDataUtil.toJson(temlist,"[]") }); } getRequestList(p: any, teamid: any) { this.sendInfoToMember(teamid); if (p == null) return; let team = this.teamList[teamid]; if (team == null) return; let temlist = []; for (let i: number = 0; i < team.requestlist.length; i++) { let rp = PlayerMgr.shared.getPlayerByRoleId(team.requestlist[i]); if (rp == null || rp.teamid > 0) { team.requestlist.splice(i, 1); i--; continue; } let info: any = {}; info.resid = rp.resid; info.race = rp.race; info.relive = rp.relive; info.level = rp.level; info.name = rp.name; info.roleid = rp.roleid; temlist.push(info); } p.send('s2c_team_requeslist', { list: temlist }); } teamListInfo(teamId: any) { let data: any = {}; let list = []; let team = this.teamList[teamId]; if (team){ for (let i = 0; i < team.playerlist.length; i++) { let obj: any = {}; // 角色ID obj.roleid = team.playerlist[i].roleid; // 外观ID obj.resid = team.playerlist[i].resid; // 种族 obj.race = team.playerlist[i].race; // 等级 obj.level = team.playerlist[i].level; // 转生 obj.relive = team.playerlist[i].relive; // 名称 obj.name = team.playerlist[i].name; list.push(obj); } // 队伍ID data.teamid = team.teamid; // 队伍目标 data.type = team.type; // 喊话内容 data.content = team.content; // 队长ID data.leaderId = team.leader.roleid; // 队伍中角色信息 data.datum = list; } return data; } }