🐞 fix(gvg): 修复gvg激战期bug

This commit is contained in:
luying
2023-02-21 14:52:36 +08:00
parent 2dffaa7f80
commit 8a14b5bd48
11 changed files with 71 additions and 38 deletions

View File

@@ -346,7 +346,7 @@ export class GVGBattleHandler {
await addRoleToAreaTeamChannel(roleId, groupKey, areaId, sid);
await pushTeamMoveMessage(team);
return resResult(STATUS.SUCCESS, { areaId, cityId, stopMoveTime: team.stopMoveTime });
return resResult(STATUS.SUCCESS, { areaId, cityId, stopMoveTime: team.stopMoveTime, moveCdTime: team.moveCdTime });
}
// 停止移动
@@ -495,7 +495,7 @@ export class GVGBattleHandler {
let teamObj = getGVGBattleData(groupKey);
teamObj.battleEnd([attackTeam, defenseTeam]);
// 更新rec
let rec = await GVGBattleRecModel.battleEnd(battleCode, isSuccess);
let rec = await GVGBattleRecModel.battleEnd(battleCode, isSuccess, attackTeam, defenseTeam);
await battleEndSendMessage(groupKey, cityId, defenseTeam, attackTeam);
addBattleEndRec(rec);

View File

@@ -87,6 +87,7 @@ export function checkMoveStatus(team: GVGTeamType, cityId: number, areaId: numbe
if(team.cityId != cityId) return STATUS.GVG_BATTLE_IS_NOT_IN_CITY;
if(team.pointId > 0) return STATUS.GVG_BATTLE_TEAM_IS_SELLTED;
if(team.stopMoveTime > nowSeconds()) return STATUS.GVG_BATTLE_IS_MOVING;
if(team.moveCdTime > nowSeconds()) return STATUS.GVG_BATTLE_IS_MOVING_CD;
let dicArea = gameData.gvgArea.get(areaId);
if(!dicArea) return STATUS.DIC_DATA_NOT_FOUND;
if(dicArea.relateArea.indexOf(team.areaId) == -1) return STATUS.GVG_BATTLE_AREA_NOT_RELATE;

View File

@@ -397,7 +397,7 @@ export async function saveVestigeRankSchedule() {
let r = new Rank(REDIS_KEY.GVG_VESTIGE_LEAGUE, { groupKey, day});
let ranks = await r.getRankByRangeRaw();
await GVGVestigeLeagueRankModel.saveRank(groupKey, ranks);
await addVestigeLeagueRankRec(config.configId, ranks);
await addVestigeLeagueRankRec(config.configId, groupKey, ranks);
}
let memberKeys = await findKeys(`${REDIS_KEY.GVG_VESTIGE_MEMBER_ALL}:${day}:`);

View File

@@ -42,13 +42,13 @@ function getResourceNameByType(resourceType: GVG_RESOURCE_TYPE) {
export async function addVestigeBattleEndRec(rec: GVGVestigeRecType) {
if(!rec) return;
let { configId, vestigeId } = rec;
let { configId, vestigeId, groupKey } = rec;
let vestigeName = gameData.gvgVestigeName.get(vestigeId);
if(rec.defenseInfo && rec.defenseInfo.isRobot) { // 对手是机器人,驻扎动态
let { roleId, roleName, leagueCode, newRank, isSuccess } = rec.attackInfo;
if(isSuccess) {
let params = [ roleName, vestigeName, `${newRank}`];
await GVGRecModel.addRec({ roleId, leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.SETTLE_POINT, createTime: nowSeconds(), params });
await GVGRecModel.addRec({ roleId, leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.SETTLE_POINT, createTime: nowSeconds(), params });
}
}
if(rec.defenseInfo && !rec.defenseInfo.isRobot && rec.attackInfo.leagueCode != rec.defenseInfo.leagueCode) {
@@ -56,36 +56,39 @@ export async function addVestigeBattleEndRec(rec: GVGVestigeRecType) {
let { roleId, leagueCode, roleName } = rec.defenseInfo;
if(isSuccess) {
let params = [ roleName, vestigeName, `${newRank}`, leagueName];
await GVGRecModel.addRec({ roleId, leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.POINT_BE_GRAB, createTime: nowSeconds(), params });
await GVGRecModel.addRec({ roleId, leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.POINT_BE_GRAB, createTime: nowSeconds(), params });
}
}
}
export async function addVestigeLeagueRankRec(configId: number, ranks: { rank: number, field: string }[]) {
export async function addVestigeLeagueRankRec(configId: number, groupKey: string, ranks: { rank: number, field: string }[]) {
await GVGRecModel.addRecs(ranks.map(({ rank, field: leagueCode }) => {
let params = [ `${rank}`];
return { leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.VESTIGE_RANK, createTime: nowSeconds(), params };
return { leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.VESTIGE_RANK, createTime: nowSeconds(), params };
}));
}
export async function addBattleEndRec(rec: GVGBattleRecType) {
let { isSuccess, attackTeam, defenseTeam, configId } = rec;
let { isSuccess, attackTeamAfter: attackTeam, defenseTeamAfter: defenseTeam, configId, groupKey } = rec;
let { roleId, leagueCode, cityId, index, curTeamBreak, originPointId } = defenseTeam;
if(!defenseTeam.isRobot) { // 防守的不是机器
if(isSuccess) {
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_BE_HIT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`] });
if(curTeamBreak && originPointId > 0 ) {
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_LOST_POINT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`, getPointName(originPointId)] });
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_OCCUPY_CHANGE, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `${defenseTeam.roleName}`, getPointName(originPointId)] });
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_OCCUPY_CHANGE, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `${defenseTeam.roleName}`, getPointName(originPointId)] });
if(isSuccess) {
if(!defenseTeam.isRobot) {
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_BE_HIT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`] });
}
if(curTeamBreak && originPointId > 0 ) {
if(!defenseTeam.isRobot) {
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_LOST_POINT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`, getPointName(originPointId)] });
}
} else {
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_GUARD_SUCCESS, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`] });
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_OCCUPY_CHANGE, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `${defenseTeam.roleName}`, getPointName(originPointId)] });
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_OCCUPY_CHANGE, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `${defenseTeam.roleName}`, getPointName(originPointId)] });
}
} else {
if(!defenseTeam.isRobot) {
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_GUARD_SUCCESS, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`] });
}
}
if(defenseTeam.isRobot && defenseTeam.isCatapult) {
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_CATAPULT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, getCityName(cityId)] });
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_CATAPULT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, getCityName(cityId)] });
}
}
@@ -103,12 +106,12 @@ function getCityName(cityId: number) {
}
export async function addTeamSettleRec(team: GVGTeamType) {
let { roleId, roleName, leagueCode, configId, cityId, pointId } = team;
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
let { roleId, roleName, leagueCode, configId, cityId, pointId, groupKey } = team;
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
}
export async function addTeamLeaveRec(team: GVGTeamType, pointId: number) {
let { roleId, roleName, leagueCode, configId, cityId } = team;
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_LEAVE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
let { roleId, roleName, leagueCode, configId, cityId, groupKey } = team;
await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_LEAVE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] });
}

