Files
ZYZ/game-server/app/services/gvg/gvgBattleMemory.ts
2023-02-17 10:59:38 +08:00

93 lines
3.6 KiB
TypeScript
Raw 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 { GVGTeamType } from "../../db/GVGTeam";
import { GVGTeamMem } from "../../domain/battleField/gvgBattle";
// 积分点占领情况groupId_serverType_cityId -> GVGBattleData
const gvgBattleMap: Map<string, GVGBattleData> = new Map();
class GVGBattleData {
public groupId: number; // 战区
public serverType: number; // 单服还是跨服
private teams: Map<string, GVGTeamMem> = new Map(); // 队伍, teamCode => team
private rolePoints: Map<string, number[]> = new Map(); // roleId => pointId[],用于更新玩家的积分
private roleToTeam: Map<string, string[]> = new Map(); // roleId => teamCode
private areaToTeams: Map<number, Set<string>> = new Map(); // areaId => teamCode set用于定时下发地图玩家数据
constructor(groupId: number, serverType: number) {
this.groupId = groupId;
this.serverType = serverType;
}
public leaveCity(roleId: string) {
let teamCodes = this.roleToTeam.get(roleId)||[];
for(let teamCode of teamCodes) {
let team = this.teams.get(teamCode);
if(team) team.setCity(0, 0);
}
this.rolePoints.delete(roleId);
}
public enterCity(teams: GVGTeamType[]) {
for(let team of teams) {
if(!this.teams.has(team.teamCode)) {
this.teams.set(team.teamCode, new GVGTeamMem(team))
}
let originTeam = this.teams.get(team.teamCode);
let fromAreaId = originTeam.areaId;
originTeam.setCity(team.cityId, team.areaId);
if(team.pointId > 0) {
if(!this.rolePoints.has(team.roleId)) this.rolePoints.set(team.roleId, []);
this.rolePoints.get(team.roleId).push(team.pointId);
}
let teamCodesOfRole = this.roleToTeam.get(team.roleId)||[];
if(teamCodesOfRole.indexOf(team.teamCode) == -1) teamCodesOfRole.push(team.teamCode);
this.roleToTeam.set(team.roleId, teamCodesOfRole);
this.setAreaMap(team.teamCode, fromAreaId, team.areaId);
}
}
private setAreaMap(teamCode: string, fromAreaId: number, toAreaId: number) {
if(fromAreaId == toAreaId) return;
let fromAreaSet = this.areaToTeams.get(fromAreaId);
if(fromAreaSet && fromAreaSet.has(teamCode)) fromAreaSet.delete(teamCode);
if(!this.areaToTeams.has(toAreaId)) {
this.areaToTeams.set(toAreaId, new Set());
}
if(!this.areaToTeams.get(toAreaId).has(teamCode)) {
this.areaToTeams.get(toAreaId).add(teamCode);
}
}
public move(teamCode: string, areaId: number, startMoveTime: number, stopMoveTime: number) {
let team = this.teams.get(teamCode);
if(!team) return;
let fromAreaId = team.areaId;
team.moveToArea(areaId, startMoveTime, stopMoveTime);
this.setAreaMap(teamCode, fromAreaId, areaId);
}
public setTime(teamCode: string, teamUpdate: GVGTeamType) {
let team = this.teams.get(teamCode);
if(!team) return;
team.attackTime = teamUpdate.attackTime;
team.defenseTime = teamUpdate.defenseTime;
}
// 队伍入驻积分点
public teamSettle(teamCode: string, pointId: number) {
let team = this.teams.get(teamCode);
if(!team) return;
team.pointId = pointId;
}
}
export function getGVGBattleData(groupId: number, serverType: number) {
let key = `${groupId}_${serverType}`;
if(!gvgBattleMap.has(key)) {
gvgBattleMap.set(key, new GVGBattleData(groupId, serverType));
}
return gvgBattleMap.get(key);
}