552 lines
18 KiB
TypeScript
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;
|
|
}
|
|
} |