🐞 fix(gvg): 修复gvg激战期bug
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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}:`);
|
||||
|
||||
@@ -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)] });
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
export enum GVG_PERIOD {
|
||||
NO = 0, // 什么期都不是
|
||||
TEAM = 1, // 组建期
|
||||
PREPARE = 2, // 备战期
|
||||
BATTLE = 3, // 战斗器
|
||||
|
||||
@@ -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: [] };
|
||||
}
|
||||
|
||||
@@ -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: '数据表未找到' },
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user