View File

@@ -80,11 +80,14 @@ export async function setGVGConfig(config?: GVGConfigType) {
if(!config) {
config = await GVGConfigModel.findConfig();
}
pinus.app.set('gvgConfigId', config.configId);
pinus.app.set('gvgTeamTime', config.teamTime);
pinus.app.set('gvgPrepareTime', config.prepareTime);
pinus.app.set('gvgBattleTime', config.battleTime);
pinus.app.set('gvgScheduleTime', config.scheduleTime);
if(config.teamTime > nowSeconds()) {
config = null;
}
pinus.app.set('gvgConfigId', config?.configId||0);
pinus.app.set('gvgTeamTime', config?.teamTime||0);
pinus.app.set('gvgPrepareTime', config?.prepareTime||0);
pinus.app.set('gvgBattleTime', config?.battleTime||0);
pinus.app.set('gvgScheduleTime', config?.scheduleTime||0);
}
/**
@@ -138,18 +141,22 @@ export function getGVGPeriodData() {
countdownTime = scheduleTime; break;
}
}
console.log('######## getGVGPeriodData', configId, teamTime, prepareTime, battleTime, scheduleTime)
return { configId, period, countdownTime };
}
export function getCurPeriod() {
let { teamTime, prepareTime, battleTime } = getGVGConfig();
let { teamTime, prepareTime, battleTime, scheduleTime } = getGVGConfig();
let now = nowSeconds();
if(now >= teamTime && now < prepareTime) {
return GVG_PERIOD.TEAM;
} else if (now >= prepareTime && now < battleTime) {
return GVG_PERIOD.PREPARE;
} else {
} else if (now >= battleTime && now < scheduleTime){
return GVG_PERIOD.BATTLE;
} else {
return GVG_PERIOD.NO;
}
}
@@ -204,7 +211,7 @@ export async function getGVGInfoInGuild(roleId: string, guild: GuildType) {
let { configId, period, countdownTime } = getGVGPeriodData();
let type = await getGVGServerType(serverId);
if(hasLeague) {
if(hasLeague && configId > 0) {
return {
hasLeague,
configId, period, countdownTime,
@@ -257,7 +264,7 @@ export async function getMainData(roleId: string, leagueCode: string, configId:
let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, league.leagueCode);
data.setLeagueParpare(leaguePrepare);
data.setTechQueue(leaguePrepare.techQueue);
data.setTechQueue(leaguePrepare?.techQueue||[]);
let userData = await GVGUserDataModel.findByRole(configId, league.leagueCode, roleId);
let items = await GVGUserItemModel.findByRole(configId, league.leagueCode, roleId);

View File

@@ -905,6 +905,9 @@ export async function initGVGConfigSchedule() {
config = await createNewGVGConfig();
}
scheduleJob(`gvgTeam`, config.teamTime * 1000, async () => {
await pinus.app.rpc.guild.guildRemote.setGVGConfig.broadcast(config);
})
scheduleJob(`gvgConfig`, config.scheduleTime * 1000, createNewGVGConfig);
if(nowSeconds() > config.prepareTime) {
@@ -917,7 +920,11 @@ export async function initGVGConfigSchedule() {
let { startFightTime, endFightTime } = getFightTimeByPeriod(GVG_PERIOD.BATTLE, config.battleTime);
scheduleJob(`gvgBattleStartSchedule`, startFightTime * 1000, gvgBattleStartSchedule);
if(nowSeconds() > startFightTime && nowSeconds() < endFightTime) {
startGvgBattleSeconds();
} else {
scheduleJob(`gvgBattleStartSchedule`, startFightTime * 1000, gvgBattleStartSchedule);
}
scheduleJob(`gvgBattleEndSchedule`, endFightTime * 1000, gvgBattleEndSchedule);
}
@@ -931,6 +938,10 @@ export async function gvgBattleStartSchedule() {
if(guildServers.length > 0) {
pinus.app.rpc.guild.guildRemote.gvgBattleStart.toServer(getRandSingleEelm(guildServers).id);
}
startGvgBattleSeconds();
}
function startGvgBattleSeconds() {
// 发放道具
if(gvgBattleSecondJob) gvgBattleSecondJob.cancel();
gvgBattleSecondJob = scheduleJob('gvgBattleSecondJob', '*/5 * * * * *', gvgBattleSecondSchedule);

