🐞 fix(gvg): 修复战区问题,不跨服服务器应单列

This commit is contained in:
luying
2023-02-20 20:46:20 +08:00
parent 015b4293fb
commit 5b3747a78e
27 changed files with 324 additions and 390 deletions
+15 -15
View File
@@ -61,24 +61,24 @@ export async function addRoleToGroupShopChannel(roleId: string, sid: string) {
await addRoleToChannel(roomId, roleId, sid);
}
export async function addRoleToAreaChannel(roleId: string, groupId: number, serverType: number, areaIds: number[], sid: string) {
export async function addRoleToAreaChannel(roleId: string, groupKey: string, areaIds: number[], sid: string) {
for(let areaId of areaIds) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREAS, `${groupId}_${serverType}_${areaId}`);
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREAS, `${groupKey}_${areaId}`);
await addRoleToChannel(roomId, roleId, sid);
}
await addGVGHistoryAreas(roleId, groupId, serverType, areaIds);
await addGVGHistoryAreas(roleId, groupKey, areaIds);
}
export async function addRoleToAreaTeamChannel(roleId: string, groupId: number, serverType: number, areaId: number, sid: string) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREA_BY_TEAM, `${groupId}_${serverType}_${areaId}`);
export async function addRoleToAreaTeamChannel(roleId: string, groupKey: string, areaId: number, sid: string) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREA_BY_TEAM, `${groupKey}_${areaId}`);
await addRoleToChannel(roomId, roleId, sid);
await addGVGHistoryAreaTeam(roleId, groupId, serverType, areaId);
await addGVGHistoryAreaTeam(roleId, groupKey, areaId);
}
export async function addRoleToGVGCityChannel(roleId: string, groupId: number, serverType: number, cityId: number, sid: string) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_CITY, `${groupId}_${serverType}_${cityId}`);
export async function addRoleToGVGCityChannel(roleId: string, groupKey: string, cityId: number, sid: string) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_CITY, `${groupKey}_${cityId}`);
await addRoleToChannel(roomId, roleId, sid);
await addGVGHistoryCityTeam(roleId, groupId, serverType, cityId);
await addGVGHistoryCityTeam(roleId, groupKey, cityId);
}
async function leaveChannel(roomId: string, roleId: string, sid: string) {
const channelSid = await channelServer(roomId);
@@ -184,20 +184,20 @@ export async function getGroupShopSid() {
return channelSid;
}
export async function getGVGAreaChannelSid(groupId: number, serverType: number, areaId: number) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREAS, `${groupId}_${serverType}_${areaId}`);
export async function getGVGAreaChannelSid(groupKey: string, areaId: number) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREAS, `${groupKey}_${areaId}`);
const channelSid = await channelServer(roomId);
return channelSid;
}
export async function getGVGAreaTeamChannelSid(groupId: number, serverType: number, areaId: number) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREA_BY_TEAM, `${groupId}_${serverType}_${areaId}`);
export async function getGVGAreaTeamChannelSid(groupKey: string, areaId: number) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREA_BY_TEAM, `${groupKey}_${areaId}`);
const channelSid = await channelServer(roomId);
return channelSid;
}
export async function getGVGCityTeamChannelSid(groupId: number, serverType: number, cityId: number) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_CITY, `${groupId}_${serverType}_${cityId}`);
export async function getGVGCityTeamChannelSid(groupKey: string, cityId: number) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_CITY, `${groupKey}_${cityId}`);
const channelSid = await channelServer(roomId);
return channelSid;
}
@@ -11,17 +11,15 @@ import { getGVGPeriodData } from "./gvgService";
const gvgBattleMap: Map<string, GVGBattleData> = new Map();
class GVGBattleData {
public groupId: number; // 战区
public serverType: number; // 单服还是跨服
public groupKey: string; // 战区
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
public areaToTeams: Map<number, Set<string>> = new Map(); // areaId => teamCode set,用于定时下发地图玩家数据
constructor(groupId: number, serverType: number) {
this.groupId = groupId;
this.serverType = serverType;
constructor(groupKey: string) {
this.groupKey = groupKey;
}
public findTeamsByArea(areaId: number) {
@@ -158,12 +156,11 @@ class GVGBattleData {
}
}
export function getGVGBattleData(groupId: number, serverType: number) {
let key = `${groupId}_${serverType}`;
if(!gvgBattleMap.has(key)) {
gvgBattleMap.set(key, new GVGBattleData(groupId, serverType));
export function getGVGBattleData(groupKey: string) {
if(!gvgBattleMap.has(groupKey)) {
gvgBattleMap.set(groupKey, new GVGBattleData(groupKey));
}
return gvgBattleMap.get(key);
return gvgBattleMap.get(groupKey);
}
export function getGVGBattleMap() {
@@ -178,7 +175,7 @@ export async function initTeamToMem() {
let teams = await GVGTeamModel.findByConfigId(configId);
for(let team of teams) {
if(dispatch(team.cityId.toString(), servers)?.id == sid) {
let teamObj = getGVGBattleData(team.groupId, team.serverType);
let teamObj = getGVGBattleData(team.groupKey);
teamObj.enterCity(team);
}
}
@@ -47,15 +47,15 @@ export async function getGVGCities(league: GVGLeagueType) {
* 获取当前城池状态
* @returns [{cityId: number, guardLeagueCode: string, guardLeagueName: string, teamCnt: number }]
*/
export async function getGVGCitiesInfo(configId: number, groupId: number, serverType: number, league?: GVGLeagueType) {
let cities = await GVGCityModel.findGuardCity(configId, groupId, serverType);
export async function getGVGCitiesInfo(configId: number, groupKey: string, league?: GVGLeagueType) {
let cities = await GVGCityModel.findGuardCity(configId, groupKey);
let result: GVGCityMapInfo[] = [];
for(let city of cities) {
let obj = new GVGCityMapInfo(city);
if(league) {
let players = (city.players||[]).filter(cur => cur.leagueCode == league.leagueCode);
obj.setTeamCnt(players.length);
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupId, serverType });
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupKey });
let score = await r.getMyScore({ leagueCode: league.leagueCode });
obj.setScore(score||0);
}
@@ -93,8 +93,8 @@ export function checkMoveStatus(team: GVGTeamType, cityId: number, areaId: numbe
return STATUS.SUCCESS;
}
export async function initRobots(configId: number, groupId: number, serverType: number, cityId: number) {
let robotTeams = await GVGTeamModel.findRobotTeams(groupId, serverType, cityId);
export async function initRobots(configId: number, groupKey: string, cityId: number) {
let robotTeams = await GVGTeamModel.findRobotTeams(groupKey, cityId);
let updateDicPoints: DicGVGAreaPoint[] = [];
let { areaIds = []} = gameData.gvgCity.get(cityId);
for(let [_, point] of gameData.gvgAreaPoint) {
@@ -105,9 +105,9 @@ export async function initRobots(configId: number, groupId: number, serverType:
}
}
if(updateDicPoints.length > 0) {
robotTeams = await GVGTeamModel.initRobots(configId, groupId, serverType, cityId, updateDicPoints);
robotTeams = await GVGTeamModel.initRobots(configId, groupKey, cityId, updateDicPoints);
// 存入内存
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.enterCity(...robotTeams);
}
return robotTeams;
@@ -213,14 +213,14 @@ export async function gvgBattleStart() {
let { configId } = getGVGConfig();
let guardCities = await GVGCityModel.findAllGuardCities(configId);
for(let { cityId, groupId, serverType, guardLeague, guardLeagueName } of guardCities) {
for(let { cityId, groupKey, guardLeague, guardLeagueName } of guardCities) {
let sid = dispatch(cityId.toString(), servers)?.id;
await pinus.app.rpc.guild.guildRemote.initCatapult.toServer(sid, cityId, groupId, serverType, guardLeague, guardLeagueName);
await pinus.app.rpc.guild.guildRemote.initCatapult.toServer(sid, cityId, groupKey, guardLeague, guardLeagueName);
}
}
// 每次活动开始初始化投石车
export async function initCatapult(cityId: number, groupId: number, serverType: number, leagueCode: string, leagueName: string) {
export async function initCatapult(cityId: number, groupKey: string, leagueCode: string, leagueName: string) {
let { configId } = getGVGConfig();
let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, leagueCode);
@@ -238,9 +238,9 @@ export async function initCatapult(cityId: number, groupId: number, serverType:
let dicArea = gameData.gvgArea.get(areaId);
return dicArea && dicArea.areaType == GVG_AREA_TYPE.CATAPULT;
});
let teams = await GVGTeamModel.initCatapult(configId, groupId, serverType, cityId, leagueCode, leagueName, areaIds, atk, durability);
let teams = await GVGTeamModel.initCatapult(configId, groupKey, cityId, leagueCode, leagueName, areaIds, atk, durability);
// 处理内存
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.enterCity(...teams);
}
}
@@ -258,13 +258,13 @@ export async function catapultHurt() {
let dicGVGCity = gameData.gvgCity.get(catapult.cityId);
let teams = await GVGTeamModel.attackByCatapult(teamCodes, catapult.captapultAtk, dicGVGCity.attackBirth);
teamObj.battleEnd(teams);
await sendMessageToGVGAreaByTeamWithSuc(teamObj.groupId, teamObj.serverType, catapult.areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, {
await sendMessageToGVGAreaByTeamWithSuc(teamObj.groupKey, catapult.areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, {
cityId: catapult.cityId, areaId: catapult.areaId, attackType: 1, teams: teams.map(team => new GVGTeamInList(team))
});
for(let team of teams) {
await pushTeamBeHurtMessage(team);
if(team.curTeamBreak && team.originPointId > 0) {
await GVGCityAreaPointModel.leavePoint(configId, teamObj.groupId, teamObj.serverType, team.originPointId);
await GVGCityAreaPointModel.leavePoint(configId, teamObj.groupKey, team.originPointId);
}
}
}
@@ -273,27 +273,27 @@ export async function catapultHurt() {
// 战斗积分更新
export async function redisAddBattleScore(gvgTeam: GVGTeamType, incScore: number) {
let { configId, groupId, serverType, cityId, roleId, isRobot } = gvgTeam;
let { configId, groupKey, cityId, roleId, isRobot } = gvgTeam;
if(isRobot) return;
let r = new Rank(REDIS_KEY.GVG_BATTLE_RANK, { configId, groupId, serverType, cityId });
let r = new Rank(REDIS_KEY.GVG_BATTLE_RANK, { configId, groupKey, cityId });
r.setRankWithRoleInfo(roleId, incScore, Date.now(), null, true);
}
export async function redisAddSettleScore(gvgTeam: GVGTeamType, incScore: number) {
let { configId, groupId, serverType, cityId, leagueCode, isRobot } = gvgTeam;
let { configId, groupKey, cityId, leagueCode, isRobot } = gvgTeam;
if(isRobot) return;
let r1 = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType });
let r1 = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupKey });
r1.setRankWithLeagueInfo(leagueCode, incScore, Date.now(), null, true);
let r2 = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupId, serverType, cityId });
let r2 = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupKey, cityId });
r2.setRankWithLeagueInfo(leagueCode, incScore, Date.now(), null, true);
}
// 获取排行榜
export async function getBattleRanksByCity(configId: number, groupId: number, serverType: number, cityId: number, myLeague: GVGLeagueType) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupId, serverType, cityId });
export async function getBattleRanksByCity(configId: number, groupKey: string, cityId: number, myLeague: GVGLeagueType) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupKey, cityId });
r.setGenerFieldsFun((obj => {
if(obj instanceof LeagueRankInfo) {
return { rank: obj.rank, leagueCode: obj.code, leagueName: obj.name, score: obj.num }
@@ -312,7 +312,7 @@ export async function getBattleRanksByCity(configId: number, groupId: number, se
export async function gvgBattleSeconds() {
const { configId } = getGVGConfig();
const serverNames = await getAllServerName();
let keys: { groupId: number, serverType: number, cityId: number }[] = []
let keys: { groupKey: string, cityId: number }[] = []
for(let [_key, teamObj] of getGVGBattleMap()) {
// 每5秒给据点上的人加积分
let teams = teamObj.findSettledPoint();
@@ -327,16 +327,16 @@ export async function gvgBattleSeconds() {
let dicArea = gameData.gvgArea.get(areaId);
let teams = teamObj.findTeamsByArea(areaId);
let result = teams.map(team => new GVGTeamSpineInMap(team, serverNames));
await sendMessageToGVGAreaWithSuc(teamObj.groupId, teamObj.serverType, areaId, PUSH_ROUTE.GVG_AREA_SPINE_CHANGE, { cityId: dicArea.cityId, areaId, spines: result });
await sendMessageToGVGAreaWithSuc(teamObj.groupKey, areaId, PUSH_ROUTE.GVG_AREA_SPINE_CHANGE, { cityId: dicArea.cityId, areaId, spines: result });
let index = keys.findIndex(cur => cur.cityId == dicArea.cityId && cur.groupId == teamObj.groupId && cur.serverType == teamObj.serverType);
if(index == -1) keys.push({ groupId: teamObj.groupId, serverType: teamObj.serverType, cityId: dicArea.cityId });
let index = keys.findIndex(cur => cur.cityId == dicArea.cityId && cur.groupKey == teamObj.groupKey);
if(index == -1) keys.push({ groupKey: teamObj.groupKey, cityId: dicArea.cityId });
}
}
for(let { groupId, serverType, cityId } of keys) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupId, serverType, cityId });
for(let { groupKey, cityId } of keys) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupKey, cityId });
let rawRanks = await r.getRankByRange();
let ranks = rawRanks.map(obj => {
if(obj instanceof LeagueRankInfo) {
@@ -344,7 +344,7 @@ export async function gvgBattleSeconds() {
}
return obj
})
await sendMessageToGVGCityWithSuc(groupId, serverType, cityId, PUSH_ROUTE.GVG_CITY_RANK_UPDATE, { cityId, ranks });
await sendMessageToGVGCityWithSuc(groupKey, cityId, PUSH_ROUTE.GVG_CITY_RANK_UPDATE, { cityId, ranks });
}
@@ -357,22 +357,22 @@ export async function gvgBattleEnd() {
// 城池占领情况
let keys = await findKeys(`${REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY}:${configId}:`);
let rankKeys = keys.map(key => {
let [,, _groupId, _serverType, _cityId] = key.split(':');
return { groupId: parseInt(_groupId), serverType: parseInt(_serverType), cityId: parseInt(_cityId) };
let [,, groupKey, _cityId] = key.split(':');
return { groupKey, cityId: parseInt(_cityId) };
}).sort((a, b) => b.cityId - a.cityId);
for(let { groupId, serverType, cityId } of rankKeys) {
for(let { groupKey, cityId } of rankKeys) {
let dicCity = gameData.gvgCity.get(cityId);
if(!dicCity) continue;
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupId, serverType, cityId });
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupKey, cityId });
let ranks = await r.getRankByRange();
// 排名最高占领城池
for(let obj of ranks) {
let rankInfo = <LeagueRankInfo>obj;
let cnt = guardLeagueCnt.get(rankInfo.code)||0;
if(cnt < GVG.GVG_CITY_OCCUPIED_NUMBER) {
await GVGCityModel.guardCity(configId, groupId, serverType, cityId, rankInfo);
await GVGCityModel.guardCity(configId, groupKey, cityId, rankInfo);
let dicCityAdd = gameData.gvgCityAdd.get(dicCity.cityType);
await sendMailToLeagueByContent(MAIL_TYPE.GVG_GUARD_CITY_REWARD, rankInfo.code, { params: [dicCity.cityName], goods: dicCityAdd.occupyReward });
guardLeagueCnt.set(rankInfo.code, cnt + 1);
@@ -384,11 +384,8 @@ export async function gvgBattleEnd() {
// 联军排行榜发放奖励
let leagueKeys = await findKeys(`${REDIS_KEY.GVG_BATTLE_LEAGUE_RANK}:${configId}:`);
for(let key of leagueKeys) {
let [,, _groupId, _serverType] = key.split(':');
let groupId = parseInt(_groupId);
let serverType = parseInt(_serverType);
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType });
let [,, groupKey] = key.split(':');
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupKey });
let ranks = await r.getRankByRange();
// 联军排行榜发放奖励
for(let _obj of ranks) {
@@ -401,10 +398,8 @@ export async function gvgBattleEnd() {
// 个人排行榜发放奖励
let playerKeys = await findKeys(`${REDIS_KEY.GVG_BATTLE_RANK}:${configId}:`);
for(let key of playerKeys) {
let [,, _groupId, _serverType] = key.split(':');
let groupId = parseInt(_groupId);
let serverType = parseInt(_serverType);
let r = new Rank(REDIS_KEY.GVG_BATTLE_RANK, { configId, groupId, serverType });
let [,, groupKey] = key.split(':');
let r = new Rank(REDIS_KEY.GVG_BATTLE_RANK, { configId, groupKey });
let ranks = await r.getRankByRange();
for(let _obj of ranks) {
@@ -420,10 +415,10 @@ export async function gvgBattleEnd() {
// —————————— 推送相关 —————————— //
// 推送
export async function battleEndSendMessage(groupId: number, serverType: number, cityId: number, defenseTeam: GVGTeamType, attackTeam: GVGTeamType) {
export async function battleEndSendMessage(groupKey: string, cityId: number, defenseTeam: GVGTeamType, attackTeam: GVGTeamType) {
let areaId = defenseTeam.curTeamBreak? defenseTeam.fromAreaId: defenseTeam.areaId;
// 推送伤害
await sendMessageToGVGAreaByTeamWithSuc(groupId, serverType, areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, {
await sendMessageToGVGAreaByTeamWithSuc(groupKey, areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, {
cityId, areaId, attackType: 3, teams: [new GVGTeamInList(defenseTeam), new GVGTeamInList(attackTeam)]
});
await pushTeamBeHurtMessage(defenseTeam, attackTeam);
@@ -434,14 +429,14 @@ export async function battleEndSendMessage(groupId: number, serverType: number,
export async function pushTeamBeHurtMessage(team: GVGTeamType, replaceTeam?: GVGTeamType) {
if(team.curTeamBreak && team.originPointId > 0) {
await sendMessageToGVGAreaByTeamWithSuc(team.groupId, team.serverType, team.fromAreaId, PUSH_ROUTE.GVG_AREA_POINT_CHANGE, {
await sendMessageToGVGAreaByTeamWithSuc(team.groupKey, team.fromAreaId, PUSH_ROUTE.GVG_AREA_POINT_CHANGE, {
cityId: team.cityId, areaId: team.fromAreaId, point: new GVGTeamInListOnPoint(team.originPointId, replaceTeam && !replaceTeam.curTeamBreak, replaceTeam)
});
}
await pushTeamMoveMessage(team);
if(team.isRobot && team.isBroken) {
await sendMessageToGVGAreaByTeamWithSuc(team.groupId, team.serverType, team.fromAreaId, PUSH_ROUTE.GVG_PLAYER_LEAVE_AREA, {
await sendMessageToGVGAreaByTeamWithSuc(team.groupKey, team.fromAreaId, PUSH_ROUTE.GVG_PLAYER_LEAVE_AREA, {
cityId: team.cityId, areaId: team.fromAreaId, teamCode: team.teamCode
});
}
@@ -450,12 +445,12 @@ export async function pushTeamBeHurtMessage(team: GVGTeamType, replaceTeam?: GVG
export async function pushTeamMoveMessage(team: GVGTeamType) {
if(team.fromAreaId != team.areaId) {
if(team.fromAreaId > 0) {
await sendMessageToGVGAreaByTeamWithSuc(team.groupId, team.serverType, team.fromAreaId, PUSH_ROUTE.GVG_PLAYER_LEAVE_AREA, {
await sendMessageToGVGAreaByTeamWithSuc(team.groupKey, team.fromAreaId, PUSH_ROUTE.GVG_PLAYER_LEAVE_AREA, {
cityId: team.cityId, areaId: team.fromAreaId, teamCode: team.teamCode
});
}
if(team.areaId > 0) {
await sendMessageToGVGAreaByTeamWithSuc(team.groupId, team.serverType, team.areaId, PUSH_ROUTE.GVG_PLAYER_AREA_ADD, {
await sendMessageToGVGAreaByTeamWithSuc(team.groupKey, team.areaId, PUSH_ROUTE.GVG_PLAYER_AREA_ADD, {
cityId: team.cityId, areaId: team.fromAreaId, player: new GVGTeamInList(team)
});
}
+25 -29
View File
@@ -28,7 +28,7 @@ import { Rank } from "../rankService";
import { findKeys, getAllServerName, redisClient } from "../redisService";
import { combinePushItem } from "./gvgItemService";
import { addVestigeLeagueRankRec } from "./gvgRecService";
import { getGroupIdOfServer, getGVGServerType } from "./gvgService";
import { getGroupIdOfServer, getGroupKey, getGVGServerType } from "./gvgService";
// 备战期的遗迹和激战期的开始结束战斗时间
export function getFightTimeByPeriod(period: GVG_PERIOD, time?: number) {
@@ -49,14 +49,14 @@ export function checkFightTime() {
// 征战中原每天随机的遗迹点
export async function getVestiges(serverId: number) {
let groupId = await getGroupIdOfServer(serverId);
let groupKey = await getGroupKey(serverId);
let serverType = await getGVGServerType(serverId);
let vestige = await GVGVestigeModel.getVestige(groupId);
let vestige = await GVGVestigeModel.getVestige(groupKey);
if(!vestige) {
let dicGVGVestige = gameData.gvgVestigeByServerType.get(serverType)||[];
let cnt = gameData.gvgVestigeCntByServerType.get(serverType)||0;
let randResult = getRandEelm(dicGVGVestige, cnt);
vestige = await GVGVestigeModel.initTodayVestige(groupId, serverType, randResult);
vestige = await GVGVestigeModel.initTodayVestige(groupKey, randResult);
}
return vestige.vestiges||[];
}
@@ -98,9 +98,9 @@ function randomRank(min: number, max: number, len: number) {
}
// 根据ranks获取oppPlayer显示数据
export async function getOppPlayerByRanks(serverId: number, groupId: number, serverType: number, vestigeId: number, ranks: number[]) {
export async function getOppPlayerByRanks(serverId: number, groupKey: string, vestigeId: number, ranks: number[]) {
let serverNames = await getAllServerName();
let opps = await GVGVestigeRankModel.findByRanks(groupId, serverType, vestigeId, ranks);
let opps = await GVGVestigeRankModel.findByRanks(groupKey, vestigeId, ranks);
let roleIds = opps.map(cur => cur.roleId);
let roles = await RoleModel.findByRoleIds(roleIds, 'roleId roleName head frame spine heads frames spines title lv guildName serverId updatedAt')
let dicRankMap = gameData.gvgVestige.get(vestigeId);
@@ -171,19 +171,19 @@ export function isRobot(roleId: string) {
return roleId.startsWith('robot');
}
export async function checkVestigeOppStatus(configId: number, groupId: number, serverType: number, vestigeId: number, roleId: string, myRank: number, targetRoleId: string, rank: number) {
export async function checkVestigeOppStatus(configId: number, groupKey: string, vestigeId: number, roleId: string, myRank: number, targetRoleId: string, rank: number) {
let myData = await getMyVestigeRank(configId, groupId, serverType, vestigeId, roleId);
let myData = await getMyVestigeRank(configId, groupKey, vestigeId, roleId);
if(!myData || myData.rank != myRank) return VESTIGE_OPP_STATUS.MY_RANK_CHANGE;
if(isRobot(targetRoleId)) {
let targetData = await GVGVestigeRankModel.findByRank(configId, groupId, serverType, vestigeId, rank);
let targetData = await GVGVestigeRankModel.findByRank(configId, groupKey, vestigeId, rank);
if(targetData) return VESTIGE_OPP_STATUS.OPP_RANK_CHANGE;
} else {
let targetData = await GVGVestigeRankModel.findByRole(vestigeId, targetRoleId);
if(targetData?.rank != rank) return VESTIGE_OPP_STATUS.OPP_RANK_CHANGE;
}
let lockResult = await GVGVestigeLockModel.chooseOppLock(groupId, serverType, vestigeId, rank, configId, roleId, targetRoleId);
let lockResult = await GVGVestigeLockModel.chooseOppLock(groupKey, vestigeId, rank, configId, roleId, targetRoleId);
if(!lockResult) return VESTIGE_OPP_STATUS.OPP_IS_LOCKED;
return VESTIGE_OPP_STATUS.BATTLE;
@@ -314,7 +314,7 @@ export function calBreakGoods(vestige: number, historyRank: number, rank: number
}
// 玩家当天的驻扎记录,没有的话就创建一个
export async function getMyVestigeRank(configId: number, groupId: number, serverType: number, vestigeId: number, roleId: string, myLeague?: GVGLeagueType) {
export async function getMyVestigeRank(configId: number, groupKey: string, vestigeId: number, roleId: string, myLeague?: GVGLeagueType) {
let myVestigeRank = await GVGVestigeRankModel.findByRole(vestigeId, roleId); // 我在这个遗迹的排名
if(!myVestigeRank) {
@@ -324,31 +324,31 @@ export async function getMyVestigeRank(configId: number, groupId: number, server
myLeague = await GVGLeagueModel.findLeagueByGuild(role.guildCode);
if(!myLeague) return null
}
myVestigeRank = await GVGVestigeRankModel.initRank(configId, vestigeId, groupId, serverType, role, myLeague.leagueCode, oppRanks );
myVestigeRank = await GVGVestigeRankModel.initRank(configId, vestigeId, groupKey, role, myLeague.leagueCode, oppRanks );
}
return myVestigeRank;
}
// 保存排行榜
export async function saveScoreToRank(rec: GVGVestigeRecType) {
await savePlayerRank(rec.configId, rec.groupId, rec.serverType, rec.vestigeId, rec.attackInfo);
await savePlayerRank(rec.configId, rec.groupId, rec.serverType, rec.vestigeId, rec.defenseInfo);
await savePlayerRank(rec.configId, rec.groupKey, rec.vestigeId, rec.attackInfo);
await savePlayerRank(rec.configId, rec.groupKey, rec.vestigeId, rec.defenseInfo);
}
export function getDayKeyInfo() {
return moment().format('YYMMDD');
}
export async function savePlayerRank(configId: number, groupId: number, serverType: number, vestigeId: number, playerInfo: Partial<OppPlayerInfo>) {
export async function savePlayerRank(configId: number, groupKey: string, vestigeId: number, playerInfo: Partial<OppPlayerInfo>) {
if(playerInfo.isRobot) return
let dicRankMap = gameData.gvgVestige.get(vestigeId);
let newRank = dicRankMap?.get(playerInfo.newRank)?.score||0;
let oldRank = dicRankMap?.get(playerInfo.oldRank)?.score||0;
let myScore = await GVGVestigeSumRankModel.incScore(playerInfo.roleId, playerInfo.leagueCode, configId, groupId, serverType, newRank - oldRank);
let r1 = new Rank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, { serverType, groupId, day: getDayKeyInfo() });
let myScore = await GVGVestigeSumRankModel.incScore(playerInfo.roleId, playerInfo.leagueCode, configId, groupKey, newRank - oldRank);
let r1 = new Rank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, { groupKey, day: getDayKeyInfo() });
await r1.setRankWithRoleInfo(playerInfo.roleId, myScore.score, myScore.updatedAt.getTime());
let leagueScore = await GVGVestigeLeagueRankModel.incScore(configId, playerInfo.leagueCode, groupId, serverType, newRank - oldRank);
let r2 = new Rank(REDIS_KEY.GVG_VESTIGE_LEAGUE, { serverType, groupId, day: getDayKeyInfo() });
let leagueScore = await GVGVestigeLeagueRankModel.incScore(configId, playerInfo.leagueCode, groupKey, newRank - oldRank);
let r2 = new Rank(REDIS_KEY.GVG_VESTIGE_LEAGUE, { groupKey, day: getDayKeyInfo() });
await r2.setRankWithLeagueInfo(playerInfo.leagueCode, leagueScore.score, leagueScore.updatedAt.getTime());
}
@@ -389,23 +389,19 @@ export async function saveVestigeRankSchedule() {
let day = getDayKeyInfo();
let keys = await findKeys(`${REDIS_KEY.GVG_VESTIGE_LEAGUE}:${day}:`);
for(let key of keys) {
let [,, _groupId, _serverType] = key.split(':');
let groupId = parseInt(_groupId);
let serverType = parseInt(_serverType);
let r = new Rank(REDIS_KEY.GVG_VESTIGE_LEAGUE, { groupId, serverType, day});
let [,, groupKey] = key.split(':');
let r = new Rank(REDIS_KEY.GVG_VESTIGE_LEAGUE, { groupKey, day});
let ranks = await r.getRankByRangeRaw();
await GVGVestigeLeagueRankModel.saveRank(groupId, serverType, ranks);
await GVGVestigeLeagueRankModel.saveRank(groupKey, ranks);
await addVestigeLeagueRankRec(config.configId, ranks);
}
let memberKeys = await findKeys(`${REDIS_KEY.GVG_VESTIGE_MEMBER_ALL}:${day}:`);
for(let key of memberKeys) {
let [,, _groupId, _serverType] = key.split(':');
let groupId = parseInt(_groupId);
let serverType = parseInt(_serverType);
let r = new Rank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, { groupId, serverType, day});
let [,, groupKey] = key.split(':');
let r = new Rank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, { groupKey, day});
let ranks = await r.getRankByRangeRaw();
await GVGVestigeSumRankModel.saveRank(groupId, serverType, ranks);
await GVGVestigeSumRankModel.saveRank(groupKey, ranks);
}
let playerSumRanks = await GVGVestigeSumRankModel.findAllScores();
await GVGUserDataModel.addVestigeScores(config.configId, playerSumRanks);
@@ -292,4 +292,14 @@ export async function getLeagueRankBox(configId: number, leagueCode: string, rol
let canReceivePlayerRanks = await GVGVestigeSumRankModel.getCanReceiveRanks(configId, roleId);
let { canReceiveBox } = calVestigeLeagueBoxRewards(canReceiveLeagueRanks, canReceivePlayerRanks);
return { canReceiveBox }
}
export async function getGroupKey(serverId: number) {
let serverType = await getGVGServerType(serverId);
if(serverType == GVG_SERVER_TYPE.SINGLE) {
return `s${serverId}`;
} else {
let groupId = await getGroupIdOfServer(serverId);
return `g${groupId}`;
}
}
+9 -9
View File
@@ -61,21 +61,21 @@ export async function sendMessageToGuild(guildCode: string, route: string, data:
await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, data);
}
export async function sendMessageToGVGAreaWithSuc(groupId: number, serverType: number, areaId: number, route: string, data: any) {
let channelSid = await getGVGAreaChannelSid(groupId, serverType, areaId);
let roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREAS, `${groupId}_${serverType}_${areaId}`);
export async function sendMessageToGVGAreaWithSuc(groupKey: string, areaId: number, route: string, data: any) {
let channelSid = await getGVGAreaChannelSid(groupKey, areaId);
let roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREAS, `${groupKey}_${areaId}`);
await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, resResult(STATUS.SUCCESS, data));
}
export async function sendMessageToGVGAreaByTeamWithSuc(groupId: number, serverType: number, areaId: number, route: string, data: any) {
let channelSid = await getGVGAreaTeamChannelSid(groupId, serverType, areaId);
let roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREA_BY_TEAM, `${groupId}_${serverType}_${areaId}`);
export async function sendMessageToGVGAreaByTeamWithSuc(groupKey: string, areaId: number, route: string, data: any) {
let channelSid = await getGVGAreaTeamChannelSid(groupKey, areaId);
let roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREA_BY_TEAM, `${groupKey}_${areaId}`);
await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, resResult(STATUS.SUCCESS, data));
}
export async function sendMessageToGVGCityWithSuc(groupId: number, serverType: number, cityId: number, route: string, data: any) {
let channelSid = await getGVGCityTeamChannelSid(groupId, serverType, cityId);
let roomId = groupRoomId(CHANNEL_PREFIX.GVG_CITY, `${groupId}_${serverType}_${cityId}`);
export async function sendMessageToGVGCityWithSuc(groupKey: string, cityId: number, route: string, data: any) {
let channelSid = await getGVGCityTeamChannelSid(groupKey, cityId);
let roomId = groupRoomId(CHANNEL_PREFIX.GVG_CITY, `${groupKey}_${cityId}`);
await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, resResult(STATUS.SUCCESS, data));
}
+4 -4
View File
@@ -1183,9 +1183,9 @@ export async function setRankRedisFromDb(type: string, args?: { serverId?: numbe
}
} else if (type == REDIS_KEY.GVG_VESTIGE_MEMBER_ALL) {
let ranks = await GVGVestigeSumRankModel.findRankByGroupId();
for(let { _id: { groupId, serverType }, arr, roleIds } of ranks) {
for(let { _id: groupKey, arr, roleIds } of ranks) {
let roles = await RoleModel.findByRoleIds(roleIds, ROLE_SELECT.RANK);
let r = new Rank(type, { groupId, serverType, day: getDayKeyInfo() });
let r = new Rank(type, { groupKey, day: getDayKeyInfo() });
r.setIsInit(true);
for(let { roleId, score, updatedAt } of arr) {
let role = roles.find(cur => cur.roleId == roleId);
@@ -1196,9 +1196,9 @@ export async function setRankRedisFromDb(type: string, args?: { serverId?: numbe
}
} else if (type == REDIS_KEY.GVG_VESTIGE_LEAGUE) {
let ranks = await GVGVestigeLeagueRankModel.findRank();
for(let { _id: { groupId, serverType }, arr, leagueCodes } of ranks) {
for(let { _id: groupKey, arr, leagueCodes } of ranks) {
let leagues = await GVGLeagueModel.findByCodes(leagueCodes);
let r = new Rank(type, { groupId, serverType, day: getDayKeyInfo() });
let r = new Rank(type, { groupKey, day: getDayKeyInfo() });
r.setIsInit(true);
for(let { leagueCode, score, updatedAt } of arr) {
let league = leagues.find(cur => cur.leagueCode == leagueCode);
+6 -6
View File
@@ -706,8 +706,8 @@ export async function getGVGHistoryAreas(roleId: string) {
return areaIds.split('&');
}
export async function addGVGHistoryAreas(roleId: string, groupId: number, serverType: number, areaIds: number[]) {
let key = areaIds.map(areaId => `${groupId}_${serverType}_${areaId}`).join('&');
export async function addGVGHistoryAreas(roleId: string, groupKey: string, areaIds: number[]) {
let key = areaIds.map(areaId => `${groupKey}_${areaId}`).join('&');
const result = await redisClient().hsetAsync(REDIS_KEY.GVG_HISTORY_AREA, roleId, key);
return result;
}
@@ -728,8 +728,8 @@ export async function getGVGHistoryAreaTeam(roleId: string) {
return channelName
}
export async function addGVGHistoryAreaTeam(roleId: string, groupId: number, serverType: number, areaId: number) {
const result = await redisClient().hsetAsync(REDIS_KEY.GVG_HISTORY_AREA_TEAM, roleId, `${groupId}_${serverType}_${areaId}`);
export async function addGVGHistoryAreaTeam(roleId: string, groupKey: string, areaId: number) {
const result = await redisClient().hsetAsync(REDIS_KEY.GVG_HISTORY_AREA_TEAM, roleId, `${groupKey}_${areaId}`);
return result;
}
@@ -749,8 +749,8 @@ export async function getGVGHistoryCityTeam(roleId: string) {
return channelName
}
export async function addGVGHistoryCityTeam(roleId: string, groupId: number, serverType: number, cityId: number) {
const result = await redisClient().hsetAsync(REDIS_KEY.GVG_HISTORY_CITY, roleId, `${groupId}_${serverType}_${cityId}`);
export async function addGVGHistoryCityTeam(roleId: string, groupKey: string, cityId: number) {
const result = await redisClient().hsetAsync(REDIS_KEY.GVG_HISTORY_CITY, roleId, `${groupKey}_${cityId}`);
return result;
}