diff --git a/game-server/app/servers/guild/handler/gvgManageHandler.ts b/game-server/app/servers/guild/handler/gvgManageHandler.ts index 32185e5cc..848f707a8 100644 --- a/game-server/app/servers/guild/handler/gvgManageHandler.ts +++ b/game-server/app/servers/guild/handler/gvgManageHandler.ts @@ -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, { diff --git a/game-server/app/servers/guild/remote/guildRemote.ts b/game-server/app/servers/guild/remote/guildRemote.ts index e8980303e..e91ae9cf4 100644 --- a/game-server/app/servers/guild/remote/guildRemote.ts +++ b/game-server/app/servers/guild/remote/guildRemote.ts @@ -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}`); + } + } } \ No newline at end of file diff --git a/game-server/app/servers/role/handler/roleHandler.ts b/game-server/app/servers/role/handler/roleHandler.ts index 132f7b00b..a83658d40 100644 --- a/game-server/app/servers/role/handler/roleHandler.ts +++ b/game-server/app/servers/role/handler/roleHandler.ts @@ -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 }); } diff --git a/game-server/app/services/gvg/gvgBattleMemory.ts b/game-server/app/services/gvg/gvgBattleMemory.ts index d82e561a5..cb1d497da 100644 --- a/game-server/app/services/gvg/gvgBattleMemory.ts +++ b/game-server/app/services/gvg/gvgBattleMemory.ts @@ -16,6 +16,7 @@ class GVGBattleData { private teams: Map = new Map(); // 队伍, teamCode => team private rolePoints: Map> = new Map(); // roleId => pointId[],用于更新玩家的积分 private roleToTeam: Map = new Map(); // roleId => teamCode + private leagueToTeam: Map> = new Map(); // leagueCode => teamCode public areaToTeams: Map> = 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) { diff --git a/game-server/app/services/gvg/gvgBattleService.ts b/game-server/app/services/gvg/gvgBattleService.ts index 6ea497a6a..4b2e9c740 100644 --- a/game-server/app/services/gvg/gvgBattleService.ts +++ b/game-server/app/services/gvg/gvgBattleService.ts @@ -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(); diff --git a/game-server/app/services/gvg/gvgTeamService.ts b/game-server/app/services/gvg/gvgTeamService.ts index a97d9b521..79213a34e 100644 --- a/game-server/app/services/gvg/gvgTeamService.ts +++ b/game-server/app/services/gvg/gvgTeamService.ts @@ -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); } \ No newline at end of file diff --git a/game-server/app/services/normalBattleService.ts b/game-server/app/services/normalBattleService.ts index 24a903d3d..f867e9183 100644 --- a/game-server/app/services/normalBattleService.ts +++ b/game-server/app/services/normalBattleService.ts @@ -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++) { diff --git a/shared/db/GVGCity.ts b/shared/db/GVGCity.ts index 4405988d8..8c6cc571a 100644 --- a/shared/db/GVGCity.ts +++ b/shared/db/GVGCity.ts @@ -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 }); + } } diff --git a/shared/db/GVGCityAreaPoint.ts b/shared/db/GVGCityAreaPoint.ts index 4ed3c0247..115d3d0d0 100644 --- a/shared/db/GVGCityAreaPoint.ts +++ b/shared/db/GVGCityAreaPoint.ts @@ -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 }}); + } } diff --git a/shared/db/GVGTeam.ts b/shared/db/GVGTeam.ts index 7de8c2525..8b2fa7644 100644 --- a/shared/db/GVGTeam.ts +++ b/shared/db/GVGTeam.ts @@ -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); diff --git a/shared/domain/battleField/gvgBattle.ts b/shared/domain/battleField/gvgBattle.ts index 578f0a1ca..42efc8cf3 100644 --- a/shared/domain/battleField/gvgBattle.ts +++ b/shared/domain/battleField/gvgBattle.ts @@ -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; + } }