🐞 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
@@ -6,7 +6,7 @@ import { GVGCityModel } from '../../../db/GVGCity';
import { Application, BackendSession, ChannelService, HandlerService, pinus } from "pinus";
import { resResult, genCode } from "../../../pubUtils/util";
import { GVGLeagueModel } from '../../../db/GVGLeague';
import { checkGVGPeriod, getGroupIdOfServer, getGVGConfig, getGVGPeriodData, getGVGServerType } from '../../../services/gvg/gvgService';
import { getGroupKey, getGVGConfig, getGVGPeriodData } from '../../../services/gvg/gvgService';
import { redisAddBattleScore, battleEndSendMessage, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanksByCity, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechKnifeHurt, getTechReviveMinus, initRobots, pushTeamMoveMessage, getGVGCitiesInfo } from '../../../services/gvg/gvgBattleService';
import { getGVGBattleData } from '../../../services/gvg/gvgBattleMemory';
import { GVGBattleRecModel } from '../../../db/GVGBattleRec';
@@ -66,15 +66,13 @@ export class GVGBattleHandler {
let { configId, period } = getGVGPeriodData();
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let { leagueCode, name: leagueName } = myLeague;
let durability = gameData.gvgTeamDurability.get(index)||0;
let updateParam: SaveTeamUpdateParam = { index, head, spine, frame, configId, groupId, serverType }
let groupKey = await getGroupKey(serverId);
let updateParam: SaveTeamUpdateParam = { index, head, spine, frame, configId, groupKey }
if(lineup) {
let attrByHid = await getHeroesAttributes(roleId);
let { isOK, heroes } = await checkBattleHeroesByHid(roleId, lineup.map(cur => cur.actorId));
@@ -117,13 +115,11 @@ export class GVGBattleHandler {
let { configId, period } = getGVGPeriodData();
let { startFightTime, endFightTime } = getFightTimeByPeriod(period);
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
const city = await GVGCityModel.findByCityId(configId, groupId, serverType, cityId);
let groupKey = await getGroupKey(serverId);
const city = await GVGCityModel.findByCityId(configId, groupKey, cityId);
const { guardLeague: leagueCode = '', guardLeagueName: name = '', guardLeagueIcon: icon = 0, players = [] } = city||{};
let ourTeamCnt = 0, oppTeamCnt = 0;
@@ -171,14 +167,13 @@ export class GVGBattleHandler {
let { configId, period } = getGVGPeriodData();
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
// 初始化本城池的守擂机器人
await initRobots(configId, groupId, serverType, cityId);
await initRobots(configId, groupKey, cityId);
let teams = await GVGTeamModel.findByRole(roleId, '-_id');
// 每赛季初自己的几支队伍恢复耐久、城市、顺便更新一下自己的玩家名、联军
@@ -186,7 +181,7 @@ export class GVGBattleHandler {
for(let team of teams) {
if(team.configId != configId) {
let { teamCode, maxDurability } = team;
updateArr.push({ teamCode, durability: maxDurability, cityId: 0, areaId: 0, pointId: 0, roleName, guildCode, leagueCode: myLeague.leagueCode, leagueName: myLeague.name, groupId, serverType });
updateArr.push({ teamCode, durability: maxDurability, cityId: 0, areaId: 0, pointId: 0, roleName, guildCode, leagueCode: myLeague.leagueCode, leagueName: myLeague.name, groupKey });
}
if(team.cityId) originCityId = team.cityId;
}
@@ -196,26 +191,26 @@ export class GVGBattleHandler {
if (originCityId != cityId) {
let gvgUserData = await GVGUserDataModel.findByRole(configId, myLeague.leagueCode, roleId);
if(gvgUserData?.cityId > 0) { // 如果leaveCity没有退出成功,玩家还遗留在上一座城中,做一下处理
await GVGCityModel.decreasePlayer(configId, groupId, serverType, gvgUserData.cityId, roleId);
await GVGCityModel.decreasePlayer(configId, groupKey, gvgUserData.cityId, roleId);
}
const roleTeamCnt = await GVGTeamModel.getTeamCntByRole(roleId);
let city = await GVGCityModel.increasePlayer(configId, groupId, serverType, cityId, roleId, myLeague.leagueCode, roleTeamCnt);
let city = await GVGCityModel.increasePlayer(configId, groupKey, cityId, roleId, myLeague.leagueCode, roleTeamCnt);
if(!city) return resResult(STATUS.GVG_BATTLE_CITY_FULL);
gvgUserData = await GVGUserDataModel.changeCity(configId, myLeague.leagueCode, roleId, cityId);
let areaId = getBirthAreaOfCity(city, myLeague.leagueCode);
await GVGTeamModel.enterCity(roleId, cityId, areaId, groupId, serverType);
await GVGTeamModel.enterCity(roleId, cityId, areaId, groupKey);
teams = await GVGTeamModel.findByRole(roleId, '-_id');
// 更新内存队伍信息
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.enterCity(...teams);
}
const recs = await GVGRecModel.findBattleRecByCity(configId, groupId, serverType, cityId);
const recs = await GVGRecModel.findBattleRecByCity(configId, groupKey, cityId);
const teamResult = teams.map(team => new MyTeamInfo(team));
const { ranks, myRank } = await getBattleRanksByCity(configId, groupId, serverType, cityId, myLeague);
const { ranks, myRank } = await getBattleRanksByCity(configId, groupKey, cityId, myLeague);
await leaveGVGCityTeamChannel(roleId, sid);
await addRoleToGVGCityChannel(roleId, groupId, serverType, cityId, sid);
await addRoleToGVGCityChannel(roleId, groupKey, cityId, sid);
return resResult(STATUS.SUCCESS, {
cityId,
@@ -235,8 +230,7 @@ export class GVGBattleHandler {
const { cityId } = msg;
let { configId, period } = getGVGPeriodData();
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
// 检测是否已经在城池中
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
@@ -249,16 +243,16 @@ export class GVGBattleHandler {
return resResult(STATUS.GVG_USER_NOT_IN_CITY);
}
const city = await GVGCityModel.decreasePlayer(configId, groupId, serverType, cityId, roleId);
const city = await GVGCityModel.decreasePlayer(configId, groupKey, cityId, roleId);
if (!city) {
return resResult(STATUS.GVG_CITY_NOT_FOUND);
}
// 更新玩家城池和队伍城池
gvgUserData = await GVGUserDataModel.changeCity(configId, myLeague.leagueCode, roleId, 0);
await GVGTeamModel.enterCity(roleId, 0, 0, groupId, serverType);
await GVGTeamModel.enterCity(roleId, 0, 0, groupKey);
// 处理内存数据
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.leaveCity(roleId);
await leaveGVGAreaChannel(roleId, sid);
@@ -277,12 +271,10 @@ export class GVGBattleHandler {
if(!checkAreaIsInCity(cityId, areaIds)) return resResult(STATUS.GVG_AREA_NOT_IN_CITY);
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let serverNames = await getAllServerName();
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
let result: GVGAreaInMap[] = [];
for(let areaId of areaIds) {
let teams = teamObj.findTeamsByArea(areaId);
@@ -291,7 +283,7 @@ export class GVGBattleHandler {
}
// 加入频道
await leaveGVGAreaChannel(roleId, sid);
await addRoleToAreaChannel(roleId, groupId, serverType, areaIds, sid);
await addRoleToAreaChannel(roleId, groupKey, areaIds, sid);
return resResult(STATUS.SUCCESS, { cityId, areas: result });
}
@@ -303,14 +295,13 @@ export class GVGBattleHandler {
const serverId = session.get('serverId');
const { cityId, teamCode } = msg;
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let myTeam = await GVGTeamModel.findMyTeamByCode(roleId, teamCode);
if(!myTeam) return resResult(STATUS.GVG_TEAM_NOT_FOUND);
if(myTeam.cityId != cityId) return resResult(STATUS.GVG_BATTLE_IS_NOT_IN_CITY);
let teams = await GVGTeamModel.findByAreaId(groupId, serverType, cityId, myTeam.areaId);
let teams = await GVGTeamModel.findByAreaId(groupKey, cityId, myTeam.areaId);
let points: GVGTeamInListOnPoint[] = [], players: GVGTeamInList[] = [];
let pointIds = gameData.gvgPointByAreaId.get(myTeam.areaId)||[];
for(let pointId of pointIds) {
@@ -326,7 +317,7 @@ export class GVGBattleHandler {
}
await leaveGVGAreaTeamChannel(roleId, sid);
await addRoleToAreaTeamChannel(roleId, groupId, serverType, myTeam.areaId, sid);
await addRoleToAreaTeamChannel(roleId, groupKey, myTeam.areaId, sid);
return resResult(STATUS.SUCCESS, {
cityId, areaId: myTeam.areaId, points, players
@@ -341,8 +332,7 @@ export class GVGBattleHandler {
const serverId = session.get('serverId');
const { areaId, cityId, teamCode } = msg;
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let team = await GVGTeamModel.findMyTeamByCode(roleId, teamCode);
let checkResult = checkMoveStatus(team, cityId, areaId);
@@ -351,10 +341,10 @@ export class GVGBattleHandler {
team = await GVGTeamModel.startMove(teamCode, areaId, team.areaId);
// 更新内存数据
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.move(teamCode, areaId, team.fromAreaId, team.startMoveTime, team.stopMoveTime);
await addRoleToAreaTeamChannel(roleId, groupId, serverType, areaId, sid);
await addRoleToAreaTeamChannel(roleId, groupKey, areaId, sid);
await pushTeamMoveMessage(team);
return resResult(STATUS.SUCCESS, { areaId, cityId, stopMoveTime: team.stopMoveTime });
}
@@ -367,8 +357,7 @@ export class GVGBattleHandler {
const serverId = session.get('serverId');
const { areaId, cityId, teamCode } = msg;
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let team = await GVGTeamModel.findMyTeamByCode(roleId, teamCode);
if(!team) return resResult(STATUS.GVG_BATTLE_TEAM_NOT_FOUND);
@@ -376,11 +365,11 @@ export class GVGBattleHandler {
team = await GVGTeamModel.stopMove(teamCode, areaId);
// 更新内存数据
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.move(teamCode, areaId, 0, team.startMoveTime, team.stopMoveTime);
await leaveGVGAreaTeamChannel(roleId, sid);
await addRoleToAreaTeamChannel(roleId, groupId, serverType, areaId, sid);
await addRoleToAreaTeamChannel(roleId, groupKey, areaId, sid);
return resResult(STATUS.SUCCESS, { areaId, cityId, curTeam: new MyTeamInfo(team) });
}
@@ -393,8 +382,7 @@ export class GVGBattleHandler {
let { configId, period } = getGVGPeriodData();
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let myTeam = await GVGTeamModel.findMyTeamByCode(roleId, teamCode);
if(!myTeam) return resResult(STATUS.GVG_TEAM_NOT_FOUND);
@@ -406,7 +394,7 @@ export class GVGBattleHandler {
if(!point) return resResult(STATUS.GVG_POINT_HAS_SETTLED);
const curTeam = await GVGTeamModel.settlePoint(teamCode, pointId);
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.teamSettle(roleId, teamCode, pointId);
addTeamSettleRec(curTeam);
@@ -423,8 +411,7 @@ export class GVGBattleHandler {
let { configId, period } = getGVGPeriodData();
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let myTeam = await GVGTeamModel.findMyTeamByCode(roleId, teamCode);
if(!myTeam) return resResult(STATUS.GVG_TEAM_NOT_FOUND);
@@ -432,8 +419,8 @@ export class GVGBattleHandler {
if(dicAreaPoint.areaId != myTeam.areaId) return resResult(STATUS.GVG_POINT_NOT_AREA);
const curTeam = await GVGTeamModel.settlePoint(teamCode, 0);
await GVGCityAreaPointModel.leavePoint(configId, groupId, serverType, pointId);
let teamObj = getGVGBattleData(groupId, serverType);
await GVGCityAreaPointModel.leavePoint(configId, groupKey, pointId);
let teamObj = getGVGBattleData(groupKey);
teamObj.teamSettle(roleId, teamCode, pointId);
return resResult(STATUS.SUCCESS, { curTeam: new MyTeamInfo(curTeam) });
@@ -450,20 +437,19 @@ export class GVGBattleHandler {
let { configId, period } = getGVGPeriodData();
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let { attackTeam, defenseTeam } = await GVGTeamModel.findBattleTeams(teamCode, oppoTeamCode);
let checkStatus = checkGVGBattleStart(roleId, attackTeam, defenseTeam);
if(checkStatus.code != 0) return resResult(checkStatus);
const warId = getGVGWarId(defenseTeam);
const battleRecord = await GVGBattleRecModel.createRec(configId, groupId, serverType, warId, attackTeam, defenseTeam);
const battleRecord = await GVGBattleRecModel.createRec(configId, groupKey, warId, attackTeam, defenseTeam);
attackTeam = await GVGTeamModel.battleStartLockAttack(teamCode);
defenseTeam = await GVGTeamModel.battleStartLockDefense(oppoTeamCode, teamCode);
// 内存处理
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.setTime(attackTeam.teamCode, attackTeam);
teamObj.setTime(defenseTeam.teamCode, defenseTeam);
let heroes = getOppHeroes(warId, defenseTeam.isRobot, defenseTeam.lineup)
@@ -483,9 +469,8 @@ export class GVGBattleHandler {
let { attackTeam, defenseTeam } = await GVGTeamModel.findBattleTeams(record.attackTeam.teamCode, record.defenseTeam.teamCode);
if(defenseTeam.lockTeamCode != attackTeam.teamCode) return resResult(STATUS.GVG_LOCK_TIME_OUT)
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let city = await GVGCityModel.findByCityId(configId, groupId, serverType, cityId);
let groupKey = await getGroupKey(serverId);
let city = await GVGCityModel.findByCityId(configId, groupKey, cityId);
if (!city) return resResult(STATUS.GVG_CITY_NOT_FOUND);
// 计算并更新两支队伍耐久
@@ -497,7 +482,7 @@ export class GVGBattleHandler {
attackTeam = await GVGTeamModel.settlePoint(attackTeam.teamCode, defenseTeam.originPointId);
await GVGCityAreaPointModel.settlePoint(cityId, attackTeam.areaId, defenseTeam.originPointId, attackTeam);
} else {
await GVGCityAreaPointModel.leavePoint(configId, groupId, serverType, defenseTeam.originPointId);
await GVGCityAreaPointModel.leavePoint(configId, groupKey, defenseTeam.originPointId);
}
}
if(defenseTeam.curTeamBreak) {
@@ -507,11 +492,11 @@ export class GVGBattleHandler {
}
// 更新内存
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.battleEnd([attackTeam, defenseTeam]);
// 更新rec
let rec = await GVGBattleRecModel.battleEnd(battleCode, isSuccess);
await battleEndSendMessage(groupId, serverType, cityId, defenseTeam, attackTeam);
await battleEndSendMessage(groupKey, cityId, defenseTeam, attackTeam);
addBattleEndRec(rec);
return resResult(STATUS.SUCCESS, { curTeam: new MyTeamInfo(attackTeam) });
@@ -531,8 +516,7 @@ export class GVGBattleHandler {
let { configId, period } = getGVGPeriodData();
// if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); // TODO 测试临时注
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let { attackTeam, defenseTeam } = await GVGTeamModel.findBattleTeams(teamCode, oppoTeamCode);
let checkStatus = checkGVGBattleStart(roleId, attackTeam, defenseTeam);
@@ -544,7 +528,7 @@ export class GVGBattleHandler {
let costResult = await handleGVGCost(roleId, myLeague.leagueCode, sid, [{ id: GVG_ITEM.KNIFE, count: 1 }], [], ITEM_CHANGE_REASON.GVG_USE_ITEM);
if(!costResult) return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
let city = await GVGCityModel.findByCityId(configId, groupId, serverType, cityId);
let city = await GVGCityModel.findByCityId(configId, groupKey, cityId);
if (!city) return resResult(STATUS.GVG_CITY_NOT_FOUND);
defenseTeam = await GVGTeamModel.battleEndDefense(teamCode, await getTechKnifeHurt(configId, attackTeam.leagueCode), getBirthAreaOfCity(city, defenseTeam.leagueCode), await getTechReviveMinus(configId, defenseTeam.leagueCode));
@@ -553,7 +537,7 @@ export class GVGBattleHandler {
attackTeam = await GVGTeamModel.settlePoint(attackTeam.teamCode, defenseTeam.originPointId);
await GVGCityAreaPointModel.settlePoint(cityId, attackTeam.areaId, defenseTeam.originPointId, attackTeam);
} else {
await GVGCityAreaPointModel.leavePoint(configId, groupId, serverType, defenseTeam.originPointId);
await GVGCityAreaPointModel.leavePoint(configId, groupKey, defenseTeam.originPointId);
}
}
@@ -563,10 +547,10 @@ export class GVGBattleHandler {
}
// 更新内存
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.battleEnd([attackTeam, defenseTeam]);
await battleEndSendMessage(groupId, serverType, cityId, defenseTeam, attackTeam);
await battleEndSendMessage(groupKey, cityId, defenseTeam, attackTeam);
return resResult(STATUS.SUCCESS, { curTeam: new MyTeamInfo(attackTeam) });
}
@@ -580,8 +564,7 @@ export class GVGBattleHandler {
const { teamCode } = msg;
let { configId, period } = getGVGPeriodData();
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
@@ -607,7 +590,7 @@ export class GVGBattleHandler {
team = await GVGTeamModel.reviveTeam(teamCode);
// 更新内存
let teamObj = getGVGBattleData(groupId, serverType);
let teamObj = getGVGBattleData(groupKey);
teamObj.battleEnd([team]);
// 更新成功返回队伍信息
@@ -623,15 +606,14 @@ export class GVGBattleHandler {
const { type, cityId } = msg;
// 根据 type 获取战报
let { configId, period } = getGVGPeriodData();
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let recs: GVGRecType[] = [];
if(type == GVG_REC_TYPE.BATTLE_BY_CITY) {
recs = await GVGRecModel.findBattleRecByCity(configId, groupId, serverType, cityId);
recs = await GVGRecModel.findBattleRecByCity(configId, groupKey, cityId);
} else if (type == GVG_REC_TYPE.BATTLE_BY_LEAGUE) {
recs = await GVGRecModel.findBattleRecByLeague(configId, myLeague.leagueCode);
} else if (type == GVG_REC_TYPE.BATTLE_BY_ROLE) {
@@ -645,11 +627,10 @@ export class GVGBattleHandler {
const serverId = session.get('serverId');
let { configId } = getGVGPeriodData();
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
const cities = await GVGCityModel.findByConfig(configId, groupId, serverType);
const points = await GVGCityAreaPointModel.findByConfig(configId, groupId, serverType);
const cities = await GVGCityModel.findByConfig(configId, groupKey);
const points = await GVGCityAreaPointModel.findByConfig(configId, groupKey);
let result: { cityId: number, guardLeagueName: string, areas: { areaId: number, points: { pointId: number, guardLeagueName: string }[] }[] }[] = [];
for(let [ cityId, { areaIds }] of gameData.gvgCity) {
@@ -677,18 +658,16 @@ export class GVGBattleHandler {
const serverId = session.get('serverId');
let { configId } = getGVGPeriodData();
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let cities = await getGVGCitiesInfo(configId, groupKey);
let cities = await getGVGCitiesInfo(configId, groupId, serverType);
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType });
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupKey });
let leagueRanksRaw = await r.getRankByRange();
let leagueRanks = leagueRanksRaw.map(obj => {
if(obj instanceof LeagueRankInfo) return { rank: obj.rank, name: obj.name, score: obj.num }
});
let r2 = new Rank(REDIS_KEY.GVG_BATTLE_RANK, { configId, groupId, serverType });
let r2 = new Rank(REDIS_KEY.GVG_BATTLE_RANK, { configId, groupKey });
let memberRanksRaw = await r2.getRankByRange();
let memberRanks = memberRanksRaw.map(obj => {
if(obj instanceof RoleRankInfo) return { rank: obj.rank, name: obj.roleName, score: obj.num }
@@ -22,7 +22,7 @@ import { calBreakGoods, checkHeroIsUsedInOtherVestige, checkVestige, checkVestig
import { addGVGReward, combinePushItem, handleGVGCost } from "../../../services/gvg/gvgItemService";
import { addGVGActive } from "../../../services/gvg/gvgPrepareService";
import { addVestigeBattleEndRec } from "../../../services/gvg/gvgRecService";
import { getGroupIdOfServer, getGVGPeriodData, getGVGServerType } from "../../../services/gvg/gvgService";
import { getGroupKey, getGVGPeriodData } from "../../../services/gvg/gvgService";
import { checkBattleHeroesByHid } from "../../../services/normalBattleService";
import { Rank } from "../../../services/rankService";
import { getAllServerName } from "../../../services/redisService";
@@ -56,19 +56,18 @@ export class GVGProduceHandler {
const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let dicRankMap = gameData.gvgVestige.get(vestigeId);
if(!dicRankMap) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let myVestigeRank = await getMyVestigeRank(configId, groupId, serverType, vestigeId, roleId, myLeague);
let myVestigeRank = await getMyVestigeRank(configId, groupKey, vestigeId, roleId, myLeague);
if(!myVestigeRank) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let { rank, lineup, oppRanks, refreshCnt } = myVestigeRank;
let lineupCe = lineup.reduce((pre, cur) => pre + cur.ce, 0);
let oppPlayers = await getOppPlayerByRanks(serverId, groupId, serverType, vestigeId, oppRanks);
let oppPlayers = await getOppPlayerByRanks(serverId, groupKey, vestigeId, oppRanks);
let usedHeroes = await getVestigeUsedHeroes(roleId, vestigeId);
return resResult(STATUS.SUCCESS, {
@@ -94,10 +93,9 @@ export class GVGProduceHandler {
}
let { configId, period } = getGVGPeriodData();
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let myVestigeRank = await getMyVestigeRank(configId, groupId, serverType, vestigeId, roleId);
let myVestigeRank = await getMyVestigeRank(configId, groupKey, vestigeId, roleId);
if(!myVestigeRank) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
for(let { actorId } of heroes) {
@@ -172,17 +170,16 @@ export class GVGProduceHandler {
}
let { configId, period } = getGVGPeriodData();
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let myVestigeRank = await getMyVestigeRank(configId, groupId, serverType, vestigeId, roleId);
let myVestigeRank = await getMyVestigeRank(configId, groupKey, vestigeId, roleId);
let refreshCnt = myVestigeRank.refreshCnt||0;
if(refreshCnt >= GVG.GVG_REFRESH_TIME) return resResult(STATUS.GVG_VESTIGE_REFESH_CNT_MAX);
let oppRanks = refreshVestigeOppRanks(myVestigeRank.rank);
myVestigeRank = await GVGVestigeRankModel.refreshOpp(roleId, vestigeId, oppRanks );
let oppPlayers = await getOppPlayerByRanks(serverId, groupId, serverType, vestigeId, myVestigeRank.oppRanks);
let oppPlayers = await getOppPlayerByRanks(serverId, groupKey, vestigeId, myVestigeRank.oppRanks);
// 返回
return resResult(STATUS.SUCCESS, { vestigeId, refreshCnt: myVestigeRank.refreshCnt, oppPlayers });
@@ -217,20 +214,19 @@ export class GVGProduceHandler {
const hasItem = await GVGUserItemModel.checkItemCnt(configId, myLeague.leagueCode, roleId, GVG_ITEM.FIGHT_COIN, 1);
if(!hasItem) return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
const groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
const groupKey = await getGroupKey(serverId);
let status = await checkVestigeOppStatus(configId, groupId, serverType, vestigeId, roleId, myRank, targetRoleId, rank); // 锁
let status = await checkVestigeOppStatus(configId, groupKey, vestigeId, roleId, myRank, targetRoleId, rank); // 锁
if(status != VESTIGE_OPP_STATUS.BATTLE) {
let oppRanks = refreshVestigeOppRanks(myRank);
let oppPlayers = await getOppPlayerByRanks(serverId, groupId, serverType, vestigeId, oppRanks);
let oppPlayers = await getOppPlayerByRanks(serverId, groupKey, vestigeId, oppRanks);
return resResult(STATUS.SUCCESS, { status, oppPlayers });
}
// 扣征战令
const costResult = await handleGVGCost(roleId, myLeague.leagueCode, sid, [{ id: GVG_ITEM.FIGHT_COIN, count: 1 }], [], ITEM_CHANGE_REASON.GVG_VESTIGE_START);
if(!costResult) {
await GVGVestigeLockModel.releaseLock(groupId, serverType, vestigeId, rank);
await GVGVestigeLockModel.releaseLock(groupKey, vestigeId, rank);
return resResult(STATUS.GVG_ITEMS_NOT_ENOUGH);
}
// 获取征战令对应奖励
@@ -240,7 +236,7 @@ export class GVGProduceHandler {
// 创建rec
const attackInfo = await generateAttackInfo(roleId, myLeague, myRank);
const defenseInfo = await generateDefenseInfo(targetRoleId, vestigeId, rank);
const rec = await GVGVestigeRecModel.createRec(configId, vestigeId, groupId, serverType, dicRank.warId, attackInfo, defenseInfo, leagueGoods);
const rec = await GVGVestigeRecModel.createRec(configId, vestigeId, groupKey, dicRank.warId, attackInfo, defenseInfo, leagueGoods);
const oppDetail = await getOppDetailData(rec);
checkGVGTask(serverId, roleId, sid, configId, myLeague.leagueCode, TASK_TYPE.GVG_VESTIGE, { count: 1 });
@@ -257,7 +253,7 @@ export class GVGProduceHandler {
// 更新ladderMatchRec
let rec = await GVGVestigeRecModel.giveup(roleId, battleCode);
if(rec && rec.defenseInfo) {
await GVGVestigeLockModel.releaseLock(rec.groupId, rec.serverType, rec.vestigeId, rec.defenseInfo.oldRank);
await GVGVestigeLockModel.releaseLock(rec.groupKey, rec.vestigeId, rec.defenseInfo.oldRank);
}
return resResult(STATUS.SUCCESS, {
@@ -302,9 +298,8 @@ export class GVGProduceHandler {
if(await checkHeroIsUsedInOtherVestige(roleId, vestigeId, heroes)) return resResult(STATUS.GVG_VESTIGE_HERO_USED);
// 更新锁
const groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let lock = await GVGVestigeLockModel.checkBattleLock(groupId, serverType, vestigeId, rank, roleId);
const groupKey = await getGroupKey(serverId);
let lock = await GVGVestigeLockModel.checkBattleLock(groupKey, vestigeId, rank, roleId);
if(!lock) return resResult(STATUS.GVG_VESTIGE_CHECK_BATTLE_STATUS_ERR);
// 向vestigerec保存阵容
@@ -348,7 +343,7 @@ export class GVGProduceHandler {
// 更新vestigeRec
rec = await GVGVestigeRecModel.battleEnd(battleCode, isSuccess, endTime, atkData?.rank, defData?.rank||rec.attackInfo.oldRank);
// 更新锁
await GVGVestigeLockModel.releaseLock(rec.groupId, rec.serverType, rec.vestigeId, rec.defenseInfo.oldRank);
await GVGVestigeLockModel.releaseLock(rec.groupKey, rec.vestigeId, rec.defenseInfo.oldRank);
// 更新battleRecord
await BattleRecordModel.updateBattleRecordByCode(battleCode, { $set: { status: isSuccess? 1: 2 } });
@@ -367,7 +362,7 @@ export class GVGProduceHandler {
score: gameData.gvgVestige.get(rec.vestigeId)?.get(atkData.rank)?.score??0,
historyRank: atkData.historyRank,
...getVestigeRecStatus(rec),
oppPlayers: await getOppPlayerByRanks(serverId, rec.groupId, rec.serverType, rec.vestigeId, atkData.oppRanks),
oppPlayers: await getOppPlayerByRanks(serverId, rec.groupKey, rec.vestigeId, atkData.oppRanks),
// breakGoods,
lineup: atkData.lineup,
lineupCe: atkData.lineup.reduce((pre, cur) => pre + cur.ce, 0),
@@ -402,12 +397,11 @@ export class GVGProduceHandler {
const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let serverNames = await getAllServerName();
const { ranks: leagueRank, myRank: myLeagueRank } = await getVestigeRank(REDIS_KEY.GVG_VESTIGE_LEAGUE, true, { groupId, serverType, day: getDayKeyInfo() }, { leagueCode: myLeague.leagueCode });
const { ranks: memberRank, myRank: myMemberRank } = await getVestigeRank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, true, { groupId, serverType, day: getDayKeyInfo() }, { roleId }, serverNames);
const { ranks: leagueRank, myRank: myLeagueRank } = await getVestigeRank(REDIS_KEY.GVG_VESTIGE_LEAGUE, true, { groupKey, day: getDayKeyInfo() }, { leagueCode: myLeague.leagueCode });
const { ranks: memberRank, myRank: myMemberRank } = await getVestigeRank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, true, { groupKey, day: getDayKeyInfo() }, { roleId }, serverNames);
return resResult(STATUS.SUCCESS, {
leagueRank, myLeagueRank, memberRank, myMemberRank
@@ -423,13 +417,12 @@ export class GVGProduceHandler {
const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let serverNames = await getAllServerName();
let { configId } = getGVGPeriodData();
const { ranks, myRank } = await getVestigeRank(REDIS_KEY.GVG_VESTIGE_LEAGUE, false, { groupId, serverType, day: getDayKeyInfo() }, { leagueCode: myLeague.leagueCode }, serverNames);
const { ranks: memberRank, myRank: myMemberRank } = await getVestigeRank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, false, { groupId, serverType, day: getDayKeyInfo() }, { roleId }, serverNames);
const { ranks, myRank } = await getVestigeRank(REDIS_KEY.GVG_VESTIGE_LEAGUE, false, { groupKey, day: getDayKeyInfo() }, { leagueCode: myLeague.leagueCode }, serverNames);
const { ranks: memberRank, myRank: myMemberRank } = await getVestigeRank(REDIS_KEY.GVG_VESTIGE_MEMBER_ALL, false, { groupKey, day: getDayKeyInfo() }, { roleId }, serverNames);
let yesterdayRank = await GVGVestigeLeagueRankModel.getYesterdayRank(myLeague.leagueCode);
let canReceiveLeagueRanks = await GVGVestigeLeagueRankModel.getCanReceiveRanks(configId, myLeague.leagueCode);
@@ -450,13 +443,12 @@ export class GVGProduceHandler {
let serverId = session.get('serverId');
let { vestigeId } = msg;
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let dicRankMap = gameData.gvgVestige.get(vestigeId);
let serverNames = await getAllServerName();
let vestigeRanks = await GVGVestigeRankModel.findRankByVestige(groupId, serverType, vestigeId);
let r = new Rank(REDIS_KEY.GVG_VESTIGE_MEMBER, { groupId, serverType, vestigeId });
let vestigeRanks = await GVGVestigeRankModel.findRankByVestige(groupKey, vestigeId);
let r = new Rank(REDIS_KEY.GVG_VESTIGE_MEMBER, { groupKey, vestigeId });
let ranks: VestigeRank[] = [], myRank: VestigeRank;
for(let { roleId: targetRoleId, rank, lineup } of vestigeRanks) {
let param = <RoleRankInfo>await r.getParam(rank, targetRoleId, [rank]);
@@ -531,26 +523,25 @@ export class GVGProduceHandler {
let serverId = session.get('serverId');
let guildCode = session.get('guildCode');
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let groupKey = await getGroupKey(serverId);
let { configId } = getGVGPeriodData();
const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let myData = await getMyVestigeRank(configId, groupId, serverType, vestigeId, roleId, myLeague)
let myData = await getMyVestigeRank(configId, groupKey, vestigeId, roleId, myLeague)
let myRank = myData?.rank||0;
let targetData = await GVGVestigeRankModel.findByRank(configId, groupId, serverType, vestigeId, rank);
let targetData = await GVGVestigeRankModel.findByRank(configId, groupKey, vestigeId, rank);
if(targetData) {
myData = await GVGVestigeRankModel.updateByRoleId(vestigeId, roleId, { rank, oldRank: myRank, historyRank: rank });
targetData = await GVGVestigeRankModel.updateByRoleId(vestigeId, targetData.roleId, { rank: myRank, oldRank: rank });
} else {
myData = await GVGVestigeRankModel.updateByRoleId(vestigeId, roleId, { rank, oldRank: myRank, historyRank: rank });
}
await savePlayerRank(configId, groupId, serverType, vestigeId, { isRobot: false, newRank: rank, oldRank: myRank, roleId, leagueCode: myLeague.leagueCode });
await savePlayerRank(configId, groupKey, vestigeId, { isRobot: false, newRank: rank, oldRank: myRank, roleId, leagueCode: myLeague.leagueCode });
if(targetData) {
await savePlayerRank(configId, groupId, serverType, vestigeId, { isRobot: false, newRank: targetData.rank, oldRank: rank, roleId: targetData.roleId, leagueCode: targetData.leagueCode });
await savePlayerRank(configId, groupKey, vestigeId, { isRobot: false, newRank: targetData.rank, oldRank: rank, roleId: targetData.roleId, leagueCode: targetData.leagueCode });
}
return resResult(STATUS.SUCCESS);
@@ -4,7 +4,7 @@ import { GVGLeagueModel } from "../../../db/GVGLeague";
import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare";
import { GVGMainData, LeagueContributeInfo, LeagueMemberContributeInfo, LeagueMemberListInfo } from "../../../domain/gvgField/returnData";
import { getRandEelm, resResult } from "../../../pubUtils/util";
import { calLeagueCe, getGroupIdOfServer, getGVGConfig, getGVGPeriodData, getGVGServerType, getServerTypeByTime } from "../../../services/gvg/gvgService";
import { calLeagueCe, getGroupIdOfServer, getGroupKey, getGVGConfig, getGVGPeriodData, getGVGServerType, getServerTypeByTime } from "../../../services/gvg/gvgService";
import { autoCreateLeague, checkCanChooseJob, checkCanPrepare, checkLeagueAuth, getMyAuth } from "../../../services/gvg/gvgTeamService";
import { getAllServerName } from "../../../services/redisService";
import { Contribute, GVGUserDataModel } from "../../../db/GVGUserData";
@@ -91,11 +91,8 @@ export class GVGHandler {
let { configId, period, countdownTime } = getGVGPeriodData();
let { startFightTime, endFightTime } = getFightTimeByPeriod(period);
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let cities = await getGVGCitiesInfo(configId, groupId, serverType, myLeague);
let groupKey = await getGroupKey(serverId);
let cities = await getGVGCitiesInfo(configId, groupKey, myLeague);
let vestiges = await getMyVestiges(serverId, roleId);
return resResult(STATUS.SUCCESS, {