View File

@@ -1,4 +1,5 @@
export enum GVG_PERIOD {
NO = 0, // 什么期都不是
TEAM = 1, // 组建期
PREPARE = 2, // 备战期
BATTLE = 3, // 战斗器

View File

@@ -325,6 +325,9 @@ export function getInfoKeyByRedisKey(redisKey: REDIS_KEY) {
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
case REDIS_KEY.GVG_BATTLE_LEAGUE_RANK: // 激战期联军排行榜
return { infoKey: REDIS_KEY.LEAGUE_INFO, extraKey: [] };
case REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY: // 激战期联军排行榜
return { infoKey: REDIS_KEY.LEAGUE_INFO, extraKey: [] };
default:
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
}

View File

@@ -380,6 +380,7 @@ export const STATUS = {
GVG_POINT_HAS_SETTLED: { code: 21416, simStr: '该据点已经有其他队伍驻守' },
GVG_POINT_NOT_AREA: { code: 21417, simStr: '您不在该积分点所在区域' },
GVG_TEAM_NOT_NEED_REVIVE: { code: 21418, simStr: '此队伍不需要复活' },
GVG_BATTLE_IS_MOVING_CD: { code: 21403, simStr: '移动冷却中' },
// 通用 30000 - 30099
DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' },

View File

@@ -82,6 +82,12 @@ export default class GVGBattleRec extends BaseModel {
@prop({ required: true, type: TeamInfo, _id: false })
defenseTeam: TeamInfo; // 防守队伍
@prop({ required: true, type: TeamInfo, _id: false })
attackTeamAfter: TeamInfo; // 挑战队伍
@prop({ required: true, type: TeamInfo, _id: false })
defenseTeamAfter: TeamInfo; // 防守队伍
@prop({ required: true })
isSuccess: boolean;
@@ -99,8 +105,8 @@ export default class GVGBattleRec extends BaseModel {
return result;
}
public static async battleEnd(battleCode: string, isSuccess: boolean) {
const result: GVGBattleRecType = await GVGBattleRecModel.findOneAndUpdate({ battleCode }, { $set: { isSuccess, battleEndTime: nowSeconds() } }, { new: true }).lean();
public static async battleEnd(battleCode: string, isSuccess: boolean, attackTeam: GVGTeamType, defenseTeam: GVGTeamType) {
const result: GVGBattleRecType = await GVGBattleRecModel.findOneAndUpdate({ battleCode }, { $set: { isSuccess, battleEndTime: nowSeconds(), attackTeamAfter: attackTeam, defenseTeamAfter: defenseTeam } }, { new: true }).lean();
return result;
}
}

View File

@@ -758,7 +758,7 @@ export class MyTeamInfo {
this.index = team.index;
this.head = team.head;
this.frame = team.spine;
this.lineup = team.lineup.map(({ actorId, dataId, outIndex }) => ({ actorId, dataId, order: outIndex }));
if(team.lineup) this.lineup = team.lineup.map(({ actorId, dataId, outIndex }) => ({ actorId, dataId, order: outIndex }));
this.durability = team.durability;
this.maxDurability = team.maxDurability;
this.restartTime = team.restartTime;