🐞 fix(gvg): 联军信息变动同步

This commit is contained in:
luying
2023-02-27 21:21:29 +08:00
parent 1f04496865
commit a89692f4ef
11 changed files with 121 additions and 11 deletions

View File

@@ -5,7 +5,7 @@ import { GuildModel, GuildType } from "../../../db/Guild";
import { GVGLeagueModel, GVGLeagueType } from "../../../db/GVGLeague";
import { GVGLeagueApplyModel } from "../../../db/GVGLeagueApply";
import { calLeagueCe, getGroupIdOfServer, getGVGConfig, getGVGPeriodData, getGVGServerType, getServersOfSameGroup } from "../../../services/gvg/gvgService";
import { checkCanManage, checkGuildLeader, checkLeagueAuth, createLeague, getLeagueApplyData, getLeagueInviteData, getMyAuth, joinGuildToLeague } from "../../../services/gvg/gvgTeamService";
import { checkCanManage, checkGuildLeader, checkLeagueAuth, createLeague, getLeagueApplyData, getLeagueInviteData, getMyAuth, joinGuildToLeague, updateGVGBattleLeagueInfo } from "../../../services/gvg/gvgTeamService";
import { LeagueGuildInfo, LeagueListInfo, LeagueMemberListInfo, LeagueSimpleInfo } from "../../../domain/gvgField/returnData";
import { getAllServerName, getServerName, isRoleOnline, updateUserInfo } from "../../../services/redisService";
import { GVG } from "../../../pubUtils/dicParam";
@@ -593,6 +593,7 @@ export class GVGManageHandler {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const guildCode = session.get('guildCode');
const serverId = session.get('serverId');
const { leagueCode: targetLeagueCode, name, notice, icon } = msg;
@@ -619,6 +620,7 @@ export class GVGManageHandler {
if(notice != undefined) {
await changeNoticeMessage(roleId, roleName, myLeague, notice);
}
await updateGVGBattleLeagueInfo(serverId, myLeague.leagueCode, { leagueName: name, icon })
// 返回
return resResult(STATUS.SUCCESS, {

View File

@@ -11,6 +11,7 @@ import { GVGConfigType } from '../../../db/GVGConfig';
import { catapultHurt, gvgBattleEnd, gvgBattleSeconds, gvgBattleStart, initCatapult, leaveCity } from '../../../services/gvg/gvgBattleService';
import { clearBattleMemory } from '../../../services/gvg/gvgBattleMemory';
import { GVGLeagueType } from '../../../db/GVGLeague';
import { updateLeagueNameMem, updateTeamRoleInfoMem } from '../../../services/gvg/gvgTeamService';
export default function (app: Application) {
new HandlerService(app, {});
@@ -177,4 +178,20 @@ export class GuildRemote {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}
}
public async updateLeagueNameMem(serverId: number, leagueCode: string, leagueName: string) {
try {
return updateLeagueNameMem(serverId, leagueCode, leagueName);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}
}
public async updateTeamRoleInfoMem(serverId: number, roleId: string, info: { roleName?: string, lv?: number }) {
try {
return updateTeamRoleInfoMem(serverId, roleId, info);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}
}
}

View File

@@ -27,6 +27,7 @@ import { sendMessageToUserWithSuc } from '../../../services/pushService';
import { GuildLeader } from '../../../domain/rank';
import { checkPopUpCondition } from '../../../services/activity/popUpShopService';
import { isGoodsHidden, isHeroHidden } from '../../../services/dataService';
import { updateGVGBattleRoleInfo } from '../../../services/gvg/gvgTeamService';
export default function (app: Application) {
new HandlerService(app, {});
@@ -479,6 +480,7 @@ export class RoleHandler {
if(role.isGuildLeader) {
await updateUserInfo(REDIS_KEY.GUILD_INFO, guildCode, [{ field: 'leader', value: new GuildLeader(role) }]);
}
await updateGVGBattleRoleInfo(serverId, roleId, { roleName });
return resResult(STATUS.SUCCESS, { roleName: role.roleName, renameCnt: role.renameCnt });
}

View File

@@ -16,6 +16,7 @@ class GVGBattleData {
private teams: Map<string, GVGTeamMem> = new Map(); // 队伍, teamCode => team
private rolePoints: Map<string, Map<number, string>> = new Map(); // roleId => pointId[],用于更新玩家的积分
private roleToTeam: Map<string, string[]> = new Map(); // roleId => teamCode
private leagueToTeam: Map<string, Set<string>> = new Map(); // leagueCode => teamCode
public areaToTeams: Map<number, Set<string>> = new Map(); // areaId => teamCode set用于定时下发地图玩家数据
constructor(groupKey: string) {
@@ -54,6 +55,8 @@ class GVGBattleData {
for(let [_areaId, teamSet] of this.areaToTeams) {
if(teamSet.has(teamCode)) teamSet.delete(teamCode);
}
if(team.leagueCode && this.leagueToTeam.has(team.leagueCode))
this.leagueToTeam.get(team.leagueCode).delete(teamCode);
}
this.rolePoints.delete(roleId);
}
@@ -73,6 +76,14 @@ class GVGBattleData {
let teamCodesOfRole = this.roleToTeam.get(team.roleId)||[];
if(teamCodesOfRole.indexOf(team.teamCode) == -1) teamCodesOfRole.push(team.teamCode);
this.roleToTeam.set(team.roleId, teamCodesOfRole);
if(team.leagueCode) {
if(!this.leagueToTeam.has(team.leagueCode)) {
this.leagueToTeam.set(team.leagueCode, new Set());
}
if(!this.leagueToTeam.get(team.leagueCode).has(team.teamCode))
this.leagueToTeam.get(team.leagueCode).add(team.teamCode);
}
this.setAreaMap(team.teamCode, fromAreaId, team.areaId);
}
}
@@ -174,6 +185,23 @@ class GVGBattleData {
public findAreas() {
return this.areaToTeams.keys();
}
public updateLeagueInfo(leagueCode: string, leagueName: string) {
let teamCodes = this.leagueToTeam.get(leagueCode)||new Set();
for(let teamCode of teamCodes) {
let team = this.teams.get(teamCode);
team.leagueName = leagueName;
}
}
public updateRoleInfo(roleId: string, info: { roleName?: string, lv?: number }) {
let teamCodes = this.leagueToTeam.get(roleId)||new Set();
for(let teamCode of teamCodes) {
let team = this.teams.get(teamCode);
if(info.roleName) team.roleName = info.roleName;
if(info.lv) team.lv = info.lv;
}
}
}
export function getGVGBattleData(groupKey: string) {

View File

@@ -10,7 +10,7 @@ import { getGVGBattleData, getGVGBattleMap } from "./gvgBattleMemory";
import { GVGAttackSpine, GVGCityMapInfo, GVGTeamInList, GVGTeamInListOnPoint, GVGTeamSpineInMap } from "../../domain/gvgField/returnData";
import { GVG } from "../../pubUtils/dicParam";
import { GVGHeroInfo, PvpEnemies, PvpHeroInfo } from "../../domain/dbGeneral";
import { getGroupKey, getGVGConfig } from "./gvgService";
import { getGroupKey, getGVGConfig, getGVGPeriodData } from "./gvgService";
import { GVGLeaguePrepareModel } from "../../db/GVGLeaguePrepare";
import { pinus } from "pinus";
import { dispatch } from "../../pubUtils/dispatcher";
@@ -391,17 +391,20 @@ export async function getBattleRanksByCity(configId: number, groupKey: string, c
// 每5秒一次结算
export async function gvgBattleSeconds() {
const { configId } = getGVGConfig();
const { configId, period } = getGVGPeriodData();
let { startFightTime, endFightTime } = getFightTimeByPeriod(period);
const serverNames = await getAllServerName();
let keys: { groupKey: string, cityId: number }[] = []
for(let [_key, teamObj] of getGVGBattleMap()) {
// 每5秒给据点上的人加积分
let teams = teamObj.findSettledPoint();
for(let teamMem of teams) {
if(teamMem.isBroken || teamMem.durability <= 0) continue;
let addScore = gameData.gvgAreaPoint.get(teamMem.pointId)?.score||0;
let team = await GVGTeamModel.addScore(teamMem.teamCode, 0, addScore);
await redisAddSettleScore(team, addScore);
if(startFightTime <= nowSeconds() && endFightTime >= nowSeconds()) {
// 每5秒给据点上的人加积分
let teams = teamObj.findSettledPoint();
for(let teamMem of teams) {
if(teamMem.isBroken || teamMem.durability <= 0) continue;
let addScore = gameData.gvgAreaPoint.get(teamMem.pointId)?.score||0;
let team = await GVGTeamModel.addScore(teamMem.teamCode, 0, addScore);
await redisAddSettleScore(team, addScore);
}
}
// 向下推送区域数据
let spinesByCity = new Map<number, GVGTeamSpineInMap[]>();

View File

@@ -1,10 +1,14 @@
// 和gvg组建期相关的方法
import { pinus } from "pinus";
import { GUILD_AUTH, GVG_APPLY_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_AUTH, LEAGUE_MANAGE_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from "../../consts";
import { GuildModel, GuildType } from "../../db/Guild";
import { GVGCityModel } from "../../db/GVGCity";
import { GVGCityAreaPointModel } from "../../db/GVGCityAreaPoint";
import { GVGLeagueModel, GVGLeagueType, GVGLeagueUpdate } from "../../db/GVGLeague";
import { GVGLeagueApplyModel, GVGLeagueApplyType } from "../../db/GVGLeagueApply";
import { GVGLeaguePrepareModel, GVGLeaguePrepareType } from "../../db/GVGLeaguePrepare";
import { GVGTeamModel } from "../../db/GVGTeam";
import { RoleType } from "../../db/Role";
import { UserGuildModel } from "../../db/UserGuild";
import { LeagueGuildInfo, LeagueListInfo } from "../../domain/gvgField/returnData";
@@ -14,8 +18,9 @@ import { getZeroPointD } from "../../pubUtils/timeUtil";
import { resResult } from "../../pubUtils/util";
import { sendMessageToUserWithSuc } from "../pushService";
import { updateUserInfo } from "../redisService";
import { getGVGBattleData } from "./gvgBattleMemory";
import { guildJoinLeagueRecord } from "./gvgRecService";
import { calLeagueCe, getCurPeriod, getGVGConfig, getGVGPeriodData, getGVGServerType } from "./gvgService";
import { calLeagueCe, getCurPeriod, getGroupKey, getGVGConfig, getGVGPeriodData, getGVGServerType } from "./gvgService";
/**
* 自动创建联军
@@ -230,4 +235,28 @@ export async function guildAbdicateToLeague(guild: GuildType, fromRoleId: string
if(!guild.leagueCode) return;
await GVGLeagueModel.abdicateGuild(guild.leagueCode, fromRoleId, toRole.roleId, toRole._id);
await updateUserInfo(REDIS_KEY.LEAGUE_INFO, guild.leagueCode, [{ field: 'leader', value: new LeagueLeader(toRole) }]);
}
export async function updateGVGBattleLeagueInfo(serverId: number, leagueCode: string, info: { leagueName?: string, icon?: number }) {
await GVGTeamModel.updateLeagueName(leagueCode, info.leagueName);
await GVGCityModel.updateLeagueInfo(leagueCode, info.leagueName, info.icon);
await GVGCityAreaPointModel.updateLeagueName(leagueCode, info.leagueName)
if(info.leagueName) await pinus.app.rpc.guild.guildRemote.updateLeagueNameMem.broadcast(serverId, leagueCode, info.leagueName);
}
export async function updateLeagueNameMem(serverId: number, leagueCode: string, leagueName: string ) {
let groupKey = await getGroupKey(serverId);
let teamObj = getGVGBattleData(groupKey);
teamObj.updateLeagueInfo(leagueCode, leagueName);
}
export async function updateGVGBattleRoleInfo(serverId: number, roleId: string, info: { roleName?: string, lv?: number }) {
await GVGTeamModel.updateRoleInfo(roleId, info);
await pinus.app.rpc.guild.guildRemote.updateTeamRoleInfoMem.broadcast(serverId, roleId, info);
}
export async function updateTeamRoleInfoMem(serverId: number, roleId: string, info: { roleName?: string, lv?: number } ) {
let groupKey = await getGroupKey(serverId);
let teamObj = getGVGBattleData(groupKey);
teamObj.updateRoleInfo(roleId, info);
}

View File

@@ -21,6 +21,7 @@ import { sendMessageToUserWithSuc } from './pushService';
import { ActionPointModel } from '../db/ActionPoint';
import { GK_MAIN, GK_MAINELITE, RECHARGE } from '../pubUtils/dicParam';
import { rebateHistoryOrder } from './orderService';
import { updateGVGBattleRoleInfo } from './gvg/gvgTeamService';
export async function roleLevelup(type: KING_EXP_RATIO_TYPE, roleId: string, kingExp: number = 0, session: BackendSession) {
const serverId = session.get('serverId');
@@ -56,6 +57,8 @@ export async function roleLevelup(type: KING_EXP_RATIO_TYPE, roleId: string, kin
if(lv < RECHARGE.RECHARGE_RMB_RETURN_LEVEL_LIMITED && newLv >= RECHARGE.RECHARGE_RMB_RETURN_LEVEL_LIMITED) {
rebateHistoryOrder(roleId, role.userInfo?.uid);
}
await updateGVGBattleRoleInfo(serverId, roleId, { lv });
}
let actordata: { lv: number, exp: number, getExp: number, mostExp: number }[] = [];
for (let i = lv; i <= newLv; i++) {

View File

@@ -113,6 +113,13 @@ export default class GVGCity extends BaseModel {
const cities: GVGCityType[] = await GVGCityModel.find({ configId, hasGuard: true }).lean();
return cities
}
public static async updateLeagueInfo(leagueCode: string, leagueName: string, icon: number) {
let updateInfo: GVGCityUpdate = {};
if(leagueName != undefined) updateInfo.guardLeagueName = leagueName;
if(icon != undefined) updateInfo.guardLeagueIcon = icon;
await GVGCityModel.updateMany({ guardLeague: leagueCode }, { $set: updateInfo });
}
}

View File

@@ -54,6 +54,10 @@ export default class GVGCityAreaPoint extends BaseModel {
let result: GVGCityAreaPointType[] = await GVGCityAreaPointModel.find({ configId, groupKey }).lean();
return result
}
public static async updateLeagueName(leagueCode: string, leagueName: string) {
await GVGCityAreaPointModel.updateMany({ leagueCode }, { $set: { leagueName }});
}
}

View File

@@ -343,6 +343,14 @@ export default class GVGTeam extends BaseModel {
let team: GVGTeamType = await GVGTeamModel.findOneAndUpdate({ teamCode }, { $set: { restartTime: 0 } }, { new: true }).lean();
return team;
}
public static async updateLeagueName(leagueCode: string, leagueName: string) {
await GVGTeamModel.updateMany({ leagueCode }, { $set: { leagueName } });
}
public static async updateRoleInfo(roleId: string, info: { roleName?: string, lv?: number }) {
await GVGTeamModel.updateMany({ roleId }, { $set: info });
}
}
export const GVGTeamModel = getModelForClass(GVGTeam);

View File

@@ -48,4 +48,11 @@ export class GVGTeamMem extends GVGTeam {
this.startMoveTime = startMoveTime;
this.stopMoveTime = stopMoveTime;
}
public updateInfo(info: { leagueName?: string, roleName?: string, lv?: number }) {
if(!info) return
if(info.leagueName) this.leagueName = info.leagueName;
if(info.roleName) this.roleName = info.roleName;
if(info.lv) this.lv = info.lv;
}
}