xy-server/game/core/TeamMgr.ts
2025-04-23 09:34:08 +08:00

552 lines
18 KiB
TypeScript

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;
}
}